From 68a02bea126ed4dff17f7c1e2aed0be4cfc47f45 Mon Sep 17 00:00:00 2001
From: JeongHwaSik <99hwasikk@gmail.com>
Date: Sun, 22 Dec 2024 20:41:49 +0900
Subject: [PATCH] add some mmdet practice files

---
 mmdetection_practice/Dockerfile               |   43 +
 mmdetection_practice/LICENSE                  | 1347 ++++++++
 .../assets/finetune_yoloworld.png             |  Bin 0 -> 477628 bytes
 .../assets/reparameterize.png                 |  Bin 0 -> 64275 bytes
 mmdetection_practice/assets/yolo_arch.png     |  Bin 0 -> 304911 bytes
 mmdetection_practice/assets/yolo_logo.png     |  Bin 0 -> 102325 bytes
 mmdetection_practice/configs/.DS_Store        |  Bin 0 -> 6148 bytes
 ..._100e_8gpus_obj365v1_train_lvis_minival.py |  201 ++
 ...2norm_8gpus_obj365v1_train_lvis_minival.py |  243 ++
 ..._100e_8gpus_obj365v1_train_lvis_minival.py |  245 ++
 ..._100e_8gpus_obj365v1_train_lvis_minival.py |  227 ++
 ..._100e_8gpus_obj365v1_train_lvis_minival.py |  233 ++
 ...2norm_8gpus_obj365v1_train_lvis_minival.py |  242 ++
 ...2norm_8gpus_obj365v1_train_lvis_minival.py |  235 ++
 .../configs/finetune_coco/README.md           |   29 +
 ...dual_vlpan_2e-4_80e_8gpus_finetune_coco.py |  179 ++
 ...e-4_80e_8gpus_mask-refine_finetune_coco.py |  181 ++
 ...e-4_80e_8gpus_mask-refine_finetune_coco.py |  159 +
 ...e-4_80e_8gpus_mask-refine_finetune_coco.py |  182 ++
 ...e-4_80e_8gpus_mask-refine_finetune_coco.py |  181 ++
 ...pan_bn_sgd_1e-3_40e_8gpus_finetune_coco.py |  160 +
 ...e-3_80e_8gpus_mask-refine_finetune_coco.py |  161 +
 ...e-4_80e_8gpus_mask-refine_finetune_coco.py |  182 ++
 ...e-4_80e_8gpus_mask-refine_finetune_coco.py |  145 +
 ...e-4_80e_8gpus_mask-refine_finetune_coco.py |  146 +
 ...e-4_80e_8gpus_mask-refine_finetune_coco.py |  184 ++
 ...e-4_80e_8gpus_mask-refine_finetune_coco.py |  183 ++
 ...e-4_80e_8gpus_mask-refine_finetune_coco.py |  173 +
 ...obj365v1_goldg_train_800ft_lvis_minival.py |  200 ++
 ...8gpus_obj365v1_goldg_train_lvis_minival.py |  171 +
 ...bj365v1_goldg_train_1280ft_lvis_minival.py |  202 ++
 ...8gpus_obj365v1_goldg_train_lvis_minival.py |  171 +
 ...e_4x8gpus_obj365v1_goldg_train_lvis_val.py |  171 +
 ...bj365v1_goldg_train_1280ft_lvis_minival.py |  198 ++
 ...8gpus_obj365v1_goldg_train_lvis_minival.py |  171 +
 ...8gpus_obj365v1_goldg_train_lvis_minival.py |  176 +
 ...bj365v1_goldg_train_1280ft_lvis_minival.py |  195 ++
 ...8gpus_obj365v1_goldg_train_lvis_minival.py |  170 +
 ...365v1_goldg_cc3mlite_train_lvis_minival.py |  183 ++
 ...bj365v1_goldg_train_1280ft_lvis_minival.py |  199 ++
 ...8gpus_obj365v1_goldg_train_lvis_minival.py |  171 +
 ...8gpus_obj365v1_goldg_train_lvis_minival.py |  185 ++
 .../configs/pretrain_v1/README.md             |   21 +
 ...8gpus_obj365v1_goldg_train_lvis_minival.py |  172 +
 ...e_4x8gpus_obj365v1_goldg_train_lvis_val.py |  172 +
 ...8gpus_obj365v1_goldg_train_lvis_minival.py |  171 +
 ...8gpus_obj365v1_goldg_train_lvis_minival.py |  193 ++
 ...8gpus_obj365v1_goldg_train_lvis_minival.py |  238 ++
 ...8gpus_obj365v1_goldg_train_lvis_minival.py |  172 +
 .../configs/prompt_tuning_coco/READEME.md     |   12 +
 ...0e_8gpus_mask-refine_prompt_tuning_coco.py |  161 +
 ...an_bn_2e-4_80e_8gpus_prompt_tuning_coco.py |  117 +
 ..._sgd_1e-3_80e_8gpus_all_finetuning_coco.py |  109 +
 .../configs/segmentation/README.md            |   27 +
 ...2e-4_80e_8gpus_allmodules_finetune_lvis.py |  227 ++
 ...an_2e-4_80e_8gpus_seghead_finetune_lvis.py |  237 ++
 ...2e-4_80e_8gpus_allmodules_finetune_lvis.py |  226 ++
 ...an_2e-4_80e_8gpus_seghead_finetune_lvis.py |  237 ++
 ...bn_2e-4_80e_8gpus_seghead_finetune_lvis.py |  239 ++
 ...bn_2e-4_80e_8gpus_seghead_finetune_lvis.py |  239 ++
 .../data/texts/coco_class_texts.json          |    1 +
 .../texts/lvis_v1_base_class_captions.json    |    1 +
 .../data/texts/lvis_v1_class_texts.json       |    1 +
 .../data/texts/obj365v1_class_texts.json      |    1 +
 mmdetection_practice/demo/README.md           |   65 +
 mmdetection_practice/demo/gradio_demo.py      |  253 ++
 mmdetection_practice/demo/image_demo.py       |  220 ++
 mmdetection_practice/demo/inference.ipynb     | 2836 +++++++++++++++++
 .../demo/sample_images/bus.jpg                |  Bin 0 -> 487438 bytes
 .../demo/sample_images/zidane.jpg             |  Bin 0 -> 168949 bytes
 mmdetection_practice/demo/simple_demo.py      |   61 +
 mmdetection_practice/demo/video_demo.py       |  108 +
 mmdetection_practice/deploy/__init__.py       |    0
 .../deploy/easydeploy/README.md               |   11 +
 .../deploy/easydeploy/README_zh-CN.md         |   11 +
 .../deploy/easydeploy/backbone/__init__.py    |    5 +
 .../deploy/easydeploy/backbone/common.py      |   16 +
 .../deploy/easydeploy/backbone/focus.py       |   79 +
 .../deploy/easydeploy/bbox_code/__init__.py   |    5 +
 .../deploy/easydeploy/bbox_code/bbox_coder.py |   46 +
 .../easydeploy/deepstream/CMakeLists.txt      |   35 +
 .../deploy/easydeploy/deepstream/README.md    |   48 +
 .../easydeploy/deepstream/README_zh-CN.md     |   48 +
 .../easydeploy/deepstream/coco_labels.txt     |   80 +
 .../configs/config_infer_rtmdet.txt           |   22 +
 .../configs/config_infer_yolov5.txt           |   21 +
 .../configs/config_infer_yolov8.txt           |   21 +
 .../nvdsparsebbox_mmyolo.cpp                  |  118 +
 .../deepstream/deepstream_app_config.txt      |   62 +
 .../deploy/easydeploy/docs/model_convert.md   |  156 +
 .../deploy/easydeploy/examples/config.py      |   64 +
 .../deploy/easydeploy/examples/cv2_nms.py     |   36 +
 .../easydeploy/examples/main_onnxruntime.py   |  110 +
 .../deploy/easydeploy/examples/numpy_coder.py |  309 ++
 .../deploy/easydeploy/examples/preprocess.py  |   57 +
 .../easydeploy/examples/requirements.txt      |    2 +
 .../deploy/easydeploy/model/__init__.py       |    6 +
 .../deploy/easydeploy/model/backend.py        |   23 +
 .../deploy/easydeploy/model/backendwrapper.py |  202 ++
 .../deploy/easydeploy/model/model.py          |  217 ++
 .../deploy/easydeploy/nms/__init__.py         |    5 +
 .../deploy/easydeploy/nms/ort_nms.py          |  215 ++
 .../deploy/easydeploy/nms/trt_nms.py          |  226 ++
 .../deploy/easydeploy/onnx_demo.py            |    0
 .../deploy/easydeploy/tools/build_engine.py   |  136 +
 .../deploy/easydeploy/tools/export_onnx.py    |  157 +
 .../deploy/easydeploy/tools/image-demo.py     |  152 +
 mmdetection_practice/deploy/export_onnx.py    |  182 ++
 mmdetection_practice/deploy/onnx_demo.py      |  235 ++
 mmdetection_practice/deploy/tflite_demo.py    |  254 ++
 mmdetection_practice/docs/data.md             |  124 +
 mmdetection_practice/docs/deploy.md           |   59 +
 mmdetection_practice/docs/faq.md              |    9 +
 mmdetection_practice/docs/finetuning.md       |  105 +
 mmdetection_practice/docs/installation.md     |   43 +
 .../docs/prompt_yolo_world.md                 |   73 +
 mmdetection_practice/docs/reparameterize.md   |   77 +
 mmdetection_practice/docs/tflite_deploy.md    |   78 +
 mmdetection_practice/docs/updates.md          |   14 +
 mmdetection_practice/pyproject.toml           |   57 +
 .../requirements/basic_requirements.txt       |    9 +
 .../requirements/demo_requirements.txt        |    2 +
 .../requirements/onnx_requirements.txt        |    4 +
 .../third_party/mmyolo/.circleci/config.yml   |   34 +
 .../mmyolo/.circleci/docker/Dockerfile        |   11 +
 .../third_party/mmyolo/.circleci/test.yml     |  213 ++
 .../mmyolo/.dev_scripts/gather_models.py      |  312 ++
 .../mmyolo/.dev_scripts/print_registers.py    |  448 +++
 .../mmyolo/.github/CODE_OF_CONDUCT.md         |   76 +
 .../mmyolo/.github/CONTRIBUTING.md            |    1 +
 .../.github/ISSUE_TEMPLATE/1-bug-report.yml   |   67 +
 .../ISSUE_TEMPLATE/2-feature-request.yml      |   32 +
 .../.github/ISSUE_TEMPLATE/3-new-model.yml    |   30 +
 .../ISSUE_TEMPLATE/4-documentation.yml        |   22 +
 .../ISSUE_TEMPLATE/5-reimplementation.yml     |   87 +
 .../mmyolo/.github/ISSUE_TEMPLATE/config.yml  |    9 +
 .../mmyolo/.github/pull_request_template.md   |   25 +
 .../mmyolo/.github/workflows/deploy.yml       |   28 +
 .../third_party/mmyolo/.gitignore             |  126 +
 .../mmyolo/.pre-commit-config-zh-cn.yaml      |   60 +
 .../mmyolo/.pre-commit-config.yaml            |   60 +
 .../third_party/mmyolo/.readthedocs.yml       |    8 +
 .../third_party/mmyolo/LICENSE                |  674 ++++
 .../third_party/mmyolo/MANIFEST.in            |    6 +
 .../third_party/mmyolo/README.md              |  428 +++
 .../third_party/mmyolo/README_zh-CN.md        |  468 +++
 .../mmyolo/configs/_base_/default_runtime.py  |   43 +
 .../mmyolo/configs/_base_/det_p5_tta.py       |   58 +
 .../mmyolo/configs/_base_/pose/coco.py        |  181 ++
 .../mmyolo/configs/deploy/base_dynamic.py     |   17 +
 .../mmyolo/configs/deploy/base_static.py      |   23 +
 .../deploy/detection_onnxruntime_dynamic.py   |   15 +
 .../deploy/detection_onnxruntime_static.py    |   15 +
 .../detection_rknn-fp16_static-320x320.py     |    9 +
 .../detection_rknn-int8_static-320x320.py     |    9 +
 ...n_tensorrt-fp16_dynamic-192x192-960x960.py |   13 +
 ...n_tensorrt-fp16_dynamic-64x64-1344x1344.py |   13 +
 .../detection_tensorrt-fp16_static-640x640.py |   14 +
 ...n_tensorrt-int8_dynamic-192x192-960x960.py |   15 +
 .../detection_tensorrt-int8_static-640x640.py |   16 +
 ...ection_tensorrt_dynamic-192x192-960x960.py |   13 +
 .../detection_tensorrt_static-640x640.py      |   14 +
 .../configs/deploy/model/yolov5_s-static.py   |   19 +
 .../configs/deploy/model/yolov6_s-static.py   |   19 +
 .../mmyolo/configs/ppyoloe/README.md          |   43 +
 .../mmyolo/configs/ppyoloe/metafile.yml       |   69 +
 .../ppyoloe/ppyoloe_l_fast_8xb20-300e_coco.py |   23 +
 .../ppyoloe/ppyoloe_m_fast_8xb28-300e_coco.py |   23 +
 .../ppyoloe_plus_l_fast_8xb8-80e_coco.py      |   16 +
 .../ppyoloe_plus_m_fast_8xb8-80e_coco.py      |   16 +
 .../ppyoloe_plus_s_fast_1xb12-40e_cat.py      |   56 +
 .../ppyoloe_plus_s_fast_8xb8-80e_coco.py      |  239 ++
 .../ppyoloe_plus_x_fast_8xb8-80e_coco.py      |   16 +
 .../ppyoloe/ppyoloe_s_fast_8xb32-300e_coco.py |   36 +
 .../ppyoloe/ppyoloe_s_fast_8xb32-400e_coco.py |    9 +
 .../ppyoloe/ppyoloe_x_fast_8xb16-300e_coco.py |   23 +
 .../mmyolo/configs/razor/subnets/README.md    |   79 +
 ..._tiny_ofa_lat31_syncbn_16xb16-300e_coco.py |  124 +
 ...pos_shufflenetv2_syncbn_8xb16-300e_coco.py |   29 +
 ...enas_a6_d12_syncbn_fast_8xb32-300e_coco.py |   35 +
 .../mmyolo/configs/rtmdet/README.md           |   83 +
 .../cspnext_imagenet_pretrain/README.md       |   53 +
 .../cspnext-s_8xb256-rsb-a1-600e_in1k.py      |   67 +
 .../cspnext-tiny_8xb256-rsb-a1-600e_in1k.py   |    5 +
 .../configs/rtmdet/distillation/README.md     |  146 +
 .../kd_l_rtmdet_x_neck_300e_coco.py           |   99 +
 .../kd_m_rtmdet_l_neck_300e_coco.py           |   99 +
 .../kd_s_rtmdet_m_neck_300e_coco.py           |   99 +
 .../kd_tiny_rtmdet_s_neck_300e_coco.py        |   99 +
 .../mmyolo/configs/rtmdet/metafile.yml        |  215 ++
 ...rtmdet-r_l_syncbn_fast_2xb4-36e_dota-ms.py |   30 +
 .../rtmdet-r_l_syncbn_fast_2xb4-36e_dota.py   |  331 ++
 ...mdet-r_l_syncbn_fast_2xb4-aug-100e_dota.py |  168 +
 ...cbn_fast_coco-pretrain_2xb4-36e_dota-ms.py |   20 +
 ...rtmdet-r_m_syncbn_fast_2xb4-36e_dota-ms.py |   33 +
 .../rtmdet-r_m_syncbn_fast_2xb4-36e_dota.py   |   33 +
 .../rtmdet-r_s_fast_1xb8-36e_dota-ms.py       |   38 +
 .../rotated/rtmdet-r_s_fast_1xb8-36e_dota.py  |   38 +
 .../rtmdet-r_tiny_fast_1xb8-36e_dota-ms.py    |   38 +
 .../rtmdet-r_tiny_fast_1xb8-36e_dota.py       |   38 +
 ...tmdet-ins_s_syncbn_fast_8xb32-300e_coco.py |   31 +
 .../rtmdet_l_syncbn_fast_8xb32-300e_coco.py   |  304 ++
 .../rtmdet_m_syncbn_fast_8xb32-300e_coco.py   |   11 +
 .../rtmdet_s_syncbn_fast_8xb32-300e_coco.py   |   92 +
 .../rtmdet/rtmdet_tiny_fast_1xb12-40e_cat.py  |   70 +
 ...rtmdet_tiny_syncbn_fast_8xb32-300e_coco.py |   58 +
 .../rtmdet_x_syncbn_fast_8xb32-300e_coco.py   |   11 +
 .../mmyolo/configs/yolov5/README.md           |  146 +
 ...lov5_s-v61_8xb16-300e_ignore_crowdhuman.py |   63 +
 ...yolov5_s-v61_fast_8xb16-300e_crowdhuman.py |   47 +
 ...61_syncbn_fast_8xb16-300e_coco_instance.py |   81 +
 ...61_syncbn_fast_8xb16-300e_coco_instance.py |   89 +
 ...61_syncbn_fast_8xb16-300e_coco_instance.py |   15 +
 ...syncbn_fast_8xb16-300e_balloon_instance.py |   42 +
 ...61_syncbn_fast_8xb16-300e_coco_instance.py |  126 +
 ...st_non_overlap_8xb16-300e_coco_instance.py |   49 +
 ...61_syncbn_fast_8xb16-300e_coco_instance.py |   15 +
 ...-refine-v61_syncbn_fast_8xb16-300e_coco.py |   77 +
 ...-refine-v61_syncbn_fast_8xb16-300e_coco.py |   86 +
 ...-refine-v61_syncbn_fast_8xb16-300e_coco.py |   20 +
 ...-refine-v61_syncbn_fast_8xb16-300e_coco.py |   62 +
 ...-refine-v61_syncbn_fast_8xb16-300e_coco.py |   21 +
 .../mmyolo/configs/yolov5/metafile.yml        |  346 ++
 .../voc/yolov5_l-v61_fast_1xb32-50e_voc.py    |   25 +
 .../voc/yolov5_m-v61_fast_1xb64-50e_voc.py    |   17 +
 .../voc/yolov5_n-v61_fast_1xb64-50e_voc.py    |   17 +
 .../voc/yolov5_s-v61_fast_1xb64-50e_voc.py    |  270 ++
 .../voc/yolov5_x-v61_fast_1xb32-50e_voc.py    |   26 +
 ...v5_l-p6-v62_syncbn_fast_8xb16-300e_coco.py |   15 +
 ...olov5_l-v61_syncbn_fast_8xb16-300e_coco.py |   15 +
 ...v5_m-p6-v62_syncbn_fast_8xb16-300e_coco.py |   79 +
 ...olov5_m-v61_syncbn_fast_8xb16-300e_coco.py |   79 +
 ...v5_n-p6-v62_syncbn_fast_8xb16-300e_coco.py |   15 +
 ...olov5_n-v61_syncbn_fast_8xb16-300e_coco.py |   15 +
 ...v5_s-p6-v62_syncbn_fast_8xb16-300e_coco.py |  138 +
 ...yolov5_s-v61_fast_1xb12-40e_608x352_cat.py |   70 +
 .../yolov5/yolov5_s-v61_fast_1xb12-40e_cat.py |   56 +
 .../yolov5_s-v61_fast_1xb12-ms-40e_cat.py     |   13 +
 ...ov5_s-v61_syncbn-detect_8xb16-300e_coco.py |   23 +
 .../yolov5_s-v61_syncbn_8xb16-300e_coco.py    |  292 ++
 ...ov5_s-v61_syncbn_fast_1xb4-300e_balloon.py |   42 +
 ...olov5_s-v61_syncbn_fast_8xb16-300e_coco.py |   12 +
 ...v5_x-p6-v62_syncbn_fast_8xb16-300e_coco.py |   14 +
 ...olov5_x-v61_syncbn_fast_8xb16-300e_coco.py |   14 +
 ...mask-refine_syncbn_fast_8xb16-300e_coco.py |   59 +
 .../yolov5u_l_syncbn_fast_8xb16-300e_coco.py  |   18 +
 ...mask-refine_syncbn_fast_8xb16-300e_coco.py |   79 +
 .../yolov5u_m_syncbn_fast_8xb16-300e_coco.py  |   18 +
 ...mask-refine_syncbn_fast_8xb16-300e_coco.py |   20 +
 .../yolov5u_n_syncbn_fast_8xb16-300e_coco.py  |   17 +
 ...mask-refine_syncbn_fast_8xb16-300e_coco.py |   80 +
 .../yolov5u_s_syncbn_fast_8xb16-300e_coco.py  |  326 ++
 ...mask-refine_syncbn_fast_8xb16-300e_coco.py |   17 +
 .../yolov5u_x_syncbn_fast_8xb16-300e_coco.py  |   18 +
 .../mmyolo/configs/yolov6/README.md           |   53 +
 .../mmyolo/configs/yolov6/metafile.yml        |   83 +
 .../yolov6_l_syncbn_fast_8xb32-300e_coco.py   |   28 +
 .../yolov6_m_syncbn_fast_8xb32-300e_coco.py   |   62 +
 .../yolov6_n_syncbn_fast_8xb32-300e_coco.py   |   21 +
 .../yolov6_n_syncbn_fast_8xb32-400e_coco.py   |   21 +
 .../yolov6/yolov6_s_fast_1xb12-40e_cat.py     |   56 +
 .../yolov6_s_syncbn_fast_8xb32-300e_coco.py   |   33 +
 .../yolov6_s_syncbn_fast_8xb32-400e_coco.py   |  280 ++
 .../yolov6_t_syncbn_fast_8xb32-300e_coco.py   |   17 +
 .../yolov6_t_syncbn_fast_8xb32-400e_coco.py   |   17 +
 ...yolov6_v3_l_syncbn_fast_8xb32-300e_coco.py |   28 +
 ...yolov6_v3_m_syncbn_fast_8xb32-300e_coco.py |   63 +
 ...yolov6_v3_n_syncbn_fast_8xb32-300e_coco.py |   21 +
 ...yolov6_v3_s_syncbn_fast_8xb32-300e_coco.py |  282 ++
 ...yolov6_v3_t_syncbn_fast_8xb32-300e_coco.py |   17 +
 .../mmyolo/configs/yolov7/README.md           |   50 +
 .../mmyolo/configs/yolov7/metafile.yml        |   83 +
 ...yolov7_d-p6_syncbn_fast_8x16b-300e_coco.py |   21 +
 ...yolov7_e-p6_syncbn_fast_8x16b-300e_coco.py |   19 +
 ...lov7_e2e-p6_syncbn_fast_8x16b-300e_coco.py |   20 +
 .../yolov7_l_syncbn_fast_8x16b-300e_coco.py   |  324 ++
 .../yolov7/yolov7_tiny_fast_1xb12-40e_cat.py  |   56 +
 ...yolov7_tiny_syncbn_fast_8x16b-300e_coco.py |   98 +
 ...yolov7_w-p6_syncbn_fast_8x16b-300e_coco.py |  182 ++
 .../yolov7_x_syncbn_fast_8x16b-300e_coco.py   |   15 +
 .../mmyolo/configs/yolov8/README.md           |   45 +
 .../mmyolo/configs/yolov8/metafile.yml        |  140 +
 ...mask-refine_syncbn_fast_8xb16-500e_coco.py |   65 +
 .../yolov8_l_syncbn_fast_8xb16-500e_coco.py   |   39 +
 ...mask-refine_syncbn_fast_8xb16-500e_coco.py |   85 +
 .../yolov8_m_syncbn_fast_8xb16-500e_coco.py   |   76 +
 ...mask-refine_syncbn_fast_8xb16-500e_coco.py |   12 +
 .../yolov8_n_syncbn_fast_8xb16-500e_coco.py   |    9 +
 .../yolov8/yolov8_s_fast_1xb12-40e_cat.py     |   52 +
 ...mask-refine_syncbn_fast_8xb16-500e_coco.py |   83 +
 .../yolov8_s_syncbn_fast_8xb16-500e_coco.py   |  334 ++
 ...mask-refine_syncbn_fast_8xb16-500e_coco.py |   13 +
 .../yolov8_x_syncbn_fast_8xb16-500e_coco.py   |    9 +
 .../mmyolo/configs/yolox/README.md            |   86 +
 .../mmyolo/configs/yolox/metafile.yml         |  166 +
 ...yolox-pose_l_8xb32-300e-rtmdet-hyp_coco.py |   14 +
 ...yolox-pose_m_8xb32-300e-rtmdet-hyp_coco.py |   14 +
 ...yolox-pose_s_8xb32-300e-rtmdet-hyp_coco.py |  136 +
 ...ox-pose_tiny_8xb32-300e-rtmdet-hyp_coco.py |   70 +
 .../yolox/yolox_l_fast_8xb8-300e_coco.py      |   12 +
 ...yolox_m_fast_8xb32-300e-rtmdet-hyp_coco.py |   12 +
 .../yolox/yolox_m_fast_8xb8-300e_coco.py      |   12 +
 ...ox_nano_fast_8xb32-300e-rtmdet-hyp_coco.py |   21 +
 .../yolox/yolox_nano_fast_8xb8-300e_coco.py   |   21 +
 .../mmyolo/configs/yolox/yolox_p5_tta.py      |   56 +
 .../yolox_s_fast_1xb12-40e-rtmdet-hyp_cat.py  |   76 +
 ...yolox_s_fast_8xb32-300e-rtmdet-hyp_coco.py |   87 +
 .../yolox/yolox_s_fast_8xb8-300e_coco.py      |  331 ++
 ...ox_tiny_fast_8xb32-300e-rtmdet-hyp_coco.py |   70 +
 .../yolox/yolox_tiny_fast_8xb8-300e_coco.py   |  100 +
 .../yolox/yolox_x_fast_8xb8-300e_coco.py      |   12 +
 .../15_minutes_instance_segmentation.ipynb    |  658 ++++
 .../demo/15_minutes_object_detection.ipynb    | 1002 ++++++
 .../third_party/mmyolo/demo/boxam_vis_demo.py |  276 ++
 .../third_party/mmyolo/demo/demo.jpg          |  Bin 0 -> 259865 bytes
 .../third_party/mmyolo/demo/demo.mp4          |  Bin 0 -> 297688 bytes
 .../third_party/mmyolo/demo/deploy_demo.py    |  120 +
 .../third_party/mmyolo/demo/dog.jpg           |  Bin 0 -> 163759 bytes
 .../mmyolo/demo/featmap_vis_demo.py           |  199 ++
 .../third_party/mmyolo/demo/image_demo.py     |  168 +
 .../third_party/mmyolo/demo/large_image.jpg   |  Bin 0 -> 171829 bytes
 .../mmyolo/demo/large_image_demo.py           |  294 ++
 .../third_party/mmyolo/demo/video_demo.py     |   96 +
 .../third_party/mmyolo/docker/Dockerfile      |   36 +
 .../mmyolo/docker/Dockerfile_deployment       |   65 +
 .../third_party/mmyolo/docs/README.md         |   28 +
 .../third_party/mmyolo/docs/en/Makefile       |   20 +
 .../docs/en/_static/css/readthedocs.css       |    6 +
 .../docs/en/_static/image/mmyolo-logo.png     |  Bin 0 -> 30145 bytes
 .../cross-library_application.md              |    1 +
 .../third_party/mmyolo/docs/en/api.rst        |   80 +
 .../docs/en/common_usage/amp_training.md      |   13 +
 .../docs/en/common_usage/freeze_layers.md     |   28 +
 .../mmyolo/docs/en/common_usage/mim_usage.md  |   89 +
 .../en/common_usage/module_combination.md     |    1 +
 .../en/common_usage/ms_training_testing.md    |   39 +
 .../docs/en/common_usage/multi_necks.md       |   37 +
 .../en/common_usage/output_predictions.md     |   40 +
 .../mmyolo/docs/en/common_usage/plugins.md    |   34 +
 .../docs/en/common_usage/resume_training.md   |    9 +
 .../docs/en/common_usage/set_random_seed.md   |   18 +
 .../mmyolo/docs/en/common_usage/set_syncbn.md |    1 +
 .../single_multi_channel_applications.md      |  188 ++
 .../docs/en/common_usage/specify_device.md    |   23 +
 .../mmyolo/docs/en/common_usage/tta.md        |   87 +
 .../third_party/mmyolo/docs/en/conf.py        |  115 +
 .../15_minutes_instance_segmentation.md       |  332 ++
 .../15_minutes_object_detection.md            |  535 ++++
 .../15_minutes_rotated_object_detection.md    |    3 +
 .../docs/en/get_started/dependencies.md       |   60 +
 .../docs/en/get_started/installation.md       |  131 +
 .../mmyolo/docs/en/get_started/overview.md    |   81 +
 .../third_party/mmyolo/docs/en/index.rst      |  120 +
 .../third_party/mmyolo/docs/en/make.bat       |   35 +
 .../third_party/mmyolo/docs/en/model_zoo.md   |   94 +
 .../mmyolo/docs/en/notes/changelog.md         |  342 ++
 .../mmyolo/docs/en/notes/code_style.md        |    3 +
 .../mmyolo/docs/en/notes/compatibility.md     |   46 +
 .../mmyolo/docs/en/notes/conventions.md       |   36 +
 .../algorithm_descriptions/index.rst          |    9 +
 .../rtmdet_description.md                     |  191 ++
 .../yolov5_description.md                     |  651 ++++
 .../yolov8_description.md                     |  241 ++
 .../application_examples/index.rst            |    7 +
 .../ionogram_detection.md                     |  307 ++
 .../recommended_topics/complexity_analysis.md |  120 +
 .../en/recommended_topics/contributing.md     |  314 ++
 .../recommended_topics/dataset_preparation.md |  145 +
 .../deploy/easydeploy_guide.md                |    1 +
 .../en/recommended_topics/deploy/index.rst    |   16 +
 .../deploy/mmdeploy_guide.md                  |  414 +++
 .../deploy/mmdeploy_yolov5.md                 |  572 ++++
 .../labeling_to_deployment_tutorials.md       | 1331 ++++++++
 .../docs/en/recommended_topics/mm_basics.md   |    1 +
 .../en/recommended_topics/model_design.md     |  106 +
 .../en/recommended_topics/replace_backbone.md |  306 ++
 .../training_testing_tricks.md                |  310 ++
 .../troubleshooting_steps.md                  |    1 +
 .../en/recommended_topics/visualization.md    |  346 ++
 .../third_party/mmyolo/docs/en/stat.py        |   66 +
 .../mmyolo/docs/en/switch_language.md         |    3 +
 .../mmyolo/docs/en/tutorials/config.md        |  556 ++++
 .../docs/en/tutorials/custom_installation.md  |  109 +
 .../mmyolo/docs/en/tutorials/data_flow.md     |  121 +
 .../mmyolo/docs/en/tutorials/faq.md           |  101 +
 .../docs/en/tutorials/rotated_detection.md    |    3 +
 .../mmyolo/docs/en/tutorials/warning_notes.md |   24 +
 .../docs/en/useful_tools/browse_coco_json.md  |   62 +
 .../docs/en/useful_tools/browse_dataset.md    |   42 +
 .../docs/en/useful_tools/dataset_analysis.md  |   79 +
 .../en/useful_tools/dataset_converters.md     |   55 +
 .../docs/en/useful_tools/download_dataset.md  |   11 +
 .../docs/en/useful_tools/extract_subcoco.md   |   60 +
 .../docs/en/useful_tools/log_analysis.md      |   82 +
 .../docs/en/useful_tools/model_converters.md  |   54 +
 .../docs/en/useful_tools/optimize_anchors.md  |   38 +
 .../docs/en/useful_tools/print_config.md      |   20 +
 .../docs/en/useful_tools/vis_scheduler.md     |   44 +
 .../third_party/mmyolo/docs/zh_cn/Makefile    |   20 +
 .../docs/zh_cn/_static/css/readthedocs.css    |    6 +
 .../docs/zh_cn/_static/image/mmyolo-logo.png  |  Bin 0 -> 30145 bytes
 .../cross-library_application.md              |    1 +
 .../third_party/mmyolo/docs/zh_cn/api.rst     |   80 +
 .../docs/zh_cn/common_usage/amp_training.md   |   13 +
 .../docs/zh_cn/common_usage/freeze_layers.md  |   28 +
 .../docs/zh_cn/common_usage/mim_usage.md      |   89 +
 .../zh_cn/common_usage/module_combination.md  |  280 ++
 .../zh_cn/common_usage/ms_training_testing.md |   41 +
 .../docs/zh_cn/common_usage/multi_necks.md    |   40 +
 .../zh_cn/common_usage/output_predictions.md  |   40 +
 .../mmyolo/docs/zh_cn/common_usage/plugins.md |   34 +
 .../zh_cn/common_usage/registries_info.md     |  788 +++++
 .../zh_cn/common_usage/resume_training.md     |    9 +
 .../zh_cn/common_usage/set_random_seed.md     |   20 +
 .../docs/zh_cn/common_usage/set_syncbn.md     |    1 +
 .../single_multi_channel_applications.md      |  188 ++
 .../docs/zh_cn/common_usage/specify_device.md |   23 +
 .../mmyolo/docs/zh_cn/common_usage/tta.md     |   87 +
 .../third_party/mmyolo/docs/zh_cn/conf.py     |  117 +
 .../15_minutes_instance_segmentation.md       |  330 ++
 .../15_minutes_object_detection.md            |  533 ++++
 .../15_minutes_rotated_object_detection.md    |    3 +
 .../mmyolo/docs/zh_cn/get_started/article.md  |  105 +
 .../docs/zh_cn/get_started/dependencies.md    |   60 +
 .../docs/zh_cn/get_started/installation.md    |  129 +
 .../mmyolo/docs/zh_cn/get_started/overview.md |   81 +
 .../third_party/mmyolo/docs/zh_cn/index.rst   |  122 +
 .../third_party/mmyolo/docs/zh_cn/make.bat    |   35 +
 .../mmyolo/docs/zh_cn/model_zoo.md            |   94 +
 .../mmyolo/docs/zh_cn/notes/changelog.md      |  365 +++
 .../mmyolo/docs/zh_cn/notes/code_style.md     |  606 ++++
 .../mmyolo/docs/zh_cn/notes/compatibility.md  |   47 +
 .../mmyolo/docs/zh_cn/notes/conventions.md    |   37 +
 .../algorithm_descriptions/index.rst          |   10 +
 .../rtmdet_description.md                     |  645 ++++
 .../yolov5_description.md                     |  652 ++++
 .../yolov6_description.md                     |  452 +++
 .../yolov8_description.md                     |  244 ++
 .../application_examples/index.rst            |    7 +
 .../ionogram_detection.md                     |  306 ++
 .../recommended_topics/complexity_analysis.md |  117 +
 .../zh_cn/recommended_topics/contributing.md  |  325 ++
 .../recommended_topics/dataset_preparation.md |  144 +
 .../deploy/easydeploy_guide.md                |    5 +
 .../zh_cn/recommended_topics/deploy/index.rst |   16 +
 .../deploy/mmdeploy_guide.md                  |  415 +++
 .../deploy/mmdeploy_yolov5.md                 |  572 ++++
 .../labeling_to_deployment_tutorials.md       | 1326 ++++++++
 .../zh_cn/recommended_topics/mm_basics.md     |    1 +
 .../zh_cn/recommended_topics/model_design.md  |  107 +
 .../recommended_topics/replace_backbone.md    |  307 ++
 .../training_testing_tricks.md                |  303 ++
 .../troubleshooting_steps.md                  |  111 +
 .../zh_cn/recommended_topics/visualization.md |  542 ++++
 .../third_party/mmyolo/docs/zh_cn/stat.py     |   66 +
 .../mmyolo/docs/zh_cn/switch_language.md      |    3 +
 .../mmyolo/docs/zh_cn/tutorials/config.md     |  553 ++++
 .../zh_cn/tutorials/custom_installation.md    |  111 +
 .../mmyolo/docs/zh_cn/tutorials/data_flow.md  |  121 +
 .../mmyolo/docs/zh_cn/tutorials/faq.md        |  111 +
 .../docs/zh_cn/tutorials/rotated_detection.md |  329 ++
 .../docs/zh_cn/tutorials/warning_notes.md     |   22 +
 .../zh_cn/useful_tools/browse_coco_json.md    |   62 +
 .../docs/zh_cn/useful_tools/browse_dataset.md |   57 +
 .../zh_cn/useful_tools/dataset_analysis.md    |   80 +
 .../zh_cn/useful_tools/dataset_converters.md  |   56 +
 .../zh_cn/useful_tools/download_dataset.md    |   11 +
 .../zh_cn/useful_tools/extract_subcoco.md     |   60 +
 .../docs/zh_cn/useful_tools/log_analysis.md   |   82 +
 .../zh_cn/useful_tools/model_converters.md    |   52 +
 .../zh_cn/useful_tools/optimize_anchors.md    |   37 +
 .../docs/zh_cn/useful_tools/print_config.md   |   20 +
 .../docs/zh_cn/useful_tools/vis_scheduler.md  |   44 +
 .../third_party/mmyolo/mmyolo/__init__.py     |   39 +
 .../mmyolo/mmyolo/datasets/__init__.py        |   14 +
 .../mmyolo/mmyolo/datasets/pose_coco.py       |   30 +
 .../mmyolo/datasets/transforms/__init__.py    |   18 +
 .../mmyolo/datasets/transforms/formatting.py  |  113 +
 .../datasets/transforms/keypoint_structure.py |  248 ++
 .../datasets/transforms/mix_img_transforms.py | 1191 +++++++
 .../mmyolo/datasets/transforms/transforms.py  | 2102 ++++++++++++
 .../mmyolo/mmyolo/datasets/utils.py           |  133 +
 .../mmyolo/mmyolo/datasets/yolov5_coco.py     |   65 +
 .../mmyolo/datasets/yolov5_crowdhuman.py      |   15 +
 .../mmyolo/mmyolo/datasets/yolov5_dota.py     |   29 +
 .../mmyolo/mmyolo/datasets/yolov5_voc.py      |   15 +
 .../mmyolo/mmyolo/deploy/__init__.py          |    7 +
 .../mmyolo/mmyolo/deploy/models/__init__.py   |    2 +
 .../deploy/models/dense_heads/__init__.py     |    4 +
 .../deploy/models/dense_heads/yolov5_head.py  |  189 ++
 .../mmyolo/deploy/models/layers/__init__.py   |    4 +
 .../mmyolo/deploy/models/layers/bbox_nms.py   |  113 +
 .../mmyolo/mmyolo/deploy/object_detection.py  |  132 +
 .../mmyolo/mmyolo/engine/__init__.py          |    3 +
 .../mmyolo/mmyolo/engine/hooks/__init__.py    |   10 +
 .../hooks/ppyoloe_param_scheduler_hook.py     |   96 +
 .../engine/hooks/switch_to_deploy_hook.py     |   21 +
 .../hooks/yolov5_param_scheduler_hook.py      |  130 +
 .../engine/hooks/yolox_mode_switch_hook.py    |   54 +
 .../mmyolo/engine/optimizers/__init__.py      |    5 +
 .../optimizers/yolov5_optim_constructor.py    |  132 +
 .../yolov7_optim_wrapper_constructor.py       |  139 +
 .../mmyolo/mmyolo/models/__init__.py          |   10 +
 .../mmyolo/models/backbones/__init__.py       |   13 +
 .../mmyolo/models/backbones/base_backbone.py  |  225 ++
 .../mmyolo/models/backbones/csp_darknet.py    |  427 +++
 .../mmyolo/models/backbones/csp_resnet.py     |  169 +
 .../mmyolo/mmyolo/models/backbones/cspnext.py |  187 ++
 .../mmyolo/models/backbones/efficient_rep.py  |  305 ++
 .../models/backbones/yolov7_backbone.py       |  285 ++
 .../models/data_preprocessors/__init__.py     |   10 +
 .../data_preprocessors/data_preprocessor.py   |  310 ++
 .../mmyolo/models/dense_heads/__init__.py     |   23 +
 .../mmyolo/models/dense_heads/ppyoloe_head.py |  374 +++
 .../mmyolo/models/dense_heads/rtmdet_head.py  |  368 +++
 .../models/dense_heads/rtmdet_ins_head.py     |  725 +++++
 .../models/dense_heads/rtmdet_rotated_head.py |  641 ++++
 .../mmyolo/models/dense_heads/yolov5_head.py  |  895 ++++++
 .../models/dense_heads/yolov5_ins_head.py     |  740 +++++
 .../mmyolo/models/dense_heads/yolov6_head.py  |  396 +++
 .../mmyolo/models/dense_heads/yolov7_head.py  |  404 +++
 .../mmyolo/models/dense_heads/yolov8_head.py  |  396 +++
 .../mmyolo/models/dense_heads/yolox_head.py   |  514 +++
 .../models/dense_heads/yolox_pose_head.py     |  409 +++
 .../mmyolo/models/detectors/__init__.py       |    4 +
 .../mmyolo/models/detectors/yolo_detector.py  |   53 +
 .../mmyolo/mmyolo/models/layers/__init__.py   |   16 +
 .../mmyolo/mmyolo/models/layers/ema.py        |   96 +
 .../mmyolo/models/layers/yolo_bricks.py       | 1728 ++++++++++
 .../mmyolo/mmyolo/models/losses/__init__.py   |    5 +
 .../mmyolo/mmyolo/models/losses/iou_loss.py   |  232 ++
 .../mmyolo/mmyolo/models/losses/oks_loss.py   |   91 +
 .../mmyolo/mmyolo/models/necks/__init__.py    |   16 +
 .../mmyolo/models/necks/base_yolo_neck.py     |  261 ++
 .../mmyolo/models/necks/cspnext_pafpn.py      |  201 ++
 .../mmyolo/models/necks/ppyoloe_csppan.py     |  216 ++
 .../mmyolo/models/necks/yolov5_pafpn.py       |  171 +
 .../mmyolo/models/necks/yolov6_pafpn.py       |  527 +++
 .../mmyolo/models/necks/yolov7_pafpn.py       |  216 ++
 .../mmyolo/models/necks/yolov8_pafpn.py       |  102 +
 .../mmyolo/mmyolo/models/necks/yolox_pafpn.py |  172 +
 .../mmyolo/mmyolo/models/plugins/__init__.py  |    4 +
 .../mmyolo/mmyolo/models/plugins/cbam.py      |  119 +
 .../mmyolo/models/task_modules/__init__.py    |    8 +
 .../models/task_modules/assigners/__init__.py |   14 +
 .../assigners/batch_atss_assigner.py          |  339 ++
 .../assigners/batch_dsl_assigner.py           |  272 ++
 .../assigners/batch_task_aligned_assigner.py  |  311 ++
 .../assigners/batch_yolov7_assigner.py        |  344 ++
 .../assigners/pose_sim_ota_assigner.py        |  210 ++
 .../models/task_modules/assigners/utils.py    |  110 +
 .../models/task_modules/coders/__init__.py    |   10 +
 .../coders/distance_angle_point_coder.py      |   94 +
 .../coders/distance_point_bbox_coder.py       |   79 +
 .../task_modules/coders/yolov5_bbox_coder.py  |   55 +
 .../task_modules/coders/yolox_bbox_coder.py   |   45 +
 .../mmyolo/mmyolo/models/utils/__init__.py    |    8 +
 .../mmyolo/mmyolo/models/utils/misc.py        |  186 ++
 .../third_party/mmyolo/mmyolo/registry.py     |  103 +
 .../mmyolo/mmyolo/testing/__init__.py         |    4 +
 .../mmyolo/mmyolo/testing/_utils.py           |   53 +
 .../mmyolo/mmyolo/utils/__init__.py           |    9 +
 .../mmyolo/mmyolo/utils/boxam_utils.py        |  517 +++
 .../mmyolo/mmyolo/utils/collect_env.py        |   21 +
 .../mmyolo/mmyolo/utils/labelme_utils.py      |   92 +
 .../mmyolo/mmyolo/utils/large_image.py        |  103 +
 .../third_party/mmyolo/mmyolo/utils/misc.py   |  135 +
 .../mmyolo/mmyolo/utils/setup_env.py          |   41 +
 .../third_party/mmyolo/mmyolo/version.py      |   23 +
 .../third_party/mmyolo/model-index.yml        |    8 +
 .../projects/assigner_visualization/README.md |   43 +
 .../assigner_visualization.py                 |  177 +
 ...t_8xb32-300e_coco_assignervisualization.py |    9 +
 ...t_8xb16-300e_coco_assignervisualization.py |   11 +
 ...t_8xb16-300e_coco_assignervisualization.py |    9 +
 ...t_8xb16-500e_coco_assignervisualization.py |    9 +
 .../dense_heads/__init__.py                   |   10 +
 .../dense_heads/rtmdet_head_assigner.py       |  175 +
 .../dense_heads/yolov5_head_assigner.py       |  188 ++
 .../dense_heads/yolov7_head_assigner.py       |  159 +
 .../dense_heads/yolov8_head_assigner.py       |  180 ++
 .../detectors/__init__.py                     |    5 +
 .../detectors/yolo_detector_assigner.py       |   34 +
 .../visualization/__init__.py                 |    4 +
 .../visualization/assigner_visualizer.py      |  326 ++
 .../mmyolo/projects/easydeploy/README.md      |   11 +
 .../projects/easydeploy/README_zh-CN.md       |   11 +
 .../projects/easydeploy/backbone/__init__.py  |    5 +
 .../projects/easydeploy/backbone/common.py    |   16 +
 .../projects/easydeploy/backbone/focus.py     |   79 +
 .../projects/easydeploy/bbox_code/__init__.py |    5 +
 .../easydeploy/bbox_code/bbox_coder.py        |   46 +
 .../easydeploy/deepstream/CMakeLists.txt      |   35 +
 .../projects/easydeploy/deepstream/README.md  |   48 +
 .../easydeploy/deepstream/README_zh-CN.md     |   48 +
 .../easydeploy/deepstream/coco_labels.txt     |   80 +
 .../configs/config_infer_rtmdet.txt           |   22 +
 .../configs/config_infer_yolov5.txt           |   21 +
 .../configs/config_infer_yolov8.txt           |   21 +
 .../nvdsparsebbox_mmyolo.cpp                  |  118 +
 .../deepstream/deepstream_app_config.txt      |   62 +
 .../projects/easydeploy/docs/model_convert.md |  156 +
 .../projects/easydeploy/examples/config.py    |   64 +
 .../projects/easydeploy/examples/cv2_nms.py   |   36 +
 .../easydeploy/examples/main_onnxruntime.py   |  110 +
 .../easydeploy/examples/numpy_coder.py        |  310 ++
 .../easydeploy/examples/preprocess.py         |   57 +
 .../easydeploy/examples/requirements.txt      |    2 +
 .../projects/easydeploy/model/__init__.py     |    6 +
 .../projects/easydeploy/model/backend.py      |   23 +
 .../easydeploy/model/backendwrapper.py        |  202 ++
 .../mmyolo/projects/easydeploy/model/model.py |  205 ++
 .../projects/easydeploy/nms/__init__.py       |    5 +
 .../mmyolo/projects/easydeploy/nms/ort_nms.py |  122 +
 .../mmyolo/projects/easydeploy/nms/trt_nms.py |  226 ++
 .../projects/easydeploy/tools/build_engine.py |  136 +
 .../projects/easydeploy/tools/export_onnx.py  |  157 +
 .../projects/easydeploy/tools/image-demo.py   |  152 +
 .../mmyolo/projects/example_project/README.md |  141 +
 ...mmy-backbone_v61_syncbn_8xb16-300e_coco.py |    5 +
 .../example_project/dummy/__init__.py         |    4 +
 .../dummy/dummy_yolov5cspdarknet.py           |   16 +
 .../projects/misc/custom_dataset/README.md    |    3 +
 ...yolov5_s-v61_syncbn_fast_1xb32-100e_cat.py |   76 +
 .../yolov6_s_syncbn_fast_1xb32-100e_cat.py    |   85 +
 .../yolov7_tiny_syncbn_fast_1xb32-100e_cat.py |   78 +
 .../misc/ionogram_detection/README.md         |    3 +
 .../rtmdet_l_fast_1xb32-100e_ionogram.py      |  107 +
 .../rtmdet_s_fast_1xb32-100e_ionogram.py      |   83 +
 .../rtmdet_tiny_fast_1xb32-100e_ionogram.py   |   62 +
 .../yolov5_m-v61_fast_1xb32-100e_ionogram.py  |   95 +
 ...5_s-v61_fast_1xb32-100e_ionogram_mosaic.py |   35 +
 .../yolov5_s-v61_fast_1xb96-100e_ionogram.py  |  108 +
 ...ov5_s-v61_fast_1xb96-100e_ionogram_aug0.py |   21 +
 ..._fast_1xb96-100e_ionogram_mosaic_affine.py |   29 +
 ...96-100e_ionogram_mosaic_affine_albu_hsv.py |   44 +
 ...ov5_s-v61_fast_1xb96-200e_ionogram_pre0.py |   17 +
 .../yolov6_l_fast_1xb32-100e_ionogram.py      |   29 +
 .../yolov6_m_fast_1xb32-100e_ionogram.py      |   63 +
 .../yolov6_s_fast_1xb32-100e_ionogram.py      |  108 +
 .../yolov6_s_fast_1xb32-200e_ionogram_pre0.py |   17 +
 .../yolov7_l_fast_1xb16-100e_ionogram.py      |   98 +
 .../yolov7_tiny_fast_1xb16-100e_ionogram.py   |  101 +
 .../yolov7_x_fast_1xb16-100e_ionogram.py      |   19 +
 .../third_party/mmyolo/pytest.ini             |    7 +
 .../third_party/mmyolo/requirements.txt       |    3 +
 .../third_party/mmyolo/requirements/albu.txt  |    1 +
 .../third_party/mmyolo/requirements/build.txt |    3 +
 .../third_party/mmyolo/requirements/docs.txt  |   13 +
 .../mmyolo/requirements/mminstall.txt         |    3 +
 .../mmyolo/requirements/mmpose.txt            |    1 +
 .../mmyolo/requirements/mmrotate.txt          |    1 +
 .../mmyolo/requirements/runtime.txt           |    2 +
 .../third_party/mmyolo/requirements/sahi.txt  |    1 +
 .../third_party/mmyolo/requirements/tests.txt |   17 +
 .../mmyolo/resources/mmyolo-logo.png          |  Bin 0 -> 30145 bytes
 .../mmyolo/resources/qq_group_qrcode.jpg      |  Bin 0 -> 207584 bytes
 .../mmyolo/resources/zhihu_qrcode.jpg         |  Bin 0 -> 397245 bytes
 .../third_party/mmyolo/setup.cfg              |   21 +
 .../third_party/mmyolo/setup.py               |  191 ++
 .../mmyolo/tests/regression/mmyolo.yml        |   81 +
 .../mmyolo/tests/test_datasets/__init__.py    |    1 +
 .../test_datasets/test_transforms/__init__.py |    1 +
 .../test_transforms/test_formatting.py        |  119 +
 .../test_mix_img_transforms.py                |  416 +++
 .../test_transforms/test_transforms.py        |  493 +++
 .../mmyolo/tests/test_datasets/test_utils.py  |  138 +
 .../tests/test_datasets/test_yolov5_coco.py   |   71 +
 .../tests/test_datasets/test_yolov5_voc.py    |   86 +
 .../mmyolo/tests/test_deploy/conftest.py      |   13 +
 .../tests/test_deploy/test_mmyolo_models.py   |  165 +
 .../test_deploy/test_object_detection.py      |   96 +
 .../tests/test_downstream/test_mmrazor.py     |   21 +
 .../mmyolo/tests/test_engine/__init__.py      |    1 +
 .../test_hooks/test_switch_to_deploy_hook.py  |   24 +
 .../test_yolov5_param_scheduler_hook.py       |  124 +
 .../test_hooks/test_yolox_mode_switch_hook.py |   67 +
 .../test_engine/test_optimizers/__init__.py   |    1 +
 .../test_yolov5_optim_constructor.py          |   81 +
 .../test_yolov7_optim_wrapper_constructor.py  |   81 +
 .../mmyolo/tests/test_models/__init__.py      |    1 +
 .../test_models/test_backbone/__init__.py     |    1 +
 .../test_backbone/test_csp_darknet.py         |  119 +
 .../test_backbone/test_csp_resnet.py          |  113 +
 .../test_backbone/test_efficient_rep.py       |  202 ++
 .../test_backbone/test_yolov7_backbone.py     |  154 +
 .../tests/test_models/test_backbone/utils.py  |   31 +
 .../test_data_preprocessor/__init__.py        |    1 +
 .../test_data_preprocessor.py                 |  156 +
 .../test_models/test_dense_heads/__init__.py  |    1 +
 .../test_dense_heads/test_ppyoloe_head.py     |  205 ++
 .../test_rotated_rtmdet_head.py               |  264 ++
 .../test_dense_heads/test_rtmdet_head.py      |  223 ++
 .../test_dense_heads/test_yolov5_head.py      |  411 +++
 .../test_dense_heads/test_yolov6_head.py      |   62 +
 .../test_dense_heads/test_yolov7_head.py      |  145 +
 .../test_dense_heads/test_yolov8_head.py      |  161 +
 .../test_dense_heads/test_yolox_head.py       |  379 +++
 .../test_detectors/test_yolo_detector.py      |  137 +
 .../tests/test_models/test_layers/__init__.py |    1 +
 .../tests/test_models/test_layers/test_ema.py |   94 +
 .../test_layers/test_yolo_bricks.py           |   34 +
 .../tests/test_models/test_necks/__init__.py  |    1 +
 .../test_necks/test_cspnext_pafpn.py          |   37 +
 .../test_necks/test_ppyoloe_csppan.py         |   53 +
 .../test_necks/test_yolov5_pafpn.py           |   28 +
 .../test_necks/test_yolov6_pafpn.py           |   81 +
 .../test_necks/test_yolov7_pafpn.py           |   79 +
 .../test_necks/test_yolov8_pafpn.py           |   28 +
 .../test_necks/test_yolox_pafpn.py            |   28 +
 .../test_models/test_plugins/__init__.py      |    1 +
 .../test_models/test_plugins/test_cbam.py     |   31 +
 .../test_models/test_task_modules/__init__.py |    1 +
 .../test_assigners/__init__.py                |    1 +
 .../test_batch_atss_assigner.py               |  175 +
 .../test_assigners/test_batch_dsl_assigner.py |  192 ++
 .../test_batch_task_aligned_assigner.py       |   56 +
 .../test_pose_sim_ota_assigner.py             |   85 +
 .../test_task_modules/test_coders/__init__.py |    1 +
 .../test_distance_point_bbox_coder.py         |   29 +
 .../test_coders/test_yolov5_bbox_coder.py     |   32 +
 .../test_coders/test_yolox_bbox_coder.py      |   31 +
 .../tests/test_models/test_utils/__init__.py  |    1 +
 .../tests/test_models/test_utils/test_misc.py |   35 +
 .../tests/test_utils/test_collect_env.py      |   33 +
 .../mmyolo/tests/test_utils/test_setup_env.py |   39 +
 .../mmyolo/tools/analysis_tools/benchmark.py  |  188 ++
 .../tools/analysis_tools/browse_coco_json.py  |  147 +
 .../tools/analysis_tools/browse_dataset.py    |  276 ++
 .../analysis_tools/browse_dataset_simple.py   |   89 +
 .../tools/analysis_tools/confusion_matrix.py  |  273 ++
 .../tools/analysis_tools/dataset_analysis.py  |  498 +++
 .../mmyolo/tools/analysis_tools/get_flops.py  |  123 +
 .../tools/analysis_tools/optimize_anchors.py  |  647 ++++
 .../tools/analysis_tools/vis_scheduler.py     |  295 ++
 .../tools/dataset_converters/balloon2coco.py  |   58 +
 .../tools/dataset_converters/dota/README.md   |    3 +
 .../dataset_converters/dota/dota_split.py     |  603 ++++
 .../dota/split_config/multi_scale.json        |   19 +
 .../dota/split_config/single_scale.json       |   19 +
 .../tools/dataset_converters/labelme2coco.py  |  325 ++
 .../tools/dataset_converters/yolo2coco.py     |  264 ++
 .../third_party/mmyolo/tools/dist_test.sh     |   22 +
 .../third_party/mmyolo/tools/dist_train.sh    |   19 +
 .../mmyolo/tools/misc/coco_split.py           |  122 +
 .../mmyolo/tools/misc/download_dataset.py     |  112 +
 .../mmyolo/tools/misc/extract_subcoco.py      |  160 +
 .../mmyolo/tools/misc/print_config.py         |   59 +
 .../mmyolo/tools/misc/publish_model.py        |   57 +
 .../convert_kd_ckpt_to_student.py             |   54 +
 .../model_converters/ppyoloe_to_mmyolo.py     |  184 ++
 .../model_converters/rtmdet_to_mmyolo.py      |   61 +
 .../model_converters/yolov5_to_mmyolo.py      |  128 +
 .../model_converters/yolov5u_to_mmyolo.py     |   88 +
 .../model_converters/yolov6_to_mmyolo.py      |  115 +
 .../model_converters/yolov6_v3_to_mmyolo.py   |  145 +
 .../model_converters/yolov7_to_mmyolo.py      | 1093 +++++++
 .../model_converters/yolov8_to_mmyolo.py      |  102 +
 .../tools/model_converters/yolox_to_mmyolo.py |  110 +
 .../third_party/mmyolo/tools/slurm_test.sh    |   24 +
 .../third_party/mmyolo/tools/slurm_train.sh   |   24 +
 .../third_party/mmyolo/tools/test.py          |  158 +
 .../third_party/mmyolo/tools/train.py         |  123 +
 mmdetection_practice/tools/benchmark.py       |  729 +++++
 mmdetection_practice/tools/dist_test.sh       |   51 +
 mmdetection_practice/tools/dist_train.sh      |   45 +
 .../tools/generate_image_prompts.py           |   59 +
 .../tools/generate_text_prompts.py            |   41 +
 mmdetection_practice/tools/get_flops.py       |  141 +
 .../tools/reparameterize_yoloworld.py         |  140 +
 mmdetection_practice/tools/test.py            |  162 +
 mmdetection_practice/tools/train.py           |  133 +
 mmdetection_practice/tools/utils.py           |   83 +
 mmdetection_practice/yolo_world/__init__.py   |   12 +
 .../yolo_world/datasets/__init__.py           |   19 +
 .../yolo_world/datasets/mm_dataset.py         |  125 +
 .../datasets/transformers/__init__.py         |    9 +
 .../transformers/mm_mix_img_transforms.py     | 1173 +++++++
 .../datasets/transformers/mm_transforms.py    |  130 +
 .../yolo_world/datasets/utils.py              |   60 +
 .../datasets/yolov5_cc3m_grounding.py         |  196 ++
 .../yolo_world/datasets/yolov5_lvis.py        |   15 +
 .../datasets/yolov5_mixed_grounding.py        |  200 ++
 .../yolo_world/datasets/yolov5_obj365v1.py    |   15 +
 .../yolo_world/datasets/yolov5_obj365v2.py    |   15 +
 .../yolo_world/datasets/yolov5_v3det.py       |  110 +
 .../yolo_world/engine/__init__.py             |    2 +
 .../yolo_world/engine/optimizers/__init__.py  |    4 +
 .../optimizers/yolow_v5_optim_constructor.py  |  187 ++
 .../yolo_world/models/__init__.py             |    9 +
 .../yolo_world/models/assigner/__init__.py    |    3 +
 .../models/assigner/task_aligned_assigner.py  |  108 +
 .../yolo_world/models/backbones/__init__.py   |   16 +
 .../models/backbones/mm_backbone.py           |  238 ++
 .../models/data_preprocessors/__init__.py     |    4 +
 .../data_preprocessors/data_preprocessor.py   |   63 +
 .../yolo_world/models/dense_heads/__init__.py |    8 +
 .../models/dense_heads/yolo_world_head.py     |  839 +++++
 .../models/dense_heads/yolo_world_seg_head.py |  550 ++++
 .../yolo_world/models/detectors/__init__.py   |    4 +
 .../yolo_world/models/detectors/yolo_world.py |  389 +++
 .../yolo_world/models/layers/__init__.py      |   18 +
 .../yolo_world/models/layers/yolo_bricks.py   |  991 ++++++
 .../yolo_world/models/losses/__init__.py      |    4 +
 .../yolo_world/models/losses/dynamic_loss.py  |   38 +
 .../yolo_world/models/necks/__init__.py       |    4 +
 .../models/necks/yolo_world_pafpn.py          |  466 +++
 mmdetection_practice/yolo_world/version.py    |   23 +
 808 files changed, 104500 insertions(+)
 create mode 100644 mmdetection_practice/Dockerfile
 create mode 100644 mmdetection_practice/LICENSE
 create mode 100644 mmdetection_practice/assets/finetune_yoloworld.png
 create mode 100644 mmdetection_practice/assets/reparameterize.png
 create mode 100644 mmdetection_practice/assets/yolo_arch.png
 create mode 100644 mmdetection_practice/assets/yolo_logo.png
 create mode 100644 mmdetection_practice/configs/.DS_Store
 create mode 100644 mmdetection_practice/configs/experiment/yolo_world_m_dual_vlpan_l2norm_2e-3_100e_8gpus_obj365v1_train_lvis_minival.py
 create mode 100644 mmdetection_practice/configs/experiment/yolo_world_s_deepfusion_l2norm_8gpus_obj365v1_train_lvis_minival.py
 create mode 100644 mmdetection_practice/configs/experiment/yolo_world_s_dual_vlpan_l2norm_2e-3_100e_8gpus_obj365v1_train_lvis_minival.py
 create mode 100644 mmdetection_practice/configs/experiment/yolo_world_s_dual_vlpan_remove4321_l2norm_2e-3_100e_8gpus_obj365v1_train_lvis_minival.py
 create mode 100644 mmdetection_practice/configs/experiment/yolo_world_s_dual_vlpan_remove43_l2norm_2e-3_100e_8gpus_obj365v1_train_lvis_minival.py
 create mode 100644 mmdetection_practice/configs/experiment/yolo_world_s_multi_scale_deepfusion_l2norm_8gpus_obj365v1_train_lvis_minival.py
 create mode 100644 mmdetection_practice/configs/experiment/yolo_world_s_vlattnfusion_l2norm_8gpus_obj365v1_train_lvis_minival.py
 create mode 100644 mmdetection_practice/configs/finetune_coco/README.md
 create mode 100644 mmdetection_practice/configs/finetune_coco/yolo_world_l_dual_vlpan_2e-4_80e_8gpus_finetune_coco.py
 create mode 100644 mmdetection_practice/configs/finetune_coco/yolo_world_l_dual_vlpan_2e-4_80e_8gpus_mask-refine_finetune_coco.py
 create mode 100644 mmdetection_practice/configs/finetune_coco/yolo_world_l_efficient_neck_2e-4_80e_8gpus_mask-refine_finetune_coco.py
 create mode 100644 mmdetection_practice/configs/finetune_coco/yolo_world_v2_l_efficient_neck_2e-4_80e_8gpus_mask-refine_finetune_coco.py
 create mode 100644 mmdetection_practice/configs/finetune_coco/yolo_world_v2_l_vlpan_bn_2e-4_80e_8gpus_mask-refine_finetune_coco.py
 create mode 100644 mmdetection_practice/configs/finetune_coco/yolo_world_v2_l_vlpan_bn_sgd_1e-3_40e_8gpus_finetune_coco.py
 create mode 100644 mmdetection_practice/configs/finetune_coco/yolo_world_v2_l_vlpan_bn_sgd_1e-3_80e_8gpus_mask-refine_finetune_coco.py
 create mode 100644 mmdetection_practice/configs/finetune_coco/yolo_world_v2_m_vlpan_bn_2e-4_80e_8gpus_mask-refine_finetune_coco.py
 create mode 100644 mmdetection_practice/configs/finetune_coco/yolo_world_v2_s_bn_2e-4_80e_8gpus_mask-refine_finetune_coco.py
 create mode 100644 mmdetection_practice/configs/finetune_coco/yolo_world_v2_s_rep_vlpan_bn_2e-4_80e_8gpus_mask-refine_finetune_coco.py
 create mode 100644 mmdetection_practice/configs/finetune_coco/yolo_world_v2_s_vlpan_bn_2e-4_80e_8gpus_mask-refine_finetune_coco.py
 create mode 100644 mmdetection_practice/configs/finetune_coco/yolo_world_v2_x_vlpan_bn_2e-4_80e_8gpus_mask-refine_finetune_coco.py
 create mode 100644 mmdetection_practice/configs/finetune_coco/yolo_world_v2_xl_vlpan_bn_2e-4_80e_8gpus_mask-refine_finetune_coco.py
 create mode 100644 mmdetection_practice/configs/pretrain/yolo_world_v2_l_clip_large_vlpan_bn_2e-3_100e_4x8gpus_obj365v1_goldg_train_800ft_lvis_minival.py
 create mode 100644 mmdetection_practice/configs/pretrain/yolo_world_v2_l_clip_large_vlpan_bn_2e-3_100e_4x8gpus_obj365v1_goldg_train_lvis_minival.py
 create mode 100644 mmdetection_practice/configs/pretrain/yolo_world_v2_l_vlpan_bn_2e-3_100e_4x8gpus_obj365v1_goldg_train_1280ft_lvis_minival.py
 create mode 100644 mmdetection_practice/configs/pretrain/yolo_world_v2_l_vlpan_bn_2e-3_100e_4x8gpus_obj365v1_goldg_train_lvis_minival.py
 create mode 100644 mmdetection_practice/configs/pretrain/yolo_world_v2_l_vlpan_bn_2e-3_100e_4x8gpus_obj365v1_goldg_train_lvis_val.py
 create mode 100644 mmdetection_practice/configs/pretrain/yolo_world_v2_m_vlpan_bn_2e-3_100e_4x8gpus_obj365v1_goldg_train_1280ft_lvis_minival.py
 create mode 100644 mmdetection_practice/configs/pretrain/yolo_world_v2_m_vlpan_bn_2e-3_100e_4x8gpus_obj365v1_goldg_train_lvis_minival.py
 create mode 100644 mmdetection_practice/configs/pretrain/yolo_world_v2_m_vlpan_bn_noeinsum_2e-3_100e_4x8gpus_obj365v1_goldg_train_lvis_minival.py
 create mode 100644 mmdetection_practice/configs/pretrain/yolo_world_v2_s_vlpan_bn_2e-3_100e_4x8gpus_obj365v1_goldg_train_1280ft_lvis_minival.py
 create mode 100644 mmdetection_practice/configs/pretrain/yolo_world_v2_s_vlpan_bn_2e-3_100e_4x8gpus_obj365v1_goldg_train_lvis_minival.py
 create mode 100644 mmdetection_practice/configs/pretrain/yolo_world_v2_x_vlpan_bn_2e-3_100e_4x8gpus_obj365v1_goldg_cc3mlite_train_lvis_minival.py
 create mode 100644 mmdetection_practice/configs/pretrain/yolo_world_v2_x_vlpan_bn_2e-3_100e_4x8gpus_obj365v1_goldg_train_1280ft_lvis_minival.py
 create mode 100644 mmdetection_practice/configs/pretrain/yolo_world_v2_x_vlpan_bn_2e-3_100e_4x8gpus_obj365v1_goldg_train_lvis_minival.py
 create mode 100644 mmdetection_practice/configs/pretrain/yolo_world_v2_xl_vlpan_bn_2e-3_100e_4x8gpus_obj365v1_goldg_train_lvis_minival.py
 create mode 100644 mmdetection_practice/configs/pretrain_v1/README.md
 create mode 100644 mmdetection_practice/configs/pretrain_v1/yolo_world_l_dual_vlpan_l2norm_2e-3_100e_4x8gpus_obj365v1_goldg_train_lvis_minival.py
 create mode 100644 mmdetection_practice/configs/pretrain_v1/yolo_world_l_dual_vlpan_l2norm_2e-3_100e_4x8gpus_obj365v1_goldg_train_lvis_val.py
 create mode 100644 mmdetection_practice/configs/pretrain_v1/yolo_world_m_dual_vlpan_l2norm_2e-3_100e_4x8gpus_obj365v1_goldg_train_lvis_minival.py
 create mode 100644 mmdetection_practice/configs/pretrain_v1/yolo_world_n_dual_vlpan_l2norm_2e-3_100e_4x8gpus_obj365v1_goldg_train_lvis_minival.py
 create mode 100644 mmdetection_practice/configs/pretrain_v1/yolo_world_s_dual_vlpan_l2norm_2e-3_100e_4x8gpus_obj365v1_goldg_train_lvis_minival.py
 create mode 100644 mmdetection_practice/configs/pretrain_v1/yolo_world_x_dual_vlpan_l2norm_2e-3_100e_4x8gpus_obj365v1_goldg_train_lvis_minival.py
 create mode 100644 mmdetection_practice/configs/prompt_tuning_coco/READEME.md
 create mode 100644 mmdetection_practice/configs/prompt_tuning_coco/yolo_world_v2_l_vlpan_bn_2e-4_80e_8gpus_mask-refine_prompt_tuning_coco.py
 create mode 100644 mmdetection_practice/configs/prompt_tuning_coco/yolo_world_v2_l_vlpan_bn_2e-4_80e_8gpus_prompt_tuning_coco.py
 create mode 100644 mmdetection_practice/configs/prompt_tuning_coco/yolo_world_v2_l_vlpan_bn_sgd_1e-3_80e_8gpus_all_finetuning_coco.py
 create mode 100644 mmdetection_practice/configs/segmentation/README.md
 create mode 100644 mmdetection_practice/configs/segmentation/yolo_world_seg_l_dual_vlpan_2e-4_80e_8gpus_allmodules_finetune_lvis.py
 create mode 100644 mmdetection_practice/configs/segmentation/yolo_world_seg_l_dual_vlpan_2e-4_80e_8gpus_seghead_finetune_lvis.py
 create mode 100644 mmdetection_practice/configs/segmentation/yolo_world_seg_m_dual_vlpan_2e-4_80e_8gpus_allmodules_finetune_lvis.py
 create mode 100644 mmdetection_practice/configs/segmentation/yolo_world_seg_m_dual_vlpan_2e-4_80e_8gpus_seghead_finetune_lvis.py
 create mode 100644 mmdetection_practice/configs/segmentation/yolo_world_v2_seg_l_vlpan_bn_2e-4_80e_8gpus_seghead_finetune_lvis.py
 create mode 100644 mmdetection_practice/configs/segmentation/yolo_world_v2_seg_m_vlpan_bn_2e-4_80e_8gpus_seghead_finetune_lvis.py
 create mode 100644 mmdetection_practice/data/texts/coco_class_texts.json
 create mode 100644 mmdetection_practice/data/texts/lvis_v1_base_class_captions.json
 create mode 100644 mmdetection_practice/data/texts/lvis_v1_class_texts.json
 create mode 100644 mmdetection_practice/data/texts/obj365v1_class_texts.json
 create mode 100644 mmdetection_practice/demo/README.md
 create mode 100644 mmdetection_practice/demo/gradio_demo.py
 create mode 100644 mmdetection_practice/demo/image_demo.py
 create mode 100644 mmdetection_practice/demo/inference.ipynb
 create mode 100644 mmdetection_practice/demo/sample_images/bus.jpg
 create mode 100644 mmdetection_practice/demo/sample_images/zidane.jpg
 create mode 100644 mmdetection_practice/demo/simple_demo.py
 create mode 100644 mmdetection_practice/demo/video_demo.py
 create mode 100644 mmdetection_practice/deploy/__init__.py
 create mode 100644 mmdetection_practice/deploy/easydeploy/README.md
 create mode 100644 mmdetection_practice/deploy/easydeploy/README_zh-CN.md
 create mode 100644 mmdetection_practice/deploy/easydeploy/backbone/__init__.py
 create mode 100644 mmdetection_practice/deploy/easydeploy/backbone/common.py
 create mode 100644 mmdetection_practice/deploy/easydeploy/backbone/focus.py
 create mode 100644 mmdetection_practice/deploy/easydeploy/bbox_code/__init__.py
 create mode 100644 mmdetection_practice/deploy/easydeploy/bbox_code/bbox_coder.py
 create mode 100644 mmdetection_practice/deploy/easydeploy/deepstream/CMakeLists.txt
 create mode 100644 mmdetection_practice/deploy/easydeploy/deepstream/README.md
 create mode 100644 mmdetection_practice/deploy/easydeploy/deepstream/README_zh-CN.md
 create mode 100644 mmdetection_practice/deploy/easydeploy/deepstream/coco_labels.txt
 create mode 100644 mmdetection_practice/deploy/easydeploy/deepstream/configs/config_infer_rtmdet.txt
 create mode 100644 mmdetection_practice/deploy/easydeploy/deepstream/configs/config_infer_yolov5.txt
 create mode 100644 mmdetection_practice/deploy/easydeploy/deepstream/configs/config_infer_yolov8.txt
 create mode 100644 mmdetection_practice/deploy/easydeploy/deepstream/custom_mmyolo_bbox_parser/nvdsparsebbox_mmyolo.cpp
 create mode 100644 mmdetection_practice/deploy/easydeploy/deepstream/deepstream_app_config.txt
 create mode 100644 mmdetection_practice/deploy/easydeploy/docs/model_convert.md
 create mode 100644 mmdetection_practice/deploy/easydeploy/examples/config.py
 create mode 100644 mmdetection_practice/deploy/easydeploy/examples/cv2_nms.py
 create mode 100644 mmdetection_practice/deploy/easydeploy/examples/main_onnxruntime.py
 create mode 100644 mmdetection_practice/deploy/easydeploy/examples/numpy_coder.py
 create mode 100644 mmdetection_practice/deploy/easydeploy/examples/preprocess.py
 create mode 100644 mmdetection_practice/deploy/easydeploy/examples/requirements.txt
 create mode 100644 mmdetection_practice/deploy/easydeploy/model/__init__.py
 create mode 100644 mmdetection_practice/deploy/easydeploy/model/backend.py
 create mode 100644 mmdetection_practice/deploy/easydeploy/model/backendwrapper.py
 create mode 100644 mmdetection_practice/deploy/easydeploy/model/model.py
 create mode 100644 mmdetection_practice/deploy/easydeploy/nms/__init__.py
 create mode 100644 mmdetection_practice/deploy/easydeploy/nms/ort_nms.py
 create mode 100644 mmdetection_practice/deploy/easydeploy/nms/trt_nms.py
 create mode 100644 mmdetection_practice/deploy/easydeploy/onnx_demo.py
 create mode 100644 mmdetection_practice/deploy/easydeploy/tools/build_engine.py
 create mode 100644 mmdetection_practice/deploy/easydeploy/tools/export_onnx.py
 create mode 100644 mmdetection_practice/deploy/easydeploy/tools/image-demo.py
 create mode 100644 mmdetection_practice/deploy/export_onnx.py
 create mode 100644 mmdetection_practice/deploy/onnx_demo.py
 create mode 100644 mmdetection_practice/deploy/tflite_demo.py
 create mode 100644 mmdetection_practice/docs/data.md
 create mode 100644 mmdetection_practice/docs/deploy.md
 create mode 100644 mmdetection_practice/docs/faq.md
 create mode 100644 mmdetection_practice/docs/finetuning.md
 create mode 100644 mmdetection_practice/docs/installation.md
 create mode 100644 mmdetection_practice/docs/prompt_yolo_world.md
 create mode 100644 mmdetection_practice/docs/reparameterize.md
 create mode 100644 mmdetection_practice/docs/tflite_deploy.md
 create mode 100644 mmdetection_practice/docs/updates.md
 create mode 100644 mmdetection_practice/pyproject.toml
 create mode 100644 mmdetection_practice/requirements/basic_requirements.txt
 create mode 100644 mmdetection_practice/requirements/demo_requirements.txt
 create mode 100644 mmdetection_practice/requirements/onnx_requirements.txt
 create mode 100644 mmdetection_practice/third_party/mmyolo/.circleci/config.yml
 create mode 100644 mmdetection_practice/third_party/mmyolo/.circleci/docker/Dockerfile
 create mode 100644 mmdetection_practice/third_party/mmyolo/.circleci/test.yml
 create mode 100644 mmdetection_practice/third_party/mmyolo/.dev_scripts/gather_models.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/.dev_scripts/print_registers.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/.github/CODE_OF_CONDUCT.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/.github/CONTRIBUTING.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/.github/ISSUE_TEMPLATE/1-bug-report.yml
 create mode 100644 mmdetection_practice/third_party/mmyolo/.github/ISSUE_TEMPLATE/2-feature-request.yml
 create mode 100644 mmdetection_practice/third_party/mmyolo/.github/ISSUE_TEMPLATE/3-new-model.yml
 create mode 100644 mmdetection_practice/third_party/mmyolo/.github/ISSUE_TEMPLATE/4-documentation.yml
 create mode 100644 mmdetection_practice/third_party/mmyolo/.github/ISSUE_TEMPLATE/5-reimplementation.yml
 create mode 100644 mmdetection_practice/third_party/mmyolo/.github/ISSUE_TEMPLATE/config.yml
 create mode 100644 mmdetection_practice/third_party/mmyolo/.github/pull_request_template.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/.github/workflows/deploy.yml
 create mode 100644 mmdetection_practice/third_party/mmyolo/.gitignore
 create mode 100644 mmdetection_practice/third_party/mmyolo/.pre-commit-config-zh-cn.yaml
 create mode 100644 mmdetection_practice/third_party/mmyolo/.pre-commit-config.yaml
 create mode 100644 mmdetection_practice/third_party/mmyolo/.readthedocs.yml
 create mode 100644 mmdetection_practice/third_party/mmyolo/LICENSE
 create mode 100644 mmdetection_practice/third_party/mmyolo/MANIFEST.in
 create mode 100644 mmdetection_practice/third_party/mmyolo/README.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/README_zh-CN.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/_base_/default_runtime.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/_base_/det_p5_tta.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/_base_/pose/coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/deploy/base_dynamic.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/deploy/base_static.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/deploy/detection_onnxruntime_dynamic.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/deploy/detection_onnxruntime_static.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/deploy/detection_rknn-fp16_static-320x320.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/deploy/detection_rknn-int8_static-320x320.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/deploy/detection_tensorrt-fp16_dynamic-192x192-960x960.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/deploy/detection_tensorrt-fp16_dynamic-64x64-1344x1344.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/deploy/detection_tensorrt-fp16_static-640x640.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/deploy/detection_tensorrt-int8_dynamic-192x192-960x960.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/deploy/detection_tensorrt-int8_static-640x640.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/deploy/detection_tensorrt_dynamic-192x192-960x960.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/deploy/detection_tensorrt_static-640x640.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/deploy/model/yolov5_s-static.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/deploy/model/yolov6_s-static.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/ppyoloe/README.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/ppyoloe/metafile.yml
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/ppyoloe/ppyoloe_l_fast_8xb20-300e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/ppyoloe/ppyoloe_m_fast_8xb28-300e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/ppyoloe/ppyoloe_plus_l_fast_8xb8-80e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/ppyoloe/ppyoloe_plus_m_fast_8xb8-80e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/ppyoloe/ppyoloe_plus_s_fast_1xb12-40e_cat.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/ppyoloe/ppyoloe_plus_s_fast_8xb8-80e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/ppyoloe/ppyoloe_plus_x_fast_8xb8-80e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/ppyoloe/ppyoloe_s_fast_8xb32-300e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/ppyoloe/ppyoloe_s_fast_8xb32-400e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/ppyoloe/ppyoloe_x_fast_8xb16-300e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/razor/subnets/README.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/razor/subnets/rtmdet_tiny_ofa_lat31_syncbn_16xb16-300e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/razor/subnets/yolov5_s_spos_shufflenetv2_syncbn_8xb16-300e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/razor/subnets/yolov6_l_attentivenas_a6_d12_syncbn_fast_8xb32-300e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/rtmdet/README.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/rtmdet/cspnext_imagenet_pretrain/README.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/rtmdet/cspnext_imagenet_pretrain/cspnext-s_8xb256-rsb-a1-600e_in1k.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/rtmdet/cspnext_imagenet_pretrain/cspnext-tiny_8xb256-rsb-a1-600e_in1k.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/rtmdet/distillation/README.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/rtmdet/distillation/kd_l_rtmdet_x_neck_300e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/rtmdet/distillation/kd_m_rtmdet_l_neck_300e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/rtmdet/distillation/kd_s_rtmdet_m_neck_300e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/rtmdet/distillation/kd_tiny_rtmdet_s_neck_300e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/rtmdet/metafile.yml
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/rtmdet/rotated/rtmdet-r_l_syncbn_fast_2xb4-36e_dota-ms.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/rtmdet/rotated/rtmdet-r_l_syncbn_fast_2xb4-36e_dota.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/rtmdet/rotated/rtmdet-r_l_syncbn_fast_2xb4-aug-100e_dota.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/rtmdet/rotated/rtmdet-r_l_syncbn_fast_coco-pretrain_2xb4-36e_dota-ms.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/rtmdet/rotated/rtmdet-r_m_syncbn_fast_2xb4-36e_dota-ms.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/rtmdet/rotated/rtmdet-r_m_syncbn_fast_2xb4-36e_dota.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/rtmdet/rotated/rtmdet-r_s_fast_1xb8-36e_dota-ms.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/rtmdet/rotated/rtmdet-r_s_fast_1xb8-36e_dota.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/rtmdet/rotated/rtmdet-r_tiny_fast_1xb8-36e_dota-ms.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/rtmdet/rotated/rtmdet-r_tiny_fast_1xb8-36e_dota.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/rtmdet/rtmdet-ins_s_syncbn_fast_8xb32-300e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/rtmdet/rtmdet_l_syncbn_fast_8xb32-300e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/rtmdet/rtmdet_m_syncbn_fast_8xb32-300e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/rtmdet/rtmdet_s_syncbn_fast_8xb32-300e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/rtmdet/rtmdet_tiny_fast_1xb12-40e_cat.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/rtmdet/rtmdet_tiny_syncbn_fast_8xb32-300e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/rtmdet/rtmdet_x_syncbn_fast_8xb32-300e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov5/README.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov5/crowdhuman/yolov5_s-v61_8xb16-300e_ignore_crowdhuman.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov5/crowdhuman/yolov5_s-v61_fast_8xb16-300e_crowdhuman.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov5/ins_seg/yolov5_ins_l-v61_syncbn_fast_8xb16-300e_coco_instance.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov5/ins_seg/yolov5_ins_m-v61_syncbn_fast_8xb16-300e_coco_instance.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov5/ins_seg/yolov5_ins_n-v61_syncbn_fast_8xb16-300e_coco_instance.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov5/ins_seg/yolov5_ins_s-v61_syncbn_fast_8xb16-300e_balloon_instance.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov5/ins_seg/yolov5_ins_s-v61_syncbn_fast_8xb16-300e_coco_instance.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov5/ins_seg/yolov5_ins_s-v61_syncbn_fast_non_overlap_8xb16-300e_coco_instance.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov5/ins_seg/yolov5_ins_x-v61_syncbn_fast_8xb16-300e_coco_instance.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov5/mask_refine/yolov5_l_mask-refine-v61_syncbn_fast_8xb16-300e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov5/mask_refine/yolov5_m_mask-refine-v61_syncbn_fast_8xb16-300e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov5/mask_refine/yolov5_n_mask-refine-v61_syncbn_fast_8xb16-300e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov5/mask_refine/yolov5_s_mask-refine-v61_syncbn_fast_8xb16-300e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov5/mask_refine/yolov5_x_mask-refine-v61_syncbn_fast_8xb16-300e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov5/metafile.yml
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov5/voc/yolov5_l-v61_fast_1xb32-50e_voc.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov5/voc/yolov5_m-v61_fast_1xb64-50e_voc.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov5/voc/yolov5_n-v61_fast_1xb64-50e_voc.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov5/voc/yolov5_s-v61_fast_1xb64-50e_voc.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov5/voc/yolov5_x-v61_fast_1xb32-50e_voc.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5_l-p6-v62_syncbn_fast_8xb16-300e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5_l-v61_syncbn_fast_8xb16-300e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5_m-p6-v62_syncbn_fast_8xb16-300e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5_m-v61_syncbn_fast_8xb16-300e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5_n-p6-v62_syncbn_fast_8xb16-300e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5_n-v61_syncbn_fast_8xb16-300e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5_s-p6-v62_syncbn_fast_8xb16-300e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5_s-v61_fast_1xb12-40e_608x352_cat.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5_s-v61_fast_1xb12-40e_cat.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5_s-v61_fast_1xb12-ms-40e_cat.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5_s-v61_syncbn-detect_8xb16-300e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5_s-v61_syncbn_fast_1xb4-300e_balloon.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5_x-p6-v62_syncbn_fast_8xb16-300e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5_x-v61_syncbn_fast_8xb16-300e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5u/yolov5u_l_mask-refine_syncbn_fast_8xb16-300e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5u/yolov5u_l_syncbn_fast_8xb16-300e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5u/yolov5u_m_mask-refine_syncbn_fast_8xb16-300e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5u/yolov5u_m_syncbn_fast_8xb16-300e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5u/yolov5u_n_mask-refine_syncbn_fast_8xb16-300e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5u/yolov5u_n_syncbn_fast_8xb16-300e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5u/yolov5u_s_mask-refine_syncbn_fast_8xb16-300e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5u/yolov5u_s_syncbn_fast_8xb16-300e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5u/yolov5u_x_mask-refine_syncbn_fast_8xb16-300e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5u/yolov5u_x_syncbn_fast_8xb16-300e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov6/README.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov6/metafile.yml
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov6/yolov6_l_syncbn_fast_8xb32-300e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov6/yolov6_m_syncbn_fast_8xb32-300e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov6/yolov6_n_syncbn_fast_8xb32-300e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov6/yolov6_n_syncbn_fast_8xb32-400e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov6/yolov6_s_fast_1xb12-40e_cat.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov6/yolov6_s_syncbn_fast_8xb32-300e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov6/yolov6_s_syncbn_fast_8xb32-400e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov6/yolov6_t_syncbn_fast_8xb32-300e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov6/yolov6_t_syncbn_fast_8xb32-400e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov6/yolov6_v3_l_syncbn_fast_8xb32-300e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov6/yolov6_v3_m_syncbn_fast_8xb32-300e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov6/yolov6_v3_n_syncbn_fast_8xb32-300e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov6/yolov6_v3_s_syncbn_fast_8xb32-300e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov6/yolov6_v3_t_syncbn_fast_8xb32-300e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov7/README.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov7/metafile.yml
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov7/yolov7_d-p6_syncbn_fast_8x16b-300e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov7/yolov7_e-p6_syncbn_fast_8x16b-300e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov7/yolov7_e2e-p6_syncbn_fast_8x16b-300e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov7/yolov7_l_syncbn_fast_8x16b-300e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov7/yolov7_tiny_fast_1xb12-40e_cat.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov7/yolov7_tiny_syncbn_fast_8x16b-300e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov7/yolov7_w-p6_syncbn_fast_8x16b-300e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov7/yolov7_x_syncbn_fast_8x16b-300e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov8/README.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov8/metafile.yml
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov8/yolov8_l_mask-refine_syncbn_fast_8xb16-500e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov8/yolov8_l_syncbn_fast_8xb16-500e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov8/yolov8_m_mask-refine_syncbn_fast_8xb16-500e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov8/yolov8_m_syncbn_fast_8xb16-500e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov8/yolov8_n_mask-refine_syncbn_fast_8xb16-500e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov8/yolov8_n_syncbn_fast_8xb16-500e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov8/yolov8_s_fast_1xb12-40e_cat.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov8/yolov8_s_mask-refine_syncbn_fast_8xb16-500e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov8/yolov8_s_syncbn_fast_8xb16-500e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov8/yolov8_x_mask-refine_syncbn_fast_8xb16-500e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolov8/yolov8_x_syncbn_fast_8xb16-500e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolox/README.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolox/metafile.yml
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolox/pose/yolox-pose_l_8xb32-300e-rtmdet-hyp_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolox/pose/yolox-pose_m_8xb32-300e-rtmdet-hyp_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolox/pose/yolox-pose_s_8xb32-300e-rtmdet-hyp_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolox/pose/yolox-pose_tiny_8xb32-300e-rtmdet-hyp_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolox/yolox_l_fast_8xb8-300e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolox/yolox_m_fast_8xb32-300e-rtmdet-hyp_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolox/yolox_m_fast_8xb8-300e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolox/yolox_nano_fast_8xb32-300e-rtmdet-hyp_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolox/yolox_nano_fast_8xb8-300e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolox/yolox_p5_tta.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolox/yolox_s_fast_1xb12-40e-rtmdet-hyp_cat.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolox/yolox_s_fast_8xb32-300e-rtmdet-hyp_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolox/yolox_s_fast_8xb8-300e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolox/yolox_tiny_fast_8xb32-300e-rtmdet-hyp_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolox/yolox_tiny_fast_8xb8-300e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/configs/yolox/yolox_x_fast_8xb8-300e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/demo/15_minutes_instance_segmentation.ipynb
 create mode 100644 mmdetection_practice/third_party/mmyolo/demo/15_minutes_object_detection.ipynb
 create mode 100644 mmdetection_practice/third_party/mmyolo/demo/boxam_vis_demo.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/demo/demo.jpg
 create mode 100644 mmdetection_practice/third_party/mmyolo/demo/demo.mp4
 create mode 100644 mmdetection_practice/third_party/mmyolo/demo/deploy_demo.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/demo/dog.jpg
 create mode 100644 mmdetection_practice/third_party/mmyolo/demo/featmap_vis_demo.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/demo/image_demo.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/demo/large_image.jpg
 create mode 100644 mmdetection_practice/third_party/mmyolo/demo/large_image_demo.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/demo/video_demo.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/docker/Dockerfile
 create mode 100644 mmdetection_practice/third_party/mmyolo/docker/Dockerfile_deployment
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/README.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/en/Makefile
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/en/_static/css/readthedocs.css
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/en/_static/image/mmyolo-logo.png
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/en/advanced_guides/cross-library_application.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/en/api.rst
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/en/common_usage/amp_training.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/en/common_usage/freeze_layers.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/en/common_usage/mim_usage.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/en/common_usage/module_combination.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/en/common_usage/ms_training_testing.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/en/common_usage/multi_necks.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/en/common_usage/output_predictions.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/en/common_usage/plugins.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/en/common_usage/resume_training.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/en/common_usage/set_random_seed.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/en/common_usage/set_syncbn.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/en/common_usage/single_multi_channel_applications.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/en/common_usage/specify_device.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/en/common_usage/tta.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/en/conf.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/en/get_started/15_minutes_instance_segmentation.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/en/get_started/15_minutes_object_detection.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/en/get_started/15_minutes_rotated_object_detection.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/en/get_started/dependencies.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/en/get_started/installation.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/en/get_started/overview.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/en/index.rst
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/en/make.bat
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/en/model_zoo.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/en/notes/changelog.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/en/notes/code_style.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/en/notes/compatibility.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/en/notes/conventions.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/algorithm_descriptions/index.rst
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/algorithm_descriptions/rtmdet_description.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/algorithm_descriptions/yolov5_description.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/algorithm_descriptions/yolov8_description.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/application_examples/index.rst
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/application_examples/ionogram_detection.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/complexity_analysis.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/contributing.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/dataset_preparation.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/deploy/easydeploy_guide.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/deploy/index.rst
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/deploy/mmdeploy_guide.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/deploy/mmdeploy_yolov5.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/labeling_to_deployment_tutorials.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/mm_basics.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/model_design.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/replace_backbone.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/training_testing_tricks.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/troubleshooting_steps.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/visualization.md
 create mode 100755 mmdetection_practice/third_party/mmyolo/docs/en/stat.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/en/switch_language.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/en/tutorials/config.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/en/tutorials/custom_installation.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/en/tutorials/data_flow.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/en/tutorials/faq.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/en/tutorials/rotated_detection.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/en/tutorials/warning_notes.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/en/useful_tools/browse_coco_json.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/en/useful_tools/browse_dataset.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/en/useful_tools/dataset_analysis.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/en/useful_tools/dataset_converters.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/en/useful_tools/download_dataset.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/en/useful_tools/extract_subcoco.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/en/useful_tools/log_analysis.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/en/useful_tools/model_converters.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/en/useful_tools/optimize_anchors.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/en/useful_tools/print_config.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/en/useful_tools/vis_scheduler.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/zh_cn/Makefile
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/zh_cn/_static/css/readthedocs.css
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/zh_cn/_static/image/mmyolo-logo.png
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/zh_cn/advanced_guides/cross-library_application.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/zh_cn/api.rst
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/zh_cn/common_usage/amp_training.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/zh_cn/common_usage/freeze_layers.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/zh_cn/common_usage/mim_usage.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/zh_cn/common_usage/module_combination.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/zh_cn/common_usage/ms_training_testing.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/zh_cn/common_usage/multi_necks.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/zh_cn/common_usage/output_predictions.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/zh_cn/common_usage/plugins.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/zh_cn/common_usage/registries_info.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/zh_cn/common_usage/resume_training.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/zh_cn/common_usage/set_random_seed.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/zh_cn/common_usage/set_syncbn.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/zh_cn/common_usage/single_multi_channel_applications.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/zh_cn/common_usage/specify_device.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/zh_cn/common_usage/tta.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/zh_cn/conf.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/zh_cn/get_started/15_minutes_instance_segmentation.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/zh_cn/get_started/15_minutes_object_detection.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/zh_cn/get_started/15_minutes_rotated_object_detection.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/zh_cn/get_started/article.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/zh_cn/get_started/dependencies.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/zh_cn/get_started/installation.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/zh_cn/get_started/overview.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/zh_cn/index.rst
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/zh_cn/make.bat
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/zh_cn/model_zoo.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/zh_cn/notes/changelog.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/zh_cn/notes/code_style.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/zh_cn/notes/compatibility.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/zh_cn/notes/conventions.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/algorithm_descriptions/index.rst
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/algorithm_descriptions/rtmdet_description.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/algorithm_descriptions/yolov5_description.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/algorithm_descriptions/yolov6_description.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/algorithm_descriptions/yolov8_description.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/application_examples/index.rst
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/application_examples/ionogram_detection.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/complexity_analysis.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/contributing.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/dataset_preparation.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/deploy/easydeploy_guide.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/deploy/index.rst
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/deploy/mmdeploy_guide.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/deploy/mmdeploy_yolov5.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/labeling_to_deployment_tutorials.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/mm_basics.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/model_design.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/replace_backbone.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/training_testing_tricks.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/troubleshooting_steps.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/visualization.md
 create mode 100755 mmdetection_practice/third_party/mmyolo/docs/zh_cn/stat.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/zh_cn/switch_language.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/zh_cn/tutorials/config.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/zh_cn/tutorials/custom_installation.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/zh_cn/tutorials/data_flow.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/zh_cn/tutorials/faq.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/zh_cn/tutorials/rotated_detection.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/zh_cn/tutorials/warning_notes.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/zh_cn/useful_tools/browse_coco_json.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/zh_cn/useful_tools/browse_dataset.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/zh_cn/useful_tools/dataset_analysis.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/zh_cn/useful_tools/dataset_converters.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/zh_cn/useful_tools/download_dataset.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/zh_cn/useful_tools/extract_subcoco.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/zh_cn/useful_tools/log_analysis.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/zh_cn/useful_tools/model_converters.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/zh_cn/useful_tools/optimize_anchors.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/zh_cn/useful_tools/print_config.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/docs/zh_cn/useful_tools/vis_scheduler.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/__init__.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/datasets/__init__.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/datasets/pose_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/datasets/transforms/__init__.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/datasets/transforms/formatting.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/datasets/transforms/keypoint_structure.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/datasets/transforms/mix_img_transforms.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/datasets/transforms/transforms.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/datasets/utils.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/datasets/yolov5_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/datasets/yolov5_crowdhuman.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/datasets/yolov5_dota.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/datasets/yolov5_voc.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/deploy/__init__.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/deploy/models/__init__.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/deploy/models/dense_heads/__init__.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/deploy/models/dense_heads/yolov5_head.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/deploy/models/layers/__init__.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/deploy/models/layers/bbox_nms.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/deploy/object_detection.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/engine/__init__.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/engine/hooks/__init__.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/engine/hooks/ppyoloe_param_scheduler_hook.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/engine/hooks/switch_to_deploy_hook.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/engine/hooks/yolov5_param_scheduler_hook.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/engine/hooks/yolox_mode_switch_hook.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/engine/optimizers/__init__.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/engine/optimizers/yolov5_optim_constructor.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/engine/optimizers/yolov7_optim_wrapper_constructor.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/models/__init__.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/models/backbones/__init__.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/models/backbones/base_backbone.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/models/backbones/csp_darknet.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/models/backbones/csp_resnet.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/models/backbones/cspnext.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/models/backbones/efficient_rep.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/models/backbones/yolov7_backbone.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/models/data_preprocessors/__init__.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/models/data_preprocessors/data_preprocessor.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/models/dense_heads/__init__.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/models/dense_heads/ppyoloe_head.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/models/dense_heads/rtmdet_head.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/models/dense_heads/rtmdet_ins_head.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/models/dense_heads/rtmdet_rotated_head.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/models/dense_heads/yolov5_head.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/models/dense_heads/yolov5_ins_head.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/models/dense_heads/yolov6_head.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/models/dense_heads/yolov7_head.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/models/dense_heads/yolov8_head.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/models/dense_heads/yolox_head.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/models/dense_heads/yolox_pose_head.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/models/detectors/__init__.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/models/detectors/yolo_detector.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/models/layers/__init__.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/models/layers/ema.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/models/layers/yolo_bricks.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/models/losses/__init__.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/models/losses/iou_loss.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/models/losses/oks_loss.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/models/necks/__init__.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/models/necks/base_yolo_neck.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/models/necks/cspnext_pafpn.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/models/necks/ppyoloe_csppan.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/models/necks/yolov5_pafpn.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/models/necks/yolov6_pafpn.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/models/necks/yolov7_pafpn.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/models/necks/yolov8_pafpn.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/models/necks/yolox_pafpn.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/models/plugins/__init__.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/models/plugins/cbam.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/models/task_modules/__init__.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/models/task_modules/assigners/__init__.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/models/task_modules/assigners/batch_atss_assigner.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/models/task_modules/assigners/batch_dsl_assigner.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/models/task_modules/assigners/batch_task_aligned_assigner.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/models/task_modules/assigners/batch_yolov7_assigner.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/models/task_modules/assigners/pose_sim_ota_assigner.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/models/task_modules/assigners/utils.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/models/task_modules/coders/__init__.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/models/task_modules/coders/distance_angle_point_coder.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/models/task_modules/coders/distance_point_bbox_coder.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/models/task_modules/coders/yolov5_bbox_coder.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/models/task_modules/coders/yolox_bbox_coder.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/models/utils/__init__.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/models/utils/misc.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/registry.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/testing/__init__.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/testing/_utils.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/utils/__init__.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/utils/boxam_utils.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/utils/collect_env.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/utils/labelme_utils.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/utils/large_image.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/utils/misc.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/utils/setup_env.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/mmyolo/version.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/model-index.yml
 create mode 100644 mmdetection_practice/third_party/mmyolo/projects/assigner_visualization/README.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/projects/assigner_visualization/assigner_visualization.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/projects/assigner_visualization/configs/rtmdet_s_syncbn_fast_8xb32-300e_coco_assignervisualization.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/projects/assigner_visualization/configs/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_assignervisualization.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/projects/assigner_visualization/configs/yolov7_tiny_syncbn_fast_8xb16-300e_coco_assignervisualization.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/projects/assigner_visualization/configs/yolov8_s_syncbn_fast_8xb16-500e_coco_assignervisualization.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/projects/assigner_visualization/dense_heads/__init__.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/projects/assigner_visualization/dense_heads/rtmdet_head_assigner.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/projects/assigner_visualization/dense_heads/yolov5_head_assigner.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/projects/assigner_visualization/dense_heads/yolov7_head_assigner.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/projects/assigner_visualization/dense_heads/yolov8_head_assigner.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/projects/assigner_visualization/detectors/__init__.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/projects/assigner_visualization/detectors/yolo_detector_assigner.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/projects/assigner_visualization/visualization/__init__.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/projects/assigner_visualization/visualization/assigner_visualizer.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/projects/easydeploy/README.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/projects/easydeploy/README_zh-CN.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/projects/easydeploy/backbone/__init__.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/projects/easydeploy/backbone/common.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/projects/easydeploy/backbone/focus.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/projects/easydeploy/bbox_code/__init__.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/projects/easydeploy/bbox_code/bbox_coder.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/projects/easydeploy/deepstream/CMakeLists.txt
 create mode 100644 mmdetection_practice/third_party/mmyolo/projects/easydeploy/deepstream/README.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/projects/easydeploy/deepstream/README_zh-CN.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/projects/easydeploy/deepstream/coco_labels.txt
 create mode 100644 mmdetection_practice/third_party/mmyolo/projects/easydeploy/deepstream/configs/config_infer_rtmdet.txt
 create mode 100644 mmdetection_practice/third_party/mmyolo/projects/easydeploy/deepstream/configs/config_infer_yolov5.txt
 create mode 100644 mmdetection_practice/third_party/mmyolo/projects/easydeploy/deepstream/configs/config_infer_yolov8.txt
 create mode 100644 mmdetection_practice/third_party/mmyolo/projects/easydeploy/deepstream/custom_mmyolo_bbox_parser/nvdsparsebbox_mmyolo.cpp
 create mode 100644 mmdetection_practice/third_party/mmyolo/projects/easydeploy/deepstream/deepstream_app_config.txt
 create mode 100644 mmdetection_practice/third_party/mmyolo/projects/easydeploy/docs/model_convert.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/projects/easydeploy/examples/config.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/projects/easydeploy/examples/cv2_nms.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/projects/easydeploy/examples/main_onnxruntime.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/projects/easydeploy/examples/numpy_coder.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/projects/easydeploy/examples/preprocess.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/projects/easydeploy/examples/requirements.txt
 create mode 100644 mmdetection_practice/third_party/mmyolo/projects/easydeploy/model/__init__.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/projects/easydeploy/model/backend.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/projects/easydeploy/model/backendwrapper.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/projects/easydeploy/model/model.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/projects/easydeploy/nms/__init__.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/projects/easydeploy/nms/ort_nms.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/projects/easydeploy/nms/trt_nms.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/projects/easydeploy/tools/build_engine.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/projects/easydeploy/tools/export_onnx.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/projects/easydeploy/tools/image-demo.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/projects/example_project/README.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/projects/example_project/configs/yolov5_s_dummy-backbone_v61_syncbn_8xb16-300e_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/projects/example_project/dummy/__init__.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/projects/example_project/dummy/dummy_yolov5cspdarknet.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/projects/misc/custom_dataset/README.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/projects/misc/custom_dataset/yolov5_s-v61_syncbn_fast_1xb32-100e_cat.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/projects/misc/custom_dataset/yolov6_s_syncbn_fast_1xb32-100e_cat.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/projects/misc/custom_dataset/yolov7_tiny_syncbn_fast_1xb32-100e_cat.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/projects/misc/ionogram_detection/README.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/projects/misc/ionogram_detection/rtmdet/rtmdet_l_fast_1xb32-100e_ionogram.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/projects/misc/ionogram_detection/rtmdet/rtmdet_s_fast_1xb32-100e_ionogram.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/projects/misc/ionogram_detection/rtmdet/rtmdet_tiny_fast_1xb32-100e_ionogram.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/projects/misc/ionogram_detection/yolov5/yolov5_m-v61_fast_1xb32-100e_ionogram.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/projects/misc/ionogram_detection/yolov5/yolov5_s-v61_fast_1xb32-100e_ionogram_mosaic.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/projects/misc/ionogram_detection/yolov5/yolov5_s-v61_fast_1xb96-100e_ionogram.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/projects/misc/ionogram_detection/yolov5/yolov5_s-v61_fast_1xb96-100e_ionogram_aug0.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/projects/misc/ionogram_detection/yolov5/yolov5_s-v61_fast_1xb96-100e_ionogram_mosaic_affine.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/projects/misc/ionogram_detection/yolov5/yolov5_s-v61_fast_1xb96-100e_ionogram_mosaic_affine_albu_hsv.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/projects/misc/ionogram_detection/yolov5/yolov5_s-v61_fast_1xb96-200e_ionogram_pre0.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/projects/misc/ionogram_detection/yolov6/yolov6_l_fast_1xb32-100e_ionogram.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/projects/misc/ionogram_detection/yolov6/yolov6_m_fast_1xb32-100e_ionogram.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/projects/misc/ionogram_detection/yolov6/yolov6_s_fast_1xb32-100e_ionogram.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/projects/misc/ionogram_detection/yolov6/yolov6_s_fast_1xb32-200e_ionogram_pre0.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/projects/misc/ionogram_detection/yolov7/yolov7_l_fast_1xb16-100e_ionogram.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/projects/misc/ionogram_detection/yolov7/yolov7_tiny_fast_1xb16-100e_ionogram.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/projects/misc/ionogram_detection/yolov7/yolov7_x_fast_1xb16-100e_ionogram.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/pytest.ini
 create mode 100644 mmdetection_practice/third_party/mmyolo/requirements.txt
 create mode 100644 mmdetection_practice/third_party/mmyolo/requirements/albu.txt
 create mode 100644 mmdetection_practice/third_party/mmyolo/requirements/build.txt
 create mode 100644 mmdetection_practice/third_party/mmyolo/requirements/docs.txt
 create mode 100644 mmdetection_practice/third_party/mmyolo/requirements/mminstall.txt
 create mode 100644 mmdetection_practice/third_party/mmyolo/requirements/mmpose.txt
 create mode 100644 mmdetection_practice/third_party/mmyolo/requirements/mmrotate.txt
 create mode 100644 mmdetection_practice/third_party/mmyolo/requirements/runtime.txt
 create mode 100644 mmdetection_practice/third_party/mmyolo/requirements/sahi.txt
 create mode 100644 mmdetection_practice/third_party/mmyolo/requirements/tests.txt
 create mode 100644 mmdetection_practice/third_party/mmyolo/resources/mmyolo-logo.png
 create mode 100644 mmdetection_practice/third_party/mmyolo/resources/qq_group_qrcode.jpg
 create mode 100644 mmdetection_practice/third_party/mmyolo/resources/zhihu_qrcode.jpg
 create mode 100644 mmdetection_practice/third_party/mmyolo/setup.cfg
 create mode 100755 mmdetection_practice/third_party/mmyolo/setup.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tests/regression/mmyolo.yml
 create mode 100644 mmdetection_practice/third_party/mmyolo/tests/test_datasets/__init__.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tests/test_datasets/test_transforms/__init__.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tests/test_datasets/test_transforms/test_formatting.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tests/test_datasets/test_transforms/test_mix_img_transforms.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tests/test_datasets/test_transforms/test_transforms.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tests/test_datasets/test_utils.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tests/test_datasets/test_yolov5_coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tests/test_datasets/test_yolov5_voc.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tests/test_deploy/conftest.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tests/test_deploy/test_mmyolo_models.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tests/test_deploy/test_object_detection.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tests/test_downstream/test_mmrazor.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tests/test_engine/__init__.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tests/test_engine/test_hooks/test_switch_to_deploy_hook.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tests/test_engine/test_hooks/test_yolov5_param_scheduler_hook.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tests/test_engine/test_hooks/test_yolox_mode_switch_hook.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tests/test_engine/test_optimizers/__init__.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tests/test_engine/test_optimizers/test_yolov5_optim_constructor.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tests/test_engine/test_optimizers/test_yolov7_optim_wrapper_constructor.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tests/test_models/__init__.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tests/test_models/test_backbone/__init__.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tests/test_models/test_backbone/test_csp_darknet.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tests/test_models/test_backbone/test_csp_resnet.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tests/test_models/test_backbone/test_efficient_rep.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tests/test_models/test_backbone/test_yolov7_backbone.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tests/test_models/test_backbone/utils.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tests/test_models/test_data_preprocessor/__init__.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tests/test_models/test_data_preprocessor/test_data_preprocessor.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tests/test_models/test_dense_heads/__init__.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tests/test_models/test_dense_heads/test_ppyoloe_head.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tests/test_models/test_dense_heads/test_rotated_rtmdet_head.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tests/test_models/test_dense_heads/test_rtmdet_head.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tests/test_models/test_dense_heads/test_yolov5_head.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tests/test_models/test_dense_heads/test_yolov6_head.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tests/test_models/test_dense_heads/test_yolov7_head.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tests/test_models/test_dense_heads/test_yolov8_head.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tests/test_models/test_dense_heads/test_yolox_head.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tests/test_models/test_detectors/test_yolo_detector.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tests/test_models/test_layers/__init__.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tests/test_models/test_layers/test_ema.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tests/test_models/test_layers/test_yolo_bricks.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tests/test_models/test_necks/__init__.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tests/test_models/test_necks/test_cspnext_pafpn.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tests/test_models/test_necks/test_ppyoloe_csppan.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tests/test_models/test_necks/test_yolov5_pafpn.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tests/test_models/test_necks/test_yolov6_pafpn.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tests/test_models/test_necks/test_yolov7_pafpn.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tests/test_models/test_necks/test_yolov8_pafpn.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tests/test_models/test_necks/test_yolox_pafpn.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tests/test_models/test_plugins/__init__.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tests/test_models/test_plugins/test_cbam.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tests/test_models/test_task_modules/__init__.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tests/test_models/test_task_modules/test_assigners/__init__.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tests/test_models/test_task_modules/test_assigners/test_batch_atss_assigner.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tests/test_models/test_task_modules/test_assigners/test_batch_dsl_assigner.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tests/test_models/test_task_modules/test_assigners/test_batch_task_aligned_assigner.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tests/test_models/test_task_modules/test_assigners/test_pose_sim_ota_assigner.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tests/test_models/test_task_modules/test_coders/__init__.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tests/test_models/test_task_modules/test_coders/test_distance_point_bbox_coder.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tests/test_models/test_task_modules/test_coders/test_yolov5_bbox_coder.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tests/test_models/test_task_modules/test_coders/test_yolox_bbox_coder.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tests/test_models/test_utils/__init__.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tests/test_models/test_utils/test_misc.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tests/test_utils/test_collect_env.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tests/test_utils/test_setup_env.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tools/analysis_tools/benchmark.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tools/analysis_tools/browse_coco_json.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tools/analysis_tools/browse_dataset.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tools/analysis_tools/browse_dataset_simple.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tools/analysis_tools/confusion_matrix.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tools/analysis_tools/dataset_analysis.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tools/analysis_tools/get_flops.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tools/analysis_tools/optimize_anchors.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tools/analysis_tools/vis_scheduler.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tools/dataset_converters/balloon2coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tools/dataset_converters/dota/README.md
 create mode 100644 mmdetection_practice/third_party/mmyolo/tools/dataset_converters/dota/dota_split.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tools/dataset_converters/dota/split_config/multi_scale.json
 create mode 100644 mmdetection_practice/third_party/mmyolo/tools/dataset_converters/dota/split_config/single_scale.json
 create mode 100644 mmdetection_practice/third_party/mmyolo/tools/dataset_converters/labelme2coco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tools/dataset_converters/yolo2coco.py
 create mode 100755 mmdetection_practice/third_party/mmyolo/tools/dist_test.sh
 create mode 100755 mmdetection_practice/third_party/mmyolo/tools/dist_train.sh
 create mode 100644 mmdetection_practice/third_party/mmyolo/tools/misc/coco_split.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tools/misc/download_dataset.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tools/misc/extract_subcoco.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tools/misc/print_config.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tools/misc/publish_model.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tools/model_converters/convert_kd_ckpt_to_student.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tools/model_converters/ppyoloe_to_mmyolo.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tools/model_converters/rtmdet_to_mmyolo.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tools/model_converters/yolov5_to_mmyolo.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tools/model_converters/yolov5u_to_mmyolo.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tools/model_converters/yolov6_to_mmyolo.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tools/model_converters/yolov6_v3_to_mmyolo.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tools/model_converters/yolov7_to_mmyolo.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tools/model_converters/yolov8_to_mmyolo.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tools/model_converters/yolox_to_mmyolo.py
 create mode 100755 mmdetection_practice/third_party/mmyolo/tools/slurm_test.sh
 create mode 100755 mmdetection_practice/third_party/mmyolo/tools/slurm_train.sh
 create mode 100644 mmdetection_practice/third_party/mmyolo/tools/test.py
 create mode 100644 mmdetection_practice/third_party/mmyolo/tools/train.py
 create mode 100644 mmdetection_practice/tools/benchmark.py
 create mode 100755 mmdetection_practice/tools/dist_test.sh
 create mode 100755 mmdetection_practice/tools/dist_train.sh
 create mode 100644 mmdetection_practice/tools/generate_image_prompts.py
 create mode 100644 mmdetection_practice/tools/generate_text_prompts.py
 create mode 100644 mmdetection_practice/tools/get_flops.py
 create mode 100644 mmdetection_practice/tools/reparameterize_yoloworld.py
 create mode 100644 mmdetection_practice/tools/test.py
 create mode 100644 mmdetection_practice/tools/train.py
 create mode 100644 mmdetection_practice/tools/utils.py
 create mode 100644 mmdetection_practice/yolo_world/__init__.py
 create mode 100644 mmdetection_practice/yolo_world/datasets/__init__.py
 create mode 100644 mmdetection_practice/yolo_world/datasets/mm_dataset.py
 create mode 100644 mmdetection_practice/yolo_world/datasets/transformers/__init__.py
 create mode 100644 mmdetection_practice/yolo_world/datasets/transformers/mm_mix_img_transforms.py
 create mode 100644 mmdetection_practice/yolo_world/datasets/transformers/mm_transforms.py
 create mode 100644 mmdetection_practice/yolo_world/datasets/utils.py
 create mode 100644 mmdetection_practice/yolo_world/datasets/yolov5_cc3m_grounding.py
 create mode 100644 mmdetection_practice/yolo_world/datasets/yolov5_lvis.py
 create mode 100644 mmdetection_practice/yolo_world/datasets/yolov5_mixed_grounding.py
 create mode 100644 mmdetection_practice/yolo_world/datasets/yolov5_obj365v1.py
 create mode 100644 mmdetection_practice/yolo_world/datasets/yolov5_obj365v2.py
 create mode 100644 mmdetection_practice/yolo_world/datasets/yolov5_v3det.py
 create mode 100644 mmdetection_practice/yolo_world/engine/__init__.py
 create mode 100644 mmdetection_practice/yolo_world/engine/optimizers/__init__.py
 create mode 100644 mmdetection_practice/yolo_world/engine/optimizers/yolow_v5_optim_constructor.py
 create mode 100644 mmdetection_practice/yolo_world/models/__init__.py
 create mode 100644 mmdetection_practice/yolo_world/models/assigner/__init__.py
 create mode 100644 mmdetection_practice/yolo_world/models/assigner/task_aligned_assigner.py
 create mode 100644 mmdetection_practice/yolo_world/models/backbones/__init__.py
 create mode 100644 mmdetection_practice/yolo_world/models/backbones/mm_backbone.py
 create mode 100644 mmdetection_practice/yolo_world/models/data_preprocessors/__init__.py
 create mode 100644 mmdetection_practice/yolo_world/models/data_preprocessors/data_preprocessor.py
 create mode 100644 mmdetection_practice/yolo_world/models/dense_heads/__init__.py
 create mode 100644 mmdetection_practice/yolo_world/models/dense_heads/yolo_world_head.py
 create mode 100644 mmdetection_practice/yolo_world/models/dense_heads/yolo_world_seg_head.py
 create mode 100644 mmdetection_practice/yolo_world/models/detectors/__init__.py
 create mode 100644 mmdetection_practice/yolo_world/models/detectors/yolo_world.py
 create mode 100644 mmdetection_practice/yolo_world/models/layers/__init__.py
 create mode 100644 mmdetection_practice/yolo_world/models/layers/yolo_bricks.py
 create mode 100644 mmdetection_practice/yolo_world/models/losses/__init__.py
 create mode 100644 mmdetection_practice/yolo_world/models/losses/dynamic_loss.py
 create mode 100644 mmdetection_practice/yolo_world/models/necks/__init__.py
 create mode 100644 mmdetection_practice/yolo_world/models/necks/yolo_world_pafpn.py
 create mode 100644 mmdetection_practice/yolo_world/version.py

diff --git a/mmdetection_practice/Dockerfile b/mmdetection_practice/Dockerfile
new file mode 100644
index 0000000..4869c79
--- /dev/null
+++ b/mmdetection_practice/Dockerfile
@@ -0,0 +1,43 @@
+FROM nvidia/cuda:11.8.0-devel-ubuntu22.04
+
+ARG MODEL="yolo_world_l_dual_vlpan_l2norm_2e-3_100e_4x8gpus_obj365v1_goldg_train_lvis_minival.py"
+ARG WEIGHT="yolo_world_l_clip_base_dual_vlpan_2e-3adamw_32xb16_100e_o365_goldg_train_pretrained-0e566235.pth"
+
+ENV FORCE_CUDA="1"
+ENV MMCV_WITH_OPS=1
+
+RUN apt-get update && apt-get install -y --no-install-recommends \
+    python3-pip     \
+    libgl1-mesa-glx \
+    libsm6          \
+    libxext6        \
+    libxrender-dev  \
+    libglib2.0-0    \
+    git             \
+    python3-dev     \
+    python3-wheel
+
+RUN pip3 install --upgrade pip \
+    && pip3 install   \
+        gradio        \
+        opencv-python \
+        supervision   \
+        mmengine      \
+        setuptools    \
+        openmim       \
+    && mim install mmcv==2.0.0 \
+    && pip3 install --no-cache-dir --index-url https://download.pytorch.org/whl/cu118 \
+        wheel         \
+        torch         \
+        torchvision   \
+        torchaudio
+
+COPY . /yolo
+WORKDIR /yolo
+
+RUN pip3 install -e .
+
+RUN curl -o weights/$WEIGHT -L https://huggingface.co/wondervictor/YOLO-World/resolve/main/$WEIGHT
+
+ENTRYPOINT [ "python3", "demo.py" ]
+CMD ["configs/pretrain/$MODEL", "weights/$WEIGHT"]
\ No newline at end of file
diff --git a/mmdetection_practice/LICENSE b/mmdetection_practice/LICENSE
new file mode 100644
index 0000000..dd8b209
--- /dev/null
+++ b/mmdetection_practice/LICENSE
@@ -0,0 +1,1347 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    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, see <https://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<https://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<https://www.gnu.org/licenses/why-not-lgpl.html>.                    GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    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, see <https://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<https://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<https://www.gnu.org/licenses/why-not-lgpl.html>.
\ No newline at end of file
diff --git a/mmdetection_practice/assets/finetune_yoloworld.png b/mmdetection_practice/assets/finetune_yoloworld.png
new file mode 100644
index 0000000000000000000000000000000000000000..235230e406e1ab907305ac80d402ba879484957d
GIT binary patch
literal 477628
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%0D?cxbO%<pMUha3ae{EgM?A^1U8F92rnP!2G;lEVb
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

literal 0
HcmV?d00001

diff --git a/mmdetection_practice/assets/reparameterize.png b/mmdetection_practice/assets/reparameterize.png
new file mode 100644
index 0000000000000000000000000000000000000000..56a52de96a16217ba0290a85911c3d919c9f5ffc
GIT binary patch
literal 64275
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

literal 0
HcmV?d00001

diff --git a/mmdetection_practice/assets/yolo_arch.png b/mmdetection_practice/assets/yolo_arch.png
new file mode 100644
index 0000000000000000000000000000000000000000..96c7caada7113c783458595fb2f52a5e95fba0aa
GIT binary patch
literal 304911
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%0Dc&@&-CRJT+>C52PiHFbe
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

literal 0
HcmV?d00001

diff --git a/mmdetection_practice/assets/yolo_logo.png b/mmdetection_practice/assets/yolo_logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..0a9321f37d9a53e69c9f3e56b3c274cc6c80fe8e
GIT binary patch
literal 102325
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
L^>bP0l+XkK@y4N)

literal 0
HcmV?d00001

diff --git a/mmdetection_practice/configs/.DS_Store b/mmdetection_practice/configs/.DS_Store
new file mode 100644
index 0000000000000000000000000000000000000000..3905161aa860f24a530c63b0792917477ada8a57
GIT binary patch
literal 6148
zcmZQzU|@7AO)+F(5MW?n;9!8z3~dZp0Z1N%F(jFwB8(vOz-AONWHRJ3q%!0&ltASO
zQ6Rls45<ti3<V6S3`qJ@ij#Aa^7C^D889k88UmvsFd71*Aut*Oqai?22!QHdQ2ozM
zlCDw3qaiRF0wW;=K;?r1q;1dO0HqrsG)Rhpk%0l+1z==gV1b1PBe);H0Fnb~1<@d_
zAR45Vff2+4n*r9!zzEgK2=0b}^nto0AR4Tlfe~yoh!57zzzDXPfq@aCoq-W*Gb6Nz
z!U)mMzzEUKzzDV-=DJaOGz3ON02Ttw5QYG#{&!_yz}5eUs2U|lLtr!nhGhsavbY4h
zIDso=?EVAQwV?Vm0jlNzR2d_vUWSN)lz^&saCOWC8B~;jDg%jww1a4Hb<D`X0ItnP
Q8w0Qq8l^`=fW9FB0Fo&cx&QzG

literal 0
HcmV?d00001

diff --git a/mmdetection_practice/configs/experiment/yolo_world_m_dual_vlpan_l2norm_2e-3_100e_8gpus_obj365v1_train_lvis_minival.py b/mmdetection_practice/configs/experiment/yolo_world_m_dual_vlpan_l2norm_2e-3_100e_8gpus_obj365v1_train_lvis_minival.py
new file mode 100644
index 0000000..0a3e99a
--- /dev/null
+++ b/mmdetection_practice/configs/experiment/yolo_world_m_dual_vlpan_l2norm_2e-3_100e_8gpus_obj365v1_train_lvis_minival.py
@@ -0,0 +1,201 @@
+_base_ = ('../../third_party/mmyolo/configs/yolov8/'
+          'yolov8_m_syncbn_fast_8xb16-500e_coco.py')
+custom_imports = dict(imports=['yolo_world'],
+                      allow_failed_imports=False)
+
+exp_name = "yolo_world_m_dual_vlpan_l2norm_2e-3_100e_8gpus_obj365v1_train_lvis_minival" # TODO: change experiment name
+
+# hyper-parameters
+num_classes = 1203
+num_training_classes = 80
+max_epochs = 100  # Maximum training epochs
+close_mosaic_epochs = 2
+save_epoch_intervals = 1
+text_channels = 512
+neck_embed_channels = [128, 256, _base_.last_stage_out_channels // 2]
+neck_num_heads = [4, 8, _base_.last_stage_out_channels // 2 // 32]
+base_lr = 2e-3
+weight_decay = 0.05 / 2
+train_batch_size_per_gpu = 8 # if train_batch_size_per_gpu=16, CUDA out of memory error happens :(
+accumulative_counts = 8 # total_batch_size=512 # TODO: change grad_accum if number of GPU changes
+
+# model settings # TODO: change model settings
+model = dict(
+    type='YOLOWorldDetector',
+    mm_neck=True,
+    num_train_classes=num_training_classes,
+    num_test_classes=num_classes,
+    data_preprocessor=dict(type='YOLOWDetDataPreprocessor'),
+    backbone=dict(
+        _delete_=True,
+        type='MultiModalYOLOBackbone',
+        image_model={{_base_.model.backbone}},
+        text_model=dict(
+            type='HuggingCLIPLanguageBackbone',
+            model_name='openai/clip-vit-base-patch32',
+            frozen_modules=['all'])),
+    neck=dict(type='YOLOWorldDualPAFPN',
+              guide_channels=text_channels,
+              embed_channels=neck_embed_channels,
+              num_heads=neck_num_heads,
+              block_cfg=dict(type='MaxSigmoidCSPLayerWithTwoConv'),
+              text_enhancder=dict(type='ImagePoolingAttentionModule',
+                                  embed_channels=256,
+                                  num_heads=8)),
+    bbox_head=dict(type='YOLOWorldHead',
+                   head_module=dict(type='YOLOWorldHeadModule',
+                                    embed_dims=text_channels,
+                                    num_classes=num_training_classes)),
+    train_cfg=dict(assigner=dict(num_classes=num_training_classes)))
+
+# dataset settings
+text_transform = [
+    dict(type='RandomLoadText',
+         num_neg_samples=(num_classes, num_classes),
+         max_num_samples=num_training_classes,
+         padding_to_max=True,
+         padding_value=''),
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                    'flip_direction', 'texts'))
+]
+train_pipeline = [
+    *_base_.pre_transform,
+    dict(type='MultiModalMosaic',
+         img_scale=_base_.img_scale,
+         pad_val=114.0,
+         pre_transform=_base_.pre_transform),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        scaling_ratio_range=(1 - _base_.affine_scale, 1 + _base_.affine_scale),
+        max_aspect_ratio=_base_.max_aspect_ratio,
+        border=(-_base_.img_scale[0] // 2, -_base_.img_scale[1] // 2),
+        border_val=(114, 114, 114)),
+    *_base_.last_transform[:-1],
+    *text_transform,
+]
+train_pipeline_stage2 = [*_base_.train_pipeline_stage2[:-1], *text_transform]
+obj365v1_train_dataset = dict(
+    type='MultiModalDataset',
+    dataset=dict(
+        type='YOLOv5Objects365V1Dataset',
+        data_root='data/objects365v1/',
+        ann_file='annotations/objects365_train.json',
+        data_prefix=dict(img='train/'),
+        filter_cfg=dict(filter_empty_gt=False, min_size=32)),
+    class_text_path='data/texts/obj365v1_class_texts.json',
+    pipeline=train_pipeline)
+
+mg_train_dataset = dict(type='YOLOv5MixedGroundingDataset',
+                        data_root='data/mixed_grounding/',
+                        ann_file='annotations/final_mixed_train_no_coco.json',
+                        data_prefix=dict(img='gqa/images/'),
+                        filter_cfg=dict(filter_empty_gt=False, min_size=32),
+                        pipeline=train_pipeline)
+
+flickr_train_dataset = dict(
+    type='YOLOv5MixedGroundingDataset',
+    data_root='data/flickr/',
+    ann_file='annotations/final_flickr_separateGT_train.json',
+    data_prefix=dict(img='full_images/'),
+    filter_cfg=dict(filter_empty_gt=True, min_size=32),
+    pipeline=train_pipeline)
+
+train_dataloader = dict(batch_size=train_batch_size_per_gpu,
+                        collate_fn=dict(type='yolow_collate'),
+                        dataset=dict(_delete_=True,
+                                     type='ConcatDataset',
+                                     datasets=[
+                                         obj365v1_train_dataset,
+                                         # flickr_train_dataset,
+                                         # mg_train_dataset
+                                     ],
+                                     ignore_keys=['classes', 'palette']))
+
+test_pipeline = [
+    *_base_.test_pipeline[:-1],
+    dict(type='LoadText'),
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                    'scale_factor', 'pad_param', 'texts'))
+]
+coco_val_dataset = dict(
+    _delete_=True,
+    type='MultiModalDataset',
+    dataset=dict(type='YOLOv5LVISV1Dataset',
+                 data_root='data/coco/',
+                 test_mode=True,
+                 ann_file='lvis/lvis_v1_minival_inserted_image_name.json',
+                 data_prefix=dict(img=''),
+                 batch_shapes_cfg=None),
+    class_text_path='data/texts/lvis_v1_class_texts.json',
+    pipeline=test_pipeline)
+val_dataloader = dict(dataset=coco_val_dataset)
+test_dataloader = val_dataloader
+
+val_evaluator = dict(type='mmdet.LVISMetric',
+                     ann_file='data/coco/lvis/lvis_v1_minival_inserted_image_name.json',
+                     metric='bbox')
+test_evaluator = val_evaluator
+
+# training settings
+default_hooks = dict(
+    param_scheduler=dict(max_epochs=max_epochs),
+    logger=dict(type='LoggerHook', interval=1), # TODO: This is for testing
+    checkpoint=dict(
+        interval=save_epoch_intervals,
+        rule='greater'
+    )
+)
+custom_hooks = [
+    dict(type='EMAHook',
+         ema_type='ExpMomentumEMA',
+         momentum=0.0001,
+         update_buffers=True,
+         strict_load=False,
+         priority=49),
+    dict(type='mmdet.PipelineSwitchHook',
+         switch_epoch=max_epochs - close_mosaic_epochs,
+         switch_pipeline=train_pipeline_stage2),
+    # dict(type='CheckProcessTimePerBlock', interval=50), # TODO: this is for checking process time per block at test time
+]
+train_cfg = dict(max_epochs=max_epochs,
+                 val_interval=10,
+                 dynamic_intervals=[((max_epochs - close_mosaic_epochs),
+                                     _base_.val_interval_stage2)])
+optim_wrapper = dict(
+    optimizer=dict(
+        _delete_=True,
+        type='AdamW',
+        lr=base_lr,
+        weight_decay=weight_decay,
+        batch_size_per_gpu=train_batch_size_per_gpu
+    ),
+    paramwise_cfg=dict(
+        bias_decay_mult=0.0,
+        norm_decay_mult=0.0,
+        custom_keys={'backbone.text_model': dict(lr_mult=0.01), 'logit_scale': dict(weight_decay=0.0)}
+    ),
+    constructor='YOLOWv5OptimizerConstructor',
+    accumulative_counts=accumulative_counts,
+)
+
+# 🐝 use wandb for tracking log
+visualizer = dict(
+    vis_backends=[
+        dict(type='LocalVisBackend'),
+        dict(
+            type='WandbVisBackend',
+            init_kwargs=dict(
+                project='YOLO-World',
+                name=exp_name,
+                id="dqyz9w34",
+                allow_val_change=True,
+                reinit=True,
+                resume="allow"
+            )
+        )
+    ]
+)
\ No newline at end of file
diff --git a/mmdetection_practice/configs/experiment/yolo_world_s_deepfusion_l2norm_8gpus_obj365v1_train_lvis_minival.py b/mmdetection_practice/configs/experiment/yolo_world_s_deepfusion_l2norm_8gpus_obj365v1_train_lvis_minival.py
new file mode 100644
index 0000000..38e1d73
--- /dev/null
+++ b/mmdetection_practice/configs/experiment/yolo_world_s_deepfusion_l2norm_8gpus_obj365v1_train_lvis_minival.py
@@ -0,0 +1,243 @@
+_base_ = ('../../third_party/mmyolo/configs/yolov8/'
+          'yolov8_s_syncbn_fast_8xb16-500e_coco.py')
+custom_imports = dict(imports=['yolo_world'],
+                      allow_failed_imports=False)
+
+exp_name = "yolo_world_s_deepfusion_l2norm_8gpus_obj365v1_train_lvis_minival" # TODO: change experiment name
+
+# hyper-parameters
+num_classes = 1203
+num_training_classes = 80
+max_epochs = 100  # Maximum training epochs
+close_mosaic_epochs = 2
+save_epoch_intervals = 1
+text_channels = 512
+neck_embed_channels = [128, 256, _base_.last_stage_out_channels // 2]
+base_lr = 2e-3
+weight_decay = 0.05 / 2
+
+train_batch_size_per_gpu = 16
+accumulative_counts=4 # total_batch_size=512 # TODO: change grad_accum if number of GPU changes
+
+val_batch_size_per_gpu = 1
+
+# model settings # TODO: change model settings
+model = dict(
+    type='MyYOLOWorldDetector', # MyYOLOWorldDetector also extracts txt features from Neck <-> YOLOWorldDetector
+    mm_neck=True, # apply img-text fusion or not
+    num_train_classes=num_training_classes,
+    num_test_classes=num_classes,
+    data_preprocessor=dict(type='YOLOWDetDataPreprocessor'),
+
+    backbone=dict(
+        _delete_=True,
+        type='MultiModalYOLOBackbone',
+        image_model={{_base_.model.backbone}},
+        text_model=dict(
+            type='HuggingCLIPLanguageBackbone',
+            model_name='openai/clip-vit-base-patch32',
+            frozen_modules=['all']
+        )
+    ),
+
+    neck=dict(
+        type='YOLOWorldVLFusionNeck',
+        fusion_cfg = dict(
+                type='DeepFusionBlock', # TODO: change this block and experiment a lot!
+                l_dim = text_channels,
+                embed_dim=256,
+                num_heads=8, # this should be divisible by last_img_channel=512 and text_dimension=512
+            ),
+        in_channels=[256, 512, _base_.last_stage_out_channels],
+        out_channels=[256, 512, _base_.last_stage_out_channels],
+        deepen_factor=_base_.deepen_factor,
+        widen_factor=_base_.widen_factor,
+    ),
+
+    bbox_head=dict(
+        type='YOLOWorldHead',
+        head_module=dict(
+            type='YOLOWorldHeadModule',
+            embed_dims=text_channels,
+            num_classes=num_training_classes,
+            widen_factor=_base_.widen_factor,
+        )
+    ),
+
+    train_cfg=dict(assigner=dict(num_classes=num_training_classes))
+)
+
+# dataset settings
+text_transform = [
+    dict(type='RandomLoadText',
+         num_neg_samples=(num_classes, num_classes),
+         max_num_samples=num_training_classes,
+         padding_to_max=True,
+         padding_value=''),
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                    'flip_direction', 'texts'))
+]
+train_pipeline = [
+    *_base_.pre_transform,
+    dict(type='MultiModalMosaic',
+         img_scale=_base_.img_scale,
+         pad_val=114.0,
+         pre_transform=_base_.pre_transform),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        scaling_ratio_range=(1 - _base_.affine_scale, 1 + _base_.affine_scale),
+        max_aspect_ratio=_base_.max_aspect_ratio,
+        border=(-_base_.img_scale[0] // 2, -_base_.img_scale[1] // 2),
+        border_val=(114, 114, 114)),
+    *_base_.last_transform[:-1],
+    *text_transform,
+]
+train_pipeline_stage2 = [*_base_.train_pipeline_stage2[:-1], *text_transform]
+
+
+obj365v1_train_dataset = dict(
+    type='MultiModalDataset',
+    dataset=dict(
+        type='YOLOv5Objects365V1Dataset',
+        data_root='data/objects365v1/',
+        ann_file='annotations/objects365_train.json',
+        data_prefix=dict(img='train/'),
+        filter_cfg=dict(filter_empty_gt=False, min_size=32)),
+    class_text_path='data/texts/obj365v1_class_texts.json',
+    pipeline=train_pipeline)
+
+
+mg_train_dataset = dict(type='YOLOv5MixedGroundingDataset',
+                        data_root='data/mixed_grounding/',
+                        ann_file='annotations/final_mixed_train_no_coco.json',
+                        data_prefix=dict(img='gqa/images/'),
+                        filter_cfg=dict(filter_empty_gt=False, min_size=32),
+                        pipeline=train_pipeline)
+
+
+flickr_train_dataset = dict(
+    type='YOLOv5MixedGroundingDataset',
+    data_root='data/flickr/',
+    ann_file='annotations/final_flickr_separateGT_train.json',
+    data_prefix=dict(img='full_images/'),
+    filter_cfg=dict(filter_empty_gt=True, min_size=32),
+    pipeline=train_pipeline)
+
+
+# NOTE: trained with [objects365v1 + gqa + flickr30k + coco]
+train_dataloader = dict(batch_size=train_batch_size_per_gpu,
+                        collate_fn=dict(type='yolow_collate'),
+                        dataset=dict(_delete_=True,
+                                     type='ConcatDataset',
+                                     datasets=[
+                                         obj365v1_train_dataset,
+                                         # flickr_train_dataset,
+                                         # mg_train_dataset,
+                                     ],
+                                     ignore_keys=['classes', 'palette']))
+
+test_pipeline = [
+    *_base_.test_pipeline[:-1],
+    dict(type='LoadText'),
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                    'scale_factor', 'pad_param', 'texts'))
+]
+coco_val_dataset = dict(
+    _delete_=True,
+    type='MultiModalDataset',
+    dataset=dict(type='YOLOv5LVISV1Dataset',
+                 data_root='data/coco/',
+                 test_mode=True,
+                 ann_file='lvis/lvis_v1_minival_inserted_image_name.json',
+                 data_prefix=dict(img=''),
+                 batch_shapes_cfg=None),
+    class_text_path='data/texts/lvis_v1_class_texts.json',
+    pipeline=test_pipeline)
+val_dataloader = dict(
+    batch_size=val_batch_size_per_gpu,
+    dataset=coco_val_dataset
+)
+test_dataloader = val_dataloader
+
+val_evaluator = dict(type='mmdet.LVISMetric',
+                     ann_file='data/coco/lvis/lvis_v1_minival_inserted_image_name.json',
+                     metric='bbox')
+test_evaluator = val_evaluator
+
+# training settings
+default_hooks = dict(
+    param_scheduler=dict(max_epochs=max_epochs),
+    logger=dict(type='LoggerHook', interval=1), # TODO: This is for testing
+    checkpoint=dict(
+        interval=save_epoch_intervals,
+        rule='greater'
+    ),
+)
+
+custom_hooks = [
+    dict(
+        type='EMAHook',
+        ema_type='ExpMomentumEMA',
+         momentum=0.0001,
+         update_buffers=True,
+         strict_load=False,
+         priority=49
+    ),
+    dict(
+        type='mmdet.PipelineSwitchHook',
+        switch_epoch=max_epochs - close_mosaic_epochs,
+        switch_pipeline=train_pipeline_stage2
+    ),
+    dict(type='CheckProcessTimePerBlock'), # TODO: this is for checking process time per block at test time
+]
+
+train_cfg = dict(
+    max_epochs=max_epochs,
+    val_interval=10,
+    dynamic_intervals=[(
+        (max_epochs - close_mosaic_epochs),
+        _base_.val_interval_stage2),
+    ])
+
+optim_wrapper = dict(
+    optimizer=dict(
+        _delete_=True,
+        type='AdamW',
+        lr=base_lr,
+        weight_decay=weight_decay,
+        batch_size_per_gpu=train_batch_size_per_gpu
+    ),
+    paramwise_cfg=dict(
+        bias_decay_mult=0.0,
+        norm_decay_mult=0.0,
+        custom_keys={'backbone.text_model': dict(lr_mult=0.01), 'logit_scale': dict(weight_decay=0.0)}
+    ),
+    accumulative_counts=accumulative_counts, # FIXME: in case of 8 GPUs --------------------------------------------------------------
+    constructor='YOLOWv5OptimizerConstructor'
+)
+
+# for visualization
+visualizer = dict(
+    vis_backends=[
+        dict(type='LocalVisBackend'),
+        dict(
+            type='WandbVisBackend',
+            init_kwargs=dict(
+                project='YOLO-World',
+                name=exp_name,
+                # id="dqyz9w34",
+                allow_val_change=True,
+                reinit=True,
+                resume="allow"
+            )
+        )
+    ]
+)
+
+
+
+
diff --git a/mmdetection_practice/configs/experiment/yolo_world_s_dual_vlpan_l2norm_2e-3_100e_8gpus_obj365v1_train_lvis_minival.py b/mmdetection_practice/configs/experiment/yolo_world_s_dual_vlpan_l2norm_2e-3_100e_8gpus_obj365v1_train_lvis_minival.py
new file mode 100644
index 0000000..94b95cd
--- /dev/null
+++ b/mmdetection_practice/configs/experiment/yolo_world_s_dual_vlpan_l2norm_2e-3_100e_8gpus_obj365v1_train_lvis_minival.py
@@ -0,0 +1,245 @@
+_base_ = ('../../third_party/mmyolo/configs/yolov8/'
+          'yolov8_s_syncbn_fast_8xb16-500e_coco.py')
+custom_imports = dict(imports=['yolo_world'],
+                      allow_failed_imports=False)
+
+exp_name = "yolo_world_s_dual_vlpan_l2norm_2e-3_100e_8gpus_obj365v1_train_lvis_minival" # TODO: change experiment name
+
+# hyper-parameters
+num_classes = 1203
+num_training_classes = 80
+max_epochs = 100  # Maximum training epochs
+close_mosaic_epochs = 2
+save_epoch_intervals = 2
+text_channels = 512
+neck_embed_channels = [128, 256, _base_.last_stage_out_channels // 2]
+neck_num_heads = [4, 8, _base_.last_stage_out_channels // 2 // 32]
+base_lr = 2e-3
+weight_decay = 0.05 / 2
+
+train_batch_size_per_gpu = 16
+accumulative_counts=4 # total_batch_size=512 # TODO: change grad_accum if number of GPU changes
+
+val_batch_size_per_gpu = 1
+
+# model settings # TODO: change model settings
+model = dict(
+    type='YOLOWorldDetector',
+    mm_neck=True,
+    num_train_classes=num_training_classes,
+    num_test_classes=num_classes,
+    data_preprocessor=dict(type='YOLOWDetDataPreprocessor'),
+
+    backbone=dict(
+        _delete_=True,
+        type='MultiModalYOLOBackbone',
+        image_model={{_base_.model.backbone}},
+        text_model=dict(
+            type='HuggingCLIPLanguageBackbone',
+            model_name='openai/clip-vit-base-patch32',
+            frozen_modules=['all']
+        )
+    ),
+
+    neck=dict(
+        type='YOLOWorldDualPAFPN',
+        block_cfg=dict(type='MaxSigmoidCSPLayerWithTwoConv'),
+        deepen_factor=_base_.deepen_factor,
+        widen_factor=_base_.widen_factor,
+        embed_channels=neck_embed_channels,
+        guide_channels=text_channels,
+        num_heads=neck_num_heads,
+        text_enhancder=dict(
+            type='ImagePoolingAttentionModule',
+            embed_channels=256,
+            num_heads=8
+        )
+    ),
+
+    bbox_head=dict(
+        type='YOLOWorldHead',
+        head_module=dict(
+            type='YOLOWorldHeadModule',
+            embed_dims=text_channels,
+            num_classes=num_training_classes,
+            widen_factor=_base_.widen_factor,
+        )
+    ),
+
+    train_cfg=dict(assigner=dict(num_classes=num_training_classes))
+)
+
+# dataset settings
+text_transform = [
+    dict(type='RandomLoadText',
+         num_neg_samples=(num_classes, num_classes),
+         max_num_samples=num_training_classes,
+         padding_to_max=True,
+         padding_value=''),
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                    'flip_direction', 'texts'))
+]
+train_pipeline = [
+    *_base_.pre_transform,
+    dict(type='MultiModalMosaic',
+         img_scale=_base_.img_scale,
+         pad_val=114.0,
+         pre_transform=_base_.pre_transform),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        scaling_ratio_range=(1 - _base_.affine_scale, 1 + _base_.affine_scale),
+        max_aspect_ratio=_base_.max_aspect_ratio,
+        border=(-_base_.img_scale[0] // 2, -_base_.img_scale[1] // 2),
+        border_val=(114, 114, 114)),
+    *_base_.last_transform[:-1],
+    *text_transform,
+]
+train_pipeline_stage2 = [*_base_.train_pipeline_stage2[:-1], *text_transform]
+
+
+obj365v1_train_dataset = dict(
+    type='MultiModalDataset',
+    dataset=dict(
+        type='YOLOv5Objects365V1Dataset',
+        data_root='data/objects365v1/',
+        ann_file='annotations/objects365_train.json',
+        data_prefix=dict(img='train/'),
+        filter_cfg=dict(filter_empty_gt=False, min_size=32)),
+    class_text_path='data/texts/obj365v1_class_texts.json',
+    pipeline=train_pipeline)
+
+
+mg_train_dataset = dict(type='YOLOv5MixedGroundingDataset',
+                        data_root='data/mixed_grounding/',
+                        ann_file='annotations/final_mixed_train_no_coco.json',
+                        data_prefix=dict(img='gqa/images/'),
+                        filter_cfg=dict(filter_empty_gt=False, min_size=32),
+                        pipeline=train_pipeline)
+
+
+flickr_train_dataset = dict(
+    type='YOLOv5MixedGroundingDataset',
+    data_root='data/flickr/',
+    ann_file='annotations/final_flickr_separateGT_train.json',
+    data_prefix=dict(img='full_images/'),
+    filter_cfg=dict(filter_empty_gt=True, min_size=32),
+    pipeline=train_pipeline)
+
+
+# NOTE: trained with [objects365v1 + gqa + flickr30k + coco]
+train_dataloader = dict(batch_size=train_batch_size_per_gpu,
+                        collate_fn=dict(type='yolow_collate'),
+                        dataset=dict(_delete_=True,
+                                     type='ConcatDataset',
+                                     datasets=[
+                                         obj365v1_train_dataset,
+                                         # flickr_train_dataset,
+                                         # mg_train_dataset,
+                                     ],
+                                     ignore_keys=['classes', 'palette']))
+
+test_pipeline = [
+    *_base_.test_pipeline[:-1],
+    dict(type='LoadText'),
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                    'scale_factor', 'pad_param', 'texts'))
+]
+coco_val_dataset = dict(
+    _delete_=True,
+    type='MultiModalDataset',
+    dataset=dict(type='YOLOv5LVISV1Dataset',
+                 data_root='data/coco/',
+                 test_mode=True,
+                 ann_file='lvis/lvis_v1_minival_inserted_image_name.json',
+                 data_prefix=dict(img=''),
+                 batch_shapes_cfg=None),
+    class_text_path='data/texts/lvis_v1_class_texts.json',
+    pipeline=test_pipeline)
+val_dataloader = dict(
+    batch_size=val_batch_size_per_gpu,
+    dataset=coco_val_dataset
+)
+test_dataloader = val_dataloader
+
+val_evaluator = dict(type='mmdet.LVISMetric',
+                     ann_file='data/coco/lvis/lvis_v1_minival_inserted_image_name.json',
+                     metric='bbox')
+test_evaluator = val_evaluator
+
+# training settings
+default_hooks = dict(
+    param_scheduler=dict(max_epochs=max_epochs),
+    logger=dict(type='LoggerHook', interval=1), # TODO: This is for testing
+    checkpoint=dict(
+        interval=save_epoch_intervals,
+        rule='greater'
+    ),
+)
+
+custom_hooks = [
+    dict(
+        type='EMAHook',
+        ema_type='ExpMomentumEMA',
+         momentum=0.0001,
+         update_buffers=True,
+         strict_load=False,
+         priority=49
+    ),
+    dict(
+        type='mmdet.PipelineSwitchHook',
+        switch_epoch=max_epochs - close_mosaic_epochs,
+        switch_pipeline=train_pipeline_stage2
+    ),
+    dict(type='CheckProcessTimePerBlock'), # TODO: this is for checking process time per block at test time
+]
+
+train_cfg = dict(
+    max_epochs=max_epochs,
+    val_interval=10,
+    dynamic_intervals=[(
+        (max_epochs - close_mosaic_epochs),
+        _base_.val_interval_stage2),
+    ])
+
+optim_wrapper = dict(
+    optimizer=dict(
+        _delete_=True,
+        type='AdamW',
+        lr=base_lr,
+        weight_decay=weight_decay,
+        batch_size_per_gpu=train_batch_size_per_gpu
+    ),
+    paramwise_cfg=dict(
+        bias_decay_mult=0.0,
+        norm_decay_mult=0.0,
+        custom_keys={'backbone.text_model': dict(lr_mult=0.01), 'logit_scale': dict(weight_decay=0.0)}
+    ),
+    accumulative_counts=accumulative_counts,
+    constructor='YOLOWv5OptimizerConstructor'
+)
+
+# for visualization
+visualizer = dict(
+    vis_backends=[
+        dict(type='LocalVisBackend'),
+        dict(
+            type='WandbVisBackend',
+            init_kwargs=dict(
+                project='YOLO-World',
+                name=exp_name,
+                # id="dqyz9w34",
+                allow_val_change=True,
+                reinit=True,
+                resume="allow"
+            )
+        )
+    ]
+)
+
+
+
+
diff --git a/mmdetection_practice/configs/experiment/yolo_world_s_dual_vlpan_remove4321_l2norm_2e-3_100e_8gpus_obj365v1_train_lvis_minival.py b/mmdetection_practice/configs/experiment/yolo_world_s_dual_vlpan_remove4321_l2norm_2e-3_100e_8gpus_obj365v1_train_lvis_minival.py
new file mode 100644
index 0000000..a08d222
--- /dev/null
+++ b/mmdetection_practice/configs/experiment/yolo_world_s_dual_vlpan_remove4321_l2norm_2e-3_100e_8gpus_obj365v1_train_lvis_minival.py
@@ -0,0 +1,227 @@
+_base_ = ('../../third_party/mmyolo/configs/yolov8/'
+          'yolov8_s_syncbn_fast_8xb16-500e_coco.py')
+custom_imports = dict(imports=['yolo_world'],
+                      allow_failed_imports=False)
+
+# hyper-parameters
+num_classes = 1203
+num_training_classes = 80
+max_epochs = 100  # Maximum training epochs
+close_mosaic_epochs = 2
+save_epoch_intervals = 1
+text_channels = 512
+neck_embed_channels = [128, 256, _base_.last_stage_out_channels // 2]
+base_lr = 2e-3
+weight_decay = 0.05 / 2
+train_batch_size_per_gpu = 16 # total_batch_size=512, so we need to use accumulative_counts=4
+
+# model settings
+model = dict(
+    type='MyYOLOWorldDetector',
+    mm_neck=True, # apply img-text fusion or not
+    num_train_classes=num_training_classes,
+    num_test_classes=num_classes,
+    data_preprocessor=dict(type='YOLOWDetDataPreprocessor'),
+
+    backbone=dict(
+        _delete_=True,
+        type='MultiModalYOLOBackbone',
+        image_model={{_base_.model.backbone}},
+        text_model=dict(
+            type='HuggingCLIPLanguageBackbone',
+            model_name='openai/clip-vit-base-patch32',
+            frozen_modules=['all']
+        )
+    ),
+
+    neck=dict(
+        type='YOLOWorldVLFusionNeck',
+        fusion_cfg = dict(
+                type='IdentityFusionBLock',
+            ),
+        in_channels=[256, 512, _base_.last_stage_out_channels],
+        out_channels=[256, 512, _base_.last_stage_out_channels],
+        deepen_factor=_base_.deepen_factor,
+        widen_factor=_base_.widen_factor,
+    ),
+
+    bbox_head=dict(
+        type='YOLOWorldHead',
+        head_module=dict(
+            type='YOLOWorldHeadModule',
+            embed_dims=text_channels,
+            num_classes=num_training_classes,
+            widen_factor=_base_.widen_factor,
+        )
+    ),
+
+    train_cfg=dict(assigner=dict(num_classes=num_training_classes))
+)
+
+# dataset settings
+text_transform = [
+    dict(type='RandomLoadText',
+         num_neg_samples=(num_classes, num_classes),
+         max_num_samples=num_training_classes,
+         padding_to_max=True,
+         padding_value=''),
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                    'flip_direction', 'texts'))
+]
+train_pipeline = [
+    *_base_.pre_transform,
+    dict(type='MultiModalMosaic',
+         img_scale=_base_.img_scale,
+         pad_val=114.0,
+         pre_transform=_base_.pre_transform),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        scaling_ratio_range=(1 - _base_.affine_scale, 1 + _base_.affine_scale),
+        max_aspect_ratio=_base_.max_aspect_ratio,
+        border=(-_base_.img_scale[0] // 2, -_base_.img_scale[1] // 2),
+        border_val=(114, 114, 114)),
+    *_base_.last_transform[:-1],
+    *text_transform,
+]
+train_pipeline_stage2 = [*_base_.train_pipeline_stage2[:-1], *text_transform]
+
+
+obj365v1_train_dataset = dict(
+    type='MultiModalDataset',
+    dataset=dict(
+        type='YOLOv5Objects365V1Dataset',
+        data_root='data/objects365v1/',
+        ann_file='annotations/objects365_train.json',
+        data_prefix=dict(img='train/'),
+        filter_cfg=dict(filter_empty_gt=False, min_size=32)),
+    class_text_path='data/texts/obj365v1_class_texts.json',
+    pipeline=train_pipeline)
+
+
+mg_train_dataset = dict(type='YOLOv5MixedGroundingDataset',
+                        data_root='data/mixed_grounding/',
+                        ann_file='annotations/final_mixed_train_no_coco.json',
+                        data_prefix=dict(img='gqa/images/'),
+                        filter_cfg=dict(filter_empty_gt=False, min_size=32),
+                        pipeline=train_pipeline)
+
+
+flickr_train_dataset = dict(
+    type='YOLOv5MixedGroundingDataset',
+    data_root='data/flickr/',
+    ann_file='annotations/final_flickr_separateGT_train.json',
+    data_prefix=dict(img='full_images/'),
+    filter_cfg=dict(filter_empty_gt=True, min_size=32),
+    pipeline=train_pipeline)
+
+
+# NOTE: trained with [objects365v1 + gqa + flickr30k + coco]
+train_dataloader = dict(batch_size=train_batch_size_per_gpu,
+                        collate_fn=dict(type='yolow_collate'),
+                        dataset=dict(_delete_=True,
+                                     type='ConcatDataset',
+                                     datasets=[
+                                         obj365v1_train_dataset,
+                                         # flickr_train_dataset,
+                                         # mg_train_dataset,
+                                     ],
+                                     ignore_keys=['classes', 'palette']))
+
+test_pipeline = [
+    *_base_.test_pipeline[:-1],
+    dict(type='LoadText'),
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                    'scale_factor', 'pad_param', 'texts'))
+]
+coco_val_dataset = dict(
+    _delete_=True,
+    type='MultiModalDataset',
+    dataset=dict(type='YOLOv5LVISV1Dataset',
+                 data_root='data/coco/',
+                 test_mode=True,
+                 ann_file='lvis/lvis_v1_minival_inserted_image_name.json',
+                 data_prefix=dict(img=''),
+                 batch_shapes_cfg=None),
+    class_text_path='data/texts/lvis_v1_class_texts.json',
+    pipeline=test_pipeline)
+val_dataloader = dict(dataset=coco_val_dataset)
+test_dataloader = val_dataloader
+
+val_evaluator = dict(type='mmdet.LVISMetric',
+                     ann_file='data/coco/lvis/lvis_v1_minival_inserted_image_name.json',
+                     metric='bbox')
+test_evaluator = val_evaluator
+
+# training settings
+default_hooks = dict(
+    param_scheduler=dict(max_epochs=max_epochs),
+    checkpoint=dict(
+        interval=save_epoch_intervals,
+        rule='greater'
+    ),
+)
+
+custom_hooks = [
+    dict(
+        type='EMAHook',
+        ema_type='ExpMomentumEMA',
+         momentum=0.0001,
+         update_buffers=True,
+         strict_load=False,
+         priority=49
+    ),
+    dict(
+        type='mmdet.PipelineSwitchHook',
+        switch_epoch=max_epochs - close_mosaic_epochs,
+        switch_pipeline=train_pipeline_stage2
+    ),
+    # dict(type='CheckProcessTimePerBlock', interval=50), # to check process time per block
+]
+
+train_cfg = dict(
+    max_epochs=max_epochs,
+    val_interval=10,
+    dynamic_intervals=[(
+        (max_epochs - close_mosaic_epochs),
+        _base_.val_interval_stage2),
+    ])
+
+optim_wrapper = dict(
+    optimizer=dict(
+        _delete_=True,
+        type='AdamW',
+        lr=base_lr,
+        weight_decay=weight_decay,
+        batch_size_per_gpu=train_batch_size_per_gpu
+    ),
+    paramwise_cfg=dict(
+        bias_decay_mult=0.0,
+        norm_decay_mult=0.0,
+        custom_keys={'backbone.text_model': dict(lr_mult=0.01), 'logit_scale': dict(weight_decay=0.0)}
+    ),
+    accumulative_counts=4, # FIXME: in case of 8 GPUs --------------------------------------------------------------
+    constructor='YOLOWv5OptimizerConstructor'
+)
+
+# log_config = dict(hooks = [
+#     dict(type='TextLoggerHook'),
+#     dict(type='MMDetWandbHook',
+#          init_kwargs={
+#             'project': 'YOLO-World',
+#             'entity': 'yolo_world_s_dual_vlpan_l2norm_2e-3_100e_8gpus_obj365v1_train_lvis_minival',
+#          },
+#          interval=10,
+#          log_checkpoint=True,
+#          log_checkpoint_metadata=True,
+#          num_eval_images=100)])
+
+# 🐝 use wandb for tracking log
+visualizer = dict(vis_backends=[dict(type='LocalVisBackend'), dict(type='WandbVisBackend')])
+
+
+
+
diff --git a/mmdetection_practice/configs/experiment/yolo_world_s_dual_vlpan_remove43_l2norm_2e-3_100e_8gpus_obj365v1_train_lvis_minival.py b/mmdetection_practice/configs/experiment/yolo_world_s_dual_vlpan_remove43_l2norm_2e-3_100e_8gpus_obj365v1_train_lvis_minival.py
new file mode 100644
index 0000000..d5de724
--- /dev/null
+++ b/mmdetection_practice/configs/experiment/yolo_world_s_dual_vlpan_remove43_l2norm_2e-3_100e_8gpus_obj365v1_train_lvis_minival.py
@@ -0,0 +1,233 @@
+_base_ = ('../../third_party/mmyolo/configs/yolov8/'
+          'yolov8_s_syncbn_fast_8xb16-500e_coco.py')
+custom_imports = dict(imports=['yolo_world'],
+                      allow_failed_imports=False)
+
+# hyper-parameters
+num_classes = 1203
+num_training_classes = 80
+max_epochs = 100  # Maximum training epochs
+close_mosaic_epochs = 2
+save_epoch_intervals = 1
+text_channels = 512
+neck_embed_channels = [128, 256, _base_.last_stage_out_channels // 2]
+neck_num_heads = [4, 8, _base_.last_stage_out_channels // 2 // 32]
+base_lr = 2e-3
+weight_decay = 0.05 / 2
+train_batch_size_per_gpu = 16 # total_batch_size=512, so we need to use accumulative_counts=4
+
+val_batch_size_per_gpu = 1
+
+# model settings
+model = dict(
+    type='YOLOWorldDetector',
+    mm_neck=True,
+    num_train_classes=num_training_classes,
+    num_test_classes=num_classes,
+    data_preprocessor=dict(type='YOLOWDetDataPreprocessor'),
+
+    backbone=dict(
+        _delete_=True,
+        type='MultiModalYOLOBackbone',
+        image_model={{_base_.model.backbone}},
+        text_model=dict(
+            type='HuggingCLIPLanguageBackbone',
+            model_name='openai/clip-vit-base-patch32',
+            frozen_modules=['all']
+        )
+    ),
+
+    neck=dict(
+        type='YOLOWorldDualPAFPNRemove43',
+        block_cfg=dict(type='MaxSigmoidCSPLayerWithTwoConv'),
+        deepen_factor=_base_.deepen_factor,
+        widen_factor=_base_.widen_factor,
+        embed_channels=neck_embed_channels,
+        guide_channels=text_channels,
+        num_heads=neck_num_heads,
+    ),
+
+    bbox_head=dict(
+        type='YOLOWorldHead',
+        head_module=dict(
+            type='YOLOWorldHeadModule',
+            embed_dims=text_channels,
+            num_classes=num_training_classes,
+            widen_factor=_base_.widen_factor,
+        )
+    ),
+
+    train_cfg=dict(assigner=dict(num_classes=num_training_classes))
+)
+
+# dataset settings
+text_transform = [
+    dict(type='RandomLoadText',
+         num_neg_samples=(num_classes, num_classes),
+         max_num_samples=num_training_classes,
+         padding_to_max=True,
+         padding_value=''),
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                    'flip_direction', 'texts'))
+]
+train_pipeline = [
+    *_base_.pre_transform,
+    dict(type='MultiModalMosaic',
+         img_scale=_base_.img_scale,
+         pad_val=114.0,
+         pre_transform=_base_.pre_transform),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        scaling_ratio_range=(1 - _base_.affine_scale, 1 + _base_.affine_scale),
+        max_aspect_ratio=_base_.max_aspect_ratio,
+        border=(-_base_.img_scale[0] // 2, -_base_.img_scale[1] // 2),
+        border_val=(114, 114, 114)),
+    *_base_.last_transform[:-1],
+    *text_transform,
+]
+train_pipeline_stage2 = [*_base_.train_pipeline_stage2[:-1], *text_transform]
+
+
+obj365v1_train_dataset = dict(
+    type='MultiModalDataset',
+    dataset=dict(
+        type='YOLOv5Objects365V1Dataset',
+        data_root='data/objects365v1/',
+        ann_file='annotations/objects365_train.json',
+        data_prefix=dict(img='train/'),
+        filter_cfg=dict(filter_empty_gt=False, min_size=32)),
+    class_text_path='data/texts/obj365v1_class_texts.json',
+    pipeline=train_pipeline)
+
+
+mg_train_dataset = dict(type='YOLOv5MixedGroundingDataset',
+                        data_root='data/mixed_grounding/',
+                        ann_file='annotations/final_mixed_train_no_coco.json',
+                        data_prefix=dict(img='gqa/images/'),
+                        filter_cfg=dict(filter_empty_gt=False, min_size=32),
+                        pipeline=train_pipeline)
+
+
+flickr_train_dataset = dict(
+    type='YOLOv5MixedGroundingDataset',
+    data_root='data/flickr/',
+    ann_file='annotations/final_flickr_separateGT_train.json',
+    data_prefix=dict(img='full_images/'),
+    filter_cfg=dict(filter_empty_gt=True, min_size=32),
+    pipeline=train_pipeline)
+
+
+# NOTE: trained with [objects365v1 + gqa + flickr30k + coco]
+train_dataloader = dict(batch_size=train_batch_size_per_gpu,
+                        collate_fn=dict(type='yolow_collate'),
+                        dataset=dict(_delete_=True,
+                                     type='ConcatDataset',
+                                     datasets=[
+                                         obj365v1_train_dataset,
+                                         # flickr_train_dataset,
+                                         # mg_train_dataset,
+                                     ],
+                                     ignore_keys=['classes', 'palette']))
+
+test_pipeline = [
+    *_base_.test_pipeline[:-1],
+    dict(type='LoadText'),
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                    'scale_factor', 'pad_param', 'texts'))
+]
+coco_val_dataset = dict(
+    _delete_=True,
+    type='MultiModalDataset',
+    dataset=dict(type='YOLOv5LVISV1Dataset',
+                 data_root='data/coco/',
+                 test_mode=True,
+                 ann_file='lvis/lvis_v1_minival_inserted_image_name.json',
+                 data_prefix=dict(img=''),
+                 batch_shapes_cfg=None),
+    class_text_path='data/texts/lvis_v1_class_texts.json',
+    pipeline=test_pipeline)
+val_dataloader = dict(
+    batch_size=val_batch_size_per_gpu,
+    dataset=coco_val_dataset
+)
+test_dataloader = val_dataloader
+
+val_evaluator = dict(type='mmdet.LVISMetric',
+                     ann_file='data/coco/lvis/lvis_v1_minival_inserted_image_name.json',
+                     metric='bbox')
+test_evaluator = val_evaluator
+
+# training settings
+default_hooks = dict(
+    param_scheduler=dict(max_epochs=max_epochs),
+    # logger=dict(type='LoggerHook', interval=1), # TODO: This is for testing
+    checkpoint=dict(
+        interval=save_epoch_intervals,
+        rule='greater'
+    ),
+)
+
+custom_hooks = [
+    dict(
+        type='EMAHook',
+        ema_type='ExpMomentumEMA',
+         momentum=0.0001,
+         update_buffers=True,
+         strict_load=False,
+         priority=49
+    ),
+    dict(
+        type='mmdet.PipelineSwitchHook',
+        switch_epoch=max_epochs - close_mosaic_epochs,
+        switch_pipeline=train_pipeline_stage2
+    ),
+    # dict(type='CheckProcessTimePerBlock', interval=50), # to check process time per block
+]
+
+train_cfg = dict(
+    max_epochs=max_epochs,
+    val_interval=10,
+    dynamic_intervals=[(
+        (max_epochs - close_mosaic_epochs),
+        _base_.val_interval_stage2),
+    ])
+
+optim_wrapper = dict(
+    optimizer=dict(
+        _delete_=True,
+        type='AdamW',
+        lr=base_lr,
+        weight_decay=weight_decay,
+        batch_size_per_gpu=train_batch_size_per_gpu
+    ),
+    paramwise_cfg=dict(
+        bias_decay_mult=0.0,
+        norm_decay_mult=0.0,
+        custom_keys={'backbone.text_model': dict(lr_mult=0.01), 'logit_scale': dict(weight_decay=0.0)}
+    ),
+    accumulative_counts=4,
+    constructor='YOLOWv5OptimizerConstructor'
+)
+
+# log_config = dict(hooks = [
+#     dict(type='TextLoggerHook'),
+#     dict(type='MMDetWandbHook',
+#          init_kwargs={
+#             'project': 'YOLO-World',
+#             'entity': 'yolo_world_s_dual_vlpan_l2norm_2e-3_100e_8gpus_obj365v1_train_lvis_minival',
+#          },
+#          interval=10,
+#          log_checkpoint=True,
+#          log_checkpoint_metadata=True,
+#          num_eval_images=100)])
+
+# 🐝 use wandb for tracking log
+visualizer = dict(vis_backends=[dict(type='LocalVisBackend'), dict(type='WandbVisBackend')])
+
+
+
+
diff --git a/mmdetection_practice/configs/experiment/yolo_world_s_multi_scale_deepfusion_l2norm_8gpus_obj365v1_train_lvis_minival.py b/mmdetection_practice/configs/experiment/yolo_world_s_multi_scale_deepfusion_l2norm_8gpus_obj365v1_train_lvis_minival.py
new file mode 100644
index 0000000..f9e4136
--- /dev/null
+++ b/mmdetection_practice/configs/experiment/yolo_world_s_multi_scale_deepfusion_l2norm_8gpus_obj365v1_train_lvis_minival.py
@@ -0,0 +1,242 @@
+_base_ = ('../../third_party/mmyolo/configs/yolov8/'
+          'yolov8_s_syncbn_fast_8xb16-500e_coco.py')
+custom_imports = dict(imports=['yolo_world'],
+                      allow_failed_imports=False)
+
+exp_name = "yolo_world_s_multi_scale_deepfusion_l2norm_8gpus_obj365v1_train_lvis_minival" # TODO: change experiment name
+
+# hyper-parameters
+num_classes = 1203
+num_training_classes = 80
+max_epochs = 100  # Maximum training epochs
+close_mosaic_epochs = 2
+save_epoch_intervals = 1
+text_channels = 512
+neck_embed_channels = [128, 256, _base_.last_stage_out_channels // 2]
+base_lr = 2e-3
+weight_decay = 0.05 / 2
+
+train_batch_size_per_gpu = 16
+accumulative_counts = 4 # total_batch_size=512 # TODO: change grad_accum if number of GPU changes
+
+val_batch_size_per_gpu = 1
+
+# model settings # TODO: change model settings
+model = dict(
+    type='MyYOLOWorldDetector', # MyYOLOWorldDetector also extracts txt features from Neck <-> YOLOWorldDetector
+    mm_neck=True, # apply img-text fusion or not
+    num_train_classes=num_training_classes,
+    num_test_classes=num_classes,
+    data_preprocessor=dict(type='YOLOWDetDataPreprocessor'),
+
+    backbone=dict(
+        _delete_=True,
+        type='MultiModalYOLOBackbone',
+        image_model={{_base_.model.backbone}},
+        text_model=dict(
+            type='HuggingCLIPLanguageBackbone',
+            model_name='openai/clip-vit-base-patch32',
+            frozen_modules=['all']
+        )
+    ),
+
+    neck=dict(
+        type='YOLOWorldVLFusionNeck',
+        fusion_cfg = dict(
+                type='MultiScaleDeepFusionBlock', # TODO: change this block and experiment a lot!
+                l_dim = text_channels,
+                num_heads=8, # this should be divisible by 512, 256, 128
+            ),
+        in_channels=[256, 512, _base_.last_stage_out_channels],
+        out_channels=[256, 512, _base_.last_stage_out_channels],
+        deepen_factor=_base_.deepen_factor,
+        widen_factor=_base_.widen_factor,
+    ),
+
+    bbox_head=dict(
+        type='YOLOWorldHead',
+        head_module=dict(
+            type='YOLOWorldHeadModule',
+            embed_dims=text_channels,
+            num_classes=num_training_classes,
+            widen_factor=_base_.widen_factor,
+        )
+    ),
+
+    train_cfg=dict(assigner=dict(num_classes=num_training_classes))
+)
+
+# dataset settings
+text_transform = [
+    dict(type='RandomLoadText',
+         num_neg_samples=(num_classes, num_classes),
+         max_num_samples=num_training_classes,
+         padding_to_max=True,
+         padding_value=''),
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                    'flip_direction', 'texts'))
+]
+train_pipeline = [
+    *_base_.pre_transform,
+    dict(type='MultiModalMosaic',
+         img_scale=_base_.img_scale,
+         pad_val=114.0,
+         pre_transform=_base_.pre_transform),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        scaling_ratio_range=(1 - _base_.affine_scale, 1 + _base_.affine_scale),
+        max_aspect_ratio=_base_.max_aspect_ratio,
+        border=(-_base_.img_scale[0] // 2, -_base_.img_scale[1] // 2),
+        border_val=(114, 114, 114)),
+    *_base_.last_transform[:-1],
+    *text_transform,
+]
+train_pipeline_stage2 = [*_base_.train_pipeline_stage2[:-1], *text_transform]
+
+
+obj365v1_train_dataset = dict(
+    type='MultiModalDataset',
+    dataset=dict(
+        type='YOLOv5Objects365V1Dataset',
+        data_root='data/objects365v1/',
+        ann_file='annotations/objects365_train.json',
+        data_prefix=dict(img='train/'),
+        filter_cfg=dict(filter_empty_gt=False, min_size=32)),
+    class_text_path='data/texts/obj365v1_class_texts.json',
+    pipeline=train_pipeline)
+
+
+mg_train_dataset = dict(type='YOLOv5MixedGroundingDataset',
+                        data_root='data/mixed_grounding/',
+                        ann_file='annotations/final_mixed_train_no_coco.json',
+                        data_prefix=dict(img='gqa/images/'),
+                        filter_cfg=dict(filter_empty_gt=False, min_size=32),
+                        pipeline=train_pipeline)
+
+
+flickr_train_dataset = dict(
+    type='YOLOv5MixedGroundingDataset',
+    data_root='data/flickr/',
+    ann_file='annotations/final_flickr_separateGT_train.json',
+    data_prefix=dict(img='full_images/'),
+    filter_cfg=dict(filter_empty_gt=True, min_size=32),
+    pipeline=train_pipeline)
+
+
+# NOTE: trained with [objects365v1 + gqa + flickr30k + coco]
+train_dataloader = dict(batch_size=train_batch_size_per_gpu,
+                        collate_fn=dict(type='yolow_collate'),
+                        dataset=dict(_delete_=True,
+                                     type='ConcatDataset',
+                                     datasets=[
+                                         obj365v1_train_dataset,
+                                         # flickr_train_dataset,
+                                         # mg_train_dataset,
+                                     ],
+                                     ignore_keys=['classes', 'palette']))
+
+test_pipeline = [
+    *_base_.test_pipeline[:-1],
+    dict(type='LoadText'),
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                    'scale_factor', 'pad_param', 'texts'))
+]
+coco_val_dataset = dict(
+    _delete_=True,
+    type='MultiModalDataset',
+    dataset=dict(type='YOLOv5LVISV1Dataset',
+                 data_root='data/coco/',
+                 test_mode=True,
+                 ann_file='lvis/lvis_v1_minival_inserted_image_name.json',
+                 data_prefix=dict(img=''),
+                 batch_shapes_cfg=None),
+    class_text_path='data/texts/lvis_v1_class_texts.json',
+    pipeline=test_pipeline)
+val_dataloader = dict(
+    batch_size=val_batch_size_per_gpu,
+    dataset=coco_val_dataset
+)
+test_dataloader = val_dataloader
+
+val_evaluator = dict(type='mmdet.LVISMetric',
+                     ann_file='data/coco/lvis/lvis_v1_minival_inserted_image_name.json',
+                     metric='bbox')
+test_evaluator = val_evaluator
+
+# training settings
+default_hooks = dict(
+    param_scheduler=dict(max_epochs=max_epochs),
+    logger=dict(type='LoggerHook', interval=1), # TODO: This is for testing
+    checkpoint=dict(
+        interval=save_epoch_intervals,
+        rule='greater'
+    ),
+)
+
+custom_hooks = [
+    dict(
+        type='EMAHook',
+        ema_type='ExpMomentumEMA',
+         momentum=0.0001,
+         update_buffers=True,
+         strict_load=False,
+         priority=49
+    ),
+    dict(
+        type='mmdet.PipelineSwitchHook',
+        switch_epoch=max_epochs - close_mosaic_epochs,
+        switch_pipeline=train_pipeline_stage2
+    ),
+    dict(type='CheckProcessTimePerBlock'), # TODO: this is for checking process time per block at test time
+]
+
+train_cfg = dict(
+    max_epochs=max_epochs,
+    val_interval=10,
+    dynamic_intervals=[(
+        (max_epochs - close_mosaic_epochs),
+        _base_.val_interval_stage2),
+    ])
+
+optim_wrapper = dict(
+    optimizer=dict(
+        _delete_=True,
+        type='AdamW',
+        lr=base_lr,
+        weight_decay=weight_decay,
+        batch_size_per_gpu=train_batch_size_per_gpu
+    ),
+    paramwise_cfg=dict(
+        bias_decay_mult=0.0,
+        norm_decay_mult=0.0,
+        custom_keys={'backbone.text_model': dict(lr_mult=0.01), 'logit_scale': dict(weight_decay=0.0)}
+    ),
+    accumulative_counts=accumulative_counts,
+    constructor='YOLOWv5OptimizerConstructor'
+)
+
+# for visualization
+visualizer = dict(
+    vis_backends=[
+        dict(type='LocalVisBackend'),
+        dict(
+            type='WandbVisBackend',
+            init_kwargs=dict(
+                project='YOLO-World',
+                name=exp_name,
+                # id="dqyz9w34",
+                allow_val_change=True,
+                reinit=True,
+                resume="allow"
+            )
+        )
+    ]
+)
+
+
+
+
diff --git a/mmdetection_practice/configs/experiment/yolo_world_s_vlattnfusion_l2norm_8gpus_obj365v1_train_lvis_minival.py b/mmdetection_practice/configs/experiment/yolo_world_s_vlattnfusion_l2norm_8gpus_obj365v1_train_lvis_minival.py
new file mode 100644
index 0000000..7c6134b
--- /dev/null
+++ b/mmdetection_practice/configs/experiment/yolo_world_s_vlattnfusion_l2norm_8gpus_obj365v1_train_lvis_minival.py
@@ -0,0 +1,235 @@
+_base_ = ('../../third_party/mmyolo/configs/yolov8/'
+          'yolov8_s_syncbn_fast_8xb16-500e_coco.py')
+custom_imports = dict(imports=['yolo_world'],
+                      allow_failed_imports=False)
+
+# hyper-parameters
+num_classes = 1203
+num_training_classes = 80
+max_epochs = 100  # Maximum training epochs
+close_mosaic_epochs = 2
+save_epoch_intervals = 2
+text_channels = 512
+neck_embed_channels = [128, 256, _base_.last_stage_out_channels // 2]
+base_lr = 2e-3
+weight_decay = 0.05 / 2
+train_batch_size_per_gpu = 16 # total_batch_size=512, so we need to use accumulative_counts=4
+
+val_batch_size_per_gpu = 32
+
+# model settings
+model = dict(
+    type='MyYOLOWorldDetector',
+    mm_neck=True, # apply img-text fusion or not
+    num_train_classes=num_training_classes,
+    num_test_classes=num_classes,
+    data_preprocessor=dict(type='YOLOWDetDataPreprocessor'),
+
+    backbone=dict(
+        _delete_=True,
+        type='MultiModalYOLOBackbone',
+        image_model={{_base_.model.backbone}},
+        text_model=dict(
+            type='HuggingCLIPLanguageBackbone',
+            model_name='openai/clip-vit-base-patch32',
+            frozen_modules=['all']
+        )
+    ),
+
+    neck=dict(
+        type='YOLOWorldVLFusionNeck',
+        fusion_cfg = dict(
+                type='MaxSigmoidAttnFusionBLock', # TODO: change this block and experiment a lot!
+                text_dimension = text_channels,
+                num_heads=8, # this should be divisible by last_img_channel=512 and text_dimension=512
+            ),
+        in_channels=[256, 512, _base_.last_stage_out_channels],
+        out_channels=[256, 512, _base_.last_stage_out_channels],
+        deepen_factor=_base_.deepen_factor,
+        widen_factor=_base_.widen_factor,
+    ),
+
+    bbox_head=dict(
+        type='YOLOWorldHead',
+        head_module=dict(
+            type='YOLOWorldHeadModule',
+            embed_dims=text_channels,
+            num_classes=num_training_classes,
+            widen_factor=_base_.widen_factor,
+        )
+    ),
+
+    train_cfg=dict(assigner=dict(num_classes=num_training_classes))
+)
+
+# dataset settings
+text_transform = [
+    dict(type='RandomLoadText',
+         num_neg_samples=(num_classes, num_classes),
+         max_num_samples=num_training_classes,
+         padding_to_max=True,
+         padding_value=''),
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                    'flip_direction', 'texts'))
+]
+train_pipeline = [
+    *_base_.pre_transform,
+    dict(type='MultiModalMosaic',
+         img_scale=_base_.img_scale,
+         pad_val=114.0,
+         pre_transform=_base_.pre_transform),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        scaling_ratio_range=(1 - _base_.affine_scale, 1 + _base_.affine_scale),
+        max_aspect_ratio=_base_.max_aspect_ratio,
+        border=(-_base_.img_scale[0] // 2, -_base_.img_scale[1] // 2),
+        border_val=(114, 114, 114)),
+    *_base_.last_transform[:-1],
+    *text_transform,
+]
+train_pipeline_stage2 = [*_base_.train_pipeline_stage2[:-1], *text_transform]
+
+
+obj365v1_train_dataset = dict(
+    type='MultiModalDataset',
+    dataset=dict(
+        type='YOLOv5Objects365V1Dataset',
+        data_root='data/objects365v1/',
+        ann_file='annotations/objects365_train.json',
+        data_prefix=dict(img='train/'),
+        filter_cfg=dict(filter_empty_gt=False, min_size=32)),
+    class_text_path='data/texts/obj365v1_class_texts.json',
+    pipeline=train_pipeline)
+
+
+mg_train_dataset = dict(type='YOLOv5MixedGroundingDataset',
+                        data_root='data/mixed_grounding/',
+                        ann_file='annotations/final_mixed_train_no_coco.json',
+                        data_prefix=dict(img='gqa/images/'),
+                        filter_cfg=dict(filter_empty_gt=False, min_size=32),
+                        pipeline=train_pipeline)
+
+
+flickr_train_dataset = dict(
+    type='YOLOv5MixedGroundingDataset',
+    data_root='data/flickr/',
+    ann_file='annotations/final_flickr_separateGT_train.json',
+    data_prefix=dict(img='full_images/'),
+    filter_cfg=dict(filter_empty_gt=True, min_size=32),
+    pipeline=train_pipeline)
+
+
+# NOTE: trained with [objects365v1 + gqa + flickr30k + coco]
+train_dataloader = dict(batch_size=train_batch_size_per_gpu,
+                        collate_fn=dict(type='yolow_collate'),
+                        dataset=dict(_delete_=True,
+                                     type='ConcatDataset',
+                                     datasets=[
+                                         obj365v1_train_dataset,
+                                         # flickr_train_dataset,
+                                         # mg_train_dataset,
+                                     ],
+                                     ignore_keys=['classes', 'palette']))
+
+test_pipeline = [
+    *_base_.test_pipeline[:-1],
+    dict(type='LoadText'),
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                    'scale_factor', 'pad_param', 'texts'))
+]
+coco_val_dataset = dict(
+    _delete_=True,
+    type='MultiModalDataset',
+    dataset=dict(type='YOLOv5LVISV1Dataset',
+                 data_root='data/coco/',
+                 test_mode=True,
+                 ann_file='lvis/lvis_v1_minival_inserted_image_name.json',
+                 data_prefix=dict(img=''),
+                 batch_shapes_cfg=None),
+    class_text_path='data/texts/lvis_v1_class_texts.json',
+    pipeline=test_pipeline)
+val_dataloader = dict(
+    batch_size=val_batch_size_per_gpu,
+    dataset=coco_val_dataset,
+)
+test_dataloader = val_dataloader
+
+val_evaluator = dict(type='mmdet.LVISMetric',
+                     ann_file='data/coco/lvis/lvis_v1_minival_inserted_image_name.json',
+                     metric='bbox')
+test_evaluator = val_evaluator
+
+# training settings
+default_hooks = dict(
+    param_scheduler=dict(max_epochs=max_epochs),
+    logger=dict(type='LoggerHook', interval=1), # TODO: This is for testing
+    checkpoint=dict(
+        interval=save_epoch_intervals,
+        rule='greater'
+    ),
+)
+
+custom_hooks = [
+    dict(
+        type='EMAHook',
+        ema_type='ExpMomentumEMA',
+         momentum=0.0001,
+         update_buffers=True,
+         strict_load=False,
+         priority=49
+    ),
+    dict(
+        type='mmdet.PipelineSwitchHook',
+        switch_epoch=max_epochs - close_mosaic_epochs,
+        switch_pipeline=train_pipeline_stage2
+    ),
+    dict(type='CheckProcessTimePerBlock', interval=50), # to check process time per block
+]
+
+train_cfg = dict(
+    max_epochs=max_epochs,
+    val_interval=10,
+    dynamic_intervals=[(
+        (max_epochs - close_mosaic_epochs),
+        _base_.val_interval_stage2),
+    ])
+
+optim_wrapper = dict(
+    optimizer=dict(
+        _delete_=True,
+        type='AdamW',
+        lr=base_lr,
+        weight_decay=weight_decay,
+        batch_size_per_gpu=train_batch_size_per_gpu
+    ),
+    paramwise_cfg=dict(
+        bias_decay_mult=0.0,
+        norm_decay_mult=0.0,
+        custom_keys={'backbone.text_model': dict(lr_mult=0.01), 'logit_scale': dict(weight_decay=0.0)}
+    ),
+    accumulative_counts=4, # FIXME: in case of 8 GPUs --------------------------------------------------------------
+    constructor='YOLOWv5OptimizerConstructor'
+)
+
+# log_config = dict(hooks = [
+#     dict(type='TextLoggerHook'),
+#     dict(type='MMDetWandbHook',
+#          init_kwargs={
+#             'project': 'YOLO-World',
+#             'entity': 'yolo_world_s_dual_vlpan_l2norm_2e-3_100e_8gpus_obj365v1_train_lvis_minival',
+#          },
+#          interval=10,
+#          log_checkpoint=True,
+#          log_checkpoint_metadata=True,
+#          num_eval_images=100)])
+
+# 🐝 use wandb for tracking log
+# visualizer = dict(vis_backends=[dict(type='LocalVisBackend'), dict(type='WandbVisBackend')])
+
+
+
+
diff --git a/mmdetection_practice/configs/finetune_coco/README.md b/mmdetection_practice/configs/finetune_coco/README.md
new file mode 100644
index 0000000..954d64a
--- /dev/null
+++ b/mmdetection_practice/configs/finetune_coco/README.md
@@ -0,0 +1,29 @@
+## Fine-tune YOLO-World on MS-COCO
+
+
+### Updates
+
+1. [2024-3-27]: Considering that fine-tuning YOLO-World on COCO **without `mask-refine`** obtains bad results, e.g., YOLO-World-L obtains 48.6 AP without `mask-refine` compared to 53.3 AP with `mask-refine`, we rethink the training process and explore new training schemes for fine-tuning without `mask-refine`.
+BTW, the COCO fine-tuning results are updated with higher performance (with `mask-refine`)!
+
+
+### COCO Results and Checkpoints
+
+**NOTE:**
+1. AP<sup>ZS</sup>: AP evaluated in the zero-shot setting (w/o fine-tuning on COCO dataset).
+2. `mask-refine`: refine the box annotations with masks, and add `CopyPaste` augmentation during training.
+
+| model | Schedule | `mask-refine` | efficient neck | AP<sup>ZS</sup>|  AP | AP<sub>50</sub> | AP<sub>75</sub> | weights | log |
+| :---- | :-------: | :----------: |:-------------: | :------------: | :-: | :--------------:| :-------------: |:------: | :-: |
+| [YOLO-World-v2-S](./yolo_world_v2_s_vlpan_bn_2e-4_80e_8gpus_mask-refine_finetune_coco.py) | AdamW, 2e-4, 80e | ✔️  | ✖️ | 37.5 | 46.1 | 62.0 | 49.9 | [HF Checkpoints](https://huggingface.co/wondervictor/YOLO-World/blob/main/yolo_world_v2_s_vlpan_bn_2e-4_80e_8gpus_mask-refine_finetune_coco_ep80-492dc329.pth) | [log](https://huggingface.co/wondervictor/YOLO-World/blob/main/yolo_world_v2_s_vlpan_bn_2e-4_80e_8gpus_mask-refine_finetune_coco_20240327_110411.log) |
+| [YOLO-World-v2-M](./yolo_world_v2_m_vlpan_bn_2e-4_80e_8gpus_mask-refine_finetune_coco.py) | AdamW, 2e-4, 80e | ✔️  | ✖️ | 42.8 | 51.0 | 67.5 | 55.2 | [HF Checkpoints](https://huggingface.co/wondervictor/YOLO-World/blob/main/yolo_world_v2_m_vlpan_bn_2e-4_80e_8gpus_mask-refine_finetune_coco_ep80-69c27ac7.pth) | [log](https://huggingface.co/wondervictor/YOLO-World/blob/main/yolo_world_v2_m_vlpan_bn_2e-4_80e_8gpus_mask-refine_finetune_coco_20240327_110411.log) |
+| [YOLO-World-v2-L](./yolo_world_v2_l_vlpan_bn_2e-4_80e_8gpus_mask-refine_finetune_coco.py) | AdamW, 2e-4, 80e | ✔️  | ✖️ | 45.1 | 53.9 | 70.9 | 58.8 | [HF Checkpoints](https://huggingface.co/wondervictor/YOLO-World/blob/main/yolo_world_v2_l_vlpan_bn_2e-4_80e_8gpus_mask-refine_finetune_coco_ep80-81c701ee.pth) | [log](https://huggingface.co/wondervictor/YOLO-World/blob/main/yolo_world_v2_l_vlpan_bn_2e-4_80e_8gpus_mask-refine_finetune_coco_20240326_160313.log) |
+| [YOLO-World-v2-X](./yolo_world_v2_x_vlpan_bn_2e-4_80e_8gpus_mask-refine_finetune_coco.py) | AdamW, 2e-4, 80e | ✔️  | ✖️ | 46.8 | 54.7 | 71.6 | 59.6 | [HF Checkpoints](https://huggingface.co/wondervictor/YOLO-World/blob/main/yolo_world_v2_x_vlpan_bn_2e-4_80e_8gpus_mask-refine_finetune_coco_ep80-76bc0cbd.pth) | [log](https://huggingface.co/wondervictor/YOLO-World/blob/main/yolo_world_v2_x_vlpan_bn_2e-4_80e_8gpus_mask-refine_finetune_coco_20240322_181232.log) |
+| [YOLO-World-v2-L](./yolo_world_v2_l_vlpan_bn_sgd_1e-3_40e_8gpus_finetune_coco.py) 🔥 | SGD, 1e-3, 40e | ✖️  | ✖️ | 45.1 | 52.8 | 69.5 | 57.8 | [HF Checkpoints](https://huggingface.co/wondervictor/YOLO-World/blob/main/yolo_world_v2_l_vlpan_bn_sgd_1e-3_40e_8gpus_finetune_coco_ep80-e1288152.pth) | [log](https://huggingface.co/wondervictor/YOLO-World/blob/main/yolo_world_v2_l_vlpan_bn_sgd_1e-3_40e_8gpus_finetuning_coco_20240327_014902.log) |
+
+
+### Reparameterized Training
+
+| model | Schedule | `mask-refine` | efficient neck | AP<sup>ZS</sup>|  AP | AP<sub>50</sub> | AP<sub>75</sub> | weights | log |
+| :---- | :-------: | :----------: |:-------------: | :------------: | :-: | :--------------:| :-------------: |:------: | :-: |
+| [YOLO-World-v2-S](./yolo_world_v2_s_rep_vlpan_bn_2e-4_80e_8gpus_mask-refine_finetune_coco.py) | AdamW, 2e-4, 80e | ✔️  | ✖️ | 37.5 | 46.3 | 62.8 | 50.4 | [HF Checkpoints]() | [log]() | 
\ No newline at end of file
diff --git a/mmdetection_practice/configs/finetune_coco/yolo_world_l_dual_vlpan_2e-4_80e_8gpus_finetune_coco.py b/mmdetection_practice/configs/finetune_coco/yolo_world_l_dual_vlpan_2e-4_80e_8gpus_finetune_coco.py
new file mode 100644
index 0000000..101a571
--- /dev/null
+++ b/mmdetection_practice/configs/finetune_coco/yolo_world_l_dual_vlpan_2e-4_80e_8gpus_finetune_coco.py
@@ -0,0 +1,179 @@
+_base_ = (
+    '../../third_party/mmyolo/configs/yolov8/'
+    'yolov8_l_syncbn_fast_8xb16-500e_coco.py')
+custom_imports = dict(
+    imports=['yolo_world'],
+    allow_failed_imports=False)
+
+# hyper-parameters
+num_classes = 80
+num_training_classes = 80
+max_epochs = 80  # Maximum training epochs
+close_mosaic_epochs = 10
+save_epoch_intervals = 5
+text_channels = 512
+neck_embed_channels = [128, 256, _base_.last_stage_out_channels // 2]
+neck_num_heads = [4, 8, _base_.last_stage_out_channels // 2 // 32]
+base_lr = 2e-4
+weight_decay = 0.05
+train_batch_size_per_gpu = 16
+load_from='pretrained_models/yolo_world_l_clip_base_dual_vlpan_2e-3adamw_32xb16_100e_o365_goldg_train_pretrained-0e566235.pth'
+persistent_workers = False
+
+# model settings
+model = dict(
+    type='YOLOWorldDetector',
+    mm_neck=True,
+    num_train_classes=num_training_classes,
+    num_test_classes=num_classes,
+    data_preprocessor=dict(type='YOLOWDetDataPreprocessor'),
+    backbone=dict(
+        _delete_=True,
+        type='MultiModalYOLOBackbone',
+        image_model={{_base_.model.backbone}},
+        text_model=dict(
+            type='HuggingCLIPLanguageBackbone',
+            model_name='openai/clip-vit-base-patch32',
+            frozen_modules=['all'])),
+    neck=dict(type='YOLOWorldDualPAFPN',
+              guide_channels=text_channels,
+              embed_channels=neck_embed_channels,
+              num_heads=neck_num_heads,
+              block_cfg=dict(type='MaxSigmoidCSPLayerWithTwoConv'),
+              text_enhancder=dict(type='ImagePoolingAttentionModule',
+                                  embed_channels=256,
+                                  num_heads=8)),
+    bbox_head=dict(type='YOLOWorldHead',
+                   head_module=dict(type='YOLOWorldHeadModule',
+                                    embed_dims=text_channels,
+                                    num_classes=num_training_classes)),
+    train_cfg=dict(assigner=dict(num_classes=num_training_classes)))
+
+# dataset settings
+text_transform = [
+    dict(type='RandomLoadText',
+         num_neg_samples=(num_classes, num_classes),
+         max_num_samples=num_training_classes,
+         padding_to_max=True,
+         padding_value=''),
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                    'flip_direction', 'texts'))
+]
+mosaic_affine_transform = [
+    dict(
+        type='MultiModalMosaic',
+        img_scale=_base_.img_scale,
+        pad_val=114.0,
+        pre_transform=_base_.pre_transform),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        max_aspect_ratio=100.,
+        scaling_ratio_range=(1 - _base_.affine_scale,
+                             1 + _base_.affine_scale),
+        # img_scale is (width, height)
+        border=(-_base_.img_scale[0] // 2, -_base_.img_scale[1] // 2),
+        border_val=(114, 114, 114))
+]
+train_pipeline = [
+    *_base_.pre_transform,
+    *mosaic_affine_transform,
+    dict(
+        type='YOLOv5MultiModalMixUp',
+        prob=_base_.mixup_prob,
+        pre_transform=[*_base_.pre_transform,
+                       *mosaic_affine_transform]),
+    *_base_.last_transform[:-1],
+    *text_transform
+]
+train_pipeline_stage2 = [
+    *_base_.train_pipeline_stage2[:-1],
+    *text_transform
+]
+coco_train_dataset = dict(
+    _delete_=True,
+    type='MultiModalDataset',
+    dataset=dict(
+        type='YOLOv5CocoDataset',
+        data_root='data/coco',
+        ann_file='annotations/instances_train2017.json',
+        data_prefix=dict(img='train2017/'),
+        filter_cfg=dict(filter_empty_gt=False, min_size=32)),
+    class_text_path='data/texts/coco_class_texts.json',
+    pipeline=train_pipeline)
+
+train_dataloader = dict(
+    persistent_workers=persistent_workers,
+    batch_size=train_batch_size_per_gpu,
+    collate_fn=dict(type='yolow_collate'),
+    dataset=coco_train_dataset)
+test_pipeline = [
+    *_base_.test_pipeline[:-1],
+    dict(type='LoadText'),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                   'scale_factor', 'pad_param', 'texts'))
+]
+coco_val_dataset = dict(
+    _delete_=True,
+    type='MultiModalDataset',
+    dataset=dict(
+        type='YOLOv5CocoDataset',
+        data_root='data/coco',
+        ann_file='annotations/instances_val2017.json',
+        data_prefix=dict(img='val2017/'),
+        filter_cfg=dict(filter_empty_gt=False, min_size=32)),
+    class_text_path='data/texts/coco_class_texts.json',
+    pipeline=test_pipeline)
+val_dataloader = dict(dataset=coco_val_dataset)
+test_dataloader = val_dataloader
+# training settings
+default_hooks = dict(
+    param_scheduler=dict(
+        scheduler_type='linear',
+        lr_factor=0.01,
+        max_epochs=max_epochs),
+    checkpoint=dict(
+        max_keep_ckpts=-1,
+        save_best=None,
+        interval=save_epoch_intervals))
+custom_hooks = [
+    dict(
+        type='EMAHook',
+        ema_type='ExpMomentumEMA',
+        momentum=0.0001,
+        update_buffers=True,
+        strict_load=False,
+        priority=49),
+    dict(
+        type='mmdet.PipelineSwitchHook',
+        switch_epoch=max_epochs - close_mosaic_epochs,
+        switch_pipeline=train_pipeline_stage2)
+]
+train_cfg = dict(
+    max_epochs=max_epochs,
+    val_interval=5,
+    dynamic_intervals=[((max_epochs - close_mosaic_epochs),
+                        _base_.val_interval_stage2)])
+optim_wrapper = dict(
+    optimizer=dict(
+        _delete_=True,
+        type='AdamW',
+        lr=base_lr,
+        weight_decay=weight_decay,
+        batch_size_per_gpu=train_batch_size_per_gpu),
+    paramwise_cfg=dict(
+        custom_keys={'backbone.text_model': dict(lr_mult=0.01),
+                     'logit_scale': dict(weight_decay=0.0)}),
+    constructor='YOLOWv5OptimizerConstructor')
+
+# evaluation settings
+val_evaluator = dict(
+    _delete_=True,
+    type='mmdet.CocoMetric',
+    proposal_nums=(100, 1, 10),
+    ann_file='data/coco/annotations/instances_val2017.json',
+    metric='bbox')
diff --git a/mmdetection_practice/configs/finetune_coco/yolo_world_l_dual_vlpan_2e-4_80e_8gpus_mask-refine_finetune_coco.py b/mmdetection_practice/configs/finetune_coco/yolo_world_l_dual_vlpan_2e-4_80e_8gpus_mask-refine_finetune_coco.py
new file mode 100644
index 0000000..2ddbe50
--- /dev/null
+++ b/mmdetection_practice/configs/finetune_coco/yolo_world_l_dual_vlpan_2e-4_80e_8gpus_mask-refine_finetune_coco.py
@@ -0,0 +1,181 @@
+_base_ = (
+    '../../third_party/mmyolo/configs/yolov8/'
+    'yolov8_l_mask-refine_syncbn_fast_8xb16-500e_coco.py')
+custom_imports = dict(
+    imports=['yolo_world'],
+    allow_failed_imports=False)
+
+# hyper-parameters
+num_classes = 80
+num_training_classes = 80
+max_epochs = 80  # Maximum training epochs
+close_mosaic_epochs = 10
+save_epoch_intervals = 5
+text_channels = 512
+neck_embed_channels = [128, 256, _base_.last_stage_out_channels // 2]
+neck_num_heads = [4, 8, _base_.last_stage_out_channels // 2 // 32]
+base_lr = 2e-4
+weight_decay = 0.05
+train_batch_size_per_gpu = 16
+load_from='pretrained_models/yolo_world_l_clip_base_dual_vlpan_2e-3adamw_32xb16_100e_o365_goldg_train_pretrained-0e566235.pth'
+persistent_workers = False
+
+# model settings
+model = dict(
+    type='YOLOWorldDetector',
+    mm_neck=True,
+    num_train_classes=num_training_classes,
+    num_test_classes=num_classes,
+    data_preprocessor=dict(type='YOLOWDetDataPreprocessor'),
+    backbone=dict(
+        _delete_=True,
+        type='MultiModalYOLOBackbone',
+        image_model={{_base_.model.backbone}},
+        text_model=dict(
+            type='HuggingCLIPLanguageBackbone',
+            model_name='openai/clip-vit-base-patch32',
+            frozen_modules=['all'])),
+    neck=dict(type='YOLOWorldDualPAFPN',
+              guide_channels=text_channels,
+              embed_channels=neck_embed_channels,
+              num_heads=neck_num_heads,
+              block_cfg=dict(type='MaxSigmoidCSPLayerWithTwoConv'),
+              text_enhancder=dict(type='ImagePoolingAttentionModule',
+                                  embed_channels=256,
+                                  num_heads=8)),
+    bbox_head=dict(type='YOLOWorldHead',
+                   head_module=dict(type='YOLOWorldHeadModule',
+                                    embed_dims=text_channels,
+                                    num_classes=num_training_classes)),
+    train_cfg=dict(assigner=dict(num_classes=num_training_classes)))
+
+# dataset settings
+text_transform = [
+    dict(type='RandomLoadText',
+         num_neg_samples=(num_classes, num_classes),
+         max_num_samples=num_training_classes,
+         padding_to_max=True,
+         padding_value=''),
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                    'flip_direction', 'texts'))
+]
+mosaic_affine_transform = [
+    dict(
+        type='MultiModalMosaic',
+        img_scale=_base_.img_scale,
+        pad_val=114.0,
+        pre_transform=_base_.pre_transform),
+    dict(type='YOLOv5CopyPaste', prob=_base_.copypaste_prob),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        max_aspect_ratio=100.,
+        scaling_ratio_range=(1 - _base_.affine_scale,
+                             1 + _base_.affine_scale),
+        # img_scale is (width, height)
+        border=(-_base_.img_scale[0] // 2, -_base_.img_scale[1] // 2),
+        border_val=(114, 114, 114),
+        min_area_ratio=_base_.min_area_ratio,
+        use_mask_refine=_base_.use_mask2refine)
+]
+train_pipeline = [
+    *_base_.pre_transform,
+    *mosaic_affine_transform,
+    dict(
+        type='YOLOv5MultiModalMixUp',
+        prob=_base_.mixup_prob,
+        pre_transform=[*_base_.pre_transform,
+                       *mosaic_affine_transform]),
+    *_base_.last_transform[:-1],
+    *text_transform
+]
+train_pipeline_stage2 = [
+    *_base_.train_pipeline_stage2[:-1],
+    *text_transform
+]
+coco_train_dataset = dict(
+    _delete_=True,
+    type='MultiModalDataset',
+    dataset=dict(
+        type='YOLOv5CocoDataset',
+        data_root='data/coco',
+        ann_file='annotations/instances_train2017.json',
+        data_prefix=dict(img='train2017/'),
+        filter_cfg=dict(filter_empty_gt=False, min_size=32)),
+    class_text_path='data/texts/coco_class_texts.json',
+    pipeline=train_pipeline)
+
+train_dataloader = dict(
+    persistent_workers=persistent_workers,
+    batch_size=train_batch_size_per_gpu,
+    collate_fn=dict(type='yolow_collate'),
+    dataset=coco_train_dataset)
+test_pipeline = [
+    *_base_.test_pipeline[:-1],
+    dict(type='LoadText'),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                   'scale_factor', 'pad_param', 'texts'))
+]
+coco_val_dataset = dict(
+    _delete_=True,
+    type='MultiModalDataset',
+    dataset=dict(
+        type='YOLOv5CocoDataset',
+        data_root='data/coco',
+        ann_file='annotations/instances_val2017.json',
+        data_prefix=dict(img='val2017/'),
+        filter_cfg=dict(filter_empty_gt=False, min_size=32)),
+    class_text_path='data/texts/coco_class_texts.json',
+    pipeline=test_pipeline)
+val_dataloader = dict(dataset=coco_val_dataset)
+test_dataloader = val_dataloader
+# training settings
+default_hooks = dict(
+    param_scheduler=dict(
+        scheduler_type='linear',
+        lr_factor=0.01,
+        max_epochs=max_epochs),
+    checkpoint=dict(
+        max_keep_ckpts=-1,
+        save_best=None,
+        interval=save_epoch_intervals))
+custom_hooks = [
+    dict(
+        type='EMAHook',
+        ema_type='ExpMomentumEMA',
+        momentum=0.0001,
+        update_buffers=True,
+        strict_load=False,
+        priority=49),
+    dict(
+        type='mmdet.PipelineSwitchHook',
+        switch_epoch=max_epochs - close_mosaic_epochs,
+        switch_pipeline=train_pipeline_stage2)
+]
+train_cfg = dict(
+    max_epochs=max_epochs,
+    val_interval=5,
+    dynamic_intervals=[((max_epochs - close_mosaic_epochs),
+                        _base_.val_interval_stage2)])
+optim_wrapper = dict(
+    optimizer=dict(
+        _delete_=True,
+        type='AdamW',
+        lr=base_lr,
+        weight_decay=weight_decay,
+        batch_size_per_gpu=train_batch_size_per_gpu),
+    paramwise_cfg=dict(
+        custom_keys={'backbone.text_model': dict(lr_mult=0.01),
+                     'logit_scale': dict(weight_decay=0.0)}),
+    constructor='YOLOWv5OptimizerConstructor')
+# evaluation settings
+val_evaluator = dict(
+    _delete_=True,
+    type='mmdet.CocoMetric',
+    proposal_nums=(100, 1, 10),
+    ann_file='data/coco/annotations/instances_val2017.json',
+    metric='bbox')
diff --git a/mmdetection_practice/configs/finetune_coco/yolo_world_l_efficient_neck_2e-4_80e_8gpus_mask-refine_finetune_coco.py b/mmdetection_practice/configs/finetune_coco/yolo_world_l_efficient_neck_2e-4_80e_8gpus_mask-refine_finetune_coco.py
new file mode 100644
index 0000000..b5cdca5
--- /dev/null
+++ b/mmdetection_practice/configs/finetune_coco/yolo_world_l_efficient_neck_2e-4_80e_8gpus_mask-refine_finetune_coco.py
@@ -0,0 +1,159 @@
+_base_ = ('../../third_party/mmyolo/configs/yolov8/'
+          'yolov8_l_mask-refine_syncbn_fast_8xb16-500e_coco.py')
+custom_imports = dict(imports=['yolo_world'], allow_failed_imports=False)
+
+# hyper-parameters
+num_classes = 80
+num_training_classes = 80
+max_epochs = 80  # Maximum training epochs
+close_mosaic_epochs = 10
+save_epoch_intervals = 5
+text_channels = 512
+neck_embed_channels = [128, 256, _base_.last_stage_out_channels // 2]
+neck_num_heads = [4, 8, _base_.last_stage_out_channels // 2 // 32]
+base_lr = 2e-4
+weight_decay = 0.05
+train_batch_size_per_gpu = 16
+load_from = 'pretrained_models/yolo_world_l_clip_base_dual_vlpan_2e-3adamw_32xb16_100e_o365_goldg_train_pretrained-0e566235.pth'
+# huggingface text model
+text_model_name = 'openai/clip-vit-base-patch32'
+persistent_workers = False
+
+# model settings
+model = dict(
+    type='YOLOWorldDetector',
+    mm_neck=True,
+    num_train_classes=num_training_classes,
+    num_test_classes=num_classes,
+    data_preprocessor=dict(type='YOLOWDetDataPreprocessor'),
+    backbone=dict(
+        _delete_=True,
+        type='MultiModalYOLOBackbone',
+        image_model={{_base_.model.backbone}},
+        text_model=dict(
+            type='HuggingCLIPLanguageBackbone',
+            model_name=text_model_name,
+            frozen_modules=['all'])),
+    neck=dict(type='YOLOWorldPAFPN',
+              guide_channels=text_channels,
+              embed_channels=neck_embed_channels,
+              num_heads=neck_num_heads,
+              block_cfg=dict(type='EfficientCSPLayerWithTwoConv')),
+    bbox_head=dict(type='YOLOWorldHead',
+                   head_module=dict(type='YOLOWorldHeadModule',
+                                    embed_dims=text_channels,
+                                    num_classes=num_training_classes)),
+    train_cfg=dict(assigner=dict(num_classes=num_training_classes)))
+
+# dataset settings
+text_transform = [
+    dict(type='RandomLoadText',
+         num_neg_samples=(num_classes, num_classes),
+         max_num_samples=num_training_classes,
+         padding_to_max=True,
+         padding_value=''),
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                    'flip_direction', 'texts'))
+]
+mosaic_affine_transform = [
+    dict(type='MultiModalMosaic',
+         img_scale=_base_.img_scale,
+         pad_val=114.0,
+         pre_transform=_base_.pre_transform),
+    dict(type='YOLOv5CopyPaste', prob=_base_.copypaste_prob),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        max_aspect_ratio=100.,
+        scaling_ratio_range=(1 - _base_.affine_scale, 1 + _base_.affine_scale),
+        # img_scale is (width, height)
+        border=(-_base_.img_scale[0] // 2, -_base_.img_scale[1] // 2),
+        border_val=(114, 114, 114),
+        min_area_ratio=_base_.min_area_ratio,
+        use_mask_refine=_base_.use_mask2refine)
+]
+train_pipeline = [
+    *_base_.pre_transform, *mosaic_affine_transform,
+    dict(type='YOLOv5MultiModalMixUp',
+         prob=_base_.mixup_prob,
+         pre_transform=[*_base_.pre_transform, *mosaic_affine_transform]),
+    *_base_.last_transform[:-1], *text_transform
+]
+train_pipeline_stage2 = [*_base_.train_pipeline_stage2[:-1], *text_transform]
+coco_train_dataset = dict(_delete_=True,
+                          type='MultiModalDataset',
+                          dataset=dict(
+                              type='YOLOv5CocoDataset',
+                              data_root='data/coco',
+                              ann_file='annotations/instances_train2017.json',
+                              data_prefix=dict(img='train2017/'),
+                              filter_cfg=dict(filter_empty_gt=False,
+                                              min_size=32)),
+                          class_text_path='data/texts/coco_class_texts.json',
+                          pipeline=train_pipeline)
+
+train_dataloader = dict(persistent_workers=persistent_workers,
+                        batch_size=train_batch_size_per_gpu,
+                        collate_fn=dict(type='yolow_collate'),
+                        dataset=coco_train_dataset)
+test_pipeline = [
+    *_base_.test_pipeline[:-1],
+    dict(type='LoadText'),
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                    'scale_factor', 'pad_param', 'texts'))
+]
+coco_val_dataset = dict(
+    _delete_=True,
+    type='MultiModalDataset',
+    dataset=dict(type='YOLOv5CocoDataset',
+                 data_root='data/coco',
+                 ann_file='annotations/instances_val2017.json',
+                 data_prefix=dict(img='val2017/'),
+                 filter_cfg=dict(filter_empty_gt=False, min_size=32)),
+    class_text_path='data/texts/coco_class_texts.json',
+    pipeline=test_pipeline)
+val_dataloader = dict(dataset=coco_val_dataset)
+test_dataloader = val_dataloader
+# training settings
+default_hooks = dict(param_scheduler=dict(scheduler_type='linear',
+                                          lr_factor=0.01,
+                                          max_epochs=max_epochs),
+                     checkpoint=dict(max_keep_ckpts=-1,
+                                     save_best=None,
+                                     interval=save_epoch_intervals))
+custom_hooks = [
+    dict(type='EMAHook',
+         ema_type='ExpMomentumEMA',
+         momentum=0.0001,
+         update_buffers=True,
+         strict_load=False,
+         priority=49),
+    dict(type='mmdet.PipelineSwitchHook',
+         switch_epoch=max_epochs - close_mosaic_epochs,
+         switch_pipeline=train_pipeline_stage2)
+]
+train_cfg = dict(max_epochs=max_epochs,
+                 val_interval=5,
+                 dynamic_intervals=[((max_epochs - close_mosaic_epochs),
+                                     _base_.val_interval_stage2)])
+optim_wrapper = dict(
+    optimizer=dict(
+        _delete_=True,
+        type='AdamW',
+        lr=base_lr,
+        weight_decay=weight_decay,
+        batch_size_per_gpu=train_batch_size_per_gpu),
+    paramwise_cfg=dict(
+        custom_keys={'backbone.text_model': dict(lr_mult=0.01),
+                     'logit_scale': dict(weight_decay=0.0)}),
+    constructor='YOLOWv5OptimizerConstructor')
+
+# evaluation settings
+val_evaluator = dict(_delete_=True,
+                     type='mmdet.CocoMetric',
+                     proposal_nums=(100, 1, 10),
+                     ann_file='data/coco/annotations/instances_val2017.json',
+                     metric='bbox')
diff --git a/mmdetection_practice/configs/finetune_coco/yolo_world_v2_l_efficient_neck_2e-4_80e_8gpus_mask-refine_finetune_coco.py b/mmdetection_practice/configs/finetune_coco/yolo_world_v2_l_efficient_neck_2e-4_80e_8gpus_mask-refine_finetune_coco.py
new file mode 100644
index 0000000..b8a50ad
--- /dev/null
+++ b/mmdetection_practice/configs/finetune_coco/yolo_world_v2_l_efficient_neck_2e-4_80e_8gpus_mask-refine_finetune_coco.py
@@ -0,0 +1,182 @@
+_base_ = (
+    '../../third_party/mmyolo/configs/yolov8/'
+    'yolov8_l_mask-refine_syncbn_fast_8xb16-500e_coco.py')
+custom_imports = dict(
+    imports=['yolo_world'],
+    allow_failed_imports=False)
+
+# hyper-parameters
+num_classes = 80
+num_training_classes = 80
+max_epochs = 80  # Maximum training epochs
+close_mosaic_epochs = 10
+save_epoch_intervals = 5
+text_channels = 512
+neck_embed_channels = [128, 256, _base_.last_stage_out_channels // 2]
+neck_num_heads = [4, 8, _base_.last_stage_out_channels // 2 // 32]
+base_lr = 2e-4
+weight_decay = 0.05
+train_batch_size_per_gpu = 16
+load_from = 'pretrained_models/yolo_world_l_clip_t2i_bn_2e-3adamw_32xb16-100e_obj365v1_goldg_cc3mlite_train-ca93cd1f.pth'
+text_model_name = '../pretrained_models/clip-vit-base-patch32-projection'
+text_model_name = 'openai/clip-vit-base-patch32'
+persistent_workers = False
+
+# model settings
+model = dict(
+    type='YOLOWorldDetector',
+    mm_neck=True,
+    num_train_classes=num_training_classes,
+    num_test_classes=num_classes,
+    data_preprocessor=dict(type='YOLOWDetDataPreprocessor'),
+    backbone=dict(
+        _delete_=True,
+        type='MultiModalYOLOBackbone',
+        image_model={{_base_.model.backbone}},
+        text_model=dict(
+            type='HuggingCLIPLanguageBackbone',
+            model_name=text_model_name,
+            frozen_modules=['all'])),
+    neck=dict(type='YOLOWorldPAFPN',
+              guide_channels=text_channels,
+              embed_channels=neck_embed_channels,
+              num_heads=neck_num_heads,
+              block_cfg=dict(type='EfficientCSPLayerWithTwoConv')),
+    bbox_head=dict(type='YOLOWorldHead',
+                   head_module=dict(type='YOLOWorldHeadModule',
+                                    use_bn_head=True,
+                                    embed_dims=text_channels,
+                                    num_classes=num_training_classes)),
+    train_cfg=dict(assigner=dict(num_classes=num_training_classes)))
+
+# dataset settings
+text_transform = [
+    dict(type='RandomLoadText',
+         num_neg_samples=(num_classes, num_classes),
+         max_num_samples=num_training_classes,
+         padding_to_max=True,
+         padding_value=''),
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                    'flip_direction', 'texts'))
+]
+mosaic_affine_transform = [
+    dict(
+        type='MultiModalMosaic',
+        img_scale=_base_.img_scale,
+        pad_val=114.0,
+        pre_transform=_base_.pre_transform),
+    dict(type='YOLOv5CopyPaste', prob=_base_.copypaste_prob),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        max_aspect_ratio=100.,
+        scaling_ratio_range=(1 - _base_.affine_scale,
+                             1 + _base_.affine_scale),
+        # img_scale is (width, height)
+        border=(-_base_.img_scale[0] // 2, -_base_.img_scale[1] // 2),
+        border_val=(114, 114, 114),
+        min_area_ratio=_base_.min_area_ratio,
+        use_mask_refine=_base_.use_mask2refine)
+]
+train_pipeline = [
+    *_base_.pre_transform,
+    *mosaic_affine_transform,
+    dict(
+        type='YOLOv5MultiModalMixUp',
+        prob=_base_.mixup_prob,
+        pre_transform=[*_base_.pre_transform,
+                       *mosaic_affine_transform]),
+    *_base_.last_transform[:-1],
+    *text_transform
+]
+train_pipeline_stage2 = [
+    *_base_.train_pipeline_stage2[:-1],
+    *text_transform
+]
+coco_train_dataset = dict(
+    _delete_=True,
+    type='MultiModalDataset',
+    dataset=dict(
+        type='YOLOv5CocoDataset',
+        data_root='data/coco',
+        ann_file='annotations/instances_train2017.json',
+        data_prefix=dict(img='train2017/'),
+        filter_cfg=dict(filter_empty_gt=False, min_size=32)),
+    class_text_path='data/texts/coco_class_texts.json',
+    pipeline=train_pipeline)
+
+train_dataloader = dict(
+    persistent_workers=persistent_workers,
+    batch_size=train_batch_size_per_gpu,
+    collate_fn=dict(type='yolow_collate'),
+    dataset=coco_train_dataset)
+test_pipeline = [
+    *_base_.test_pipeline[:-1],
+    dict(type='LoadText'),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                   'scale_factor', 'pad_param', 'texts'))
+]
+coco_val_dataset = dict(
+    _delete_=True,
+    type='MultiModalDataset',
+    dataset=dict(
+        type='YOLOv5CocoDataset',
+        data_root='data/coco',
+        ann_file='annotations/instances_val2017.json',
+        data_prefix=dict(img='val2017/'),
+        filter_cfg=dict(filter_empty_gt=False, min_size=32)),
+    class_text_path='data/texts/coco_class_texts.json',
+    pipeline=test_pipeline)
+val_dataloader = dict(dataset=coco_val_dataset)
+test_dataloader = val_dataloader
+# training settings
+default_hooks = dict(
+    param_scheduler=dict(
+        scheduler_type='linear',
+        lr_factor=0.01,
+        max_epochs=max_epochs),
+    checkpoint=dict(
+        max_keep_ckpts=-1,
+        save_best=None,
+        interval=save_epoch_intervals))
+custom_hooks = [
+    dict(
+        type='EMAHook',
+        ema_type='ExpMomentumEMA',
+        momentum=0.0001,
+        update_buffers=True,
+        strict_load=False,
+        priority=49),
+    dict(
+        type='mmdet.PipelineSwitchHook',
+        switch_epoch=max_epochs - close_mosaic_epochs,
+        switch_pipeline=train_pipeline_stage2)
+]
+train_cfg = dict(
+    max_epochs=max_epochs,
+    val_interval=5,
+    dynamic_intervals=[((max_epochs - close_mosaic_epochs),
+                        _base_.val_interval_stage2)])
+optim_wrapper = dict(
+    optimizer=dict(
+        _delete_=True,
+        type='AdamW',
+        lr=base_lr,
+        weight_decay=weight_decay,
+        batch_size_per_gpu=train_batch_size_per_gpu),
+    paramwise_cfg=dict(
+        custom_keys={'backbone.text_model': dict(lr_mult=0.01),
+                     'logit_scale': dict(weight_decay=0.0)}),
+    constructor='YOLOWv5OptimizerConstructor')
+
+# evaluation settings
+val_evaluator = dict(
+    _delete_=True,
+    type='mmdet.CocoMetric',
+    proposal_nums=(100, 1, 10),
+    ann_file='data/coco/annotations/instances_val2017.json',
+    metric='bbox')
diff --git a/mmdetection_practice/configs/finetune_coco/yolo_world_v2_l_vlpan_bn_2e-4_80e_8gpus_mask-refine_finetune_coco.py b/mmdetection_practice/configs/finetune_coco/yolo_world_v2_l_vlpan_bn_2e-4_80e_8gpus_mask-refine_finetune_coco.py
new file mode 100644
index 0000000..cbf1da2
--- /dev/null
+++ b/mmdetection_practice/configs/finetune_coco/yolo_world_v2_l_vlpan_bn_2e-4_80e_8gpus_mask-refine_finetune_coco.py
@@ -0,0 +1,181 @@
+_base_ = (
+    '../../third_party/mmyolo/configs/yolov8/'
+    'yolov8_l_mask-refine_syncbn_fast_8xb16-500e_coco.py')
+custom_imports = dict(
+    imports=['yolo_world'],
+    allow_failed_imports=False)
+
+# hyper-parameters
+num_classes = 80
+num_training_classes = 80
+max_epochs = 80  # Maximum training epochs
+close_mosaic_epochs = 10
+save_epoch_intervals = 5
+text_channels = 512
+neck_embed_channels = [128, 256, _base_.last_stage_out_channels // 2]
+neck_num_heads = [4, 8, _base_.last_stage_out_channels // 2 // 32]
+base_lr = 2e-4
+weight_decay = 0.05
+train_batch_size_per_gpu = 16
+load_from = 'pretrained_models/yolo_world_l_clip_t2i_bn_2e-3adamw_32xb16-100e_obj365v1_goldg_cc3mlite_train-ca93cd1f.pth'
+text_model_name = '../pretrained_models/clip-vit-base-patch32-projection'
+text_model_name = 'openai/clip-vit-base-patch32'
+persistent_workers = False
+
+# model settings
+model = dict(
+    type='YOLOWorldDetector',
+    mm_neck=True,
+    num_train_classes=num_training_classes,
+    num_test_classes=num_classes,
+    data_preprocessor=dict(type='YOLOWDetDataPreprocessor'),
+    backbone=dict(
+        _delete_=True,
+        type='MultiModalYOLOBackbone',
+        image_model={{_base_.model.backbone}},
+        text_model=dict(
+            type='HuggingCLIPLanguageBackbone',
+            model_name=text_model_name,
+            frozen_modules=['all'])),
+    neck=dict(type='YOLOWorldPAFPN',
+              guide_channels=text_channels,
+              embed_channels=neck_embed_channels,
+              num_heads=neck_num_heads,
+              block_cfg=dict(type='MaxSigmoidCSPLayerWithTwoConv')),
+    bbox_head=dict(type='YOLOWorldHead',
+                   head_module=dict(type='YOLOWorldHeadModule',
+                                    use_bn_head=True,
+                                    embed_dims=text_channels,
+                                    num_classes=num_training_classes)),
+    train_cfg=dict(assigner=dict(num_classes=num_training_classes)))
+
+# dataset settings
+text_transform = [
+    dict(type='RandomLoadText',
+         num_neg_samples=(num_classes, num_classes),
+         max_num_samples=num_training_classes,
+         padding_to_max=True,
+         padding_value=''),
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                    'flip_direction', 'texts'))
+]
+mosaic_affine_transform = [
+    dict(
+        type='MultiModalMosaic',
+        img_scale=_base_.img_scale,
+        pad_val=114.0,
+        pre_transform=_base_.pre_transform),
+    dict(type='YOLOv5CopyPaste', prob=_base_.copypaste_prob),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        max_aspect_ratio=100.,
+        scaling_ratio_range=(1 - _base_.affine_scale,
+                             1 + _base_.affine_scale),
+        # img_scale is (width, height)
+        border=(-_base_.img_scale[0] // 2, -_base_.img_scale[1] // 2),
+        border_val=(114, 114, 114),
+        min_area_ratio=_base_.min_area_ratio,
+        use_mask_refine=_base_.use_mask2refine)
+]
+train_pipeline = [
+    *_base_.pre_transform,
+    *mosaic_affine_transform,
+    dict(
+        type='YOLOv5MultiModalMixUp',
+        prob=_base_.mixup_prob,
+        pre_transform=[*_base_.pre_transform,
+                       *mosaic_affine_transform]),
+    *_base_.last_transform[:-1],
+    *text_transform
+]
+train_pipeline_stage2 = [
+    *_base_.train_pipeline_stage2[:-1],
+    *text_transform
+]
+coco_train_dataset = dict(
+    _delete_=True,
+    type='MultiModalDataset',
+    dataset=dict(
+        type='YOLOv5CocoDataset',
+        data_root='data/coco',
+        ann_file='annotations/instances_train2017.json',
+        data_prefix=dict(img='train2017/'),
+        filter_cfg=dict(filter_empty_gt=False, min_size=32)),
+    class_text_path='data/texts/coco_class_texts.json',
+    pipeline=train_pipeline)
+
+train_dataloader = dict(
+    persistent_workers=persistent_workers,
+    batch_size=train_batch_size_per_gpu,
+    collate_fn=dict(type='yolow_collate'),
+    dataset=coco_train_dataset)
+test_pipeline = [
+    *_base_.test_pipeline[:-1],
+    dict(type='LoadText'),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                   'scale_factor', 'pad_param', 'texts'))
+]
+coco_val_dataset = dict(
+    _delete_=True,
+    type='MultiModalDataset',
+    dataset=dict(
+        type='YOLOv5CocoDataset',
+        data_root='data/coco',
+        ann_file='annotations/instances_val2017.json',
+        data_prefix=dict(img='val2017/'),
+        filter_cfg=dict(filter_empty_gt=False, min_size=32)),
+    class_text_path='data/texts/coco_class_texts.json',
+    pipeline=test_pipeline)
+val_dataloader = dict(dataset=coco_val_dataset)
+test_dataloader = val_dataloader
+# training settings
+default_hooks = dict(
+    param_scheduler=dict(
+        scheduler_type='linear',
+        lr_factor=0.01,
+        max_epochs=max_epochs),
+    checkpoint=dict(
+        max_keep_ckpts=-1,
+        save_best=None,
+        interval=save_epoch_intervals))
+custom_hooks = [
+    dict(
+        type='EMAHook',
+        ema_type='ExpMomentumEMA',
+        momentum=0.0001,
+        update_buffers=True,
+        strict_load=False,
+        priority=49),
+    dict(
+        type='mmdet.PipelineSwitchHook',
+        switch_epoch=max_epochs - close_mosaic_epochs,
+        switch_pipeline=train_pipeline_stage2)
+]
+train_cfg = dict(
+    max_epochs=max_epochs,
+    val_interval=5,
+    dynamic_intervals=[((max_epochs - close_mosaic_epochs),
+                        _base_.val_interval_stage2)])
+optim_wrapper = dict(
+    optimizer=dict(
+        _delete_=True,
+        type='AdamW',
+        lr=base_lr,
+        weight_decay=weight_decay,
+        batch_size_per_gpu=train_batch_size_per_gpu),
+    paramwise_cfg=dict(
+        custom_keys={'backbone.text_model': dict(lr_mult=0.01),
+                     'logit_scale': dict(weight_decay=0.0)}),
+    constructor='YOLOWv5OptimizerConstructor')
+# evaluation settings
+val_evaluator = dict(
+    _delete_=True,
+    type='mmdet.CocoMetric',
+    proposal_nums=(100, 1, 10),
+    ann_file='data/coco/annotations/instances_val2017.json',
+    metric='bbox')
diff --git a/mmdetection_practice/configs/finetune_coco/yolo_world_v2_l_vlpan_bn_sgd_1e-3_40e_8gpus_finetune_coco.py b/mmdetection_practice/configs/finetune_coco/yolo_world_v2_l_vlpan_bn_sgd_1e-3_40e_8gpus_finetune_coco.py
new file mode 100644
index 0000000..8bb4fce
--- /dev/null
+++ b/mmdetection_practice/configs/finetune_coco/yolo_world_v2_l_vlpan_bn_sgd_1e-3_40e_8gpus_finetune_coco.py
@@ -0,0 +1,160 @@
+_base_ = ('../../third_party/mmyolo/configs/yolov8/'
+          'yolov8_l_syncbn_fast_8xb16-500e_coco.py')
+custom_imports = dict(imports=['yolo_world'], allow_failed_imports=False)
+
+# hyper-parameters
+num_classes = 80
+num_training_classes = 80
+max_epochs = 40  # Maximum training epochs
+close_mosaic_epochs = 30
+save_epoch_intervals = 5
+text_channels = 512
+neck_embed_channels = [128, 256, _base_.last_stage_out_channels // 2]
+neck_num_heads = [4, 8, _base_.last_stage_out_channels // 2 // 32]
+base_lr = 1e-3
+weight_decay = 0.0005
+train_batch_size_per_gpu = 16
+load_from = 'pretrained_models/yolo_world_l_clip_t2i_bn_2e-3adamw_32xb16-100e_obj365v1_goldg_cc3mlite_train-ca93cd1f.pth'
+text_model_name = '../pretrained_models/clip-vit-base-patch32-projection'
+text_model_name = 'openai/clip-vit-base-patch32'
+persistent_workers = False
+
+# model settings
+model = dict(type='YOLOWorldDetector',
+             mm_neck=True,
+             num_train_classes=num_training_classes,
+             num_test_classes=num_classes,
+             data_preprocessor=dict(type='YOLOWDetDataPreprocessor'),
+             backbone=dict(_delete_=True,
+                           type='MultiModalYOLOBackbone',
+                           image_model={{_base_.model.backbone}},
+                           text_model=dict(type='HuggingCLIPLanguageBackbone',
+                                           model_name=text_model_name,
+                                           frozen_modules=['all'])),
+             neck=dict(type='YOLOWorldPAFPN',
+                       guide_channels=text_channels,
+                       embed_channels=neck_embed_channels,
+                       num_heads=neck_num_heads,
+                       block_cfg=dict(type='MaxSigmoidCSPLayerWithTwoConv')),
+             bbox_head=dict(type='YOLOWorldHead',
+                            head_module=dict(
+                                type='YOLOWorldHeadModule',
+                                use_bn_head=True,
+                                embed_dims=text_channels,
+                                num_classes=num_training_classes)),
+             train_cfg=dict(assigner=dict(num_classes=num_training_classes)))
+
+# dataset settings
+text_transform = [
+    dict(type='RandomLoadText',
+         num_neg_samples=(num_classes, num_classes),
+         max_num_samples=num_training_classes,
+         padding_to_max=True,
+         padding_value=''),
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                    'flip_direction', 'texts'))
+]
+mosaic_affine_transform = [
+    dict(type='MultiModalMosaic',
+         img_scale=_base_.img_scale,
+         pad_val=114.0,
+         pre_transform=_base_.pre_transform),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        max_aspect_ratio=100.,
+        scaling_ratio_range=(1 - _base_.affine_scale, 1 + _base_.affine_scale),
+        # img_scale is (width, height)
+        border=(-_base_.img_scale[0] // 2, -_base_.img_scale[1] // 2),
+        border_val=(114, 114, 114))
+]
+
+train_pipeline = [
+    *_base_.pre_transform, *mosaic_affine_transform,
+    dict(type='YOLOv5MultiModalMixUp',
+         prob=_base_.mixup_prob,
+         pre_transform=[*_base_.pre_transform, *mosaic_affine_transform]),
+    *_base_.last_transform[:-1], *text_transform
+]
+train_pipeline_stage2 = [*_base_.train_pipeline_stage2[:-1], *text_transform]
+
+coco_train_dataset = dict(_delete_=True,
+                          type='MultiModalDataset',
+                          dataset=dict(
+                              type='YOLOv5CocoDataset',
+                              data_root='data/coco',
+                              ann_file='annotations/instances_train2017.json',
+                              data_prefix=dict(img='train2017/'),
+                              filter_cfg=dict(filter_empty_gt=False,
+                                              min_size=32)),
+                          class_text_path='data/texts/coco_class_texts.json',
+                          pipeline=train_pipeline)
+
+train_dataloader = dict(persistent_workers=persistent_workers,
+                        batch_size=train_batch_size_per_gpu,
+                        collate_fn=dict(type='yolow_collate'),
+                        dataset=coco_train_dataset)
+test_pipeline = [
+    *_base_.test_pipeline[:-1],
+    dict(type='LoadText'),
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                    'scale_factor', 'pad_param', 'texts'))
+]
+coco_val_dataset = dict(
+    _delete_=True,
+    type='MultiModalDataset',
+    dataset=dict(type='YOLOv5CocoDataset',
+                 data_root='data/coco',
+                 ann_file='annotations/instances_val2017.json',
+                 data_prefix=dict(img='val2017/'),
+                 filter_cfg=dict(filter_empty_gt=False, min_size=32)),
+    class_text_path='data/texts/coco_class_texts.json',
+    pipeline=test_pipeline)
+val_dataloader = dict(dataset=coco_val_dataset)
+test_dataloader = val_dataloader
+# training settings
+default_hooks = dict(param_scheduler=dict(scheduler_type='linear',
+                                          lr_factor=0.01,
+                                          max_epochs=max_epochs),
+                     checkpoint=dict(max_keep_ckpts=-1,
+                                     save_best=None,
+                                     interval=save_epoch_intervals))
+custom_hooks = [
+    dict(type='EMAHook',
+         ema_type='ExpMomentumEMA',
+         momentum=0.0001,
+         update_buffers=True,
+         strict_load=False,
+         priority=49),
+    dict(type='mmdet.PipelineSwitchHook',
+         switch_epoch=max_epochs - close_mosaic_epochs,
+         switch_pipeline=train_pipeline_stage2)
+]
+train_cfg = dict(max_epochs=max_epochs,
+                 val_interval=5,
+                 dynamic_intervals=[((max_epochs - close_mosaic_epochs),
+                                     _base_.val_interval_stage2)])
+optim_wrapper = dict(optimizer=dict(
+    _delete_=True,
+    type='SGD',
+    lr=base_lr,
+    momentum=0.937,
+    nesterov=True,
+    weight_decay=weight_decay,
+    batch_size_per_gpu=train_batch_size_per_gpu),
+                     paramwise_cfg=dict(
+                         custom_keys={
+                             'backbone.text_model': dict(lr_mult=0.01),
+                             'logit_scale': dict(weight_decay=0.0)
+                         }),
+                     constructor='YOLOWv5OptimizerConstructor')
+
+# evaluation settings
+val_evaluator = dict(_delete_=True,
+                     type='mmdet.CocoMetric',
+                     proposal_nums=(100, 1, 10),
+                     ann_file='data/coco/annotations/instances_val2017.json',
+                     metric='bbox')
diff --git a/mmdetection_practice/configs/finetune_coco/yolo_world_v2_l_vlpan_bn_sgd_1e-3_80e_8gpus_mask-refine_finetune_coco.py b/mmdetection_practice/configs/finetune_coco/yolo_world_v2_l_vlpan_bn_sgd_1e-3_80e_8gpus_mask-refine_finetune_coco.py
new file mode 100644
index 0000000..1b0bf75
--- /dev/null
+++ b/mmdetection_practice/configs/finetune_coco/yolo_world_v2_l_vlpan_bn_sgd_1e-3_80e_8gpus_mask-refine_finetune_coco.py
@@ -0,0 +1,161 @@
+_base_ = ('../../third_party/mmyolo/configs/yolov8/'
+          'yolov8_l_mask-refine_syncbn_fast_8xb16-500e_coco.py')
+custom_imports = dict(imports=['yolo_world'], allow_failed_imports=False)
+
+# hyper-parameters
+num_classes = 80
+num_training_classes = 80
+max_epochs = 80  # Maximum training epochs
+close_mosaic_epochs = 10
+save_epoch_intervals = 5
+text_channels = 512
+neck_embed_channels = [128, 256, _base_.last_stage_out_channels // 2]
+neck_num_heads = [4, 8, _base_.last_stage_out_channels // 2 // 32]
+base_lr = 1e-3
+weight_decay = 0.0005
+train_batch_size_per_gpu = 16
+load_from = 'pretrained_models/yolo_world_l_clip_t2i_bn_2e-3adamw_32xb16-100e_obj365v1_goldg_cc3mlite_train-ca93cd1f.pth'
+text_model_name = '../pretrained_models/clip-vit-base-patch32-projection'
+text_model_name = 'openai/clip-vit-base-patch32'
+persistent_workers = False
+
+# model settings
+model = dict(type='YOLOWorldDetector',
+             mm_neck=True,
+             num_train_classes=num_training_classes,
+             num_test_classes=num_classes,
+             data_preprocessor=dict(type='YOLOWDetDataPreprocessor'),
+             backbone=dict(_delete_=True,
+                           type='MultiModalYOLOBackbone',
+                           image_model={{_base_.model.backbone}},
+                           text_model=dict(type='HuggingCLIPLanguageBackbone',
+                                           model_name=text_model_name,
+                                           frozen_modules=['all'])),
+             neck=dict(type='YOLOWorldPAFPN',
+                       guide_channels=text_channels,
+                       embed_channels=neck_embed_channels,
+                       num_heads=neck_num_heads,
+                       block_cfg=dict(type='MaxSigmoidCSPLayerWithTwoConv')),
+             bbox_head=dict(type='YOLOWorldHead',
+                            head_module=dict(
+                                type='YOLOWorldHeadModule',
+                                use_bn_head=True,
+                                embed_dims=text_channels,
+                                num_classes=num_training_classes)),
+             train_cfg=dict(assigner=dict(num_classes=num_training_classes)))
+
+# dataset settings
+text_transform = [
+    dict(type='RandomLoadText',
+         num_neg_samples=(num_classes, num_classes),
+         max_num_samples=num_training_classes,
+         padding_to_max=True,
+         padding_value=''),
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                    'flip_direction', 'texts'))
+]
+mosaic_affine_transform = [
+    dict(type='MultiModalMosaic',
+         img_scale=_base_.img_scale,
+         pad_val=114.0,
+         pre_transform=_base_.pre_transform),
+    dict(type='YOLOv5CopyPaste', prob=_base_.copypaste_prob),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        max_aspect_ratio=100.,
+        scaling_ratio_range=(1 - _base_.affine_scale, 1 + _base_.affine_scale),
+        # img_scale is (width, height)
+        border=(-_base_.img_scale[0] // 2, -_base_.img_scale[1] // 2),
+        border_val=(114, 114, 114),
+        min_area_ratio=_base_.min_area_ratio,
+        use_mask_refine=_base_.use_mask2refine)
+]
+train_pipeline = [
+    *_base_.pre_transform, *mosaic_affine_transform,
+    dict(type='YOLOv5MultiModalMixUp',
+         prob=_base_.mixup_prob,
+         pre_transform=[*_base_.pre_transform, *mosaic_affine_transform]),
+    *_base_.last_transform[:-1], *text_transform
+]
+train_pipeline_stage2 = [*_base_.train_pipeline_stage2[:-1], *text_transform]
+coco_train_dataset = dict(_delete_=True,
+                          type='MultiModalDataset',
+                          dataset=dict(
+                              type='YOLOv5CocoDataset',
+                              data_root='data/coco',
+                              ann_file='annotations/instances_train2017.json',
+                              data_prefix=dict(img='train2017/'),
+                              filter_cfg=dict(filter_empty_gt=False,
+                                              min_size=32)),
+                          class_text_path='data/texts/coco_class_texts.json',
+                          pipeline=train_pipeline)
+
+train_dataloader = dict(persistent_workers=persistent_workers,
+                        batch_size=train_batch_size_per_gpu,
+                        collate_fn=dict(type='yolow_collate'),
+                        dataset=coco_train_dataset)
+test_pipeline = [
+    *_base_.test_pipeline[:-1],
+    dict(type='LoadText'),
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                    'scale_factor', 'pad_param', 'texts'))
+]
+coco_val_dataset = dict(
+    _delete_=True,
+    type='MultiModalDataset',
+    dataset=dict(type='YOLOv5CocoDataset',
+                 data_root='data/coco',
+                 ann_file='annotations/instances_val2017.json',
+                 data_prefix=dict(img='val2017/'),
+                 filter_cfg=dict(filter_empty_gt=False, min_size=32)),
+    class_text_path='data/texts/coco_class_texts.json',
+    pipeline=test_pipeline)
+val_dataloader = dict(dataset=coco_val_dataset)
+test_dataloader = val_dataloader
+# training settings
+default_hooks = dict(param_scheduler=dict(scheduler_type='linear',
+                                          lr_factor=0.01,
+                                          max_epochs=max_epochs),
+                     checkpoint=dict(max_keep_ckpts=-1,
+                                     save_best=None,
+                                     interval=save_epoch_intervals))
+custom_hooks = [
+    dict(type='EMAHook',
+         ema_type='ExpMomentumEMA',
+         momentum=0.0001,
+         update_buffers=True,
+         strict_load=False,
+         priority=49),
+    dict(type='mmdet.PipelineSwitchHook',
+         switch_epoch=max_epochs - close_mosaic_epochs,
+         switch_pipeline=train_pipeline_stage2)
+]
+train_cfg = dict(max_epochs=max_epochs,
+                 val_interval=5,
+                 dynamic_intervals=[((max_epochs - close_mosaic_epochs),
+                                     _base_.val_interval_stage2)])
+optim_wrapper = dict(optimizer=dict(
+    _delete_=True,
+    type='SGD',
+    lr=base_lr,
+    momentum=0.937,
+    nesterov=True,
+    weight_decay=weight_decay,
+    batch_size_per_gpu=train_batch_size_per_gpu),
+                     paramwise_cfg=dict(
+                         custom_keys={
+                             'backbone.text_model': dict(lr_mult=0.01),
+                             'logit_scale': dict(weight_decay=0.0)
+                         }),
+                     constructor='YOLOWv5OptimizerConstructor')
+
+# evaluation settings
+val_evaluator = dict(_delete_=True,
+                     type='mmdet.CocoMetric',
+                     proposal_nums=(100, 1, 10),
+                     ann_file='data/coco/annotations/instances_val2017.json',
+                     metric='bbox')
diff --git a/mmdetection_practice/configs/finetune_coco/yolo_world_v2_m_vlpan_bn_2e-4_80e_8gpus_mask-refine_finetune_coco.py b/mmdetection_practice/configs/finetune_coco/yolo_world_v2_m_vlpan_bn_2e-4_80e_8gpus_mask-refine_finetune_coco.py
new file mode 100644
index 0000000..32fcc51
--- /dev/null
+++ b/mmdetection_practice/configs/finetune_coco/yolo_world_v2_m_vlpan_bn_2e-4_80e_8gpus_mask-refine_finetune_coco.py
@@ -0,0 +1,182 @@
+_base_ = (
+    '../../third_party/mmyolo/configs/yolov8/'
+    'yolov8_m_mask-refine_syncbn_fast_8xb16-500e_coco.py')
+custom_imports = dict(
+    imports=['yolo_world'],
+    allow_failed_imports=False)
+
+# hyper-parameters
+num_classes = 80
+num_training_classes = 80
+max_epochs = 80  # Maximum training epochs
+close_mosaic_epochs = 10
+save_epoch_intervals = 5
+text_channels = 512
+neck_embed_channels = [128, 256, _base_.last_stage_out_channels // 2]
+neck_num_heads = [4, 8, _base_.last_stage_out_channels // 2 // 32]
+base_lr = 2e-4
+weight_decay = 0.05
+train_batch_size_per_gpu = 16
+load_from = 'pretrained_models/yolo_world_m_clip_t2i_bn_2e-3adamw_32xb16-100e_obj365v1_goldg_train-c6237d5b.pth'
+# text_model_name = '../pretrained_models/clip-vit-base-patch32-projection'
+text_model_name = 'openai/clip-vit-base-patch32'
+persistent_workers = False
+
+# model settings
+model = dict(
+    type='YOLOWorldDetector',
+    mm_neck=True,
+    num_train_classes=num_training_classes,
+    num_test_classes=num_classes,
+    data_preprocessor=dict(type='YOLOWDetDataPreprocessor'),
+    backbone=dict(
+        _delete_=True,
+        type='MultiModalYOLOBackbone',
+        image_model={{_base_.model.backbone}},
+        text_model=dict(
+            type='HuggingCLIPLanguageBackbone',
+            model_name=text_model_name,
+            frozen_modules=['all'])),
+    neck=dict(type='YOLOWorldPAFPN',
+              guide_channels=text_channels,
+              embed_channels=neck_embed_channels,
+              num_heads=neck_num_heads,
+              block_cfg=dict(type='MaxSigmoidCSPLayerWithTwoConv')),
+    bbox_head=dict(type='YOLOWorldHead',
+                   head_module=dict(type='YOLOWorldHeadModule',
+                                    use_bn_head=True,
+                                    embed_dims=text_channels,
+                                    num_classes=num_training_classes)),
+    train_cfg=dict(assigner=dict(num_classes=num_training_classes)))
+
+# dataset settings
+text_transform = [
+    dict(type='RandomLoadText',
+         num_neg_samples=(num_classes, num_classes),
+         max_num_samples=num_training_classes,
+         padding_to_max=True,
+         padding_value=''),
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                    'flip_direction', 'texts'))
+]
+mosaic_affine_transform = [
+    dict(
+        type='MultiModalMosaic',
+        img_scale=_base_.img_scale,
+        pad_val=114.0,
+        pre_transform=_base_.pre_transform),
+    dict(type='YOLOv5CopyPaste', prob=_base_.copypaste_prob),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        max_aspect_ratio=100.,
+        scaling_ratio_range=(1 - _base_.affine_scale,
+                             1 + _base_.affine_scale),
+        # img_scale is (width, height)
+        border=(-_base_.img_scale[0] // 2, -_base_.img_scale[1] // 2),
+        border_val=(114, 114, 114),
+        min_area_ratio=_base_.min_area_ratio,
+        use_mask_refine=_base_.use_mask2refine)
+]
+train_pipeline = [
+    *_base_.pre_transform,
+    *mosaic_affine_transform,
+    dict(
+        type='YOLOv5MultiModalMixUp',
+        prob=_base_.mixup_prob,
+        pre_transform=[*_base_.pre_transform,
+                       *mosaic_affine_transform]),
+    *_base_.last_transform[:-1],
+    *text_transform
+]
+train_pipeline_stage2 = [
+    *_base_.train_pipeline_stage2[:-1],
+    *text_transform
+]
+coco_train_dataset = dict(
+    _delete_=True,
+    type='MultiModalDataset',
+    dataset=dict(
+        type='YOLOv5CocoDataset',
+        data_root='data/coco',
+        ann_file='annotations/instances_train2017.json',
+        data_prefix=dict(img='train2017/'),
+        filter_cfg=dict(filter_empty_gt=False, min_size=32)),
+    class_text_path='data/texts/coco_class_texts.json',
+    pipeline=train_pipeline)
+
+train_dataloader = dict(
+    persistent_workers=persistent_workers,
+    batch_size=train_batch_size_per_gpu,
+    collate_fn=dict(type='yolow_collate'),
+    dataset=coco_train_dataset)
+test_pipeline = [
+    *_base_.test_pipeline[:-1],
+    dict(type='LoadText'),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                   'scale_factor', 'pad_param', 'texts'))
+]
+coco_val_dataset = dict(
+    _delete_=True,
+    type='MultiModalDataset',
+    dataset=dict(
+        type='YOLOv5CocoDataset',
+        data_root='data/coco',
+        ann_file='annotations/instances_val2017.json',
+        data_prefix=dict(img='val2017/'),
+        filter_cfg=dict(filter_empty_gt=False, min_size=32)),
+    class_text_path='data/texts/coco_class_texts.json',
+    pipeline=test_pipeline)
+val_dataloader = dict(dataset=coco_val_dataset)
+test_dataloader = val_dataloader
+# training settings
+default_hooks = dict(
+    param_scheduler=dict(
+        scheduler_type='linear',
+        lr_factor=0.01,
+        max_epochs=max_epochs),
+    checkpoint=dict(
+        max_keep_ckpts=-1,
+        save_best=None,
+        interval=save_epoch_intervals))
+custom_hooks = [
+    dict(
+        type='EMAHook',
+        ema_type='ExpMomentumEMA',
+        momentum=0.0001,
+        update_buffers=True,
+        strict_load=False,
+        priority=49),
+    dict(
+        type='mmdet.PipelineSwitchHook',
+        switch_epoch=max_epochs - close_mosaic_epochs,
+        switch_pipeline=train_pipeline_stage2)
+]
+train_cfg = dict(
+    max_epochs=max_epochs,
+    val_interval=5,
+    dynamic_intervals=[((max_epochs - close_mosaic_epochs),
+                        _base_.val_interval_stage2)])
+optim_wrapper = dict(
+    optimizer=dict(
+        _delete_=True,
+        type='AdamW',
+        lr=base_lr,
+        weight_decay=weight_decay,
+        batch_size_per_gpu=train_batch_size_per_gpu),
+    paramwise_cfg=dict(
+        custom_keys={'backbone.text_model': dict(lr_mult=0.01),
+                     'logit_scale': dict(weight_decay=0.0)}),
+    constructor='YOLOWv5OptimizerConstructor')
+
+# evaluation settings
+val_evaluator = dict(
+    _delete_=True,
+    type='mmdet.CocoMetric',
+    proposal_nums=(100, 1, 10),
+    ann_file='data/coco/annotations/instances_val2017.json',
+    metric='bbox')
diff --git a/mmdetection_practice/configs/finetune_coco/yolo_world_v2_s_bn_2e-4_80e_8gpus_mask-refine_finetune_coco.py b/mmdetection_practice/configs/finetune_coco/yolo_world_v2_s_bn_2e-4_80e_8gpus_mask-refine_finetune_coco.py
new file mode 100644
index 0000000..4980110
--- /dev/null
+++ b/mmdetection_practice/configs/finetune_coco/yolo_world_v2_s_bn_2e-4_80e_8gpus_mask-refine_finetune_coco.py
@@ -0,0 +1,145 @@
+_base_ = ('../../third_party/mmyolo/configs/yolov8/'
+          'yolov8_s_mask-refine_syncbn_fast_8xb16-500e_coco.py')
+custom_imports = dict(imports=['yolo_world'], allow_failed_imports=False)
+
+# hyper-parameters
+num_classes = 80
+num_training_classes = 80
+max_epochs = 80  # Maximum training epochs
+close_mosaic_epochs = 10
+save_epoch_intervals = 5
+text_channels = 512
+neck_embed_channels = [128, 256, _base_.last_stage_out_channels // 2]
+neck_num_heads = [4, 8, _base_.last_stage_out_channels // 2 // 32]
+base_lr = 2e-4
+weight_decay = 0.05
+train_batch_size_per_gpu = 16
+load_from = '../FastDet/output_models/pretrain_yolow-v8_s_clipv2_frozen_te_noprompt_t2i_bn_2e-3adamw_scale_lr_wd_32xb16-100e_obj365v1_goldg_cc3mram250k_train_lviseval-e3592307_rep_conv.pth'
+persistent_workers = False
+mixup_prob = 0.15
+copypaste_prob = 0.3
+
+# model settings
+model = dict(type='SimpleYOLOWorldDetector',
+             mm_neck=True,
+             num_train_classes=num_classes,
+             num_test_classes=num_classes,
+             reparameterized=True,
+             data_preprocessor=dict(type='YOLOv5DetDataPreprocessor'),
+             backbone=dict(_delete_=True,
+                           type='MultiModalYOLOBackbone',
+                           text_model=None,
+                           image_model={{_base_.model.backbone}},
+                           with_text_model=False),
+             neck=dict(type='YOLOWorldPAFPN',
+                       guide_channels=text_channels,
+                       embed_channels=neck_embed_channels,
+                       num_heads=neck_num_heads,
+                       block_cfg=dict(type='EfficientCSPLayerWithTwoConv')),
+             bbox_head=dict(head_module=dict(type='RepYOLOWorldHeadModule',
+                                             embed_dims=text_channels,
+                                             num_guide=num_classes,
+                                             num_classes=num_classes)),
+             train_cfg=dict(assigner=dict(num_classes=num_classes)))
+
+# dataset settings
+final_transform = [
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                    'flip_direction'))
+]
+mosaic_affine_transform = [
+    dict(type='Mosaic',
+         img_scale=_base_.img_scale,
+         pad_val=114.0,
+         pre_transform=_base_.pre_transform),
+    dict(type='YOLOv5CopyPaste', prob=copypaste_prob),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        max_aspect_ratio=100.,
+        scaling_ratio_range=(1 - _base_.affine_scale, 1 + _base_.affine_scale),
+        # img_scale is (width, height)
+        border=(-_base_.img_scale[0] // 2, -_base_.img_scale[1] // 2),
+        border_val=(114, 114, 114),
+        min_area_ratio=_base_.min_area_ratio,
+        use_mask_refine=_base_.use_mask2refine)
+]
+train_pipeline = [
+    *_base_.pre_transform, *mosaic_affine_transform,
+    dict(type='YOLOv5MixUp',
+         prob=mixup_prob,
+         pre_transform=[*_base_.pre_transform, *mosaic_affine_transform]),
+    *_base_.last_transform[:-1], *final_transform
+]
+
+train_pipeline_stage2 = [*_base_.train_pipeline_stage2[:-1], *final_transform]
+
+coco_train_dataset = dict(type='YOLOv5CocoDataset',
+                          data_root='data/coco',
+                          ann_file='annotations/instances_train2017.json',
+                          data_prefix=dict(img='train2017/'),
+                          filter_cfg=dict(filter_empty_gt=False, min_size=32),
+                          pipeline=train_pipeline)
+
+train_dataloader = dict(persistent_workers=persistent_workers,
+                        batch_size=train_batch_size_per_gpu,
+                        collate_fn=dict(type='yolow_collate'),
+                        dataset=coco_train_dataset)
+
+train_dataloader = dict(persistent_workers=persistent_workers,
+                        batch_size=train_batch_size_per_gpu,
+                        collate_fn=dict(type='yolow_collate'),
+                        dataset=coco_train_dataset)
+test_pipeline = [
+    *_base_.test_pipeline[:-1],
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                    'scale_factor', 'pad_param'))
+]
+coco_val_dataset = dict(type='YOLOv5CocoDataset',
+                        data_root='data/coco',
+                        ann_file='annotations/instances_val2017.json',
+                        data_prefix=dict(img='val2017/'),
+                        filter_cfg=dict(filter_empty_gt=False, min_size=32),
+                        pipeline=test_pipeline)
+
+val_dataloader = dict(dataset=coco_val_dataset)
+test_dataloader = val_dataloader
+# training settings
+default_hooks = dict(param_scheduler=dict(scheduler_type='linear',
+                                          lr_factor=0.01,
+                                          max_epochs=max_epochs),
+                     checkpoint=dict(max_keep_ckpts=-1,
+                                     save_best=None,
+                                     interval=save_epoch_intervals))
+custom_hooks = [
+    dict(type='EMAHook',
+         ema_type='ExpMomentumEMA',
+         momentum=0.0001,
+         update_buffers=True,
+         strict_load=False,
+         priority=49),
+    dict(type='mmdet.PipelineSwitchHook',
+         switch_epoch=max_epochs - close_mosaic_epochs,
+         switch_pipeline=train_pipeline_stage2)
+]
+train_cfg = dict(max_epochs=max_epochs,
+                 val_interval=5,
+                 dynamic_intervals=[((max_epochs - close_mosaic_epochs),
+                                     _base_.val_interval_stage2)])
+optim_wrapper = dict(optimizer=dict(
+    _delete_=True,
+    type='AdamW',
+    lr=base_lr,
+    weight_decay=weight_decay,
+    batch_size_per_gpu=train_batch_size_per_gpu),
+                     constructor='YOLOWv5OptimizerConstructor')
+
+# evaluation settings
+val_evaluator = dict(_delete_=True,
+                     type='mmdet.CocoMetric',
+                     proposal_nums=(100, 1, 10),
+                     ann_file='data/coco/annotations/instances_val2017.json',
+                     metric='bbox')
diff --git a/mmdetection_practice/configs/finetune_coco/yolo_world_v2_s_rep_vlpan_bn_2e-4_80e_8gpus_mask-refine_finetune_coco.py b/mmdetection_practice/configs/finetune_coco/yolo_world_v2_s_rep_vlpan_bn_2e-4_80e_8gpus_mask-refine_finetune_coco.py
new file mode 100644
index 0000000..9fe682c
--- /dev/null
+++ b/mmdetection_practice/configs/finetune_coco/yolo_world_v2_s_rep_vlpan_bn_2e-4_80e_8gpus_mask-refine_finetune_coco.py
@@ -0,0 +1,146 @@
+_base_ = ('../../third_party/mmyolo/configs/yolov8/'
+          'yolov8_s_mask-refine_syncbn_fast_8xb16-500e_coco.py')
+custom_imports = dict(imports=['yolo_world'], allow_failed_imports=False)
+
+# hyper-parameters
+num_classes = 80
+num_training_classes = 80
+max_epochs = 80  # Maximum training epochs
+close_mosaic_epochs = 10
+save_epoch_intervals = 5
+text_channels = 512
+neck_embed_channels = [128, 256, _base_.last_stage_out_channels // 2]
+neck_num_heads = [4, 8, _base_.last_stage_out_channels // 2 // 32]
+base_lr = 2e-4
+weight_decay = 0.05
+train_batch_size_per_gpu = 16
+load_from = '../FastDet/output_models/yolo_world_s_clip_t2i_bn_2e-3adamw_32xb16-100e_obj365v1_goldg_train-55b943ea_rep_conv.pth'
+persistent_workers = False
+mixup_prob = 0.15
+copypaste_prob = 0.3
+
+# model settings
+model = dict(type='SimpleYOLOWorldDetector',
+             mm_neck=True,
+             num_train_classes=num_classes,
+             num_test_classes=num_classes,
+             reparameterized=True,
+             data_preprocessor=dict(type='YOLOv5DetDataPreprocessor'),
+             backbone=dict(_delete_=True,
+                           type='MultiModalYOLOBackbone',
+                           text_model=None,
+                           image_model={{_base_.model.backbone}},
+                           with_text_model=False),
+             neck=dict(type='YOLOWorldPAFPN',
+                       guide_channels=num_classes,
+                       embed_channels=neck_embed_channels,
+                       num_heads=neck_num_heads,
+                       block_cfg=dict(type='RepConvMaxSigmoidCSPLayerWithTwoConv',
+                                      guide_channels=num_classes)),
+             bbox_head=dict(head_module=dict(type='RepYOLOWorldHeadModule',
+                                             embed_dims=text_channels,
+                                             num_guide=num_classes,
+                                             num_classes=num_classes)),
+             train_cfg=dict(assigner=dict(num_classes=num_classes)))
+
+# dataset settings
+final_transform = [
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                    'flip_direction'))
+]
+mosaic_affine_transform = [
+    dict(type='Mosaic',
+         img_scale=_base_.img_scale,
+         pad_val=114.0,
+         pre_transform=_base_.pre_transform),
+    dict(type='YOLOv5CopyPaste', prob=copypaste_prob),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        max_aspect_ratio=100.,
+        scaling_ratio_range=(1 - _base_.affine_scale, 1 + _base_.affine_scale),
+        # img_scale is (width, height)
+        border=(-_base_.img_scale[0] // 2, -_base_.img_scale[1] // 2),
+        border_val=(114, 114, 114),
+        min_area_ratio=_base_.min_area_ratio,
+        use_mask_refine=_base_.use_mask2refine)
+]
+train_pipeline = [
+    *_base_.pre_transform, *mosaic_affine_transform,
+    dict(type='YOLOv5MixUp',
+         prob=mixup_prob,
+         pre_transform=[*_base_.pre_transform, *mosaic_affine_transform]),
+    *_base_.last_transform[:-1], *final_transform
+]
+
+train_pipeline_stage2 = [*_base_.train_pipeline_stage2[:-1], *final_transform]
+
+coco_train_dataset = dict(type='YOLOv5CocoDataset',
+                          data_root='data/coco',
+                          ann_file='annotations/instances_train2017.json',
+                          data_prefix=dict(img='train2017/'),
+                          filter_cfg=dict(filter_empty_gt=False, min_size=32),
+                          pipeline=train_pipeline)
+
+train_dataloader = dict(persistent_workers=persistent_workers,
+                        batch_size=train_batch_size_per_gpu,
+                        collate_fn=dict(type='yolow_collate'),
+                        dataset=coco_train_dataset)
+
+train_dataloader = dict(persistent_workers=persistent_workers,
+                        batch_size=train_batch_size_per_gpu,
+                        collate_fn=dict(type='yolow_collate'),
+                        dataset=coco_train_dataset)
+test_pipeline = [
+    *_base_.test_pipeline[:-1],
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                    'scale_factor', 'pad_param'))
+]
+coco_val_dataset = dict(type='YOLOv5CocoDataset',
+                        data_root='data/coco',
+                        ann_file='annotations/instances_val2017.json',
+                        data_prefix=dict(img='val2017/'),
+                        filter_cfg=dict(filter_empty_gt=False, min_size=32),
+                        pipeline=test_pipeline)
+
+val_dataloader = dict(dataset=coco_val_dataset)
+test_dataloader = val_dataloader
+# training settings
+default_hooks = dict(param_scheduler=dict(scheduler_type='linear',
+                                          lr_factor=0.01,
+                                          max_epochs=max_epochs),
+                     checkpoint=dict(max_keep_ckpts=-1,
+                                     save_best=None,
+                                     interval=save_epoch_intervals))
+custom_hooks = [
+    dict(type='EMAHook',
+         ema_type='ExpMomentumEMA',
+         momentum=0.0001,
+         update_buffers=True,
+         strict_load=False,
+         priority=49),
+    dict(type='mmdet.PipelineSwitchHook',
+         switch_epoch=max_epochs - close_mosaic_epochs,
+         switch_pipeline=train_pipeline_stage2)
+]
+train_cfg = dict(max_epochs=max_epochs,
+                 val_interval=5,
+                 dynamic_intervals=[((max_epochs - close_mosaic_epochs),
+                                     _base_.val_interval_stage2)])
+optim_wrapper = dict(optimizer=dict(
+    _delete_=True,
+    type='AdamW',
+    lr=base_lr,
+    weight_decay=weight_decay,
+    batch_size_per_gpu=train_batch_size_per_gpu),
+                     constructor='YOLOWv5OptimizerConstructor')
+
+# evaluation settings
+val_evaluator = dict(_delete_=True,
+                     type='mmdet.CocoMetric',
+                     proposal_nums=(100, 1, 10),
+                     ann_file='data/coco/annotations/instances_val2017.json',
+                     metric='bbox')
diff --git a/mmdetection_practice/configs/finetune_coco/yolo_world_v2_s_vlpan_bn_2e-4_80e_8gpus_mask-refine_finetune_coco.py b/mmdetection_practice/configs/finetune_coco/yolo_world_v2_s_vlpan_bn_2e-4_80e_8gpus_mask-refine_finetune_coco.py
new file mode 100644
index 0000000..1cacd5d
--- /dev/null
+++ b/mmdetection_practice/configs/finetune_coco/yolo_world_v2_s_vlpan_bn_2e-4_80e_8gpus_mask-refine_finetune_coco.py
@@ -0,0 +1,184 @@
+_base_ = (
+    '../../third_party/mmyolo/configs/yolov8/'
+    'yolov8_s_mask-refine_syncbn_fast_8xb16-500e_coco.py')
+custom_imports = dict(
+    imports=['yolo_world'],
+    allow_failed_imports=False)
+
+# hyper-parameters
+num_classes = 80
+num_training_classes = 80
+max_epochs = 80  # Maximum training epochs
+close_mosaic_epochs = 10
+save_epoch_intervals = 5
+text_channels = 512
+neck_embed_channels = [128, 256, _base_.last_stage_out_channels // 2]
+neck_num_heads = [4, 8, _base_.last_stage_out_channels // 2 // 32]
+base_lr = 2e-4
+weight_decay = 0.05
+train_batch_size_per_gpu = 16
+load_from = 'pretrained_models/yolo_world_s_clip_t2i_bn_2e-3adamw_32xb16-100e_obj365v1_goldg_train-55b943ea.pth'
+text_model_name = '../pretrained_models/clip-vit-base-patch32-projection'
+text_model_name = 'openai/clip-vit-base-patch32'
+persistent_workers = False
+mixup_prob = 0.15
+copypaste_prob = 0.3
+
+# model settings
+model = dict(
+    type='YOLOWorldDetector',
+    mm_neck=True,
+    num_train_classes=num_training_classes,
+    num_test_classes=num_classes,
+    data_preprocessor=dict(type='YOLOWDetDataPreprocessor'),
+    backbone=dict(
+        _delete_=True,
+        type='MultiModalYOLOBackbone',
+        image_model={{_base_.model.backbone}},
+        text_model=dict(
+            type='HuggingCLIPLanguageBackbone',
+            model_name=text_model_name,
+            frozen_modules=['all'])),
+    neck=dict(type='YOLOWorldPAFPN',
+              guide_channels=text_channels,
+              embed_channels=neck_embed_channels,
+              num_heads=neck_num_heads,
+              block_cfg=dict(type='MaxSigmoidCSPLayerWithTwoConv')),
+    bbox_head=dict(type='YOLOWorldHead',
+                   head_module=dict(type='YOLOWorldHeadModule',
+                                    use_bn_head=True,
+                                    embed_dims=text_channels,
+                                    num_classes=num_training_classes)),
+    train_cfg=dict(assigner=dict(num_classes=num_training_classes)))
+
+# dataset settings
+text_transform = [
+    dict(type='RandomLoadText',
+         num_neg_samples=(num_classes, num_classes),
+         max_num_samples=num_training_classes,
+         padding_to_max=True,
+         padding_value=''),
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                    'flip_direction', 'texts'))
+]
+mosaic_affine_transform = [
+    dict(
+        type='MultiModalMosaic',
+        img_scale=_base_.img_scale,
+        pad_val=114.0,
+        pre_transform=_base_.pre_transform),
+    dict(type='YOLOv5CopyPaste', prob=copypaste_prob),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        max_aspect_ratio=100.,
+        scaling_ratio_range=(1 - _base_.affine_scale,
+                             1 + _base_.affine_scale),
+        # img_scale is (width, height)
+        border=(-_base_.img_scale[0] // 2, -_base_.img_scale[1] // 2),
+        border_val=(114, 114, 114),
+        min_area_ratio=_base_.min_area_ratio,
+        use_mask_refine=_base_.use_mask2refine)
+]
+train_pipeline = [
+    *_base_.pre_transform,
+    *mosaic_affine_transform,
+    dict(
+        type='YOLOv5MultiModalMixUp',
+        prob=mixup_prob,
+        pre_transform=[*_base_.pre_transform,
+                       *mosaic_affine_transform]),
+    *_base_.last_transform[:-1],
+    *text_transform
+]
+train_pipeline_stage2 = [
+    *_base_.train_pipeline_stage2[:-1],
+    *text_transform
+]
+coco_train_dataset = dict(
+    _delete_=True,
+    type='MultiModalDataset',
+    dataset=dict(
+        type='YOLOv5CocoDataset',
+        data_root='data/coco',
+        ann_file='annotations/instances_train2017.json',
+        data_prefix=dict(img='train2017/'),
+        filter_cfg=dict(filter_empty_gt=False, min_size=32)),
+    class_text_path='data/texts/coco_class_texts.json',
+    pipeline=train_pipeline)
+
+train_dataloader = dict(
+    persistent_workers=persistent_workers,
+    batch_size=train_batch_size_per_gpu,
+    collate_fn=dict(type='yolow_collate'),
+    dataset=coco_train_dataset)
+test_pipeline = [
+    *_base_.test_pipeline[:-1],
+    dict(type='LoadText'),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                   'scale_factor', 'pad_param', 'texts'))
+]
+coco_val_dataset = dict(
+    _delete_=True,
+    type='MultiModalDataset',
+    dataset=dict(
+        type='YOLOv5CocoDataset',
+        data_root='data/coco',
+        ann_file='annotations/instances_val2017.json',
+        data_prefix=dict(img='val2017/'),
+        filter_cfg=dict(filter_empty_gt=False, min_size=32)),
+    class_text_path='data/texts/coco_class_texts.json',
+    pipeline=test_pipeline)
+val_dataloader = dict(dataset=coco_val_dataset)
+test_dataloader = val_dataloader
+# training settings
+default_hooks = dict(
+    param_scheduler=dict(
+        scheduler_type='linear',
+        lr_factor=0.01,
+        max_epochs=max_epochs),
+    checkpoint=dict(
+        max_keep_ckpts=-1,
+        save_best=None,
+        interval=save_epoch_intervals))
+custom_hooks = [
+    dict(
+        type='EMAHook',
+        ema_type='ExpMomentumEMA',
+        momentum=0.0001,
+        update_buffers=True,
+        strict_load=False,
+        priority=49),
+    dict(
+        type='mmdet.PipelineSwitchHook',
+        switch_epoch=max_epochs - close_mosaic_epochs,
+        switch_pipeline=train_pipeline_stage2)
+]
+train_cfg = dict(
+    max_epochs=max_epochs,
+    val_interval=5,
+    dynamic_intervals=[((max_epochs - close_mosaic_epochs),
+                        _base_.val_interval_stage2)])
+optim_wrapper = dict(
+    optimizer=dict(
+        _delete_=True,
+        type='AdamW',
+        lr=base_lr,
+        weight_decay=weight_decay,
+        batch_size_per_gpu=train_batch_size_per_gpu),
+    paramwise_cfg=dict(
+        custom_keys={'backbone.text_model': dict(lr_mult=0.01),
+                     'logit_scale': dict(weight_decay=0.0)}),
+    constructor='YOLOWv5OptimizerConstructor')
+
+# evaluation settings
+val_evaluator = dict(
+    _delete_=True,
+    type='mmdet.CocoMetric',
+    proposal_nums=(100, 1, 10),
+    ann_file='data/coco/annotations/instances_val2017.json',
+    metric='bbox')
diff --git a/mmdetection_practice/configs/finetune_coco/yolo_world_v2_x_vlpan_bn_2e-4_80e_8gpus_mask-refine_finetune_coco.py b/mmdetection_practice/configs/finetune_coco/yolo_world_v2_x_vlpan_bn_2e-4_80e_8gpus_mask-refine_finetune_coco.py
new file mode 100644
index 0000000..e78c5f3
--- /dev/null
+++ b/mmdetection_practice/configs/finetune_coco/yolo_world_v2_x_vlpan_bn_2e-4_80e_8gpus_mask-refine_finetune_coco.py
@@ -0,0 +1,183 @@
+_base_ = (
+    '../../third_party/mmyolo/configs/yolov8/'
+    'yolov8_x_mask-refine_syncbn_fast_8xb16-500e_coco.py')
+custom_imports = dict(
+    imports=['yolo_world'],
+    allow_failed_imports=False)
+
+# hyper-parameters
+num_classes = 80
+num_training_classes = 80
+max_epochs = 80  # Maximum training epochs
+close_mosaic_epochs = 10
+save_epoch_intervals = 5
+text_channels = 512
+neck_embed_channels = [128, 256, _base_.last_stage_out_channels // 2]
+neck_num_heads = [4, 8, _base_.last_stage_out_channels // 2 // 32]
+base_lr = 2e-4
+weight_decay = 0.05
+train_batch_size_per_gpu = 16
+load_from = 'pretrained_models/yolo_world_x_clip_t2i_bn_2e-3adamw_32xb16-100e_obj365v1_goldg_cc250k_train_lviseval-8698fbfa.pth'
+text_model_name = '../pretrained_models/clip-vit-base-patch32-projection'
+text_model_name = 'openai/clip-vit-base-patch32'
+persistent_workers = False
+
+# model settings
+model = dict(
+    type='YOLOWorldDetector',
+    mm_neck=True,
+    num_train_classes=num_training_classes,
+    num_test_classes=num_classes,
+    data_preprocessor=dict(type='YOLOWDetDataPreprocessor'),
+    backbone=dict(
+        _delete_=True,
+        type='MultiModalYOLOBackbone',
+        image_model={{_base_.model.backbone}},
+        text_model=dict(
+            type='HuggingCLIPLanguageBackbone',
+            model_name=text_model_name,
+            frozen_modules=['all'])),
+    neck=dict(type='YOLOWorldPAFPN',
+              guide_channels=text_channels,
+              embed_channels=neck_embed_channels,
+              num_heads=neck_num_heads,
+              block_cfg=dict(type='MaxSigmoidCSPLayerWithTwoConv')),
+    bbox_head=dict(type='YOLOWorldHead',
+                   head_module=dict(type='YOLOWorldHeadModule',
+                                    use_bn_head=True,
+                                    embed_dims=text_channels,
+                                    num_classes=num_training_classes)),
+    train_cfg=dict(assigner=dict(num_classes=num_training_classes)))
+
+# dataset settings
+text_transform = [
+    dict(type='RandomLoadText',
+         num_neg_samples=(num_classes, num_classes),
+         max_num_samples=num_training_classes,
+         padding_to_max=True,
+         padding_value=''),
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                    'flip_direction', 'texts'))
+]
+mosaic_affine_transform = [
+    dict(
+        type='MultiModalMosaic',
+        img_scale=_base_.img_scale,
+        pad_val=114.0,
+        pre_transform=_base_.pre_transform),
+    dict(type='YOLOv5CopyPaste', prob=_base_.copypaste_prob),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        max_aspect_ratio=100.,
+        scaling_ratio_range=(1 - _base_.affine_scale,
+                             1 + _base_.affine_scale),
+        # img_scale is (width, height)
+        border=(-_base_.img_scale[0] // 2, -_base_.img_scale[1] // 2),
+        border_val=(114, 114, 114),
+        min_area_ratio=_base_.min_area_ratio,
+        use_mask_refine=_base_.use_mask2refine)
+]
+train_pipeline = [
+    *_base_.pre_transform,
+    *mosaic_affine_transform,
+    dict(
+        type='YOLOv5MultiModalMixUp',
+        prob=_base_.mixup_prob,
+        pre_transform=[*_base_.pre_transform,
+                       *mosaic_affine_transform]),
+    *_base_.last_transform[:-1],
+    *text_transform
+]
+train_pipeline_stage2 = [
+    *_base_.train_pipeline_stage2[:-1],
+    *text_transform
+]
+coco_train_dataset = dict(
+    _delete_=True,
+    type='MultiModalDataset',
+    dataset=dict(
+        type='YOLOv5CocoDataset',
+        data_root='data/coco',
+        ann_file='annotations/instances_train2017.json',
+        data_prefix=dict(img='train2017/'),
+        filter_cfg=dict(filter_empty_gt=False, min_size=32)),
+    class_text_path='data/texts/coco_class_texts.json',
+    pipeline=train_pipeline)
+
+train_dataloader = dict(
+    persistent_workers=persistent_workers,
+    batch_size=train_batch_size_per_gpu,
+    collate_fn=dict(type='yolow_collate'),
+    dataset=coco_train_dataset)
+
+test_pipeline = [
+    *_base_.test_pipeline[:-1],
+    dict(type='LoadText'),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                   'scale_factor', 'pad_param', 'texts'))
+]
+
+coco_val_dataset = dict(
+    _delete_=True,
+    type='MultiModalDataset',
+    dataset=dict(
+        type='YOLOv5CocoDataset',
+        data_root='data/coco',
+        ann_file='annotations/instances_val2017.json',
+        data_prefix=dict(img='val2017/'),
+        filter_cfg=dict(filter_empty_gt=False, min_size=32)),
+    class_text_path='data/texts/coco_class_texts.json',
+    pipeline=test_pipeline)
+val_dataloader = dict(dataset=coco_val_dataset)
+test_dataloader = val_dataloader
+# training settings
+default_hooks = dict(
+    param_scheduler=dict(
+        scheduler_type='linear',
+        lr_factor=0.01,
+        max_epochs=max_epochs),
+    checkpoint=dict(
+        max_keep_ckpts=-1,
+        save_best=None,
+        interval=save_epoch_intervals))
+custom_hooks = [
+    dict(
+        type='EMAHook',
+        ema_type='ExpMomentumEMA',
+        momentum=0.0001,
+        update_buffers=True,
+        strict_load=False,
+        priority=49),
+    dict(
+        type='mmdet.PipelineSwitchHook',
+        switch_epoch=max_epochs - close_mosaic_epochs,
+        switch_pipeline=train_pipeline_stage2)
+]
+train_cfg = dict(
+    max_epochs=max_epochs,
+    val_interval=5,
+    dynamic_intervals=[((max_epochs - close_mosaic_epochs),
+                        _base_.val_interval_stage2)])
+optim_wrapper = dict(
+    optimizer=dict(
+        _delete_=True,
+        type='AdamW',
+        lr=base_lr,
+        weight_decay=weight_decay,
+        batch_size_per_gpu=train_batch_size_per_gpu),
+    paramwise_cfg=dict(
+        custom_keys={'backbone.text_model': dict(lr_mult=0.01),
+                     'logit_scale': dict(weight_decay=0.0)}),
+    constructor='YOLOWv5OptimizerConstructor')
+# evaluation settings
+val_evaluator = dict(
+    _delete_=True,
+    type='mmdet.CocoMetric',
+    proposal_nums=(100, 1, 10),
+    ann_file='data/coco/annotations/instances_val2017.json',
+    metric='bbox')
diff --git a/mmdetection_practice/configs/finetune_coco/yolo_world_v2_xl_vlpan_bn_2e-4_80e_8gpus_mask-refine_finetune_coco.py b/mmdetection_practice/configs/finetune_coco/yolo_world_v2_xl_vlpan_bn_2e-4_80e_8gpus_mask-refine_finetune_coco.py
new file mode 100644
index 0000000..125659b
--- /dev/null
+++ b/mmdetection_practice/configs/finetune_coco/yolo_world_v2_xl_vlpan_bn_2e-4_80e_8gpus_mask-refine_finetune_coco.py
@@ -0,0 +1,173 @@
+_base_ = ('../../third_party/mmyolo/configs/yolov8/'
+          'yolov8_x_mask-refine_syncbn_fast_8xb16-500e_coco.py')
+custom_imports = dict(imports=['yolo_world'], allow_failed_imports=False)
+
+# hyper-parameters
+num_classes = 80
+num_training_classes = 80
+max_epochs = 80  # Maximum training epochs
+close_mosaic_epochs = 10
+save_epoch_intervals = 5
+text_channels = 512
+neck_embed_channels = [128, 256, _base_.last_stage_out_channels // 2]
+neck_num_heads = [4, 8, _base_.last_stage_out_channels // 2 // 32]
+base_lr = 2e-4
+weight_decay = 0.05
+train_batch_size_per_gpu = 16
+text_model_name = '../pretrained_models/clip-vit-base-patch32-projection'
+text_model_name = 'openai/clip-vit-base-patch32'
+persistent_workers = False
+
+# scaling model from X to XL
+deepen_factor = 1.0
+widen_factor = 1.5
+
+backbone = _base_.model.backbone
+backbone.update(deepen_factor=deepen_factor, widen_factor=widen_factor)
+
+# model settings
+model = dict(type='YOLOWorldDetector',
+             mm_neck=True,
+             num_train_classes=num_training_classes,
+             num_test_classes=num_classes,
+             data_preprocessor=dict(type='YOLOWDetDataPreprocessor'),
+             backbone=dict(_delete_=True,
+                           type='MultiModalYOLOBackbone',
+                           image_model=backbone,
+                           text_model=dict(type='HuggingCLIPLanguageBackbone',
+                                           model_name=text_model_name,
+                                           frozen_modules=['all'])),
+             neck=dict(type='YOLOWorldPAFPN',
+                       deepen_factor=deepen_factor,
+                       widen_factor=widen_factor,
+                       guide_channels=text_channels,
+                       embed_channels=neck_embed_channels,
+                       num_heads=neck_num_heads,
+                       block_cfg=dict(type='MaxSigmoidCSPLayerWithTwoConv')),
+             bbox_head=dict(type='YOLOWorldHead',
+                            head_module=dict(
+                                type='YOLOWorldHeadModule',
+                                widen_factor=widen_factor,
+                                use_bn_head=True,
+                                embed_dims=text_channels,
+                                num_classes=num_training_classes)),
+             train_cfg=dict(assigner=dict(num_classes=num_training_classes)))
+
+# dataset settings
+text_transform = [
+    dict(type='RandomLoadText',
+         num_neg_samples=(num_classes, num_classes),
+         max_num_samples=num_training_classes,
+         padding_to_max=True,
+         padding_value=''),
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                    'flip_direction', 'texts'))
+]
+mosaic_affine_transform = [
+    dict(type='MultiModalMosaic',
+         img_scale=_base_.img_scale,
+         pad_val=114.0,
+         pre_transform=_base_.pre_transform),
+    dict(type='YOLOv5CopyPaste', prob=_base_.copypaste_prob),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        max_aspect_ratio=100.,
+        scaling_ratio_range=(1 - _base_.affine_scale, 1 + _base_.affine_scale),
+        # img_scale is (width, height)
+        border=(-_base_.img_scale[0] // 2, -_base_.img_scale[1] // 2),
+        border_val=(114, 114, 114),
+        min_area_ratio=_base_.min_area_ratio,
+        use_mask_refine=_base_.use_mask2refine)
+]
+train_pipeline = [
+    *_base_.pre_transform, *mosaic_affine_transform,
+    dict(type='YOLOv5MultiModalMixUp',
+         prob=_base_.mixup_prob,
+         pre_transform=[*_base_.pre_transform, *mosaic_affine_transform]),
+    *_base_.last_transform[:-1], *text_transform
+]
+train_pipeline_stage2 = [*_base_.train_pipeline_stage2[:-1], *text_transform]
+coco_train_dataset = dict(_delete_=True,
+                          type='MultiModalDataset',
+                          dataset=dict(
+                              type='YOLOv5CocoDataset',
+                              data_root='data/coco',
+                              ann_file='annotations/instances_train2017.json',
+                              data_prefix=dict(img='train2017/'),
+                              filter_cfg=dict(filter_empty_gt=False,
+                                              min_size=32)),
+                          class_text_path='data/texts/coco_class_texts.json',
+                          pipeline=train_pipeline)
+
+train_dataloader = dict(persistent_workers=persistent_workers,
+                        batch_size=train_batch_size_per_gpu,
+                        collate_fn=dict(type='yolow_collate'),
+                        dataset=coco_train_dataset)
+
+test_pipeline = [
+    *_base_.test_pipeline[:-1],
+    dict(type='LoadText'),
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                    'scale_factor', 'pad_param', 'texts'))
+]
+
+coco_val_dataset = dict(
+    _delete_=True,
+    type='MultiModalDataset',
+    dataset=dict(type='YOLOv5CocoDataset',
+                 data_root='data/coco',
+                 ann_file='annotations/instances_val2017.json',
+                 data_prefix=dict(img='val2017/'),
+                 filter_cfg=dict(filter_empty_gt=False, min_size=32)),
+    class_text_path='data/texts/coco_class_texts.json',
+    pipeline=test_pipeline)
+val_dataloader = dict(dataset=coco_val_dataset)
+test_dataloader = val_dataloader
+# training settings
+default_hooks = dict(param_scheduler=dict(scheduler_type='linear',
+                                          lr_factor=0.01,
+                                          max_epochs=max_epochs),
+                     checkpoint=dict(max_keep_ckpts=-1,
+                                     save_best=None,
+                                     interval=save_epoch_intervals))
+custom_hooks = [
+    dict(type='EMAHook',
+         ema_type='ExpMomentumEMA',
+         momentum=0.0001,
+         update_buffers=True,
+         strict_load=False,
+         priority=49),
+    dict(type='mmdet.PipelineSwitchHook',
+         switch_epoch=max_epochs - close_mosaic_epochs,
+         switch_pipeline=train_pipeline_stage2)
+]
+train_cfg = dict(max_epochs=max_epochs,
+                 val_interval=5,
+                 dynamic_intervals=[((max_epochs - close_mosaic_epochs),
+                                     _base_.val_interval_stage2)])
+optim_wrapper = dict(optimizer=dict(
+    _delete_=True,
+    type='AdamW',
+    lr=base_lr,
+    weight_decay=weight_decay,
+    batch_size_per_gpu=train_batch_size_per_gpu),
+                     paramwise_cfg=dict(bias_decay_mult=0.0,
+                                        norm_decay_mult=0.0,
+                                        custom_keys={
+                                            'backbone.text_model':
+                                            dict(lr_mult=0.01),
+                                            'logit_scale':
+                                            dict(weight_decay=0.0)
+                                        }),
+                     constructor='YOLOWv5OptimizerConstructor')
+
+# evaluation settings
+val_evaluator = dict(_delete_=True,
+                     type='mmdet.CocoMetric',
+                     proposal_nums=(100, 1, 10),
+                     ann_file='data/coco/annotations/instances_val2017.json',
+                     metric='bbox')
diff --git a/mmdetection_practice/configs/pretrain/yolo_world_v2_l_clip_large_vlpan_bn_2e-3_100e_4x8gpus_obj365v1_goldg_train_800ft_lvis_minival.py b/mmdetection_practice/configs/pretrain/yolo_world_v2_l_clip_large_vlpan_bn_2e-3_100e_4x8gpus_obj365v1_goldg_train_800ft_lvis_minival.py
new file mode 100644
index 0000000..16067a6
--- /dev/null
+++ b/mmdetection_practice/configs/pretrain/yolo_world_v2_l_clip_large_vlpan_bn_2e-3_100e_4x8gpus_obj365v1_goldg_train_800ft_lvis_minival.py
@@ -0,0 +1,200 @@
+_base_ = ('../../third_party/mmyolo/configs/yolov8/'
+          'yolov8_l_syncbn_fast_8xb16-500e_coco.py')
+custom_imports = dict(imports=['yolo_world'],
+                      allow_failed_imports=False)
+
+# hyper-parameters
+num_classes = 1203
+num_training_classes = 80
+max_epochs = 100  # Maximum training epochs
+close_mosaic_epochs = 2
+save_epoch_intervals = 2
+text_channels = 768
+neck_embed_channels = [128, 256, _base_.last_stage_out_channels // 2]
+neck_num_heads = [4, 8, _base_.last_stage_out_channels // 2 // 32]
+base_lr = 2e-3
+weight_decay = 0.0125
+train_batch_size_per_gpu = 16
+# text_model_name = '../pretrained_models/clip-vit-large-patch14-336'
+text_model_name = 'openai/clip-vit-large-patch14-336'
+img_scale = (800, 800)
+
+# model settings
+model = dict(
+    type='YOLOWorldDetector',
+    mm_neck=True,
+    num_train_classes=num_training_classes,
+    num_test_classes=num_classes,
+    data_preprocessor=dict(type='YOLOWDetDataPreprocessor'),
+    backbone=dict(
+        _delete_=True,
+        type='MultiModalYOLOBackbone',
+        image_model={{_base_.model.backbone}},
+        text_model=dict(
+            type='HuggingCLIPLanguageBackbone',
+            model_name=text_model_name,
+            frozen_modules=['all'])),
+    neck=dict(type='YOLOWorldPAFPN',
+              guide_channels=text_channels,
+              embed_channels=neck_embed_channels,
+              num_heads=neck_num_heads,
+              block_cfg=dict(type='MaxSigmoidCSPLayerWithTwoConv')),
+    bbox_head=dict(type='YOLOWorldHead',
+                   head_module=dict(type='YOLOWorldHeadModule',
+                                    use_bn_head=True,
+                                    embed_dims=text_channels,
+                                    num_classes=num_training_classes)),
+    train_cfg=dict(assigner=dict(num_classes=num_training_classes)))
+
+# dataset settings
+text_transform = [
+    dict(type='RandomLoadText',
+         num_neg_samples=(num_classes, num_classes),
+         max_num_samples=num_training_classes,
+         padding_to_max=True,
+         padding_value=''),
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                    'flip_direction', 'texts'))
+]
+train_pipeline = [
+    *_base_.pre_transform,
+    dict(type='MultiModalMosaic',
+         img_scale=img_scale,
+         pad_val=114.0,
+         pre_transform=_base_.pre_transform),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        scaling_ratio_range=(1 - _base_.affine_scale, 1 + _base_.affine_scale),
+        max_aspect_ratio=_base_.max_aspect_ratio,
+        border=(-img_scale[0] // 2, -img_scale[1] // 2),
+        border_val=(114, 114, 114)),
+    *_base_.last_transform[:-1],
+    *text_transform,
+]
+
+train_pipeline_stage2 = [
+    *_base_.pre_transform,
+    dict(type='YOLOv5KeepRatioResize', scale=img_scale),
+    dict(
+        type='LetterResize',
+        scale=img_scale,
+        allow_scale_up=True,
+        pad_val=dict(img=114.0)),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        scaling_ratio_range=(1 - _base_.affine_scale, 1 + _base_.affine_scale),
+        max_aspect_ratio=_base_.max_aspect_ratio,
+        border_val=(114, 114, 114)),
+    *_base_.last_transform[:-1],
+    *text_transform
+]
+
+obj365v1_train_dataset = dict(
+    type='MultiModalDataset',
+    dataset=dict(
+        type='YOLOv5Objects365V1Dataset',
+        data_root='data/objects365v1/',
+        ann_file='annotations/objects365_train.json',
+        data_prefix=dict(img='train/'),
+        filter_cfg=dict(filter_empty_gt=False, min_size=32)),
+    class_text_path='data/texts/obj365v1_class_texts.json',
+    pipeline=train_pipeline)
+
+mg_train_dataset = dict(type='YOLOv5MixedGroundingDataset',
+                        data_root='data/mixed_grounding/',
+                        ann_file='annotations/final_mixed_train_no_coco.json',
+                        data_prefix=dict(img='gqa/images/'),
+                        filter_cfg=dict(filter_empty_gt=False, min_size=32),
+                        pipeline=train_pipeline)
+
+flickr_train_dataset = dict(
+    type='YOLOv5MixedGroundingDataset',
+    data_root='data/flickr/',
+    ann_file='annotations/final_flickr_separateGT_train.json',
+    data_prefix=dict(img='full_images/'),
+    filter_cfg=dict(filter_empty_gt=True, min_size=32),
+    pipeline=train_pipeline)
+
+train_dataloader = dict(batch_size=train_batch_size_per_gpu,
+                        collate_fn=dict(type='yolow_collate'),
+                        dataset=dict(_delete_=True,
+                                     type='ConcatDataset',
+                                     datasets=[
+                                         obj365v1_train_dataset,
+                                         flickr_train_dataset, mg_train_dataset
+                                     ],
+                                     ignore_keys=['classes', 'palette']))
+
+test_pipeline = [
+    dict(type='LoadImageFromFile'),
+    dict(type='YOLOv5KeepRatioResize', scale=img_scale),
+    dict(
+        type='LetterResize',
+        scale=img_scale,
+        allow_scale_up=False,
+        pad_val=dict(img=114)),
+    dict(type='LoadAnnotations', with_bbox=True, _scope_='mmdet'),
+    dict(type='LoadText'),
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                    'scale_factor', 'pad_param', 'texts'))
+]
+
+coco_val_dataset = dict(
+    _delete_=True,
+    type='MultiModalDataset',
+    dataset=dict(type='YOLOv5LVISV1Dataset',
+                 data_root='data/coco/',
+                 test_mode=True,
+                 ann_file='lvis/lvis_v1_minival_inserted_image_name.json',
+                 data_prefix=dict(img=''),
+                 batch_shapes_cfg=None),
+    class_text_path='data/texts/lvis_v1_class_texts.json',
+    pipeline=test_pipeline)
+val_dataloader = dict(dataset=coco_val_dataset)
+test_dataloader = val_dataloader
+
+val_evaluator = dict(type='mmdet.LVISMetric',
+                     ann_file='data/coco/lvis/lvis_v1_minival_inserted_image_name.json',
+                     metric='bbox')
+test_evaluator = val_evaluator
+
+# training settings
+default_hooks = dict(param_scheduler=dict(max_epochs=max_epochs),
+                     checkpoint=dict(interval=save_epoch_intervals,
+                                     rule='greater'))
+custom_hooks = [
+    dict(type='EMAHook',
+         ema_type='ExpMomentumEMA',
+         momentum=0.0001,
+         update_buffers=True,
+         strict_load=False,
+         priority=49),
+    dict(type='mmdet.PipelineSwitchHook',
+         switch_epoch=max_epochs - close_mosaic_epochs,
+         switch_pipeline=train_pipeline_stage2)
+]
+train_cfg = dict(max_epochs=max_epochs,
+                 val_interval=10,
+                 dynamic_intervals=[((max_epochs - close_mosaic_epochs),
+                                     _base_.val_interval_stage2)])
+optim_wrapper = dict(optimizer=dict(
+    _delete_=True,
+    type='AdamW',
+    lr=base_lr,
+    weight_decay=weight_decay,
+    batch_size_per_gpu=train_batch_size_per_gpu),
+                     paramwise_cfg=dict(bias_decay_mult=0.0,
+                                        norm_decay_mult=0.0,
+                                        custom_keys={
+                                            'backbone.text_model':
+                                            dict(lr_mult=0.01),
+                                            'logit_scale':
+                                            dict(weight_decay=0.0)
+                                        }),
+                     constructor='YOLOWv5OptimizerConstructor')
diff --git a/mmdetection_practice/configs/pretrain/yolo_world_v2_l_clip_large_vlpan_bn_2e-3_100e_4x8gpus_obj365v1_goldg_train_lvis_minival.py b/mmdetection_practice/configs/pretrain/yolo_world_v2_l_clip_large_vlpan_bn_2e-3_100e_4x8gpus_obj365v1_goldg_train_lvis_minival.py
new file mode 100644
index 0000000..b5b84ab
--- /dev/null
+++ b/mmdetection_practice/configs/pretrain/yolo_world_v2_l_clip_large_vlpan_bn_2e-3_100e_4x8gpus_obj365v1_goldg_train_lvis_minival.py
@@ -0,0 +1,171 @@
+_base_ = ('../../third_party/mmyolo/configs/yolov8/'
+          'yolov8_l_syncbn_fast_8xb16-500e_coco.py')
+custom_imports = dict(imports=['yolo_world'],
+                      allow_failed_imports=False)
+
+# hyper-parameters
+num_classes = 1203
+num_training_classes = 80
+max_epochs = 100  # Maximum training epochs
+close_mosaic_epochs = 2
+save_epoch_intervals = 2
+text_channels = 768
+neck_embed_channels = [128, 256, _base_.last_stage_out_channels // 2]
+neck_num_heads = [4, 8, _base_.last_stage_out_channels // 2 // 32]
+base_lr = 2e-3
+weight_decay = 0.0125
+train_batch_size_per_gpu = 16
+# text_model_name = '../pretrained_models/clip-vit-large-patch14-336'
+text_model_name = 'openai/clip-vit-large-patch14-336'
+# model settings
+model = dict(
+    type='YOLOWorldDetector',
+    mm_neck=True,
+    num_train_classes=num_training_classes,
+    num_test_classes=num_classes,
+    data_preprocessor=dict(type='YOLOWDetDataPreprocessor'),
+    backbone=dict(
+        _delete_=True,
+        type='MultiModalYOLOBackbone',
+        image_model={{_base_.model.backbone}},
+        text_model=dict(
+            type='HuggingCLIPLanguageBackbone',
+            model_name=text_model_name,
+            frozen_modules=['all'])),
+    neck=dict(type='YOLOWorldPAFPN',
+              guide_channels=text_channels,
+              embed_channels=neck_embed_channels,
+              num_heads=neck_num_heads,
+              block_cfg=dict(type='MaxSigmoidCSPLayerWithTwoConv')),
+    bbox_head=dict(type='YOLOWorldHead',
+                   head_module=dict(type='YOLOWorldHeadModule',
+                                    use_bn_head=True,
+                                    embed_dims=text_channels,
+                                    num_classes=num_training_classes)),
+    train_cfg=dict(assigner=dict(num_classes=num_training_classes)))
+
+# dataset settings
+text_transform = [
+    dict(type='RandomLoadText',
+         num_neg_samples=(num_classes, num_classes),
+         max_num_samples=num_training_classes,
+         padding_to_max=True,
+         padding_value=''),
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                    'flip_direction', 'texts'))
+]
+train_pipeline = [
+    *_base_.pre_transform,
+    dict(type='MultiModalMosaic',
+         img_scale=_base_.img_scale,
+         pad_val=114.0,
+         pre_transform=_base_.pre_transform),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        scaling_ratio_range=(1 - _base_.affine_scale, 1 + _base_.affine_scale),
+        max_aspect_ratio=_base_.max_aspect_ratio,
+        border=(-_base_.img_scale[0] // 2, -_base_.img_scale[1] // 2),
+        border_val=(114, 114, 114)),
+    *_base_.last_transform[:-1],
+    *text_transform,
+]
+train_pipeline_stage2 = [*_base_.train_pipeline_stage2[:-1], *text_transform]
+obj365v1_train_dataset = dict(
+    type='MultiModalDataset',
+    dataset=dict(
+        type='YOLOv5Objects365V1Dataset',
+        data_root='data/objects365v1/',
+        ann_file='annotations/objects365_train.json',
+        data_prefix=dict(img='train/'),
+        filter_cfg=dict(filter_empty_gt=False, min_size=32)),
+    class_text_path='data/texts/obj365v1_class_texts.json',
+    pipeline=train_pipeline)
+
+mg_train_dataset = dict(type='YOLOv5MixedGroundingDataset',
+                        data_root='data/mixed_grounding/',
+                        ann_file='annotations/final_mixed_train_no_coco.json',
+                        data_prefix=dict(img='gqa/images/'),
+                        filter_cfg=dict(filter_empty_gt=False, min_size=32),
+                        pipeline=train_pipeline)
+
+flickr_train_dataset = dict(
+    type='YOLOv5MixedGroundingDataset',
+    data_root='data/flickr/',
+    ann_file='annotations/final_flickr_separateGT_train.json',
+    data_prefix=dict(img='full_images/'),
+    filter_cfg=dict(filter_empty_gt=True, min_size=32),
+    pipeline=train_pipeline)
+
+train_dataloader = dict(batch_size=train_batch_size_per_gpu,
+                        collate_fn=dict(type='yolow_collate'),
+                        dataset=dict(_delete_=True,
+                                     type='ConcatDataset',
+                                     datasets=[
+                                         obj365v1_train_dataset,
+                                         flickr_train_dataset, mg_train_dataset
+                                     ],
+                                     ignore_keys=['classes', 'palette']))
+
+test_pipeline = [
+    *_base_.test_pipeline[:-1],
+    dict(type='LoadText'),
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                    'scale_factor', 'pad_param', 'texts'))
+]
+coco_val_dataset = dict(
+    _delete_=True,
+    type='MultiModalDataset',
+    dataset=dict(type='YOLOv5LVISV1Dataset',
+                 data_root='data/coco/',
+                 test_mode=True,
+                 ann_file='lvis/lvis_v1_minival_inserted_image_name.json',
+                 data_prefix=dict(img=''),
+                 batch_shapes_cfg=None),
+    class_text_path='data/texts/lvis_v1_class_texts.json',
+    pipeline=test_pipeline)
+val_dataloader = dict(dataset=coco_val_dataset)
+test_dataloader = val_dataloader
+
+val_evaluator = dict(type='mmdet.LVISMetric',
+                     ann_file='data/coco/lvis/lvis_v1_minival_inserted_image_name.json',
+                     metric='bbox')
+test_evaluator = val_evaluator
+
+# training settings
+default_hooks = dict(param_scheduler=dict(max_epochs=max_epochs),
+                     checkpoint=dict(interval=save_epoch_intervals,
+                                     rule='greater'))
+custom_hooks = [
+    dict(type='EMAHook',
+         ema_type='ExpMomentumEMA',
+         momentum=0.0001,
+         update_buffers=True,
+         strict_load=False,
+         priority=49),
+    dict(type='mmdet.PipelineSwitchHook',
+         switch_epoch=max_epochs - close_mosaic_epochs,
+         switch_pipeline=train_pipeline_stage2)
+]
+train_cfg = dict(max_epochs=max_epochs,
+                 val_interval=10,
+                 dynamic_intervals=[((max_epochs - close_mosaic_epochs),
+                                     _base_.val_interval_stage2)])
+optim_wrapper = dict(optimizer=dict(
+    _delete_=True,
+    type='AdamW',
+    lr=base_lr,
+    weight_decay=weight_decay,
+    batch_size_per_gpu=train_batch_size_per_gpu),
+                     paramwise_cfg=dict(bias_decay_mult=0.0,
+                                        norm_decay_mult=0.0,
+                                        custom_keys={
+                                            'backbone.text_model':
+                                            dict(lr_mult=0.01),
+                                            'logit_scale':
+                                            dict(weight_decay=0.0)
+                                        }),
+                     constructor='YOLOWv5OptimizerConstructor')
diff --git a/mmdetection_practice/configs/pretrain/yolo_world_v2_l_vlpan_bn_2e-3_100e_4x8gpus_obj365v1_goldg_train_1280ft_lvis_minival.py b/mmdetection_practice/configs/pretrain/yolo_world_v2_l_vlpan_bn_2e-3_100e_4x8gpus_obj365v1_goldg_train_1280ft_lvis_minival.py
new file mode 100644
index 0000000..1c34f3a
--- /dev/null
+++ b/mmdetection_practice/configs/pretrain/yolo_world_v2_l_vlpan_bn_2e-3_100e_4x8gpus_obj365v1_goldg_train_1280ft_lvis_minival.py
@@ -0,0 +1,202 @@
+_base_ = ('../../third_party/mmyolo/configs/yolov8/'
+          'yolov8_l_syncbn_fast_8xb16-500e_coco.py')
+custom_imports = dict(imports=['yolo_world'],
+                      allow_failed_imports=False)
+
+# hyper-parameters
+num_classes = 1203
+num_training_classes = 80
+max_epochs = 20  # Maximum training epochs
+close_mosaic_epochs = 2
+save_epoch_intervals = 2
+text_channels = 512
+neck_embed_channels = [128, 256, _base_.last_stage_out_channels // 2]
+neck_num_heads = [4, 8, _base_.last_stage_out_channels // 2 // 32]
+base_lr = 2e-4
+weight_decay = 0.025
+train_batch_size_per_gpu = 4
+load_from = "pretrained_models/yolo_world_v2_l_obj365v1_goldg_pretrain-a82b1fe3.pth"
+# text_model_name = '../pretrained_models/clip-vit-base-patch32-projection'
+text_model_name = 'openai/clip-vit-base-patch32'
+img_scale = (1280, 1280)
+
+# model settings
+model = dict(
+    type='YOLOWorldDetector',
+    mm_neck=True,
+    num_train_classes=num_training_classes,
+    num_test_classes=num_classes,
+    data_preprocessor=dict(type='YOLOWDetDataPreprocessor'),
+    backbone=dict(
+        _delete_=True,
+        type='MultiModalYOLOBackbone',
+        image_model={{_base_.model.backbone}},
+        text_model=dict(
+            type='HuggingCLIPLanguageBackbone',
+            model_name=text_model_name,
+            frozen_modules=['all'])),
+    neck=dict(type='YOLOWorldPAFPN',
+              guide_channels=text_channels,
+              embed_channels=neck_embed_channels,
+              num_heads=neck_num_heads,
+              block_cfg=dict(type='MaxSigmoidCSPLayerWithTwoConv')),
+    bbox_head=dict(type='YOLOWorldHead',
+                   head_module=dict(type='YOLOWorldHeadModule',
+                                    use_bn_head=True,
+                                    embed_dims=text_channels,
+                                    num_classes=num_training_classes)),
+    train_cfg=dict(assigner=dict(num_classes=num_training_classes)))
+
+# dataset settings
+text_transform = [
+    dict(type='RandomLoadText',
+         num_neg_samples=(num_classes, num_classes),
+         max_num_samples=num_training_classes,
+         padding_to_max=True,
+         padding_value=''),
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                    'flip_direction', 'texts'))
+]
+train_pipeline = [
+    *_base_.pre_transform,
+    dict(type='MultiModalMosaic',
+         img_scale=img_scale,
+         pad_val=114.0,
+         pre_transform=_base_.pre_transform),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        scaling_ratio_range=(1 - _base_.affine_scale, 1 + _base_.affine_scale),
+        max_aspect_ratio=_base_.max_aspect_ratio,
+        border=(-img_scale[0] // 2, -img_scale[1] // 2),
+        border_val=(114, 114, 114)),
+    *_base_.last_transform[:-1],
+    *text_transform,
+]
+
+train_pipeline_stage2 = [
+    *_base_.pre_transform,
+    dict(type='YOLOv5KeepRatioResize', scale=img_scale),
+    dict(
+        type='LetterResize',
+        scale=img_scale,
+        allow_scale_up=True,
+        pad_val=dict(img=114.0)),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        scaling_ratio_range=(1 - _base_.affine_scale, 1 + _base_.affine_scale),
+        max_aspect_ratio=_base_.max_aspect_ratio,
+        border_val=(114, 114, 114)),
+    *_base_.last_transform[:-1],
+    *text_transform
+]
+
+obj365v1_train_dataset = dict(
+    type='MultiModalDataset',
+    dataset=dict(
+        type='YOLOv5Objects365V1Dataset',
+        data_root='data/objects365v1/',
+        ann_file='annotations/objects365_train.json',
+        data_prefix=dict(img='train/'),
+        filter_cfg=dict(filter_empty_gt=False, min_size=32)),
+    class_text_path='data/texts/obj365v1_class_texts.json',
+    pipeline=train_pipeline)
+
+mg_train_dataset = dict(type='YOLOv5MixedGroundingDataset',
+                        data_root='data/mixed_grounding/',
+                        ann_file='annotations/final_mixed_train_no_coco.json',
+                        data_prefix=dict(img='gqa/images/'),
+                        filter_cfg=dict(filter_empty_gt=False, min_size=32),
+                        pipeline=train_pipeline)
+
+flickr_train_dataset = dict(
+    type='YOLOv5MixedGroundingDataset',
+    data_root='data/flickr/',
+    ann_file='annotations/final_flickr_separateGT_train.json',
+    data_prefix=dict(img='full_images/'),
+    filter_cfg=dict(filter_empty_gt=True, min_size=32),
+    pipeline=train_pipeline)
+
+train_dataloader = dict(batch_size=train_batch_size_per_gpu,
+                        collate_fn=dict(type='yolow_collate'),
+                        dataset=dict(_delete_=True,
+                                     type='ConcatDataset',
+                                     datasets=[
+                                         obj365v1_train_dataset,
+                                         flickr_train_dataset, mg_train_dataset
+                                     ],
+                                     ignore_keys=['classes', 'palette']))
+
+test_pipeline = [
+    dict(type='LoadImageFromFile'),
+    dict(type='YOLOv5KeepRatioResize', scale=img_scale),
+    dict(
+        type='LetterResize',
+        scale=img_scale,
+        allow_scale_up=False,
+        pad_val=dict(img=114)),
+    dict(type='LoadAnnotations', with_bbox=True, _scope_='mmdet'),
+    dict(type='LoadText'),
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                    'scale_factor', 'pad_param', 'texts'))
+]
+
+coco_val_dataset = dict(
+    _delete_=True,
+    type='MultiModalDataset',
+    dataset=dict(type='YOLOv5LVISV1Dataset',
+                 data_root='data/coco/',
+                 test_mode=True,
+                 ann_file='lvis/lvis_v1_minival_inserted_image_name.json',
+                 data_prefix=dict(img=''),
+                 batch_shapes_cfg=None),
+    class_text_path='data/texts/lvis_v1_class_texts.json',
+    pipeline=test_pipeline)
+val_dataloader = dict(dataset=coco_val_dataset)
+test_dataloader = val_dataloader
+
+val_evaluator = dict(type='mmdet.LVISMetric',
+                     ann_file='data/coco/lvis/lvis_v1_minival_inserted_image_name.json',
+                     metric='bbox')
+test_evaluator = val_evaluator
+
+# training settings
+default_hooks = dict(param_scheduler=dict(max_epochs=max_epochs),
+                     checkpoint=dict(interval=save_epoch_intervals,
+                                     rule='greater'))
+custom_hooks = [
+    dict(type='EMAHook',
+         ema_type='ExpMomentumEMA',
+         momentum=0.0001,
+         update_buffers=True,
+         strict_load=False,
+         priority=49),
+    dict(type='mmdet.PipelineSwitchHook',
+         switch_epoch=max_epochs - close_mosaic_epochs,
+         switch_pipeline=train_pipeline_stage2)
+]
+train_cfg = dict(max_epochs=max_epochs,
+                 val_interval=10,
+                 dynamic_intervals=[((max_epochs - close_mosaic_epochs),
+                                     _base_.val_interval_stage2)])
+
+optim_wrapper = dict(optimizer=dict(
+    _delete_=True,
+    type='AdamW',
+    lr=base_lr,
+    weight_decay=weight_decay,
+    batch_size_per_gpu=train_batch_size_per_gpu),
+                     paramwise_cfg=dict(bias_decay_mult=0.0,
+                                        norm_decay_mult=0.0,
+                                        custom_keys={
+                                            'backbone.text_model':
+                                            dict(lr_mult=0.01),
+                                            'logit_scale':
+                                            dict(weight_decay=0.0)
+                                        }),
+                     constructor='YOLOWv5OptimizerConstructor')
diff --git a/mmdetection_practice/configs/pretrain/yolo_world_v2_l_vlpan_bn_2e-3_100e_4x8gpus_obj365v1_goldg_train_lvis_minival.py b/mmdetection_practice/configs/pretrain/yolo_world_v2_l_vlpan_bn_2e-3_100e_4x8gpus_obj365v1_goldg_train_lvis_minival.py
new file mode 100644
index 0000000..cb8beec
--- /dev/null
+++ b/mmdetection_practice/configs/pretrain/yolo_world_v2_l_vlpan_bn_2e-3_100e_4x8gpus_obj365v1_goldg_train_lvis_minival.py
@@ -0,0 +1,171 @@
+_base_ = ('../../third_party/mmyolo/configs/yolov8/'
+          'yolov8_l_syncbn_fast_8xb16-500e_coco.py')
+custom_imports = dict(imports=['yolo_world'],
+                      allow_failed_imports=False)
+
+# hyper-parameters
+num_classes = 1203
+num_training_classes = 80
+max_epochs = 100  # Maximum training epochs
+close_mosaic_epochs = 2
+save_epoch_intervals = 2
+text_channels = 512
+neck_embed_channels = [128, 256, _base_.last_stage_out_channels // 2]
+neck_num_heads = [4, 8, _base_.last_stage_out_channels // 2 // 32]
+base_lr = 2e-3
+weight_decay = 0.05 / 2
+train_batch_size_per_gpu = 16
+# text_model_name = '../pretrained_models/clip-vit-base-patch32-projection'
+text_model_name = 'openai/clip-vit-base-patch32'
+# model settings
+model = dict(
+    type='YOLOWorldDetector',
+    mm_neck=True,
+    num_train_classes=num_training_classes,
+    num_test_classes=num_classes,
+    data_preprocessor=dict(type='YOLOWDetDataPreprocessor'),
+    backbone=dict(
+        _delete_=True,
+        type='MultiModalYOLOBackbone',
+        image_model={{_base_.model.backbone}},
+        text_model=dict(
+            type='HuggingCLIPLanguageBackbone',
+            model_name=text_model_name,
+            frozen_modules=['all'])),
+    neck=dict(type='YOLOWorldPAFPN',
+              guide_channels=text_channels,
+              embed_channels=neck_embed_channels,
+              num_heads=neck_num_heads,
+              block_cfg=dict(type='MaxSigmoidCSPLayerWithTwoConv')),
+    bbox_head=dict(type='YOLOWorldHead',
+                   head_module=dict(type='YOLOWorldHeadModule',
+                                    use_bn_head=True,
+                                    embed_dims=text_channels,
+                                    num_classes=num_training_classes)),
+    train_cfg=dict(assigner=dict(num_classes=num_training_classes)))
+
+# dataset settings
+text_transform = [
+    dict(type='RandomLoadText',
+         num_neg_samples=(num_classes, num_classes),
+         max_num_samples=num_training_classes,
+         padding_to_max=True,
+         padding_value=''),
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                    'flip_direction', 'texts'))
+]
+train_pipeline = [
+    *_base_.pre_transform,
+    dict(type='MultiModalMosaic',
+         img_scale=_base_.img_scale,
+         pad_val=114.0,
+         pre_transform=_base_.pre_transform),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        scaling_ratio_range=(1 - _base_.affine_scale, 1 + _base_.affine_scale),
+        max_aspect_ratio=_base_.max_aspect_ratio,
+        border=(-_base_.img_scale[0] // 2, -_base_.img_scale[1] // 2),
+        border_val=(114, 114, 114)),
+    *_base_.last_transform[:-1],
+    *text_transform,
+]
+train_pipeline_stage2 = [*_base_.train_pipeline_stage2[:-1], *text_transform]
+obj365v1_train_dataset = dict(
+    type='MultiModalDataset',
+    dataset=dict(
+        type='YOLOv5Objects365V1Dataset',
+        data_root='data/objects365v1/',
+        ann_file='annotations/objects365_train.json',
+        data_prefix=dict(img='train/'),
+        filter_cfg=dict(filter_empty_gt=False, min_size=32)),
+    class_text_path='data/texts/obj365v1_class_texts.json',
+    pipeline=train_pipeline)
+
+mg_train_dataset = dict(type='YOLOv5MixedGroundingDataset',
+                        data_root='data/mixed_grounding/',
+                        ann_file='annotations/final_mixed_train_no_coco.json',
+                        data_prefix=dict(img='gqa/images/'),
+                        filter_cfg=dict(filter_empty_gt=False, min_size=32),
+                        pipeline=train_pipeline)
+
+flickr_train_dataset = dict(
+    type='YOLOv5MixedGroundingDataset',
+    data_root='data/flickr/',
+    ann_file='annotations/final_flickr_separateGT_train.json',
+    data_prefix=dict(img='full_images/'),
+    filter_cfg=dict(filter_empty_gt=True, min_size=32),
+    pipeline=train_pipeline)
+
+train_dataloader = dict(batch_size=train_batch_size_per_gpu,
+                        collate_fn=dict(type='yolow_collate'),
+                        dataset=dict(_delete_=True,
+                                     type='ConcatDataset',
+                                     datasets=[
+                                         obj365v1_train_dataset,
+                                         flickr_train_dataset, mg_train_dataset
+                                     ],
+                                     ignore_keys=['classes', 'palette']))
+
+test_pipeline = [
+    *_base_.test_pipeline[:-1],
+    dict(type='LoadText'),
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                    'scale_factor', 'pad_param', 'texts'))
+]
+coco_val_dataset = dict(
+    _delete_=True,
+    type='MultiModalDataset',
+    dataset=dict(type='YOLOv5LVISV1Dataset',
+                 data_root='data/coco/',
+                 test_mode=True,
+                 ann_file='lvis/lvis_v1_minival_inserted_image_name.json',
+                 data_prefix=dict(img=''),
+                 batch_shapes_cfg=None),
+    class_text_path='data/texts/lvis_v1_class_texts.json',
+    pipeline=test_pipeline)
+val_dataloader = dict(dataset=coco_val_dataset)
+test_dataloader = val_dataloader
+
+val_evaluator = dict(type='mmdet.LVISMetric',
+                     ann_file='data/coco/lvis/lvis_v1_minival_inserted_image_name.json',
+                     metric='bbox')
+test_evaluator = val_evaluator
+
+# training settings
+default_hooks = dict(param_scheduler=dict(max_epochs=max_epochs),
+                     checkpoint=dict(interval=save_epoch_intervals,
+                                     rule='greater'))
+custom_hooks = [
+    dict(type='EMAHook',
+         ema_type='ExpMomentumEMA',
+         momentum=0.0001,
+         update_buffers=True,
+         strict_load=False,
+         priority=49),
+    dict(type='mmdet.PipelineSwitchHook',
+         switch_epoch=max_epochs - close_mosaic_epochs,
+         switch_pipeline=train_pipeline_stage2)
+]
+train_cfg = dict(max_epochs=max_epochs,
+                 val_interval=10,
+                 dynamic_intervals=[((max_epochs - close_mosaic_epochs),
+                                     _base_.val_interval_stage2)])
+optim_wrapper = dict(optimizer=dict(
+    _delete_=True,
+    type='AdamW',
+    lr=base_lr,
+    weight_decay=weight_decay,
+    batch_size_per_gpu=train_batch_size_per_gpu),
+                     paramwise_cfg=dict(bias_decay_mult=0.0,
+                                        norm_decay_mult=0.0,
+                                        custom_keys={
+                                            'backbone.text_model':
+                                            dict(lr_mult=0.01),
+                                            'logit_scale':
+                                            dict(weight_decay=0.0)
+                                        }),
+                     constructor='YOLOWv5OptimizerConstructor')
diff --git a/mmdetection_practice/configs/pretrain/yolo_world_v2_l_vlpan_bn_2e-3_100e_4x8gpus_obj365v1_goldg_train_lvis_val.py b/mmdetection_practice/configs/pretrain/yolo_world_v2_l_vlpan_bn_2e-3_100e_4x8gpus_obj365v1_goldg_train_lvis_val.py
new file mode 100644
index 0000000..70b19b2
--- /dev/null
+++ b/mmdetection_practice/configs/pretrain/yolo_world_v2_l_vlpan_bn_2e-3_100e_4x8gpus_obj365v1_goldg_train_lvis_val.py
@@ -0,0 +1,171 @@
+_base_ = ('../../third_party/mmyolo/configs/yolov8/'
+          'yolov8_l_syncbn_fast_8xb16-500e_coco.py')
+custom_imports = dict(imports=['yolo_world'],
+                      allow_failed_imports=False)
+
+# hyper-parameters
+num_classes = 1203
+num_training_classes = 80
+max_epochs = 100  # Maximum training epochs
+close_mosaic_epochs = 2
+save_epoch_intervals = 2
+text_channels = 512
+neck_embed_channels = [128, 256, _base_.last_stage_out_channels // 2]
+neck_num_heads = [4, 8, _base_.last_stage_out_channels // 2 // 32]
+base_lr = 2e-3
+weight_decay = 0.05 / 2
+train_batch_size_per_gpu = 16
+# text_model_name = '../pretrained_models/clip-vit-base-patch32-projection'
+text_model_name = 'openai/clip-vit-base-patch32'
+# model settings
+model = dict(
+    type='YOLOWorldDetector',
+    mm_neck=True,
+    num_train_classes=num_training_classes,
+    num_test_classes=num_classes,
+    data_preprocessor=dict(type='YOLOWDetDataPreprocessor'),
+    backbone=dict(
+        _delete_=True,
+        type='MultiModalYOLOBackbone',
+        image_model={{_base_.model.backbone}},
+        text_model=dict(
+            type='HuggingCLIPLanguageBackbone',
+            model_name=text_model_name,
+            frozen_modules=['all'])),
+    neck=dict(type='YOLOWorldPAFPN',
+              guide_channels=text_channels,
+              embed_channels=neck_embed_channels,
+              num_heads=neck_num_heads,
+              block_cfg=dict(type='MaxSigmoidCSPLayerWithTwoConv')),
+    bbox_head=dict(type='YOLOWorldHead',
+                   head_module=dict(type='YOLOWorldHeadModule',
+                                    use_bn_head=True,
+                                    embed_dims=text_channels,
+                                    num_classes=num_training_classes)),
+    train_cfg=dict(assigner=dict(num_classes=num_training_classes)))
+
+# dataset settings
+text_transform = [
+    dict(type='RandomLoadText',
+         num_neg_samples=(num_classes, num_classes),
+         max_num_samples=num_training_classes,
+         padding_to_max=True,
+         padding_value=''),
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                    'flip_direction', 'texts'))
+]
+train_pipeline = [
+    *_base_.pre_transform,
+    dict(type='MultiModalMosaic',
+         img_scale=_base_.img_scale,
+         pad_val=114.0,
+         pre_transform=_base_.pre_transform),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        scaling_ratio_range=(1 - _base_.affine_scale, 1 + _base_.affine_scale),
+        max_aspect_ratio=_base_.max_aspect_ratio,
+        border=(-_base_.img_scale[0] // 2, -_base_.img_scale[1] // 2),
+        border_val=(114, 114, 114)),
+    *_base_.last_transform[:-1],
+    *text_transform,
+]
+train_pipeline_stage2 = [*_base_.train_pipeline_stage2[:-1], *text_transform]
+obj365v1_train_dataset = dict(
+    type='MultiModalDataset',
+    dataset=dict(
+        type='YOLOv5Objects365V1Dataset',
+        data_root='data/objects365v1/',
+        ann_file='annotations/objects365_train.json',
+        data_prefix=dict(img='train/'),
+        filter_cfg=dict(filter_empty_gt=False, min_size=32)),
+    class_text_path='data/texts/obj365v1_class_texts.json',
+    pipeline=train_pipeline)
+
+mg_train_dataset = dict(type='YOLOv5MixedGroundingDataset',
+                        data_root='data/mixed_grounding/',
+                        ann_file='annotations/final_mixed_train_no_coco.json',
+                        data_prefix=dict(img='gqa/images/'),
+                        filter_cfg=dict(filter_empty_gt=False, min_size=32),
+                        pipeline=train_pipeline)
+
+flickr_train_dataset = dict(
+    type='YOLOv5MixedGroundingDataset',
+    data_root='data/flickr/',
+    ann_file='annotations/final_flickr_separateGT_train.json',
+    data_prefix=dict(img='full_images/'),
+    filter_cfg=dict(filter_empty_gt=True, min_size=32),
+    pipeline=train_pipeline)
+
+train_dataloader = dict(batch_size=train_batch_size_per_gpu,
+                        collate_fn=dict(type='yolow_collate'),
+                        dataset=dict(_delete_=True,
+                                     type='ConcatDataset',
+                                     datasets=[
+                                         obj365v1_train_dataset,
+                                         flickr_train_dataset, mg_train_dataset
+                                     ],
+                                     ignore_keys=['classes', 'palette']))
+
+test_pipeline = [
+    *_base_.test_pipeline[:-1],
+    dict(type='LoadText'),
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                    'scale_factor', 'pad_param', 'texts'))
+]
+coco_val_dataset = dict(
+    _delete_=True,
+    type='MultiModalDataset',
+    dataset=dict(type='YOLOv5LVISV1Dataset',
+                 data_root='data/coco/',
+                 test_mode=True,
+                 ann_file='lvis/lvis_v1_val.json',
+                 data_prefix=dict(img=''),
+                 batch_shapes_cfg=None),
+    class_text_path='data/texts/lvis_v1_class_texts.json',
+    pipeline=test_pipeline)
+val_dataloader = dict(dataset=coco_val_dataset)
+test_dataloader = val_dataloader
+
+val_evaluator = dict(type='mmdet.LVISMetric',
+                     ann_file='data/coco/lvis/lvis_v1_val.json',
+                     metric='bbox')
+test_evaluator = val_evaluator
+
+# training settings
+default_hooks = dict(param_scheduler=dict(max_epochs=max_epochs),
+                     checkpoint=dict(interval=save_epoch_intervals,
+                                     rule='greater'))
+custom_hooks = [
+    dict(type='EMAHook',
+         ema_type='ExpMomentumEMA',
+         momentum=0.0001,
+         update_buffers=True,
+         strict_load=False,
+         priority=49),
+    dict(type='mmdet.PipelineSwitchHook',
+         switch_epoch=max_epochs - close_mosaic_epochs,
+         switch_pipeline=train_pipeline_stage2)
+]
+train_cfg = dict(max_epochs=max_epochs,
+                 val_interval=10,
+                 dynamic_intervals=[((max_epochs - close_mosaic_epochs),
+                                     _base_.val_interval_stage2)])
+optim_wrapper = dict(optimizer=dict(
+    _delete_=True,
+    type='AdamW',
+    lr=base_lr,
+    weight_decay=weight_decay,
+    batch_size_per_gpu=train_batch_size_per_gpu),
+                     paramwise_cfg=dict(bias_decay_mult=0.0,
+                                        norm_decay_mult=0.0,
+                                        custom_keys={
+                                            'backbone.text_model':
+                                            dict(lr_mult=0.01),
+                                            'logit_scale':
+                                            dict(weight_decay=0.0)
+                                        }),
+                     constructor='YOLOWv5OptimizerConstructor')
diff --git a/mmdetection_practice/configs/pretrain/yolo_world_v2_m_vlpan_bn_2e-3_100e_4x8gpus_obj365v1_goldg_train_1280ft_lvis_minival.py b/mmdetection_practice/configs/pretrain/yolo_world_v2_m_vlpan_bn_2e-3_100e_4x8gpus_obj365v1_goldg_train_1280ft_lvis_minival.py
new file mode 100644
index 0000000..5950720
--- /dev/null
+++ b/mmdetection_practice/configs/pretrain/yolo_world_v2_m_vlpan_bn_2e-3_100e_4x8gpus_obj365v1_goldg_train_1280ft_lvis_minival.py
@@ -0,0 +1,198 @@
+_base_ = ('../../third_party/mmyolo/configs/yolov8/'
+          'yolov8_m_syncbn_fast_8xb16-500e_coco.py')
+custom_imports = dict(imports=['yolo_world'],
+                      allow_failed_imports=False)
+
+# hyper-parameters
+num_classes = 1203
+num_training_classes = 80
+max_epochs = 100  # Maximum training epochs
+close_mosaic_epochs = 2
+save_epoch_intervals = 2
+text_channels = 512
+neck_embed_channels = [128, 256, _base_.last_stage_out_channels // 2]
+neck_num_heads = [4, 8, _base_.last_stage_out_channels // 2 // 32]
+base_lr = 2e-3
+weight_decay = 0.05 / 2
+train_batch_size_per_gpu = 16
+text_model_name = '../pretrained_models/clip-vit-base-patch32-projection'
+img_scale = (1280, 1280)
+
+text_model_name = 'openai/clip-vit-base-patch32'
+# model settings
+model = dict(
+    type='YOLOWorldDetector',
+    mm_neck=True,
+    num_train_classes=num_training_classes,
+    num_test_classes=num_classes,
+    data_preprocessor=dict(type='YOLOWDetDataPreprocessor'),
+    backbone=dict(
+        _delete_=True,
+        type='MultiModalYOLOBackbone',
+        image_model={{_base_.model.backbone}},
+        text_model=dict(
+            type='HuggingCLIPLanguageBackbone',
+            model_name=text_model_name,
+            frozen_modules=['all'])),
+    neck=dict(type='YOLOWorldPAFPN',
+              guide_channels=text_channels,
+              embed_channels=neck_embed_channels,
+              num_heads=neck_num_heads,
+              block_cfg=dict(type='MaxSigmoidCSPLayerWithTwoConv')),
+    bbox_head=dict(type='YOLOWorldHead',
+                   head_module=dict(type='YOLOWorldHeadModule',
+                                    use_bn_head=True,
+                                    embed_dims=text_channels,
+                                    num_classes=num_training_classes)),
+    train_cfg=dict(assigner=dict(num_classes=num_training_classes)))
+
+# dataset settings
+text_transform = [
+    dict(type='RandomLoadText',
+         num_neg_samples=(num_classes, num_classes),
+         max_num_samples=num_training_classes,
+         padding_to_max=True,
+         padding_value=''),
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                    'flip_direction', 'texts'))
+]
+train_pipeline = [
+    *_base_.pre_transform,
+    dict(type='MultiModalMosaic',
+         img_scale=img_scale,
+         pad_val=114.0,
+         pre_transform=_base_.pre_transform),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        scaling_ratio_range=(1 - _base_.affine_scale, 1 + _base_.affine_scale),
+        max_aspect_ratio=_base_.max_aspect_ratio,
+        border=(-img_scale[0] // 2, -img_scale[1] // 2),
+        border_val=(114, 114, 114)),
+    *_base_.last_transform[:-1],
+    *text_transform,
+]
+
+train_pipeline_stage2 = [
+    *_base_.pre_transform,
+    dict(type='YOLOv5KeepRatioResize', scale=img_scale),
+    dict(
+        type='LetterResize',
+        scale=img_scale,
+        allow_scale_up=True,
+        pad_val=dict(img=114.0)),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        scaling_ratio_range=(1 - _base_.affine_scale, 1 + _base_.affine_scale),
+        max_aspect_ratio=_base_.max_aspect_ratio,
+        border_val=(114, 114, 114)),
+    *_base_.last_transform[:-1],
+    *text_transform
+]
+obj365v1_train_dataset = dict(
+    type='MultiModalDataset',
+    dataset=dict(
+        type='YOLOv5Objects365V1Dataset',
+        data_root='data/objects365v1/',
+        ann_file='annotations/objects365_train.json',
+        data_prefix=dict(img='train/'),
+        filter_cfg=dict(filter_empty_gt=False, min_size=32)),
+    class_text_path='data/texts/obj365v1_class_texts.json',
+    pipeline=train_pipeline)
+
+mg_train_dataset = dict(type='YOLOv5MixedGroundingDataset',
+                        data_root='data/mixed_grounding/',
+                        ann_file='annotations/final_mixed_train_no_coco.json',
+                        data_prefix=dict(img='gqa/images/'),
+                        filter_cfg=dict(filter_empty_gt=False, min_size=32),
+                        pipeline=train_pipeline)
+
+flickr_train_dataset = dict(
+    type='YOLOv5MixedGroundingDataset',
+    data_root='data/flickr/',
+    ann_file='annotations/final_flickr_separateGT_train.json',
+    data_prefix=dict(img='full_images/'),
+    filter_cfg=dict(filter_empty_gt=True, min_size=32),
+    pipeline=train_pipeline)
+
+train_dataloader = dict(batch_size=train_batch_size_per_gpu,
+                        collate_fn=dict(type='yolow_collate'),
+                        dataset=dict(_delete_=True,
+                                     type='ConcatDataset',
+                                     datasets=[
+                                         obj365v1_train_dataset,
+                                         flickr_train_dataset, mg_train_dataset
+                                     ],
+                                     ignore_keys=['classes', 'palette']))
+
+test_pipeline = [
+    dict(type='LoadImageFromFile'),
+    dict(type='YOLOv5KeepRatioResize', scale=img_scale),
+    dict(
+        type='LetterResize',
+        scale=img_scale,
+        allow_scale_up=False,
+        pad_val=dict(img=114)),
+    dict(type='LoadAnnotations', with_bbox=True, _scope_='mmdet'),
+    dict(type='LoadText'),
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                    'scale_factor', 'pad_param', 'texts'))
+]
+coco_val_dataset = dict(
+    _delete_=True,
+    type='MultiModalDataset',
+    dataset=dict(type='YOLOv5LVISV1Dataset',
+                 data_root='data/coco/',
+                 test_mode=True,
+                 ann_file='lvis/lvis_v1_minival_inserted_image_name.json',
+                 data_prefix=dict(img=''),
+                 batch_shapes_cfg=None),
+    class_text_path='data/texts/lvis_v1_class_texts.json',
+    pipeline=test_pipeline)
+val_dataloader = dict(dataset=coco_val_dataset)
+test_dataloader = val_dataloader
+
+val_evaluator = dict(type='mmdet.LVISMetric',
+                     ann_file='data/coco/lvis/lvis_v1_minival_inserted_image_name.json',
+                     metric='bbox')
+test_evaluator = val_evaluator
+
+# training settings
+default_hooks = dict(param_scheduler=dict(max_epochs=max_epochs),
+                     checkpoint=dict(interval=save_epoch_intervals,
+                                     rule='greater'))
+custom_hooks = [
+    dict(type='EMAHook',
+         ema_type='ExpMomentumEMA',
+         momentum=0.0001,
+         update_buffers=True,
+         strict_load=False,
+         priority=49),
+    dict(type='mmdet.PipelineSwitchHook',
+         switch_epoch=max_epochs - close_mosaic_epochs,
+         switch_pipeline=train_pipeline_stage2)
+]
+train_cfg = dict(max_epochs=max_epochs,
+                 val_interval=10,
+                 dynamic_intervals=[((max_epochs - close_mosaic_epochs),
+                                     _base_.val_interval_stage2)])
+optim_wrapper = dict(optimizer=dict(
+    _delete_=True,
+    type='AdamW',
+    lr=base_lr,
+    weight_decay=weight_decay,
+    batch_size_per_gpu=train_batch_size_per_gpu),
+                     paramwise_cfg=dict(bias_decay_mult=0.0,
+                                        norm_decay_mult=0.0,
+                                        custom_keys={
+                                            'backbone.text_model':
+                                            dict(lr_mult=0.01),
+                                            'logit_scale':
+                                            dict(weight_decay=0.0)
+                                        }),
+                     constructor='YOLOWv5OptimizerConstructor')
diff --git a/mmdetection_practice/configs/pretrain/yolo_world_v2_m_vlpan_bn_2e-3_100e_4x8gpus_obj365v1_goldg_train_lvis_minival.py b/mmdetection_practice/configs/pretrain/yolo_world_v2_m_vlpan_bn_2e-3_100e_4x8gpus_obj365v1_goldg_train_lvis_minival.py
new file mode 100644
index 0000000..906336c
--- /dev/null
+++ b/mmdetection_practice/configs/pretrain/yolo_world_v2_m_vlpan_bn_2e-3_100e_4x8gpus_obj365v1_goldg_train_lvis_minival.py
@@ -0,0 +1,171 @@
+_base_ = ('../../third_party/mmyolo/configs/yolov8/'
+          'yolov8_m_syncbn_fast_8xb16-500e_coco.py')
+custom_imports = dict(imports=['yolo_world'],
+                      allow_failed_imports=False)
+
+# hyper-parameters
+num_classes = 1203
+num_training_classes = 80
+max_epochs = 100  # Maximum training epochs
+close_mosaic_epochs = 2
+save_epoch_intervals = 2
+text_channels = 512
+neck_embed_channels = [128, 256, _base_.last_stage_out_channels // 2]
+neck_num_heads = [4, 8, _base_.last_stage_out_channels // 2 // 32]
+base_lr = 2e-3
+weight_decay = 0.05 / 2
+train_batch_size_per_gpu = 16
+text_model_name = 'openai/clip-vit-large-patch14-336'
+text_model_name = 'openai/clip-vit-base-patch32'
+# model settings
+model = dict(
+    type='YOLOWorldDetector',
+    mm_neck=True,
+    num_train_classes=num_training_classes,
+    num_test_classes=num_classes,
+    data_preprocessor=dict(type='YOLOWDetDataPreprocessor'),
+    backbone=dict(
+        _delete_=True,
+        type='MultiModalYOLOBackbone',
+        image_model={{_base_.model.backbone}},
+        text_model=dict(
+            type='HuggingCLIPLanguageBackbone',
+            model_name=text_model_name,
+            frozen_modules=['all'])),
+    neck=dict(type='YOLOWorldPAFPN',
+              guide_channels=text_channels,
+              embed_channels=neck_embed_channels,
+              num_heads=neck_num_heads,
+              block_cfg=dict(type='MaxSigmoidCSPLayerWithTwoConv')),
+    bbox_head=dict(type='YOLOWorldHead',
+                   head_module=dict(type='YOLOWorldHeadModule',
+                                    use_bn_head=True,
+                                    embed_dims=text_channels,
+                                    num_classes=num_training_classes)),
+    train_cfg=dict(assigner=dict(num_classes=num_training_classes)))
+
+# dataset settings
+text_transform = [
+    dict(type='RandomLoadText',
+         num_neg_samples=(num_classes, num_classes),
+         max_num_samples=num_training_classes,
+         padding_to_max=True,
+         padding_value=''),
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                    'flip_direction', 'texts'))
+]
+train_pipeline = [
+    *_base_.pre_transform,
+    dict(type='MultiModalMosaic',
+         img_scale=_base_.img_scale,
+         pad_val=114.0,
+         pre_transform=_base_.pre_transform),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        scaling_ratio_range=(1 - _base_.affine_scale, 1 + _base_.affine_scale),
+        max_aspect_ratio=_base_.max_aspect_ratio,
+        border=(-_base_.img_scale[0] // 2, -_base_.img_scale[1] // 2),
+        border_val=(114, 114, 114)),
+    *_base_.last_transform[:-1],
+    *text_transform,
+]
+train_pipeline_stage2 = [*_base_.train_pipeline_stage2[:-1], *text_transform]
+obj365v1_train_dataset = dict(
+    type='MultiModalDataset',
+    dataset=dict(
+        type='YOLOv5Objects365V1Dataset',
+        data_root='data/objects365v1/',
+        ann_file='annotations/objects365_train.json',
+        data_prefix=dict(img='train/'),
+        filter_cfg=dict(filter_empty_gt=False, min_size=32)),
+    class_text_path='data/texts/obj365v1_class_texts.json',
+    pipeline=train_pipeline)
+
+mg_train_dataset = dict(type='YOLOv5MixedGroundingDataset',
+                        data_root='data/mixed_grounding/',
+                        ann_file='annotations/final_mixed_train_no_coco.json',
+                        data_prefix=dict(img='gqa/images/'),
+                        filter_cfg=dict(filter_empty_gt=False, min_size=32),
+                        pipeline=train_pipeline)
+
+flickr_train_dataset = dict(
+    type='YOLOv5MixedGroundingDataset',
+    data_root='data/flickr/',
+    ann_file='annotations/final_flickr_separateGT_train.json',
+    data_prefix=dict(img='full_images/'),
+    filter_cfg=dict(filter_empty_gt=True, min_size=32),
+    pipeline=train_pipeline)
+
+train_dataloader = dict(batch_size=train_batch_size_per_gpu,
+                        collate_fn=dict(type='yolow_collate'),
+                        dataset=dict(_delete_=True,
+                                     type='ConcatDataset',
+                                     datasets=[
+                                         obj365v1_train_dataset,
+                                         flickr_train_dataset, mg_train_dataset
+                                     ],
+                                     ignore_keys=['classes', 'palette']))
+
+test_pipeline = [
+    *_base_.test_pipeline[:-1],
+    dict(type='LoadText'),
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                    'scale_factor', 'pad_param', 'texts'))
+]
+coco_val_dataset = dict(
+    _delete_=True,
+    type='MultiModalDataset',
+    dataset=dict(type='YOLOv5LVISV1Dataset',
+                 data_root='data/coco/',
+                 test_mode=True,
+                 ann_file='lvis/lvis_v1_minival_inserted_image_name.json',
+                 data_prefix=dict(img=''),
+                 batch_shapes_cfg=None),
+    class_text_path='data/texts/lvis_v1_class_texts.json',
+    pipeline=test_pipeline)
+val_dataloader = dict(dataset=coco_val_dataset)
+test_dataloader = val_dataloader
+
+val_evaluator = dict(type='mmdet.LVISMetric',
+                     ann_file='data/coco/lvis/lvis_v1_minival_inserted_image_name.json',
+                     metric='bbox')
+test_evaluator = val_evaluator
+
+# training settings
+default_hooks = dict(param_scheduler=dict(max_epochs=max_epochs),
+                     checkpoint=dict(interval=save_epoch_intervals,
+                                     rule='greater'))
+custom_hooks = [
+    dict(type='EMAHook',
+         ema_type='ExpMomentumEMA',
+         momentum=0.0001,
+         update_buffers=True,
+         strict_load=False,
+         priority=49),
+    dict(type='mmdet.PipelineSwitchHook',
+         switch_epoch=max_epochs - close_mosaic_epochs,
+         switch_pipeline=train_pipeline_stage2)
+]
+train_cfg = dict(max_epochs=max_epochs,
+                 val_interval=10,
+                 dynamic_intervals=[((max_epochs - close_mosaic_epochs),
+                                     _base_.val_interval_stage2)])
+optim_wrapper = dict(optimizer=dict(
+    _delete_=True,
+    type='AdamW',
+    lr=base_lr,
+    weight_decay=weight_decay,
+    batch_size_per_gpu=train_batch_size_per_gpu),
+                     paramwise_cfg=dict(bias_decay_mult=0.0,
+                                        norm_decay_mult=0.0,
+                                        custom_keys={
+                                            'backbone.text_model':
+                                            dict(lr_mult=0.01),
+                                            'logit_scale':
+                                            dict(weight_decay=0.0)
+                                        }),
+                     constructor='YOLOWv5OptimizerConstructor')
diff --git a/mmdetection_practice/configs/pretrain/yolo_world_v2_m_vlpan_bn_noeinsum_2e-3_100e_4x8gpus_obj365v1_goldg_train_lvis_minival.py b/mmdetection_practice/configs/pretrain/yolo_world_v2_m_vlpan_bn_noeinsum_2e-3_100e_4x8gpus_obj365v1_goldg_train_lvis_minival.py
new file mode 100644
index 0000000..264b026
--- /dev/null
+++ b/mmdetection_practice/configs/pretrain/yolo_world_v2_m_vlpan_bn_noeinsum_2e-3_100e_4x8gpus_obj365v1_goldg_train_lvis_minival.py
@@ -0,0 +1,176 @@
+_base_ = ('../../third_party/mmyolo/configs/yolov8/'
+          'yolov8_m_syncbn_fast_8xb16-500e_coco.py')
+custom_imports = dict(imports=['yolo_world'],
+                      allow_failed_imports=False)
+
+# hyper-parameters
+num_classes = 1203
+num_training_classes = 80
+max_epochs = 100  # Maximum training epochs
+close_mosaic_epochs = 2
+save_epoch_intervals = 2
+text_channels = 512
+neck_embed_channels = [128, 256, _base_.last_stage_out_channels // 2]
+neck_num_heads = [4, 8, _base_.last_stage_out_channels // 2 // 32]
+base_lr = 2e-3
+weight_decay = 0.05 / 2
+train_batch_size_per_gpu = 16
+text_model_name = '../pretrained_models/clip-vit-base-patch32-projection'
+text_model_name = 'openai/clip-vit-base-patch32'
+# model settings
+model = dict(
+    type='YOLOWorldDetector',
+    mm_neck=True,
+    num_train_classes=num_training_classes,
+    num_test_classes=num_classes,
+    data_preprocessor=dict(type='YOLOWDetDataPreprocessor'),
+    backbone=dict(
+        _delete_=True,
+        type='MultiModalYOLOBackbone',
+        image_model={{_base_.model.backbone}},
+        text_model=dict(
+            type='HuggingCLIPLanguageBackbone',
+            model_name=text_model_name,
+            frozen_modules=['all'])),
+    neck=dict(type='YOLOWorldPAFPN',
+              guide_channels=text_channels,
+              embed_channels=neck_embed_channels,
+              num_heads=neck_num_heads,
+              block_cfg=dict(type='MaxSigmoidCSPLayerWithTwoConv',
+                             use_einsum=False)),
+    bbox_head=dict(type='YOLOWorldHead',
+                   head_module=dict(type='YOLOWorldHeadModule',
+                                    use_bn_head=True,
+                                    embed_dims=text_channels,
+                                    num_classes=num_training_classes,
+                                    use_einsum=False)),
+    train_cfg=dict(assigner=dict(num_classes=num_training_classes)))
+
+# dataset settings
+text_transform = [
+    dict(type='RandomLoadText',
+         num_neg_samples=(num_classes, num_classes),
+         max_num_samples=num_training_classes,
+         padding_to_max=True,
+         padding_value=''),
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                    'flip_direction', 'texts'))
+]
+
+train_pipeline = [
+    *_base_.pre_transform,
+    dict(type='MultiModalMosaic',
+         img_scale=_base_.img_scale,
+         pad_val=114.0,
+         pre_transform=_base_.pre_transform),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        scaling_ratio_range=(1 - _base_.affine_scale, 1 + _base_.affine_scale),
+        max_aspect_ratio=_base_.max_aspect_ratio,
+        border=(-_base_.img_scale[0] // 2, -_base_.img_scale[1] // 2),
+        border_val=(114, 114, 114)),
+    *_base_.last_transform[:-1],
+    *text_transform,
+]
+
+train_pipeline_stage2 = [*_base_.train_pipeline_stage2[:-1], *text_transform]
+obj365v1_train_dataset = dict(
+    type='MultiModalDataset',
+    dataset=dict(
+        type='YOLOv5Objects365V1Dataset',
+        data_root='data/objects365v1/',
+        ann_file='annotations/objects365_train.json',
+        data_prefix=dict(img='train/'),
+        filter_cfg=dict(filter_empty_gt=False, min_size=32)),
+    class_text_path='data/texts/obj365v1_class_texts.json',
+    pipeline=train_pipeline)
+
+mg_train_dataset = dict(type='YOLOv5MixedGroundingDataset',
+                        data_root='data/mixed_grounding/',
+                        ann_file='annotations/final_mixed_train_no_coco.json',
+                        data_prefix=dict(img='gqa/images/'),
+                        filter_cfg=dict(filter_empty_gt=False, min_size=32),
+                        pipeline=train_pipeline)
+
+flickr_train_dataset = dict(
+    type='YOLOv5MixedGroundingDataset',
+    data_root='data/flickr/',
+    ann_file='annotations/final_flickr_separateGT_train.json',
+    data_prefix=dict(img='full_images/'),
+    filter_cfg=dict(filter_empty_gt=True, min_size=32),
+    pipeline=train_pipeline)
+
+train_dataloader = dict(batch_size=train_batch_size_per_gpu,
+                        collate_fn=dict(type='yolow_collate'),
+                        dataset=dict(_delete_=True,
+                                     type='ConcatDataset',
+                                     datasets=[
+                                         obj365v1_train_dataset,
+                                         flickr_train_dataset, mg_train_dataset
+                                     ],
+                                     ignore_keys=['classes', 'palette']))
+
+test_pipeline = [
+    *_base_.test_pipeline[:-1],
+    dict(type='LoadText'),
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                    'scale_factor', 'pad_param', 'texts'))
+]
+
+coco_val_dataset = dict(
+    _delete_=True,
+    type='MultiModalDataset',
+    dataset=dict(type='YOLOv5LVISV1Dataset',
+                 data_root='data/coco/',
+                 test_mode=True,
+                 ann_file='lvis/lvis_v1_minival_inserted_image_name.json',
+                 data_prefix=dict(img=''),
+                 batch_shapes_cfg=None),
+    class_text_path='data/texts/lvis_v1_class_texts.json',
+    pipeline=test_pipeline)
+val_dataloader = dict(dataset=coco_val_dataset)
+test_dataloader = val_dataloader
+
+val_evaluator = dict(type='mmdet.LVISMetric',
+                     ann_file='data/coco/lvis/lvis_v1_minival_inserted_image_name.json',
+                     metric='bbox')
+test_evaluator = val_evaluator
+
+# training settings
+default_hooks = dict(param_scheduler=dict(max_epochs=max_epochs),
+                     checkpoint=dict(interval=save_epoch_intervals,
+                                     rule='greater'))
+custom_hooks = [
+    dict(type='EMAHook',
+         ema_type='ExpMomentumEMA',
+         momentum=0.0001,
+         update_buffers=True,
+         strict_load=False,
+         priority=49),
+    dict(type='mmdet.PipelineSwitchHook',
+         switch_epoch=max_epochs - close_mosaic_epochs,
+         switch_pipeline=train_pipeline_stage2)
+]
+train_cfg = dict(max_epochs=max_epochs,
+                 val_interval=10,
+                 dynamic_intervals=[((max_epochs - close_mosaic_epochs),
+                                     _base_.val_interval_stage2)])
+optim_wrapper = dict(optimizer=dict(
+    _delete_=True,
+    type='AdamW',
+    lr=base_lr,
+    weight_decay=weight_decay,
+    batch_size_per_gpu=train_batch_size_per_gpu),
+                     paramwise_cfg=dict(bias_decay_mult=0.0,
+                                        norm_decay_mult=0.0,
+                                        custom_keys={
+                                            'backbone.text_model':
+                                            dict(lr_mult=0.01),
+                                            'logit_scale':
+                                            dict(weight_decay=0.0)
+                                        }),
+                     constructor='YOLOWv5OptimizerConstructor')
diff --git a/mmdetection_practice/configs/pretrain/yolo_world_v2_s_vlpan_bn_2e-3_100e_4x8gpus_obj365v1_goldg_train_1280ft_lvis_minival.py b/mmdetection_practice/configs/pretrain/yolo_world_v2_s_vlpan_bn_2e-3_100e_4x8gpus_obj365v1_goldg_train_1280ft_lvis_minival.py
new file mode 100644
index 0000000..3afb76a
--- /dev/null
+++ b/mmdetection_practice/configs/pretrain/yolo_world_v2_s_vlpan_bn_2e-3_100e_4x8gpus_obj365v1_goldg_train_1280ft_lvis_minival.py
@@ -0,0 +1,195 @@
+_base_ = ('../../third_party/mmyolo/configs/yolov8/'
+          'yolov8_s_syncbn_fast_8xb16-500e_coco.py')
+custom_imports = dict(imports=['yolo_world'],
+                      allow_failed_imports=False)
+
+# hyper-parameters
+num_classes = 1203
+num_training_classes = 80
+max_epochs = 100  # Maximum training epochs
+close_mosaic_epochs = 2
+save_epoch_intervals = 2
+text_channels = 512
+neck_embed_channels = [128, 256, _base_.last_stage_out_channels // 2]
+neck_num_heads = [4, 8, _base_.last_stage_out_channels // 2 // 32]
+base_lr = 2e-4
+weight_decay = 0.025
+train_batch_size_per_gpu = 4
+img_scale = (1280, 1280)
+
+# model settings
+model = dict(
+    type='YOLOWorldDetector',
+    mm_neck=True,
+    num_train_classes=num_training_classes,
+    num_test_classes=num_classes,
+    data_preprocessor=dict(type='YOLOWDetDataPreprocessor'),
+    backbone=dict(
+        _delete_=True,
+        type='MultiModalYOLOBackbone',
+        image_model={{_base_.model.backbone}},
+        text_model=dict(
+            type='HuggingCLIPLanguageBackbone',
+            model_name='openai/clip-vit-base-patch32',
+            frozen_modules=['all'])),
+    neck=dict(type='YOLOWorldPAFPN',
+              guide_channels=text_channels,
+              embed_channels=neck_embed_channels,
+              num_heads=neck_num_heads,
+              block_cfg=dict(type='MaxSigmoidCSPLayerWithTwoConv')),
+    bbox_head=dict(type='YOLOWorldHead',
+                   head_module=dict(type='YOLOWorldHeadModule',
+                                    use_bn_head=True,
+                                    embed_dims=text_channels,
+                                    num_classes=num_training_classes)),
+    train_cfg=dict(assigner=dict(num_classes=num_training_classes)))
+
+# dataset settings
+text_transform = [
+    dict(type='RandomLoadText',
+         num_neg_samples=(num_classes, num_classes),
+         max_num_samples=num_training_classes,
+         padding_to_max=True,
+         padding_value=''),
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                    'flip_direction', 'texts'))
+]
+train_pipeline = [
+    *_base_.pre_transform,
+    dict(type='MultiModalMosaic',
+         img_scale=img_scale,
+         pad_val=114.0,
+         pre_transform=_base_.pre_transform),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        scaling_ratio_range=(1 - _base_.affine_scale, 1 + _base_.affine_scale),
+        max_aspect_ratio=_base_.max_aspect_ratio,
+        border=(-img_scale[0] // 2, -img_scale[1] // 2),
+        border_val=(114, 114, 114)),
+    *_base_.last_transform[:-1],
+    *text_transform,
+]
+train_pipeline_stage2 = [
+    *_base_.pre_transform,
+    dict(type='YOLOv5KeepRatioResize', scale=img_scale),
+    dict(
+        type='LetterResize',
+        scale=img_scale,
+        allow_scale_up=True,
+        pad_val=dict(img=114.0)),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        scaling_ratio_range=(1 - _base_.affine_scale, 1 + _base_.affine_scale),
+        max_aspect_ratio=_base_.max_aspect_ratio,
+        border_val=(114, 114, 114)),
+    *_base_.last_transform[:-1],
+    *text_transform
+]
+obj365v1_train_dataset = dict(
+    type='MultiModalDataset',
+    dataset=dict(
+        type='YOLOv5Objects365V1Dataset',
+        data_root='data/objects365v1/',
+        ann_file='annotations/objects365_train.json',
+        data_prefix=dict(img='train/'),
+        filter_cfg=dict(filter_empty_gt=False, min_size=32)),
+    class_text_path='data/texts/obj365v1_class_texts.json',
+    pipeline=train_pipeline)
+
+mg_train_dataset = dict(type='YOLOv5MixedGroundingDataset',
+                        data_root='data/mixed_grounding/',
+                        ann_file='annotations/final_mixed_train_no_coco.json',
+                        data_prefix=dict(img='gqa/images/'),
+                        filter_cfg=dict(filter_empty_gt=False, min_size=32),
+                        pipeline=train_pipeline)
+
+flickr_train_dataset = dict(
+    type='YOLOv5MixedGroundingDataset',
+    data_root='data/flickr/',
+    ann_file='annotations/final_flickr_separateGT_train.json',
+    data_prefix=dict(img='full_images/'),
+    filter_cfg=dict(filter_empty_gt=True, min_size=32),
+    pipeline=train_pipeline)
+
+train_dataloader = dict(batch_size=train_batch_size_per_gpu,
+                        collate_fn=dict(type='yolow_collate'),
+                        dataset=dict(_delete_=True,
+                                     type='ConcatDataset',
+                                     datasets=[
+                                         obj365v1_train_dataset,
+                                         flickr_train_dataset, mg_train_dataset
+                                     ],
+                                     ignore_keys=['classes', 'palette']))
+test_pipeline = [
+    dict(type='LoadImageFromFile'),
+    dict(type='YOLOv5KeepRatioResize', scale=img_scale),
+    dict(
+        type='LetterResize',
+        scale=img_scale,
+        allow_scale_up=False,
+        pad_val=dict(img=114)),
+    dict(type='LoadAnnotations', with_bbox=True, _scope_='mmdet'),
+    dict(type='LoadText'),
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                    'scale_factor', 'pad_param', 'texts'))
+]
+
+coco_val_dataset = dict(
+    _delete_=True,
+    type='MultiModalDataset',
+    dataset=dict(type='YOLOv5LVISV1Dataset',
+                 data_root='data/coco/',
+                 test_mode=True,
+                 ann_file='lvis/lvis_v1_minival_inserted_image_name.json',
+                 data_prefix=dict(img=''),
+                 batch_shapes_cfg=None),
+    class_text_path='data/texts/lvis_v1_class_texts.json',
+    pipeline=test_pipeline)
+val_dataloader = dict(dataset=coco_val_dataset)
+test_dataloader = val_dataloader
+
+val_evaluator = dict(type='mmdet.LVISMetric',
+                     ann_file='data/coco/lvis/lvis_v1_minival_inserted_image_name.json',
+                     metric='bbox')
+test_evaluator = val_evaluator
+
+# training settings
+default_hooks = dict(param_scheduler=dict(max_epochs=max_epochs),
+                     checkpoint=dict(interval=save_epoch_intervals,
+                                     rule='greater'))
+custom_hooks = [
+    dict(type='EMAHook',
+         ema_type='ExpMomentumEMA',
+         momentum=0.0001,
+         update_buffers=True,
+         strict_load=False,
+         priority=49),
+    dict(type='mmdet.PipelineSwitchHook',
+         switch_epoch=max_epochs - close_mosaic_epochs,
+         switch_pipeline=train_pipeline_stage2)
+]
+train_cfg = dict(max_epochs=max_epochs,
+                 val_interval=10,
+                 dynamic_intervals=[((max_epochs - close_mosaic_epochs),
+                                     _base_.val_interval_stage2)])
+optim_wrapper = dict(optimizer=dict(
+    _delete_=True,
+    type='AdamW',
+    lr=base_lr,
+    weight_decay=weight_decay,
+    batch_size_per_gpu=train_batch_size_per_gpu),
+                     paramwise_cfg=dict(bias_decay_mult=0.0,
+                                        norm_decay_mult=0.0,
+                                        custom_keys={
+                                            'backbone.text_model':
+                                            dict(lr_mult=0.01),
+                                            'logit_scale':
+                                            dict(weight_decay=0.0)
+                                        }),
+                     constructor='YOLOWv5OptimizerConstructor')
diff --git a/mmdetection_practice/configs/pretrain/yolo_world_v2_s_vlpan_bn_2e-3_100e_4x8gpus_obj365v1_goldg_train_lvis_minival.py b/mmdetection_practice/configs/pretrain/yolo_world_v2_s_vlpan_bn_2e-3_100e_4x8gpus_obj365v1_goldg_train_lvis_minival.py
new file mode 100644
index 0000000..775cc8e
--- /dev/null
+++ b/mmdetection_practice/configs/pretrain/yolo_world_v2_s_vlpan_bn_2e-3_100e_4x8gpus_obj365v1_goldg_train_lvis_minival.py
@@ -0,0 +1,170 @@
+_base_ = ('../../third_party/mmyolo/configs/yolov8/'
+          'yolov8_s_syncbn_fast_8xb16-500e_coco.py')
+custom_imports = dict(imports=['yolo_world'],
+                      allow_failed_imports=False)
+
+# hyper-parameters
+num_classes = 1203
+num_training_classes = 80
+max_epochs = 100  # Maximum training epochs
+close_mosaic_epochs = 2
+save_epoch_intervals = 2
+text_channels = 512
+neck_embed_channels = [128, 256, _base_.last_stage_out_channels // 2]
+neck_num_heads = [4, 8, _base_.last_stage_out_channels // 2 // 32]
+base_lr = 2e-3
+weight_decay = 0.05 / 2
+train_batch_size_per_gpu = 16
+
+# model settings
+model = dict(
+    type='YOLOWorldDetector',
+    mm_neck=True,
+    num_train_classes=num_training_classes,
+    num_test_classes=num_classes,
+    data_preprocessor=dict(type='YOLOWDetDataPreprocessor'),
+    backbone=dict(
+        _delete_=True,
+        type='MultiModalYOLOBackbone',
+        image_model={{_base_.model.backbone}},
+        text_model=dict(
+            type='HuggingCLIPLanguageBackbone',
+            model_name='openai/clip-vit-base-patch32',
+            frozen_modules=['all'])),
+    neck=dict(type='YOLOWorldPAFPN',
+              guide_channels=text_channels,
+              embed_channels=neck_embed_channels,
+              num_heads=neck_num_heads,
+              block_cfg=dict(type='MaxSigmoidCSPLayerWithTwoConv')),
+    bbox_head=dict(type='YOLOWorldHead',
+                   head_module=dict(type='YOLOWorldHeadModule',
+                                    use_bn_head=True,
+                                    embed_dims=text_channels,
+                                    num_classes=num_training_classes)),
+    train_cfg=dict(assigner=dict(num_classes=num_training_classes)))
+
+# dataset settings
+text_transform = [
+    dict(type='RandomLoadText',
+         num_neg_samples=(num_classes, num_classes),
+         max_num_samples=num_training_classes,
+         padding_to_max=True,
+         padding_value=''),
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                    'flip_direction', 'texts'))
+]
+train_pipeline = [
+    *_base_.pre_transform,
+    dict(type='MultiModalMosaic',
+         img_scale=_base_.img_scale,
+         pad_val=114.0,
+         pre_transform=_base_.pre_transform),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        scaling_ratio_range=(1 - _base_.affine_scale, 1 + _base_.affine_scale),
+        max_aspect_ratio=_base_.max_aspect_ratio,
+        border=(-_base_.img_scale[0] // 2, -_base_.img_scale[1] // 2),
+        border_val=(114, 114, 114)),
+    *_base_.last_transform[:-1],
+    *text_transform,
+]
+train_pipeline_stage2 = [*_base_.train_pipeline_stage2[:-1], *text_transform]
+obj365v1_train_dataset = dict(
+    type='MultiModalDataset',
+    dataset=dict(
+        type='YOLOv5Objects365V1Dataset',
+        data_root='data/objects365v1/',
+        ann_file='annotations/objects365_train.json',
+        data_prefix=dict(img='train/'),
+        filter_cfg=dict(filter_empty_gt=False, min_size=32)),
+    class_text_path='data/texts/obj365v1_class_texts.json',
+    pipeline=train_pipeline)
+
+mg_train_dataset = dict(type='YOLOv5MixedGroundingDataset',
+                        data_root='data/mixed_grounding/',
+                        ann_file='annotations/final_mixed_train_no_coco.json',
+                        data_prefix=dict(img='gqa/images/'),
+                        filter_cfg=dict(filter_empty_gt=False, min_size=32),
+                        pipeline=train_pipeline)
+
+flickr_train_dataset = dict(
+    type='YOLOv5MixedGroundingDataset',
+    data_root='data/flickr/',
+    ann_file='annotations/final_flickr_separateGT_train.json',
+    data_prefix=dict(img='full_images/'),
+    filter_cfg=dict(filter_empty_gt=True, min_size=32),
+    pipeline=train_pipeline)
+
+train_dataloader = dict(batch_size=train_batch_size_per_gpu,
+                        collate_fn=dict(type='yolow_collate'),
+                        dataset=dict(_delete_=True,
+                                     type='ConcatDataset',
+                                     datasets=[
+                                         obj365v1_train_dataset,
+                                         flickr_train_dataset, mg_train_dataset
+                                     ],
+                                     ignore_keys=['classes', 'palette']))
+
+test_pipeline = [
+    *_base_.test_pipeline[:-1],
+    dict(type='LoadText'),
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                    'scale_factor', 'pad_param', 'texts'))
+]
+coco_val_dataset = dict(
+    _delete_=True,
+    type='MultiModalDataset',
+    dataset=dict(type='YOLOv5LVISV1Dataset',
+                 data_root='data/coco/',
+                 test_mode=True,
+                 ann_file='lvis/lvis_v1_minival_inserted_image_name.json',
+                 data_prefix=dict(img=''),
+                 batch_shapes_cfg=None),
+    class_text_path='data/texts/lvis_v1_class_texts.json',
+    pipeline=test_pipeline)
+val_dataloader = dict(dataset=coco_val_dataset)
+test_dataloader = val_dataloader
+
+val_evaluator = dict(type='mmdet.LVISMetric',
+                     ann_file='data/coco/lvis/lvis_v1_minival_inserted_image_name.json',
+                     metric='bbox')
+test_evaluator = val_evaluator
+
+# training settings
+default_hooks = dict(param_scheduler=dict(max_epochs=max_epochs),
+                     checkpoint=dict(interval=save_epoch_intervals,
+                                     rule='greater'))
+custom_hooks = [
+    dict(type='EMAHook',
+         ema_type='ExpMomentumEMA',
+         momentum=0.0001,
+         update_buffers=True,
+         strict_load=False,
+         priority=49),
+    dict(type='mmdet.PipelineSwitchHook',
+         switch_epoch=max_epochs - close_mosaic_epochs,
+         switch_pipeline=train_pipeline_stage2)
+]
+train_cfg = dict(max_epochs=max_epochs,
+                 val_interval=10,
+                 dynamic_intervals=[((max_epochs - close_mosaic_epochs),
+                                     _base_.val_interval_stage2)])
+optim_wrapper = dict(optimizer=dict(
+    _delete_=True,
+    type='AdamW',
+    lr=base_lr,
+    weight_decay=weight_decay,
+    batch_size_per_gpu=train_batch_size_per_gpu),
+                     paramwise_cfg=dict(bias_decay_mult=0.0,
+                                        norm_decay_mult=0.0,
+                                        custom_keys={
+                                            'backbone.text_model':
+                                            dict(lr_mult=0.01),
+                                            'logit_scale':
+                                            dict(weight_decay=0.0)
+                                        }),
+                     constructor='YOLOWv5OptimizerConstructor')
diff --git a/mmdetection_practice/configs/pretrain/yolo_world_v2_x_vlpan_bn_2e-3_100e_4x8gpus_obj365v1_goldg_cc3mlite_train_lvis_minival.py b/mmdetection_practice/configs/pretrain/yolo_world_v2_x_vlpan_bn_2e-3_100e_4x8gpus_obj365v1_goldg_cc3mlite_train_lvis_minival.py
new file mode 100644
index 0000000..a2ba421
--- /dev/null
+++ b/mmdetection_practice/configs/pretrain/yolo_world_v2_x_vlpan_bn_2e-3_100e_4x8gpus_obj365v1_goldg_cc3mlite_train_lvis_minival.py
@@ -0,0 +1,183 @@
+_base_ = ('../../third_party/mmyolo/configs/yolov8/'
+          'yolov8_x_syncbn_fast_8xb16-500e_coco.py')
+custom_imports = dict(imports=['yolo_world'],
+                      allow_failed_imports=False)
+
+# hyper-parameters
+num_classes = 1203
+num_training_classes = 80
+max_epochs = 100  # Maximum training epochs
+close_mosaic_epochs = 2
+save_epoch_intervals = 2
+text_channels = 512
+neck_embed_channels = [128, 256, _base_.last_stage_out_channels // 2]
+neck_num_heads = [4, 8, _base_.last_stage_out_channels // 2 // 32]
+base_lr = 2e-3
+weight_decay = 0.05 / 2
+train_batch_size_per_gpu = 16
+# text_model_name = '../pretrained_models/clip-vit-base-patch32-projection'
+text_model_name = 'openai/clip-vit-base-patch32'
+# model settings
+model = dict(
+    type='YOLOWorldDetector',
+    mm_neck=True,
+    num_train_classes=num_training_classes,
+    num_test_classes=num_classes,
+    data_preprocessor=dict(type='YOLOWDetDataPreprocessor'),
+    backbone=dict(
+        _delete_=True,
+        type='MultiModalYOLOBackbone',
+        image_model={{_base_.model.backbone}},
+        text_model=dict(
+            type='HuggingCLIPLanguageBackbone',
+            model_name=text_model_name,
+            frozen_modules=['all'])),
+    neck=dict(type='YOLOWorldPAFPN',
+              guide_channels=text_channels,
+              embed_channels=neck_embed_channels,
+              num_heads=neck_num_heads,
+              block_cfg=dict(type='MaxSigmoidCSPLayerWithTwoConv')),
+    bbox_head=dict(type='YOLOWorldHead',
+                   head_module=dict(type='YOLOWorldHeadModule',
+                                    use_bn_head=True,
+                                    embed_dims=text_channels,
+                                    num_classes=num_training_classes)),
+    train_cfg=dict(assigner=dict(num_classes=num_training_classes)))
+
+# dataset settings
+text_transform = [
+    dict(type='RandomLoadText',
+         num_neg_samples=(num_classes, num_classes),
+         max_num_samples=num_training_classes,
+         padding_to_max=True,
+         padding_value=''),
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                    'flip_direction', 'texts'))
+]
+train_pipeline = [
+    *_base_.pre_transform,
+    dict(type='MultiModalMosaic',
+         img_scale=_base_.img_scale,
+         pad_val=114.0,
+         pre_transform=_base_.pre_transform),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        scaling_ratio_range=(1 - _base_.affine_scale, 1 + _base_.affine_scale),
+        max_aspect_ratio=_base_.max_aspect_ratio,
+        border=(-_base_.img_scale[0] // 2, -_base_.img_scale[1] // 2),
+        border_val=(114, 114, 114)),
+    *_base_.last_transform[:-1],
+    *text_transform,
+]
+train_pipeline_stage2 = [*_base_.train_pipeline_stage2[:-1], *text_transform]
+obj365v1_train_dataset = dict(
+    type='MultiModalDataset',
+    dataset=dict(
+        type='YOLOv5Objects365V1Dataset',
+        data_root='data/objects365v1/',
+        ann_file='annotations/objects365_train.json',
+        data_prefix=dict(img='train/'),
+        filter_cfg=dict(filter_empty_gt=False, min_size=32)),
+    class_text_path='data/texts/obj365v1_class_texts.json',
+    pipeline=train_pipeline)
+
+mg_train_dataset = dict(type='YOLOv5MixedGroundingDataset',
+                        data_root='data/mixed_grounding/',
+                        ann_file='annotations/final_mixed_train_no_coco.json',
+                        data_prefix=dict(img='gqa/images/'),
+                        filter_cfg=dict(filter_empty_gt=False, min_size=32),
+                        pipeline=train_pipeline)
+
+flickr_train_dataset = dict(
+    type='YOLOv5MixedGroundingDataset',
+    data_root='data/flickr/',
+    ann_file='annotations/final_flickr_separateGT_train.json',
+    data_prefix=dict(img='full_images/'),
+    filter_cfg=dict(filter_empty_gt=True, min_size=32),
+    pipeline=train_pipeline)
+
+
+cc3m_train_dataset = dict(type='YOLOv5GeneralGroundingDataset',
+                          data_root='data/cc3m/',
+                          ann_file='annotations/cc3m_pseudo_annotations.json',
+                          data_prefix=dict(img='training'),
+                          filter_cfg=dict(filter_empty_gt=True, min_size=32),
+                          pipeline=train_pipeline)
+
+
+train_dataloader = dict(batch_size=train_batch_size_per_gpu,
+                        collate_fn=dict(type='yolow_collate'),
+                        dataset=dict(_delete_=True,
+                                     type='ConcatDataset',
+                                     datasets=[
+                                         obj365v1_train_dataset,
+                                         flickr_train_dataset,
+                                         mg_train_dataset,
+                                         cc3m_train_dataset
+                                     ],
+                                     ignore_keys=['classes', 'palette']))
+
+test_pipeline = [
+    *_base_.test_pipeline[:-1],
+    dict(type='LoadText'),
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                    'scale_factor', 'pad_param', 'texts'))
+]
+
+coco_val_dataset = dict(
+    _delete_=True,
+    type='MultiModalDataset',
+    dataset=dict(type='YOLOv5LVISV1Dataset',
+                 data_root='data/coco/',
+                 test_mode=True,
+                 ann_file='lvis/lvis_v1_minival_inserted_image_name.json',
+                 data_prefix=dict(img=''),
+                 batch_shapes_cfg=None),
+    class_text_path='data/texts/lvis_v1_class_texts.json',
+    pipeline=test_pipeline)
+val_dataloader = dict(dataset=coco_val_dataset)
+test_dataloader = val_dataloader
+
+val_evaluator = dict(type='mmdet.LVISMetric',
+                     ann_file='data/coco/lvis/lvis_v1_minival_inserted_image_name.json',
+                     metric='bbox')
+test_evaluator = val_evaluator
+
+# training settings
+default_hooks = dict(param_scheduler=dict(max_epochs=max_epochs),
+                     checkpoint=dict(interval=save_epoch_intervals,
+                                     rule='greater'))
+custom_hooks = [
+    dict(type='EMAHook',
+         ema_type='ExpMomentumEMA',
+         momentum=0.0001,
+         update_buffers=True,
+         strict_load=False,
+         priority=49),
+    dict(type='mmdet.PipelineSwitchHook',
+         switch_epoch=max_epochs - close_mosaic_epochs,
+         switch_pipeline=train_pipeline_stage2)
+]
+train_cfg = dict(max_epochs=max_epochs,
+                 val_interval=10,
+                 dynamic_intervals=[((max_epochs - close_mosaic_epochs),
+                                     _base_.val_interval_stage2)])
+optim_wrapper = dict(optimizer=dict(
+    _delete_=True,
+    type='AdamW',
+    lr=base_lr,
+    weight_decay=weight_decay,
+    batch_size_per_gpu=train_batch_size_per_gpu),
+                     paramwise_cfg=dict(bias_decay_mult=0.0,
+                                        norm_decay_mult=0.0,
+                                        custom_keys={
+                                            'backbone.text_model':
+                                            dict(lr_mult=0.01),
+                                            'logit_scale':
+                                            dict(weight_decay=0.0)
+                                        }),
+                     constructor='YOLOWv5OptimizerConstructor')
diff --git a/mmdetection_practice/configs/pretrain/yolo_world_v2_x_vlpan_bn_2e-3_100e_4x8gpus_obj365v1_goldg_train_1280ft_lvis_minival.py b/mmdetection_practice/configs/pretrain/yolo_world_v2_x_vlpan_bn_2e-3_100e_4x8gpus_obj365v1_goldg_train_1280ft_lvis_minival.py
new file mode 100644
index 0000000..ab4cd23
--- /dev/null
+++ b/mmdetection_practice/configs/pretrain/yolo_world_v2_x_vlpan_bn_2e-3_100e_4x8gpus_obj365v1_goldg_train_1280ft_lvis_minival.py
@@ -0,0 +1,199 @@
+_base_ = ('../../third_party/mmyolo/configs/yolov8/'
+          'yolov8_x_syncbn_fast_8xb16-500e_coco.py')
+custom_imports = dict(imports=['yolo_world'],
+                      allow_failed_imports=False)
+
+# hyper-parameters
+num_classes = 1203
+num_training_classes = 80
+max_epochs = 100  # Maximum training epochs
+close_mosaic_epochs = 2
+save_epoch_intervals = 2
+text_channels = 512
+neck_embed_channels = [128, 256, _base_.last_stage_out_channels // 2]
+neck_num_heads = [4, 8, _base_.last_stage_out_channels // 2 // 32]
+base_lr = 2e-3
+weight_decay = 0.05 / 2
+train_batch_size_per_gpu = 16
+text_model_name = '../pretrained_models/clip-vit-base-patch32-projection'
+# text_model_name = 'openai/clip-vit-base-patch32'
+img_scale = (1280, 1280)
+
+# model settings
+model = dict(
+    type='YOLOWorldDetector',
+    mm_neck=True,
+    num_train_classes=num_training_classes,
+    num_test_classes=num_classes,
+    data_preprocessor=dict(type='YOLOWDetDataPreprocessor'),
+    backbone=dict(
+        _delete_=True,
+        type='MultiModalYOLOBackbone',
+        image_model={{_base_.model.backbone}},
+        text_model=dict(
+            type='HuggingCLIPLanguageBackbone',
+            model_name=text_model_name,
+            frozen_modules=['all'])),
+    neck=dict(type='YOLOWorldPAFPN',
+              guide_channels=text_channels,
+              embed_channels=neck_embed_channels,
+              num_heads=neck_num_heads,
+              block_cfg=dict(type='MaxSigmoidCSPLayerWithTwoConv')),
+    bbox_head=dict(type='YOLOWorldHead',
+                   head_module=dict(type='YOLOWorldHeadModule',
+                                    use_bn_head=True,
+                                    embed_dims=text_channels,
+                                    num_classes=num_training_classes)),
+    train_cfg=dict(assigner=dict(num_classes=num_training_classes)))
+
+# dataset settings
+text_transform = [
+    dict(type='RandomLoadText',
+         num_neg_samples=(num_classes, num_classes),
+         max_num_samples=num_training_classes,
+         padding_to_max=True,
+         padding_value=''),
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                    'flip_direction', 'texts'))
+]
+train_pipeline = [
+    *_base_.pre_transform,
+    dict(type='MultiModalMosaic',
+         img_scale=img_scale,
+         pad_val=114.0,
+         pre_transform=_base_.pre_transform),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        scaling_ratio_range=(1 - _base_.affine_scale, 1 + _base_.affine_scale),
+        max_aspect_ratio=_base_.max_aspect_ratio,
+        border=(-img_scale[0] // 2, -img_scale[1] // 2),
+        border_val=(114, 114, 114)),
+    *_base_.last_transform[:-1],
+    *text_transform,
+]
+train_pipeline_stage2 = [
+    *_base_.pre_transform,
+    dict(type='YOLOv5KeepRatioResize', scale=img_scale),
+    dict(
+        type='LetterResize',
+        scale=img_scale,
+        allow_scale_up=True,
+        pad_val=dict(img=114.0)),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        scaling_ratio_range=(1 - _base_.affine_scale, 1 + _base_.affine_scale),
+        max_aspect_ratio=_base_.max_aspect_ratio,
+        border_val=(114, 114, 114)),
+    *_base_.last_transform[:-1],
+    *text_transform
+]
+
+obj365v1_train_dataset = dict(
+    type='MultiModalDataset',
+    dataset=dict(
+        type='YOLOv5Objects365V1Dataset',
+        data_root='data/objects365v1/',
+        ann_file='annotations/objects365_train.json',
+        data_prefix=dict(img='train/'),
+        filter_cfg=dict(filter_empty_gt=False, min_size=32)),
+    class_text_path='data/texts/obj365v1_class_texts.json',
+    pipeline=train_pipeline)
+
+mg_train_dataset = dict(type='YOLOv5MixedGroundingDataset',
+                        data_root='data/mixed_grounding/',
+                        ann_file='annotations/final_mixed_train_no_coco.json',
+                        data_prefix=dict(img='gqa/images/'),
+                        filter_cfg=dict(filter_empty_gt=False, min_size=32),
+                        pipeline=train_pipeline)
+
+flickr_train_dataset = dict(
+    type='YOLOv5MixedGroundingDataset',
+    data_root='data/flickr/',
+    ann_file='annotations/final_flickr_separateGT_train.json',
+    data_prefix=dict(img='full_images/'),
+    filter_cfg=dict(filter_empty_gt=True, min_size=32),
+    pipeline=train_pipeline)
+
+train_dataloader = dict(batch_size=train_batch_size_per_gpu,
+                        collate_fn=dict(type='yolow_collate'),
+                        dataset=dict(_delete_=True,
+                                     type='ConcatDataset',
+                                     datasets=[
+                                         obj365v1_train_dataset,
+                                         flickr_train_dataset, mg_train_dataset
+                                     ],
+                                     ignore_keys=['classes', 'palette']))
+
+test_pipeline = [
+    dict(type='LoadImageFromFile'),
+    dict(type='YOLOv5KeepRatioResize', scale=img_scale),
+    dict(
+        type='LetterResize',
+        scale=img_scale,
+        allow_scale_up=False,
+        pad_val=dict(img=114)),
+    dict(type='LoadAnnotations', with_bbox=True, _scope_='mmdet'),
+    dict(type='LoadText'),
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                    'scale_factor', 'pad_param', 'texts'))
+]
+
+coco_val_dataset = dict(
+    _delete_=True,
+    type='MultiModalDataset',
+    dataset=dict(type='YOLOv5LVISV1Dataset',
+                 data_root='data/coco/',
+                 test_mode=True,
+                 ann_file='lvis/lvis_v1_minival_inserted_image_name.json',
+                 data_prefix=dict(img=''),
+                 batch_shapes_cfg=None),
+    class_text_path='data/texts/lvis_v1_class_texts.json',
+    pipeline=test_pipeline)
+val_dataloader = dict(dataset=coco_val_dataset)
+test_dataloader = val_dataloader
+
+val_evaluator = dict(type='mmdet.LVISMetric',
+                     ann_file='data/coco/lvis/lvis_v1_minival_inserted_image_name.json',
+                     metric='bbox')
+test_evaluator = val_evaluator
+
+# training settings
+default_hooks = dict(param_scheduler=dict(max_epochs=max_epochs),
+                     checkpoint=dict(interval=save_epoch_intervals,
+                                     rule='greater'))
+custom_hooks = [
+    dict(type='EMAHook',
+         ema_type='ExpMomentumEMA',
+         momentum=0.0001,
+         update_buffers=True,
+         strict_load=False,
+         priority=49),
+    dict(type='mmdet.PipelineSwitchHook',
+         switch_epoch=max_epochs - close_mosaic_epochs,
+         switch_pipeline=train_pipeline_stage2)
+]
+train_cfg = dict(max_epochs=max_epochs,
+                 val_interval=10,
+                 dynamic_intervals=[((max_epochs - close_mosaic_epochs),
+                                     _base_.val_interval_stage2)])
+optim_wrapper = dict(optimizer=dict(
+    _delete_=True,
+    type='AdamW',
+    lr=base_lr,
+    weight_decay=weight_decay,
+    batch_size_per_gpu=train_batch_size_per_gpu),
+                     paramwise_cfg=dict(bias_decay_mult=0.0,
+                                        norm_decay_mult=0.0,
+                                        custom_keys={
+                                            'backbone.text_model':
+                                            dict(lr_mult=0.01),
+                                            'logit_scale':
+                                            dict(weight_decay=0.0)
+                                        }),
+                     constructor='YOLOWv5OptimizerConstructor')
diff --git a/mmdetection_practice/configs/pretrain/yolo_world_v2_x_vlpan_bn_2e-3_100e_4x8gpus_obj365v1_goldg_train_lvis_minival.py b/mmdetection_practice/configs/pretrain/yolo_world_v2_x_vlpan_bn_2e-3_100e_4x8gpus_obj365v1_goldg_train_lvis_minival.py
new file mode 100644
index 0000000..e3c1226
--- /dev/null
+++ b/mmdetection_practice/configs/pretrain/yolo_world_v2_x_vlpan_bn_2e-3_100e_4x8gpus_obj365v1_goldg_train_lvis_minival.py
@@ -0,0 +1,171 @@
+_base_ = ('../../third_party/mmyolo/configs/yolov8/'
+          'yolov8_x_syncbn_fast_8xb16-500e_coco.py')
+custom_imports = dict(imports=['yolo_world'],
+                      allow_failed_imports=False)
+
+# hyper-parameters
+num_classes = 1203
+num_training_classes = 80
+max_epochs = 100  # Maximum training epochs
+close_mosaic_epochs = 2
+save_epoch_intervals = 2
+text_channels = 512
+neck_embed_channels = [128, 256, _base_.last_stage_out_channels // 2]
+neck_num_heads = [4, 8, _base_.last_stage_out_channels // 2 // 32]
+base_lr = 2e-3
+weight_decay = 0.05 / 2
+train_batch_size_per_gpu = 16
+# text_model_name = '../pretrained_models/clip-vit-base-patch32-projection'
+text_model_name = 'openai/clip-vit-base-patch32'
+# model settings
+model = dict(
+    type='YOLOWorldDetector',
+    mm_neck=True,
+    num_train_classes=num_training_classes,
+    num_test_classes=num_classes,
+    data_preprocessor=dict(type='YOLOWDetDataPreprocessor'),
+    backbone=dict(
+        _delete_=True,
+        type='MultiModalYOLOBackbone',
+        image_model={{_base_.model.backbone}},
+        text_model=dict(
+            type='HuggingCLIPLanguageBackbone',
+            model_name=text_model_name,
+            frozen_modules=['all'])),
+    neck=dict(type='YOLOWorldPAFPN',
+              guide_channels=text_channels,
+              embed_channels=neck_embed_channels,
+              num_heads=neck_num_heads,
+              block_cfg=dict(type='MaxSigmoidCSPLayerWithTwoConv')),
+    bbox_head=dict(type='YOLOWorldHead',
+                   head_module=dict(type='YOLOWorldHeadModule',
+                                    use_bn_head=True,
+                                    embed_dims=text_channels,
+                                    num_classes=num_training_classes)),
+    train_cfg=dict(assigner=dict(num_classes=num_training_classes)))
+
+# dataset settings
+text_transform = [
+    dict(type='RandomLoadText',
+         num_neg_samples=(num_classes, num_classes),
+         max_num_samples=num_training_classes,
+         padding_to_max=True,
+         padding_value=''),
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                    'flip_direction', 'texts'))
+]
+train_pipeline = [
+    *_base_.pre_transform,
+    dict(type='MultiModalMosaic',
+         img_scale=_base_.img_scale,
+         pad_val=114.0,
+         pre_transform=_base_.pre_transform),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        scaling_ratio_range=(1 - _base_.affine_scale, 1 + _base_.affine_scale),
+        max_aspect_ratio=_base_.max_aspect_ratio,
+        border=(-_base_.img_scale[0] // 2, -_base_.img_scale[1] // 2),
+        border_val=(114, 114, 114)),
+    *_base_.last_transform[:-1],
+    *text_transform,
+]
+train_pipeline_stage2 = [*_base_.train_pipeline_stage2[:-1], *text_transform]
+obj365v1_train_dataset = dict(
+    type='MultiModalDataset',
+    dataset=dict(
+        type='YOLOv5Objects365V1Dataset',
+        data_root='data/objects365v1/',
+        ann_file='annotations/objects365_train.json',
+        data_prefix=dict(img='train/'),
+        filter_cfg=dict(filter_empty_gt=False, min_size=32)),
+    class_text_path='data/texts/obj365v1_class_texts.json',
+    pipeline=train_pipeline)
+
+mg_train_dataset = dict(type='YOLOv5MixedGroundingDataset',
+                        data_root='data/mixed_grounding/',
+                        ann_file='annotations/final_mixed_train_no_coco.json',
+                        data_prefix=dict(img='gqa/images/'),
+                        filter_cfg=dict(filter_empty_gt=False, min_size=32),
+                        pipeline=train_pipeline)
+
+flickr_train_dataset = dict(
+    type='YOLOv5MixedGroundingDataset',
+    data_root='data/flickr/',
+    ann_file='annotations/final_flickr_separateGT_train.json',
+    data_prefix=dict(img='full_images/'),
+    filter_cfg=dict(filter_empty_gt=True, min_size=32),
+    pipeline=train_pipeline)
+
+train_dataloader = dict(batch_size=train_batch_size_per_gpu,
+                        collate_fn=dict(type='yolow_collate'),
+                        dataset=dict(_delete_=True,
+                                     type='ConcatDataset',
+                                     datasets=[
+                                         obj365v1_train_dataset,
+                                         flickr_train_dataset, mg_train_dataset
+                                     ],
+                                     ignore_keys=['classes', 'palette']))
+
+test_pipeline = [
+    *_base_.test_pipeline[:-1],
+    dict(type='LoadText'),
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                    'scale_factor', 'pad_param', 'texts'))
+]
+coco_val_dataset = dict(
+    _delete_=True,
+    type='MultiModalDataset',
+    dataset=dict(type='YOLOv5LVISV1Dataset',
+                 data_root='data/coco/',
+                 test_mode=True,
+                 ann_file='lvis/lvis_v1_minival_inserted_image_name.json',
+                 data_prefix=dict(img=''),
+                 batch_shapes_cfg=None),
+    class_text_path='data/texts/lvis_v1_class_texts.json',
+    pipeline=test_pipeline)
+val_dataloader = dict(dataset=coco_val_dataset)
+test_dataloader = val_dataloader
+
+val_evaluator = dict(type='mmdet.LVISMetric',
+                     ann_file='data/coco/lvis/lvis_v1_minival_inserted_image_name.json',
+                     metric='bbox')
+test_evaluator = val_evaluator
+
+# training settings
+default_hooks = dict(param_scheduler=dict(max_epochs=max_epochs),
+                     checkpoint=dict(interval=save_epoch_intervals,
+                                     rule='greater'))
+custom_hooks = [
+    dict(type='EMAHook',
+         ema_type='ExpMomentumEMA',
+         momentum=0.0001,
+         update_buffers=True,
+         strict_load=False,
+         priority=49),
+    dict(type='mmdet.PipelineSwitchHook',
+         switch_epoch=max_epochs - close_mosaic_epochs,
+         switch_pipeline=train_pipeline_stage2)
+]
+train_cfg = dict(max_epochs=max_epochs,
+                 val_interval=10,
+                 dynamic_intervals=[((max_epochs - close_mosaic_epochs),
+                                     _base_.val_interval_stage2)])
+optim_wrapper = dict(optimizer=dict(
+    _delete_=True,
+    type='AdamW',
+    lr=base_lr,
+    weight_decay=weight_decay,
+    batch_size_per_gpu=train_batch_size_per_gpu),
+                     paramwise_cfg=dict(bias_decay_mult=0.0,
+                                        norm_decay_mult=0.0,
+                                        custom_keys={
+                                            'backbone.text_model':
+                                            dict(lr_mult=0.01),
+                                            'logit_scale':
+                                            dict(weight_decay=0.0)
+                                        }),
+                     constructor='YOLOWv5OptimizerConstructor')
diff --git a/mmdetection_practice/configs/pretrain/yolo_world_v2_xl_vlpan_bn_2e-3_100e_4x8gpus_obj365v1_goldg_train_lvis_minival.py b/mmdetection_practice/configs/pretrain/yolo_world_v2_xl_vlpan_bn_2e-3_100e_4x8gpus_obj365v1_goldg_train_lvis_minival.py
new file mode 100644
index 0000000..35977e8
--- /dev/null
+++ b/mmdetection_practice/configs/pretrain/yolo_world_v2_xl_vlpan_bn_2e-3_100e_4x8gpus_obj365v1_goldg_train_lvis_minival.py
@@ -0,0 +1,185 @@
+_base_ = ('../../third_party/mmyolo/configs/yolov8/'
+          'yolov8_x_syncbn_fast_8xb16-500e_coco.py')
+custom_imports = dict(imports=['yolo_world'],
+                      allow_failed_imports=False)
+
+# hyper-parameters
+num_classes = 1203
+num_training_classes = 80
+max_epochs = 100  # Maximum training epochs
+close_mosaic_epochs = 2
+save_epoch_intervals = 2
+text_channels = 512
+neck_embed_channels = [128, 256, _base_.last_stage_out_channels // 2]
+neck_num_heads = [4, 8, _base_.last_stage_out_channels // 2 // 32]
+base_lr = 2e-3
+weight_decay = 0.05 / 2
+train_batch_size_per_gpu = 16
+text_model_name = '../pretrained_models/clip-vit-base-patch32-projection'
+text_model_name = 'openai/clip-vit-base-patch32'
+
+# scaling model from X to XL
+deepen_factor = 1.0
+widen_factor = 1.5
+
+backbone = _base_.model.backbone
+backbone.update(
+    deepen_factor=deepen_factor,
+    widen_factor=widen_factor
+)
+
+# model settings
+model = dict(
+    type='YOLOWorldDetector',
+    mm_neck=True,
+    num_train_classes=num_training_classes,
+    num_test_classes=num_classes,
+    data_preprocessor=dict(type='YOLOWDetDataPreprocessor'),
+    backbone=dict(
+        _delete_=True,
+        type='MultiModalYOLOBackbone',
+        image_model=backbone,
+        text_model=dict(
+            type='HuggingCLIPLanguageBackbone',
+            model_name=text_model_name,
+            frozen_modules=['all'])),
+    neck=dict(type='YOLOWorldPAFPN',
+              deepen_factor=deepen_factor,
+              widen_factor=widen_factor,
+              guide_channels=text_channels,
+              embed_channels=neck_embed_channels,
+              num_heads=neck_num_heads,
+              block_cfg=dict(type='MaxSigmoidCSPLayerWithTwoConv')),
+    bbox_head=dict(type='YOLOWorldHead',
+                   head_module=dict(type='YOLOWorldHeadModule',
+                                    widen_factor=widen_factor,
+                                    use_bn_head=True,
+                                    embed_dims=text_channels,
+                                    num_classes=num_training_classes)),
+    train_cfg=dict(assigner=dict(num_classes=num_training_classes)))
+
+# dataset settings
+text_transform = [
+    dict(type='RandomLoadText',
+         num_neg_samples=(num_classes, num_classes),
+         max_num_samples=num_training_classes,
+         padding_to_max=True,
+         padding_value=''),
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                    'flip_direction', 'texts'))
+]
+train_pipeline = [
+    *_base_.pre_transform,
+    dict(type='MultiModalMosaic',
+         img_scale=_base_.img_scale,
+         pad_val=114.0,
+         pre_transform=_base_.pre_transform),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        scaling_ratio_range=(1 - _base_.affine_scale, 1 + _base_.affine_scale),
+        max_aspect_ratio=_base_.max_aspect_ratio,
+        border=(-_base_.img_scale[0] // 2, -_base_.img_scale[1] // 2),
+        border_val=(114, 114, 114)),
+    *_base_.last_transform[:-1],
+    *text_transform,
+]
+train_pipeline_stage2 = [*_base_.train_pipeline_stage2[:-1], *text_transform]
+obj365v1_train_dataset = dict(
+    type='MultiModalDataset',
+    dataset=dict(
+        type='YOLOv5Objects365V1Dataset',
+        data_root='data/objects365v1/',
+        ann_file='annotations/objects365_train.json',
+        data_prefix=dict(img='train/'),
+        filter_cfg=dict(filter_empty_gt=False, min_size=32)),
+    class_text_path='data/texts/obj365v1_class_texts.json',
+    pipeline=train_pipeline)
+
+mg_train_dataset = dict(type='YOLOv5MixedGroundingDataset',
+                        data_root='data/mixed_grounding/',
+                        ann_file='annotations/final_mixed_train_no_coco.json',
+                        data_prefix=dict(img='gqa/images/'),
+                        filter_cfg=dict(filter_empty_gt=False, min_size=32),
+                        pipeline=train_pipeline)
+
+flickr_train_dataset = dict(
+    type='YOLOv5MixedGroundingDataset',
+    data_root='data/flickr/',
+    ann_file='annotations/final_flickr_separateGT_train.json',
+    data_prefix=dict(img='full_images/'),
+    filter_cfg=dict(filter_empty_gt=True, min_size=32),
+    pipeline=train_pipeline)
+
+train_dataloader = dict(batch_size=train_batch_size_per_gpu,
+                        collate_fn=dict(type='yolow_collate'),
+                        dataset=dict(_delete_=True,
+                                     type='ConcatDataset',
+                                     datasets=[
+                                         obj365v1_train_dataset,
+                                         flickr_train_dataset, mg_train_dataset
+                                     ],
+                                     ignore_keys=['classes', 'palette']))
+
+test_pipeline = [
+    *_base_.test_pipeline[:-1],
+    dict(type='LoadText'),
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                    'scale_factor', 'pad_param', 'texts'))
+]
+coco_val_dataset = dict(
+    _delete_=True,
+    type='MultiModalDataset',
+    dataset=dict(type='YOLOv5LVISV1Dataset',
+                 data_root='data/coco/',
+                 test_mode=True,
+                 ann_file='lvis/lvis_v1_minival_inserted_image_name.json',
+                 data_prefix=dict(img=''),
+                 batch_shapes_cfg=None),
+    class_text_path='data/texts/lvis_v1_class_texts.json',
+    pipeline=test_pipeline)
+val_dataloader = dict(dataset=coco_val_dataset)
+test_dataloader = val_dataloader
+
+val_evaluator = dict(type='mmdet.LVISMetric',
+                     ann_file='data/coco/lvis/lvis_v1_minival_inserted_image_name.json',
+                     metric='bbox')
+test_evaluator = val_evaluator
+
+# training settings
+default_hooks = dict(param_scheduler=dict(max_epochs=max_epochs),
+                     checkpoint=dict(interval=save_epoch_intervals,
+                                     rule='greater'))
+custom_hooks = [
+    dict(type='EMAHook',
+         ema_type='ExpMomentumEMA',
+         momentum=0.0001,
+         update_buffers=True,
+         strict_load=False,
+         priority=49),
+    dict(type='mmdet.PipelineSwitchHook',
+         switch_epoch=max_epochs - close_mosaic_epochs,
+         switch_pipeline=train_pipeline_stage2)
+]
+train_cfg = dict(max_epochs=max_epochs,
+                 val_interval=10,
+                 dynamic_intervals=[((max_epochs - close_mosaic_epochs),
+                                     _base_.val_interval_stage2)])
+optim_wrapper = dict(optimizer=dict(
+    _delete_=True,
+    type='AdamW',
+    lr=base_lr,
+    weight_decay=weight_decay,
+    batch_size_per_gpu=train_batch_size_per_gpu),
+                     paramwise_cfg=dict(bias_decay_mult=0.0,
+                                        norm_decay_mult=0.0,
+                                        custom_keys={
+                                            'backbone.text_model':
+                                            dict(lr_mult=0.01),
+                                            'logit_scale':
+                                            dict(weight_decay=0.0)
+                                        }),
+                     constructor='YOLOWv5OptimizerConstructor')
diff --git a/mmdetection_practice/configs/pretrain_v1/README.md b/mmdetection_practice/configs/pretrain_v1/README.md
new file mode 100644
index 0000000..3290c7e
--- /dev/null
+++ b/mmdetection_practice/configs/pretrain_v1/README.md
@@ -0,0 +1,21 @@
+## Pre-training YOLO-World-v1
+
+> The YOLO-World-v1 is an initial version, and now is nearly deprecated! We strongly suggest you use the [latest version](../pretrain/).
+
+
+
+### Zero-shot Inference on LVIS dataset
+
+| model                                                                                                                | Pre-train Data       | Size | AP<sup>mini</su> | AP<sub>r</sub> | AP<sub>c</sub> | AP<sub>f</sub> | AP<sup>val</su> | AP<sub>r</sub> | AP<sub>c</sub> | AP<sub>f</sub> |                                                                                        weights                                                                                         |
+| :------------------------------------------------------------------------------------------------------------------- | :------------------- | :----------------- | :--------------: | :------------: | :------------: | :------------: | :-------------: | :------------: | :------------: | :------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: |
+| [YOLO-World-S](./yolo_world_s_dual_vlpan_l2norm_2e-3_100e_4x8gpus_obj365v1_goldg_train_lvis_minival.py)   | O365+GoldG           |        640        |       24.3       |      16.6      |      22.1      |      27.7      |      17.8       |      11.0      |      14.8      |      24.0      |    [HF Checkpoints 🤗](https://huggingface.co/wondervictor/YOLO-World/resolve/main/yolo_world_s_clip_base_dual_vlpan_2e-3adamw_32xb16_100e_o365_goldg_train_pretrained-18bea4d2.pth)    |
+| [YOLO-World-M](./yolo_world_m_dual_l2norm_2e-4_100e_4x8gpus_obj365v1_goldg_train_lvis_minival.py)   | O365+GoldG           |        640        |       28.6       |      19.7      |      26.6      |      31.9      |      22.3       |      16.2      |      19.0      |      28.7      |    [HF Checkpoints 🤗](https://huggingface.co/wondervictor/YOLO-World/resolve/main/yolo_world_m_clip_base_dual_vlpan_2e-3adamw_32xb16_100e_o365_goldg_train_pretrained-2b7bd1be.pth)    |
+| [YOLO-World-L](./yolo_world_l_dual_vlpan_l2norm_2e-3_100e_4x8gpus_obj365v1_goldg_train_lvis_minival.py)   | O365+GoldG           |        640        |       32.5       |      22.3      |      30.6      |      36.1      |      24.8       |      17.8      |      22.4      |      32.5      |    [HF Checkpoints 🤗](https://huggingface.co/wondervictor/YOLO-World/resolve/main/yolo_world_l_clip_base_dual_vlpan_2e-3adamw_32xb16_100e_o365_goldg_train_pretrained-0e566235.pth)    |
+| [YOLO-World-L](./yolo_world_l_dual_vlpan_l2norm_2e-3_100e_4x8gpus_obj365v1_goldg_train_lvis_minival.py) | O365+GoldG+CC3M-Lite |        640        |       33.0       |      23.6      |      32.0      |      35.5      |      25.3       |      18.0      |      22.1      |      32.1      | [HF Checkpoints 🤗](https://huggingface.co/wondervictor/YOLO-World/blob/main/yolo_world_l_clip_base_dual_vlpan_2e-3adamw_32xb16_100e_o365_goldg_cc3mlite_train_pretrained-7a5eea3b.pth) |
+| [YOLO-World-X](./yolo_world_x_dual_vlpan_l2norm_2e-3_100e_4x8gpus_obj365v1_goldg_train_lvis_minival.py) | O365+GoldG+CC3M-Lite | 640 | 33.4 | 24.4 | 31.6 | 36.6 | 26.6 | 19.2 | 23.5 | 33.2 | [HF Checkpoints 🤗](https://huggingface.co/wondervictor/YOLO-World/blob/main/yolo_world_x_clip_base_dual_vlpan_2e-3adamw_32xb16_100e_o365_goldg_cc3mlite_train_pretrained-8cf6b025.pth) |
+
+
+**NOTE:**
+1. AP<sup>mini</sup>: evaluated on LVIS `minival`.
+3. AP<sup>val</sup>: evaluated on LVIS `val 1.0`.
+4. [HuggingFace Mirror](https://hf-mirror.com/) provides the mirror of HuggingFace, which is a choice for users who are unable to reach.
\ No newline at end of file
diff --git a/mmdetection_practice/configs/pretrain_v1/yolo_world_l_dual_vlpan_l2norm_2e-3_100e_4x8gpus_obj365v1_goldg_train_lvis_minival.py b/mmdetection_practice/configs/pretrain_v1/yolo_world_l_dual_vlpan_l2norm_2e-3_100e_4x8gpus_obj365v1_goldg_train_lvis_minival.py
new file mode 100644
index 0000000..e88be2e
--- /dev/null
+++ b/mmdetection_practice/configs/pretrain_v1/yolo_world_l_dual_vlpan_l2norm_2e-3_100e_4x8gpus_obj365v1_goldg_train_lvis_minival.py
@@ -0,0 +1,172 @@
+_base_ = ('../../third_party/mmyolo/configs/yolov8/'
+          'yolov8_l_syncbn_fast_8xb16-500e_coco.py')
+custom_imports = dict(imports=['yolo_world'],
+                      allow_failed_imports=False)
+
+# hyper-parameters
+num_classes = 1203
+num_training_classes = 80
+max_epochs = 100  # Maximum training epochs
+close_mosaic_epochs = 2
+save_epoch_intervals = 2
+text_channels = 512
+neck_embed_channels = [128, 256, _base_.last_stage_out_channels // 2]
+neck_num_heads = [4, 8, _base_.last_stage_out_channels // 2 // 32]
+base_lr = 2e-3
+weight_decay = 0.05 / 2
+train_batch_size_per_gpu = 16
+
+# model settings
+model = dict(
+    type='YOLOWorldDetector',
+    mm_neck=True,
+    num_train_classes=num_training_classes,
+    num_test_classes=num_classes,
+    data_preprocessor=dict(type='YOLOWDetDataPreprocessor'),
+    backbone=dict(
+        _delete_=True,
+        type='MultiModalYOLOBackbone',
+        image_model={{_base_.model.backbone}},
+        text_model=dict(
+            type='HuggingCLIPLanguageBackbone',
+            model_name='openai/clip-vit-base-patch32',
+            frozen_modules=['all'])),
+    neck=dict(type='YOLOWorldDualPAFPN',
+              guide_channels=text_channels,
+              embed_channels=neck_embed_channels,
+              num_heads=neck_num_heads,
+              block_cfg=dict(type='MaxSigmoidCSPLayerWithTwoConv'),
+              text_enhancder=dict(type='ImagePoolingAttentionModule',
+                                  embed_channels=256,
+                                  num_heads=8)),
+    bbox_head=dict(type='YOLOWorldHead',
+                   head_module=dict(type='YOLOWorldHeadModule',
+                                    embed_dims=text_channels,
+                                    num_classes=num_training_classes)),
+    train_cfg=dict(assigner=dict(num_classes=num_training_classes)))
+
+# dataset settings
+text_transform = [
+    dict(type='RandomLoadText',
+         num_neg_samples=(num_classes, num_classes),
+         max_num_samples=num_training_classes,
+         padding_to_max=True,
+         padding_value=''),
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                    'flip_direction', 'texts'))
+]
+train_pipeline = [
+    *_base_.pre_transform,
+    dict(type='MultiModalMosaic',
+         img_scale=_base_.img_scale,
+         pad_val=114.0,
+         pre_transform=_base_.pre_transform),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        scaling_ratio_range=(1 - _base_.affine_scale, 1 + _base_.affine_scale),
+        max_aspect_ratio=_base_.max_aspect_ratio,
+        border=(-_base_.img_scale[0] // 2, -_base_.img_scale[1] // 2),
+        border_val=(114, 114, 114)),
+    *_base_.last_transform[:-1],
+    *text_transform,
+]
+train_pipeline_stage2 = [*_base_.train_pipeline_stage2[:-1], *text_transform]
+obj365v1_train_dataset = dict(
+    type='MultiModalDataset',
+    dataset=dict(
+        type='YOLOv5Objects365V1Dataset',
+        data_root='data/objects365v1/',
+        ann_file='annotations/objects365_train.json',
+        data_prefix=dict(img='train/'),
+        filter_cfg=dict(filter_empty_gt=False, min_size=32)),
+    class_text_path='data/texts/obj365v1_class_texts.json',
+    pipeline=train_pipeline)
+
+mg_train_dataset = dict(type='YOLOv5MixedGroundingDataset',
+                        data_root='data/mixed_grounding/',
+                        ann_file='annotations/final_mixed_train_no_coco.json',
+                        data_prefix=dict(img='gqa/images/'),
+                        filter_cfg=dict(filter_empty_gt=False, min_size=32),
+                        pipeline=train_pipeline)
+
+flickr_train_dataset = dict(
+    type='YOLOv5MixedGroundingDataset',
+    data_root='data/flickr/',
+    ann_file='annotations/final_flickr_separateGT_train.json',
+    data_prefix=dict(img='full_images/'),
+    filter_cfg=dict(filter_empty_gt=True, min_size=32),
+    pipeline=train_pipeline)
+
+train_dataloader = dict(batch_size=train_batch_size_per_gpu,
+                        collate_fn=dict(type='yolow_collate'),
+                        dataset=dict(_delete_=True,
+                                     type='ConcatDataset',
+                                     datasets=[
+                                         obj365v1_train_dataset,
+                                         flickr_train_dataset, mg_train_dataset
+                                     ],
+                                     ignore_keys=['classes', 'palette']))
+
+test_pipeline = [
+    *_base_.test_pipeline[:-1],
+    dict(type='LoadText'),
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                    'scale_factor', 'pad_param', 'texts'))
+]
+coco_val_dataset = dict(
+    _delete_=True,
+    type='MultiModalDataset',
+    dataset=dict(type='YOLOv5LVISV1Dataset',
+                 data_root='data/coco/',
+                 test_mode=True,
+                 ann_file='lvis/lvis_v1_minival_inserted_image_name.json',
+                 data_prefix=dict(img=''),
+                 batch_shapes_cfg=None),
+    class_text_path='data/texts/lvis_v1_class_texts.json',
+    pipeline=test_pipeline)
+val_dataloader = dict(dataset=coco_val_dataset)
+test_dataloader = val_dataloader
+
+val_evaluator = dict(type='mmdet.LVISMetric',
+                     ann_file='data/coco/lvis/lvis_v1_minival_inserted_image_name.json',
+                     metric='bbox')
+test_evaluator = val_evaluator
+
+# training settings
+default_hooks = dict(param_scheduler=dict(max_epochs=max_epochs),
+                     checkpoint=dict(interval=save_epoch_intervals,
+                                     rule='greater'))
+custom_hooks = [
+    dict(type='EMAHook',
+         ema_type='ExpMomentumEMA',
+         momentum=0.0001,
+         update_buffers=True,
+         strict_load=False,
+         priority=49),
+    dict(type='mmdet.PipelineSwitchHook',
+         switch_epoch=max_epochs - close_mosaic_epochs,
+         switch_pipeline=train_pipeline_stage2)
+]
+train_cfg = dict(max_epochs=max_epochs,
+                 val_interval=10,
+                 dynamic_intervals=[((max_epochs - close_mosaic_epochs),
+                                     _base_.val_interval_stage2)])
+optim_wrapper = dict(optimizer=dict(
+    _delete_=True,
+    type='AdamW',
+    lr=base_lr,
+    weight_decay=weight_decay,
+    batch_size_per_gpu=train_batch_size_per_gpu),
+                     paramwise_cfg=dict(bias_decay_mult=0.0,
+                                        norm_decay_mult=0.0,
+                                        custom_keys={
+                                            'backbone.text_model':
+                                            dict(lr_mult=0.01),
+                                            'logit_scale':
+                                            dict(weight_decay=0.0)
+                                        }),
+                     constructor='YOLOWv5OptimizerConstructor')
diff --git a/mmdetection_practice/configs/pretrain_v1/yolo_world_l_dual_vlpan_l2norm_2e-3_100e_4x8gpus_obj365v1_goldg_train_lvis_val.py b/mmdetection_practice/configs/pretrain_v1/yolo_world_l_dual_vlpan_l2norm_2e-3_100e_4x8gpus_obj365v1_goldg_train_lvis_val.py
new file mode 100644
index 0000000..66333b1
--- /dev/null
+++ b/mmdetection_practice/configs/pretrain_v1/yolo_world_l_dual_vlpan_l2norm_2e-3_100e_4x8gpus_obj365v1_goldg_train_lvis_val.py
@@ -0,0 +1,172 @@
+_base_ = ('../../third_party/mmyolo/configs/yolov8/'
+          'yolov8_l_syncbn_fast_8xb16-500e_coco.py')
+custom_imports = dict(imports=['yolo_world'],
+                      allow_failed_imports=False)
+
+# hyper-parameters
+num_classes = 1203
+num_training_classes = 80
+max_epochs = 100  # Maximum training epochs
+close_mosaic_epochs = 2
+save_epoch_intervals = 2
+text_channels = 512
+neck_embed_channels = [128, 256, _base_.last_stage_out_channels // 2]
+neck_num_heads = [4, 8, _base_.last_stage_out_channels // 2 // 32]
+base_lr = 2e-3
+weight_decay = 0.05 / 2
+train_batch_size_per_gpu = 16
+
+# model settings
+model = dict(
+    type='YOLOWorldDetector',
+    mm_neck=True,
+    num_train_classes=num_training_classes,
+    num_test_classes=num_classes,
+    data_preprocessor=dict(type='YOLOWDetDataPreprocessor'),
+    backbone=dict(
+        _delete_=True,
+        type='MultiModalYOLOBackbone',
+        image_model={{_base_.model.backbone}},
+        text_model=dict(
+            type='HuggingCLIPLanguageBackbone',
+            model_name='openai/clip-vit-base-patch32',
+            frozen_modules=['all'])),
+    neck=dict(type='YOLOWorldDualPAFPN',
+              guide_channels=text_channels,
+              embed_channels=neck_embed_channels,
+              num_heads=neck_num_heads,
+              block_cfg=dict(type='MaxSigmoidCSPLayerWithTwoConv'),
+              text_enhancder=dict(type='ImagePoolingAttentionModule',
+                                  embed_channels=256,
+                                  num_heads=8)),
+    bbox_head=dict(type='YOLOWorldHead',
+                   head_module=dict(type='YOLOWorldHeadModule',
+                                    embed_dims=text_channels,
+                                    num_classes=num_training_classes)),
+    train_cfg=dict(assigner=dict(num_classes=num_training_classes)))
+
+# dataset settings
+text_transform = [
+    dict(type='RandomLoadText',
+         num_neg_samples=(num_classes, num_classes),
+         max_num_samples=num_training_classes,
+         padding_to_max=True,
+         padding_value=''),
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                    'flip_direction', 'texts'))
+]
+train_pipeline = [
+    *_base_.pre_transform,
+    dict(type='MultiModalMosaic',
+         img_scale=_base_.img_scale,
+         pad_val=114.0,
+         pre_transform=_base_.pre_transform),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        scaling_ratio_range=(1 - _base_.affine_scale, 1 + _base_.affine_scale),
+        max_aspect_ratio=_base_.max_aspect_ratio,
+        border=(-_base_.img_scale[0] // 2, -_base_.img_scale[1] // 2),
+        border_val=(114, 114, 114)),
+    *_base_.last_transform[:-1],
+    *text_transform,
+]
+train_pipeline_stage2 = [*_base_.train_pipeline_stage2[:-1], *text_transform]
+obj365v1_train_dataset = dict(
+    type='MultiModalDataset',
+    dataset=dict(
+        type='YOLOv5Objects365V1Dataset',
+        data_root='data/objects365v1/',
+        ann_file='annotations/objects365_train.json',
+        data_prefix=dict(img='train/'),
+        filter_cfg=dict(filter_empty_gt=False, min_size=32)),
+    class_text_path='data/texts/obj365v1_class_texts.json',
+    pipeline=train_pipeline)
+
+mg_train_dataset = dict(type='YOLOv5MixedGroundingDataset',
+                        data_root='data/mixed_grounding/',
+                        ann_file='annotations/final_mixed_train_no_coco.json',
+                        data_prefix=dict(img='gqa/images/'),
+                        filter_cfg=dict(filter_empty_gt=False, min_size=32),
+                        pipeline=train_pipeline)
+
+flickr_train_dataset = dict(
+    type='YOLOv5MixedGroundingDataset',
+    data_root='data/flickr/',
+    ann_file='annotations/final_flickr_separateGT_train.json',
+    data_prefix=dict(img='full_images/'),
+    filter_cfg=dict(filter_empty_gt=True, min_size=32),
+    pipeline=train_pipeline)
+
+train_dataloader = dict(batch_size=train_batch_size_per_gpu,
+                        collate_fn=dict(type='yolow_collate'),
+                        dataset=dict(_delete_=True,
+                                     type='ConcatDataset',
+                                     datasets=[
+                                         obj365v1_train_dataset,
+                                         flickr_train_dataset, mg_train_dataset
+                                     ],
+                                     ignore_keys=['classes', 'palette']))
+
+test_pipeline = [
+    *_base_.test_pipeline[:-1],
+    dict(type='LoadText'),
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                    'scale_factor', 'pad_param', 'texts'))
+]
+coco_val_dataset = dict(
+    _delete_=True,
+    type='MultiModalDataset',
+    dataset=dict(type='YOLOv5LVISV1Dataset',
+                 data_root='data/coco/',
+                 test_mode=True,
+                 ann_file='lvis/lvis_v1_val.json',
+                 data_prefix=dict(img=''),
+                 batch_shapes_cfg=None),
+    class_text_path='data/texts/lvis_v1_class_texts.json',
+    pipeline=test_pipeline)
+val_dataloader = dict(dataset=coco_val_dataset)
+test_dataloader = val_dataloader
+
+val_evaluator = dict(type='mmdet.LVISMetric',
+                     ann_file='data/coco/lvis/lvis_v1_val.json',
+                     metric='bbox')
+test_evaluator = val_evaluator
+
+# training settings
+default_hooks = dict(param_scheduler=dict(max_epochs=max_epochs),
+                     checkpoint=dict(interval=save_epoch_intervals,
+                                     rule='greater'))
+custom_hooks = [
+    dict(type='EMAHook',
+         ema_type='ExpMomentumEMA',
+         momentum=0.0001,
+         update_buffers=True,
+         strict_load=False,
+         priority=49),
+    dict(type='mmdet.PipelineSwitchHook',
+         switch_epoch=max_epochs - close_mosaic_epochs,
+         switch_pipeline=train_pipeline_stage2)
+]
+train_cfg = dict(max_epochs=max_epochs,
+                 val_interval=10,
+                 dynamic_intervals=[((max_epochs - close_mosaic_epochs),
+                                     _base_.val_interval_stage2)])
+optim_wrapper = dict(optimizer=dict(
+    _delete_=True,
+    type='AdamW',
+    lr=base_lr,
+    weight_decay=weight_decay,
+    batch_size_per_gpu=train_batch_size_per_gpu),
+                     paramwise_cfg=dict(bias_decay_mult=0.0,
+                                        norm_decay_mult=0.0,
+                                        custom_keys={
+                                            'backbone.text_model':
+                                            dict(lr_mult=0.01),
+                                            'logit_scale':
+                                            dict(weight_decay=0.0)
+                                        }),
+                     constructor='YOLOWv5OptimizerConstructor')
diff --git a/mmdetection_practice/configs/pretrain_v1/yolo_world_m_dual_vlpan_l2norm_2e-3_100e_4x8gpus_obj365v1_goldg_train_lvis_minival.py b/mmdetection_practice/configs/pretrain_v1/yolo_world_m_dual_vlpan_l2norm_2e-3_100e_4x8gpus_obj365v1_goldg_train_lvis_minival.py
new file mode 100644
index 0000000..1cd58e9
--- /dev/null
+++ b/mmdetection_practice/configs/pretrain_v1/yolo_world_m_dual_vlpan_l2norm_2e-3_100e_4x8gpus_obj365v1_goldg_train_lvis_minival.py
@@ -0,0 +1,171 @@
+_base_ = ('../../third_party/mmyolo/configs/yolov8/'
+          'yolov8_m_syncbn_fast_8xb16-500e_coco.py')
+custom_imports = dict(imports=['yolo_world'],
+                      allow_failed_imports=False)
+
+# hyper-parameters
+num_classes = 1203
+num_training_classes = 80
+max_epochs = 100  # Maximum training epochs
+close_mosaic_epochs = 2
+save_epoch_intervals = 2
+text_channels = 512
+neck_embed_channels = [128, 256, _base_.last_stage_out_channels // 2]
+neck_num_heads = [4, 8, _base_.last_stage_out_channels // 2 // 32]
+base_lr = 2e-3
+weight_decay = 0.05 / 2
+train_batch_size_per_gpu = 16
+
+# model settings
+model = dict(
+    type='YOLOWorldDetector',
+    mm_neck=True,
+    num_train_classes=num_training_classes,
+    num_test_classes=num_classes,
+    data_preprocessor=dict(type='YOLOWDetDataPreprocessor'),
+    backbone=dict(
+        _delete_=True,
+        type='MultiModalYOLOBackbone',
+        image_model={{_base_.model.backbone}},
+        text_model=dict(
+            type='HuggingCLIPLanguageBackbone',
+            model_name='openai/clip-vit-base-patch32',
+            frozen_modules=['all'])),
+    neck=dict(type='YOLOWorldDualPAFPN',
+              guide_channels=text_channels,
+              embed_channels=neck_embed_channels,
+              num_heads=neck_num_heads,
+              block_cfg=dict(type='MaxSigmoidCSPLayerWithTwoConv'),
+              text_enhancder=dict(type='ImagePoolingAttentionModule',
+                                  embed_channels=256,
+                                  num_heads=8)),
+    bbox_head=dict(type='YOLOWorldHead',
+                   head_module=dict(type='YOLOWorldHeadModule',
+                                    embed_dims=text_channels,
+                                    num_classes=num_training_classes)),
+    train_cfg=dict(assigner=dict(num_classes=num_training_classes)))
+
+# dataset settings
+text_transform = [
+    dict(type='RandomLoadText',
+         num_neg_samples=(num_classes, num_classes),
+         max_num_samples=num_training_classes,
+         padding_to_max=True,
+         padding_value=''),
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                    'flip_direction', 'texts'))
+]
+train_pipeline = [
+    *_base_.pre_transform,
+    dict(type='MultiModalMosaic',
+         img_scale=_base_.img_scale,
+         pad_val=114.0,
+         pre_transform=_base_.pre_transform),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        scaling_ratio_range=(1 - _base_.affine_scale, 1 + _base_.affine_scale),
+        max_aspect_ratio=_base_.max_aspect_ratio,
+        border=(-_base_.img_scale[0] // 2, -_base_.img_scale[1] // 2),
+        border_val=(114, 114, 114)),
+    *_base_.last_transform[:-1],
+    *text_transform,
+]
+train_pipeline_stage2 = [*_base_.train_pipeline_stage2[:-1], *text_transform]
+obj365v1_train_dataset = dict(
+    type='MultiModalDataset',
+    dataset=dict(
+        type='YOLOv5Objects365V1Dataset',
+        data_root='data/objects365v1/',
+        ann_file='annotations/objects365_train.json',
+        data_prefix=dict(img='train/'),
+        filter_cfg=dict(filter_empty_gt=False, min_size=32)),
+    class_text_path='data/texts/obj365v1_class_texts.json',
+    pipeline=train_pipeline)
+
+mg_train_dataset = dict(type='YOLOv5MixedGroundingDataset',
+                        data_root='data/mixed_grounding/',
+                        ann_file='annotations/final_mixed_train_no_coco.json',
+                        data_prefix=dict(img='gqa/images/'),
+                        filter_cfg=dict(filter_empty_gt=False, min_size=32),
+                        pipeline=train_pipeline)
+
+flickr_train_dataset = dict(
+    type='YOLOv5MixedGroundingDataset',
+    data_root='data/flickr/',
+    ann_file='annotations/final_flickr_separateGT_train.json',
+    data_prefix=dict(img='full_images/'),
+    filter_cfg=dict(filter_empty_gt=True, min_size=32),
+    pipeline=train_pipeline)
+
+train_dataloader = dict(batch_size=train_batch_size_per_gpu,
+                        collate_fn=dict(type='yolow_collate'),
+                        dataset=dict(_delete_=True,
+                                     type='ConcatDataset',
+                                     datasets=[
+                                         obj365v1_train_dataset,
+                                         flickr_train_dataset, mg_train_dataset
+                                     ],
+                                     ignore_keys=['classes', 'palette']))
+
+test_pipeline = [
+    *_base_.test_pipeline[:-1],
+    dict(type='LoadText'),
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                    'scale_factor', 'pad_param', 'texts'))
+]
+coco_val_dataset = dict(
+    _delete_=True,
+    type='MultiModalDataset',
+    dataset=dict(type='YOLOv5LVISV1Dataset',
+                 data_root='data/coco/',
+                 test_mode=True,
+                 ann_file='lvis/lvis_v1_minival_inserted_image_name.json',
+                 data_prefix=dict(img=''),
+                 batch_shapes_cfg=None),
+    class_text_path='data/texts/lvis_v1_class_texts.json',
+    pipeline=test_pipeline)
+val_dataloader = dict(dataset=coco_val_dataset)
+test_dataloader = val_dataloader
+
+val_evaluator = dict(type='mmdet.LVISMetric',
+                     ann_file='data/coco/lvis/lvis_v1_minival_inserted_image_name.json',
+                     metric='bbox')
+test_evaluator = val_evaluator
+
+# training settings
+default_hooks = dict(param_scheduler=dict(max_epochs=max_epochs),
+                     checkpoint=dict(interval=save_epoch_intervals,
+                                     rule='greater'))
+custom_hooks = [
+    dict(type='EMAHook',
+         ema_type='ExpMomentumEMA',
+         momentum=0.0001,
+         update_buffers=True,
+         strict_load=False,
+         priority=49),
+    dict(type='mmdet.PipelineSwitchHook',
+         switch_epoch=max_epochs - close_mosaic_epochs,
+         switch_pipeline=train_pipeline_stage2)
+]
+train_cfg = dict(max_epochs=max_epochs,
+                 val_interval=10,
+                 dynamic_intervals=[((max_epochs - close_mosaic_epochs),
+                                     _base_.val_interval_stage2)])
+optim_wrapper = dict(
+    optimizer=dict(
+        _delete_=True,
+        type='AdamW',
+        lr=base_lr,
+        weight_decay=weight_decay,
+        batch_size_per_gpu=train_batch_size_per_gpu
+    ),
+    paramwise_cfg=dict(
+        bias_decay_mult=0.0,
+        norm_decay_mult=0.0,
+        custom_keys={'backbone.text_model': dict(lr_mult=0.01), 'logit_scale': dict(weight_decay=0.0)}),
+        constructor='YOLOWv5OptimizerConstructor'
+)
diff --git a/mmdetection_practice/configs/pretrain_v1/yolo_world_n_dual_vlpan_l2norm_2e-3_100e_4x8gpus_obj365v1_goldg_train_lvis_minival.py b/mmdetection_practice/configs/pretrain_v1/yolo_world_n_dual_vlpan_l2norm_2e-3_100e_4x8gpus_obj365v1_goldg_train_lvis_minival.py
new file mode 100644
index 0000000..acc2983
--- /dev/null
+++ b/mmdetection_practice/configs/pretrain_v1/yolo_world_n_dual_vlpan_l2norm_2e-3_100e_4x8gpus_obj365v1_goldg_train_lvis_minival.py
@@ -0,0 +1,193 @@
+_base_ = ('../../third_party/mmyolo/configs/yolov8/'
+          'yolov8_n_syncbn_fast_8xb16-500e_coco.py')
+custom_imports = dict(imports=['yolo_world'],
+                      allow_failed_imports=False)
+
+# hyper-parameters
+num_classes = 1203 # LVIS-minival have 1203 object categories
+num_training_classes = 80 # set to 80 to match a common standard of COCO's 80 classes
+max_epochs = 100  # Maximum training epochs
+close_mosaic_epochs = 2
+save_epoch_intervals = 2
+text_channels = 512
+neck_embed_channels = [64, 128, _base_.last_stage_out_channels // 4] # [64, 128, 256]
+neck_num_heads = [2, 4, _base_.last_stage_out_channels // 4 // 32] # [2, 4, 8]
+base_lr = 2e-3
+weight_decay = 0.05 / 2
+train_batch_size_per_gpu = 16 # total_batch_size=512, so we need to use accumulative_counts=4
+
+# model settings
+model = dict(
+    type='YOLOWorldDetector',
+    mm_neck=True,
+    num_train_classes=num_training_classes,
+    num_test_classes=num_classes,
+    data_preprocessor=dict(type='YOLOWDetDataPreprocessor'),
+
+    backbone=dict(
+        _delete_=True,
+        type='MultiModalYOLOBackbone',
+        image_model={{_base_.model.backbone}}, # YOLOv8CSPDarknet
+        text_model=dict(
+            type='HuggingCLIPLanguageBackbone',
+            model_name='openai/clip-vit-base-patch32',
+            frozen_modules=['all']
+        )
+    ),
+
+    neck=dict(
+            type='YOLOWorldDualPAFPN',
+            block_cfg=dict(type='MaxSigmoidCSPLayerWithTwoConv'),
+            deepen_factor=_base_.deepen_factor, # YOLOv8_nano model's deepen_factor
+            widen_factor=_base_.widen_factor, # YOLOv8_nano model's widen_factor
+            embed_channels=neck_embed_channels, # FIXME:
+            guide_channels=text_channels, # FIXME:
+            num_heads=neck_num_heads, # FIXME:
+            text_enhancder=dict(
+                type='ImagePoolingAttentionModule',
+                embed_channels=256, # FIXME:
+                num_heads=4, # FIXME:
+            ),
+    ),
+
+    bbox_head=dict(
+            type='YOLOWorldHead',
+            head_module=dict(
+                type='YOLOWorldHeadModule',
+                embed_dims=text_channels,
+                num_classes=num_training_classes,
+                widen_factor=_base_.widen_factor,
+            ),
+    ),
+
+    train_cfg=dict(assigner=dict(num_classes=num_training_classes))
+)
+
+# dataset settings
+text_transform = [
+    dict(type='RandomLoadText',
+         num_neg_samples=(num_classes, num_classes),
+         max_num_samples=num_training_classes,
+         padding_to_max=True,
+         padding_value=''),
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                    'flip_direction', 'texts'))
+]
+train_pipeline = [
+    *_base_.pre_transform,
+    dict(type='MultiModalMosaic',
+         img_scale=_base_.img_scale,
+         pad_val=114.0,
+         pre_transform=_base_.pre_transform),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        scaling_ratio_range=(1 - _base_.affine_scale, 1 + _base_.affine_scale),
+        max_aspect_ratio=_base_.max_aspect_ratio,
+        border=(-_base_.img_scale[0] // 2, -_base_.img_scale[1] // 2),
+        border_val=(114, 114, 114)),
+    *_base_.last_transform[:-1],
+    *text_transform,
+]
+train_pipeline_stage2 = [*_base_.train_pipeline_stage2[:-1], *text_transform]
+obj365v1_train_dataset = dict(
+    type='MultiModalDataset',
+    dataset=dict(
+        type='YOLOv5Objects365V1Dataset',
+        data_root='data/objects365v1/',
+        ann_file='annotations/objects365_train.json',
+        data_prefix=dict(img='train/'),
+        filter_cfg=dict(filter_empty_gt=False, min_size=32)),
+    class_text_path='data/texts/obj365v1_class_texts.json',
+    pipeline=train_pipeline)
+
+mg_train_dataset = dict(type='YOLOv5MixedGroundingDataset',
+                        data_root='data/mixed_grounding/',
+                        ann_file='annotations/final_mixed_train_no_coco.json',
+                        data_prefix=dict(img='gqa/images/'),
+                        filter_cfg=dict(filter_empty_gt=False, min_size=32),
+                        pipeline=train_pipeline)
+
+flickr_train_dataset = dict(
+    type='YOLOv5MixedGroundingDataset',
+    data_root='data/flickr/',
+    ann_file='annotations/final_flickr_separateGT_train.json',
+    data_prefix=dict(img='full_images/'),
+    filter_cfg=dict(filter_empty_gt=True, min_size=32),
+    pipeline=train_pipeline)
+
+train_dataloader = dict(batch_size=train_batch_size_per_gpu,
+                        collate_fn=dict(type='yolow_collate'),
+                        dataset=dict(_delete_=True,
+                                     type='ConcatDataset',
+                                     datasets=[
+                                         obj365v1_train_dataset,
+                                         flickr_train_dataset,
+                                         mg_train_dataset,
+                                     ],
+                                     ignore_keys=['classes', 'palette']))
+
+test_pipeline = [
+    *_base_.test_pipeline[:-1],
+    dict(type='LoadText'),
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                    'scale_factor', 'pad_param', 'texts'))
+]
+coco_val_dataset = dict(
+    _delete_=True,
+    type='MultiModalDataset',
+    dataset=dict(type='YOLOv5LVISV1Dataset',
+                 data_root='data/coco/',
+                 test_mode=True,
+                 ann_file='lvis/lvis_v1_minival_inserted_image_name.json',
+                 data_prefix=dict(img=''),
+                 batch_shapes_cfg=None),
+    class_text_path='data/texts/lvis_v1_class_texts.json',
+    pipeline=test_pipeline)
+val_dataloader = dict(dataset=coco_val_dataset)
+test_dataloader = val_dataloader
+
+val_evaluator = dict(type='mmdet.LVISMetric',
+                     ann_file='data/coco/lvis/lvis_v1_minival_inserted_image_name.json',
+                     metric='bbox')
+test_evaluator = val_evaluator
+
+# training settings
+default_hooks = dict(param_scheduler=dict(max_epochs=max_epochs),
+                     checkpoint=dict(interval=save_epoch_intervals,
+                                     rule='greater'))
+custom_hooks = [
+    dict(type='EMAHook',
+         ema_type='ExpMomentumEMA',
+         momentum=0.0001,
+         update_buffers=True,
+         strict_load=False,
+         priority=49),
+    dict(type='mmdet.PipelineSwitchHook',
+         switch_epoch=max_epochs - close_mosaic_epochs,
+         switch_pipeline=train_pipeline_stage2)
+]
+train_cfg = dict(max_epochs=max_epochs,
+                 val_interval=10,
+                 dynamic_intervals=[((max_epochs - close_mosaic_epochs),
+                                     _base_.val_interval_stage2)])
+
+optim_wrapper = dict(
+    optimizer=dict(
+        _delete_=True,
+        type='AdamW',
+        lr=base_lr,
+        weight_decay=weight_decay,
+        batch_size_per_gpu=train_batch_size_per_gpu
+    ),
+    paramwise_cfg=dict(
+        bias_decay_mult=0.0,
+        norm_decay_mult=0.0,
+        custom_keys={'backbone.text_model': dict(lr_mult=0.01), 'logit_scale': dict(weight_decay=0.0)}
+    ),
+    accumulative_counts=4,
+    constructor='YOLOWv5OptimizerConstructor'
+)
diff --git a/mmdetection_practice/configs/pretrain_v1/yolo_world_s_dual_vlpan_l2norm_2e-3_100e_4x8gpus_obj365v1_goldg_train_lvis_minival.py b/mmdetection_practice/configs/pretrain_v1/yolo_world_s_dual_vlpan_l2norm_2e-3_100e_4x8gpus_obj365v1_goldg_train_lvis_minival.py
new file mode 100644
index 0000000..9c17feb
--- /dev/null
+++ b/mmdetection_practice/configs/pretrain_v1/yolo_world_s_dual_vlpan_l2norm_2e-3_100e_4x8gpus_obj365v1_goldg_train_lvis_minival.py
@@ -0,0 +1,238 @@
+_base_ = ('../../third_party/mmyolo/configs/yolov8/'
+          'yolov8_s_syncbn_fast_8xb16-500e_coco.py')
+custom_imports = dict(imports=['yolo_world'],
+                      allow_failed_imports=False)
+
+# hyper-parameters
+num_classes = 1203
+num_training_classes = 80
+max_epochs = 100  # Maximum training epochs
+close_mosaic_epochs = 2
+save_epoch_intervals = 2
+text_channels = 512
+neck_embed_channels = [128, 256, _base_.last_stage_out_channels // 2]
+neck_num_heads = [4, 8, _base_.last_stage_out_channels // 2 // 32]
+base_lr = 2e-3
+weight_decay = 0.05 / 2
+train_batch_size_per_gpu = 16 # total_batch_size=512, so we need to use accumulative_counts=4
+
+# model settings
+model = dict(
+    type='YOLOWorldDetector',
+    mm_neck=True,
+    num_train_classes=num_training_classes,
+    num_test_classes=num_classes,
+    data_preprocessor=dict(type='YOLOWDetDataPreprocessor'),
+
+    backbone=dict(
+        _delete_=True,
+        type='MultiModalYOLOBackbone',
+        image_model={{_base_.model.backbone}},
+        text_model=dict(
+            type='HuggingCLIPLanguageBackbone',
+            model_name='openai/clip-vit-base-patch32',
+            frozen_modules=['all']
+        )
+    ),
+
+    neck=dict(
+        type='YOLOWorldDualPAFPN',
+        block_cfg=dict(type='MaxSigmoidCSPLayerWithTwoConv'),
+        deepen_factor=_base_.deepen_factor,
+        widen_factor=_base_.widen_factor,
+        embed_channels=neck_embed_channels,
+        guide_channels=text_channels,
+        num_heads=neck_num_heads,
+        text_enhancder=dict(
+            type='ImagePoolingAttentionModule',
+            embed_channels=256,
+            num_heads=8
+        )
+    ),
+
+    bbox_head=dict(
+        type='YOLOWorldHead',
+        head_module=dict(
+            type='YOLOWorldHeadModule',
+            embed_dims=text_channels,
+            num_classes=num_training_classes,
+            widen_factor=_base_.widen_factor,
+        )
+    ),
+
+    train_cfg=dict(assigner=dict(num_classes=num_training_classes))
+)
+
+# dataset settings
+text_transform = [
+    dict(type='RandomLoadText',
+         num_neg_samples=(num_classes, num_classes),
+         max_num_samples=num_training_classes,
+         padding_to_max=True,
+         padding_value=''),
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                    'flip_direction', 'texts'))
+]
+train_pipeline = [
+    *_base_.pre_transform,
+    dict(type='MultiModalMosaic',
+         img_scale=_base_.img_scale,
+         pad_val=114.0,
+         pre_transform=_base_.pre_transform),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        scaling_ratio_range=(1 - _base_.affine_scale, 1 + _base_.affine_scale),
+        max_aspect_ratio=_base_.max_aspect_ratio,
+        border=(-_base_.img_scale[0] // 2, -_base_.img_scale[1] // 2),
+        border_val=(114, 114, 114)),
+    *_base_.last_transform[:-1],
+    *text_transform,
+]
+train_pipeline_stage2 = [*_base_.train_pipeline_stage2[:-1], *text_transform]
+
+
+obj365v1_train_dataset = dict(
+    type='MultiModalDataset',
+    dataset=dict(
+        type='YOLOv5Objects365V1Dataset',
+        data_root='data/objects365v1/',
+        ann_file='annotations/objects365_train.json',
+        data_prefix=dict(img='train/'),
+        filter_cfg=dict(filter_empty_gt=False, min_size=32)),
+    class_text_path='data/texts/obj365v1_class_texts.json',
+    pipeline=train_pipeline)
+
+
+mg_train_dataset = dict(type='YOLOv5MixedGroundingDataset',
+                        data_root='data/mixed_grounding/',
+                        ann_file='annotations/final_mixed_train_no_coco.json',
+                        data_prefix=dict(img='gqa/images/'),
+                        filter_cfg=dict(filter_empty_gt=False, min_size=32),
+                        pipeline=train_pipeline)
+
+
+flickr_train_dataset = dict(
+    type='YOLOv5MixedGroundingDataset',
+    data_root='data/flickr/',
+    ann_file='annotations/final_flickr_separateGT_train.json',
+    data_prefix=dict(img='full_images/'),
+    filter_cfg=dict(filter_empty_gt=True, min_size=32),
+    pipeline=train_pipeline)
+
+
+# NOTE: trained with [objects365v1 + gqa + flickr30k + coco]
+train_dataloader = dict(batch_size=train_batch_size_per_gpu,
+                        collate_fn=dict(type='yolow_collate'),
+                        dataset=dict(_delete_=True,
+                                     type='ConcatDataset',
+                                     datasets=[
+                                         obj365v1_train_dataset,
+                                         flickr_train_dataset,
+                                         mg_train_dataset,
+                                     ],
+                                     ignore_keys=['classes', 'palette']))
+
+test_pipeline = [
+    *_base_.test_pipeline[:-1],
+    dict(type='LoadText'),
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                    'scale_factor', 'pad_param', 'texts'))
+]
+coco_val_dataset = dict(
+    _delete_=True,
+    type='MultiModalDataset',
+    dataset=dict(type='YOLOv5LVISV1Dataset',
+                 data_root='data/coco/',
+                 test_mode=True,
+                 ann_file='lvis/lvis_v1_minival_inserted_image_name.json',
+                 data_prefix=dict(img=''),
+                 batch_shapes_cfg=None),
+    class_text_path='data/texts/lvis_v1_class_texts.json',
+    pipeline=test_pipeline)
+val_dataloader = dict(dataset=coco_val_dataset)
+test_dataloader = val_dataloader
+
+val_evaluator = dict(type='mmdet.LVISMetric',
+                     ann_file='data/coco/lvis/lvis_v1_minival_inserted_image_name.json',
+                     metric='bbox')
+test_evaluator = val_evaluator
+
+# training settings
+default_hooks = dict(
+    param_scheduler=dict(max_epochs=max_epochs),
+    checkpoint=dict(
+        interval=save_epoch_intervals,
+        rule='greater'
+    ),
+)
+
+custom_hooks = [
+    dict(
+        type='EMAHook',
+        ema_type='ExpMomentumEMA',
+         momentum=0.0001,
+         update_buffers=True,
+         strict_load=False,
+         priority=49
+    ),
+    dict(
+        type='mmdet.PipelineSwitchHook',
+        switch_epoch=max_epochs - close_mosaic_epochs,
+        switch_pipeline=train_pipeline_stage2
+    ),
+    # dict(type='CheckProcessTimePerBlock', interval=50), # to check process time per block
+]
+
+log_config = dict(
+    interval=50,  # Interval to print the log
+    hooks=[
+        dict(type='TextLoggerHook', by_epoch=False),
+        dict(type='TensorboardLoggerHook', by_epoch=False),
+        dict(
+            type='MMDetWandbHook',
+            by_epoch=False,
+            init_kwargs={
+                'entity': "YOLO-World-s",
+                'project': "YOLO-World",
+            },
+            interval=10,
+            log_checkpoint=True,
+            log_checkpoint_metadata=True,
+            num_eval_images=100
+        ),
+    ]
+)
+
+train_cfg = dict(
+    max_epochs=max_epochs,
+    val_interval=10,
+    dynamic_intervals=[(
+        (max_epochs - close_mosaic_epochs),
+        _base_.val_interval_stage2),
+    ])
+
+optim_wrapper = dict(
+    optimizer=dict(
+        _delete_=True,
+        type='AdamW',
+        lr=base_lr,
+        weight_decay=weight_decay,
+        batch_size_per_gpu=train_batch_size_per_gpu
+    ),
+    paramwise_cfg=dict(
+        bias_decay_mult=0.0,
+        norm_decay_mult=0.0,
+        custom_keys={'backbone.text_model': dict(lr_mult=0.01), 'logit_scale': dict(weight_decay=0.0)}
+    ),
+    accumulative_counts=4,
+    constructor='YOLOWv5OptimizerConstructor'
+)
+
+
+
+
+
diff --git a/mmdetection_practice/configs/pretrain_v1/yolo_world_x_dual_vlpan_l2norm_2e-3_100e_4x8gpus_obj365v1_goldg_train_lvis_minival.py b/mmdetection_practice/configs/pretrain_v1/yolo_world_x_dual_vlpan_l2norm_2e-3_100e_4x8gpus_obj365v1_goldg_train_lvis_minival.py
new file mode 100644
index 0000000..f20d3f0
--- /dev/null
+++ b/mmdetection_practice/configs/pretrain_v1/yolo_world_x_dual_vlpan_l2norm_2e-3_100e_4x8gpus_obj365v1_goldg_train_lvis_minival.py
@@ -0,0 +1,172 @@
+_base_ = ('../../third_party/mmyolo/configs/yolov8/'
+          'yolov8_x_syncbn_fast_8xb16-500e_coco.py')
+custom_imports = dict(imports=['yolo_world'],
+                      allow_failed_imports=False)
+
+# hyper-parameters
+num_classes = 1203
+num_training_classes = 80
+max_epochs = 100  # Maximum training epochs
+close_mosaic_epochs = 2
+save_epoch_intervals = 2
+text_channels = 512
+neck_embed_channels = [128, 256, _base_.last_stage_out_channels // 2]
+neck_num_heads = [4, 8, _base_.last_stage_out_channels // 2 // 32]
+base_lr = 2e-3
+weight_decay = 0.05 / 2
+train_batch_size_per_gpu = 16
+
+# model settings
+model = dict(
+    type='YOLOWorldDetector',
+    mm_neck=True,
+    num_train_classes=num_training_classes,
+    num_test_classes=num_classes,
+    data_preprocessor=dict(type='YOLOWDetDataPreprocessor'),
+    backbone=dict(
+        _delete_=True,
+        type='MultiModalYOLOBackbone',
+        image_model={{_base_.model.backbone}},
+        text_model=dict(
+            type='HuggingCLIPLanguageBackbone',
+            model_name='openai/clip-vit-base-patch32',
+            frozen_modules=['all'])),
+    neck=dict(type='YOLOWorldDualPAFPN',
+              guide_channels=text_channels,
+              embed_channels=neck_embed_channels,
+              num_heads=neck_num_heads,
+              block_cfg=dict(type='MaxSigmoidCSPLayerWithTwoConv'),
+              text_enhancder=dict(type='ImagePoolingAttentionModule',
+                                  embed_channels=256,
+                                  num_heads=8)),
+    bbox_head=dict(type='YOLOWorldHead',
+                   head_module=dict(type='YOLOWorldHeadModule',
+                                    embed_dims=text_channels,
+                                    num_classes=num_training_classes)),
+    train_cfg=dict(assigner=dict(num_classes=num_training_classes)))
+
+# dataset settings
+text_transform = [
+    dict(type='RandomLoadText',
+         num_neg_samples=(num_classes, num_classes),
+         max_num_samples=num_training_classes,
+         padding_to_max=True,
+         padding_value=''),
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                    'flip_direction', 'texts'))
+]
+train_pipeline = [
+    *_base_.pre_transform,
+    dict(type='MultiModalMosaic',
+         img_scale=_base_.img_scale,
+         pad_val=114.0,
+         pre_transform=_base_.pre_transform),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        scaling_ratio_range=(1 - _base_.affine_scale, 1 + _base_.affine_scale),
+        max_aspect_ratio=_base_.max_aspect_ratio,
+        border=(-_base_.img_scale[0] // 2, -_base_.img_scale[1] // 2),
+        border_val=(114, 114, 114)),
+    *_base_.last_transform[:-1],
+    *text_transform,
+]
+train_pipeline_stage2 = [*_base_.train_pipeline_stage2[:-1], *text_transform]
+obj365v1_train_dataset = dict(
+    type='MultiModalDataset',
+    dataset=dict(
+        type='YOLOv5Objects365V1Dataset',
+        data_root='data/objects365v1/',
+        ann_file='annotations/objects365_train.json',
+        data_prefix=dict(img='train/'),
+        filter_cfg=dict(filter_empty_gt=False, min_size=32)),
+    class_text_path='data/texts/obj365v1_class_texts.json',
+    pipeline=train_pipeline)
+
+mg_train_dataset = dict(type='YOLOv5MixedGroundingDataset',
+                        data_root='data/mixed_grounding/',
+                        ann_file='annotations/final_mixed_train_no_coco.json',
+                        data_prefix=dict(img='gqa/images/'),
+                        filter_cfg=dict(filter_empty_gt=False, min_size=32),
+                        pipeline=train_pipeline)
+
+flickr_train_dataset = dict(
+    type='YOLOv5MixedGroundingDataset',
+    data_root='data/flickr/',
+    ann_file='annotations/final_flickr_separateGT_train.json',
+    data_prefix=dict(img='full_images/'),
+    filter_cfg=dict(filter_empty_gt=True, min_size=32),
+    pipeline=train_pipeline)
+
+train_dataloader = dict(batch_size=train_batch_size_per_gpu,
+                        collate_fn=dict(type='yolow_collate'),
+                        dataset=dict(_delete_=True,
+                                     type='ConcatDataset',
+                                     datasets=[
+                                         obj365v1_train_dataset,
+                                         flickr_train_dataset, mg_train_dataset
+                                     ],
+                                     ignore_keys=['classes', 'palette']))
+
+test_pipeline = [
+    *_base_.test_pipeline[:-1],
+    dict(type='LoadText'),
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                    'scale_factor', 'pad_param', 'texts'))
+]
+coco_val_dataset = dict(
+    _delete_=True,
+    type='MultiModalDataset',
+    dataset=dict(type='YOLOv5LVISV1Dataset',
+                 data_root='data/coco/',
+                 test_mode=True,
+                 ann_file='lvis/lvis_v1_minival_inserted_image_name.json',
+                 data_prefix=dict(img=''),
+                 batch_shapes_cfg=None),
+    class_text_path='data/texts/lvis_v1_class_texts.json',
+    pipeline=test_pipeline)
+val_dataloader = dict(dataset=coco_val_dataset)
+test_dataloader = val_dataloader
+
+val_evaluator = dict(type='mmdet.LVISMetric',
+                     ann_file='data/coco/lvis/lvis_v1_minival_inserted_image_name.json',
+                     metric='bbox')
+test_evaluator = val_evaluator
+
+# training settings
+default_hooks = dict(param_scheduler=dict(max_epochs=max_epochs),
+                     checkpoint=dict(interval=save_epoch_intervals,
+                                     rule='greater'))
+custom_hooks = [
+    dict(type='EMAHook',
+         ema_type='ExpMomentumEMA',
+         momentum=0.0001,
+         update_buffers=True,
+         strict_load=False,
+         priority=49),
+    dict(type='mmdet.PipelineSwitchHook',
+         switch_epoch=max_epochs - close_mosaic_epochs,
+         switch_pipeline=train_pipeline_stage2)
+]
+train_cfg = dict(max_epochs=max_epochs,
+                 val_interval=10,
+                 dynamic_intervals=[((max_epochs - close_mosaic_epochs),
+                                     _base_.val_interval_stage2)])
+optim_wrapper = dict(optimizer=dict(
+    _delete_=True,
+    type='AdamW',
+    lr=base_lr,
+    weight_decay=weight_decay,
+    batch_size_per_gpu=train_batch_size_per_gpu),
+                     paramwise_cfg=dict(bias_decay_mult=0.0,
+                                        norm_decay_mult=0.0,
+                                        custom_keys={
+                                            'backbone.text_model':
+                                            dict(lr_mult=0.01),
+                                            'logit_scale':
+                                            dict(weight_decay=0.0)
+                                        }),
+                     constructor='YOLOWv5OptimizerConstructor')
diff --git a/mmdetection_practice/configs/prompt_tuning_coco/READEME.md b/mmdetection_practice/configs/prompt_tuning_coco/READEME.md
new file mode 100644
index 0000000..2888d1b
--- /dev/null
+++ b/mmdetection_practice/configs/prompt_tuning_coco/READEME.md
@@ -0,0 +1,12 @@
+## Prompt Tuning for YOLO-World
+
+### NOTE:
+
+This folder contains many experimental config files, which will be removed later!!
+
+### Experimental Results
+
+| Model | Config |  AP  | AP50 | AP75  | APS | APM | APL |
+| :---- | :----: | :--: | :--: | :---: | :-: | :-: | :-: |
+| YOLO-World-v2-L | Zero-shot | 45.7 | 61.6 | 49.8 | 29.9 | 50.0 | 60.8 |
+| [YOLO-World-v2-L](./../configs/prompt_tuning_coco/yolo_world_v2_l_vlpan_bn_2e-4_80e_8gpus_mask-refine_prompt_tuning_coco.py) | Prompt tuning | 47.9 | 64.3 | 52.5 | 31.9 | 52.6 | 61.3 | 
diff --git a/mmdetection_practice/configs/prompt_tuning_coco/yolo_world_v2_l_vlpan_bn_2e-4_80e_8gpus_mask-refine_prompt_tuning_coco.py b/mmdetection_practice/configs/prompt_tuning_coco/yolo_world_v2_l_vlpan_bn_2e-4_80e_8gpus_mask-refine_prompt_tuning_coco.py
new file mode 100644
index 0000000..3212fa0
--- /dev/null
+++ b/mmdetection_practice/configs/prompt_tuning_coco/yolo_world_v2_l_vlpan_bn_2e-4_80e_8gpus_mask-refine_prompt_tuning_coco.py
@@ -0,0 +1,161 @@
+_base_ = ('../../third_party/mmyolo/configs/yolov8/'
+          'yolov8_l_mask-refine_syncbn_fast_8xb16-500e_coco.py')
+custom_imports = dict(imports=['yolo_world'], allow_failed_imports=False)
+
+# hyper-parameters
+num_classes = 80
+num_training_classes = 80
+max_epochs = 80  # Maximum training epochs
+close_mosaic_epochs = 10
+save_epoch_intervals = 5
+text_channels = 512
+neck_embed_channels = [128, 256, _base_.last_stage_out_channels // 2]
+neck_num_heads = [4, 8, _base_.last_stage_out_channels // 2 // 32]
+base_lr = 2e-3
+weight_decay = 0.05
+train_batch_size_per_gpu = 16
+load_from = 'pretrained_models/yolo_world_l_clip_t2i_bn_2e-3adamw_32xb16-100e_obj365v1_goldg_cc3mlite_train-ca93cd1f.pth'
+persistent_workers = False
+
+# model settings
+model = dict(type='SimpleYOLOWorldDetector',
+             mm_neck=True,
+             num_train_classes=num_training_classes,
+             num_test_classes=num_classes,
+             embedding_path='embeddings/clip_vit_b32_coco_80_embeddings.npy',
+             prompt_dim=text_channels,
+             num_prompts=80,
+             data_preprocessor=dict(type='YOLOv5DetDataPreprocessor'),
+             backbone=dict(_delete_=True,
+                           type='MultiModalYOLOBackbone',
+                           text_model=None,
+                           image_model={{_base_.model.backbone}},
+                           frozen_stages=4,
+                           with_text_model=False),
+             neck=dict(type='YOLOWorldPAFPN',
+                       freeze_all=True,
+                       guide_channels=text_channels,
+                       embed_channels=neck_embed_channels,
+                       num_heads=neck_num_heads,
+                       block_cfg=dict(type='MaxSigmoidCSPLayerWithTwoConv')),
+             bbox_head=dict(type='YOLOWorldHead',
+                            head_module=dict(
+                                type='YOLOWorldHeadModule',
+                                freeze_all=True,
+                                use_bn_head=True,
+                                embed_dims=text_channels,
+                                num_classes=num_training_classes)),
+             train_cfg=dict(assigner=dict(num_classes=num_training_classes)))
+
+# dataset settings
+final_transform = [
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                    'flip_direction'))
+]
+mosaic_affine_transform = [
+    dict(type='Mosaic',
+         img_scale=_base_.img_scale,
+         pad_val=114.0,
+         pre_transform=_base_.pre_transform),
+    dict(type='YOLOv5CopyPaste', prob=_base_.copypaste_prob),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        max_aspect_ratio=100.,
+        scaling_ratio_range=(1 - _base_.affine_scale, 1 + _base_.affine_scale),
+        # img_scale is (width, height)
+        border=(-_base_.img_scale[0] // 2, -_base_.img_scale[1] // 2),
+        border_val=(114, 114, 114),
+        min_area_ratio=_base_.min_area_ratio,
+        use_mask_refine=_base_.use_mask2refine)
+]
+train_pipeline = [
+    *_base_.pre_transform, *mosaic_affine_transform,
+    dict(type='YOLOv5MixUp',
+         prob=_base_.mixup_prob,
+         pre_transform=[*_base_.pre_transform, *mosaic_affine_transform]),
+    *_base_.last_transform[:-1], *final_transform
+]
+
+train_pipeline_stage2 = [*_base_.train_pipeline_stage2[:-1], *final_transform]
+
+coco_train_dataset = dict(type='YOLOv5CocoDataset',
+                          data_root='data/coco',
+                          ann_file='annotations/instances_train2017.json',
+                          data_prefix=dict(img='train2017/'),
+                          filter_cfg=dict(filter_empty_gt=False, min_size=32),
+                          pipeline=train_pipeline)
+
+train_dataloader = dict(persistent_workers=persistent_workers,
+                        batch_size=train_batch_size_per_gpu,
+                        collate_fn=dict(type='yolow_collate'),
+                        dataset=coco_train_dataset)
+
+train_dataloader = dict(persistent_workers=persistent_workers,
+                        batch_size=train_batch_size_per_gpu,
+                        collate_fn=dict(type='yolow_collate'),
+                        dataset=coco_train_dataset)
+test_pipeline = [
+    *_base_.test_pipeline[:-1],
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                    'scale_factor', 'pad_param'))
+]
+coco_val_dataset = dict(type='YOLOv5CocoDataset',
+                        data_root='data/coco',
+                        ann_file='annotations/instances_val2017.json',
+                        data_prefix=dict(img='val2017/'),
+                        filter_cfg=dict(filter_empty_gt=False, min_size=32),
+                        pipeline=test_pipeline)
+
+val_dataloader = dict(dataset=coco_val_dataset)
+test_dataloader = val_dataloader
+# training settings
+default_hooks = dict(param_scheduler=dict(scheduler_type='linear',
+                                          lr_factor=0.01,
+                                          max_epochs=max_epochs),
+                     checkpoint=dict(max_keep_ckpts=-1,
+                                     save_best=None,
+                                     interval=save_epoch_intervals))
+custom_hooks = [
+    dict(type='EMAHook',
+         ema_type='ExpMomentumEMA',
+         momentum=0.0001,
+         update_buffers=True,
+         strict_load=False,
+         priority=49),
+    dict(type='mmdet.PipelineSwitchHook',
+         switch_epoch=max_epochs - close_mosaic_epochs,
+         switch_pipeline=train_pipeline_stage2)
+]
+train_cfg = dict(max_epochs=max_epochs,
+                 val_interval=5,
+                 dynamic_intervals=[((max_epochs - close_mosaic_epochs),
+                                     _base_.val_interval_stage2)])
+optim_wrapper = dict(optimizer=dict(
+    _delete_=True,
+    type='AdamW',
+    lr=base_lr,
+    weight_decay=weight_decay,
+    batch_size_per_gpu=train_batch_size_per_gpu),
+                     paramwise_cfg=dict(bias_decay_mult=0.0,
+                                        norm_decay_mult=0.0,
+                                        custom_keys={
+                                            'backbone.text_model':
+                                            dict(lr_mult=0.01),
+                                            'logit_scale':
+                                            dict(weight_decay=0.0),
+                                            'embeddings':
+                                            dict(weight_decay=0.0)
+                                        }),
+                     constructor='YOLOWv5OptimizerConstructor')
+
+# evaluation settings
+val_evaluator = dict(_delete_=True,
+                     type='mmdet.CocoMetric',
+                     proposal_nums=(100, 1, 10),
+                     ann_file='data/coco/annotations/instances_val2017.json',
+                     metric='bbox')
+find_unused_parameters = True
diff --git a/mmdetection_practice/configs/prompt_tuning_coco/yolo_world_v2_l_vlpan_bn_2e-4_80e_8gpus_prompt_tuning_coco.py b/mmdetection_practice/configs/prompt_tuning_coco/yolo_world_v2_l_vlpan_bn_2e-4_80e_8gpus_prompt_tuning_coco.py
new file mode 100644
index 0000000..64ce89d
--- /dev/null
+++ b/mmdetection_practice/configs/prompt_tuning_coco/yolo_world_v2_l_vlpan_bn_2e-4_80e_8gpus_prompt_tuning_coco.py
@@ -0,0 +1,117 @@
+_base_ = ('../../third_party/mmyolo/configs/yolov8/'
+          'yolov8_l_syncbn_fast_8xb16-500e_coco.py')
+custom_imports = dict(imports=['yolo_world'], allow_failed_imports=False)
+
+# hyper-parameters
+num_classes = 80
+num_training_classes = 80
+max_epochs = 80  # Maximum training epochs
+close_mosaic_epochs = 10
+save_epoch_intervals = 5
+text_channels = 512
+neck_embed_channels = [128, 256, _base_.last_stage_out_channels // 2]
+neck_num_heads = [4, 8, _base_.last_stage_out_channels // 2 // 32]
+base_lr = 2e-4
+weight_decay = 0.05
+train_batch_size_per_gpu = 16
+load_from = 'pretrained_models/yolo_world_l_clip_t2i_bn_2e-3adamw_32xb16-100e_obj365v1_goldg_cc3mlite_train-ca93cd1f.pth'
+persistent_workers = False
+
+# model settings
+model = dict(type='SimpleYOLOWorldDetector',
+             mm_neck=True,
+             num_train_classes=num_training_classes,
+             num_test_classes=num_classes,
+             embedding_path='embeddings/clip_vit_b32_coco_80_embeddings.npy',
+             prompt_dim=text_channels,
+             num_prompts=80,
+             freeze_prompt=False,
+             data_preprocessor=dict(type='YOLOv5DetDataPreprocessor'),
+             backbone=dict(_delete_=True,
+                           type='MultiModalYOLOBackbone',
+                           text_model=None,
+                           image_model={{_base_.model.backbone}},
+                           frozen_stages=4,
+                           with_text_model=False),
+             neck=dict(type='YOLOWorldPAFPN',
+                       freeze_all=True,
+                       guide_channels=text_channels,
+                       embed_channels=neck_embed_channels,
+                       num_heads=neck_num_heads,
+                       block_cfg=dict(type='MaxSigmoidCSPLayerWithTwoConv')),
+             bbox_head=dict(type='YOLOWorldHead',
+                            head_module=dict(
+                                type='YOLOWorldHeadModule',
+                                freeze_all=True,
+                                use_bn_head=True,
+                                embed_dims=text_channels,
+                                num_classes=num_training_classes)),
+             train_cfg=dict(assigner=dict(num_classes=num_training_classes)))
+
+# dataset settings
+coco_train_dataset = dict(type='YOLOv5CocoDataset',
+                          data_root='data/coco',
+                          ann_file='annotations/instances_train2017.json',
+                          data_prefix=dict(img='train2017/'),
+                          filter_cfg=dict(filter_empty_gt=False, min_size=32),
+                          pipeline=_base_.train_pipeline)
+
+train_dataloader = dict(persistent_workers=persistent_workers,
+                        batch_size=train_batch_size_per_gpu,
+                        collate_fn=dict(type='yolow_collate'),
+                        dataset=coco_train_dataset)
+
+coco_val_dataset = dict(type='YOLOv5CocoDataset',
+                        data_root='data/coco',
+                        ann_file='annotations/instances_val2017.json',
+                        data_prefix=dict(img='val2017/'),
+                        filter_cfg=dict(filter_empty_gt=False, min_size=32),
+                        pipeline=_base_.test_pipeline)
+
+val_dataloader = dict(dataset=coco_val_dataset)
+test_dataloader = val_dataloader
+# training settings
+default_hooks = dict(param_scheduler=dict(scheduler_type='linear',
+                                          lr_factor=0.01,
+                                          max_epochs=max_epochs),
+                     checkpoint=dict(max_keep_ckpts=-1,
+                                     save_best=None,
+                                     interval=save_epoch_intervals))
+custom_hooks = [
+    dict(type='EMAHook',
+         ema_type='ExpMomentumEMA',
+         momentum=0.0001,
+         update_buffers=True,
+         strict_load=False,
+         priority=49),
+    dict(type='mmdet.PipelineSwitchHook',
+         switch_epoch=max_epochs - close_mosaic_epochs,
+         switch_pipeline=_base_.train_pipeline_stage2)
+]
+train_cfg = dict(max_epochs=max_epochs,
+                 val_interval=5,
+                 dynamic_intervals=[((max_epochs - close_mosaic_epochs),
+                                     _base_.val_interval_stage2)])
+
+optim_wrapper = dict(optimizer=dict(
+    _delete_=True,
+    type='AdamW',
+    lr=base_lr,
+    weight_decay=weight_decay,
+    batch_size_per_gpu=train_batch_size_per_gpu),
+                     paramwise_cfg=dict(custom_keys={
+                                            'backbone.text_model':
+                                            dict(lr_mult=0.01),
+                                            'logit_scale':
+                                            dict(weight_decay=0.0),
+                                            'embeddings':
+                                            dict(weight_decay=0.0)
+                                        }),
+                     constructor='YOLOWv5OptimizerConstructor')
+
+# evaluation settings
+val_evaluator = dict(_delete_=True,
+                     type='mmdet.CocoMetric',
+                     proposal_nums=(100, 1, 10),
+                     ann_file='data/coco/annotations/instances_val2017.json',
+                     metric='bbox')
diff --git a/mmdetection_practice/configs/prompt_tuning_coco/yolo_world_v2_l_vlpan_bn_sgd_1e-3_80e_8gpus_all_finetuning_coco.py b/mmdetection_practice/configs/prompt_tuning_coco/yolo_world_v2_l_vlpan_bn_sgd_1e-3_80e_8gpus_all_finetuning_coco.py
new file mode 100644
index 0000000..8caf5bd
--- /dev/null
+++ b/mmdetection_practice/configs/prompt_tuning_coco/yolo_world_v2_l_vlpan_bn_sgd_1e-3_80e_8gpus_all_finetuning_coco.py
@@ -0,0 +1,109 @@
+_base_ = ('../../third_party/mmyolo/configs/yolov8/'
+          'yolov8_l_syncbn_fast_8xb16-500e_coco.py')
+custom_imports = dict(imports=['yolo_world'], allow_failed_imports=False)
+
+# hyper-parameters
+num_classes = 80
+num_training_classes = 80
+max_epochs = 40  # Maximum training epochs
+close_mosaic_epochs = 10
+save_epoch_intervals = 5
+text_channels = 512
+neck_embed_channels = [128, 256, _base_.last_stage_out_channels // 2]
+neck_num_heads = [4, 8, _base_.last_stage_out_channels // 2 // 32]
+base_lr = 1e-3
+weight_decay = 0.0005
+train_batch_size_per_gpu = 16
+load_from = 'pretrained_models/yolo_world_l_clip_t2i_bn_2e-3adamw_32xb16-100e_obj365v1_goldg_cc3mlite_train-ca93cd1f.pth'
+persistent_workers = False
+
+# model settings
+model = dict(type='SimpleYOLOWorldDetector',
+             mm_neck=True,
+             num_train_classes=num_training_classes,
+             num_test_classes=num_classes,
+             embedding_path='embeddings/clip_vit_b32_coco_80_embeddings.npy',
+             prompt_dim=text_channels,
+             num_prompts=80,
+             freeze_prompt=True,
+             data_preprocessor=dict(type='YOLOv5DetDataPreprocessor'),
+             backbone=dict(_delete_=True,
+                           type='MultiModalYOLOBackbone',
+                           text_model=None,
+                           image_model={{_base_.model.backbone}},
+                           with_text_model=False),
+             neck=dict(type='YOLOWorldPAFPN',
+                       freeze_all=False,
+                       guide_channels=text_channels,
+                       embed_channels=neck_embed_channels,
+                       num_heads=neck_num_heads,
+                       block_cfg=dict(type='MaxSigmoidCSPLayerWithTwoConv')),
+             bbox_head=dict(type='YOLOWorldHead',
+                            head_module=dict(
+                                type='YOLOWorldHeadModule',
+                                freeze_all=False,
+                                use_bn_head=True,
+                                embed_dims=text_channels,
+                                num_classes=num_training_classes)),
+             train_cfg=dict(assigner=dict(num_classes=num_training_classes)))
+
+# dataset settings
+coco_train_dataset = dict(type='YOLOv5CocoDataset',
+                          data_root='data/coco',
+                          ann_file='annotations/instances_train2017.json',
+                          data_prefix=dict(img='train2017/'),
+                          filter_cfg=dict(filter_empty_gt=False, min_size=32),
+                          pipeline=_base_.train_pipeline)
+
+train_dataloader = dict(persistent_workers=persistent_workers,
+                        batch_size=train_batch_size_per_gpu,
+                        collate_fn=dict(type='yolow_collate'),
+                        dataset=coco_train_dataset)
+
+coco_val_dataset = dict(type='YOLOv5CocoDataset',
+                        data_root='data/coco',
+                        ann_file='annotations/instances_val2017.json',
+                        data_prefix=dict(img='val2017/'),
+                        filter_cfg=dict(filter_empty_gt=False, min_size=32),
+                        pipeline=_base_.test_pipeline)
+
+val_dataloader = dict(dataset=coco_val_dataset)
+test_dataloader = val_dataloader
+# training settings
+default_hooks = dict(param_scheduler=dict(scheduler_type='linear',
+                                          lr_factor=0.01,
+                                          max_epochs=max_epochs),
+                     checkpoint=dict(max_keep_ckpts=-1,
+                                     save_best=None,
+                                     interval=save_epoch_intervals))
+custom_hooks = [
+    dict(type='EMAHook',
+         ema_type='ExpMomentumEMA',
+         momentum=0.0001,
+         update_buffers=True,
+         strict_load=False,
+         priority=49),
+    dict(type='mmdet.PipelineSwitchHook',
+         switch_epoch=max_epochs - close_mosaic_epochs,
+         switch_pipeline=_base_.train_pipeline_stage2)
+]
+train_cfg = dict(max_epochs=max_epochs,
+                 val_interval=5,
+                 dynamic_intervals=[((max_epochs - close_mosaic_epochs),
+                                     _base_.val_interval_stage2)])
+
+optim_wrapper = dict(optimizer=dict(
+    _delete_=True,
+    type='SGD',
+    lr=base_lr,
+    momentum=0.937,
+    nesterov=True,
+    weight_decay=weight_decay,
+    batch_size_per_gpu=train_batch_size_per_gpu))
+
+# evaluation settings
+val_evaluator = dict(_delete_=True,
+                     type='mmdet.CocoMetric',
+                     proposal_nums=(100, 1, 10),
+                     ann_file='data/coco/annotations/instances_val2017.json',
+                     metric='bbox')
diff --git a/mmdetection_practice/configs/segmentation/README.md b/mmdetection_practice/configs/segmentation/README.md
new file mode 100644
index 0000000..8cfd303
--- /dev/null
+++ b/mmdetection_practice/configs/segmentation/README.md
@@ -0,0 +1,27 @@
+## Fine-tuning YOLO-World for Instance Segmentation
+
+
+### Models
+
+We fine-tune YOLO-World on LVIS (`LVIS-Base`) with mask annotations for open-vocabulary (zero-shot) instance segmentation.
+
+We provide two fine-tuning strategies YOLO-World towards open-vocabulary instance segmentation:
+
+* fine-tuning `all modules`: leads to better LVIS segmentation accuracy but affects the zero-shot performance.
+
+* fine-tuning the `segmentation head`: maintains the zero-shot performanc but lowers LVIS segmentation accuracy. 
+
+| Model | Fine-tuning Data | Fine-tuning Modules| AP<sup>mask</su> | AP<sub>r</sub> | AP<sub>c</sub> | AP<sub>f</sub> | Weights |
+| :---- | :--------------- | :----------------: | :--------------: | :------------: | :------------: | :------------: | :-----: |
+| [YOLO-World-Seg-M](./yolo_world_seg_m_dual_vlpan_2e-4_80e_8gpus_allmodules_finetune_lvis.py) | `LVIS-Base` | `all modules` | 25.9 | 13.4 | 24.9 | 32.6  | [HF Checkpoints 🤗](https://huggingface.co/wondervictor/YOLO-World/blob/main/yolo_world_seg_m_dual_vlpan_2e-4_80e_8gpus_allmodules_finetune_lvis-ca465825.pth) |
+| [YOLO-World-v2-Seg-M](./yolo_world_seg_m_dual_vlpan_2e-4_80e_8gpus_allmodules_finetune_lvis.py) | `LVIS-Base` | `all modules` | 25.9 | 13.4 | 24.9 | 32.6  | [HF Checkpoints 🤗]() |
+| [YOLO-World-Seg-L](./yolo_world_seg_l_dual_vlpan_2e-4_80e_8gpus_allmodules_finetune_lvis.py) | `LVIS-Base` | `all modules` | 28.7 | 15.0 | 28.3 | 35.2| [HF Checkpoints 🤗](https://huggingface.co/wondervictor/YOLO-World/blob/main/yolo_world_seg_l_dual_vlpan_2e-4_80e_8gpus_allmodules_finetune_lvis-8c58c916.pth) |
+| [YOLO-World-v2-Seg-L](./yolo_world_seg_l_dual_vlpan_2e-4_80e_8gpus_allmodules_finetune_lvis.py) | `LVIS-Base` | `all modules` | 28.7 | 15.0 | 28.3 | 35.2| [HF Checkpoints 🤗]() |
+| [YOLO-World-Seg-M](./yolo_seg_world_m_dual_vlpan_2e-4_80e_8gpus_seghead_finetune_lvis.py) | `LVIS-Base` | `seg head` | 16.7 | 12.6 | 14.6 | 20.8  | [HF Checkpoints 🤗](https://huggingface.co/wondervictor/YOLO-World/blob/main/yolo_world_seg_m_dual_vlpan_2e-4_80e_8gpus_seghead_finetune_lvis-7bca59a7.pth) |
+| [YOLO-World-v2-Seg-M](./yolo_world_v2_seg_m_vlpan_bn_2e-4_80e_8gpus_seghead_finetune_lvis.py) | `LVIS-Base` | `seg head` | 17.8 | 13.9 | 15.5 | 22.0  | [HF Checkpoints 🤗]() |
+| [YOLO-World-Seg-L](yolo_seg_world_l_dual_vlpan_2e-4_80e_8gpus_seghead_finetune_lvis.py) | `LVIS-Base` | `seg head` | 19.1 | 14.2 | 17.2 | 23.5 | [HF Checkpoints 🤗](https://huggingface.co/wondervictor/YOLO-World/blob/main/yolo_world_seg_l_dual_vlpan_2e-4_80e_8gpus_seghead_finetune_lvis-5a642d30.pth) |
+| [YOLO-World-v2-Seg-L](./yolo_world_v2_seg_l_vlpan_bn_2e-4_80e_8gpus_seghead_finetune_lvis.py) | `LVIS-Base` | `seg head` | 19.8 | 17.2 | 17.5 | 23.6 | [HF Checkpoints 🤗]() |
+**NOTE:**
+1. The mask AP are evaluated on the LVIS `val 1.0`.
+2. All models are fine-tuned for 80 epochs on `LVIS-Base` (866 categories, `common + frequent`).
+3. The YOLO-World-Seg with only `seg head` fine-tuned maintains the original zero-shot detection capability and segments objects.
diff --git a/mmdetection_practice/configs/segmentation/yolo_world_seg_l_dual_vlpan_2e-4_80e_8gpus_allmodules_finetune_lvis.py b/mmdetection_practice/configs/segmentation/yolo_world_seg_l_dual_vlpan_2e-4_80e_8gpus_allmodules_finetune_lvis.py
new file mode 100644
index 0000000..01885dd
--- /dev/null
+++ b/mmdetection_practice/configs/segmentation/yolo_world_seg_l_dual_vlpan_2e-4_80e_8gpus_allmodules_finetune_lvis.py
@@ -0,0 +1,227 @@
+_base_ = (
+    '../../third_party/mmyolo/configs/yolov8/yolov8_l_mask-refine_syncbn_fast_8xb16-500e_coco.py'
+)
+custom_imports = dict(imports=['yolo_world'], allow_failed_imports=False)
+# hyper-parameters
+num_classes = 1203
+num_training_classes = 80
+max_epochs = 80  # Maximum training epochs
+close_mosaic_epochs = 10
+save_epoch_intervals = 5
+text_channels = 512
+neck_embed_channels = [128, 256, _base_.last_stage_out_channels // 2]
+neck_num_heads = [4, 8, _base_.last_stage_out_channels // 2 // 32]
+base_lr = 2e-4
+
+weight_decay = 0.05
+train_batch_size_per_gpu = 8
+load_from = 'pretrained_models/yolo_world_l_clip_base_dual_vlpan_2e-3adamw_32xb16_100e_o365_goldg_train_pretrained-0e566235.pth'
+persistent_workers = False
+text_model_name = '../pretrained_models/clip-vit-base-patch32-projection'
+# text_model_name = 'openai/clip-vit-base-patch32'
+# Polygon2Mask
+downsample_ratio = 4
+mask_overlap = False
+use_mask2refine = True
+max_aspect_ratio = 100
+min_area_ratio = 0.01
+
+# model settings
+model = dict(
+    type='YOLOWorldDetector',
+    mm_neck=True,
+    num_train_classes=num_training_classes,
+    num_test_classes=num_classes,
+    data_preprocessor=dict(type='YOLOWDetDataPreprocessor'),
+    backbone=dict(
+        _delete_=True,
+        type='MultiModalYOLOBackbone',
+        image_model={{_base_.model.backbone}},
+        text_model=dict(
+            type='HuggingCLIPLanguageBackbone',
+            model_name=text_model_name,
+            frozen_modules=[])),
+    neck=dict(type='YOLOWorldDualPAFPN',
+              guide_channels=text_channels,
+              embed_channels=neck_embed_channels,
+              num_heads=neck_num_heads,
+              block_cfg=dict(type='MaxSigmoidCSPLayerWithTwoConv'),
+              text_enhancder=dict(type='ImagePoolingAttentionModule',
+                                  embed_channels=256,
+                                  num_heads=8)),
+    bbox_head=dict(type='YOLOWorldSegHead',
+                   head_module=dict(type='YOLOWorldSegHeadModule',
+                                    embed_dims=text_channels,
+                                    num_classes=num_training_classes,
+                                    mask_channels=32,
+                                    proto_channels=256),
+                   mask_overlap=mask_overlap,
+                   loss_mask=dict(type='mmdet.CrossEntropyLoss',
+                                  use_sigmoid=True,
+                                  reduction='none'),
+                   loss_mask_weight=1.0),
+    train_cfg=dict(assigner=dict(num_classes=num_training_classes)),
+    test_cfg=dict(mask_thr_binary=0.5, fast_test=True))
+
+pre_transform = [
+    dict(type='LoadImageFromFile', backend_args=_base_.backend_args),
+    dict(type='LoadAnnotations',
+         with_bbox=True,
+         with_mask=True,
+         mask2bbox=True)
+]
+
+last_transform = [
+    dict(type='mmdet.Albu',
+         transforms=_base_.albu_train_transforms,
+         bbox_params=dict(type='BboxParams',
+                          format='pascal_voc',
+                          label_fields=['gt_bboxes_labels',
+                                        'gt_ignore_flags']),
+         keymap={
+             'img': 'image',
+             'gt_bboxes': 'bboxes'
+         }),
+    dict(type='YOLOv5HSVRandomAug'),
+    dict(type='mmdet.RandomFlip', prob=0.5),
+    dict(type='Polygon2Mask',
+         downsample_ratio=downsample_ratio,
+         mask_overlap=mask_overlap),
+]
+
+# dataset settings
+text_transform = [
+    dict(type='RandomLoadText',
+         num_neg_samples=(num_classes, num_classes),
+         max_num_samples=num_training_classes,
+         padding_to_max=True,
+         padding_value=''),
+    dict(type='PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                    'flip_direction', 'texts'))
+]
+mosaic_affine_transform = [
+    dict(type='MultiModalMosaic',
+         img_scale=_base_.img_scale,
+         pad_val=114.0,
+         pre_transform=pre_transform),
+    dict(type='YOLOv5CopyPaste', prob=_base_.copypaste_prob),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        max_aspect_ratio=100.,
+        scaling_ratio_range=(1 - _base_.affine_scale, 1 + _base_.affine_scale),
+        # img_scale is (width, height)
+        border=(-_base_.img_scale[0] // 2, -_base_.img_scale[1] // 2),
+        border_val=(114, 114, 114),
+        min_area_ratio=_base_.min_area_ratio,
+        use_mask_refine=True)
+]
+train_pipeline = [
+    *pre_transform, *mosaic_affine_transform,
+    dict(type='YOLOv5MultiModalMixUp',
+         prob=_base_.mixup_prob,
+         pre_transform=[*pre_transform, *mosaic_affine_transform]),
+    *last_transform, *text_transform
+]
+
+_train_pipeline_stage2 = [
+    *pre_transform,
+    dict(type='YOLOv5KeepRatioResize', scale=_base_.img_scale),
+    dict(type='LetterResize',
+         scale=_base_.img_scale,
+         allow_scale_up=True,
+         pad_val=dict(img=114.0)),
+    dict(type='YOLOv5RandomAffine',
+         max_rotate_degree=0.0,
+         max_shear_degree=0.0,
+         scaling_ratio_range=(1 - _base_.affine_scale,
+                              1 + _base_.affine_scale),
+         max_aspect_ratio=_base_.max_aspect_ratio,
+         border_val=(114, 114, 114),
+         min_area_ratio=min_area_ratio,
+         use_mask_refine=use_mask2refine), *last_transform
+]
+train_pipeline_stage2 = [*_train_pipeline_stage2, *text_transform]
+coco_train_dataset = dict(
+    _delete_=True,
+    type='MultiModalDataset',
+    dataset=dict(type='YOLOv5LVISV1Dataset',
+                 data_root='data/coco',
+                 ann_file='lvis/lvis_v1_train_base.json',
+                 data_prefix=dict(img=''),
+                 filter_cfg=dict(filter_empty_gt=True, min_size=32)),
+    class_text_path='data/texts/lvis_v1_base_class_texts.json',
+    pipeline=train_pipeline)
+train_dataloader = dict(persistent_workers=persistent_workers,
+                        batch_size=train_batch_size_per_gpu,
+                        collate_fn=dict(type='yolow_collate'),
+                        dataset=coco_train_dataset)
+
+test_pipeline = [
+    *_base_.test_pipeline[:-1],
+    dict(type='LoadText'),
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                    'scale_factor', 'pad_param', 'texts'))
+]
+
+# training settings
+default_hooks = dict(param_scheduler=dict(scheduler_type='linear',
+                                          lr_factor=0.01,
+                                          max_epochs=max_epochs),
+                     checkpoint=dict(max_keep_ckpts=-1,
+                                     save_best=None,
+                                     interval=save_epoch_intervals))
+custom_hooks = [
+    dict(type='EMAHook',
+         ema_type='ExpMomentumEMA',
+         momentum=0.0001,
+         update_buffers=True,
+         strict_load=False,
+         priority=49),
+    dict(type='mmdet.PipelineSwitchHook',
+         switch_epoch=max_epochs - close_mosaic_epochs,
+         switch_pipeline=train_pipeline_stage2)
+]
+train_cfg = dict(max_epochs=max_epochs,
+                 val_interval=5,
+                 dynamic_intervals=[((max_epochs - close_mosaic_epochs),
+                                     _base_.val_interval_stage2)])
+optim_wrapper = dict(optimizer=dict(
+    _delete_=True,
+    type='AdamW',
+    lr=base_lr,
+    weight_decay=weight_decay,
+    batch_size_per_gpu=train_batch_size_per_gpu),
+                     paramwise_cfg=dict(bias_decay_mult=0.0,
+                                        norm_decay_mult=0.0,
+                                        custom_keys={
+                                            'backbone.text_model':
+                                            dict(lr_mult=0.01),
+                                            'logit_scale':
+                                            dict(weight_decay=0.0),
+                                        }),
+                     constructor='YOLOWv5OptimizerConstructor')
+
+# evaluation settings
+coco_val_dataset = dict(
+    _delete_=True,
+    type='MultiModalDataset',
+    dataset=dict(type='YOLOv5LVISV1Dataset',
+                 data_root='data/coco/',
+                 test_mode=True,
+                 ann_file='lvis/lvis_v1_val.json',
+                 data_prefix=dict(img=''),
+                 batch_shapes_cfg=None),
+    class_text_path='data/captions/lvis_v1_class_captions.json',
+    pipeline=test_pipeline)
+val_dataloader = dict(dataset=coco_val_dataset)
+test_dataloader = val_dataloader
+
+val_evaluator = dict(type='mmdet.LVISMetric',
+                     ann_file='data/coco/lvis/lvis_v1_val.json',
+                     metric=['bbox', 'segm'])
+test_evaluator = val_evaluator
+find_unused_parameters = True
diff --git a/mmdetection_practice/configs/segmentation/yolo_world_seg_l_dual_vlpan_2e-4_80e_8gpus_seghead_finetune_lvis.py b/mmdetection_practice/configs/segmentation/yolo_world_seg_l_dual_vlpan_2e-4_80e_8gpus_seghead_finetune_lvis.py
new file mode 100644
index 0000000..5d4174a
--- /dev/null
+++ b/mmdetection_practice/configs/segmentation/yolo_world_seg_l_dual_vlpan_2e-4_80e_8gpus_seghead_finetune_lvis.py
@@ -0,0 +1,237 @@
+_base_ = (
+    '../../third_party/mmyolo/configs/yolov8/yolov8_l_mask-refine_syncbn_fast_8xb16-500e_coco.py'
+)
+custom_imports = dict(imports=['yolo_world'], allow_failed_imports=False)
+# hyper-parameters
+num_classes = 1203
+num_training_classes = 80
+max_epochs = 80  # Maximum training epochs
+close_mosaic_epochs = 10
+save_epoch_intervals = 5
+text_channels = 512
+neck_embed_channels = [128, 256, _base_.last_stage_out_channels // 2]
+neck_num_heads = [4, 8, _base_.last_stage_out_channels // 2 // 32]
+base_lr = 2e-4
+
+weight_decay = 0.05
+train_batch_size_per_gpu = 8
+load_from = 'pretrained_models/yolo_world_l_clip_base_dual_vlpan_2e-3adamw_32xb16_100e_o365_goldg_train_pretrained-0e566235.pth'
+persistent_workers = False
+
+# Polygon2Mask
+downsample_ratio = 4
+mask_overlap = False
+use_mask2refine = True
+max_aspect_ratio = 100
+min_area_ratio = 0.01
+
+# model settings
+model = dict(
+    type='YOLOWorldDetector',
+    mm_neck=True,
+    num_train_classes=num_training_classes,
+    num_test_classes=num_classes,
+    data_preprocessor=dict(type='YOLOWDetDataPreprocessor'),
+    backbone=dict(
+        _delete_=True,
+        type='MultiModalYOLOBackbone',
+        image_model={{_base_.model.backbone}},
+        frozen_stages=4,  # frozen the image backbone
+        text_model=dict(
+            type='HuggingCLIPLanguageBackbone',
+            model_name='openai/clip-vit-base-patch32',
+            frozen_modules=['all'])),
+    neck=dict(type='YOLOWorldDualPAFPN',
+              freeze_all=True,
+              guide_channels=text_channels,
+              embed_channels=neck_embed_channels,
+              num_heads=neck_num_heads,
+              block_cfg=dict(type='MaxSigmoidCSPLayerWithTwoConv'),
+              text_enhancder=dict(type='ImagePoolingAttentionModule',
+                                  embed_channels=256,
+                                  num_heads=8)),
+    bbox_head=dict(type='YOLOWorldSegHead',
+                   head_module=dict(type='YOLOWorldSegHeadModule',
+                                    embed_dims=text_channels,
+                                    num_classes=num_training_classes,
+                                    mask_channels=32,
+                                    proto_channels=256,
+                                    freeze_bbox=True),
+                   mask_overlap=mask_overlap,
+                   loss_mask=dict(type='mmdet.CrossEntropyLoss',
+                                  use_sigmoid=True,
+                                  reduction='none'),
+                   loss_mask_weight=1.0),
+    train_cfg=dict(assigner=dict(num_classes=num_training_classes)),
+    test_cfg=dict(mask_thr_binary=0.5, fast_test=True))
+
+pre_transform = [
+    dict(type='LoadImageFromFile', backend_args=_base_.backend_args),
+    dict(type='LoadAnnotations',
+         with_bbox=True,
+         with_mask=True,
+         mask2bbox=True)
+]
+
+last_transform = [
+    dict(type='mmdet.Albu',
+         transforms=_base_.albu_train_transforms,
+         bbox_params=dict(type='BboxParams',
+                          format='pascal_voc',
+                          label_fields=['gt_bboxes_labels',
+                                        'gt_ignore_flags']),
+         keymap={
+             'img': 'image',
+             'gt_bboxes': 'bboxes'
+         }),
+    dict(type='YOLOv5HSVRandomAug'),
+    dict(type='mmdet.RandomFlip', prob=0.5),
+    dict(type='Polygon2Mask',
+         downsample_ratio=downsample_ratio,
+         mask_overlap=mask_overlap),
+]
+
+# dataset settings
+text_transform = [
+    dict(type='RandomLoadText',
+         num_neg_samples=(num_classes, num_classes),
+         max_num_samples=num_training_classes,
+         padding_to_max=True,
+         padding_value=''),
+    dict(type='PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                    'flip_direction', 'texts'))
+]
+mosaic_affine_transform = [
+    dict(type='MultiModalMosaic',
+         img_scale=_base_.img_scale,
+         pad_val=114.0,
+         pre_transform=pre_transform),
+    dict(type='YOLOv5CopyPaste', prob=_base_.copypaste_prob),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        max_aspect_ratio=100.,
+        scaling_ratio_range=(1 - _base_.affine_scale, 1 + _base_.affine_scale),
+        # img_scale is (width, height)
+        border=(-_base_.img_scale[0] // 2, -_base_.img_scale[1] // 2),
+        border_val=(114, 114, 114),
+        min_area_ratio=_base_.min_area_ratio,
+        use_mask_refine=True)
+]
+train_pipeline = [
+    *pre_transform, *mosaic_affine_transform,
+    dict(type='YOLOv5MultiModalMixUp',
+         prob=_base_.mixup_prob,
+         pre_transform=[*pre_transform, *mosaic_affine_transform]),
+    *last_transform, *text_transform
+]
+
+_train_pipeline_stage2 = [
+    *pre_transform,
+    dict(type='YOLOv5KeepRatioResize', scale=_base_.img_scale),
+    dict(type='LetterResize',
+         scale=_base_.img_scale,
+         allow_scale_up=True,
+         pad_val=dict(img=114.0)),
+    dict(type='YOLOv5RandomAffine',
+         max_rotate_degree=0.0,
+         max_shear_degree=0.0,
+         scaling_ratio_range=(1 - _base_.affine_scale,
+                              1 + _base_.affine_scale),
+         max_aspect_ratio=_base_.max_aspect_ratio,
+         border_val=(114, 114, 114),
+         min_area_ratio=min_area_ratio,
+         use_mask_refine=use_mask2refine), *last_transform
+]
+train_pipeline_stage2 = [*_train_pipeline_stage2, *text_transform]
+coco_train_dataset = dict(
+    _delete_=True,
+    type='MultiModalDataset',
+    dataset=dict(type='YOLOv5LVISV1Dataset',
+                 data_root='data/coco',
+                 ann_file='lvis/lvis_v1_train_base.json',
+                 data_prefix=dict(img=''),
+                 filter_cfg=dict(filter_empty_gt=True, min_size=32)),
+    class_text_path='data/texts/lvis_v1_base_class_texts.json',
+    pipeline=train_pipeline)
+train_dataloader = dict(persistent_workers=persistent_workers,
+                        batch_size=train_batch_size_per_gpu,
+                        collate_fn=dict(type='yolow_collate'),
+                        dataset=coco_train_dataset)
+
+test_pipeline = [
+    *_base_.test_pipeline[:-1],
+    dict(type='LoadText'),
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                    'scale_factor', 'pad_param', 'texts'))
+]
+
+# training settings
+default_hooks = dict(param_scheduler=dict(scheduler_type='linear',
+                                          lr_factor=0.01,
+                                          max_epochs=max_epochs),
+                     checkpoint=dict(max_keep_ckpts=-1,
+                                     save_best=None,
+                                     interval=save_epoch_intervals))
+custom_hooks = [
+    dict(type='EMAHook',
+         ema_type='ExpMomentumEMA',
+         momentum=0.0001,
+         update_buffers=True,
+         strict_load=False,
+         priority=49),
+    dict(type='mmdet.PipelineSwitchHook',
+         switch_epoch=max_epochs - close_mosaic_epochs,
+         switch_pipeline=train_pipeline_stage2)
+]
+train_cfg = dict(max_epochs=max_epochs,
+                 val_interval=5,
+                 dynamic_intervals=[((max_epochs - close_mosaic_epochs),
+                                     _base_.val_interval_stage2)])
+optim_wrapper = dict(optimizer=dict(
+    _delete_=True,
+    type='AdamW',
+    lr=base_lr,
+    weight_decay=weight_decay,
+    batch_size_per_gpu=train_batch_size_per_gpu),
+                     paramwise_cfg=dict(bias_decay_mult=0.0,
+                                        norm_decay_mult=0.0,
+                                        custom_keys={
+                                            'backbone.text_model':
+                                            dict(lr_mult=0.01),
+                                            'logit_scale':
+                                            dict(weight_decay=0.0),
+                                            'neck':
+                                            dict(lr_mult=0.0),
+                                            'head.head_module.reg_preds':
+                                            dict(lr_mult=0.0),
+                                            'head.head_module.cls_preds':
+                                            dict(lr_mult=0.0),
+                                            'head.head_module.cls_contrasts':
+                                            dict(lr_mult=0.0)
+                                        }),
+                     constructor='YOLOWv5OptimizerConstructor')
+
+# evaluation settings
+coco_val_dataset = dict(
+    _delete_=True,
+    type='MultiModalDataset',
+    dataset=dict(type='YOLOv5LVISV1Dataset',
+                 data_root='data/coco/',
+                 test_mode=True,
+                 ann_file='lvis/lvis_v1_val.json',
+                 data_prefix=dict(img=''),
+                 batch_shapes_cfg=None),
+    class_text_path='data/captions/lvis_v1_class_captions.json',
+    pipeline=test_pipeline)
+val_dataloader = dict(dataset=coco_val_dataset)
+test_dataloader = val_dataloader
+
+val_evaluator = dict(type='mmdet.LVISMetric',
+                     ann_file='data/coco/lvis/lvis_v1_val.json',
+                     metric=['bbox', 'segm'])
+test_evaluator = val_evaluator
+find_unused_parameters = True
diff --git a/mmdetection_practice/configs/segmentation/yolo_world_seg_m_dual_vlpan_2e-4_80e_8gpus_allmodules_finetune_lvis.py b/mmdetection_practice/configs/segmentation/yolo_world_seg_m_dual_vlpan_2e-4_80e_8gpus_allmodules_finetune_lvis.py
new file mode 100644
index 0000000..31331b6
--- /dev/null
+++ b/mmdetection_practice/configs/segmentation/yolo_world_seg_m_dual_vlpan_2e-4_80e_8gpus_allmodules_finetune_lvis.py
@@ -0,0 +1,226 @@
+_base_ = (
+    '../../third_party/mmyolo/configs/yolov8/yolov8_m_mask-refine_syncbn_fast_8xb16-500e_coco.py'
+)
+custom_imports = dict(imports=['yolo_world'], allow_failed_imports=False)
+# hyper-parameters
+num_classes = 1203
+num_training_classes = 80
+max_epochs = 80  # Maximum training epochs
+close_mosaic_epochs = 10
+save_epoch_intervals = 5
+text_channels = 512
+neck_embed_channels = [128, 256, _base_.last_stage_out_channels // 2]
+neck_num_heads = [4, 8, _base_.last_stage_out_channels // 2 // 32]
+base_lr = 2e-4
+
+weight_decay = 0.05
+train_batch_size_per_gpu = 8
+load_from = 'pretrained_models/yolo_world_m_clip_base_dual_vlpan_2e-3adamw_32xb16_100e_o365_goldg_train_pretrained-2b7bd1be.pth'
+persistent_workers = False
+
+# Polygon2Mask
+downsample_ratio = 4
+mask_overlap = False
+use_mask2refine = True
+max_aspect_ratio = 100
+min_area_ratio = 0.01
+
+# model settings
+model = dict(
+    type='YOLOWorldDetector',
+    mm_neck=True,
+    num_train_classes=num_training_classes,
+    num_test_classes=num_classes,
+    data_preprocessor=dict(type='YOLOWDetDataPreprocessor'),
+    backbone=dict(
+        _delete_=True,
+        type='MultiModalYOLOBackbone',
+        image_model={{_base_.model.backbone}},
+        text_model=dict(
+            type='HuggingCLIPLanguageBackbone',
+            model_name='openai/clip-vit-base-patch32',
+            frozen_modules=[])),
+    neck=dict(type='YOLOWorldDualPAFPN',
+              guide_channels=text_channels,
+              embed_channels=neck_embed_channels,
+              num_heads=neck_num_heads,
+              block_cfg=dict(type='MaxSigmoidCSPLayerWithTwoConv'),
+              text_enhancder=dict(type='ImagePoolingAttentionModule',
+                                  embed_channels=256,
+                                  num_heads=8)),
+    bbox_head=dict(type='YOLOWorldSegHead',
+                   head_module=dict(type='YOLOWorldSegHeadModule',
+                                    embed_dims=text_channels,
+                                    num_classes=num_training_classes,
+                                    mask_channels=32,
+                                    proto_channels=256),
+                   mask_overlap=mask_overlap,
+                   loss_mask=dict(type='mmdet.CrossEntropyLoss',
+                                  use_sigmoid=True,
+                                  reduction='none'),
+                   loss_mask_weight=1.0),
+    train_cfg=dict(assigner=dict(num_classes=num_training_classes)),
+    test_cfg=dict(mask_thr_binary=0.5, fast_test=True))
+
+pre_transform = [
+    dict(type='LoadImageFromFile', backend_args=_base_.backend_args),
+    dict(type='LoadAnnotations',
+         with_bbox=True,
+         with_mask=True,
+         mask2bbox=True)
+]
+
+last_transform = [
+    dict(type='mmdet.Albu',
+         transforms=_base_.albu_train_transforms,
+         bbox_params=dict(type='BboxParams',
+                          format='pascal_voc',
+                          label_fields=['gt_bboxes_labels',
+                                        'gt_ignore_flags']),
+         keymap={
+             'img': 'image',
+             'gt_bboxes': 'bboxes'
+         }),
+    dict(type='YOLOv5HSVRandomAug'),
+    dict(type='mmdet.RandomFlip', prob=0.5),
+    dict(type='Polygon2Mask',
+         downsample_ratio=downsample_ratio,
+         mask_overlap=mask_overlap),
+]
+
+# dataset settings
+text_transform = [
+    dict(type='RandomLoadText',
+         num_neg_samples=(num_classes, num_classes),
+         max_num_samples=num_training_classes,
+         padding_to_max=True,
+         padding_value=''),
+    dict(type='PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                    'flip_direction', 'texts'))
+]
+mosaic_affine_transform = [
+    dict(type='MultiModalMosaic',
+         img_scale=_base_.img_scale,
+         pad_val=114.0,
+         pre_transform=pre_transform),
+    dict(type='YOLOv5CopyPaste', prob=_base_.copypaste_prob),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        max_aspect_ratio=100.,
+        scaling_ratio_range=(1 - _base_.affine_scale, 1 + _base_.affine_scale),
+        # img_scale is (width, height)
+        border=(-_base_.img_scale[0] // 2, -_base_.img_scale[1] // 2),
+        border_val=(114, 114, 114),
+        min_area_ratio=_base_.min_area_ratio,
+        use_mask_refine=True)
+]
+train_pipeline = [
+    *pre_transform, *mosaic_affine_transform,
+    dict(type='YOLOv5MultiModalMixUp',
+         prob=_base_.mixup_prob,
+         pre_transform=[*pre_transform, *mosaic_affine_transform]),
+    *last_transform, *text_transform
+]
+
+_train_pipeline_stage2 = [
+    *pre_transform,
+    dict(type='YOLOv5KeepRatioResize', scale=_base_.img_scale),
+    dict(type='LetterResize',
+         scale=_base_.img_scale,
+         allow_scale_up=True,
+         pad_val=dict(img=114.0)),
+    dict(type='YOLOv5RandomAffine',
+         max_rotate_degree=0.0,
+         max_shear_degree=0.0,
+         scaling_ratio_range=(1 - _base_.affine_scale,
+                              1 + _base_.affine_scale),
+         max_aspect_ratio=_base_.max_aspect_ratio,
+         border_val=(114, 114, 114),
+         min_area_ratio=min_area_ratio,
+         use_mask_refine=use_mask2refine), *last_transform
+]
+train_pipeline_stage2 = [*_train_pipeline_stage2, *text_transform]
+coco_train_dataset = dict(
+    _delete_=True,
+    type='MultiModalDataset',
+    dataset=dict(type='YOLOv5LVISV1Dataset',
+                 data_root='data/coco',
+                 ann_file='lvis/lvis_v1_train_base.json',
+                 data_prefix=dict(img=''),
+                 filter_cfg=dict(filter_empty_gt=True, min_size=32)),
+    class_text_path='data/texts/lvis_v1_base_class_texts.json',
+    pipeline=train_pipeline)
+train_dataloader = dict(persistent_workers=persistent_workers,
+                        batch_size=train_batch_size_per_gpu,
+                        collate_fn=dict(type='yolow_collate'),
+                        dataset=coco_train_dataset)
+
+test_pipeline = [
+    *_base_.test_pipeline[:-1],
+    dict(type='LoadText'),
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                    'scale_factor', 'pad_param', 'texts'))
+]
+
+# training settings
+default_hooks = dict(param_scheduler=dict(scheduler_type='linear',
+                                          lr_factor=0.01,
+                                          max_epochs=max_epochs),
+                     checkpoint=dict(max_keep_ckpts=-1,
+                                     save_best=None,
+                                     interval=save_epoch_intervals))
+custom_hooks = [
+    dict(type='EMAHook',
+         ema_type='ExpMomentumEMA',
+         momentum=0.0001,
+         update_buffers=True,
+         strict_load=False,
+         priority=49),
+    dict(type='mmdet.PipelineSwitchHook',
+         switch_epoch=max_epochs - close_mosaic_epochs,
+         switch_pipeline=train_pipeline_stage2)
+]
+train_cfg = dict(max_epochs=max_epochs,
+                 val_interval=5,
+                 dynamic_intervals=[((max_epochs - close_mosaic_epochs),
+                                     _base_.val_interval_stage2)])
+optim_wrapper = dict(optimizer=dict(
+    _delete_=True,
+    type='AdamW',
+    lr=base_lr,
+    weight_decay=weight_decay,
+    batch_size_per_gpu=train_batch_size_per_gpu),
+                     paramwise_cfg=dict(bias_decay_mult=0.0,
+                                        norm_decay_mult=0.0,
+                                        custom_keys={
+                                            'backbone.text_model':
+                                            dict(lr_mult=0.01),
+                                            'logit_scale':
+                                            dict(weight_decay=0.0)
+                                        }),
+                     constructor='YOLOWv5OptimizerConstructor')
+
+# evaluation settings
+coco_val_dataset = dict(
+    _delete_=True,
+    type='MultiModalDataset',
+    dataset=dict(type='YOLOv5LVISV1Dataset',
+                 data_root='data/coco/',
+                 test_mode=True,
+                 ann_file='lvis/lvis_v1_val.json',
+                 data_prefix=dict(img=''),
+                 batch_shapes_cfg=None),
+    class_text_path='data/captions/lvis_v1_class_captions.json',
+    pipeline=test_pipeline)
+val_dataloader = dict(dataset=coco_val_dataset)
+test_dataloader = val_dataloader
+
+val_evaluator = dict(type='mmdet.LVISMetric',
+                     ann_file='data/coco/lvis/lvis_v1_val.json',
+                     metric=['bbox', 'segm'])
+test_evaluator = val_evaluator
+find_unused_parameters = True
diff --git a/mmdetection_practice/configs/segmentation/yolo_world_seg_m_dual_vlpan_2e-4_80e_8gpus_seghead_finetune_lvis.py b/mmdetection_practice/configs/segmentation/yolo_world_seg_m_dual_vlpan_2e-4_80e_8gpus_seghead_finetune_lvis.py
new file mode 100644
index 0000000..883c322
--- /dev/null
+++ b/mmdetection_practice/configs/segmentation/yolo_world_seg_m_dual_vlpan_2e-4_80e_8gpus_seghead_finetune_lvis.py
@@ -0,0 +1,237 @@
+_base_ = (
+    '../../third_party/mmyolo/configs/yolov8/yolov8_m_mask-refine_syncbn_fast_8xb16-500e_coco.py'
+)
+custom_imports = dict(imports=['yolo_world'], allow_failed_imports=False)
+# hyper-parameters
+num_classes = 1203
+num_training_classes = 80
+max_epochs = 80  # Maximum training epochs
+close_mosaic_epochs = 10
+save_epoch_intervals = 5
+text_channels = 512
+neck_embed_channels = [128, 256, _base_.last_stage_out_channels // 2]
+neck_num_heads = [4, 8, _base_.last_stage_out_channels // 2 // 32]
+base_lr = 2e-4
+
+weight_decay = 0.05
+train_batch_size_per_gpu = 8
+load_from = 'pretrained_models/yolo_world_m_clip_base_dual_vlpan_2e-3adamw_32xb16_100e_o365_goldg_train_pretrained-2b7bd1be.pth'
+persistent_workers = False
+
+# Polygon2Mask
+downsample_ratio = 4
+mask_overlap = False
+use_mask2refine = True
+max_aspect_ratio = 100
+min_area_ratio = 0.01
+
+# model settings
+model = dict(
+    type='YOLOWorldDetector',
+    mm_neck=True,
+    num_train_classes=num_training_classes,
+    num_test_classes=num_classes,
+    data_preprocessor=dict(type='YOLOWDetDataPreprocessor'),
+    backbone=dict(
+        _delete_=True,
+        type='MultiModalYOLOBackbone',
+        image_model={{_base_.model.backbone}},
+        frozen_stages=4,  # frozen the image backbone
+        text_model=dict(
+            type='HuggingCLIPLanguageBackbone',
+            model_name='openai/clip-vit-base-patch32',
+            frozen_modules=['all'])),
+    neck=dict(type='YOLOWorldDualPAFPN',
+              freeze_all=True,
+              guide_channels=text_channels,
+              embed_channels=neck_embed_channels,
+              num_heads=neck_num_heads,
+              block_cfg=dict(type='MaxSigmoidCSPLayerWithTwoConv'),
+              text_enhancder=dict(type='ImagePoolingAttentionModule',
+                                  embed_channels=256,
+                                  num_heads=8)),
+    bbox_head=dict(type='YOLOWorldSegHead',
+                   head_module=dict(type='YOLOWorldSegHeadModule',
+                                    embed_dims=text_channels,
+                                    num_classes=num_training_classes,
+                                    mask_channels=32,
+                                    proto_channels=256,
+                                    freeze_bbox=True),
+                   mask_overlap=mask_overlap,
+                   loss_mask=dict(type='mmdet.CrossEntropyLoss',
+                                  use_sigmoid=True,
+                                  reduction='none'),
+                   loss_mask_weight=1.0),
+    train_cfg=dict(assigner=dict(num_classes=num_training_classes)),
+    test_cfg=dict(mask_thr_binary=0.5, fast_test=True))
+
+pre_transform = [
+    dict(type='LoadImageFromFile', backend_args=_base_.backend_args),
+    dict(type='LoadAnnotations',
+         with_bbox=True,
+         with_mask=True,
+         mask2bbox=True)
+]
+
+last_transform = [
+    dict(type='mmdet.Albu',
+         transforms=_base_.albu_train_transforms,
+         bbox_params=dict(type='BboxParams',
+                          format='pascal_voc',
+                          label_fields=['gt_bboxes_labels',
+                                        'gt_ignore_flags']),
+         keymap={
+             'img': 'image',
+             'gt_bboxes': 'bboxes'
+         }),
+    dict(type='YOLOv5HSVRandomAug'),
+    dict(type='mmdet.RandomFlip', prob=0.5),
+    dict(type='Polygon2Mask',
+         downsample_ratio=downsample_ratio,
+         mask_overlap=mask_overlap),
+]
+
+# dataset settings
+text_transform = [
+    dict(type='RandomLoadText',
+         num_neg_samples=(num_classes, num_classes),
+         max_num_samples=num_training_classes,
+         padding_to_max=True,
+         padding_value=''),
+    dict(type='PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                    'flip_direction', 'texts'))
+]
+mosaic_affine_transform = [
+    dict(type='MultiModalMosaic',
+         img_scale=_base_.img_scale,
+         pad_val=114.0,
+         pre_transform=pre_transform),
+    dict(type='YOLOv5CopyPaste', prob=_base_.copypaste_prob),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        max_aspect_ratio=100.,
+        scaling_ratio_range=(1 - _base_.affine_scale, 1 + _base_.affine_scale),
+        # img_scale is (width, height)
+        border=(-_base_.img_scale[0] // 2, -_base_.img_scale[1] // 2),
+        border_val=(114, 114, 114),
+        min_area_ratio=_base_.min_area_ratio,
+        use_mask_refine=True)
+]
+train_pipeline = [
+    *pre_transform, *mosaic_affine_transform,
+    dict(type='YOLOv5MultiModalMixUp',
+         prob=_base_.mixup_prob,
+         pre_transform=[*pre_transform, *mosaic_affine_transform]),
+    *last_transform, *text_transform
+]
+
+_train_pipeline_stage2 = [
+    *pre_transform,
+    dict(type='YOLOv5KeepRatioResize', scale=_base_.img_scale),
+    dict(type='LetterResize',
+         scale=_base_.img_scale,
+         allow_scale_up=True,
+         pad_val=dict(img=114.0)),
+    dict(type='YOLOv5RandomAffine',
+         max_rotate_degree=0.0,
+         max_shear_degree=0.0,
+         scaling_ratio_range=(1 - _base_.affine_scale,
+                              1 + _base_.affine_scale),
+         max_aspect_ratio=_base_.max_aspect_ratio,
+         border_val=(114, 114, 114),
+         min_area_ratio=min_area_ratio,
+         use_mask_refine=use_mask2refine), *last_transform
+]
+train_pipeline_stage2 = [*_train_pipeline_stage2, *text_transform]
+coco_train_dataset = dict(
+    _delete_=True,
+    type='MultiModalDataset',
+    dataset=dict(type='YOLOv5LVISV1Dataset',
+                 data_root='data/coco',
+                 ann_file='lvis/lvis_v1_train_base.json',
+                 data_prefix=dict(img=''),
+                 filter_cfg=dict(filter_empty_gt=True, min_size=32)),
+    class_text_path='data/texts/lvis_v1_base_class_texts.json',
+    pipeline=train_pipeline)
+train_dataloader = dict(persistent_workers=persistent_workers,
+                        batch_size=train_batch_size_per_gpu,
+                        collate_fn=dict(type='yolow_collate'),
+                        dataset=coco_train_dataset)
+
+test_pipeline = [
+    *_base_.test_pipeline[:-1],
+    dict(type='LoadText'),
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                    'scale_factor', 'pad_param', 'texts'))
+]
+
+# training settings
+default_hooks = dict(param_scheduler=dict(scheduler_type='linear',
+                                          lr_factor=0.01,
+                                          max_epochs=max_epochs),
+                     checkpoint=dict(max_keep_ckpts=-1,
+                                     save_best=None,
+                                     interval=save_epoch_intervals))
+custom_hooks = [
+    dict(type='EMAHook',
+         ema_type='ExpMomentumEMA',
+         momentum=0.0001,
+         update_buffers=True,
+         strict_load=False,
+         priority=49),
+    dict(type='mmdet.PipelineSwitchHook',
+         switch_epoch=max_epochs - close_mosaic_epochs,
+         switch_pipeline=train_pipeline_stage2)
+]
+train_cfg = dict(max_epochs=max_epochs,
+                 val_interval=5,
+                 dynamic_intervals=[((max_epochs - close_mosaic_epochs),
+                                     _base_.val_interval_stage2)])
+optim_wrapper = dict(optimizer=dict(
+    _delete_=True,
+    type='AdamW',
+    lr=base_lr,
+    weight_decay=weight_decay,
+    batch_size_per_gpu=train_batch_size_per_gpu),
+                     paramwise_cfg=dict(bias_decay_mult=0.0,
+                                        norm_decay_mult=0.0,
+                                        custom_keys={
+                                            'backbone.text_model':
+                                            dict(lr_mult=0.01),
+                                            'logit_scale':
+                                            dict(weight_decay=0.0),
+                                            'neck':
+                                            dict(lr_mult=0.0),
+                                            'head.head_module.reg_preds':
+                                            dict(lr_mult=0.0),
+                                            'head.head_module.cls_preds':
+                                            dict(lr_mult=0.0),
+                                            'head.head_module.cls_contrasts':
+                                            dict(lr_mult=0.0)
+                                        }),
+                     constructor='YOLOWv5OptimizerConstructor')
+
+# evaluation settings
+coco_val_dataset = dict(
+    _delete_=True,
+    type='MultiModalDataset',
+    dataset=dict(type='YOLOv5LVISV1Dataset',
+                 data_root='data/coco/',
+                 test_mode=True,
+                 ann_file='lvis/lvis_v1_val.json',
+                 data_prefix=dict(img=''),
+                 batch_shapes_cfg=None),
+    class_text_path='data/captions/lvis_v1_class_captions.json',
+    pipeline=test_pipeline)
+val_dataloader = dict(dataset=coco_val_dataset)
+test_dataloader = val_dataloader
+
+val_evaluator = dict(type='mmdet.LVISMetric',
+                     ann_file='data/coco/lvis/lvis_v1_val.json',
+                     metric=['bbox', 'segm'])
+test_evaluator = val_evaluator
+find_unused_parameters = True
diff --git a/mmdetection_practice/configs/segmentation/yolo_world_v2_seg_l_vlpan_bn_2e-4_80e_8gpus_seghead_finetune_lvis.py b/mmdetection_practice/configs/segmentation/yolo_world_v2_seg_l_vlpan_bn_2e-4_80e_8gpus_seghead_finetune_lvis.py
new file mode 100644
index 0000000..062c9e3
--- /dev/null
+++ b/mmdetection_practice/configs/segmentation/yolo_world_v2_seg_l_vlpan_bn_2e-4_80e_8gpus_seghead_finetune_lvis.py
@@ -0,0 +1,239 @@
+_base_ = (
+    '../../third_party/mmyolo/configs/yolov8/yolov8_l_mask-refine_syncbn_fast_8xb16-500e_coco.py'
+)
+custom_imports = dict(imports=['yolo_world'], allow_failed_imports=False)
+# hyper-parameters
+num_classes = 1203
+num_training_classes = 80
+max_epochs = 80  # Maximum training epochs
+close_mosaic_epochs = 10
+save_epoch_intervals = 5
+text_channels = 512
+neck_embed_channels = [128, 256, _base_.last_stage_out_channels // 2]
+neck_num_heads = [4, 8, _base_.last_stage_out_channels // 2 // 32]
+base_lr = 2e-4
+
+weight_decay = 0.05
+train_batch_size_per_gpu = 8
+load_from = 'pretrained_models/yolo_world_l_clip_t2i_bn_2e-3adamw_32xb16-100e_obj365v1_goldg_cc3mlite_train-ca93cd1f.pth'
+# text_model_name = '../pretrained_models/clip-vit-base-patch32-projection'
+text_model_name = 'openai/clip-vit-base-patch32'
+persistent_workers = False
+
+# Polygon2Mask
+downsample_ratio = 4
+mask_overlap = False
+use_mask2refine = True
+max_aspect_ratio = 100
+min_area_ratio = 0.01
+
+# model settings
+model = dict(
+    type='YOLOWorldDetector',
+    mm_neck=True,
+    num_train_classes=num_training_classes,
+    num_test_classes=num_classes,
+    data_preprocessor=dict(type='YOLOWDetDataPreprocessor'),
+    backbone=dict(
+        _delete_=True,
+        type='MultiModalYOLOBackbone',
+        image_model={{_base_.model.backbone}},
+        frozen_stages=4,  # frozen the image backbone
+        text_model=dict(
+            type='HuggingCLIPLanguageBackbone',
+            model_name=text_model_name,
+            frozen_modules=['all'])),
+    neck=dict(type='YOLOWorldPAFPN',
+              freeze_all=True,
+              guide_channels=text_channels,
+              embed_channels=neck_embed_channels,
+              num_heads=neck_num_heads,
+              block_cfg=dict(type='MaxSigmoidCSPLayerWithTwoConv')),
+    bbox_head=dict(type='YOLOWorldSegHead',
+                   head_module=dict(type='YOLOWorldSegHeadModule',
+                                    use_bn_head=True,
+                                    embed_dims=text_channels,
+                                    num_classes=num_training_classes,
+                                    mask_channels=32,
+                                    proto_channels=256,
+                                    freeze_bbox=True),
+                   mask_overlap=mask_overlap,
+                   loss_mask=dict(type='mmdet.CrossEntropyLoss',
+                                  use_sigmoid=True,
+                                  reduction='none'),
+                   loss_mask_weight=1.0),
+    train_cfg=dict(assigner=dict(
+        type='YOLOWorldSegAssigner',
+        num_classes=num_training_classes)),
+    test_cfg=dict(mask_thr_binary=0.5, fast_test=True))
+
+pre_transform = [
+    dict(type='LoadImageFromFile', backend_args=_base_.backend_args),
+    dict(type='LoadAnnotations',
+         with_bbox=True,
+         with_mask=True,
+         mask2bbox=True)
+]
+
+last_transform = [
+    dict(type='mmdet.Albu',
+         transforms=_base_.albu_train_transforms,
+         bbox_params=dict(type='BboxParams',
+                          format='pascal_voc',
+                          label_fields=['gt_bboxes_labels',
+                                        'gt_ignore_flags']),
+         keymap={
+             'img': 'image',
+             'gt_bboxes': 'bboxes'
+         }),
+    dict(type='YOLOv5HSVRandomAug'),
+    dict(type='mmdet.RandomFlip', prob=0.5),
+    dict(type='Polygon2Mask',
+         downsample_ratio=downsample_ratio,
+         mask_overlap=mask_overlap),
+]
+
+# dataset settings
+text_transform = [
+    dict(type='RandomLoadText',
+         num_neg_samples=(num_classes, num_classes),
+         max_num_samples=num_training_classes,
+         padding_to_max=True,
+         padding_value=''),
+    dict(type='PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                    'flip_direction', 'texts'))
+]
+mosaic_affine_transform = [
+    dict(type='MultiModalMosaic',
+         img_scale=_base_.img_scale,
+         pad_val=114.0,
+         pre_transform=pre_transform),
+    dict(type='YOLOv5CopyPaste', prob=_base_.copypaste_prob),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        max_aspect_ratio=100.,
+        scaling_ratio_range=(1 - _base_.affine_scale, 1 + _base_.affine_scale),
+        # img_scale is (width, height)
+        border=(-_base_.img_scale[0] // 2, -_base_.img_scale[1] // 2),
+        border_val=(114, 114, 114),
+        min_area_ratio=_base_.min_area_ratio,
+        use_mask_refine=True)
+]
+train_pipeline = [
+    *pre_transform, *mosaic_affine_transform,
+    dict(type='YOLOv5MultiModalMixUp',
+         prob=_base_.mixup_prob,
+         pre_transform=[*pre_transform, *mosaic_affine_transform]),
+    *last_transform, *text_transform
+]
+
+_train_pipeline_stage2 = [
+    *pre_transform,
+    dict(type='YOLOv5KeepRatioResize', scale=_base_.img_scale),
+    dict(type='LetterResize',
+         scale=_base_.img_scale,
+         allow_scale_up=True,
+         pad_val=dict(img=114.0)),
+    dict(type='YOLOv5RandomAffine',
+         max_rotate_degree=0.0,
+         max_shear_degree=0.0,
+         scaling_ratio_range=(1 - _base_.affine_scale,
+                              1 + _base_.affine_scale),
+         max_aspect_ratio=_base_.max_aspect_ratio,
+         border_val=(114, 114, 114),
+         min_area_ratio=min_area_ratio,
+         use_mask_refine=use_mask2refine), *last_transform
+]
+train_pipeline_stage2 = [*_train_pipeline_stage2, *text_transform]
+coco_train_dataset = dict(
+    _delete_=True,
+    type='MultiModalDataset',
+    dataset=dict(type='YOLOv5LVISV1Dataset',
+                 data_root='data/coco',
+                 ann_file='lvis/lvis_v1_train_base.json',
+                 data_prefix=dict(img=''),
+                 filter_cfg=dict(filter_empty_gt=True, min_size=32)),
+    class_text_path='data/texts/lvis_v1_base_class_texts.json',
+    pipeline=train_pipeline)
+train_dataloader = dict(persistent_workers=persistent_workers,
+                        batch_size=train_batch_size_per_gpu,
+                        collate_fn=dict(type='yolow_collate'),
+                        dataset=coco_train_dataset)
+
+test_pipeline = [
+    *_base_.test_pipeline[:-1],
+    dict(type='LoadText'),
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                    'scale_factor', 'pad_param', 'texts'))
+]
+
+# training settings
+default_hooks = dict(param_scheduler=dict(scheduler_type='linear',
+                                          lr_factor=0.01,
+                                          max_epochs=max_epochs),
+                     checkpoint=dict(max_keep_ckpts=-1,
+                                     save_best=None,
+                                     interval=save_epoch_intervals))
+custom_hooks = [
+    dict(type='EMAHook',
+         ema_type='ExpMomentumEMA',
+         momentum=0.0001,
+         update_buffers=True,
+         strict_load=False,
+         priority=49),
+    dict(type='mmdet.PipelineSwitchHook',
+         switch_epoch=max_epochs - close_mosaic_epochs,
+         switch_pipeline=train_pipeline_stage2)
+]
+train_cfg = dict(max_epochs=max_epochs,
+                 val_interval=5,
+                 dynamic_intervals=[((max_epochs - close_mosaic_epochs),
+                                     _base_.val_interval_stage2)])
+optim_wrapper = dict(optimizer=dict(
+    _delete_=True,
+    type='AdamW',
+    lr=base_lr,
+    weight_decay=weight_decay,
+    batch_size_per_gpu=train_batch_size_per_gpu),
+                     paramwise_cfg=dict(bias_decay_mult=0.0,
+                                        norm_decay_mult=0.0,
+                                        custom_keys={
+                                            'backbone.text_model':
+                                            dict(lr_mult=0.01),
+                                            'logit_scale':
+                                            dict(weight_decay=0.0),
+                                            'neck':
+                                            dict(lr_mult=0.0),
+                                            'head.head_module.reg_preds':
+                                            dict(lr_mult=0.0),
+                                            'head.head_module.cls_preds':
+                                            dict(lr_mult=0.0),
+                                            'head.head_module.cls_contrasts':
+                                            dict(lr_mult=0.0)
+                                        }),
+                     constructor='YOLOWv5OptimizerConstructor')
+
+# evaluation settings
+coco_val_dataset = dict(
+    _delete_=True,
+    type='MultiModalDataset',
+    dataset=dict(type='YOLOv5LVISV1Dataset',
+                 data_root='data/coco/',
+                 test_mode=True,
+                 ann_file='lvis/lvis_v1_val.json',
+                 data_prefix=dict(img=''),
+                 batch_shapes_cfg=None),
+    class_text_path='data/texts/lvis_v1_class_texts.json',
+    pipeline=test_pipeline)
+val_dataloader = dict(dataset=coco_val_dataset)
+test_dataloader = val_dataloader
+
+val_evaluator = dict(type='mmdet.LVISMetric',
+                     ann_file='data/coco/lvis/lvis_v1_val.json',
+                     metric=['bbox', 'segm'])
+test_evaluator = val_evaluator
+find_unused_parameters = True
diff --git a/mmdetection_practice/configs/segmentation/yolo_world_v2_seg_m_vlpan_bn_2e-4_80e_8gpus_seghead_finetune_lvis.py b/mmdetection_practice/configs/segmentation/yolo_world_v2_seg_m_vlpan_bn_2e-4_80e_8gpus_seghead_finetune_lvis.py
new file mode 100644
index 0000000..d196d4e
--- /dev/null
+++ b/mmdetection_practice/configs/segmentation/yolo_world_v2_seg_m_vlpan_bn_2e-4_80e_8gpus_seghead_finetune_lvis.py
@@ -0,0 +1,239 @@
+_base_ = (
+    '../../third_party/mmyolo/configs/yolov8/yolov8_m_mask-refine_syncbn_fast_8xb16-500e_coco.py'
+)
+custom_imports = dict(imports=['yolo_world'], allow_failed_imports=False)
+# hyper-parameters
+num_classes = 1203
+num_training_classes = 80
+max_epochs = 80  # Maximum training epochs
+close_mosaic_epochs = 10
+save_epoch_intervals = 5
+text_channels = 512
+neck_embed_channels = [128, 256, _base_.last_stage_out_channels // 2]
+neck_num_heads = [4, 8, _base_.last_stage_out_channels // 2 // 32]
+base_lr = 2e-4
+
+weight_decay = 0.05
+train_batch_size_per_gpu = 8
+load_from = 'pretrained_models/yolo_world_m_clip_t2i_bn_2e-3adamw_32xb16-100e_obj365v1_goldg_train-c6237d5b.pth'
+text_model_name = '../pretrained_models/clip-vit-base-patch32-projection'
+# text_model_name = 'openai/clip-vit-base-patch32'
+persistent_workers = False
+
+# Polygon2Mask
+downsample_ratio = 4
+mask_overlap = False
+use_mask2refine = True
+max_aspect_ratio = 100
+min_area_ratio = 0.01
+
+# model settings
+model = dict(
+    type='YOLOWorldDetector',
+    mm_neck=True,
+    num_train_classes=num_training_classes,
+    num_test_classes=num_classes,
+    data_preprocessor=dict(type='YOLOWDetDataPreprocessor'),
+    backbone=dict(
+        _delete_=True,
+        type='MultiModalYOLOBackbone',
+        image_model={{_base_.model.backbone}},
+        frozen_stages=4,  # frozen the image backbone
+        text_model=dict(
+            type='HuggingCLIPLanguageBackbone',
+            model_name=text_model_name,
+            frozen_modules=['all'])),
+    neck=dict(type='YOLOWorldPAFPN',
+              freeze_all=True,
+              guide_channels=text_channels,
+              embed_channels=neck_embed_channels,
+              num_heads=neck_num_heads,
+              block_cfg=dict(type='MaxSigmoidCSPLayerWithTwoConv')),
+    bbox_head=dict(type='YOLOWorldSegHead',
+                   head_module=dict(type='YOLOWorldSegHeadModule',
+                                    use_bn_head=True,
+                                    embed_dims=text_channels,
+                                    num_classes=num_training_classes,
+                                    mask_channels=32,
+                                    proto_channels=256,
+                                    freeze_bbox=True),
+                   mask_overlap=mask_overlap,
+                   loss_mask=dict(type='mmdet.CrossEntropyLoss',
+                                  use_sigmoid=True,
+                                  reduction='none'),
+                   loss_mask_weight=1.0),
+    train_cfg=dict(assigner=dict(
+        type='YOLOWorldSegAssigner',
+        num_classes=num_training_classes)),
+    test_cfg=dict(mask_thr_binary=0.5, fast_test=True))
+
+pre_transform = [
+    dict(type='LoadImageFromFile', backend_args=_base_.backend_args),
+    dict(type='LoadAnnotations',
+         with_bbox=True,
+         with_mask=True,
+         mask2bbox=True)
+]
+
+last_transform = [
+    dict(type='mmdet.Albu',
+         transforms=_base_.albu_train_transforms,
+         bbox_params=dict(type='BboxParams',
+                          format='pascal_voc',
+                          label_fields=['gt_bboxes_labels',
+                                        'gt_ignore_flags']),
+         keymap={
+             'img': 'image',
+             'gt_bboxes': 'bboxes'
+         }),
+    dict(type='YOLOv5HSVRandomAug'),
+    dict(type='mmdet.RandomFlip', prob=0.5),
+    dict(type='Polygon2Mask',
+         downsample_ratio=downsample_ratio,
+         mask_overlap=mask_overlap),
+]
+
+# dataset settings
+text_transform = [
+    dict(type='RandomLoadText',
+         num_neg_samples=(num_classes, num_classes),
+         max_num_samples=num_training_classes,
+         padding_to_max=True,
+         padding_value=''),
+    dict(type='PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                    'flip_direction', 'texts'))
+]
+mosaic_affine_transform = [
+    dict(type='MultiModalMosaic',
+         img_scale=_base_.img_scale,
+         pad_val=114.0,
+         pre_transform=pre_transform),
+    dict(type='YOLOv5CopyPaste', prob=_base_.copypaste_prob),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        max_aspect_ratio=100.,
+        scaling_ratio_range=(1 - _base_.affine_scale, 1 + _base_.affine_scale),
+        # img_scale is (width, height)
+        border=(-_base_.img_scale[0] // 2, -_base_.img_scale[1] // 2),
+        border_val=(114, 114, 114),
+        min_area_ratio=_base_.min_area_ratio,
+        use_mask_refine=True)
+]
+train_pipeline = [
+    *pre_transform, *mosaic_affine_transform,
+    dict(type='YOLOv5MultiModalMixUp',
+         prob=_base_.mixup_prob,
+         pre_transform=[*pre_transform, *mosaic_affine_transform]),
+    *last_transform, *text_transform
+]
+
+_train_pipeline_stage2 = [
+    *pre_transform,
+    dict(type='YOLOv5KeepRatioResize', scale=_base_.img_scale),
+    dict(type='LetterResize',
+         scale=_base_.img_scale,
+         allow_scale_up=True,
+         pad_val=dict(img=114.0)),
+    dict(type='YOLOv5RandomAffine',
+         max_rotate_degree=0.0,
+         max_shear_degree=0.0,
+         scaling_ratio_range=(1 - _base_.affine_scale,
+                              1 + _base_.affine_scale),
+         max_aspect_ratio=_base_.max_aspect_ratio,
+         border_val=(114, 114, 114),
+         min_area_ratio=min_area_ratio,
+         use_mask_refine=use_mask2refine), *last_transform
+]
+train_pipeline_stage2 = [*_train_pipeline_stage2, *text_transform]
+coco_train_dataset = dict(
+    _delete_=True,
+    type='MultiModalDataset',
+    dataset=dict(type='YOLOv5LVISV1Dataset',
+                 data_root='data/coco',
+                 ann_file='lvis/lvis_v1_train_base.json',
+                 data_prefix=dict(img=''),
+                 filter_cfg=dict(filter_empty_gt=True, min_size=32)),
+    class_text_path='data/texts/lvis_v1_base_class_texts.json',
+    pipeline=train_pipeline)
+train_dataloader = dict(persistent_workers=persistent_workers,
+                        batch_size=train_batch_size_per_gpu,
+                        collate_fn=dict(type='yolow_collate'),
+                        dataset=coco_train_dataset)
+
+test_pipeline = [
+    *_base_.test_pipeline[:-1],
+    dict(type='LoadText'),
+    dict(type='mmdet.PackDetInputs',
+         meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                    'scale_factor', 'pad_param', 'texts'))
+]
+
+# training settings
+default_hooks = dict(param_scheduler=dict(scheduler_type='linear',
+                                          lr_factor=0.01,
+                                          max_epochs=max_epochs),
+                     checkpoint=dict(max_keep_ckpts=-1,
+                                     save_best=None,
+                                     interval=save_epoch_intervals))
+custom_hooks = [
+    dict(type='EMAHook',
+         ema_type='ExpMomentumEMA',
+         momentum=0.0001,
+         update_buffers=True,
+         strict_load=False,
+         priority=49),
+    dict(type='mmdet.PipelineSwitchHook',
+         switch_epoch=max_epochs - close_mosaic_epochs,
+         switch_pipeline=train_pipeline_stage2)
+]
+train_cfg = dict(max_epochs=max_epochs,
+                 val_interval=5,
+                 dynamic_intervals=[((max_epochs - close_mosaic_epochs),
+                                     _base_.val_interval_stage2)])
+optim_wrapper = dict(optimizer=dict(
+    _delete_=True,
+    type='AdamW',
+    lr=base_lr,
+    weight_decay=weight_decay,
+    batch_size_per_gpu=train_batch_size_per_gpu),
+                     paramwise_cfg=dict(bias_decay_mult=0.0,
+                                        norm_decay_mult=0.0,
+                                        custom_keys={
+                                            'backbone.text_model':
+                                            dict(lr_mult=0.01),
+                                            'logit_scale':
+                                            dict(weight_decay=0.0),
+                                            'neck':
+                                            dict(lr_mult=0.0),
+                                            'head.head_module.reg_preds':
+                                            dict(lr_mult=0.0),
+                                            'head.head_module.cls_preds':
+                                            dict(lr_mult=0.0),
+                                            'head.head_module.cls_contrasts':
+                                            dict(lr_mult=0.0)
+                                        }),
+                     constructor='YOLOWv5OptimizerConstructor')
+
+# evaluation settings
+coco_val_dataset = dict(
+    _delete_=True,
+    type='MultiModalDataset',
+    dataset=dict(type='YOLOv5LVISV1Dataset',
+                 data_root='data/coco/',
+                 test_mode=True,
+                 ann_file='lvis/lvis_v1_val.json',
+                 data_prefix=dict(img=''),
+                 batch_shapes_cfg=None),
+    class_text_path='data/texts/lvis_v1_class_texts.json',
+    pipeline=test_pipeline)
+val_dataloader = dict(dataset=coco_val_dataset)
+test_dataloader = val_dataloader
+
+val_evaluator = dict(type='mmdet.LVISMetric',
+                     ann_file='data/coco/lvis/lvis_v1_val.json',
+                     metric=['bbox', 'segm'])
+test_evaluator = val_evaluator
+find_unused_parameters = True
diff --git a/mmdetection_practice/data/texts/coco_class_texts.json b/mmdetection_practice/data/texts/coco_class_texts.json
new file mode 100644
index 0000000..b83ee71
--- /dev/null
+++ b/mmdetection_practice/data/texts/coco_class_texts.json
@@ -0,0 +1 @@
+[["person"], ["bicycle"], ["car"], ["motorcycle"], ["airplane"], ["bus"], ["train"], ["truck"], ["boat"], ["traffic light"], ["fire hydrant"], ["stop sign"], ["parking meter"], ["bench"], ["bird"], ["cat"], ["dog"], ["horse"], ["sheep"], ["cow"], ["elephant"], ["bear"], ["zebra"], ["giraffe"], ["backpack"], ["umbrella"], ["handbag"], ["tie"], ["suitcase"], ["frisbee"], ["skis"], ["snowboard"], ["sports ball"], ["kite"], ["baseball bat"], ["baseball glove"], ["skateboard"], ["surfboard"], ["tennis racket"], ["bottle"], ["wine glass"], ["cup"], ["fork"], ["knife"], ["spoon"], ["bowl"], ["banana"], ["apple"], ["sandwich"], ["orange"], ["broccoli"], ["carrot"], ["hot dog"], ["pizza"], ["donut"], ["cake"], ["chair"], ["couch"], ["potted plant"], ["bed"], ["dining table"], ["toilet"], ["tv"], ["laptop"], ["mouse"], ["remote"], ["keyboard"], ["cell phone"], ["microwave"], ["oven"], ["toaster"], ["sink"], ["refrigerator"], ["book"], ["clock"], ["vase"], ["scissors"], ["teddy bear"], ["hair drier"], ["toothbrush"]]
diff --git a/mmdetection_practice/data/texts/lvis_v1_base_class_captions.json b/mmdetection_practice/data/texts/lvis_v1_base_class_captions.json
new file mode 100644
index 0000000..27e5e72
--- /dev/null
+++ b/mmdetection_practice/data/texts/lvis_v1_base_class_captions.json
@@ -0,0 +1 @@
+[["aerosol can", "spray can"], ["air conditioner"], ["airplane", "aeroplane"], ["alarm clock"], ["alcohol", "alcoholic beverage"], ["alligator", "gator"], ["almond"], ["ambulance"], ["amplifier"], ["anklet", "ankle bracelet"], ["antenna", "aerial", "transmitting aerial"], ["apple"], ["apron"], ["aquarium", "fish tank"], ["armband"], ["armchair"], ["artichoke"], ["trash can", "garbage can", "wastebin", "dustbin", "trash barrel", "trash bin"], ["ashtray"], ["asparagus"], ["atomizer", "atomiser", "spray", "sprayer", "nebulizer", "nebuliser"], ["avocado"], ["award", "accolade"], ["awning"], ["baby buggy", "baby carriage", "perambulator", "pram", "stroller"], ["basketball backboard"], ["backpack", "knapsack", "packsack", "rucksack", "haversack"], ["handbag", "purse", "pocketbook"], ["suitcase", "baggage", "luggage"], ["bagel", "beigel"], ["ball"], ["balloon"], ["bamboo"], ["banana"], ["Band Aid"], ["bandage"], ["bandanna", "bandana"], ["banner", "streamer"], ["barrel", "cask"], ["barrette"], ["barrow", "garden cart", "lawn cart", "wheelbarrow"], ["baseball base"], ["baseball"], ["baseball bat"], ["baseball cap", "jockey cap", "golf cap"], ["baseball glove", "baseball mitt"], ["basket", "handbasket"], ["basketball"], ["bat", "bat animal"], ["bath mat"], ["bath towel"], ["bathrobe"], ["bathtub", "bathing tub"], ["battery"], ["bead"], ["bean curd", "tofu"], ["beanbag"], ["beanie", "beany"], ["bear"], ["bed"], ["bedspread", "bedcover", "bed covering", "counterpane", "spread"], ["cow"], ["beef", "beef food", "boeuf", "boeuf food"], ["beer bottle"], ["beer can"], ["bell"], ["bell pepper", "capsicum"], ["belt"], ["belt buckle"], ["bench"], ["beret"], ["bib"], ["bicycle", "bike", "bike bicycle"], ["visor", "vizor"], ["billboard"], ["binder", "ring-binder"], ["binoculars", "field glasses", "opera glasses"], ["bird"], ["birdfeeder"], ["birdbath"], ["birdcage"], ["birdhouse"], ["birthday cake"], ["black sheep"], ["blackberry"], ["blackboard", "chalkboard"], ["blanket"], ["blazer", "sport jacket", "sport coat", "sports jacket", "sports coat"], ["blender", "liquidizer", "liquidiser"], ["blinker", "flasher"], ["blouse"], ["blueberry"], ["boat", "ship", "ship boat"], ["bobbin", "spool", "reel"], ["bobby pin", "hairgrip"], ["boiled egg", "coddled egg"], ["deadbolt"], ["bolt"], ["book"], ["bookcase"], ["booklet", "brochure", "leaflet", "pamphlet"], ["boot"], ["bottle"], ["bottle opener"], ["bouquet"], ["bow", "bow decorative ribbons"], ["bow-tie", "bowtie"], ["bowl"], ["bowler hat", "bowler", "derby hat", "derby", "plug hat"], ["box"], ["suspenders"], ["bracelet", "bangle"], ["brassiere", "bra", "bandeau"], ["bread-bin", "breadbox"], ["bread"], ["bridal gown", "wedding gown", "wedding dress"], ["briefcase"], ["broccoli"], ["broom"], ["brownie"], ["brussels sprouts"], ["bucket", "pail"], ["horned cow"], ["bulldog"], ["bullet train"], ["bulletin board", "notice board"], ["bullhorn", "megaphone"], ["bun", "roll"], ["bunk bed"], ["buoy"], ["bus", "bus vehicle", "autobus", "charabanc", "double-decker", "motorbus", "motorcoach"], ["business card"], ["butter"], ["butterfly"], ["button"], ["cab", "cab taxi", "taxi", "taxicab"], ["cabin car", "caboose"], ["cabinet"], ["cake"], ["calculator"], ["calendar"], ["calf"], ["camcorder"], ["camel"], ["camera"], ["camera lens"], ["camper", "camper vehicle", "camping bus", "motor home"], ["can", "tin can"], ["can opener", "tin opener"], ["candle", "candlestick"], ["candle holder"], ["candy cane"], ["walking cane"], ["canister", "cannister"], ["canoe"], ["cantaloup", "cantaloupe"], ["cap", "cap headwear"], ["bottle cap", "cap", "cap container lid"], ["cape"], ["cappuccino", "coffee cappuccino"], ["car", "car automobile", "auto", "auto automobile", "automobile"], ["railcar", "railcar part of a train", "railway car", "railway car part of a train", "railroad car", "railroad car part of a train"], ["identity card"], ["card"], ["cardigan"], ["horse carriage"], ["carrot"], ["tote bag"], ["cart"], ["carton"], ["cash register", "register", "register for cash transactions"], ["cast", "plaster cast", "plaster bandage"], ["cat"], ["cauliflower"], ["cayenne", "cayenne spice", "cayenne pepper", "cayenne pepper spice", "red pepper", "red pepper spice"], ["CD player"], ["celery"], ["cellular telephone", "cellular phone", "cellphone", "mobile phone", "smart phone"], ["chair"], ["chandelier"], ["cherry"], ["chicken", "chicken animal"], ["chickpea", "garbanzo"], ["chili", "chili vegetable", "chili pepper", "chili pepper vegetable", "chilli", "chilli vegetable", "chilly", "chilly vegetable", "chile", "chile vegetable"], ["crisp", "crisp potato chip", "potato chip"], ["chocolate bar"], ["chocolate cake"], ["choker", "collar", "neckband"], ["chopping board", "cutting board", "chopping block"], ["chopstick"], ["Christmas tree"], ["slide"], ["cigarette"], ["cigarette case", "cigarette pack"], ["cistern", "water tank"], ["clasp"], ["cleansing agent", "cleanser", "cleaner"], ["clip"], ["clipboard"], ["clock", "timepiece", "timekeeper"], ["clock tower"], ["clothes hamper", "laundry basket", "clothes basket"], ["clothespin", "clothes peg"], ["coaster"], ["coat"], ["coat hanger", "clothes hanger", "dress hanger"], ["coatrack", "hatrack"], ["cock", "rooster"], ["coconut", "cocoanut"], ["coffee maker", "coffee machine"], ["coffee table", "cocktail table"], ["coffeepot"], ["coin"], ["colander", "cullender"], ["coleslaw", "slaw"], ["pacifier", "teething ring"], ["computer keyboard", "keyboard", "keyboard computer"], ["condiment"], ["cone", "traffic cone"], ["control", "controller"], ["cookie", "cooky", "biscuit", "biscuit cookie"], ["cooler", "cooler for food", "ice chest"], ["cork", "cork bottle plug", "bottle cork"], ["corkscrew", "bottle screw"], ["edible corn", "corn", "maize"], ["cornet", "horn", "trumpet"], ["cornice", "valance", "valance board", "pelmet"], ["corset", "girdle"], ["costume"], ["cowbell"], ["cowboy hat", "ten-gallon hat"], ["crab", "crab animal"], ["cracker"], ["crate"], ["crayon", "wax crayon"], ["crescent roll", "croissant"], ["crib", "cot"], ["crock pot", "earthenware jar"], ["crossbar"], ["crow"], ["crown"], ["crucifix"], ["cruise ship", "cruise liner"], ["police cruiser", "patrol car", "police car", "squad car"], ["crumb"], ["crutch"], ["cub", "cub animal"], ["cube", "square block"], ["cucumber", "cuke"], ["cufflink"], ["cup"], ["trophy cup"], ["cupboard", "closet"], ["cupcake"], ["curtain", "drapery"], ["cushion"], ["dartboard"], ["deck chair", "beach chair"], ["deer", "cervid"], ["dental floss", "floss"], ["desk"], ["diaper"], ["dining table"], ["dish"], ["dish antenna"], ["dishrag", "dishcloth"], ["dishtowel", "tea towel"], ["dishwasher", "dishwashing machine"], ["dispenser"], ["Dixie cup", "paper cup"], ["dog"], ["dog collar"], ["doll"], ["dolphin"], ["domestic ass", "donkey"], ["doorknob", "doorhandle"], ["doormat", "welcome mat"], ["doughnut", "donut"], ["drawer"], ["underdrawers", "boxers", "boxershorts"], ["dress", "frock"], ["dress hat", "high hat", "opera hat", "silk hat", "top hat"], ["dress suit"], ["dresser"], ["drill"], ["drum", "drum musical instrument"], ["duck"], ["duckling"], ["duct tape"], ["duffel bag", "duffle bag", "duffel", "duffle"], ["dumpster"], ["eagle"], ["earphone", "earpiece", "headphone"], ["earring"], ["easel"], ["egg", "eggs"], ["egg yolk", "yolk", "yolk egg"], ["eggbeater", "eggwhisk"], ["eggplant", "aubergine"], ["refrigerator"], ["elephant"], ["elk", "moose"], ["envelope"], ["eraser"], ["fan"], ["faucet", "spigot", "tap"], ["Ferris wheel"], ["ferry", "ferryboat"], ["fighter jet", "fighter aircraft", "attack aircraft"], ["figurine"], ["file cabinet", "filing cabinet"], ["fire alarm", "smoke alarm"], ["fire engine", "fire truck"], ["fire extinguisher", "extinguisher"], ["fire hose"], ["fireplace"], ["fireplug", "fire hydrant", "hydrant"], ["fish"], ["fish", "fish food"], ["fishing rod", "fishing pole"], ["flag"], ["flagpole", "flagstaff"], ["flamingo"], ["flannel"], ["flap"], ["flashlight", "torch"], ["flip-flop", "flip-flop sandal"], ["flipper", "flipper footwear", "fin", "fin footwear"], ["flower arrangement", "floral arrangement"], ["flute glass", "champagne flute"], ["foal"], ["folding chair"], ["food processor"], ["football", "football American"], ["footstool", "footrest"], ["fork"], ["forklift"], ["freight car"], ["French toast"], ["freshener", "air freshener"], ["frisbee"], ["frog", "toad", "toad frog"], ["fruit juice"], ["frying pan", "frypan", "skillet"], ["garbage truck"], ["garden hose"], ["gargle", "mouthwash"], ["garlic", "ail"], ["gazelle"], ["gelatin", "jelly"], ["giant panda", "panda", "panda bear"], ["gift wrap"], ["ginger", "gingerroot"], ["giraffe"], ["cincture", "sash", "waistband", "waistcloth"], ["glass", "glass drink container", "drinking glass"], ["globe"], ["glove"], ["goat"], ["goggles"], ["golf club", "golf-club"], ["golfcart"], ["goose"], ["grape"], ["grater"], ["gravestone", "headstone", "tombstone"], ["green bean"], ["green onion", "spring onion", "scallion"], ["grill", "grille", "grillwork", "radiator grille"], ["grizzly", "grizzly bear"], ["grocery bag"], ["guitar"], ["gull", "seagull"], ["gun"], ["hairbrush"], ["hairnet"], ["hairpin"], ["ham", "jambon", "gammon"], ["hamburger", "beefburger", "burger"], ["hammer"], ["hammock"], ["hamster"], ["hair dryer"], ["hand towel", "face towel"], ["handcart", "pushcart", "hand truck"], ["handkerchief"], ["handle", "grip", "handgrip"], ["hat"], ["veil"], ["headband"], ["headboard"], ["headlight", "headlamp"], ["headscarf"], ["headstall", "headstall for horses", "headpiece", "headpiece for horses"], ["heart"], ["heater", "warmer"], ["helicopter"], ["helmet"], ["highchair", "feeding chair"], ["hinge"], ["hog", "pig"], ["home plate", "home plate baseball", "home base", "home base baseball"], ["honey"], ["fume hood", "exhaust hood"], ["hook"], ["horse"], ["hose", "hosepipe"], ["hot sauce"], ["hummingbird"], ["polar bear"], ["icecream"], ["ice maker"], ["igniter", "ignitor", "lighter"], ["iPod"], ["iron", "iron for clothing", "smoothing iron", "smoothing iron for clothing"], ["ironing board"], ["jacket"], ["jam"], ["jar"], ["jean", "blue jean", "denim"], ["jeep", "landrover"], ["jersey", "T-shirt", "tee shirt"], ["jet plane", "jet-propelled plane"], ["jewelry", "jewellery"], ["jumpsuit"], ["kayak"], ["kettle", "boiler"], ["key"], ["kilt"], ["kimono"], ["kitchen sink"], ["kite"], ["kitten", "kitty"], ["kiwi fruit"], ["knee pad"], ["knife"], ["knob"], ["ladder"], ["ladle"], ["ladybug", "ladybeetle", "ladybird beetle"], ["lamb", "lamb animal"], ["lamp"], ["lamppost"], ["lampshade"], ["lantern"], ["lanyard", "laniard"], ["laptop computer", "notebook computer"], ["latch"], ["legging", "legging clothing", "leging", "leging clothing", "leg covering"], ["Lego", "Lego set"], ["lemon"], ["lettuce"], ["license plate", "numberplate"], ["life buoy", "lifesaver", "life belt", "life ring"], ["life jacket", "life vest"], ["lightbulb"], ["lime"], ["lion"], ["lip balm"], ["lizard"], ["log"], ["lollipop"], ["speaker", "speaker stereo equipment"], ["loveseat"], ["magazine"], ["magnet"], ["mail slot"], ["mailbox", "mailbox at home", "letter box", "letter box at home"], ["mandarin orange"], ["manger", "trough"], ["manhole"], ["map"], ["marker"], ["mashed potato"], ["mask", "facemask"], ["mast"], ["mat", "mat gym equipment", "gym mat"], ["mattress"], ["measuring cup"], ["measuring stick", "ruler", "ruler measuring stick", "measuring rod"], ["meatball"], ["medicine"], ["melon"], ["microphone"], ["microwave oven"], ["milk"], ["minivan"], ["mirror"], ["mitten"], ["mixer", "mixer kitchen tool", "stand mixer"], ["money"], ["monitor", "monitor computer equipment"], ["monkey"], ["motor"], ["motor scooter", "scooter"], ["motorcycle"], ["mound", "mound baseball", "pitcher's mound"], ["mouse", "mouse computer equipment", "computer mouse"], ["mousepad"], ["muffin"], ["mug"], ["mushroom"], ["musical instrument", "instrument", "instrument musical"], ["napkin", "table napkin", "serviette"], ["necklace"], ["necktie", "tie", "tie necktie"], ["needle"], ["nest"], ["newspaper", "paper", "paper newspaper"], ["newsstand"], ["nightshirt", "nightwear", "sleepwear", "nightclothes"], ["noseband", "noseband for animals", "nosepiece", "nosepiece for animals"], ["notebook"], ["notepad"], ["nut"], ["oar"], ["oil lamp", "kerosene lamp", "kerosine lamp"], ["olive oil"], ["onion"], ["orange", "orange fruit"], ["orange juice"], ["ostrich"], ["ottoman", "pouf", "pouffe", "hassock"], ["oven"], ["overalls", "overalls clothing"], ["owl"], ["packet"], ["pad"], ["paddle", "boat paddle"], ["padlock"], ["paintbrush"], ["painting"], ["pajamas", "pyjamas"], ["palette", "pallet"], ["pan", "pan for cooking", "cooking pan"], ["pancake"], ["paper plate"], ["paper towel"], ["parachute"], ["parakeet", "parrakeet", "parroket", "paraquet", "paroquet", "parroquet"], ["parasail", "parasail sports"], ["parasol", "sunshade"], ["parka", "anorak"], ["parking meter"], ["parrot"], ["passenger car", "passenger car part of a train", "coach", "coach part of a train"], ["passport"], ["pastry"], ["pea", "pea food"], ["peach"], ["peanut butter"], ["pear"], ["peeler", "peeler tool for fruit and vegetables"], ["pelican"], ["pen"], ["pencil"], ["penguin"], ["pepper", "peppercorn"], ["pepper mill", "pepper grinder"], ["perfume"], ["person", "baby", "child", "boy", "girl", "man", "woman", "human"], ["pet"], ["pew", "pew church bench", "church bench"], ["phonograph record", "phonograph recording", "record", "record phonograph recording"], ["piano"], ["pickle"], ["pickup truck"], ["pie"], ["pigeon"], ["pillow"], ["pineapple"], ["pinecone"], ["pipe", "piping"], ["pita", "pita bread", "pocket bread"], ["pitcher", "pitcher vessel for liquid", "ewer"], ["pizza"], ["place mat"], ["plate"], ["platter"], ["pliers", "plyers"], ["pocketknife"], ["poker", "poker fire stirring tool", "stove poker", "fire hook"], ["pole", "post"], ["polo shirt", "sport shirt"], ["pony"], ["pop", "pop soda", "soda", "soda pop", "tonic", "soft drink"], ["postbox", "postbox public", "mailbox", "mailbox public"], ["postcard", "postal card", "mailing-card"], ["poster", "placard"], ["pot"], ["flowerpot"], ["potato"], ["potholder"], ["pottery", "clayware"], ["pouch"], ["power shovel", "excavator", "digger"], ["prawn", "shrimp"], ["pretzel"], ["printer", "printing machine"], ["projectile", "projectile weapon", "missile"], ["projector"], ["propeller", "propellor"], ["pumpkin"], ["puppy"], ["quilt", "comforter"], ["rabbit"], ["racket", "racquet"], ["radiator"], ["radio receiver", "radio set", "radio", "tuner", "tuner radio"], ["radish", "daikon"], ["raft"], ["raincoat", "waterproof jacket"], ["ram", "ram animal"], ["raspberry"], ["razorblade"], ["reamer", "reamer juicer", "juicer", "juice reamer"], ["rearview mirror"], ["receipt"], ["recliner", "reclining chair", "lounger", "lounger chair"], ["record player", "phonograph", "phonograph record player", "turntable"], ["reflector"], ["remote control"], ["rhinoceros"], ["rifle"], ["ring"], ["robe"], ["rocking chair"], ["rolling pin"], ["router", "router computer equipment"], ["rubber band", "elastic band"], ["runner", "runner carpet"], ["plastic bag", "paper bag"], ["saddle", "saddle on an animal"], ["saddle blanket", "saddlecloth", "horse blanket"], ["saddlebag"], ["sail"], ["salad"], ["salami"], ["salmon", "salmon fish"], ["salsa"], ["saltshaker"], ["sandal", "sandal type of shoe"], ["sandwich"], ["saucer"], ["sausage"], ["scale", "scale measuring instrument"], ["scarf"], ["school bus"], ["scissors"], ["scoreboard"], ["screwdriver"], ["scrubbing brush"], ["sculpture"], ["seabird", "seafowl"], ["seahorse"], ["seashell"], ["sewing machine"], ["shaker"], ["shampoo"], ["shark"], ["shaving cream", "shaving soap"], ["sheep"], ["shield"], ["shirt"], ["shoe", "sneaker", "sneaker type of shoe", "tennis shoe"], ["shopping bag"], ["shopping cart"], ["short pants", "shorts", "shorts clothing", "trunks", "trunks clothing"], ["shoulder bag"], ["shovel"], ["shower head"], ["shower curtain"], ["signboard"], ["silo"], ["sink"], ["skateboard"], ["skewer"], ["ski"], ["ski boot"], ["ski parka", "ski jacket"], ["ski pole"], ["skirt"], ["sled", "sledge", "sleigh"], ["sleeping bag"], ["slipper", "slipper footwear", "carpet slipper", "carpet slipper footwear"], ["snowboard"], ["snowman"], ["snowmobile"], ["soap"], ["soccer ball"], ["sock"], ["sofa", "couch", "lounge"], ["solar array", "solar battery", "solar panel"], ["soup"], ["soupspoon"], ["sour cream", "soured cream"], ["spatula"], ["spectacles", "specs", "eyeglasses", "glasses"], ["spice rack"], ["spider"], ["sponge"], ["spoon"], ["sportswear", "athletic wear", "activewear"], ["spotlight"], ["squirrel"], ["stapler", "stapler stapling machine"], ["starfish", "sea star"], ["statue", "statue sculpture"], ["steak", "steak food"], ["steering wheel"], ["step stool"], ["stereo", "stereo sound system"], ["stirrup"], ["stool"], ["stop sign"], ["brake light"], ["stove", "kitchen stove", "range", "range kitchen appliance", "kitchen range", "cooking stove"], ["strainer"], ["strap"], ["straw", "straw for drinking", "drinking straw"], ["strawberry"], ["street sign"], ["streetlight", "street lamp"], ["suit", "suit clothing"], ["sunflower"], ["sunglasses"], ["sunhat"], ["surfboard"], ["sushi"], ["mop"], ["sweat pants"], ["sweatband"], ["sweater"], ["sweatshirt"], ["sweet potato"], ["swimsuit", "swimwear", "bathing suit", "swimming costume", "bathing costume", "swimming trunks", "bathing trunks"], ["sword"], ["table"], ["table lamp"], ["tablecloth"], ["tag"], ["taillight", "rear light"], ["tank", "tank storage vessel", "storage tank"], ["tank top", "tank top clothing"], ["tape", "tape sticky cloth or paper"], ["tape measure", "measuring tape"], ["tapestry"], ["tarp"], ["tartan", "plaid"], ["tassel"], ["tea bag"], ["teacup"], ["teakettle"], ["teapot"], ["teddy bear"], ["telephone", "phone", "telephone set"], ["telephone booth", "phone booth", "call box", "telephone box", "telephone kiosk"], ["telephone pole", "telegraph pole", "telegraph post"], ["television camera", "tv camera"], ["television set", "tv", "tv set"], ["tennis ball"], ["tennis racket"], ["thermometer"], ["thermos bottle"], ["thermostat"], ["thread", "yarn"], ["thumbtack", "drawing pin", "pushpin"], ["tiara"], ["tiger"], ["tights", "tights clothing", "leotards"], ["timer", "stopwatch"], ["tinfoil"], ["tinsel"], ["tissue paper"], ["toast", "toast food"], ["toaster"], ["toaster oven"], ["toilet"], ["toilet tissue", "toilet paper", "bathroom tissue"], ["tomato"], ["tongs"], ["toolbox"], ["toothbrush"], ["toothpaste"], ["toothpick"], ["cover"], ["tortilla"], ["tow truck"], ["towel"], ["towel rack", "towel rail", "towel bar"], ["toy"], ["tractor", "tractor farm equipment"], ["traffic light"], ["dirt bike"], ["trailer truck", "tractor trailer", "trucking rig", "articulated lorry", "semi truck"], ["train", "train railroad vehicle", "railroad train"], ["tray"], ["tricycle"], ["tripod"], ["trousers", "pants", "pants clothing"], ["truck"], ["trunk"], ["turban"], ["turkey", "turkey food"], ["turtle"], ["turtleneck", "turtleneck clothing", "polo-neck"], ["typewriter"], ["umbrella"], ["underwear", "underclothes", "underclothing", "underpants"], ["urinal"], ["urn"], ["vacuum cleaner"], ["vase"], ["vending machine"], ["vent", "blowhole", "air vent"], ["vest", "waistcoat"], ["videotape"], ["volleyball"], ["waffle"], ["wagon"], ["wagon wheel"], ["walking stick"], ["wall clock"], ["wall socket", "wall plug", "electric outlet", "electrical outlet", "outlet", "electric receptacle"], ["wallet", "billfold"], ["automatic washer", "washing machine"], ["watch", "wristwatch"], ["water bottle"], ["water cooler"], ["water faucet", "water tap", "tap", "tap water faucet"], ["water jug"], ["water scooter", "sea scooter", "jet ski"], ["water ski"], ["water tower"], ["watering can"], ["watermelon"], ["weathervane", "vane", "vane weathervane", "wind vane"], ["webcam"], ["wedding cake", "bridecake"], ["wedding ring", "wedding band"], ["wet suit"], ["wheel"], ["wheelchair"], ["whipped cream"], ["whistle"], ["wig"], ["wind chime"], ["windmill"], ["window box", "window box for plants"], ["windshield wiper", "windscreen wiper", "wiper", "wiper for windshield or screen"], ["windsock", "air sock", "air-sleeve", "wind sleeve", "wind cone"], ["wine bottle"], ["wine bucket", "wine cooler"], ["wineglass"], ["blinder", "blinder for horses"], ["wok"], ["wooden spoon"], ["wreath"], ["wrench", "spanner"], ["wristband"], ["wristlet", "wrist band"], ["yacht"], ["yogurt", "yoghurt", "yoghourt"], ["yoke", "yoke animal equipment"], ["zebra"], ["zucchini", "courgette"]]
\ No newline at end of file
diff --git a/mmdetection_practice/data/texts/lvis_v1_class_texts.json b/mmdetection_practice/data/texts/lvis_v1_class_texts.json
new file mode 100644
index 0000000..367aaf5
--- /dev/null
+++ b/mmdetection_practice/data/texts/lvis_v1_class_texts.json
@@ -0,0 +1 @@
+[["aerosol can", "spray can"], ["air conditioner"], ["airplane", "aeroplane"], ["alarm clock"], ["alcohol", "alcoholic beverage"], ["alligator", "gator"], ["almond"], ["ambulance"], ["amplifier"], ["anklet", "ankle bracelet"], ["antenna", "aerial", "transmitting aerial"], ["apple"], ["applesauce"], ["apricot"], ["apron"], ["aquarium", "fish tank"], ["arctic", "arctic type of shoe", "galosh", "golosh", "rubber", "rubber type of shoe", "gumshoe"], ["armband"], ["armchair"], ["armoire"], ["armor", "armour"], ["artichoke"], ["trash can", "garbage can", "wastebin", "dustbin", "trash barrel", "trash bin"], ["ashtray"], ["asparagus"], ["atomizer", "atomiser", "spray", "sprayer", "nebulizer", "nebuliser"], ["avocado"], ["award", "accolade"], ["awning"], ["ax", "axe"], ["baboon"], ["baby buggy", "baby carriage", "perambulator", "pram", "stroller"], ["basketball backboard"], ["backpack", "knapsack", "packsack", "rucksack", "haversack"], ["handbag", "purse", "pocketbook"], ["suitcase", "baggage", "luggage"], ["bagel", "beigel"], ["bagpipe"], ["baguet", "baguette"], ["bait", "lure"], ["ball"], ["ballet skirt", "tutu"], ["balloon"], ["bamboo"], ["banana"], ["Band Aid"], ["bandage"], ["bandanna", "bandana"], ["banjo"], ["banner", "streamer"], ["barbell"], ["barge"], ["barrel", "cask"], ["barrette"], ["barrow", "garden cart", "lawn cart", "wheelbarrow"], ["baseball base"], ["baseball"], ["baseball bat"], ["baseball cap", "jockey cap", "golf cap"], ["baseball glove", "baseball mitt"], ["basket", "handbasket"], ["basketball"], ["bass horn", "sousaphone", "tuba"], ["bat", "bat animal"], ["bath mat"], ["bath towel"], ["bathrobe"], ["bathtub", "bathing tub"], ["batter", "batter food"], ["battery"], ["beachball"], ["bead"], ["bean curd", "tofu"], ["beanbag"], ["beanie", "beany"], ["bear"], ["bed"], ["bedpan"], ["bedspread", "bedcover", "bed covering", "counterpane", "spread"], ["cow"], ["beef", "beef food", "boeuf", "boeuf food"], ["beeper", "pager"], ["beer bottle"], ["beer can"], ["beetle"], ["bell"], ["bell pepper", "capsicum"], ["belt"], ["belt buckle"], ["bench"], ["beret"], ["bib"], ["Bible"], ["bicycle", "bike", "bike bicycle"], ["visor", "vizor"], ["billboard"], ["binder", "ring-binder"], ["binoculars", "field glasses", "opera glasses"], ["bird"], ["birdfeeder"], ["birdbath"], ["birdcage"], ["birdhouse"], ["birthday cake"], ["birthday card"], ["pirate flag"], ["black sheep"], ["blackberry"], ["blackboard", "chalkboard"], ["blanket"], ["blazer", "sport jacket", "sport coat", "sports jacket", "sports coat"], ["blender", "liquidizer", "liquidiser"], ["blimp"], ["blinker", "flasher"], ["blouse"], ["blueberry"], ["gameboard"], ["boat", "ship", "ship boat"], ["bob", "bobber", "bobfloat"], ["bobbin", "spool", "reel"], ["bobby pin", "hairgrip"], ["boiled egg", "coddled egg"], ["bolo tie", "bolo", "bola tie", "bola"], ["deadbolt"], ["bolt"], ["bonnet"], ["book"], ["bookcase"], ["booklet", "brochure", "leaflet", "pamphlet"], ["bookmark", "bookmarker"], ["boom microphone", "microphone boom"], ["boot"], ["bottle"], ["bottle opener"], ["bouquet"], ["bow", "bow weapon"], ["bow", "bow decorative ribbons"], ["bow-tie", "bowtie"], ["bowl"], ["pipe bowl"], ["bowler hat", "bowler", "derby hat", "derby", "plug hat"], ["bowling ball"], ["box"], ["boxing glove"], ["suspenders"], ["bracelet", "bangle"], ["brass plaque"], ["brassiere", "bra", "bandeau"], ["bread-bin", "breadbox"], ["bread"], ["breechcloth", "breechclout", "loincloth"], ["bridal gown", "wedding gown", "wedding dress"], ["briefcase"], ["broccoli"], ["broach"], ["broom"], ["brownie"], ["brussels sprouts"], ["bubble gum"], ["bucket", "pail"], ["horse buggy"], ["horned cow"], ["bulldog"], ["bulldozer", "dozer"], ["bullet train"], ["bulletin board", "notice board"], ["bulletproof vest"], ["bullhorn", "megaphone"], ["bun", "roll"], ["bunk bed"], ["buoy"], ["burrito"], ["bus", "bus vehicle", "autobus", "charabanc", "double-decker", "motorbus", "motorcoach"], ["business card"], ["butter"], ["butterfly"], ["button"], ["cab", "cab taxi", "taxi", "taxicab"], ["cabana"], ["cabin car", "caboose"], ["cabinet"], ["locker", "storage locker"], ["cake"], ["calculator"], ["calendar"], ["calf"], ["camcorder"], ["camel"], ["camera"], ["camera lens"], ["camper", "camper vehicle", "camping bus", "motor home"], ["can", "tin can"], ["can opener", "tin opener"], ["candle", "candlestick"], ["candle holder"], ["candy bar"], ["candy cane"], ["walking cane"], ["canister", "cannister"], ["canoe"], ["cantaloup", "cantaloupe"], ["canteen"], ["cap", "cap headwear"], ["bottle cap", "cap", "cap container lid"], ["cape"], ["cappuccino", "coffee cappuccino"], ["car", "car automobile", "auto", "auto automobile", "automobile"], ["railcar", "railcar part of a train", "railway car", "railway car part of a train", "railroad car", "railroad car part of a train"], ["elevator car"], ["car battery", "automobile battery"], ["identity card"], ["card"], ["cardigan"], ["cargo ship", "cargo vessel"], ["carnation"], ["horse carriage"], ["carrot"], ["tote bag"], ["cart"], ["carton"], ["cash register", "register", "register for cash transactions"], ["casserole"], ["cassette"], ["cast", "plaster cast", "plaster bandage"], ["cat"], ["cauliflower"], ["cayenne", "cayenne spice", "cayenne pepper", "cayenne pepper spice", "red pepper", "red pepper spice"], ["CD player"], ["celery"], ["cellular telephone", "cellular phone", "cellphone", "mobile phone", "smart phone"], ["chain mail", "ring mail", "chain armor", "chain armour", "ring armor", "ring armour"], ["chair"], ["chaise longue", "chaise", "daybed"], ["chalice"], ["chandelier"], ["chap"], ["checkbook", "chequebook"], ["checkerboard"], ["cherry"], ["chessboard"], ["chicken", "chicken animal"], ["chickpea", "garbanzo"], ["chili", "chili vegetable", "chili pepper", "chili pepper vegetable", "chilli", "chilli vegetable", "chilly", "chilly vegetable", "chile", "chile vegetable"], ["chime", "gong"], ["chinaware"], ["crisp", "crisp potato chip", "potato chip"], ["poker chip"], ["chocolate bar"], ["chocolate cake"], ["chocolate milk"], ["chocolate mousse"], ["choker", "collar", "neckband"], ["chopping board", "cutting board", "chopping block"], ["chopstick"], ["Christmas tree"], ["slide"], ["cider", "cyder"], ["cigar box"], ["cigarette"], ["cigarette case", "cigarette pack"], ["cistern", "water tank"], ["clarinet"], ["clasp"], ["cleansing agent", "cleanser", "cleaner"], ["cleat", "cleat for securing rope"], ["clementine"], ["clip"], ["clipboard"], ["clippers", "clippers for plants"], ["cloak"], ["clock", "timepiece", "timekeeper"], ["clock tower"], ["clothes hamper", "laundry basket", "clothes basket"], ["clothespin", "clothes peg"], ["clutch bag"], ["coaster"], ["coat"], ["coat hanger", "clothes hanger", "dress hanger"], ["coatrack", "hatrack"], ["cock", "rooster"], ["cockroach"], ["cocoa", "cocoa beverage", "hot chocolate", "hot chocolate beverage", "drinking chocolate"], ["coconut", "cocoanut"], ["coffee maker", "coffee machine"], ["coffee table", "cocktail table"], ["coffeepot"], ["coil"], ["coin"], ["colander", "cullender"], ["coleslaw", "slaw"], ["coloring material", "colouring material"], ["combination lock"], ["pacifier", "teething ring"], ["comic book"], ["compass"], ["computer keyboard", "keyboard", "keyboard computer"], ["condiment"], ["cone", "traffic cone"], ["control", "controller"], ["convertible", "convertible automobile"], ["sofa bed"], ["cooker"], ["cookie", "cooky", "biscuit", "biscuit cookie"], ["cooking utensil"], ["cooler", "cooler for food", "ice chest"], ["cork", "cork bottle plug", "bottle cork"], ["corkboard"], ["corkscrew", "bottle screw"], ["edible corn", "corn", "maize"], ["cornbread"], ["cornet", "horn", "trumpet"], ["cornice", "valance", "valance board", "pelmet"], ["cornmeal"], ["corset", "girdle"], ["costume"], ["cougar", "puma", "catamount", "mountain lion", "panther"], ["coverall"], ["cowbell"], ["cowboy hat", "ten-gallon hat"], ["crab", "crab animal"], ["crabmeat"], ["cracker"], ["crape", "crepe", "French pancake"], ["crate"], ["crayon", "wax crayon"], ["cream pitcher"], ["crescent roll", "croissant"], ["crib", "cot"], ["crock pot", "earthenware jar"], ["crossbar"], ["crouton"], ["crow"], ["crowbar", "wrecking bar", "pry bar"], ["crown"], ["crucifix"], ["cruise ship", "cruise liner"], ["police cruiser", "patrol car", "police car", "squad car"], ["crumb"], ["crutch"], ["cub", "cub animal"], ["cube", "square block"], ["cucumber", "cuke"], ["cufflink"], ["cup"], ["trophy cup"], ["cupboard", "closet"], ["cupcake"], ["hair curler", "hair roller", "hair crimper"], ["curling iron"], ["curtain", "drapery"], ["cushion"], ["cylinder"], ["cymbal"], ["dagger"], ["dalmatian"], ["dartboard"], ["date", "date fruit"], ["deck chair", "beach chair"], ["deer", "cervid"], ["dental floss", "floss"], ["desk"], ["detergent"], ["diaper"], ["diary", "journal"], ["die", "dice"], ["dinghy", "dory", "rowboat"], ["dining table"], ["tux", "tuxedo"], ["dish"], ["dish antenna"], ["dishrag", "dishcloth"], ["dishtowel", "tea towel"], ["dishwasher", "dishwashing machine"], ["dishwasher detergent", "dishwashing detergent", "dishwashing liquid", "dishsoap"], ["dispenser"], ["diving board"], ["Dixie cup", "paper cup"], ["dog"], ["dog collar"], ["doll"], ["dollar", "dollar bill", "one dollar bill"], ["dollhouse", "doll's house"], ["dolphin"], ["domestic ass", "donkey"], ["doorknob", "doorhandle"], ["doormat", "welcome mat"], ["doughnut", "donut"], ["dove"], ["dragonfly"], ["drawer"], ["underdrawers", "boxers", "boxershorts"], ["dress", "frock"], ["dress hat", "high hat", "opera hat", "silk hat", "top hat"], ["dress suit"], ["dresser"], ["drill"], ["drone"], ["dropper", "eye dropper"], ["drum", "drum musical instrument"], ["drumstick"], ["duck"], ["duckling"], ["duct tape"], ["duffel bag", "duffle bag", "duffel", "duffle"], ["dumbbell"], ["dumpster"], ["dustpan"], ["eagle"], ["earphone", "earpiece", "headphone"], ["earplug"], ["earring"], ["easel"], ["eclair"], ["eel"], ["egg", "eggs"], ["egg roll", "spring roll"], ["egg yolk", "yolk", "yolk egg"], ["eggbeater", "eggwhisk"], ["eggplant", "aubergine"], ["electric chair"], ["refrigerator"], ["elephant"], ["elk", "moose"], ["envelope"], ["eraser"], ["escargot"], ["eyepatch"], ["falcon"], ["fan"], ["faucet", "spigot", "tap"], ["fedora"], ["ferret"], ["Ferris wheel"], ["ferry", "ferryboat"], ["fig", "fig fruit"], ["fighter jet", "fighter aircraft", "attack aircraft"], ["figurine"], ["file cabinet", "filing cabinet"], ["file", "file tool"], ["fire alarm", "smoke alarm"], ["fire engine", "fire truck"], ["fire extinguisher", "extinguisher"], ["fire hose"], ["fireplace"], ["fireplug", "fire hydrant", "hydrant"], ["first-aid kit"], ["fish"], ["fish", "fish food"], ["fishbowl", "goldfish bowl"], ["fishing rod", "fishing pole"], ["flag"], ["flagpole", "flagstaff"], ["flamingo"], ["flannel"], ["flap"], ["flash", "flashbulb"], ["flashlight", "torch"], ["fleece"], ["flip-flop", "flip-flop sandal"], ["flipper", "flipper footwear", "fin", "fin footwear"], ["flower arrangement", "floral arrangement"], ["flute glass", "champagne flute"], ["foal"], ["folding chair"], ["food processor"], ["football", "football American"], ["football helmet"], ["footstool", "footrest"], ["fork"], ["forklift"], ["freight car"], ["French toast"], ["freshener", "air freshener"], ["frisbee"], ["frog", "toad", "toad frog"], ["fruit juice"], ["frying pan", "frypan", "skillet"], ["fudge"], ["funnel"], ["futon"], ["gag", "muzzle"], ["garbage"], ["garbage truck"], ["garden hose"], ["gargle", "mouthwash"], ["gargoyle"], ["garlic", "ail"], ["gasmask", "respirator", "gas helmet"], ["gazelle"], ["gelatin", "jelly"], ["gemstone"], ["generator"], ["giant panda", "panda", "panda bear"], ["gift wrap"], ["ginger", "gingerroot"], ["giraffe"], ["cincture", "sash", "waistband", "waistcloth"], ["glass", "glass drink container", "drinking glass"], ["globe"], ["glove"], ["goat"], ["goggles"], ["goldfish"], ["golf club", "golf-club"], ["golfcart"], ["gondola", "gondola boat"], ["goose"], ["gorilla"], ["gourd"], ["grape"], ["grater"], ["gravestone", "headstone", "tombstone"], ["gravy boat", "gravy holder"], ["green bean"], ["green onion", "spring onion", "scallion"], ["griddle"], ["grill", "grille", "grillwork", "radiator grille"], ["grits", "hominy grits"], ["grizzly", "grizzly bear"], ["grocery bag"], ["guitar"], ["gull", "seagull"], ["gun"], ["hairbrush"], ["hairnet"], ["hairpin"], ["halter top"], ["ham", "jambon", "gammon"], ["hamburger", "beefburger", "burger"], ["hammer"], ["hammock"], ["hamper"], ["hamster"], ["hair dryer"], ["hand glass", "hand mirror"], ["hand towel", "face towel"], ["handcart", "pushcart", "hand truck"], ["handcuff"], ["handkerchief"], ["handle", "grip", "handgrip"], ["handsaw", "carpenter's saw"], ["hardback book", "hardcover book"], ["harmonium", "organ", "organ musical instrument", "reed organ", "reed organ musical instrument"], ["hat"], ["hatbox"], ["veil"], ["headband"], ["headboard"], ["headlight", "headlamp"], ["headscarf"], ["headset"], ["headstall", "headstall for horses", "headpiece", "headpiece for horses"], ["heart"], ["heater", "warmer"], ["helicopter"], ["helmet"], ["heron"], ["highchair", "feeding chair"], ["hinge"], ["hippopotamus"], ["hockey stick"], ["hog", "pig"], ["home plate", "home plate baseball", "home base", "home base baseball"], ["honey"], ["fume hood", "exhaust hood"], ["hook"], ["hookah", "narghile", "nargileh", "sheesha", "shisha", "water pipe"], ["hornet"], ["horse"], ["hose", "hosepipe"], ["hot-air balloon"], ["hotplate"], ["hot sauce"], ["hourglass"], ["houseboat"], ["hummingbird"], ["hummus", "humus", "hommos", "hoummos", "humous"], ["polar bear"], ["icecream"], ["popsicle"], ["ice maker"], ["ice pack", "ice bag"], ["ice skate"], ["igniter", "ignitor", "lighter"], ["inhaler", "inhalator"], ["iPod"], ["iron", "iron for clothing", "smoothing iron", "smoothing iron for clothing"], ["ironing board"], ["jacket"], ["jam"], ["jar"], ["jean", "blue jean", "denim"], ["jeep", "landrover"], ["jelly bean", "jelly egg"], ["jersey", "T-shirt", "tee shirt"], ["jet plane", "jet-propelled plane"], ["jewel", "gem", "precious stone"], ["jewelry", "jewellery"], ["joystick"], ["jumpsuit"], ["kayak"], ["keg"], ["kennel", "doghouse"], ["kettle", "boiler"], ["key"], ["keycard"], ["kilt"], ["kimono"], ["kitchen sink"], ["kitchen table"], ["kite"], ["kitten", "kitty"], ["kiwi fruit"], ["knee pad"], ["knife"], ["knitting needle"], ["knob"], ["knocker", "knocker on a door", "doorknocker"], ["koala", "koala bear"], ["lab coat", "laboratory coat"], ["ladder"], ["ladle"], ["ladybug", "ladybeetle", "ladybird beetle"], ["lamb", "lamb animal"], ["lamb-chop", "lambchop"], ["lamp"], ["lamppost"], ["lampshade"], ["lantern"], ["lanyard", "laniard"], ["laptop computer", "notebook computer"], ["lasagna", "lasagne"], ["latch"], ["lawn mower"], ["leather"], ["legging", "legging clothing", "leging", "leging clothing", "leg covering"], ["Lego", "Lego set"], ["legume"], ["lemon"], ["lemonade"], ["lettuce"], ["license plate", "numberplate"], ["life buoy", "lifesaver", "life belt", "life ring"], ["life jacket", "life vest"], ["lightbulb"], ["lightning rod", "lightning conductor"], ["lime"], ["limousine"], ["lion"], ["lip balm"], ["liquor", "spirits", "hard liquor", "liqueur", "cordial"], ["lizard"], ["log"], ["lollipop"], ["speaker", "speaker stereo equipment"], ["loveseat"], ["machine gun"], ["magazine"], ["magnet"], ["mail slot"], ["mailbox", "mailbox at home", "letter box", "letter box at home"], ["mallard"], ["mallet"], ["mammoth"], ["manatee"], ["mandarin orange"], ["manger", "trough"], ["manhole"], ["map"], ["marker"], ["martini"], ["mascot"], ["mashed potato"], ["masher"], ["mask", "facemask"], ["mast"], ["mat", "mat gym equipment", "gym mat"], ["matchbox"], ["mattress"], ["measuring cup"], ["measuring stick", "ruler", "ruler measuring stick", "measuring rod"], ["meatball"], ["medicine"], ["melon"], ["microphone"], ["microscope"], ["microwave oven"], ["milestone", "milepost"], ["milk"], ["milk can"], ["milkshake"], ["minivan"], ["mint candy"], ["mirror"], ["mitten"], ["mixer", "mixer kitchen tool", "stand mixer"], ["money"], ["monitor", "monitor computer equipment"], ["monkey"], ["motor"], ["motor scooter", "scooter"], ["motor vehicle", "automotive vehicle"], ["motorcycle"], ["mound", "mound baseball", "pitcher's mound"], ["mouse", "mouse computer equipment", "computer mouse"], ["mousepad"], ["muffin"], ["mug"], ["mushroom"], ["music stool", "piano stool"], ["musical instrument", "instrument", "instrument musical"], ["nailfile"], ["napkin", "table napkin", "serviette"], ["neckerchief"], ["necklace"], ["necktie", "tie", "tie necktie"], ["needle"], ["nest"], ["newspaper", "paper", "paper newspaper"], ["newsstand"], ["nightshirt", "nightwear", "sleepwear", "nightclothes"], ["nosebag", "nosebag for animals", "feedbag"], ["noseband", "noseband for animals", "nosepiece", "nosepiece for animals"], ["notebook"], ["notepad"], ["nut"], ["nutcracker"], ["oar"], ["octopus", "octopus food"], ["octopus", "octopus animal"], ["oil lamp", "kerosene lamp", "kerosine lamp"], ["olive oil"], ["omelet", "omelette"], ["onion"], ["orange", "orange fruit"], ["orange juice"], ["ostrich"], ["ottoman", "pouf", "pouffe", "hassock"], ["oven"], ["overalls", "overalls clothing"], ["owl"], ["packet"], ["inkpad", "inking pad", "stamp pad"], ["pad"], ["paddle", "boat paddle"], ["padlock"], ["paintbrush"], ["painting"], ["pajamas", "pyjamas"], ["palette", "pallet"], ["pan", "pan for cooking", "cooking pan"], ["pan", "pan metal container"], ["pancake"], ["pantyhose"], ["papaya"], ["paper plate"], ["paper towel"], ["paperback book", "paper-back book", "softback book", "soft-cover book"], ["paperweight"], ["parachute"], ["parakeet", "parrakeet", "parroket", "paraquet", "paroquet", "parroquet"], ["parasail", "parasail sports"], ["parasol", "sunshade"], ["parchment"], ["parka", "anorak"], ["parking meter"], ["parrot"], ["passenger car", "passenger car part of a train", "coach", "coach part of a train"], ["passenger ship"], ["passport"], ["pastry"], ["patty", "patty food"], ["pea", "pea food"], ["peach"], ["peanut butter"], ["pear"], ["peeler", "peeler tool for fruit and vegetables"], ["wooden leg", "pegleg"], ["pegboard"], ["pelican"], ["pen"], ["pencil"], ["pencil box", "pencil case"], ["pencil sharpener"], ["pendulum"], ["penguin"], ["pennant"], ["penny", "penny coin"], ["pepper", "peppercorn"], ["pepper mill", "pepper grinder"], ["perfume"], ["persimmon"], ["person", "baby", "child", "boy", "girl", "man", "woman", "human"], ["pet"], ["pew", "pew church bench", "church bench"], ["phonebook", "telephone book", "telephone directory"], ["phonograph record", "phonograph recording", "record", "record phonograph recording"], ["piano"], ["pickle"], ["pickup truck"], ["pie"], ["pigeon"], ["piggy bank", "penny bank"], ["pillow"], ["pin", "pin non jewelry"], ["pineapple"], ["pinecone"], ["ping-pong ball"], ["pinwheel"], ["tobacco pipe"], ["pipe", "piping"], ["pistol", "handgun"], ["pita", "pita bread", "pocket bread"], ["pitcher", "pitcher vessel for liquid", "ewer"], ["pitchfork"], ["pizza"], ["place mat"], ["plate"], ["platter"], ["playpen"], ["pliers", "plyers"], ["plow", "plow farm equipment", "plough", "plough farm equipment"], ["plume"], ["pocket watch"], ["pocketknife"], ["poker", "poker fire stirring tool", "stove poker", "fire hook"], ["pole", "post"], ["polo shirt", "sport shirt"], ["poncho"], ["pony"], ["pool table", "billiard table", "snooker table"], ["pop", "pop soda", "soda", "soda pop", "tonic", "soft drink"], ["postbox", "postbox public", "mailbox", "mailbox public"], ["postcard", "postal card", "mailing-card"], ["poster", "placard"], ["pot"], ["flowerpot"], ["potato"], ["potholder"], ["pottery", "clayware"], ["pouch"], ["power shovel", "excavator", "digger"], ["prawn", "shrimp"], ["pretzel"], ["printer", "printing machine"], ["projectile", "projectile weapon", "missile"], ["projector"], ["propeller", "propellor"], ["prune"], ["pudding"], ["puffer", "puffer fish", "pufferfish", "blowfish", "globefish"], ["puffin"], ["pug-dog"], ["pumpkin"], ["puncher"], ["puppet", "marionette"], ["puppy"], ["quesadilla"], ["quiche"], ["quilt", "comforter"], ["rabbit"], ["race car", "racing car"], ["racket", "racquet"], ["radar"], ["radiator"], ["radio receiver", "radio set", "radio", "tuner", "tuner radio"], ["radish", "daikon"], ["raft"], ["rag doll"], ["raincoat", "waterproof jacket"], ["ram", "ram animal"], ["raspberry"], ["rat"], ["razorblade"], ["reamer", "reamer juicer", "juicer", "juice reamer"], ["rearview mirror"], ["receipt"], ["recliner", "reclining chair", "lounger", "lounger chair"], ["record player", "phonograph", "phonograph record player", "turntable"], ["reflector"], ["remote control"], ["rhinoceros"], ["rib", "rib food"], ["rifle"], ["ring"], ["river boat"], ["road map"], ["robe"], ["rocking chair"], ["rodent"], ["roller skate"], ["Rollerblade"], ["rolling pin"], ["root beer"], ["router", "router computer equipment"], ["rubber band", "elastic band"], ["runner", "runner carpet"], ["plastic bag", "paper bag"], ["saddle", "saddle on an animal"], ["saddle blanket", "saddlecloth", "horse blanket"], ["saddlebag"], ["safety pin"], ["sail"], ["salad"], ["salad plate", "salad bowl"], ["salami"], ["salmon", "salmon fish"], ["salmon", "salmon food"], ["salsa"], ["saltshaker"], ["sandal", "sandal type of shoe"], ["sandwich"], ["satchel"], ["saucepan"], ["saucer"], ["sausage"], ["sawhorse", "sawbuck"], ["saxophone"], ["scale", "scale measuring instrument"], ["scarecrow", "strawman"], ["scarf"], ["school bus"], ["scissors"], ["scoreboard"], ["scraper"], ["screwdriver"], ["scrubbing brush"], ["sculpture"], ["seabird", "seafowl"], ["seahorse"], ["seaplane", "hydroplane"], ["seashell"], ["sewing machine"], ["shaker"], ["shampoo"], ["shark"], ["sharpener"], ["Sharpie"], ["shaver", "shaver electric", "electric shaver", "electric razor"], ["shaving cream", "shaving soap"], ["shawl"], ["shears"], ["sheep"], ["shepherd dog", "sheepdog"], ["sherbert", "sherbet"], ["shield"], ["shirt"], ["shoe", "sneaker", "sneaker type of shoe", "tennis shoe"], ["shopping bag"], ["shopping cart"], ["short pants", "shorts", "shorts clothing", "trunks", "trunks clothing"], ["shot glass"], ["shoulder bag"], ["shovel"], ["shower head"], ["shower cap"], ["shower curtain"], ["shredder", "shredder for paper"], ["signboard"], ["silo"], ["sink"], ["skateboard"], ["skewer"], ["ski"], ["ski boot"], ["ski parka", "ski jacket"], ["ski pole"], ["skirt"], ["skullcap"], ["sled", "sledge", "sleigh"], ["sleeping bag"], ["sling", "sling bandage", "triangular bandage"], ["slipper", "slipper footwear", "carpet slipper", "carpet slipper footwear"], ["smoothie"], ["snake", "serpent"], ["snowboard"], ["snowman"], ["snowmobile"], ["soap"], ["soccer ball"], ["sock"], ["sofa", "couch", "lounge"], ["softball"], ["solar array", "solar battery", "solar panel"], ["sombrero"], ["soup"], ["soup bowl"], ["soupspoon"], ["sour cream", "soured cream"], ["soya milk", "soybean milk", "soymilk"], ["space shuttle"], ["sparkler", "sparkler fireworks"], ["spatula"], ["spear", "lance"], ["spectacles", "specs", "eyeglasses", "glasses"], ["spice rack"], ["spider"], ["crawfish", "crayfish"], ["sponge"], ["spoon"], ["sportswear", "athletic wear", "activewear"], ["spotlight"], ["squid", "squid food", "calamari", "calamary"], ["squirrel"], ["stagecoach"], ["stapler", "stapler stapling machine"], ["starfish", "sea star"], ["statue", "statue sculpture"], ["steak", "steak food"], ["steak knife"], ["steering wheel"], ["stepladder"], ["step stool"], ["stereo", "stereo sound system"], ["stew"], ["stirrer"], ["stirrup"], ["stool"], ["stop sign"], ["brake light"], ["stove", "kitchen stove", "range", "range kitchen appliance", "kitchen range", "cooking stove"], ["strainer"], ["strap"], ["straw", "straw for drinking", "drinking straw"], ["strawberry"], ["street sign"], ["streetlight", "street lamp"], ["string cheese"], ["stylus"], ["subwoofer"], ["sugar bowl"], ["sugarcane", "sugarcane plant"], ["suit", "suit clothing"], ["sunflower"], ["sunglasses"], ["sunhat"], ["surfboard"], ["sushi"], ["mop"], ["sweat pants"], ["sweatband"], ["sweater"], ["sweatshirt"], ["sweet potato"], ["swimsuit", "swimwear", "bathing suit", "swimming costume", "bathing costume", "swimming trunks", "bathing trunks"], ["sword"], ["syringe"], ["Tabasco sauce"], ["table-tennis table", "ping-pong table"], ["table"], ["table lamp"], ["tablecloth"], ["tachometer"], ["taco"], ["tag"], ["taillight", "rear light"], ["tambourine"], ["army tank", "armored combat vehicle", "armoured combat vehicle"], ["tank", "tank storage vessel", "storage tank"], ["tank top", "tank top clothing"], ["tape", "tape sticky cloth or paper"], ["tape measure", "measuring tape"], ["tapestry"], ["tarp"], ["tartan", "plaid"], ["tassel"], ["tea bag"], ["teacup"], ["teakettle"], ["teapot"], ["teddy bear"], ["telephone", "phone", "telephone set"], ["telephone booth", "phone booth", "call box", "telephone box", "telephone kiosk"], ["telephone pole", "telegraph pole", "telegraph post"], ["telephoto lens", "zoom lens"], ["television camera", "tv camera"], ["television set", "tv", "tv set"], ["tennis ball"], ["tennis racket"], ["tequila"], ["thermometer"], ["thermos bottle"], ["thermostat"], ["thimble"], ["thread", "yarn"], ["thumbtack", "drawing pin", "pushpin"], ["tiara"], ["tiger"], ["tights", "tights clothing", "leotards"], ["timer", "stopwatch"], ["tinfoil"], ["tinsel"], ["tissue paper"], ["toast", "toast food"], ["toaster"], ["toaster oven"], ["toilet"], ["toilet tissue", "toilet paper", "bathroom tissue"], ["tomato"], ["tongs"], ["toolbox"], ["toothbrush"], ["toothpaste"], ["toothpick"], ["cover"], ["tortilla"], ["tow truck"], ["towel"], ["towel rack", "towel rail", "towel bar"], ["toy"], ["tractor", "tractor farm equipment"], ["traffic light"], ["dirt bike"], ["trailer truck", "tractor trailer", "trucking rig", "articulated lorry", "semi truck"], ["train", "train railroad vehicle", "railroad train"], ["trampoline"], ["tray"], ["trench coat"], ["triangle", "triangle musical instrument"], ["tricycle"], ["tripod"], ["trousers", "pants", "pants clothing"], ["truck"], ["truffle", "truffle chocolate", "chocolate truffle"], ["trunk"], ["vat"], ["turban"], ["turkey", "turkey food"], ["turnip"], ["turtle"], ["turtleneck", "turtleneck clothing", "polo-neck"], ["typewriter"], ["umbrella"], ["underwear", "underclothes", "underclothing", "underpants"], ["unicycle"], ["urinal"], ["urn"], ["vacuum cleaner"], ["vase"], ["vending machine"], ["vent", "blowhole", "air vent"], ["vest", "waistcoat"], ["videotape"], ["vinegar"], ["violin", "fiddle"], ["vodka"], ["volleyball"], ["vulture"], ["waffle"], ["waffle iron"], ["wagon"], ["wagon wheel"], ["walking stick"], ["wall clock"], ["wall socket", "wall plug", "electric outlet", "electrical outlet", "outlet", "electric receptacle"], ["wallet", "billfold"], ["walrus"], ["wardrobe"], ["washbasin", "basin", "basin for washing", "washbowl", "washstand", "handbasin"], ["automatic washer", "washing machine"], ["watch", "wristwatch"], ["water bottle"], ["water cooler"], ["water faucet", "water tap", "tap", "tap water faucet"], ["water heater", "hot-water heater"], ["water jug"], ["water gun", "squirt gun"], ["water scooter", "sea scooter", "jet ski"], ["water ski"], ["water tower"], ["watering can"], ["watermelon"], ["weathervane", "vane", "vane weathervane", "wind vane"], ["webcam"], ["wedding cake", "bridecake"], ["wedding ring", "wedding band"], ["wet suit"], ["wheel"], ["wheelchair"], ["whipped cream"], ["whistle"], ["wig"], ["wind chime"], ["windmill"], ["window box", "window box for plants"], ["windshield wiper", "windscreen wiper", "wiper", "wiper for windshield or screen"], ["windsock", "air sock", "air-sleeve", "wind sleeve", "wind cone"], ["wine bottle"], ["wine bucket", "wine cooler"], ["wineglass"], ["blinder", "blinder for horses"], ["wok"], ["wolf"], ["wooden spoon"], ["wreath"], ["wrench", "spanner"], ["wristband"], ["wristlet", "wrist band"], ["yacht"], ["yogurt", "yoghurt", "yoghourt"], ["yoke", "yoke animal equipment"], ["zebra"], ["zucchini", "courgette"]]
\ No newline at end of file
diff --git a/mmdetection_practice/data/texts/obj365v1_class_texts.json b/mmdetection_practice/data/texts/obj365v1_class_texts.json
new file mode 100644
index 0000000..bddc11c
--- /dev/null
+++ b/mmdetection_practice/data/texts/obj365v1_class_texts.json
@@ -0,0 +1 @@
+[["person"], ["sneakers"], ["chair"], ["hat"], ["lamp"], ["bottle"], ["cabinet", "shelf"], ["cup"], ["car"], ["glasses"], ["picture", "frame"], ["desk"], ["handbag"], ["street lights"], ["book"], ["plate"], ["helmet"], ["leather shoes"], ["pillow"], ["glove"], ["potted plant"], ["bracelet"], ["flower"], ["tv"], ["storage box"], ["vase"], ["bench"], ["wine glass"], ["boots"], ["bowl"], ["dining table"], ["umbrella"], ["boat"], ["flag"], ["speaker"], ["trash bin", "can"], ["stool"], ["backpack"], ["couch"], ["belt"], ["carpet"], ["basket"], ["towel", "napkin"], ["slippers"], ["barrel", "bucket"], ["coffee table"], ["suv"], ["toy"], ["tie"], ["bed"], ["traffic light"], ["pen", "pencil"], ["microphone"], ["sandals"], ["canned"], ["necklace"], ["mirror"], ["faucet"], ["bicycle"], ["bread"], ["high heels"], ["ring"], ["van"], ["watch"], ["sink"], ["horse"], ["fish"], ["apple"], ["camera"], ["candle"], ["teddy bear"], ["cake"], ["motorcycle"], ["wild bird"], ["laptop"], ["knife"], ["traffic sign"], ["cell phone"], ["paddle"], ["truck"], ["cow"], ["power outlet"], ["clock"], ["drum"], ["fork"], ["bus"], ["hanger"], ["nightstand"], ["pot", "pan"], ["sheep"], ["guitar"], ["traffic cone"], ["tea pot"], ["keyboard"], ["tripod"], ["hockey"], ["fan"], ["dog"], ["spoon"], ["blackboard", "whiteboard"], ["balloon"], ["air conditioner"], ["cymbal"], ["mouse"], ["telephone"], ["pickup truck"], ["orange"], ["banana"], ["airplane"], ["luggage"], ["skis"], ["soccer"], ["trolley"], ["oven"], ["remote"], ["baseball glove"], ["paper towel"], ["refrigerator"], ["train"], ["tomato"], ["machinery vehicle"], ["tent"], ["shampoo", "shower gel"], ["head phone"], ["lantern"], ["donut"], ["cleaning products"], ["sailboat"], ["tangerine"], ["pizza"], ["kite"], ["computer box"], ["elephant"], ["toiletries"], ["gas stove"], ["broccoli"], ["toilet"], ["stroller"], ["shovel"], ["baseball bat"], ["microwave"], ["skateboard"], ["surfboard"], ["surveillance camera"], ["gun"], ["life saver"], ["cat"], ["lemon"], ["liquid soap"], ["zebra"], ["duck"], ["sports car"], ["giraffe"], ["pumpkin"], ["piano"], ["stop sign"], ["radiator"], ["converter"], ["tissue"], ["carrot"], ["washing machine"], ["vent"], ["cookies"], ["cutting", "chopping board"], ["tennis racket"], ["candy"], ["skating and skiing shoes"], ["scissors"], ["folder"], ["baseball"], ["strawberry"], ["bow tie"], ["pigeon"], ["pepper"], ["coffee machine"], ["bathtub"], ["snowboard"], ["suitcase"], ["grapes"], ["ladder"], ["pear"], ["american football"], ["basketball"], ["potato"], ["paint brush"], ["printer"], ["billiards"], ["fire hydrant"], ["goose"], ["projector"], ["sausage"], ["fire extinguisher"], ["extension cord"], ["facial mask"], ["tennis ball"], ["chopsticks"], ["electronic stove and gas stove"], ["pie"], ["frisbee"], ["kettle"], ["hamburger"], ["golf club"], ["cucumber"], ["clutch"], ["blender"], ["tong"], ["slide"], ["hot dog"], ["toothbrush"], ["facial cleanser"], ["mango"], ["deer"], ["egg"], ["violin"], ["marker"], ["ship"], ["chicken"], ["onion"], ["ice cream"], ["tape"], ["wheelchair"], ["plum"], ["bar soap"], ["scale"], ["watermelon"], ["cabbage"], ["router", "modem"], ["golf ball"], ["pine apple"], ["crane"], ["fire truck"], ["peach"], ["cello"], ["notepaper"], ["tricycle"], ["toaster"], ["helicopter"], ["green beans"], ["brush"], ["carriage"], ["cigar"], ["earphone"], ["penguin"], ["hurdle"], ["swing"], ["radio"], ["cd"], ["parking meter"], ["swan"], ["garlic"], ["french fries"], ["horn"], ["avocado"], ["saxophone"], ["trumpet"], ["sandwich"], ["cue"], ["kiwi fruit"], ["bear"], ["fishing rod"], ["cherry"], ["tablet"], ["green vegetables"], ["nuts"], ["corn"], ["key"], ["screwdriver"], ["globe"], ["broom"], ["pliers"], ["volleyball"], ["hammer"], ["eggplant"], ["trophy"], ["dates"], ["board eraser"], ["rice"], ["tape measure", "ruler"], ["dumbbell"], ["hamimelon"], ["stapler"], ["camel"], ["lettuce"], ["goldfish"], ["meat balls"], ["medal"], ["toothpaste"], ["antelope"], ["shrimp"], ["rickshaw"], ["trombone"], ["pomegranate"], ["coconut"], ["jellyfish"], ["mushroom"], ["calculator"], ["treadmill"], ["butterfly"], ["egg tart"], ["cheese"], ["pig"], ["pomelo"], ["race car"], ["rice cooker"], ["tuba"], ["crosswalk sign"], ["papaya"], ["hair drier"], ["green onion"], ["chips"], ["dolphin"], ["sushi"], ["urinal"], ["donkey"], ["electric drill"], ["spring rolls"], ["tortoise", "turtle"], ["parrot"], ["flute"], ["measuring cup"], ["shark"], ["steak"], ["poker card"], ["binoculars"], ["llama"], ["radish"], ["noodles"], ["yak"], ["mop"], ["crab"], ["microscope"], ["barbell"], ["bread", "bun"], ["baozi"], ["lion"], ["red cabbage"], ["polar bear"], ["lighter"], ["seal"], ["mangosteen"], ["comb"], ["eraser"], ["pitaya"], ["scallop"], ["pencil case"], ["saw"], ["table tennis paddle"], ["okra"], ["starfish"], ["eagle"], ["monkey"], ["durian"], ["game board"], ["rabbit"], ["french horn"], ["ambulance"], ["asparagus"], ["hoverboard"], ["pasta"], ["target"], ["hotair balloon"], ["chainsaw"], ["lobster"], ["iron"], ["flashlight"]]
\ No newline at end of file
diff --git a/mmdetection_practice/demo/README.md b/mmdetection_practice/demo/README.md
new file mode 100644
index 0000000..c6f607c
--- /dev/null
+++ b/mmdetection_practice/demo/README.md
@@ -0,0 +1,65 @@
+## YOLO-World Demo
+
+### Getting Started
+
+Setting `PYTHONPATH` as the path to `YOLO-World` and run:
+
+```bash
+PYTHONPATH=/xxxx/YOLO-World python demo/yyyy_demo.py
+# or directly
+PYTHONPATH=./ python demo/yyyy_demo.py
+```
+
+#### Gradio Demo
+
+We provide the [Gradio](https://www.gradio.app/) demo for local devices:
+
+```bash
+pip install gradio==4.16.0
+python demo/demo.py path/to/config path/to/weights
+```
+
+Additionaly, you can use a Dockerfile to build an image with gradio. As a prerequisite, make sure you have respective drivers installed alongside [nvidia-container-runtime](https://stackoverflow.com/questions/59691207/docker-build-with-nvidia-runtime). Replace MODEL_NAME and WEIGHT_NAME with the respective values or ommit this and use default values from the [Dockerfile](Dockerfile#3)
+
+```bash
+docker build --build-arg="MODEL=MODEL_NAME" --build-arg="WEIGHT=WEIGHT_NAME" -t yolo_demo .
+docker run --runtime nvidia -p 8080:8080
+```
+
+#### Image Demo
+
+We provide a simple image demo for inference on images with visualization outputs.
+
+```bash
+python demo/image_demo.py path/to/config path/to/weights image/path/directory 'person,dog,cat' --topk 100 --threshold 0.005 --output-dir demo_outputs
+```
+
+**Notes:**
+* The `image` can be a directory or a single image.
+* The `texts` can be a string of categories (noun phrases) which is separated by a comma. We also support `txt` file in which each line contains a category ( noun phrases).
+* The `topk` and `threshold` control the number of predictions and the confidence threshold.
+
+
+#### Video Demo
+
+The `video_demo` has similar hyper-parameters with `image_demo`.
+
+```bash
+python demo/video_demo.py path/to/config path/to/weights video_path 'person,dog' --out out_video_path
+```
+
+### FAQ
+
+> 1. `Failed to custom import!`
+```bash
+  File "simple_demo.py", line 37, in <module>
+    cfg = Config.fromfile(config_file)
+  File "/data/miniconda3/envs/det/lib/python3.8/site-packages/mmengine/config/config.py", line 183, in fromfile
+    raise ImportError('Failed to custom import!') from e
+ImportError: Failed to custom import!
+```
+**Solution:**
+
+```bash
+PYTHONPATH=/xxxx/YOLO-World python demo/simple_demo.py
+```
\ No newline at end of file
diff --git a/mmdetection_practice/demo/gradio_demo.py b/mmdetection_practice/demo/gradio_demo.py
new file mode 100644
index 0000000..739e97b
--- /dev/null
+++ b/mmdetection_practice/demo/gradio_demo.py
@@ -0,0 +1,253 @@
+# Copyright (c) Tencent Inc. All rights reserved.
+import os
+import sys
+import argparse
+import os.path as osp
+from io import BytesIO
+from functools import partial
+
+import cv2
+import onnx
+import torch
+import onnxsim
+import numpy as np
+import gradio as gr
+from PIL import Image
+import supervision as sv
+from torchvision.ops import nms
+from mmengine.runner import Runner
+from mmengine.dataset import Compose
+from mmengine.runner.amp import autocast
+from mmengine.config import Config, DictAction, ConfigDict
+from mmdet.datasets import CocoDataset
+from mmyolo.registry import RUNNERS
+
+sys.path.append('./deploy')
+from easydeploy import model as EM
+
+BOUNDING_BOX_ANNOTATOR = sv.BoundingBoxAnnotator(thickness=1)
+MASK_ANNOTATOR = sv.MaskAnnotator()
+
+
+class LabelAnnotator(sv.LabelAnnotator):
+
+    @staticmethod
+    def resolve_text_background_xyxy(
+        center_coordinates,
+        text_wh,
+        position,
+    ):
+        center_x, center_y = center_coordinates
+        text_w, text_h = text_wh
+        return center_x, center_y, center_x + text_w, center_y + text_h
+
+
+LABEL_ANNOTATOR = LabelAnnotator(text_padding=4,
+                                 text_scale=0.5,
+                                 text_thickness=1)
+
+
+def parse_args():
+    parser = argparse.ArgumentParser(description='YOLO-World Demo')
+    parser.add_argument('config', help='test config file path')
+    parser.add_argument('checkpoint', help='checkpoint file')
+    parser.add_argument(
+        '--work-dir',
+        help='the directory to save the file containing evaluation metrics',
+        default='output')
+    parser.add_argument(
+        '--cfg-options',
+        nargs='+',
+        action=DictAction,
+        help='override some settings in the used config, the key-value pair '
+        'in xxx=yyy format will be merged into config file. If the value to '
+        'be overwritten is a list, it should be like key="[a,b]" or key=a,b '
+        'It also allows nested list/tuple values, e.g. key="[(a,b),(c,d)]" '
+        'Note that the quotation marks are necessary and that no white space '
+        'is allowed.')
+    args = parser.parse_args()
+    return args
+
+
+def run_image(runner,
+              image,
+              text,
+              max_num_boxes,
+              score_thr,
+              nms_thr,
+              image_path='./work_dirs/demo.png'):
+    # image.save(image_path)
+    texts = [[t.strip()] for t in text.split(',')] + [[' ']]
+    data_info = dict(img_id=0, img=np.array(image), texts=texts)
+    data_info = runner.pipeline(data_info)
+    data_batch = dict(inputs=data_info['inputs'].unsqueeze(0),
+                      data_samples=[data_info['data_samples']])
+
+    with autocast(enabled=False), torch.no_grad():
+        output = runner.model.test_step(data_batch)[0]
+        pred_instances = output.pred_instances
+
+    keep = nms(pred_instances.bboxes,
+               pred_instances.scores,
+               iou_threshold=nms_thr)
+    pred_instances = pred_instances[keep]
+    pred_instances = pred_instances[pred_instances.scores.float() > score_thr]
+
+    if len(pred_instances.scores) > max_num_boxes:
+        indices = pred_instances.scores.float().topk(max_num_boxes)[1]
+        pred_instances = pred_instances[indices]
+
+    pred_instances = pred_instances.cpu().numpy()
+    if 'masks' in pred_instances:
+        masks = pred_instances['masks']
+    else:
+        masks = None
+    detections = sv.Detections(xyxy=pred_instances['bboxes'],
+                               class_id=pred_instances['labels'],
+                               confidence=pred_instances['scores'],
+                               mask=masks)
+    labels = [
+        f"{texts[class_id][0]} {confidence:0.2f}" for class_id, confidence in
+        zip(detections.class_id, detections.confidence)
+    ]
+
+    image = np.array(image)
+    image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)  # Convert RGB to BGR
+    image = BOUNDING_BOX_ANNOTATOR.annotate(image, detections)
+    image = LABEL_ANNOTATOR.annotate(image, detections, labels=labels)
+    if masks is not None:
+        image = MASK_ANNOTATOR.annotate(image, detections)
+    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)  # Convert BGR to RGB
+    image = Image.fromarray(image)
+    return image
+
+
+def export_model(runner, text, max_num_boxes, score_thr, nms_thr):
+
+    backend = EM.MMYOLOBackend.ONNXRUNTIME
+    postprocess_cfg = ConfigDict(pre_top_k=10 * max_num_boxes,
+                                 keep_top_k=max_num_boxes,
+                                 iou_threshold=nms_thr,
+                                 score_threshold=score_thr)
+
+    base_model = runner.model
+
+    texts = [[t.strip() for t in text.split(',')] + [' ']]
+    base_model.reparameterize(texts)
+    deploy_model = EM.DeployModel(baseModel=base_model,
+                                  backend=backend,
+                                  postprocess_cfg=postprocess_cfg)
+    deploy_model.eval()
+
+    device = (next(iter(base_model.parameters()))).device
+    fake_input = torch.ones([1, 3, 640, 640], device=device)
+    deploy_model(fake_input)
+
+    save_onnx_path = os.path.join(
+        args.work_dir,
+        os.path.basename(args.checkpoint).replace('pth', 'onnx'))
+    # export onnx
+    with BytesIO() as f:
+        output_names = ['num_dets', 'boxes', 'scores', 'labels']
+        torch.onnx.export(deploy_model,
+                          fake_input,
+                          f,
+                          input_names=['images'],
+                          output_names=output_names,
+                          opset_version=12)
+        f.seek(0)
+        onnx_model = onnx.load(f)
+        onnx.checker.check_model(onnx_model)
+    onnx_model, check = onnxsim.simplify(onnx_model)
+    onnx.save(onnx_model, save_onnx_path)
+    return gr.update(visible=True), save_onnx_path
+
+
+def demo(runner, args):
+    with gr.Blocks(title="YOLO-World") as demo:
+        with gr.Row():
+            gr.Markdown('<h1><center>YOLO-World: Real-Time Open-Vocabulary '
+                        'Object Detector</center></h1>')
+        with gr.Row():
+            with gr.Column(scale=0.3):
+                with gr.Row():
+                    image = gr.Image(type='pil', label='input image')
+                input_text = gr.Textbox(
+                    lines=7,
+                    label='Enter the classes to be detected, '
+                    'separated by comma',
+                    value=', '.join(CocoDataset.METAINFO['classes']),
+                    elem_id='textbox')
+                with gr.Row():
+                    submit = gr.Button('Submit')
+                    clear = gr.Button('Clear')
+                with gr.Row():
+                    export = gr.Button('Deploy and Export ONNX Model')
+                with gr.Row():
+                    gr.Markdown(
+                        "It takes a few seconds to generate the ONNX file! YOLO-World-Seg (segmentation) is not supported now"
+                    )
+                out_download = gr.File(visible=False)
+                max_num_boxes = gr.Slider(minimum=1,
+                                          maximum=300,
+                                          value=100,
+                                          step=1,
+                                          interactive=True,
+                                          label='Maximum Number Boxes')
+                score_thr = gr.Slider(minimum=0,
+                                      maximum=1,
+                                      value=0.05,
+                                      step=0.001,
+                                      interactive=True,
+                                      label='Score Threshold')
+                nms_thr = gr.Slider(minimum=0,
+                                    maximum=1,
+                                    value=0.7,
+                                    step=0.001,
+                                    interactive=True,
+                                    label='NMS Threshold')
+            with gr.Column(scale=0.7):
+                output_image = gr.Image(type='pil', label='output image')
+
+        submit.click(partial(run_image, runner),
+                     [image, input_text, max_num_boxes, score_thr, nms_thr],
+                     [output_image])
+        clear.click(lambda: [None, '', None], None,
+                    [image, input_text, output_image])
+
+        export.click(partial(export_model, runner),
+                     [input_text, max_num_boxes, score_thr, nms_thr],
+                     [out_download, out_download])
+
+        demo.launch(server_name='0.0.0.0',
+                    server_port=8080)  # port 80 does not work for me
+
+
+if __name__ == '__main__':
+    args = parse_args()
+
+    # load config
+    cfg = Config.fromfile(args.config)
+    if args.cfg_options is not None:
+        cfg.merge_from_dict(args.cfg_options)
+
+    if args.work_dir is not None:
+        cfg.work_dir = args.work_dir
+    elif cfg.get('work_dir', None) is None:
+        cfg.work_dir = osp.join('./work_dirs',
+                                osp.splitext(osp.basename(args.config))[0])
+
+    cfg.load_from = args.checkpoint
+
+    if 'runner_type' not in cfg:
+        runner = Runner.from_cfg(cfg)
+    else:
+        runner = RUNNERS.build(cfg)
+
+    runner.call_hook('before_run')
+    runner.load_or_resume()
+    pipeline = cfg.test_dataloader.dataset.pipeline
+    pipeline[0].type = 'mmdet.LoadImageFromNDArray'
+    runner.pipeline = Compose(pipeline)
+    runner.model.eval()
+    demo(runner, args)
diff --git a/mmdetection_practice/demo/image_demo.py b/mmdetection_practice/demo/image_demo.py
new file mode 100644
index 0000000..20d225b
--- /dev/null
+++ b/mmdetection_practice/demo/image_demo.py
@@ -0,0 +1,220 @@
+# Copyright (c) Tencent Inc. All rights reserved.
+import os
+import cv2
+import argparse
+import os.path as osp
+
+import torch
+from mmengine.config import Config, DictAction
+from mmengine.runner.amp import autocast
+from mmengine.dataset import Compose
+from mmengine.utils import ProgressBar
+from mmdet.apis import init_detector
+from mmdet.utils import get_test_pipeline_cfg
+
+import supervision as sv
+
+BOUNDING_BOX_ANNOTATOR = sv.BoundingBoxAnnotator(thickness=1)
+MASK_ANNOTATOR = sv.MaskAnnotator()
+
+
+class LabelAnnotator(sv.LabelAnnotator):
+
+    @staticmethod
+    def resolve_text_background_xyxy(
+        center_coordinates,
+        text_wh,
+        position,
+    ):
+        center_x, center_y = center_coordinates
+        text_w, text_h = text_wh
+        return center_x, center_y, center_x + text_w, center_y + text_h
+
+
+LABEL_ANNOTATOR = LabelAnnotator(text_padding=4,
+                                 text_scale=0.5,
+                                 text_thickness=1)
+
+
+def parse_args():
+    parser = argparse.ArgumentParser(description='YOLO-World Demo')
+    parser.add_argument('config', help='test config file path')
+    parser.add_argument('checkpoint', help='checkpoint file')
+    parser.add_argument('image', help='image path, include image file or dir.')
+    parser.add_argument(
+        'text',
+        help=
+        'text prompts, including categories separated by a comma or a txt file with each line as a prompt.'
+    )
+    parser.add_argument('--topk',
+                        default=100,
+                        type=int,
+                        help='keep topk predictions.')
+    parser.add_argument('--threshold',
+                        default=0.1,
+                        type=float,
+                        help='confidence score threshold for predictions.')
+    parser.add_argument('--device',
+                        default='cuda:0',
+                        help='device used for inference.')
+    parser.add_argument('--show',
+                        action='store_true',
+                        help='show the detection results.')
+    parser.add_argument(
+        '--annotation',
+        action='store_true',
+        help='save the annotated detection results as yolo text format.')
+    parser.add_argument('--amp',
+                        action='store_true',
+                        help='use mixed precision for inference.')
+    parser.add_argument('--output-dir',
+                        default='demo_outputs',
+                        help='the directory to save outputs')
+    parser.add_argument(
+        '--cfg-options',
+        nargs='+',
+        action=DictAction,
+        help='override some settings in the used config, the key-value pair '
+        'in xxx=yyy format will be merged into config file. If the value to '
+        'be overwritten is a list, it should be like key="[a,b]" or key=a,b '
+        'It also allows nested list/tuple values, e.g. key="[(a,b),(c,d)]" '
+        'Note that the quotation marks are necessary and that no white space '
+        'is allowed.')
+    args = parser.parse_args()
+    return args
+
+
+def inference_detector(model,
+                       image,
+                       texts,
+                       test_pipeline,
+                       max_dets=100,
+                       score_thr=0.3,
+                       output_dir='./work_dir',
+                       use_amp=False,
+                       show=False,
+                       annotation=False):
+    data_info = dict(img_id=0, img_path=image, texts=texts)
+    data_info = test_pipeline(data_info)
+    data_batch = dict(inputs=data_info['inputs'].unsqueeze(0),
+                      data_samples=[data_info['data_samples']])
+
+    with autocast(enabled=use_amp), torch.no_grad():
+        output = model.test_step(data_batch)[0]
+        pred_instances = output.pred_instances
+        pred_instances = pred_instances[pred_instances.scores.float() >
+                                        score_thr]
+
+    if len(pred_instances.scores) > max_dets:
+        indices = pred_instances.scores.float().topk(max_dets)[1]
+        pred_instances = pred_instances[indices]
+
+    pred_instances = pred_instances.cpu().numpy()
+
+    if 'masks' in pred_instances:
+        masks = pred_instances['masks']
+    else:
+        masks = None
+
+    detections = sv.Detections(xyxy=pred_instances['bboxes'],
+                               class_id=pred_instances['labels'],
+                               confidence=pred_instances['scores'],
+                               mask=masks)
+
+    labels = [
+        f"{texts[class_id][0]} {confidence:0.2f}" for class_id, confidence in
+        zip(detections.class_id, detections.confidence)
+    ]
+
+    # label images
+    image = cv2.imread(image_path)
+    anno_image = image.copy()
+    image = BOUNDING_BOX_ANNOTATOR.annotate(image, detections)
+    image = LABEL_ANNOTATOR.annotate(image, detections, labels=labels)
+    if masks is not None:
+        image = MASK_ANNOTATOR.annotate(image, detections)
+    cv2.imwrite(osp.join(output_dir, osp.basename(image_path)), image)
+
+    if annotation:
+        images_dict = {}
+        annotations_dict = {}
+
+        images_dict[osp.basename(image_path)] = anno_image
+        annotations_dict[osp.basename(image_path)] = detections
+
+        ANNOTATIONS_DIRECTORY = os.makedirs(r"./annotations", exist_ok=True)
+
+        MIN_IMAGE_AREA_PERCENTAGE = 0.002
+        MAX_IMAGE_AREA_PERCENTAGE = 0.80
+        APPROXIMATION_PERCENTAGE = 0.75
+
+        sv.DetectionDataset(
+            classes=texts, images=images_dict,
+            annotations=annotations_dict).as_yolo(
+                annotations_directory_path=ANNOTATIONS_DIRECTORY,
+                min_image_area_percentage=MIN_IMAGE_AREA_PERCENTAGE,
+                max_image_area_percentage=MAX_IMAGE_AREA_PERCENTAGE,
+                approximation_percentage=APPROXIMATION_PERCENTAGE)
+
+    if show:
+        cv2.imshow('Image', image)  # Provide window name
+        k = cv2.waitKey(0)
+        if k == 27:
+            # wait for ESC key to exit
+            cv2.destroyAllWindows()
+
+
+if __name__ == '__main__':
+    args = parse_args()
+
+    # load config
+    cfg = Config.fromfile(args.config)
+    if args.cfg_options is not None:
+        cfg.merge_from_dict(args.cfg_options)
+
+    cfg.work_dir = osp.join('./work_dirs',
+                            osp.splitext(osp.basename(args.config))[0])
+    # init model
+    cfg.load_from = args.checkpoint
+    model = init_detector(cfg, checkpoint=args.checkpoint, device=args.device)
+
+    # init test pipeline
+    test_pipeline_cfg = get_test_pipeline_cfg(cfg=cfg)
+    # test_pipeline[0].type = 'mmdet.LoadImageFromNDArray'
+    test_pipeline = Compose(test_pipeline_cfg)
+
+    if args.text.endswith('.txt'):
+        with open(args.text) as f:
+            lines = f.readlines()
+        texts = [[t.rstrip('\r\n')] for t in lines] + [[' ']]
+    else:
+        texts = [[t.strip()] for t in args.text.split(',')] + [[' ']]
+
+    output_dir = args.output_dir
+    if not osp.exists(output_dir):
+        os.mkdir(output_dir)
+
+    # load images
+    if not osp.isfile(args.image):
+        images = [
+            osp.join(args.image, img) for img in os.listdir(args.image)
+            if img.endswith('.png') or img.endswith('.jpg')
+        ]
+    else:
+        images = [args.image]
+
+    # reparameterize texts
+    model.reparameterize(texts)
+    progress_bar = ProgressBar(len(images))
+    for image_path in images:
+        inference_detector(model,
+                           image_path,
+                           texts,
+                           test_pipeline,
+                           args.topk,
+                           args.threshold,
+                           output_dir=output_dir,
+                           use_amp=args.amp,
+                           show=args.show,
+                           annotation=args.annotation)
+        progress_bar.update()
diff --git a/mmdetection_practice/demo/inference.ipynb b/mmdetection_practice/demo/inference.ipynb
new file mode 100644
index 0000000..dff1854
--- /dev/null
+++ b/mmdetection_practice/demo/inference.ipynb
@@ -0,0 +1,2836 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "PorcLK9OylD6"
+   },
+   "source": [
+    " ![yolo_logo.png](data:image/png;base64,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)\n",
+    "\n",
+    "\n",
+    " This YOLO-World notebook is a Inferencing notebook presenting Real-Time Open-Vocabulary Object Detection.\n",
+    "\n",
+    "We hope that the resources in this notebook will help you for inferencing."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "zw1OxP87zjCM"
+   },
+   "source": [
+    "## Setup\n",
+    "\n",
+    "Clone GitHub [repository](https://github.com/AILab-CVC/YOLO-World) and install dependencies"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "colab": {
+     "base_uri": "https://localhost:8080/"
+    },
+    "id": "rlsGVhscqjY0",
+    "outputId": "382bd549-11ee-4e1b-ec00-5e1401911bf4"
+   },
+   "outputs": [],
+   "source": [
+    "!git clone --recursive https://github.com/AILab-CVC/YOLO-World\n",
+    "%cd YOLO-World/"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "colab": {
+     "base_uri": "https://localhost:8080/"
+    },
+    "id": "uE1GmCSAJHXC",
+    "outputId": "43654a80-834a-4d34-caa6-00ae9a030f2e"
+   },
+   "outputs": [],
+   "source": [
+    "import os\n",
+    "# Install certain version of requests, tqdm, rich for openxlab (fix for yolo_world)\n",
+    "# Install mmcv before avoding compiling of mmcv and shortining waiting time installs \"whl\" file\n",
+    "# Downgrade pytorch version for fast installing mmcv (your on prem should finish faster with latest pytorch)\n",
+    "\n",
+    "\n",
+    "if 'COLAB_GPU' in os.environ:\n",
+    "  !pip install torch==2.1.2 torchvision==0.16.2 torchaudio==2.1.2 --index-url https://download.pytorch.org/whl/cu121 -q\n",
+    "  !pip install requests==2.28.2 tqdm==4.65.0 rich==13.4.2 -q\n",
+    "  %pip install -U openmim -q\n",
+    "  !mim install \"mmengine>=0.7.0\" -q\n",
+    "  !mim install \"mmcv\" -q\n",
+    "else:\n",
+    "  !pip install torch wheel requests==2.28.2 tqdm==4.65.0 rich==13.4.2 -q\n",
+    "\n",
+    "!pip install -e . -vv -q"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {
+    "id": "v_Pgd1urgbj8"
+   },
+   "outputs": [],
+   "source": [
+    "if 'COLAB_GPU' in os.environ:\n",
+    "    # Restart colab session (required for yolo_world to work in google colab)\n",
+    "    quit()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "ZWq1gYXD2c4n"
+   },
+   "source": [
+    "## Pretrained Models\n",
+    "\n",
+    "Download Pretrained weights from Huggingface and set configuration"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "colab": {
+     "base_uri": "https://localhost:8080/"
+    },
+    "id": "LGuy6naerg4e",
+    "outputId": "c57e8147-c06c-4782-f5bf-6aa3e8ddeb58"
+   },
+   "outputs": [],
+   "source": [
+    "import os\n",
+    "\n",
+    "%cd YOLO-World/\n",
+    "if not os.path.exists(\"pretrained_weights\"):\n",
+    "    os.makedirs(\"pretrained_weights\")\n",
+    "\n",
+    "# Download pretrained weights of YOLO-Worldv2-L\tO365+GoldG img_size=1280 model\n",
+    "!wget -P pretrained_weights/ https://huggingface.co/wondervictor/YOLO-World/resolve/main/yolo_world_v2_l_obj365v1_goldg_pretrain_1280ft-9babe3f6.pth\n",
+    "!wget https://media.roboflow.com/notebooks/examples/dog.jpeg"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "YECjGYE7-Ojg"
+   },
+   "source": [
+    "## Loading model configurations"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "colab": {
+     "base_uri": "https://localhost:8080/",
+     "height": 1000,
+     "referenced_widgets": [
+      "0bc8d02b9b0941f8b38f822b8552e54c",
+      "c5081cf89abc4514b81b0a705850b26f",
+      "93a7172913a84728a2919fe8796567c0",
+      "c50ae95e956d456395d05f12367ff8e3",
+      "c80456ab37c844b1beb074e74b17d8fb",
+      "4e47a4bc196e44dba1d7ce4faa5b74af",
+      "d0bad9ce27a742a49667d1cd58eea350",
+      "32f222c92f844a8ea780960c0e25a64c",
+      "06c1c81b5e8544d8aaca394f2e13539e",
+      "81df29145f4449339e75f78919147899",
+      "614d44b9730b4fe9a01305ac6c822388",
+      "1745520fa3834cbf900b1646fec5d6aa",
+      "768b536c12f84b1cb24d38675573baa2",
+      "569e8aabbcd74e4f9288bdebeb91400b",
+      "ad5431bc98784ee7adcf489989aba432",
+      "8614da2bade94ade978fe71994c777fa",
+      "6113de583b7a4a22bbbbfcf9a0ae6ea7",
+      "164ffff1e1944183b01d8cf76541556a",
+      "cd8f2fffa9a845cfbc2ce664647acda5",
+      "32b452668efa4b61acacd04d289edde0",
+      "e46b4e1e95da4d6f924a851265403480",
+      "ee06192a75fc403ba6d945da2efe4317",
+      "828a59ea87f34d4f8be9fa6fb63fe991",
+      "0becbcf3af914252b73937ffd789c533",
+      "8dc08812835f40e9a85c73ea57710029",
+      "bd6743fab19a4056a741fb923f1d66c6",
+      "cfc1570a53d4467397583e5614f35515",
+      "52d5fe0cd2514f87917ab8bcf923becf",
+      "0cee1b12a94c4fdaa97d7b0e57a9d8f6",
+      "ef7a3e2a70624fdfa2d590635e962ffd",
+      "794250f1a0b44831864f487cfe4be7b3",
+      "4b48981f033a4e0b89b3dc1cd088599e",
+      "46da2b5501cf471a99f354f17e85fc1d",
+      "084791b432c64ea383eeb10dd912d27f",
+      "c7e34cc6b3b54c36933cf4b21f32b469",
+      "961b3186964b4aa694ed50e601ca6ea6",
+      "9c7aebef36c94f659420f35c6951ac14",
+      "0381e7fdec3642d7af08a11841aaaba4",
+      "b69eb52454c64fb4bac7c9f008241d24",
+      "5dfaba276a3c480d837a75767300e96f",
+      "309c33ce179144ac9b23d6396f2fdcd6",
+      "dc6812fd13504f6bae35d81aaf2593fa",
+      "f7463653c82e41b087e794191e70c43e",
+      "7c53e4cff8344da8858060970b931a80",
+      "07cb92c22899453291baccd1f9b11a49",
+      "cbc909708fca4191a80767479a9c9c55",
+      "152972aaf5c7433da0a7ce4889694cf4",
+      "b769fadb878c43beaec040a779ba9067",
+      "483f26b6d2e54bb581e8a6392b8e1b39",
+      "b2dd4e48fb974451979e37fb99bbdf5b",
+      "53a11753fc664f12942c0a5a8f62e695",
+      "e908586e492443c6a28ed16750df6748",
+      "013ebfb59e88443d978bb2a4f3a68f96",
+      "265d430fcc604c6984d70b7e63f11e37",
+      "f55df7a2f0474b5ab6d0a23bcedf8cc2",
+      "8a23897839594ba4827c5a34463dbb35",
+      "ce8d0eadfac444a6b88e0ba16ab6f3f9",
+      "2d181d3861c64d0c9d71331751de111e",
+      "fd9cc05ff50e4463b004cacd050b59c3",
+      "dedf6f98735643d5bb53ff2e874137c7",
+      "5dbdd01ad0bd4939937fa32eb32182a1",
+      "fd7d351c2a5943cd9934b36be67481ca",
+      "f9ecf05660fa4512b4ff4cbb9d30f3e1",
+      "898c2d408c0a4b34851f7fbf537f45b1",
+      "d5797b57dcf04274a5f7077d104a62b6",
+      "ec8e16b5e78d4c55b100090ee7e23ddc",
+      "14b64b065ef740cbbff5587f062b04a3",
+      "5ede178010f54c259c9802698a599664",
+      "225ca87fffb54bfa9514513ace1fdbf1",
+      "cd906068e1cb46e4b5b62fc6267e8e6d",
+      "0aafe16d6e6d4561932cba3bed69f562",
+      "a81ab5c22fdc4ea99ebe396d3b43c552",
+      "8841ee0d44fe4073b3dc5237c8045185",
+      "d839228be8b84096a587489217630b7f",
+      "b76961c341d64959ae6ed7ad40f6abab",
+      "df073637968a4ca499a861f74869d45d",
+      "2f5098940d27496983565ddb3ab158bd"
+     ]
+    },
+    "id": "tFQXnK-FsXlj",
+    "outputId": "6e6286aa-fbf8-44b1-94f6-2ccc661d040e"
+   },
+   "outputs": [],
+   "source": [
+    "import numpy as np\n",
+    "import torch\n",
+    "from mmengine.config import Config\n",
+    "from mmengine.dataset import Compose\n",
+    "from mmengine.runner import Runner\n",
+    "from mmengine.runner.amp import autocast\n",
+    "from mmyolo.registry import RUNNERS\n",
+    "from torchvision.ops import nms\n",
+    "\n",
+    "\n",
+    "if __name__ == \"__main__\":\n",
+    "    # load config\n",
+    "    cfg = Config.fromfile(\n",
+    "        \"configs/pretrain/yolo_world_v2_l_vlpan_bn_2e-3_100e_4x8gpus_obj365v1_goldg_train_1280ft_lvis_minival.py\"\n",
+    "    )\n",
+    "    cfg.work_dir = \".\"\n",
+    "    cfg.load_from = \"pretrained_weights/yolo_world_v2_l_obj365v1_goldg_pretrain_1280ft-9babe3f6.pth\"\n",
+    "    runner = Runner.from_cfg(cfg)\n",
+    "    runner.call_hook(\"before_run\")\n",
+    "    runner.load_or_resume()\n",
+    "    pipeline = cfg.test_dataloader.dataset.pipeline\n",
+    "    runner.pipeline = Compose(pipeline)\n",
+    "\n",
+    "    # run model evaluation\n",
+    "    runner.model.eval()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "id": "7syIir2qHoc9"
+   },
+   "outputs": [],
+   "source": [
+    "def colorstr(*input):\n",
+    "    \"\"\"\n",
+    "        Helper function for style logging\n",
+    "    \"\"\"\n",
+    "    *args, string = input if len(input) > 1 else (\"bold\", input[0])\n",
+    "    colors = {\"bold\": \"\\033[1m\"}\n",
+    "\n",
+    "    return \"\".join(colors[x] for x in args) + f\"{string}\""
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "NI1DSw4SCCUU"
+   },
+   "source": [
+    "# Run Image Inference"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 8,
+   "metadata": {
+    "id": "ozklQl6BnsLI"
+   },
+   "outputs": [],
+   "source": [
+    "import PIL.Image\n",
+    "import cv2\n",
+    "import supervision as sv\n",
+    "\n",
+    "bounding_box_annotator = sv.BoxAnnotator()\n",
+    "label_annotator = sv.LabelAnnotator(text_position=sv.Position.CENTER)\n",
+    "mask_annotator = sv.MaskAnnotator()\n",
+    "\n",
+    "class_names = (\"person, bicycle, car, motorcycle, airplane, bus, train, truck, boat, \"\n",
+    "               \"traffic light, fire hydrant, stop sign, parking meter, bench, bird, \"\n",
+    "               \"cat, dog, horse, sheep, cow, elephant, bear, zebra, giraffe, \"\n",
+    "               \"backpack, umbrella, handbag, tie, suitcase, frisbee, skis, snowboard, \"\n",
+    "               \"sports ball, kite, baseball bat, baseball glove, skateboard, \"\n",
+    "               \"surfboard, tennis racket, bottle, wine glass, cup, fork, knife, \"\n",
+    "               \"spoon, bowl, banana, apple, sandwich, orange, broccoli, carrot, \"\n",
+    "               \"hot dog, pizza, donut, cake, chair, couch, potted plant, bed, \"\n",
+    "               \"dining table, toilet, tv, laptop, mouse, remote, keyboard, \"\n",
+    "               \"cell phone, microwave, oven, toaster, sink, refrigerator, book, \"\n",
+    "               \"clock, vase, scissors, teddy bear, hair drier, toothbrush\")\n",
+    "\n",
+    "class_names2 = (\"dog, eye, tongue, ear, leash\")\n",
+    "\n",
+    "\n",
+    "def run_image(\n",
+    "        runner,\n",
+    "        input_image,\n",
+    "        max_num_boxes=100,\n",
+    "        score_thr=0.05,\n",
+    "        nms_thr=0.5,\n",
+    "        output_image=\"output.png\",\n",
+    "):\n",
+    "    output_image = \"runs/detect/\"+output_image\n",
+    "    texts = [[t.strip()] for t in class_names.split(\",\")] + [[\" \"]]\n",
+    "    data_info = runner.pipeline(dict(img_id=0, img_path=input_image,\n",
+    "                                     texts=texts))\n",
+    "\n",
+    "    data_batch = dict(\n",
+    "        inputs=data_info[\"inputs\"].unsqueeze(0),\n",
+    "        data_samples=[data_info[\"data_samples\"]],\n",
+    "    )\n",
+    "\n",
+    "    with autocast(enabled=False), torch.no_grad():\n",
+    "        output = runner.model.test_step(data_batch)[0]\n",
+    "        runner.model.class_names = texts\n",
+    "        pred_instances = output.pred_instances\n",
+    "\n",
+    "    # nms\n",
+    "    keep_idxs = nms(pred_instances.bboxes, pred_instances.scores, iou_threshold=nms_thr)\n",
+    "    pred_instances = pred_instances[keep_idxs]\n",
+    "    pred_instances = pred_instances[pred_instances.scores.float() > score_thr]\n",
+    "\n",
+    "    if len(pred_instances.scores) > max_num_boxes:\n",
+    "        indices = pred_instances.scores.float().topk(max_num_boxes)[1]\n",
+    "        pred_instances = pred_instances[indices]\n",
+    "    output.pred_instances = pred_instances\n",
+    "\n",
+    "    # predictions\n",
+    "    pred_instances = pred_instances.cpu().numpy()\n",
+    "\n",
+    "    if 'masks' in pred_instances:\n",
+    "        masks = pred_instances['masks']\n",
+    "    else:\n",
+    "        masks = None\n",
+    "        \n",
+    "    detections = sv.Detections(\n",
+    "        xyxy=pred_instances['bboxes'],\n",
+    "        class_id=pred_instances['labels'],\n",
+    "        confidence=pred_instances['scores']\n",
+    "    )\n",
+    "\n",
+    "    # label ids with confidence scores\n",
+    "    labels = [\n",
+    "        f\"{class_id} {confidence:0.2f}\"\n",
+    "        for class_id, confidence\n",
+    "        in zip(detections.class_id, detections.confidence)\n",
+    "    ]\n",
+    "\n",
+    "    # draw bounding box with label\n",
+    "    image = PIL.Image.open(input_image)\n",
+    "    svimage = np.array(image)\n",
+    "    svimage = bounding_box_annotator.annotate(svimage, detections)\n",
+    "    svimage = label_annotator.annotate(svimage, detections, labels)\n",
+    "    if masks is not None:\n",
+    "        svimage = mask_annotator.annotate(image, detections)\n",
+    "\n",
+    "    # save output image\n",
+    "    cv2.imwrite(output_image, svimage[:, :, ::-1])\n",
+    "    print(f\"Results saved to {colorstr('bold', output_image)}\")\n",
+    "\n",
+    "    return svimage[:, :, ::-1]\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 9,
+   "metadata": {
+    "colab": {
+     "base_uri": "https://localhost:8080/",
+     "height": 979
+    },
+    "id": "-BL_keU8moAM",
+    "outputId": "78fe2957-1980-49b7-a64d-6a5d9f62cacf"
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Results saved to \u001B[1mruns/detect/output.png\n"
+     ]
+    },
+    {
+     "data": {
+      "image/png": "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",
+      "text/plain": [
+       "<Figure size 1200x1200 with 1 Axes>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "img = run_image(runner,\"dog.jpeg\")\n",
+    "sv.plot_image(img)"
+   ]
+  }
+ ],
+ "metadata": {
+  "accelerator": "GPU",
+  "colab": {
+   "gpuType": "T4",
+   "provenance": []
+  },
+  "kernelspec": {
+   "display_name": "Python 3 (ipykernel)",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.10.14"
+  },
+  "widgets": {
+   "application/vnd.jupyter.widget-state+json": {
+    "013ebfb59e88443d978bb2a4f3a68f96": {
+     "model_module": "@jupyter-widgets/controls",
+     "model_module_version": "1.5.0",
+     "model_name": "ProgressStyleModel",
+     "state": {
+      "_model_module": "@jupyter-widgets/controls",
+      "_model_module_version": "1.5.0",
+      "_model_name": "ProgressStyleModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/base",
+      "_view_module_version": "1.2.0",
+      "_view_name": "StyleView",
+      "bar_color": null,
+      "description_width": ""
+     }
+    },
+    "0381e7fdec3642d7af08a11841aaaba4": {
+     "model_module": "@jupyter-widgets/base",
+     "model_module_version": "1.2.0",
+     "model_name": "LayoutModel",
+     "state": {
+      "_model_module": "@jupyter-widgets/base",
+      "_model_module_version": "1.2.0",
+      "_model_name": "LayoutModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/base",
+      "_view_module_version": "1.2.0",
+      "_view_name": "LayoutView",
+      "align_content": null,
+      "align_items": null,
+      "align_self": null,
+      "border": null,
+      "bottom": null,
+      "display": null,
+      "flex": null,
+      "flex_flow": null,
+      "grid_area": null,
+      "grid_auto_columns": null,
+      "grid_auto_flow": null,
+      "grid_auto_rows": null,
+      "grid_column": null,
+      "grid_gap": null,
+      "grid_row": null,
+      "grid_template_areas": null,
+      "grid_template_columns": null,
+      "grid_template_rows": null,
+      "height": null,
+      "justify_content": null,
+      "justify_items": null,
+      "left": null,
+      "margin": null,
+      "max_height": null,
+      "max_width": null,
+      "min_height": null,
+      "min_width": null,
+      "object_fit": null,
+      "object_position": null,
+      "order": null,
+      "overflow": null,
+      "overflow_x": null,
+      "overflow_y": null,
+      "padding": null,
+      "right": null,
+      "top": null,
+      "visibility": null,
+      "width": null
+     }
+    },
+    "06c1c81b5e8544d8aaca394f2e13539e": {
+     "model_module": "@jupyter-widgets/controls",
+     "model_module_version": "1.5.0",
+     "model_name": "ProgressStyleModel",
+     "state": {
+      "_model_module": "@jupyter-widgets/controls",
+      "_model_module_version": "1.5.0",
+      "_model_name": "ProgressStyleModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/base",
+      "_view_module_version": "1.2.0",
+      "_view_name": "StyleView",
+      "bar_color": null,
+      "description_width": ""
+     }
+    },
+    "07cb92c22899453291baccd1f9b11a49": {
+     "model_module": "@jupyter-widgets/controls",
+     "model_module_version": "1.5.0",
+     "model_name": "HBoxModel",
+     "state": {
+      "_dom_classes": [],
+      "_model_module": "@jupyter-widgets/controls",
+      "_model_module_version": "1.5.0",
+      "_model_name": "HBoxModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/controls",
+      "_view_module_version": "1.5.0",
+      "_view_name": "HBoxView",
+      "box_style": "",
+      "children": [
+       "IPY_MODEL_cbc909708fca4191a80767479a9c9c55",
+       "IPY_MODEL_152972aaf5c7433da0a7ce4889694cf4",
+       "IPY_MODEL_b769fadb878c43beaec040a779ba9067"
+      ],
+      "layout": "IPY_MODEL_483f26b6d2e54bb581e8a6392b8e1b39"
+     }
+    },
+    "084791b432c64ea383eeb10dd912d27f": {
+     "model_module": "@jupyter-widgets/controls",
+     "model_module_version": "1.5.0",
+     "model_name": "HBoxModel",
+     "state": {
+      "_dom_classes": [],
+      "_model_module": "@jupyter-widgets/controls",
+      "_model_module_version": "1.5.0",
+      "_model_name": "HBoxModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/controls",
+      "_view_module_version": "1.5.0",
+      "_view_name": "HBoxView",
+      "box_style": "",
+      "children": [
+       "IPY_MODEL_c7e34cc6b3b54c36933cf4b21f32b469",
+       "IPY_MODEL_961b3186964b4aa694ed50e601ca6ea6",
+       "IPY_MODEL_9c7aebef36c94f659420f35c6951ac14"
+      ],
+      "layout": "IPY_MODEL_0381e7fdec3642d7af08a11841aaaba4"
+     }
+    },
+    "0aafe16d6e6d4561932cba3bed69f562": {
+     "model_module": "@jupyter-widgets/base",
+     "model_module_version": "1.2.0",
+     "model_name": "LayoutModel",
+     "state": {
+      "_model_module": "@jupyter-widgets/base",
+      "_model_module_version": "1.2.0",
+      "_model_name": "LayoutModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/base",
+      "_view_module_version": "1.2.0",
+      "_view_name": "LayoutView",
+      "align_content": null,
+      "align_items": null,
+      "align_self": null,
+      "border": null,
+      "bottom": null,
+      "display": null,
+      "flex": null,
+      "flex_flow": null,
+      "grid_area": null,
+      "grid_auto_columns": null,
+      "grid_auto_flow": null,
+      "grid_auto_rows": null,
+      "grid_column": null,
+      "grid_gap": null,
+      "grid_row": null,
+      "grid_template_areas": null,
+      "grid_template_columns": null,
+      "grid_template_rows": null,
+      "height": null,
+      "justify_content": null,
+      "justify_items": null,
+      "left": null,
+      "margin": null,
+      "max_height": null,
+      "max_width": null,
+      "min_height": null,
+      "min_width": null,
+      "object_fit": null,
+      "object_position": null,
+      "order": null,
+      "overflow": null,
+      "overflow_x": null,
+      "overflow_y": null,
+      "padding": null,
+      "right": null,
+      "top": null,
+      "visibility": null,
+      "width": null
+     }
+    },
+    "0bc8d02b9b0941f8b38f822b8552e54c": {
+     "model_module": "@jupyter-widgets/controls",
+     "model_module_version": "1.5.0",
+     "model_name": "HBoxModel",
+     "state": {
+      "_dom_classes": [],
+      "_model_module": "@jupyter-widgets/controls",
+      "_model_module_version": "1.5.0",
+      "_model_name": "HBoxModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/controls",
+      "_view_module_version": "1.5.0",
+      "_view_name": "HBoxView",
+      "box_style": "",
+      "children": [
+       "IPY_MODEL_c5081cf89abc4514b81b0a705850b26f",
+       "IPY_MODEL_93a7172913a84728a2919fe8796567c0",
+       "IPY_MODEL_c50ae95e956d456395d05f12367ff8e3"
+      ],
+      "layout": "IPY_MODEL_c80456ab37c844b1beb074e74b17d8fb"
+     }
+    },
+    "0becbcf3af914252b73937ffd789c533": {
+     "model_module": "@jupyter-widgets/controls",
+     "model_module_version": "1.5.0",
+     "model_name": "HTMLModel",
+     "state": {
+      "_dom_classes": [],
+      "_model_module": "@jupyter-widgets/controls",
+      "_model_module_version": "1.5.0",
+      "_model_name": "HTMLModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/controls",
+      "_view_module_version": "1.5.0",
+      "_view_name": "HTMLView",
+      "description": "",
+      "description_tooltip": null,
+      "layout": "IPY_MODEL_52d5fe0cd2514f87917ab8bcf923becf",
+      "placeholder": "​",
+      "style": "IPY_MODEL_0cee1b12a94c4fdaa97d7b0e57a9d8f6",
+      "value": "vocab.json: 100%"
+     }
+    },
+    "0cee1b12a94c4fdaa97d7b0e57a9d8f6": {
+     "model_module": "@jupyter-widgets/controls",
+     "model_module_version": "1.5.0",
+     "model_name": "DescriptionStyleModel",
+     "state": {
+      "_model_module": "@jupyter-widgets/controls",
+      "_model_module_version": "1.5.0",
+      "_model_name": "DescriptionStyleModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/base",
+      "_view_module_version": "1.2.0",
+      "_view_name": "StyleView",
+      "description_width": ""
+     }
+    },
+    "14b64b065ef740cbbff5587f062b04a3": {
+     "model_module": "@jupyter-widgets/controls",
+     "model_module_version": "1.5.0",
+     "model_name": "HBoxModel",
+     "state": {
+      "_dom_classes": [],
+      "_model_module": "@jupyter-widgets/controls",
+      "_model_module_version": "1.5.0",
+      "_model_name": "HBoxModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/controls",
+      "_view_module_version": "1.5.0",
+      "_view_name": "HBoxView",
+      "box_style": "",
+      "children": [
+       "IPY_MODEL_5ede178010f54c259c9802698a599664",
+       "IPY_MODEL_225ca87fffb54bfa9514513ace1fdbf1",
+       "IPY_MODEL_cd906068e1cb46e4b5b62fc6267e8e6d"
+      ],
+      "layout": "IPY_MODEL_0aafe16d6e6d4561932cba3bed69f562"
+     }
+    },
+    "152972aaf5c7433da0a7ce4889694cf4": {
+     "model_module": "@jupyter-widgets/controls",
+     "model_module_version": "1.5.0",
+     "model_name": "FloatProgressModel",
+     "state": {
+      "_dom_classes": [],
+      "_model_module": "@jupyter-widgets/controls",
+      "_model_module_version": "1.5.0",
+      "_model_name": "FloatProgressModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/controls",
+      "_view_module_version": "1.5.0",
+      "_view_name": "ProgressView",
+      "bar_style": "success",
+      "description": "",
+      "description_tooltip": null,
+      "layout": "IPY_MODEL_e908586e492443c6a28ed16750df6748",
+      "max": 2224041,
+      "min": 0,
+      "orientation": "horizontal",
+      "style": "IPY_MODEL_013ebfb59e88443d978bb2a4f3a68f96",
+      "value": 2224041
+     }
+    },
+    "164ffff1e1944183b01d8cf76541556a": {
+     "model_module": "@jupyter-widgets/controls",
+     "model_module_version": "1.5.0",
+     "model_name": "DescriptionStyleModel",
+     "state": {
+      "_model_module": "@jupyter-widgets/controls",
+      "_model_module_version": "1.5.0",
+      "_model_name": "DescriptionStyleModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/base",
+      "_view_module_version": "1.2.0",
+      "_view_name": "StyleView",
+      "description_width": ""
+     }
+    },
+    "1745520fa3834cbf900b1646fec5d6aa": {
+     "model_module": "@jupyter-widgets/controls",
+     "model_module_version": "1.5.0",
+     "model_name": "HBoxModel",
+     "state": {
+      "_dom_classes": [],
+      "_model_module": "@jupyter-widgets/controls",
+      "_model_module_version": "1.5.0",
+      "_model_name": "HBoxModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/controls",
+      "_view_module_version": "1.5.0",
+      "_view_name": "HBoxView",
+      "box_style": "",
+      "children": [
+       "IPY_MODEL_768b536c12f84b1cb24d38675573baa2",
+       "IPY_MODEL_569e8aabbcd74e4f9288bdebeb91400b",
+       "IPY_MODEL_ad5431bc98784ee7adcf489989aba432"
+      ],
+      "layout": "IPY_MODEL_8614da2bade94ade978fe71994c777fa"
+     }
+    },
+    "225ca87fffb54bfa9514513ace1fdbf1": {
+     "model_module": "@jupyter-widgets/controls",
+     "model_module_version": "1.5.0",
+     "model_name": "FloatProgressModel",
+     "state": {
+      "_dom_classes": [],
+      "_model_module": "@jupyter-widgets/controls",
+      "_model_module_version": "1.5.0",
+      "_model_name": "FloatProgressModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/controls",
+      "_view_module_version": "1.5.0",
+      "_view_name": "ProgressView",
+      "bar_style": "success",
+      "description": "",
+      "description_tooltip": null,
+      "layout": "IPY_MODEL_d839228be8b84096a587489217630b7f",
+      "max": 605247071,
+      "min": 0,
+      "orientation": "horizontal",
+      "style": "IPY_MODEL_b76961c341d64959ae6ed7ad40f6abab",
+      "value": 605247071
+     }
+    },
+    "265d430fcc604c6984d70b7e63f11e37": {
+     "model_module": "@jupyter-widgets/base",
+     "model_module_version": "1.2.0",
+     "model_name": "LayoutModel",
+     "state": {
+      "_model_module": "@jupyter-widgets/base",
+      "_model_module_version": "1.2.0",
+      "_model_name": "LayoutModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/base",
+      "_view_module_version": "1.2.0",
+      "_view_name": "LayoutView",
+      "align_content": null,
+      "align_items": null,
+      "align_self": null,
+      "border": null,
+      "bottom": null,
+      "display": null,
+      "flex": null,
+      "flex_flow": null,
+      "grid_area": null,
+      "grid_auto_columns": null,
+      "grid_auto_flow": null,
+      "grid_auto_rows": null,
+      "grid_column": null,
+      "grid_gap": null,
+      "grid_row": null,
+      "grid_template_areas": null,
+      "grid_template_columns": null,
+      "grid_template_rows": null,
+      "height": null,
+      "justify_content": null,
+      "justify_items": null,
+      "left": null,
+      "margin": null,
+      "max_height": null,
+      "max_width": null,
+      "min_height": null,
+      "min_width": null,
+      "object_fit": null,
+      "object_position": null,
+      "order": null,
+      "overflow": null,
+      "overflow_x": null,
+      "overflow_y": null,
+      "padding": null,
+      "right": null,
+      "top": null,
+      "visibility": null,
+      "width": null
+     }
+    },
+    "2d181d3861c64d0c9d71331751de111e": {
+     "model_module": "@jupyter-widgets/controls",
+     "model_module_version": "1.5.0",
+     "model_name": "FloatProgressModel",
+     "state": {
+      "_dom_classes": [],
+      "_model_module": "@jupyter-widgets/controls",
+      "_model_module_version": "1.5.0",
+      "_model_name": "FloatProgressModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/controls",
+      "_view_module_version": "1.5.0",
+      "_view_name": "ProgressView",
+      "bar_style": "success",
+      "description": "",
+      "description_tooltip": null,
+      "layout": "IPY_MODEL_f9ecf05660fa4512b4ff4cbb9d30f3e1",
+      "max": 389,
+      "min": 0,
+      "orientation": "horizontal",
+      "style": "IPY_MODEL_898c2d408c0a4b34851f7fbf537f45b1",
+      "value": 389
+     }
+    },
+    "2f5098940d27496983565ddb3ab158bd": {
+     "model_module": "@jupyter-widgets/controls",
+     "model_module_version": "1.5.0",
+     "model_name": "DescriptionStyleModel",
+     "state": {
+      "_model_module": "@jupyter-widgets/controls",
+      "_model_module_version": "1.5.0",
+      "_model_name": "DescriptionStyleModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/base",
+      "_view_module_version": "1.2.0",
+      "_view_name": "StyleView",
+      "description_width": ""
+     }
+    },
+    "309c33ce179144ac9b23d6396f2fdcd6": {
+     "model_module": "@jupyter-widgets/base",
+     "model_module_version": "1.2.0",
+     "model_name": "LayoutModel",
+     "state": {
+      "_model_module": "@jupyter-widgets/base",
+      "_model_module_version": "1.2.0",
+      "_model_name": "LayoutModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/base",
+      "_view_module_version": "1.2.0",
+      "_view_name": "LayoutView",
+      "align_content": null,
+      "align_items": null,
+      "align_self": null,
+      "border": null,
+      "bottom": null,
+      "display": null,
+      "flex": null,
+      "flex_flow": null,
+      "grid_area": null,
+      "grid_auto_columns": null,
+      "grid_auto_flow": null,
+      "grid_auto_rows": null,
+      "grid_column": null,
+      "grid_gap": null,
+      "grid_row": null,
+      "grid_template_areas": null,
+      "grid_template_columns": null,
+      "grid_template_rows": null,
+      "height": null,
+      "justify_content": null,
+      "justify_items": null,
+      "left": null,
+      "margin": null,
+      "max_height": null,
+      "max_width": null,
+      "min_height": null,
+      "min_width": null,
+      "object_fit": null,
+      "object_position": null,
+      "order": null,
+      "overflow": null,
+      "overflow_x": null,
+      "overflow_y": null,
+      "padding": null,
+      "right": null,
+      "top": null,
+      "visibility": null,
+      "width": null
+     }
+    },
+    "32b452668efa4b61acacd04d289edde0": {
+     "model_module": "@jupyter-widgets/controls",
+     "model_module_version": "1.5.0",
+     "model_name": "ProgressStyleModel",
+     "state": {
+      "_model_module": "@jupyter-widgets/controls",
+      "_model_module_version": "1.5.0",
+      "_model_name": "ProgressStyleModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/base",
+      "_view_module_version": "1.2.0",
+      "_view_name": "StyleView",
+      "bar_color": null,
+      "description_width": ""
+     }
+    },
+    "32f222c92f844a8ea780960c0e25a64c": {
+     "model_module": "@jupyter-widgets/base",
+     "model_module_version": "1.2.0",
+     "model_name": "LayoutModel",
+     "state": {
+      "_model_module": "@jupyter-widgets/base",
+      "_model_module_version": "1.2.0",
+      "_model_name": "LayoutModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/base",
+      "_view_module_version": "1.2.0",
+      "_view_name": "LayoutView",
+      "align_content": null,
+      "align_items": null,
+      "align_self": null,
+      "border": null,
+      "bottom": null,
+      "display": null,
+      "flex": null,
+      "flex_flow": null,
+      "grid_area": null,
+      "grid_auto_columns": null,
+      "grid_auto_flow": null,
+      "grid_auto_rows": null,
+      "grid_column": null,
+      "grid_gap": null,
+      "grid_row": null,
+      "grid_template_areas": null,
+      "grid_template_columns": null,
+      "grid_template_rows": null,
+      "height": null,
+      "justify_content": null,
+      "justify_items": null,
+      "left": null,
+      "margin": null,
+      "max_height": null,
+      "max_width": null,
+      "min_height": null,
+      "min_width": null,
+      "object_fit": null,
+      "object_position": null,
+      "order": null,
+      "overflow": null,
+      "overflow_x": null,
+      "overflow_y": null,
+      "padding": null,
+      "right": null,
+      "top": null,
+      "visibility": null,
+      "width": null
+     }
+    },
+    "46da2b5501cf471a99f354f17e85fc1d": {
+     "model_module": "@jupyter-widgets/controls",
+     "model_module_version": "1.5.0",
+     "model_name": "DescriptionStyleModel",
+     "state": {
+      "_model_module": "@jupyter-widgets/controls",
+      "_model_module_version": "1.5.0",
+      "_model_name": "DescriptionStyleModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/base",
+      "_view_module_version": "1.2.0",
+      "_view_name": "StyleView",
+      "description_width": ""
+     }
+    },
+    "483f26b6d2e54bb581e8a6392b8e1b39": {
+     "model_module": "@jupyter-widgets/base",
+     "model_module_version": "1.2.0",
+     "model_name": "LayoutModel",
+     "state": {
+      "_model_module": "@jupyter-widgets/base",
+      "_model_module_version": "1.2.0",
+      "_model_name": "LayoutModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/base",
+      "_view_module_version": "1.2.0",
+      "_view_name": "LayoutView",
+      "align_content": null,
+      "align_items": null,
+      "align_self": null,
+      "border": null,
+      "bottom": null,
+      "display": null,
+      "flex": null,
+      "flex_flow": null,
+      "grid_area": null,
+      "grid_auto_columns": null,
+      "grid_auto_flow": null,
+      "grid_auto_rows": null,
+      "grid_column": null,
+      "grid_gap": null,
+      "grid_row": null,
+      "grid_template_areas": null,
+      "grid_template_columns": null,
+      "grid_template_rows": null,
+      "height": null,
+      "justify_content": null,
+      "justify_items": null,
+      "left": null,
+      "margin": null,
+      "max_height": null,
+      "max_width": null,
+      "min_height": null,
+      "min_width": null,
+      "object_fit": null,
+      "object_position": null,
+      "order": null,
+      "overflow": null,
+      "overflow_x": null,
+      "overflow_y": null,
+      "padding": null,
+      "right": null,
+      "top": null,
+      "visibility": null,
+      "width": null
+     }
+    },
+    "4b48981f033a4e0b89b3dc1cd088599e": {
+     "model_module": "@jupyter-widgets/base",
+     "model_module_version": "1.2.0",
+     "model_name": "LayoutModel",
+     "state": {
+      "_model_module": "@jupyter-widgets/base",
+      "_model_module_version": "1.2.0",
+      "_model_name": "LayoutModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/base",
+      "_view_module_version": "1.2.0",
+      "_view_name": "LayoutView",
+      "align_content": null,
+      "align_items": null,
+      "align_self": null,
+      "border": null,
+      "bottom": null,
+      "display": null,
+      "flex": null,
+      "flex_flow": null,
+      "grid_area": null,
+      "grid_auto_columns": null,
+      "grid_auto_flow": null,
+      "grid_auto_rows": null,
+      "grid_column": null,
+      "grid_gap": null,
+      "grid_row": null,
+      "grid_template_areas": null,
+      "grid_template_columns": null,
+      "grid_template_rows": null,
+      "height": null,
+      "justify_content": null,
+      "justify_items": null,
+      "left": null,
+      "margin": null,
+      "max_height": null,
+      "max_width": null,
+      "min_height": null,
+      "min_width": null,
+      "object_fit": null,
+      "object_position": null,
+      "order": null,
+      "overflow": null,
+      "overflow_x": null,
+      "overflow_y": null,
+      "padding": null,
+      "right": null,
+      "top": null,
+      "visibility": null,
+      "width": null
+     }
+    },
+    "4e47a4bc196e44dba1d7ce4faa5b74af": {
+     "model_module": "@jupyter-widgets/base",
+     "model_module_version": "1.2.0",
+     "model_name": "LayoutModel",
+     "state": {
+      "_model_module": "@jupyter-widgets/base",
+      "_model_module_version": "1.2.0",
+      "_model_name": "LayoutModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/base",
+      "_view_module_version": "1.2.0",
+      "_view_name": "LayoutView",
+      "align_content": null,
+      "align_items": null,
+      "align_self": null,
+      "border": null,
+      "bottom": null,
+      "display": null,
+      "flex": null,
+      "flex_flow": null,
+      "grid_area": null,
+      "grid_auto_columns": null,
+      "grid_auto_flow": null,
+      "grid_auto_rows": null,
+      "grid_column": null,
+      "grid_gap": null,
+      "grid_row": null,
+      "grid_template_areas": null,
+      "grid_template_columns": null,
+      "grid_template_rows": null,
+      "height": null,
+      "justify_content": null,
+      "justify_items": null,
+      "left": null,
+      "margin": null,
+      "max_height": null,
+      "max_width": null,
+      "min_height": null,
+      "min_width": null,
+      "object_fit": null,
+      "object_position": null,
+      "order": null,
+      "overflow": null,
+      "overflow_x": null,
+      "overflow_y": null,
+      "padding": null,
+      "right": null,
+      "top": null,
+      "visibility": null,
+      "width": null
+     }
+    },
+    "52d5fe0cd2514f87917ab8bcf923becf": {
+     "model_module": "@jupyter-widgets/base",
+     "model_module_version": "1.2.0",
+     "model_name": "LayoutModel",
+     "state": {
+      "_model_module": "@jupyter-widgets/base",
+      "_model_module_version": "1.2.0",
+      "_model_name": "LayoutModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/base",
+      "_view_module_version": "1.2.0",
+      "_view_name": "LayoutView",
+      "align_content": null,
+      "align_items": null,
+      "align_self": null,
+      "border": null,
+      "bottom": null,
+      "display": null,
+      "flex": null,
+      "flex_flow": null,
+      "grid_area": null,
+      "grid_auto_columns": null,
+      "grid_auto_flow": null,
+      "grid_auto_rows": null,
+      "grid_column": null,
+      "grid_gap": null,
+      "grid_row": null,
+      "grid_template_areas": null,
+      "grid_template_columns": null,
+      "grid_template_rows": null,
+      "height": null,
+      "justify_content": null,
+      "justify_items": null,
+      "left": null,
+      "margin": null,
+      "max_height": null,
+      "max_width": null,
+      "min_height": null,
+      "min_width": null,
+      "object_fit": null,
+      "object_position": null,
+      "order": null,
+      "overflow": null,
+      "overflow_x": null,
+      "overflow_y": null,
+      "padding": null,
+      "right": null,
+      "top": null,
+      "visibility": null,
+      "width": null
+     }
+    },
+    "53a11753fc664f12942c0a5a8f62e695": {
+     "model_module": "@jupyter-widgets/controls",
+     "model_module_version": "1.5.0",
+     "model_name": "DescriptionStyleModel",
+     "state": {
+      "_model_module": "@jupyter-widgets/controls",
+      "_model_module_version": "1.5.0",
+      "_model_name": "DescriptionStyleModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/base",
+      "_view_module_version": "1.2.0",
+      "_view_name": "StyleView",
+      "description_width": ""
+     }
+    },
+    "569e8aabbcd74e4f9288bdebeb91400b": {
+     "model_module": "@jupyter-widgets/controls",
+     "model_module_version": "1.5.0",
+     "model_name": "FloatProgressModel",
+     "state": {
+      "_dom_classes": [],
+      "_model_module": "@jupyter-widgets/controls",
+      "_model_module_version": "1.5.0",
+      "_model_name": "FloatProgressModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/controls",
+      "_view_module_version": "1.5.0",
+      "_view_name": "ProgressView",
+      "bar_style": "success",
+      "description": "",
+      "description_tooltip": null,
+      "layout": "IPY_MODEL_cd8f2fffa9a845cfbc2ce664647acda5",
+      "max": 4186,
+      "min": 0,
+      "orientation": "horizontal",
+      "style": "IPY_MODEL_32b452668efa4b61acacd04d289edde0",
+      "value": 4186
+     }
+    },
+    "5dbdd01ad0bd4939937fa32eb32182a1": {
+     "model_module": "@jupyter-widgets/base",
+     "model_module_version": "1.2.0",
+     "model_name": "LayoutModel",
+     "state": {
+      "_model_module": "@jupyter-widgets/base",
+      "_model_module_version": "1.2.0",
+      "_model_name": "LayoutModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/base",
+      "_view_module_version": "1.2.0",
+      "_view_name": "LayoutView",
+      "align_content": null,
+      "align_items": null,
+      "align_self": null,
+      "border": null,
+      "bottom": null,
+      "display": null,
+      "flex": null,
+      "flex_flow": null,
+      "grid_area": null,
+      "grid_auto_columns": null,
+      "grid_auto_flow": null,
+      "grid_auto_rows": null,
+      "grid_column": null,
+      "grid_gap": null,
+      "grid_row": null,
+      "grid_template_areas": null,
+      "grid_template_columns": null,
+      "grid_template_rows": null,
+      "height": null,
+      "justify_content": null,
+      "justify_items": null,
+      "left": null,
+      "margin": null,
+      "max_height": null,
+      "max_width": null,
+      "min_height": null,
+      "min_width": null,
+      "object_fit": null,
+      "object_position": null,
+      "order": null,
+      "overflow": null,
+      "overflow_x": null,
+      "overflow_y": null,
+      "padding": null,
+      "right": null,
+      "top": null,
+      "visibility": null,
+      "width": null
+     }
+    },
+    "5dfaba276a3c480d837a75767300e96f": {
+     "model_module": "@jupyter-widgets/controls",
+     "model_module_version": "1.5.0",
+     "model_name": "DescriptionStyleModel",
+     "state": {
+      "_model_module": "@jupyter-widgets/controls",
+      "_model_module_version": "1.5.0",
+      "_model_name": "DescriptionStyleModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/base",
+      "_view_module_version": "1.2.0",
+      "_view_name": "StyleView",
+      "description_width": ""
+     }
+    },
+    "5ede178010f54c259c9802698a599664": {
+     "model_module": "@jupyter-widgets/controls",
+     "model_module_version": "1.5.0",
+     "model_name": "HTMLModel",
+     "state": {
+      "_dom_classes": [],
+      "_model_module": "@jupyter-widgets/controls",
+      "_model_module_version": "1.5.0",
+      "_model_name": "HTMLModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/controls",
+      "_view_module_version": "1.5.0",
+      "_view_name": "HTMLView",
+      "description": "",
+      "description_tooltip": null,
+      "layout": "IPY_MODEL_a81ab5c22fdc4ea99ebe396d3b43c552",
+      "placeholder": "​",
+      "style": "IPY_MODEL_8841ee0d44fe4073b3dc5237c8045185",
+      "value": "pytorch_model.bin: 100%"
+     }
+    },
+    "6113de583b7a4a22bbbbfcf9a0ae6ea7": {
+     "model_module": "@jupyter-widgets/base",
+     "model_module_version": "1.2.0",
+     "model_name": "LayoutModel",
+     "state": {
+      "_model_module": "@jupyter-widgets/base",
+      "_model_module_version": "1.2.0",
+      "_model_name": "LayoutModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/base",
+      "_view_module_version": "1.2.0",
+      "_view_name": "LayoutView",
+      "align_content": null,
+      "align_items": null,
+      "align_self": null,
+      "border": null,
+      "bottom": null,
+      "display": null,
+      "flex": null,
+      "flex_flow": null,
+      "grid_area": null,
+      "grid_auto_columns": null,
+      "grid_auto_flow": null,
+      "grid_auto_rows": null,
+      "grid_column": null,
+      "grid_gap": null,
+      "grid_row": null,
+      "grid_template_areas": null,
+      "grid_template_columns": null,
+      "grid_template_rows": null,
+      "height": null,
+      "justify_content": null,
+      "justify_items": null,
+      "left": null,
+      "margin": null,
+      "max_height": null,
+      "max_width": null,
+      "min_height": null,
+      "min_width": null,
+      "object_fit": null,
+      "object_position": null,
+      "order": null,
+      "overflow": null,
+      "overflow_x": null,
+      "overflow_y": null,
+      "padding": null,
+      "right": null,
+      "top": null,
+      "visibility": null,
+      "width": null
+     }
+    },
+    "614d44b9730b4fe9a01305ac6c822388": {
+     "model_module": "@jupyter-widgets/controls",
+     "model_module_version": "1.5.0",
+     "model_name": "DescriptionStyleModel",
+     "state": {
+      "_model_module": "@jupyter-widgets/controls",
+      "_model_module_version": "1.5.0",
+      "_model_name": "DescriptionStyleModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/base",
+      "_view_module_version": "1.2.0",
+      "_view_name": "StyleView",
+      "description_width": ""
+     }
+    },
+    "768b536c12f84b1cb24d38675573baa2": {
+     "model_module": "@jupyter-widgets/controls",
+     "model_module_version": "1.5.0",
+     "model_name": "HTMLModel",
+     "state": {
+      "_dom_classes": [],
+      "_model_module": "@jupyter-widgets/controls",
+      "_model_module_version": "1.5.0",
+      "_model_name": "HTMLModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/controls",
+      "_view_module_version": "1.5.0",
+      "_view_name": "HTMLView",
+      "description": "",
+      "description_tooltip": null,
+      "layout": "IPY_MODEL_6113de583b7a4a22bbbbfcf9a0ae6ea7",
+      "placeholder": "​",
+      "style": "IPY_MODEL_164ffff1e1944183b01d8cf76541556a",
+      "value": "config.json: 100%"
+     }
+    },
+    "794250f1a0b44831864f487cfe4be7b3": {
+     "model_module": "@jupyter-widgets/controls",
+     "model_module_version": "1.5.0",
+     "model_name": "ProgressStyleModel",
+     "state": {
+      "_model_module": "@jupyter-widgets/controls",
+      "_model_module_version": "1.5.0",
+      "_model_name": "ProgressStyleModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/base",
+      "_view_module_version": "1.2.0",
+      "_view_name": "StyleView",
+      "bar_color": null,
+      "description_width": ""
+     }
+    },
+    "7c53e4cff8344da8858060970b931a80": {
+     "model_module": "@jupyter-widgets/controls",
+     "model_module_version": "1.5.0",
+     "model_name": "DescriptionStyleModel",
+     "state": {
+      "_model_module": "@jupyter-widgets/controls",
+      "_model_module_version": "1.5.0",
+      "_model_name": "DescriptionStyleModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/base",
+      "_view_module_version": "1.2.0",
+      "_view_name": "StyleView",
+      "description_width": ""
+     }
+    },
+    "81df29145f4449339e75f78919147899": {
+     "model_module": "@jupyter-widgets/base",
+     "model_module_version": "1.2.0",
+     "model_name": "LayoutModel",
+     "state": {
+      "_model_module": "@jupyter-widgets/base",
+      "_model_module_version": "1.2.0",
+      "_model_name": "LayoutModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/base",
+      "_view_module_version": "1.2.0",
+      "_view_name": "LayoutView",
+      "align_content": null,
+      "align_items": null,
+      "align_self": null,
+      "border": null,
+      "bottom": null,
+      "display": null,
+      "flex": null,
+      "flex_flow": null,
+      "grid_area": null,
+      "grid_auto_columns": null,
+      "grid_auto_flow": null,
+      "grid_auto_rows": null,
+      "grid_column": null,
+      "grid_gap": null,
+      "grid_row": null,
+      "grid_template_areas": null,
+      "grid_template_columns": null,
+      "grid_template_rows": null,
+      "height": null,
+      "justify_content": null,
+      "justify_items": null,
+      "left": null,
+      "margin": null,
+      "max_height": null,
+      "max_width": null,
+      "min_height": null,
+      "min_width": null,
+      "object_fit": null,
+      "object_position": null,
+      "order": null,
+      "overflow": null,
+      "overflow_x": null,
+      "overflow_y": null,
+      "padding": null,
+      "right": null,
+      "top": null,
+      "visibility": null,
+      "width": null
+     }
+    },
+    "828a59ea87f34d4f8be9fa6fb63fe991": {
+     "model_module": "@jupyter-widgets/controls",
+     "model_module_version": "1.5.0",
+     "model_name": "HBoxModel",
+     "state": {
+      "_dom_classes": [],
+      "_model_module": "@jupyter-widgets/controls",
+      "_model_module_version": "1.5.0",
+      "_model_name": "HBoxModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/controls",
+      "_view_module_version": "1.5.0",
+      "_view_name": "HBoxView",
+      "box_style": "",
+      "children": [
+       "IPY_MODEL_0becbcf3af914252b73937ffd789c533",
+       "IPY_MODEL_8dc08812835f40e9a85c73ea57710029",
+       "IPY_MODEL_bd6743fab19a4056a741fb923f1d66c6"
+      ],
+      "layout": "IPY_MODEL_cfc1570a53d4467397583e5614f35515"
+     }
+    },
+    "8614da2bade94ade978fe71994c777fa": {
+     "model_module": "@jupyter-widgets/base",
+     "model_module_version": "1.2.0",
+     "model_name": "LayoutModel",
+     "state": {
+      "_model_module": "@jupyter-widgets/base",
+      "_model_module_version": "1.2.0",
+      "_model_name": "LayoutModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/base",
+      "_view_module_version": "1.2.0",
+      "_view_name": "LayoutView",
+      "align_content": null,
+      "align_items": null,
+      "align_self": null,
+      "border": null,
+      "bottom": null,
+      "display": null,
+      "flex": null,
+      "flex_flow": null,
+      "grid_area": null,
+      "grid_auto_columns": null,
+      "grid_auto_flow": null,
+      "grid_auto_rows": null,
+      "grid_column": null,
+      "grid_gap": null,
+      "grid_row": null,
+      "grid_template_areas": null,
+      "grid_template_columns": null,
+      "grid_template_rows": null,
+      "height": null,
+      "justify_content": null,
+      "justify_items": null,
+      "left": null,
+      "margin": null,
+      "max_height": null,
+      "max_width": null,
+      "min_height": null,
+      "min_width": null,
+      "object_fit": null,
+      "object_position": null,
+      "order": null,
+      "overflow": null,
+      "overflow_x": null,
+      "overflow_y": null,
+      "padding": null,
+      "right": null,
+      "top": null,
+      "visibility": null,
+      "width": null
+     }
+    },
+    "8841ee0d44fe4073b3dc5237c8045185": {
+     "model_module": "@jupyter-widgets/controls",
+     "model_module_version": "1.5.0",
+     "model_name": "DescriptionStyleModel",
+     "state": {
+      "_model_module": "@jupyter-widgets/controls",
+      "_model_module_version": "1.5.0",
+      "_model_name": "DescriptionStyleModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/base",
+      "_view_module_version": "1.2.0",
+      "_view_name": "StyleView",
+      "description_width": ""
+     }
+    },
+    "898c2d408c0a4b34851f7fbf537f45b1": {
+     "model_module": "@jupyter-widgets/controls",
+     "model_module_version": "1.5.0",
+     "model_name": "ProgressStyleModel",
+     "state": {
+      "_model_module": "@jupyter-widgets/controls",
+      "_model_module_version": "1.5.0",
+      "_model_name": "ProgressStyleModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/base",
+      "_view_module_version": "1.2.0",
+      "_view_name": "StyleView",
+      "bar_color": null,
+      "description_width": ""
+     }
+    },
+    "8a23897839594ba4827c5a34463dbb35": {
+     "model_module": "@jupyter-widgets/controls",
+     "model_module_version": "1.5.0",
+     "model_name": "HBoxModel",
+     "state": {
+      "_dom_classes": [],
+      "_model_module": "@jupyter-widgets/controls",
+      "_model_module_version": "1.5.0",
+      "_model_name": "HBoxModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/controls",
+      "_view_module_version": "1.5.0",
+      "_view_name": "HBoxView",
+      "box_style": "",
+      "children": [
+       "IPY_MODEL_ce8d0eadfac444a6b88e0ba16ab6f3f9",
+       "IPY_MODEL_2d181d3861c64d0c9d71331751de111e",
+       "IPY_MODEL_fd9cc05ff50e4463b004cacd050b59c3"
+      ],
+      "layout": "IPY_MODEL_dedf6f98735643d5bb53ff2e874137c7"
+     }
+    },
+    "8dc08812835f40e9a85c73ea57710029": {
+     "model_module": "@jupyter-widgets/controls",
+     "model_module_version": "1.5.0",
+     "model_name": "FloatProgressModel",
+     "state": {
+      "_dom_classes": [],
+      "_model_module": "@jupyter-widgets/controls",
+      "_model_module_version": "1.5.0",
+      "_model_name": "FloatProgressModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/controls",
+      "_view_module_version": "1.5.0",
+      "_view_name": "ProgressView",
+      "bar_style": "success",
+      "description": "",
+      "description_tooltip": null,
+      "layout": "IPY_MODEL_ef7a3e2a70624fdfa2d590635e962ffd",
+      "max": 862328,
+      "min": 0,
+      "orientation": "horizontal",
+      "style": "IPY_MODEL_794250f1a0b44831864f487cfe4be7b3",
+      "value": 862328
+     }
+    },
+    "93a7172913a84728a2919fe8796567c0": {
+     "model_module": "@jupyter-widgets/controls",
+     "model_module_version": "1.5.0",
+     "model_name": "FloatProgressModel",
+     "state": {
+      "_dom_classes": [],
+      "_model_module": "@jupyter-widgets/controls",
+      "_model_module_version": "1.5.0",
+      "_model_name": "FloatProgressModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/controls",
+      "_view_module_version": "1.5.0",
+      "_view_name": "ProgressView",
+      "bar_style": "success",
+      "description": "",
+      "description_tooltip": null,
+      "layout": "IPY_MODEL_32f222c92f844a8ea780960c0e25a64c",
+      "max": 568,
+      "min": 0,
+      "orientation": "horizontal",
+      "style": "IPY_MODEL_06c1c81b5e8544d8aaca394f2e13539e",
+      "value": 568
+     }
+    },
+    "961b3186964b4aa694ed50e601ca6ea6": {
+     "model_module": "@jupyter-widgets/controls",
+     "model_module_version": "1.5.0",
+     "model_name": "FloatProgressModel",
+     "state": {
+      "_dom_classes": [],
+      "_model_module": "@jupyter-widgets/controls",
+      "_model_module_version": "1.5.0",
+      "_model_name": "FloatProgressModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/controls",
+      "_view_module_version": "1.5.0",
+      "_view_name": "ProgressView",
+      "bar_style": "success",
+      "description": "",
+      "description_tooltip": null,
+      "layout": "IPY_MODEL_309c33ce179144ac9b23d6396f2fdcd6",
+      "max": 524657,
+      "min": 0,
+      "orientation": "horizontal",
+      "style": "IPY_MODEL_dc6812fd13504f6bae35d81aaf2593fa",
+      "value": 524657
+     }
+    },
+    "9c7aebef36c94f659420f35c6951ac14": {
+     "model_module": "@jupyter-widgets/controls",
+     "model_module_version": "1.5.0",
+     "model_name": "HTMLModel",
+     "state": {
+      "_dom_classes": [],
+      "_model_module": "@jupyter-widgets/controls",
+      "_model_module_version": "1.5.0",
+      "_model_name": "HTMLModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/controls",
+      "_view_module_version": "1.5.0",
+      "_view_name": "HTMLView",
+      "description": "",
+      "description_tooltip": null,
+      "layout": "IPY_MODEL_f7463653c82e41b087e794191e70c43e",
+      "placeholder": "​",
+      "style": "IPY_MODEL_7c53e4cff8344da8858060970b931a80",
+      "value": " 525k/525k [00:00&lt;00:00, 28.1MB/s]"
+     }
+    },
+    "a81ab5c22fdc4ea99ebe396d3b43c552": {
+     "model_module": "@jupyter-widgets/base",
+     "model_module_version": "1.2.0",
+     "model_name": "LayoutModel",
+     "state": {
+      "_model_module": "@jupyter-widgets/base",
+      "_model_module_version": "1.2.0",
+      "_model_name": "LayoutModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/base",
+      "_view_module_version": "1.2.0",
+      "_view_name": "LayoutView",
+      "align_content": null,
+      "align_items": null,
+      "align_self": null,
+      "border": null,
+      "bottom": null,
+      "display": null,
+      "flex": null,
+      "flex_flow": null,
+      "grid_area": null,
+      "grid_auto_columns": null,
+      "grid_auto_flow": null,
+      "grid_auto_rows": null,
+      "grid_column": null,
+      "grid_gap": null,
+      "grid_row": null,
+      "grid_template_areas": null,
+      "grid_template_columns": null,
+      "grid_template_rows": null,
+      "height": null,
+      "justify_content": null,
+      "justify_items": null,
+      "left": null,
+      "margin": null,
+      "max_height": null,
+      "max_width": null,
+      "min_height": null,
+      "min_width": null,
+      "object_fit": null,
+      "object_position": null,
+      "order": null,
+      "overflow": null,
+      "overflow_x": null,
+      "overflow_y": null,
+      "padding": null,
+      "right": null,
+      "top": null,
+      "visibility": null,
+      "width": null
+     }
+    },
+    "ad5431bc98784ee7adcf489989aba432": {
+     "model_module": "@jupyter-widgets/controls",
+     "model_module_version": "1.5.0",
+     "model_name": "HTMLModel",
+     "state": {
+      "_dom_classes": [],
+      "_model_module": "@jupyter-widgets/controls",
+      "_model_module_version": "1.5.0",
+      "_model_name": "HTMLModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/controls",
+      "_view_module_version": "1.5.0",
+      "_view_name": "HTMLView",
+      "description": "",
+      "description_tooltip": null,
+      "layout": "IPY_MODEL_e46b4e1e95da4d6f924a851265403480",
+      "placeholder": "​",
+      "style": "IPY_MODEL_ee06192a75fc403ba6d945da2efe4317",
+      "value": " 4.19k/4.19k [00:00&lt;00:00, 161kB/s]"
+     }
+    },
+    "b2dd4e48fb974451979e37fb99bbdf5b": {
+     "model_module": "@jupyter-widgets/base",
+     "model_module_version": "1.2.0",
+     "model_name": "LayoutModel",
+     "state": {
+      "_model_module": "@jupyter-widgets/base",
+      "_model_module_version": "1.2.0",
+      "_model_name": "LayoutModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/base",
+      "_view_module_version": "1.2.0",
+      "_view_name": "LayoutView",
+      "align_content": null,
+      "align_items": null,
+      "align_self": null,
+      "border": null,
+      "bottom": null,
+      "display": null,
+      "flex": null,
+      "flex_flow": null,
+      "grid_area": null,
+      "grid_auto_columns": null,
+      "grid_auto_flow": null,
+      "grid_auto_rows": null,
+      "grid_column": null,
+      "grid_gap": null,
+      "grid_row": null,
+      "grid_template_areas": null,
+      "grid_template_columns": null,
+      "grid_template_rows": null,
+      "height": null,
+      "justify_content": null,
+      "justify_items": null,
+      "left": null,
+      "margin": null,
+      "max_height": null,
+      "max_width": null,
+      "min_height": null,
+      "min_width": null,
+      "object_fit": null,
+      "object_position": null,
+      "order": null,
+      "overflow": null,
+      "overflow_x": null,
+      "overflow_y": null,
+      "padding": null,
+      "right": null,
+      "top": null,
+      "visibility": null,
+      "width": null
+     }
+    },
+    "b69eb52454c64fb4bac7c9f008241d24": {
+     "model_module": "@jupyter-widgets/base",
+     "model_module_version": "1.2.0",
+     "model_name": "LayoutModel",
+     "state": {
+      "_model_module": "@jupyter-widgets/base",
+      "_model_module_version": "1.2.0",
+      "_model_name": "LayoutModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/base",
+      "_view_module_version": "1.2.0",
+      "_view_name": "LayoutView",
+      "align_content": null,
+      "align_items": null,
+      "align_self": null,
+      "border": null,
+      "bottom": null,
+      "display": null,
+      "flex": null,
+      "flex_flow": null,
+      "grid_area": null,
+      "grid_auto_columns": null,
+      "grid_auto_flow": null,
+      "grid_auto_rows": null,
+      "grid_column": null,
+      "grid_gap": null,
+      "grid_row": null,
+      "grid_template_areas": null,
+      "grid_template_columns": null,
+      "grid_template_rows": null,
+      "height": null,
+      "justify_content": null,
+      "justify_items": null,
+      "left": null,
+      "margin": null,
+      "max_height": null,
+      "max_width": null,
+      "min_height": null,
+      "min_width": null,
+      "object_fit": null,
+      "object_position": null,
+      "order": null,
+      "overflow": null,
+      "overflow_x": null,
+      "overflow_y": null,
+      "padding": null,
+      "right": null,
+      "top": null,
+      "visibility": null,
+      "width": null
+     }
+    },
+    "b76961c341d64959ae6ed7ad40f6abab": {
+     "model_module": "@jupyter-widgets/controls",
+     "model_module_version": "1.5.0",
+     "model_name": "ProgressStyleModel",
+     "state": {
+      "_model_module": "@jupyter-widgets/controls",
+      "_model_module_version": "1.5.0",
+      "_model_name": "ProgressStyleModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/base",
+      "_view_module_version": "1.2.0",
+      "_view_name": "StyleView",
+      "bar_color": null,
+      "description_width": ""
+     }
+    },
+    "b769fadb878c43beaec040a779ba9067": {
+     "model_module": "@jupyter-widgets/controls",
+     "model_module_version": "1.5.0",
+     "model_name": "HTMLModel",
+     "state": {
+      "_dom_classes": [],
+      "_model_module": "@jupyter-widgets/controls",
+      "_model_module_version": "1.5.0",
+      "_model_name": "HTMLModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/controls",
+      "_view_module_version": "1.5.0",
+      "_view_name": "HTMLView",
+      "description": "",
+      "description_tooltip": null,
+      "layout": "IPY_MODEL_265d430fcc604c6984d70b7e63f11e37",
+      "placeholder": "​",
+      "style": "IPY_MODEL_f55df7a2f0474b5ab6d0a23bcedf8cc2",
+      "value": " 2.22M/2.22M [00:00&lt;00:00, 8.62MB/s]"
+     }
+    },
+    "bd6743fab19a4056a741fb923f1d66c6": {
+     "model_module": "@jupyter-widgets/controls",
+     "model_module_version": "1.5.0",
+     "model_name": "HTMLModel",
+     "state": {
+      "_dom_classes": [],
+      "_model_module": "@jupyter-widgets/controls",
+      "_model_module_version": "1.5.0",
+      "_model_name": "HTMLModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/controls",
+      "_view_module_version": "1.5.0",
+      "_view_name": "HTMLView",
+      "description": "",
+      "description_tooltip": null,
+      "layout": "IPY_MODEL_4b48981f033a4e0b89b3dc1cd088599e",
+      "placeholder": "​",
+      "style": "IPY_MODEL_46da2b5501cf471a99f354f17e85fc1d",
+      "value": " 862k/862k [00:00&lt;00:00, 1.24MB/s]"
+     }
+    },
+    "c5081cf89abc4514b81b0a705850b26f": {
+     "model_module": "@jupyter-widgets/controls",
+     "model_module_version": "1.5.0",
+     "model_name": "HTMLModel",
+     "state": {
+      "_dom_classes": [],
+      "_model_module": "@jupyter-widgets/controls",
+      "_model_module_version": "1.5.0",
+      "_model_name": "HTMLModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/controls",
+      "_view_module_version": "1.5.0",
+      "_view_name": "HTMLView",
+      "description": "",
+      "description_tooltip": null,
+      "layout": "IPY_MODEL_4e47a4bc196e44dba1d7ce4faa5b74af",
+      "placeholder": "​",
+      "style": "IPY_MODEL_d0bad9ce27a742a49667d1cd58eea350",
+      "value": "tokenizer_config.json: 100%"
+     }
+    },
+    "c50ae95e956d456395d05f12367ff8e3": {
+     "model_module": "@jupyter-widgets/controls",
+     "model_module_version": "1.5.0",
+     "model_name": "HTMLModel",
+     "state": {
+      "_dom_classes": [],
+      "_model_module": "@jupyter-widgets/controls",
+      "_model_module_version": "1.5.0",
+      "_model_name": "HTMLModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/controls",
+      "_view_module_version": "1.5.0",
+      "_view_name": "HTMLView",
+      "description": "",
+      "description_tooltip": null,
+      "layout": "IPY_MODEL_81df29145f4449339e75f78919147899",
+      "placeholder": "​",
+      "style": "IPY_MODEL_614d44b9730b4fe9a01305ac6c822388",
+      "value": " 568/568 [00:00&lt;00:00, 24.3kB/s]"
+     }
+    },
+    "c7e34cc6b3b54c36933cf4b21f32b469": {
+     "model_module": "@jupyter-widgets/controls",
+     "model_module_version": "1.5.0",
+     "model_name": "HTMLModel",
+     "state": {
+      "_dom_classes": [],
+      "_model_module": "@jupyter-widgets/controls",
+      "_model_module_version": "1.5.0",
+      "_model_name": "HTMLModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/controls",
+      "_view_module_version": "1.5.0",
+      "_view_name": "HTMLView",
+      "description": "",
+      "description_tooltip": null,
+      "layout": "IPY_MODEL_b69eb52454c64fb4bac7c9f008241d24",
+      "placeholder": "​",
+      "style": "IPY_MODEL_5dfaba276a3c480d837a75767300e96f",
+      "value": "merges.txt: 100%"
+     }
+    },
+    "c80456ab37c844b1beb074e74b17d8fb": {
+     "model_module": "@jupyter-widgets/base",
+     "model_module_version": "1.2.0",
+     "model_name": "LayoutModel",
+     "state": {
+      "_model_module": "@jupyter-widgets/base",
+      "_model_module_version": "1.2.0",
+      "_model_name": "LayoutModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/base",
+      "_view_module_version": "1.2.0",
+      "_view_name": "LayoutView",
+      "align_content": null,
+      "align_items": null,
+      "align_self": null,
+      "border": null,
+      "bottom": null,
+      "display": null,
+      "flex": null,
+      "flex_flow": null,
+      "grid_area": null,
+      "grid_auto_columns": null,
+      "grid_auto_flow": null,
+      "grid_auto_rows": null,
+      "grid_column": null,
+      "grid_gap": null,
+      "grid_row": null,
+      "grid_template_areas": null,
+      "grid_template_columns": null,
+      "grid_template_rows": null,
+      "height": null,
+      "justify_content": null,
+      "justify_items": null,
+      "left": null,
+      "margin": null,
+      "max_height": null,
+      "max_width": null,
+      "min_height": null,
+      "min_width": null,
+      "object_fit": null,
+      "object_position": null,
+      "order": null,
+      "overflow": null,
+      "overflow_x": null,
+      "overflow_y": null,
+      "padding": null,
+      "right": null,
+      "top": null,
+      "visibility": null,
+      "width": null
+     }
+    },
+    "cbc909708fca4191a80767479a9c9c55": {
+     "model_module": "@jupyter-widgets/controls",
+     "model_module_version": "1.5.0",
+     "model_name": "HTMLModel",
+     "state": {
+      "_dom_classes": [],
+      "_model_module": "@jupyter-widgets/controls",
+      "_model_module_version": "1.5.0",
+      "_model_name": "HTMLModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/controls",
+      "_view_module_version": "1.5.0",
+      "_view_name": "HTMLView",
+      "description": "",
+      "description_tooltip": null,
+      "layout": "IPY_MODEL_b2dd4e48fb974451979e37fb99bbdf5b",
+      "placeholder": "​",
+      "style": "IPY_MODEL_53a11753fc664f12942c0a5a8f62e695",
+      "value": "tokenizer.json: 100%"
+     }
+    },
+    "cd8f2fffa9a845cfbc2ce664647acda5": {
+     "model_module": "@jupyter-widgets/base",
+     "model_module_version": "1.2.0",
+     "model_name": "LayoutModel",
+     "state": {
+      "_model_module": "@jupyter-widgets/base",
+      "_model_module_version": "1.2.0",
+      "_model_name": "LayoutModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/base",
+      "_view_module_version": "1.2.0",
+      "_view_name": "LayoutView",
+      "align_content": null,
+      "align_items": null,
+      "align_self": null,
+      "border": null,
+      "bottom": null,
+      "display": null,
+      "flex": null,
+      "flex_flow": null,
+      "grid_area": null,
+      "grid_auto_columns": null,
+      "grid_auto_flow": null,
+      "grid_auto_rows": null,
+      "grid_column": null,
+      "grid_gap": null,
+      "grid_row": null,
+      "grid_template_areas": null,
+      "grid_template_columns": null,
+      "grid_template_rows": null,
+      "height": null,
+      "justify_content": null,
+      "justify_items": null,
+      "left": null,
+      "margin": null,
+      "max_height": null,
+      "max_width": null,
+      "min_height": null,
+      "min_width": null,
+      "object_fit": null,
+      "object_position": null,
+      "order": null,
+      "overflow": null,
+      "overflow_x": null,
+      "overflow_y": null,
+      "padding": null,
+      "right": null,
+      "top": null,
+      "visibility": null,
+      "width": null
+     }
+    },
+    "cd906068e1cb46e4b5b62fc6267e8e6d": {
+     "model_module": "@jupyter-widgets/controls",
+     "model_module_version": "1.5.0",
+     "model_name": "HTMLModel",
+     "state": {
+      "_dom_classes": [],
+      "_model_module": "@jupyter-widgets/controls",
+      "_model_module_version": "1.5.0",
+      "_model_name": "HTMLModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/controls",
+      "_view_module_version": "1.5.0",
+      "_view_name": "HTMLView",
+      "description": "",
+      "description_tooltip": null,
+      "layout": "IPY_MODEL_df073637968a4ca499a861f74869d45d",
+      "placeholder": "​",
+      "style": "IPY_MODEL_2f5098940d27496983565ddb3ab158bd",
+      "value": " 605M/605M [00:02&lt;00:00, 182MB/s]"
+     }
+    },
+    "ce8d0eadfac444a6b88e0ba16ab6f3f9": {
+     "model_module": "@jupyter-widgets/controls",
+     "model_module_version": "1.5.0",
+     "model_name": "HTMLModel",
+     "state": {
+      "_dom_classes": [],
+      "_model_module": "@jupyter-widgets/controls",
+      "_model_module_version": "1.5.0",
+      "_model_name": "HTMLModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/controls",
+      "_view_module_version": "1.5.0",
+      "_view_name": "HTMLView",
+      "description": "",
+      "description_tooltip": null,
+      "layout": "IPY_MODEL_5dbdd01ad0bd4939937fa32eb32182a1",
+      "placeholder": "​",
+      "style": "IPY_MODEL_fd7d351c2a5943cd9934b36be67481ca",
+      "value": "special_tokens_map.json: 100%"
+     }
+    },
+    "cfc1570a53d4467397583e5614f35515": {
+     "model_module": "@jupyter-widgets/base",
+     "model_module_version": "1.2.0",
+     "model_name": "LayoutModel",
+     "state": {
+      "_model_module": "@jupyter-widgets/base",
+      "_model_module_version": "1.2.0",
+      "_model_name": "LayoutModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/base",
+      "_view_module_version": "1.2.0",
+      "_view_name": "LayoutView",
+      "align_content": null,
+      "align_items": null,
+      "align_self": null,
+      "border": null,
+      "bottom": null,
+      "display": null,
+      "flex": null,
+      "flex_flow": null,
+      "grid_area": null,
+      "grid_auto_columns": null,
+      "grid_auto_flow": null,
+      "grid_auto_rows": null,
+      "grid_column": null,
+      "grid_gap": null,
+      "grid_row": null,
+      "grid_template_areas": null,
+      "grid_template_columns": null,
+      "grid_template_rows": null,
+      "height": null,
+      "justify_content": null,
+      "justify_items": null,
+      "left": null,
+      "margin": null,
+      "max_height": null,
+      "max_width": null,
+      "min_height": null,
+      "min_width": null,
+      "object_fit": null,
+      "object_position": null,
+      "order": null,
+      "overflow": null,
+      "overflow_x": null,
+      "overflow_y": null,
+      "padding": null,
+      "right": null,
+      "top": null,
+      "visibility": null,
+      "width": null
+     }
+    },
+    "d0bad9ce27a742a49667d1cd58eea350": {
+     "model_module": "@jupyter-widgets/controls",
+     "model_module_version": "1.5.0",
+     "model_name": "DescriptionStyleModel",
+     "state": {
+      "_model_module": "@jupyter-widgets/controls",
+      "_model_module_version": "1.5.0",
+      "_model_name": "DescriptionStyleModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/base",
+      "_view_module_version": "1.2.0",
+      "_view_name": "StyleView",
+      "description_width": ""
+     }
+    },
+    "d5797b57dcf04274a5f7077d104a62b6": {
+     "model_module": "@jupyter-widgets/base",
+     "model_module_version": "1.2.0",
+     "model_name": "LayoutModel",
+     "state": {
+      "_model_module": "@jupyter-widgets/base",
+      "_model_module_version": "1.2.0",
+      "_model_name": "LayoutModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/base",
+      "_view_module_version": "1.2.0",
+      "_view_name": "LayoutView",
+      "align_content": null,
+      "align_items": null,
+      "align_self": null,
+      "border": null,
+      "bottom": null,
+      "display": null,
+      "flex": null,
+      "flex_flow": null,
+      "grid_area": null,
+      "grid_auto_columns": null,
+      "grid_auto_flow": null,
+      "grid_auto_rows": null,
+      "grid_column": null,
+      "grid_gap": null,
+      "grid_row": null,
+      "grid_template_areas": null,
+      "grid_template_columns": null,
+      "grid_template_rows": null,
+      "height": null,
+      "justify_content": null,
+      "justify_items": null,
+      "left": null,
+      "margin": null,
+      "max_height": null,
+      "max_width": null,
+      "min_height": null,
+      "min_width": null,
+      "object_fit": null,
+      "object_position": null,
+      "order": null,
+      "overflow": null,
+      "overflow_x": null,
+      "overflow_y": null,
+      "padding": null,
+      "right": null,
+      "top": null,
+      "visibility": null,
+      "width": null
+     }
+    },
+    "d839228be8b84096a587489217630b7f": {
+     "model_module": "@jupyter-widgets/base",
+     "model_module_version": "1.2.0",
+     "model_name": "LayoutModel",
+     "state": {
+      "_model_module": "@jupyter-widgets/base",
+      "_model_module_version": "1.2.0",
+      "_model_name": "LayoutModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/base",
+      "_view_module_version": "1.2.0",
+      "_view_name": "LayoutView",
+      "align_content": null,
+      "align_items": null,
+      "align_self": null,
+      "border": null,
+      "bottom": null,
+      "display": null,
+      "flex": null,
+      "flex_flow": null,
+      "grid_area": null,
+      "grid_auto_columns": null,
+      "grid_auto_flow": null,
+      "grid_auto_rows": null,
+      "grid_column": null,
+      "grid_gap": null,
+      "grid_row": null,
+      "grid_template_areas": null,
+      "grid_template_columns": null,
+      "grid_template_rows": null,
+      "height": null,
+      "justify_content": null,
+      "justify_items": null,
+      "left": null,
+      "margin": null,
+      "max_height": null,
+      "max_width": null,
+      "min_height": null,
+      "min_width": null,
+      "object_fit": null,
+      "object_position": null,
+      "order": null,
+      "overflow": null,
+      "overflow_x": null,
+      "overflow_y": null,
+      "padding": null,
+      "right": null,
+      "top": null,
+      "visibility": null,
+      "width": null
+     }
+    },
+    "dc6812fd13504f6bae35d81aaf2593fa": {
+     "model_module": "@jupyter-widgets/controls",
+     "model_module_version": "1.5.0",
+     "model_name": "ProgressStyleModel",
+     "state": {
+      "_model_module": "@jupyter-widgets/controls",
+      "_model_module_version": "1.5.0",
+      "_model_name": "ProgressStyleModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/base",
+      "_view_module_version": "1.2.0",
+      "_view_name": "StyleView",
+      "bar_color": null,
+      "description_width": ""
+     }
+    },
+    "dedf6f98735643d5bb53ff2e874137c7": {
+     "model_module": "@jupyter-widgets/base",
+     "model_module_version": "1.2.0",
+     "model_name": "LayoutModel",
+     "state": {
+      "_model_module": "@jupyter-widgets/base",
+      "_model_module_version": "1.2.0",
+      "_model_name": "LayoutModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/base",
+      "_view_module_version": "1.2.0",
+      "_view_name": "LayoutView",
+      "align_content": null,
+      "align_items": null,
+      "align_self": null,
+      "border": null,
+      "bottom": null,
+      "display": null,
+      "flex": null,
+      "flex_flow": null,
+      "grid_area": null,
+      "grid_auto_columns": null,
+      "grid_auto_flow": null,
+      "grid_auto_rows": null,
+      "grid_column": null,
+      "grid_gap": null,
+      "grid_row": null,
+      "grid_template_areas": null,
+      "grid_template_columns": null,
+      "grid_template_rows": null,
+      "height": null,
+      "justify_content": null,
+      "justify_items": null,
+      "left": null,
+      "margin": null,
+      "max_height": null,
+      "max_width": null,
+      "min_height": null,
+      "min_width": null,
+      "object_fit": null,
+      "object_position": null,
+      "order": null,
+      "overflow": null,
+      "overflow_x": null,
+      "overflow_y": null,
+      "padding": null,
+      "right": null,
+      "top": null,
+      "visibility": null,
+      "width": null
+     }
+    },
+    "df073637968a4ca499a861f74869d45d": {
+     "model_module": "@jupyter-widgets/base",
+     "model_module_version": "1.2.0",
+     "model_name": "LayoutModel",
+     "state": {
+      "_model_module": "@jupyter-widgets/base",
+      "_model_module_version": "1.2.0",
+      "_model_name": "LayoutModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/base",
+      "_view_module_version": "1.2.0",
+      "_view_name": "LayoutView",
+      "align_content": null,
+      "align_items": null,
+      "align_self": null,
+      "border": null,
+      "bottom": null,
+      "display": null,
+      "flex": null,
+      "flex_flow": null,
+      "grid_area": null,
+      "grid_auto_columns": null,
+      "grid_auto_flow": null,
+      "grid_auto_rows": null,
+      "grid_column": null,
+      "grid_gap": null,
+      "grid_row": null,
+      "grid_template_areas": null,
+      "grid_template_columns": null,
+      "grid_template_rows": null,
+      "height": null,
+      "justify_content": null,
+      "justify_items": null,
+      "left": null,
+      "margin": null,
+      "max_height": null,
+      "max_width": null,
+      "min_height": null,
+      "min_width": null,
+      "object_fit": null,
+      "object_position": null,
+      "order": null,
+      "overflow": null,
+      "overflow_x": null,
+      "overflow_y": null,
+      "padding": null,
+      "right": null,
+      "top": null,
+      "visibility": null,
+      "width": null
+     }
+    },
+    "e46b4e1e95da4d6f924a851265403480": {
+     "model_module": "@jupyter-widgets/base",
+     "model_module_version": "1.2.0",
+     "model_name": "LayoutModel",
+     "state": {
+      "_model_module": "@jupyter-widgets/base",
+      "_model_module_version": "1.2.0",
+      "_model_name": "LayoutModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/base",
+      "_view_module_version": "1.2.0",
+      "_view_name": "LayoutView",
+      "align_content": null,
+      "align_items": null,
+      "align_self": null,
+      "border": null,
+      "bottom": null,
+      "display": null,
+      "flex": null,
+      "flex_flow": null,
+      "grid_area": null,
+      "grid_auto_columns": null,
+      "grid_auto_flow": null,
+      "grid_auto_rows": null,
+      "grid_column": null,
+      "grid_gap": null,
+      "grid_row": null,
+      "grid_template_areas": null,
+      "grid_template_columns": null,
+      "grid_template_rows": null,
+      "height": null,
+      "justify_content": null,
+      "justify_items": null,
+      "left": null,
+      "margin": null,
+      "max_height": null,
+      "max_width": null,
+      "min_height": null,
+      "min_width": null,
+      "object_fit": null,
+      "object_position": null,
+      "order": null,
+      "overflow": null,
+      "overflow_x": null,
+      "overflow_y": null,
+      "padding": null,
+      "right": null,
+      "top": null,
+      "visibility": null,
+      "width": null
+     }
+    },
+    "e908586e492443c6a28ed16750df6748": {
+     "model_module": "@jupyter-widgets/base",
+     "model_module_version": "1.2.0",
+     "model_name": "LayoutModel",
+     "state": {
+      "_model_module": "@jupyter-widgets/base",
+      "_model_module_version": "1.2.0",
+      "_model_name": "LayoutModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/base",
+      "_view_module_version": "1.2.0",
+      "_view_name": "LayoutView",
+      "align_content": null,
+      "align_items": null,
+      "align_self": null,
+      "border": null,
+      "bottom": null,
+      "display": null,
+      "flex": null,
+      "flex_flow": null,
+      "grid_area": null,
+      "grid_auto_columns": null,
+      "grid_auto_flow": null,
+      "grid_auto_rows": null,
+      "grid_column": null,
+      "grid_gap": null,
+      "grid_row": null,
+      "grid_template_areas": null,
+      "grid_template_columns": null,
+      "grid_template_rows": null,
+      "height": null,
+      "justify_content": null,
+      "justify_items": null,
+      "left": null,
+      "margin": null,
+      "max_height": null,
+      "max_width": null,
+      "min_height": null,
+      "min_width": null,
+      "object_fit": null,
+      "object_position": null,
+      "order": null,
+      "overflow": null,
+      "overflow_x": null,
+      "overflow_y": null,
+      "padding": null,
+      "right": null,
+      "top": null,
+      "visibility": null,
+      "width": null
+     }
+    },
+    "ec8e16b5e78d4c55b100090ee7e23ddc": {
+     "model_module": "@jupyter-widgets/controls",
+     "model_module_version": "1.5.0",
+     "model_name": "DescriptionStyleModel",
+     "state": {
+      "_model_module": "@jupyter-widgets/controls",
+      "_model_module_version": "1.5.0",
+      "_model_name": "DescriptionStyleModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/base",
+      "_view_module_version": "1.2.0",
+      "_view_name": "StyleView",
+      "description_width": ""
+     }
+    },
+    "ee06192a75fc403ba6d945da2efe4317": {
+     "model_module": "@jupyter-widgets/controls",
+     "model_module_version": "1.5.0",
+     "model_name": "DescriptionStyleModel",
+     "state": {
+      "_model_module": "@jupyter-widgets/controls",
+      "_model_module_version": "1.5.0",
+      "_model_name": "DescriptionStyleModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/base",
+      "_view_module_version": "1.2.0",
+      "_view_name": "StyleView",
+      "description_width": ""
+     }
+    },
+    "ef7a3e2a70624fdfa2d590635e962ffd": {
+     "model_module": "@jupyter-widgets/base",
+     "model_module_version": "1.2.0",
+     "model_name": "LayoutModel",
+     "state": {
+      "_model_module": "@jupyter-widgets/base",
+      "_model_module_version": "1.2.0",
+      "_model_name": "LayoutModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/base",
+      "_view_module_version": "1.2.0",
+      "_view_name": "LayoutView",
+      "align_content": null,
+      "align_items": null,
+      "align_self": null,
+      "border": null,
+      "bottom": null,
+      "display": null,
+      "flex": null,
+      "flex_flow": null,
+      "grid_area": null,
+      "grid_auto_columns": null,
+      "grid_auto_flow": null,
+      "grid_auto_rows": null,
+      "grid_column": null,
+      "grid_gap": null,
+      "grid_row": null,
+      "grid_template_areas": null,
+      "grid_template_columns": null,
+      "grid_template_rows": null,
+      "height": null,
+      "justify_content": null,
+      "justify_items": null,
+      "left": null,
+      "margin": null,
+      "max_height": null,
+      "max_width": null,
+      "min_height": null,
+      "min_width": null,
+      "object_fit": null,
+      "object_position": null,
+      "order": null,
+      "overflow": null,
+      "overflow_x": null,
+      "overflow_y": null,
+      "padding": null,
+      "right": null,
+      "top": null,
+      "visibility": null,
+      "width": null
+     }
+    },
+    "f55df7a2f0474b5ab6d0a23bcedf8cc2": {
+     "model_module": "@jupyter-widgets/controls",
+     "model_module_version": "1.5.0",
+     "model_name": "DescriptionStyleModel",
+     "state": {
+      "_model_module": "@jupyter-widgets/controls",
+      "_model_module_version": "1.5.0",
+      "_model_name": "DescriptionStyleModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/base",
+      "_view_module_version": "1.2.0",
+      "_view_name": "StyleView",
+      "description_width": ""
+     }
+    },
+    "f7463653c82e41b087e794191e70c43e": {
+     "model_module": "@jupyter-widgets/base",
+     "model_module_version": "1.2.0",
+     "model_name": "LayoutModel",
+     "state": {
+      "_model_module": "@jupyter-widgets/base",
+      "_model_module_version": "1.2.0",
+      "_model_name": "LayoutModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/base",
+      "_view_module_version": "1.2.0",
+      "_view_name": "LayoutView",
+      "align_content": null,
+      "align_items": null,
+      "align_self": null,
+      "border": null,
+      "bottom": null,
+      "display": null,
+      "flex": null,
+      "flex_flow": null,
+      "grid_area": null,
+      "grid_auto_columns": null,
+      "grid_auto_flow": null,
+      "grid_auto_rows": null,
+      "grid_column": null,
+      "grid_gap": null,
+      "grid_row": null,
+      "grid_template_areas": null,
+      "grid_template_columns": null,
+      "grid_template_rows": null,
+      "height": null,
+      "justify_content": null,
+      "justify_items": null,
+      "left": null,
+      "margin": null,
+      "max_height": null,
+      "max_width": null,
+      "min_height": null,
+      "min_width": null,
+      "object_fit": null,
+      "object_position": null,
+      "order": null,
+      "overflow": null,
+      "overflow_x": null,
+      "overflow_y": null,
+      "padding": null,
+      "right": null,
+      "top": null,
+      "visibility": null,
+      "width": null
+     }
+    },
+    "f9ecf05660fa4512b4ff4cbb9d30f3e1": {
+     "model_module": "@jupyter-widgets/base",
+     "model_module_version": "1.2.0",
+     "model_name": "LayoutModel",
+     "state": {
+      "_model_module": "@jupyter-widgets/base",
+      "_model_module_version": "1.2.0",
+      "_model_name": "LayoutModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/base",
+      "_view_module_version": "1.2.0",
+      "_view_name": "LayoutView",
+      "align_content": null,
+      "align_items": null,
+      "align_self": null,
+      "border": null,
+      "bottom": null,
+      "display": null,
+      "flex": null,
+      "flex_flow": null,
+      "grid_area": null,
+      "grid_auto_columns": null,
+      "grid_auto_flow": null,
+      "grid_auto_rows": null,
+      "grid_column": null,
+      "grid_gap": null,
+      "grid_row": null,
+      "grid_template_areas": null,
+      "grid_template_columns": null,
+      "grid_template_rows": null,
+      "height": null,
+      "justify_content": null,
+      "justify_items": null,
+      "left": null,
+      "margin": null,
+      "max_height": null,
+      "max_width": null,
+      "min_height": null,
+      "min_width": null,
+      "object_fit": null,
+      "object_position": null,
+      "order": null,
+      "overflow": null,
+      "overflow_x": null,
+      "overflow_y": null,
+      "padding": null,
+      "right": null,
+      "top": null,
+      "visibility": null,
+      "width": null
+     }
+    },
+    "fd7d351c2a5943cd9934b36be67481ca": {
+     "model_module": "@jupyter-widgets/controls",
+     "model_module_version": "1.5.0",
+     "model_name": "DescriptionStyleModel",
+     "state": {
+      "_model_module": "@jupyter-widgets/controls",
+      "_model_module_version": "1.5.0",
+      "_model_name": "DescriptionStyleModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/base",
+      "_view_module_version": "1.2.0",
+      "_view_name": "StyleView",
+      "description_width": ""
+     }
+    },
+    "fd9cc05ff50e4463b004cacd050b59c3": {
+     "model_module": "@jupyter-widgets/controls",
+     "model_module_version": "1.5.0",
+     "model_name": "HTMLModel",
+     "state": {
+      "_dom_classes": [],
+      "_model_module": "@jupyter-widgets/controls",
+      "_model_module_version": "1.5.0",
+      "_model_name": "HTMLModel",
+      "_view_count": null,
+      "_view_module": "@jupyter-widgets/controls",
+      "_view_module_version": "1.5.0",
+      "_view_name": "HTMLView",
+      "description": "",
+      "description_tooltip": null,
+      "layout": "IPY_MODEL_d5797b57dcf04274a5f7077d104a62b6",
+      "placeholder": "​",
+      "style": "IPY_MODEL_ec8e16b5e78d4c55b100090ee7e23ddc",
+      "value": " 389/389 [00:00&lt;00:00, 31.4kB/s]"
+     }
+    }
+   }
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}
diff --git a/mmdetection_practice/demo/sample_images/bus.jpg b/mmdetection_practice/demo/sample_images/bus.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..b43e311165c785f000eb7493ff8fb662d06a3f83
GIT binary patch
literal 487438
zcmex=<NpH&0WUXCHwH#V1_loX4+e(+4>@XFD>Bm<7<_#hv=|r|I2d>s`5BlP7#P?X
z7#QX;3V_*M3=9lQ7=;*^85kHC85kKD7^N6k!E6SGb&S$*_BKWhs2U~)21Y}$UUmis
zhJB1iV73SY1H&;!Ck7UXUM2=cX9T-F6UJt^)u9Swv)eH+Ffce46y&5bWCmp9=cOt{
z1cQV;AZCDk!N6!}q-UsS!oXl;U}$M&U~FYzs9<PpWngAyY|OwQ-!u#6LZ*<Wxo~z&
zhZ4fI9qLfF00YAW1_qF;SqzMf3@0$dT+Wm-fd$U4n8*lG!^p(UFo}@?6he#)3`{+f
znBeA5nZyhipEHRC&R#N!9cmXV1H&XvC|iJmVG<Wy@0v*>U~v`(2Bs~OYCv|em@zOg
z?U^(Y>;@JKBV&e1lMw6$FgF_-7%X6dg&wok0%jPS#bS{-*i1%{uEh}dgHi&+5+<lP
zD4Lm(*sM^t2?N6tHYgjU#t7_A76t~kPfLtJrh!rmyU-F7Fk6*@fn5R=MUWU`0>w5D
z0|Nsqw%EZY#=z8H$iU#SkAd->Is?Pu`3#JHPZ$`KR1s!^>|<bL%jTNP(9X~YP8|xF
z{=p0kjK01M5)6zCoDjPixEPo~VaKG$z`$t2zzkwDWH2x=Co!<V)i5xy!r5CG*x>BV
z4D4_=BLfFG{+JmUm`^eAfZ0q849t%hc;RZ)8TjCA1_l8*n~^~f7B0-67)0RWTnyqc
zwgLl#B#h0#z#s)y&&I&OBEcY!B(4aymyv;iMUFukEY8Hhz@o;W3TA`yWfOxMjLpEz
zpbl5B$DjchX9R^~QbA5;afyL}zaSGs6+=72REA`RW~M3z4+b-aFa{k4amE7->ljWj
zG&2M-m@pJD#4;o>wlEhmR4^Daq%l}BBrtwpY-B8CSjCXQ5W`T%P{Gi}c!If-p@qSe
zA)6tIVH?9C#w&~pjF}An3^fds7$!2zVzgu~XPCm^#E`*|#qg5hHRFB8M8;YMKL&q>
zT!wUpwTw@hG8nWOG#KI;(im1UxHA1>bZ1<}5XlhD;Lc#okjGfdWW}J#pvDl+5YG_D
z5Y8mPq{ujdA%&rlVGctO10PcblOuyRgB-&ShNBGO47^P0O!AEV45bV+7<w2&8E!Df
zGFdX{GsrOPVYtkY$-v2|$E3|Ti=mXEp23E}hT#ok0FyU^FM|_99m7lpSB5S|J*EW4
zSq!-hg$w}<-V9buflO`;_6!yb^$dm#HVo~IDom3ZA2YNuEMi#2Fo&Um$$?3OA)g_R
zL4iSy!GvKsgEG@=#$OD@4AU5<Gn6w_F{Lo6G8i+2GJqn?j3I}?j<JYQlrfp1fuWos
zgkdV99%CwlAww|33x-^V%?t+^jF|2)TxZB;@MO?uaA8PfJjGDVP{MGM@h;N=#w`qX
z3^N&Y7_TvuFf=nXGfZdr&%njFn8B0bB10}?1w$r-F+(TgJjRC%#SGgS&M<sp*vjyg
z;WUFQLkGi3hE)uU8KM~$Ff3uX$&d#s^+8F3feD;4pg9LD0wI`qV5#K_BNH<VD;qmU
zXj)EUdU0r3VoqslWJzXjYH@O6PHJdsL4I<E0HZJi!=$MD2fs)PS<gDfAi%&OC@!n6
zt8ZZoF%MkmfS90M3Zh}y{{R24w-{Jb*Z=>osldQ+jrsroCprv_HTDb)4D#UGiGi^b
zL>rnLIvN|Bn(A5_o4D$l7#q3iI$5|F=vtaMyI8ooIyxDcSu!vbS{fMS!ORAg&bI{^
zn3Nb8a=tP!FnKXBFbFa*fJ;YET?g_z$UUHX4P07*OBF<&qmY!CoUM>jnwX=IoS2(h
zl&D~qo2!tfZv?7$82A~$r78oHAILsP9l*@M!2W{)QhzXogTz_D<t8%&1BU<uE2tg?
zV^CcSvXzm6fkT6V9j?ZJfd^a;FnNRY@`A-dYCISqwK7u(NL&yu9>5?DQ4bcEfQv^k
z$b!YW85lSc806vNIUwx}3=A637zdTvj0_9{pz=C}fdO9LgW3g*3=CY+3=9k@3|##;
z7#LU#85kHqp#%ywSm-H2%rU5DVAyHE!25}tfk9RbMkC63P?#@kV_*=@{Qr<kETg2P
zz)D{~uUIcJB|j-uFF8L~zap_f-%!s$pTWkyq98FjJGDe1DK$Ma&sORE?)^#%nJKnP
z;ikR@z6H*y8JQkcMXAA6ej&+K*~ykEO7?aNHWgMCxdpkYC5Z|ZxjA{oRu#5NV8gBQ
zimgDx`br95B_-LmN)f&R3eNdOsS2igCVB=+b_zB{DQQ+gE^bi0MJZ{vN>E3ZmzV36
z8|&p4rRy77T3YHG80i}s=@zA==@wV!l_XZ^<`pZ$OmImpPA<wUD9OyvQvjKmn3P{y
zVymPCHMSzR0B$T+zrz$3WaO9R7iZ+-P!5*{2N+0Gft7PnYGO&MOJYf?tr95Mbq$Pl
z4GcqI4I(`YBV&j{-~5!!v`U-`A&S7J<rjtI=jYfeLE2eL3UF(!K)S(7Qd4l-rf;WU
zqYny&AQv|f6CC=Wn6OhA1*0J_8UmvsFd71*Aut*OBQFFHO}x~+6kDZoC3`!D|8E&8
z0$}YP1!Fw}1`8)oUlvfil!3ushB1nPSz6UyhKYfJiGfLm$)17D(AdDt*jR?ij)4Qz
z;xRBbFqC03N9NeT6hX{_j3o&025+6D!1nuUBKHG^Cj0P^|BskVJe{561A_eBJbhfj
z17%Dqi3J5YAj@;}N{WKqofIM>qZHU5GO#nSGw?EqF(@P^7Z*4N1o(j3(=ZyuM&NJP
zAT9mNx*)SoNlk51trzgMm??bq;w#Z6ggUG&u9Vc`WCjL?KMV{EsmTRJB@7IVp!T_P
zc}W3?-NC@XAW{?&8O6ZBI0wW|hp;z**hvuf5fHm5B*>Y8f$;_d1A{_xMq&yB1LF?{
z1_qrZB=K}4Hq>5_qqto%iwklRD-{BaL0szMlGKV4kcrOu1(ija=@}&o;J%lFXI`?N
zj)IYap*aHsD9k}>7#KbWg2R$g><mJz`91@K?f(D&|L;bKdF^Ll*l5ncz_k-0reVRr
zAjr+YaAIdcVo@U4JkXdXQ(77W!>8p847`yH48j*ceVyVoV<WIUBaagU1M9v2|39lS
zFtAT%VE8-X|Nq~M{{R2Gn1O-$4g<r1y#EIn1UXnNn6;Q0l^B==8JPtc{~rN$SQ%Lv
z!2oO!sCNYIJ#%t#|3AX8Re*tsk(rr^g_)HVl(-pdL4%1bf~-P{hK_8)fr;!&g(60c
z6BlwQJ8e8D8g%i4ig8j=6DOCLxP+vXs+zinrk07RnYo3fm9vYho4bdnS8zyZSa?Ka
zRB}pcT6#uiR&hybS$RceRdY*gTYE=m*QCi)rcRqaW9F<yi<c~2wtU6PRhu?%*}84}
zj-9&>9X@jO*zpr5PhGlv<?6NTH*Vf~_~`MIr_Y|hc=_t%r_W!$e*6C8=P!`I7#Wzs
zz5)>tpTR~2p#BnMU}9uqVPR%r2l<PUshok4iCK_^Rnd@5$T5&Tu~1masF6d&Y2w0-
z2RW6EgFc8R6<y>KQ!#m{`Vr(cu+NC|SQA-3gL@3&uiFgH3?L6NGBPnTGBGnTF)_0+
zGcz-@u(E&vD;p~qut5Pk7;u09Cmj60&EO0&gNccWg^7uUlZ}-PE=M%u|6K+a2IK#?
z7<iZ&8JGl_1sUua{)&89`f$sg3EPg|KW1^lHv4Mg?&uv{F~>#E#NVAMdfdP8+8%RX
zMYZza`^{f}g|Ezfe!91;?BMaJe<5e4J}v$}OWS$tC7mx@q}M()+ws`!l8y7fpTXO|
ztPU?=OEH_iDMfCwmWRE8=>DjsspZcO?hVhlyS;0Y(pfXF$!+g1g!gJIJ$aKGZF}<8
zq)NV!uf4aF`xmo4zin!J_D+M5Z?=&h#~r5~FZ)*bztUP0a8$eI597%{)*&k;!^A$!
zpEA#0Dl?WjO42Ax$|Oj&>;7Su+k#=1GK$9x4CE#MW`{+qPcjyWeJnRe`2M`iPioR{
zu3J=myg0?^`HPA*>wma^(U^aB`&O~@ubEBM=l^;ZHYM>+xXHD<iKVVF`Z9dSR%TtC
zT-4*wK7VbDq4)OOtygAmJU(|@OkINEpO<mGQLfHbx6g0iHLY_$&-<u*W=gzq&)ilr
z*f}4&!*H;Df7Zr@?z`MnK14i_+rh>Dd3o$@n||r@nWa(*D^hQ&q`%&}T|e%1NJ*{J
zG3}YT>Qj^z6F5(tUmy2%E9>tgr{+yaH(zyR8FSt$hJuika%PEjo+ZCUwh1o(bxcA<
zj`92Yplc<IZ8xpaZ<3hc@m2J|ve_nyvmT_BoUlDwW%?!KS=)+7=WgfUIaPGyz`A_@
zc@;L!)j51Y4~`aCp0~DHcKq*$WxKg&<R1Rn+cS^N-SlL(RZZEirE|Zqzt8VzyfC>f
z{&eQ?Yr9t*G)?XbE=(^>k@H!yF5+=xxH8A-IUoD{og<XW?#S73yquM>cgDt!Iek@f
zmH(zr*>JtwJYs6LbWq$uX;yWM@9VgaL>*|4xV+SbJ@t+6$>-TB6X*ZsNZTe?&fi(s
zcX(;#`Xdpl*&6E}s`?lmyFGnlc$oa!d}nrXZDY=)r5C<SSFg72R++d>;IK+5(^8?E
zXX-1O%Po#e{8@dv<n^;$Ba<1=pE67QXRv);cJ0lQc{wWi%n~-GzpmTHF!|ni*`~kq
z`q3qa^?ojzx>(2ZMg25hmrHSrCa8ZFw9;-kP-}etb!6G*J9j*1&S3B>ym4*LyOn~|
z=UH0VO+E3US5|P%teq2A{Bggs<!qU+(3`z?H@W9cbl3Du4x3=T@wU;f#x0CTgRYpw
zH%t9nQ)(~tBkF42<Je8!9MdkGnjz!)tt{gSvrJx`HQ&}}0&%`8|G4bx+*fht?ZGcy
z_f+KlJdc)G)js{YZDB!#q)$)TlDSt>zRGG}Xj9v&tEg6ZO61AkCsjOF$uHZy-?vrm
z`R3+!Uv|qf>(vPs(j2TR$Crus`}^M9llyVH$5f%`ewR&W@ZYP}KEKJ!F6Qycy&=x$
zm&{xjb@I*9Z5~JB(+{vtskwR~`hZH3?y`!-_6L?fJ%8az_(FHvqpsQMe`|VFrv>Fb
zHu=xcCADwn(u4M$HukGCFU@GPxt%smZGv9Gr0AI;EAv`6&U*1?pK8XeyKAS;?^5da
zzj|kpZ|dh0LSf1pn{piPFD<NEd-mLfj*?HTx4lIQJyvhMx};!9Q)_*D;kWhPwe^8J
zE<d}Z|17&(lP^koN#DZ==83xt_-=eJjyuYy;{9X8_JyazwW|-#+gtz0p6$@KU&&q@
z&KIo9-O#M3{QIH%8P2#r;nON6AKImLbXnGPfm^Ce-Uw;0VCFnIb=!(E7Ey-(3<3}2
zcC6R9`cL`?+xMXM=<MKSccLo$MSj&>iZ-%Yz4b(w>m;>1dt^2oE3#a>H~nz=h2yD}
zACA4NH079Oncg1ME;iX?%@UhQw{}ms!II*7uE<})ZlAdMp|gL&zFv4ZFFwdx`JPEU
z_w5(oF4|4Bo-xa{HNr<PWOtG9bN!tif3kPWiC)-h(YkLHcjX$<=2aT!_lfsqAK%j7
zA*Wf<+TU#>ZQ1I7E6txjF6y46aI3<JiNd)hhVxcS=I30mUR>jSajWH;k`BF6j-@kZ
z_<w7iGVy0h^V6BLYA59;aOiO-JhpfppWO6ouWQL=_laS`-B%-C>eunVuoK@GZO`+%
zTq^eJnSAq!naUDfYWEGcsQh$EZLpp`=lbMqd9Jv7?=siE$<eR7aPrxCk^JT7)$Y7K
zb1hdueez*9$M5Sark(qDEdH(c>KE^2FEcJ=<mgE*(BkGPvOI75a@#(QiKVeNDy<76
zy>=>RXl`e=l-qhUT6f9UC<(1kuUGzTe{}xF;Ro-J#0xC%G~Lg8=VjHj$(Fx$->&J{
zJWbE1%Xj@v_0kt&vG)?6l$<NjuTSCU%G%_f{hxtT_eT5Ts4WNf@fEBx)rh>ZtjO%#
z;q6|3`#z>DvX%Pw>g17fu@@2+Tt_QUC>SVDJev4w9^=0&9hTE>UUHT0Y-vB8@Fek@
z;M=ZGuTw8Y>H5t`mfccjKjZx^`+uCTKkDugUYW7$-sZo{mpE(PJzAS5Wqmz^*+|*>
zX-u@CR#{EY!WnG`WWt}`?SGT_G3@gpp^8=3-ZR#kz4x}5n0__oK~C@5WUW=VJ#~tE
znpV$gj=#CRyG~YG^Aax;r;?%PzR1+{?JbNGBDqp$?iHz7Am^X;^FPC*d9xqB{_A(?
zcI3q^Z{1WBPsiSNx16AHfb~?~!FT5MUzhde$Med0ye&AAxH$UWq}}$t`hqtPe((;o
zdbW0D)Qw7u-rPN&i|@Uh%sG9+hQnnOHqWV-+R2i_H*<aDmHN!{LKXK9a~D3+XN|~y
zuuWm=mA#9$2b>i;lA8XGeQxvJcCUYn-`mOjQNI4=b+`9kv)`_LkIZ;VX0P88{n+-+
zd%KGqzgU@nhM(A{`JbUF>)+{k0e!VAB`-{(YvXm!s(4pEJnNS8oY(eSSCF~H^W@tb
zPOy9teHrj5D`-+_^7`uk42R`vefD`)FaMmqykge%;OnjX`}Nf>B~A-c>xi^E%*E$E
zU3pI<`<C9zAJ*qxGg;5@!cNY&+WlkM?3y&+ixJaxi%v0~2;E*i<Ho$jS~G2A!e6Q%
z+5bb8Z+rH_v;1v;d>{Gp$zJRT(VgG*<t1O?)>~I1U!5uIJve7Ov+f+hc%C1p|8f3j
z`0e>aJ}{sEMn$;K$2mL;Y|l-v{o7lqF=0;qf~@m`dJ9rFT9-Y({9?n;uVPnLUU^!(
z|KWM9eQZnDYTT96fB5l{Zk4mz?1#0k(`@@LIf~zLvq|+cFaCSz_^s{fQog7DP7Y2K
zS^Uf})+M?0_{vh52M_uVd|9vmqn-cg`<u_+Wb8A!Y!m(A-KD$JEY5c%&o%jUX5kcf
zg~&G%qBc53+uQ>u6vo<kK929G$|+9|ix+%($c0yQ>J!bpha7jG9%tHj_?^4Vlk)Y;
zme0LXwcDgp)IcEb*5W1eAC|S3+{>G!vUQ@zr+ue>guI@k^=Ic76(PgEIr5H|_R0O2
ze|Vdw>hhagxlR8*`IqK<WyzeUOMUm&-wZrncxmBf8{ZGyuABcI`DizF<%{nZPS{_H
zdN{+)?gPWEJ&h+VZpkTd{Jyc~#y@4x!j;Dt)>vOr-@Q#EratRrrpTIueLUV`e*F75
zzpS2T)TUSzw(R=C%dOM&IrTH!=l=D#`muR=<g0snP5&7jKct@Pw!e8xd}rIw<?TAB
zr$szXI;kPa*ffc)lI42&hqHU!D<ALBeWRAEE5*j4Kjof7UU24ZrBk8bWbfpbCb&6T
zYRA1Se{jBgR@=O^{g)K>-D^BEE!=QRv+Nn)Egz~L{JK6p@?M4Qvs|lp#jJmLY##0q
z>uGM@@y_1h`=jlB;=DH2hcB(zwr$<B4`&MnkLdU*iC_Eo^6jtZNBrOV%Dq2aXW0H*
zIk1Vn@0D4qavJ~pwRZ|W8b}5)Xw`*<COG^!cinsY#M~`&nNoLNeb{p<jj_IN(!}Sv
z*8T6NI#|?{GTS_<R@?t@t$Fm0reD%O*UdZ9*8ja>>Ky|I6#+*X!5+cua|BPnwiC&I
zq13H%RKjpyf&bKFOxtq=7EidzEVuR1(>>ZYT9cQ(o1fcXZu!_M;^tA)ytwBZDzYE0
zZ~YVgAnn>7%eqakiq7jy`xJBREYGwvr+1xur{tNtevk5ml!p1!wWr!?fAl``z3{bE
z>Ab~BIr_O_E`|qX3cWe{^QU#{cq~h(%h#CGRNZ{E>R#ug2piL6-f8`UeInL(104#^
zc_!^Va9VhBW7p5ekHULOyZd_uyq|ez=P%EkkY}XyS?BWp8ME(l^LDK&JLcvo-KTx(
zKtkb!<DS?2r-$u7@%^)m8`nA}yQAxJ#r=PjIIpP*`FOtL*z{b!&6O+8E?+Vs`c7<I
ztlPIct0zr9s&rDIEO0yT+*5`J4t#mvYRCSgF?YeMeTvr}MqB7UYE*4F5ix(ON9fat
za~#ELJiX^?i^FRqSKh1Gd~Dk+*L_nn9|_veEV$soI%U0z)|!i*Y|5El<|lV2P5!i5
z!+P~Q|86<?zw_V!W4Qgt>xbT?h-?FY-Mydgp0(P$<>F$4w(7{3j=5>K>fS4SoZz^A
z?ZY^u<&Eb*TzPf;PWkR_x4dghZf{?De$j(-vVX69%v<!`D!$%%%@6k9f&b3!ll?LI
zL;b^+@>%VFRISpFJX~4Pn6iChuCDHV=RKEljubyWJ#(J-3&~4HvF5S|SfBq|m~F7~
zTjq?_B`*pmzK=h8|Bd^~m%o<3J^La1P_x^{%kRF-E&KRYWLx9INVT2YXT8z6cy^z^
z*{z5>4eyT3l>FzoRs6T!#r(*Gq&;tb?)<7S>(BXPT=yf-?AvJjy!_L%vUrvLDF@Pu
zj`}SPzdD!yW(2>Hkpzz%Z^El3d!qf^E_t5yGj*FNVi0tsR7UF1l~RrFDK!t~$Mk<(
ze?nArm+cJmGfDTdCT5zwRZjV{Ttf1>{HgsmTWvGzAMV`4F5@#%{)f9w#O{=YB|j%+
zR@8Y&NLW7pDfPSlXw}<}OY3rj98|R%7QD^*`dInWe*XQL{~1JG3x7LQ<R6)3|I2Q9
z^24`j8hMMf)cUN~I{Wq>+VOMBmc#=G*;yX1T)+FlOf8EW;gf!Z%)cvE@T?*-NpqJ#
zS<$Bbt2aK_zg_<A+(+8?ZwVi_6Z_z{WZFNe-QK*~f!-N+@4bDaJXOwoN2$OTl?k^6
z@_1%X3S({fbL{FL*N1bHLv~*KIzx1R(AFIuGoRf!s8-G{$?~L4w?}Y-ar}z=oa=H+
z{xkIaGu+xJWSw1dSx`_kRQ$Wk13kk(@l#9Yv$waH=JH3jAE_!``m#1Xv}p4|k%slR
zo-h`jzES-#zB;;Fx_HH-%ipWMU-|sHB51WnaB0}~mw(pXJ%7^sZh-3p^$%^m1>eer
z-O^LJmN|XM%a|#@;JM9{gm1R{az372wx0d4t(c_znOWIF|Dql=d7IC=lb1NDaPqu)
zTYs&5yuRr_1AqUU?~nOAwuK${zy77xJIq`1ZAyy27N@rguUy$w>pdGABvKw+f3mz=
zBJ*2R%5*cKgFICwUTLAKMQeVt9zXr^Ty<aN`b#_Fjauf+sj|(#cl@DD`NZ(ksc)7|
z_ElSZ>)X$qGu(TfUVF_yyg$XarK0FcpZVizFOk+0=Nt}Ao>wh={pvnVv-^x0M-QmH
z{FZLpka3RjILl*O`$KyUAD`ZM-MLd$a975+#&QkTiF=MozVo-?yMMm=(XkyLx$QYs
zq!YGZdb4frPaDUnCm8sgndjZx`}+0jkl-%Qth(~P<JBI1`o4YrAu$!L+Y=*8=Grvf
z*Hm3}$KiHQ<Gg+IwmzRPx;1H^<rUp!L17mYTiqT{TFF%}c)G~*^_*JmO&`y`Q9n9;
z+Don7b~6(uikx_=J4L|agz8S_KEo@a^LvV3MwK6l%{#bIF6&(Pr-tYmN(Wxf`Rl*%
zeT+cslAGr{!n?cQ?GM`DyQi~GHA~E}Y39zY?$X_|ub<}U6;ypY|2TesoYqINsSnow
zP@TH=--?Bg?D(rIE^O$p*?z&7#lu{N>AV7i@Y^}pKYxA1Iqm(UEo%z}cz$i&G@;Vw
zywHS-FR$Y-oLirqUi+IhW1sXMq1lxt(jvEI`X#lzp5!}8l)jwxZfT&C_{6U@s%t$@
z)*F7m|2BMG#<cp4s`FMCmdkFP`trk)!ZU9_B|Q$@$dLE_Y{l`ni*C*Dw3Em*sIkBN
zPXFnSkG6|%IL+ux4Yu)N@l|HN$i0$#gN)3h-S>ZJq_^n&N&GF&&vmvSSLlA=hg(aJ
zz2xlwYsOKYDr^2Q+M+1DXW|^e&&%KDKJu4~jjECPkl(Uq+0LEy;*qxB7F_&!?fc1m
zj-rHFnvXKMU3!&QJ`9j)V&gwjD4H77?fLro)3mySQ!jcI<}W=z+fMt3-S>y`Z}OK$
z)<k6A4L(x*W8S~V0dwEntG@6#<9oi0{jQ$PYqEk1d&A7~XK0+${<`?_x4*&Pp8uVx
zx@lWq<(l<-oQqX18@s&BGMTSCB|+$T@#4yKhKZA#SZkDjS61x$^!d^L)*AbVFP?bU
zItOo$Oj9%4o;u-hh7$7`A<ihvm}SbT+*jMV>fZg>`DiV3$bW{W8Gi&n^saen`gU9E
zqqn{jC76^aICA9&m9r;F=UFI5FBJW$z24k!uG`irS^NJ?{d@e{XS=f9H-340`uaWp
zc5}~_*?}|HuKB~5)tw}yuNn0?Y`#(c?Pu@o{C$7>S;%I;nXNf3!|&bV{uR%Eh98aN
z-`iJzyZ^XVzyzIH<qb7DXWCgFJrBMX@qtr8ws~^bZ)IOysiNCc_u6ibpY>e4xa(8=
z)bk4#eARC;S}yaTYkh%~q|u#*ng1DH2OTXsUATpR>WK%xu3T>|D!$$I^SiWc#_@TN
z9%)=T#>v}u;QM-+A6q{%AN<FE=}nFE<F!fW4_^z5YMt#_zADB!n<pdPA>yR5)?-=U
zvU?hp&n_+dt+Qs5o`Y6FVNc<Y@B{zE{!aVPknZ1lPdQ)Y&X26)L08`8J?`Av8>Cpj
zLMg_>n8jSYE@z^X=ZP+(6`U%3+4oO`n#T#vt}@;J^_R?yR#o2}^WEw$$ZvN)s4wvE
zY`oyQI<A{Px*z%O_^@oP{kQ3DCDp5YB^)kzOMCy_Y~;M$L;2h@5A|uj3#K}E{nMzC
zE?ggxRVT5n>720czK)H|I{RNMS32#KW@IjA)#7|neBSHdmHhP&Kgj<PtorbxKy~S~
zi682US+_(A9$}kxIE(K<+WwwcInnN;cJi*rPMF+akSVaaDe?6`LqW3L*T1b6W^2wr
z^V6A9xp3+Czx+4ex7?RCjc=O2+5XU8^W*bauFm)Qs5Y~_bXiuF&cv)k5B45CdhFQd
z2Gu7;m052$xIAgKP+wX-y~REwzqwwtRMKQWYxcEIuf#TL-O1b@z2+;2WSi6J^rDUD
zC6yPXu=Hgg-^W_f9&+U$`@eJ7ChdFiMmV5Lre=4dxAmj$2}Xs_<o0`A{?Yqk`NQ<1
z_Wk=5>O144FWb1ReyFRvab@(<W0&;xw{6<|WOXhJn?&M`>$Or*Mf;BPT1}X1s<w8y
ze{{}&hBJRU|1&f-W#zA^@z`yzEwLnop-QK)`9)Rpk8kTI)=3^)bnNGqp6LMvZVtDP
z?~l2@@!xf;vbhiL%fF73zc_Wi?}q)8tSj_VswYj9n0TdflI4`QHk$gEyFTxgx^~=e
ze&FSj)0Rqqp9ETWI<uzrdj6DQyR~$;@MY8Uo!y0-?4&JE-+6uZ;I}`0Rv-I9?5YIs
z%hvv_)!y<UbW72zTdF&s_^x~T;^u>z?;LxQUtiiedCBP&F=x{k$GBHrJ1{e}Sh$6q
zb(`ny`=#Y}OqWYJY;qrRYoCxan|xHtCNlMv)IU}UW#z@i&0p7fx^7!jaYKjIy=&Q=
zlAZq=_H#c8|9Ef1^10i^(*OO8^#5e~Uf816$>VeXgyc`ApVJRjrc6FQ>$ZdYpW5gq
z>-3x@JlD6`o?Ei3=S*_gt%eT;1r_gOc1(R|{HvZ*JK|^6G3)(X|1Q|Z%y;+4x>tt+
z5^o*fS~SsEx}@ZQ&SJ^ulI!{|y5BPU5?~mA%=GD5>-pRKbA7#E$lO#pakS|aw}#CF
zuIr_}rjg1WxuI___k9g|XZr6PM{k>uwvgq6`rf!1`B&CSlqH^j7`yWKa;vbEX}5ak
z^aZ(SxXXO`bF||5Tj9j=+7Hfg%^uFGhdI3Tig$D}9{0a2VXJ+eYr@$HTzzb{*+=a&
zyMOnpf2;o}wm8#d+NC48UMIOlO8@?Po*7r%XYu-dbYj%Eu16U^^S_0DxVLt}y%^UO
z2TrK;cIM6wXHHsYHmTX><E&rdkC;|vPGpyq%bI^g>gV)ti9aSj`p+Pqbt&W5-^;Ns
z)80Hd)tch4AScMH=hvJ$UB9Z2Z#2BTDE0=gQd8CEiOuohr!$Pt&)X`t?CrM4%bfn6
zdeXnvB}MW-gZ;xOrke{kbjh&(^!GadY1tb#yQwU3zvlnH@R$2S$$qs5r)GpCah|ud
zc>6MLa?Y!bwR0Wp{xf(Tza%D*lpc_zVN|<2X}5R8+s8&WJfb_^pVR)SEFQak<?p{*
zWfyAOlK<Y$)rz)Ud*W`i&VuB%fo(GDt|)Fk8_^i2X)eGu=eg<g?M2Idr3xkfd~Gk2
z+*N&b#(_x2$Nw3wM_jPBIrVOL+2ns!VIAp0410Qt-$uJ9MO~Qm&DbP8@woHEw_XQC
zPksK+@M_82Ik$HmD>&+Bd~0s{GtWHLDZB@GKKq>X_H}L1n)7(x)H>bweRHmc_D0Cw
z;oDQTR$o`))<+>{JqHsBufwI%`Bs-RlEwJS`KBJvoR+EVv+nlnGs>?IJlj<p`J{wv
zC)eQ*YwlXz7I%{=wcWe>+K<fY7dMx`nd$syC6i%A`!wk}g}3{r9`;@1`1#iKsRq?+
ziuCw>(s}HyzRa!D*ybq`={kMKSB6=S>^DwaFpWXXEx|5#=fPuz=a*Jhbj>}NrD<Ax
zzEoTKy6U3rbjinmQ`~><_!s(YpSrJaj@su1r2;1=E$KM*%4QqOCw_Uos;=+5*P7a$
ze|Ed!DErxC+A}8mUrwK@Tgtf2dQy_Y10JJ!JI|ISyt;Q%X6nQIs^^^PD|HNVkI(qe
zQ1bZJmZN{SPr5Fo$-+?hD*LWUJyVVPHIt)TX1)5S`Iu|9Qb&sKD#KGNdOJ_N-ccN~
zet-IH?w4V*!bc2pCN!`f$S#YSIJrHHy?OrE_T^0b`qnviw|%gQikv6s|Hvlo*(b}j
z*E8jIoU45MKH{JHrK8_EbqeNe;yte3#BfsdSLdR-)BCv>Us(GlKkVJd#mwg13JwoS
z4&|l>zPvJT$>*4`{l8US_)NBM{c5!P;uOcC88Xd(3g?u+-n6R5zGwM+jr$k>GsHJ8
zF}AUpJA32L=gV&FsVWiJ$hwVZ-rj7-E#Je=T|Dn(%YJR&<SX`R{hd)Ig|of&tuq*A
zR|bXtbhF>H_WY$i=fgjgch=Y!T)VY*^N|B@wUxHy&fCFw;QYflJEgf%d0!Q-ud<aY
zZrLXp^T0>QVK+YuW3ZQZl!Z+bhkd{3;^Nd&PWz1B311odFYSE!PR?W2Egs<s%WW%d
zwIxn^zQ}lV?YZ?sSv}_B(t^X^=jAN7yZ!AygV$R<lNou5;U`$kW2&xeKDgZ}mO1rj
zP?zJ|X=!SE#l-t6%vvAFJ(?Twdd16o$09FFId*VZ$RGXlH#@@7bdQJEpCiS6GgnSD
z-*@EDguTD`uIA2MyNI{QS@gmDtf{_IpUo<J|IIJ0e9UcbY^G#%$B6OxY56HTzdSuD
zw<LVUjl}|XX^$7=2*%u<IyvUGdDN`^C#BYS*?!!)`9DJ~*9!rI$CtKEwO-Bj++)H~
zn^aYX=Q7XdX%*%(OgY)K*T9{n^!>FBEt?b`?>L)(c*hwJi{tBUSI=6a(=I9gpP|xr
zXV<6vEpFnBY5|WgOC%I&YkBNDR&(3p*4_CEvollM`~EX%ZS<=u+Pdyz<B8)BkA@a+
zY}$D+fA{>nt%p{foBgbLW0qF*qLy2^`*wYp>-c=i7iX18u0|;gOuji6_GG^@a4r`;
zpBY@S-Y3IUn_n<XE;?cD+9zVuKTZj9kjq}X_55?~!e77iCUfq-n)|4D!a9jxfA;Q|
zIz8)@*|x1+igQ;r@a>IWus)posKl+HON)QLD)!f2Y`-b($NER>kHj)@&sA_wTp_(<
zlBMgD>ta4V>kr=haFR1dZeE%D%Gcfx&)?b{vteVKeCIytD>>^E&d)AQ&9=STGx4}$
zz{it9o}Y{u%1i!eyB|N9UcN5YVPd758RuTkpaYE8Wh>7|eg6GdV@)QHj#D4A{)xkV
zXJ-5RX}`?;xHV*LV9cYH6P@Du+Aqx$|FQQ$d}kEvnpvTrPHfklw65&L65&rL_89Ga
z-Nah?pP|D<T6_1xm8a#rYL@gd$Qt(@c)qq^*MEj~`>kKHHT7im-iklX_Wt5MV@8gJ
z{GND2J~zj3cH7ryb@s{s@Q>M?oxQkv`NQa<h<j&NeqJeIcrMjF_>b3-C*eLn=C!&^
zx!RZU)KuZ!Rx9cCY$oP*F+FwXIJLO`{+T!Pe16u;HGfofcXR6W1WmHbxbcb6=EKeS
zr?Woy=DYmpPhKd^Ykl;Yb&7`Ix-Wk}9q-Ya@lN+?!oGux*WTyLzAs^-8N0{(;mNHp
zZir^@mAHMb!s4^txgOQ{Z_`gdnRDf^s9*h|Nr_r~+V{freoS}hJM>WOkd4=wO((Zo
z8!R!n#dzRJ+TQ60@7YW{@AU8J$7K^)KlyknMO;cP@Gn$QW-UC%r+w(%KedXqUyrg+
zOKj!NT-@>V!<}0`laKeT+SoY3?#_2+*^}#iKm2Ft(pmS#^~(EcVZGv7HEZ8p>~o&d
zUC6w@&g${fj8*5Xl`Su}Y_*&(vHwk{+TO&6tKZ7`@=3SU8*aI&ws~7us=}J0!@?Zh
z_KMMIe1_)=<2C-I{by*(`FG$ygX~uBj&=E4JWD;3($n{C?b3D9a6iKo`|{bbccyVg
z(Ptja501}>_z`{hzTno=YxRRJDen9vA~7v9PBXRlvYN+{9MQ`*rH|LgY1`U~zL>?f
zxO{0;rs2zrbuV06oxOI4Bz8ZY@#IPK?&bTkuN;0Rs<d;#n{$>Am8+FM>K~Q=;O5^h
zC%JKQ#E<aD+&_}H7Yp>eTw7y0=}->iuJaKM9t*i1=g;50&p*GjPP6`?ReeT3&x^-r
z_I_BlZL)&v&TC&z|7YOKb=+MoIUz36IEAs_BzdL8vHI1!Yx$(hX54>yZTi20fKT2m
zX>PYqoNkb5ysdjQa_6=9!{3tbJG5oHoMhwhnz8f!#wpBS?tWdLHeV<y{HXr^;I7JC
zyN-YA`t_;(eR4vVmT&r4-eTipvcfOwy<=zTTd`DCzc5*|w241$Hb*}+DDGQ+c<mnl
zMHS`|X0!A*3hrr(J-IwfDreedmz8~y>V0B9DNLMsi`RSoyKfWy;ko1WuQ&cF-hMHw
z^y>4Qx9)wq`FPstw}#g2Kj&RBFjnSS(*7)Ff;7wZbMuA&G5tGlFOr*bc`HBb>!_*c
z&gtq+<8?d!%tBN7?wU(l>C+jfy#1qn@9@XeFRRwSsJyyq`mXd(+gJQ(K4yMT&T7j)
z@vWCHm_6CMt@BA4YlZgH85bSTyWRaEwf|wh_{&9iAAMZ5<5%pttEtg*Z4b>6s>?Lj
zTA?iS?&SMx`zvj{|1+>m{-M7*BJ!0K@ACF7vYw3k{OzXE?|E(VkDpSwYr5vi{6`wQ
z_gX%G<lj;M!DD{+Ez`qUQS2RCGoR~hdVXY<*Q=LW>Wse6rUYm86-4p$dwty?<KDV;
z%AET3GY`k>to}Cje3L1^ctsrd(Qf}8QkSN(oJ^Lv9lr31SNFv8tdZ^Pv);c;yz=mZ
z_z~lmQaxgmH74ErR?YeE?1o7aKacWMDBB+~ey8=lt3HMQ7Qd_E-^B;NS$+BTywgT~
zz1!!72cLO+|7X|~bF^=_GT(6v=DwPs+mHB<^|$<9Q{(!mw))_PslTm`uAjZuO4Iqd
zwAvLV4^=0TFQ3i%iVS#b^`xze`gfZA^*37<vFq6J%{PuFyqWc_r(5*I4c8+qY_~WQ
zKkFyIKmIhLPXCJhQ8~?6=cBK#U)#R1yVgr&!foGbo-8M}9qs(mM|YRxEw;(EDS1+3
z{fJli@UFuZvmfQQ{#&13s$t~4?EY$-j_MX6Ck9(bpZ-I8)5AWhALN&aa!&tH?e?+t
z*b0f2+dd`j?d`J*^41AD{?4&f_Po!Fj}o3?q1l(VOurTXf$x^YokP8ni7&3z^e=ol
z|AX&tUHwDzx2rd<w<)g{nN?$$C2%v=D<bLBGiBLLp3jVpJ#{9XFc)q(8tBGbA6Hd+
zC|c!$97jx@g4Dl=`sDtGdigEqd*=!NnES|||MrV2y~!(%7MK2ASkY;GWZ~wghgQ9d
zNl7p}c+B{m`<LChk4|&nNZq|D_e8_odpji8pSJNi^6=H8g*G-j_ujTHDNnyxuuW`@
z#*Qn!bI*O!e551u*y30{*TX%YtCy}aKH~P~fnMc*hOeQFkG6iYxfz^s{JMQ>!9SH<
zUGGA#=vdzWH1`HG+kTT4z4NP|Zd>!wzb8(6_r*WDb}J;7G#2jRW31ty{W`w!Kf@ON
z<Nho!=S!GWSO5NEeCwq+r_}+L9Y%K#D{1Sb&e?V&vf;Sg)i2-wh&&JP({BtuY<lFw
zy@P9S?%lj*le^r#pg@JN!|SKTv=$sLI3e9&`g8V&npeA)AF%)7Vq=}0yZqqab*lTX
zF76FjKl{7xLy5aOOA?=?*+rE|=CQwu(VTYa*W#mRU%XrU$%ZG)s_@9M9<l8{_b&Wr
z$gmf_TXFwL)cVFRVH4j+a+>>mdnwUoyYg8|(a|dPQ=Uscv>)e}`4R89efFCVak>|$
zJ)N2!SoHL1vO<^8jw0!TW6tTnuj;>be`wG8!k+Js<wJS?!`sa#d#s=P%70q9w=s{g
z-LpH!ll-cZ_N+ei?N;o(l}pa9I<EVCrs_t)W06s6eMw<)jIqm{nDr$jwcIU#ubIu=
zawJhT`sVvz8GSXc4UZ>&oUmY(^}5^Dw>Dq=r}C$8Py0g|DU;n>4zGLFTg`jrsMx)D
zqhM=}C+^dX?w1$na579_SK6?LeeJf+htj!DjM^t<3ibp$i9NdhjQ4pv_xBA2j8FY#
zwV(ChW)J$XZskYc8eY~V6I8bSXSl_a>#3bzZkh4tyrQ3^D&wBJ3uOKrp0|CE_QSh%
zuYL99W*XlX+!A~9{8rJ$@za~zT-DzTFr@xI<+*<4!4whggvXZJ#o4$2oNs<4Q=9QP
zWvTY3mn+>LiMQ0KKeGPaZ9OwZ>gw4k#Sz+#GC|2_RLq`Q1n;(#`QRWSdhk!m2lo#D
z&K&hdrE_bS-#VUUbCj=Ubx06@f|11YOMA^8{!@#%X%oKvV@&49gv#<$OZwk++-Ov*
zJzSkUEBd@xMfS04*TiOBo2d0_T9a~aIk%D9QMN<J)CvzNoIJ<LFmaOhy@hT|>ex%4
z)m8SMd=a{P(&pUUrT-c1Umc(EC*;HZ&gUP~Ha_Cc=2Y9drSELYj0CNXO)5e6k2u<-
zF#qH_{qgOYaC^~GmELZ*=^5RVB3N7<7Eh{(DOtaKYrp6Z?U2js9$eZQVX9#&F-ha`
zgpLm{CHfp?b_V!MH$9p2?b)9GWBWO5+_N9Otcm4zEKan&<9A5YaiZv<zfThOr0?3C
z{CV9R)2K~T76+MaJKjG3iNSJK9pj>B<#q0Y>tej^k8#g5>%D(_;v^AK)=3X558mxP
zl4m#b(f)<+1z&~zihtAoFlE}k%EZ~eml8Bta*dybx8!o|RQcRz75@4A!@K<dg!nt7
z`c_xlPr0`1mgk1UJ9dam22{o_c);Xgx5M)Jm*~U$1@)6BdvEx-ZD~zs=8BuQBX2t@
z-`O%hZJMQ+gzj|1oxLu(jnfKSZ6;`+I%gbl(MvPt`wn)^DL<bE-i&+xe*N3Y57z1*
z{m-y@UgyL20<53%ZQLIwiQYbKJ?)#MfuphtgQr~cr=RkV^$%%0`f>il^&{nS+E?cv
z`ut<6?({?7+3x?=)7Ltdbjjf$>oFtor$z#naUl;%x5rCu{m;-NzxjUC!XK}*m*2|v
ze*9MM-npv}4bQ7C-Sgn~-IMuhKDjFKmZ{S2cTXx@=lqy|@bkgn{xxDh_OE_z7uq5<
z_1?T~8;>l#6rrn{xg_ae`*gLdCjz7kRAda-PdJ->`qk%Im)$R)_#4g0U+eb#{C|e+
z=N6jH{3w1{YQx4!kKWxszRUaO;TczpQZ|&f8yRU#K2s`rPt=*`18?2*KLHo>*Z*gD
zuzWttyEo~RZoI4$`&jz-&`K5?P17Z5YBD{>=ax);u3=C(F<$iF#qG29%$L|Fo9&;@
zvoUL)(X>|vOIuG%Yu~j_@!)@VVq!Aqv?uajzmr3*-jDpx(6pdJOSJRtl1)FdA8|HJ
z^*{S<uiNo=6Q`=$tnn~DnELwmXZN`H@I?!EwT6Ex%=qQ<)-rmR?fr-T%?~cu=iTp`
zFL)_E^D94lh1-S2o|;@?wSo7a>Lnj!G;3(iyyLES^Y^@K$r^SECuN=#{tQ1kpL^Nm
zt^BvbAC>GX`FPrP-rR@Xk&pSf-NLv}Zrjv6)qXGg#5>_vUMlsTx?`sOdCn>SS?2#D
z{&{?RVKRB+YS}Yw#Zo7#zT_C3v$v@;)!A+|@pE!x51;+q<bzK;ds^lm>YjFcru*5x
ztB?Kkp2tKw{Y;X7&3E<t%b(ZVYrL~_CEHeP>#b4RwS8`GvgWR|e%_5fJpz`;#0!}%
zPReHA%uCIEI%Purud7e@3ozY@iDWW2C{2FfGw<-Ny*3kX?XeAi<{J9W^QZB_f2tLe
zL-zh>XcEf0wK&RbW@+(<hRSW*XGdN#+Z^!XUbKMZgbB;lGZm&<Xvd%U<K$VBx$LyG
z#2K>*+fN_==zY-E!}9(0uj^lZfBdnU|A&&@+N?_)NB%Q#y?NW@*<&0N<<!+|@pI;E
zh9bZ0pO%-?f*-AjOXGT*p10V7`{ayyRfVtb?cb^@vS0qfzvxHL_O20M`Rn%wjyuOc
z)IU%uOHyRmbVY4~MeVC)*J5{bJox*c;nCZ3MTT)p<yNi#_@CjJ*wd8oZ6B8PPfJOZ
zKU=tB1LManbLQ`|lsH>C|G@0-h<}oQm@g+yt$Ft0?3H`|(&vB4I4f4o|2o&b>dR^G
zO#6q06_<WbaO+*P@X&LK>_^6zck?f;3W)o*x8I!e-NnF9fBg@hzx6(3UVgWoV)bnA
z?Ah)+XFixzR+KW;%T>iIupx{g?`I?X?d`$U5BBqAUK9Ay9W(E_^PcN^#d+7cMb9q1
z(U{z^X^)V}wl4e5cgdUwQ%^nGWS^nW{#s7w$4u3|bEaKzEnbl&>~FG8%p!3cugQ0z
zISfj@0c}ZDQ{&cXzo_rz{Gjfz>BG9-kNk(N?#Ss}*<<|hY{cub=^yv5==wNQPP^C4
zVW;8kLj@l;RH`0($G9%?^voPLYyCMgb2DzItzXug@$d2Hhq|syuWe;I&GYCMcgyFs
zPd_J2QCaAH>~TiL4W88rdBJmvyWZ{NjZ}T!XCu4xxXrcy47cQTF223F_KD$1sgu=A
zl@n#mZVD@2c+7a<gz1}=AH*NTckgj4(ZBil(b{?I*>+}D2<eMNZEGw{N#fS=E!W<1
zanq^#vNaQzT{~9f8@}uBj5?b?R@--N-E~PnPp>3<w)e}tJyvYXJ{~TTxE*`AG-tBQ
zL{24pYokrMcMcZLdUI;i*N!7@-P5)5>yDqjbm02pFyp{yp0<1aUq1d8`r$vr9}#}n
zJs<b?*eE~FRX%Q&*1qmlSXtRW{mVYVuQq0`);h90{8Eo+u9jWW#CgX8&R8&;zB&1y
zfmJb{^^f+&eWw4e&gV7lZ~w*Kv1PB-ldM^}Pun}*B+L%J`K>xrapUaYK0ZeeXn#{$
z@FCvx$J74|EI<GD>@ocK{XyQ+{EzdG{L|WTW#R15uFpQrvAeqccZh8-7w0tnt*m_K
zOiJj<;GG*B4^3Mi{^9)}q0QeMKD58t_%OfwKL3{$3D;}<|1)qbnI0VPDz{wd^vc-V
z$8Dw+8MakdERCF9Qg}l2GWVxGe>G#yw)QQ(mA3LOTkriXdAFr%{+7gzld^19$J(!-
z`K$lK`EQ5*PO#I8IPj12$JB>+y(-hUZ~AQ%@6P(@Zp@B0iMUHela)`ZpXfS}y5n_x
zoLYZjPHSpV@5E0hxXd5U<A0F-bJmaV{~1`m{GF@(cafdQkNg7#cMh|6t^JyPHtpiG
zX=M{jnDc9DmQ8(9vF5qLL7VCstP`C!O+0@yPI&td;}6Y`<&XOFyoleTw)4X=UGs=7
zJ1?0?`+D7v+}?KJW!QFcPO<4LU00mA_Oej<-6xi~2y4aw)_VOye)b26r^EGEs!J|c
zJu91g_VjxF=;imFzs}iiwmL{RNomUT^x|(5b5i?sC#|<UA^+y;iNil9?OFb;jQz{{
zqxtRf+v?xmUQ#1{VSlD<@`1Ad4B|HCE2EuF&n;eZ)4bJp?b;(Jd4wXCe!Y6=ReXjK
zyOB<T+k(CV-n!ejciYaNT`WIYIk`$mIyrgjojqokk2xGXmi@SJXR43!)7k#DbHDuw
zKPz|C>Qwej0j*ApytaJ>e^;e3f2;Xu<gu{rx5S4dD=c?9SjM^A9<9}va4UTJ<<EbH
zsWoSRN4Q=4&#?L1uFpo3b+65{S|RZ}sOp2=^8Tpjhu7b8tz7K3CH=_$jq?_Z{AUn+
zXR`CrEbE2KeGMb0Uf0|iB9M|4@q8r%^TG9dZOUeE*)ekmQ|Q?m$KTSKb>T;~*XC)4
zRj6&4>oa@mnckgl&RQ#P88*&o{$s(k@8yqH&R97+i_eSM<=(Kr$bOqE7uK(}X1e92
z7|l;pBkK8IM?763!#BVE$F--ATYH$Vl&*_ipKzzH_}6ul=}DQVo&R6_Yj!d9O56qI
zn1e<u7<4|E`1miZn6a)}e%dZ;x4lKje9h0WB+k0_Q04K>R6+C4>ylmP-Lh2cO1rVY
z!tjMi;dzO*x_0^7Z|U5NbX0e!nmCE^8~ciH>z~+oU7dd+@XpIGZ@s-6C*3Nx-OSUl
z`Jht&vJXq`KfcRe*t&R!%59HHjaL>k|4KJKpZVRq?Av=O%R{n@C0Y1xN<Q2Awzz6v
z>Ycz7YuL<{CKbN3eccqU<-OYM(Ux+*kfzF2&)*7qHneNss0!_twwNH^aaufi<2iff
ziNC@owAC1XE`J+z-$J&nYMr)g(23_kFVfgmrcTJUcxQNUwSc!&Tfe<V4D)Nhw(QIK
zBA=t&wN6T%aI%wr#_*WWmjC;zty{vLXw6u@P2%^uh13823OcmPbTVhqyR0M10n!U>
z|7|tB-Rd&2z~8I&V1=me&Eolw9xa)~-JG>#-Lt?yHlHjXZF%OVWp(G|p6rEOoX1#Z
zF#Nu@Y;MkllUnss%UmNXTAK7N{VWa~udmvfwIIvS@g#Ti<y-6dRo@Dhs=hNRHlH}%
z<I<CKg@2Z!UgFUq5sA!CUd~@$^>+Q^(DcxN(5}ZH*JVAkF520VFn{mFxM_xEmMe3L
z{zY3@{8REgFZ%4C>gIW`L$>tkY<4@ZcCX=Q_HOo`&;5t?rlowE8KhVIs@C>(_ns};
z(!SM?;yc#8-EyD5BI?kqf4_dcN@==xPhw%Q%B0hZp{}7{E!AJfN`_jVTht?Z^W=<E
zhRg13aeuh|F#iwT@WXGN?w!h)ud%ys@@#78^7%eHHt*fuJ0o@DKJV&jT=g$I)Gyoc
z@B1hHpW$G@{-pm5vTxh+Wt<npT5@ctXyW{`E$z6q+(Q;W%j2h>&-xc-WBXxkzR3-7
z?<*#E-M>2<?v_vs?3v)qx99PHhV?=B{uq3mI)_)`l77<)mD;JTr#{a~PWF5`C!uWp
zi>{4pYm@5rubun&CAFM;@$c>r_Q&jbUVm^ef50zt>z=aS*IcWgYCQY}N)w)cly9wG
zJOAi>`OIc<;iVTIcXu4~-{y9B{<;0<?v})wdtVWH`?%}Ui$AAzKGe?3pHXtp$<BX$
z)UV`+``@Pjj;fLSB>eFF5!)(>#RsD+-@7emlr59ksyf%{WB-JOvLb!j^P*q%z0sHZ
z^g7Dy%k?kr-w!5!{HD{mCev^2-L+3y>iooiUJt9&tFgZRmT&gjZOM5&<prCU)h#fP
z4~#!9et7;5UG=y252yP7h>DW}4RJ0OVt6l79;LIJUtW9RzRnx+-$aC8Xuqvztv{Hz
zKmBc1zW%X)93RzMM7?dktxa8dXo=u~h&1n}>c=NfybpRbul?e~ip%Wgb=CGe{`K`Y
z{Nt`z&Yzf@@noLw+`}%#?^Ye2|AV*k+}7U)KdMU0KD=A4J7>?7-yz&apKolc%yHkz
za{cM|M*9a#=5J^}lCke%=0|D&3rn?@xIVIYdQmOu>=rHEKZW8s-+~GczHnT>qlWXN
z*7>7mg0JFv_JrrIj<R5tI`m6>isj2si}!z8ueQyxdG_}O>z^)vn*6#T#^>IImGyJ~
zGo0xU|2uo1(u)fko0~3&#4hyQG}ZZo^>K}!e=gU1Uq#7neK@;q)3vwDwoEnhigCNR
z@#`@+Y1xmne%<2l{AYIg_Q@-D=ZpL7YX#lxgIX*9XfNCUWAT!T>28x9K9)7<uX)NK
zB3ygz-<O<ITn29(&sNO1$G<%NP0HoZ*MI%-&*nd(@0U`ev}=yf0zJMe`L*@|`@^;d
zJug(zPvCeT`)u)tpz7H-_4er2bu%O-w!M{934J5^=uS`JmDa$wG3H(SBr4v!U0i1x
zeL`v4y{i(Zu3cLF#_d3+M9mse$CK6->!($QDe>R$e1G})#aVk&Tpu1!y)>y(dUo&S
z3I6tbRQfNAE;+OQJICX-MPgO1XP0<?^Zpsd@u8zna60qC7t-@%uD+P{&+Nu&p2a&^
zAF1E}(f%^<O<#XT*@c{G3eqfJA8mUWbZPU(FXtb|=x%*_ch|J+>Q-inRBo#WbA&(1
z-k<esoBej3v#$@b-pN$R6LR}BqyKvfcg)q7o2Fd6Wz{=h;i!eX@}lXIfv*E@#l~tq
zdnR_Hz?^a7{PjxPAMR|Zdm`}o^UFBXl51@nYq_i3=6<Vgw0dGJV9zz{+&SaQq>!Fw
zKL5wzxe{AXD8HLG|J=G4fyS}78}=WVU2*c|tk248E?%ux?znF9bDinwm(g4{-<a(V
z%m3ST;A%<3%ICFD1JBhK-r8#&a5>4h?5S!}#ALlQ{~0QnBet7uR5B6jlVDnYZ`a<%
zyLW0uN1Up)vMh-;60s0A+Q5FxEGK-nGf$XcYih)mr=85Qmg_UGDyCj4+16WTXs`93
zVONjwkL$DVI9(K$U|FnJVf*pK@vT)wQA<)KZT+01XI*>lw`0@xK;<p|r+MDyE}ioG
z6PtFv%eJl;-SZ7+_)2*#c)0He@39B9*^aX$awaM=H!W?DZMRq@#h9U^xGA}PyDsPB
z-)kKH8pdqR$S%oPWxR3w)tcxe=Nqqt6x*LUKC@%96`2;FWMCX29`sVG_0RXHw^KA%
z+-b7ADI}fU#Gh|;r@?)rbN`WRlYeeI`B_8t7#qLLwW+r~lBEmEo=Y-Z`%*ad#rnG^
z7i9%3x9?P*ed&+k18!ckXZFIeS>k3t@2ptM^HL!B<ZY!T4bNp3vVVNG`bYmEtA8z*
zUe)t`wUvvmTpCtg{eAC-DXV(4I#n|l>-pE7;@=u^ZS5?7{`;#9luwpPNdBIY|1!#V
z!JbVUyDG!WmHAG;vyz*4MC$F~LNO)1%btt5cKV9#Ty)F0q_+InGs!%g*oAj9&loH`
zQ29WG&wnOMks5pPZuXTc6F%;nY;D@*wam@3-@eSn{@C)B@kOkz<;jnFt<21NCZ#+{
zblT>wFj?%_@$06d(>uSOlnZ_&YbSl*ghlC*!O!CbN5ewDKJuwf+q){p+w-NxmV%H|
zOZUW{_t|K6>5y!68#9a4;*}Lym!3HnnjKb@V3#O7{&kIXy<nzQRn(Dh`uQ^J6hqtM
z-rnInJdZ)WQ+v&}*@v%bT&gHb-B7vdvhLf>CsYdm_?qzCP`|SBPxghj?6wutb^bFr
zw=Lsa6MLsV_*|aJ>fZq$qVE_hr%2prvRC5G%a|VZZT7PMHv$_^3Mz(JcE8@<?)dt9
zc0|mN*+KJ@GQ3wEZu(a@xsdn7<IT>BO$CKF6jy)ywRBsz#paJ8X{S6ls}$}j%HybF
zXRWaOb-h-4d&#@xsB4?uxgW7@`&hbh`^RIwxoe(sZMd5Aa95DOWVqzPU%HicOFyVT
zlv~gA;+s_Jx9K_w+OxHPrZ+4&&vfdIZ+;UWhhPui)UUBqeu-_i)|*(!dt19`qk+zh
zuW=G}N_)+nKdhTIX=9(jpFc-`o?qv=-fzBfnY;38?x^Dr?R)JXOufIkZ{eeskA8h7
zvnADcbVV<j?kSdc(dp<CVQDuHuMIydx2vxYJeuJ9+bpUg`B+g!{lor_t^9nMtHo#J
zF5c1|v85|hcB*1WRCng%?t~y??oA(f>)kUS+~p74SXjv<s=}}5!diHrCE-EyWtH&h
zS^pU}^B<ahdv<Tots|LLEte#PejTYaKIUgOaeJF~<M+m2NqcV<964pR``4V9FPHcB
zAD7l|vfrxTZekr9?6B?PpV(~6*lQnSw#_dw@V~o#kAw8Q#aj2@JX?`9e@ola4~s))
zyZl)D@NNC!lL7&Hsh9OqE_Z5AJNicB!xx(;eU1_**53&G!T2~k+}BH9MCaP0M`~K%
zKE9u1qR#c^)Zt2tpG{4MM>8w-AG1^ZQU5S=>Gh|f4jjQ6%4cdGhM4HENp3uMC#=-y
z#n#_P%AE~1UyQ%(|N5Q1?jGsiUVrRAPF?q(f#<bYRP#EUBV8eBPF0#Q?d%d3T2@zX
zEkCkCF)YK-A}Df-jNn(vv(@$8`?za_KF)7lYuexYk8$g+>vLA@*}ZvdA9uf50?V8A
zQnzEaBv0bhdz_K_bM^7B{5SX?hAu0uZ~kZak*&4k%HhlvG27Oscrq~Cn6H|y!+BCs
zFR<~S;-x*EsUq**oIBdv9Bu#l*PA-Gx_kQ+F4cH`un*p`ePZ0Z=<bxhyxq$43N~xJ
zF=rCDt+Y`196#-z+>g11=?~OD#8jmmDl64D_R+mvWX7x+GF_p0j>YR+`|JNRWW?Vn
zK6Y)M(ACG+RkrN8^sM7_VfoV9b($T{J0#xfv7S11e)6=g9KHjy{^)(wKe)atP9!pa
z>wJ#vX}=5$F2vuC+_zksr=<SP=RyPJ-6jrv^S1ud=LtUS&i%D=@7(i~&t_i@{kzqq
z;@<8@^#a-3)@H7X^|syi;HAvk9cuS(-dgatK>OYw{i6C!YfWb=bbTvMl`+_}a-x88
zVTwk;>Tf4il2@2MvdUY%?8QC3Z0^V{zIh&AmY4O?N_I&cREn;VWcqVJ;N!9)?HhYs
zAMFhf*dn&+hq3>K^p+=gG9Nv<(|XISvTK#gLVkxQ3E_8w*S0Sf_0x8%`KJ8ZG;P(X
zsKt#xIzOCu`q;bn=-GEG*S*;OJ#f*^4cU=8&q~-cXW34?Q(eC<r?4?5cYfQ~x9ZMm
zmlJn2?hD->ac6==?Z>AJRlfY}=J|8iKY!^T?!~9q-}cb2DO@=H;BCo1XN~VAtX>Un
zoXWDFwC8@bTf98eoY`~QtK*?X{_jg>_MXXdmq-dMvwX8>e$|%`k-hp44@FhZ%d_W=
zTKsHQ_`903YvWA+nf#6v^W1SDf0}du9{${$lDr2Jk4HWKl53{<<>{8o{WI&!-iW@F
zPzh9%J{M3nEqR08oo&X)?md4U-h9A(SJI1pdfQLRYe}C-X+5A&d#%Rci^MVhs&#hU
zKdN5c3x4>sOl2|8zQo$DJ3`{BbqP$H8Fw>({<h*uEI;2`vn?4vkB42@l6msV+LY+d
zGL176MLb3A8!v7+&{yDb>UmGs!4I>uZrN?NTfF3Wq3KGEH@Y%2lWtEdNDPyC(C78%
z^o6gYU(7q}_<vk>*y6nKcxJ6h^Al^A4E`FG1jRJl^D<x73x3G!{doBB_Nb}HI}~?c
z)=#;@>8Vt4>Zb$4Y$l<F68y8D@K_bjy1V7k)iYU_GIL7u%h$QDS++hiDeq~f*u&K7
z5Kk2?=iaAW#te5)S{`3o^}JzE?cbHFU;Ya3I#MUse0cifpsr_{Jco`xpUUL*g6XHn
zWme0iH#=Sl2v~5|cs}Z$Z@Ts5lO5cxmX0Dz-HU`7KUDRkvp3IaKJ>a=%J=S*Z`U_%
z-6G_&;-XGcV1eZJ!!2np2`yqQ^K8u%!n?Z;tvq^seerDe8GduU-IKp5`+O|9r+$5p
z?IX~}*S$;6>=T=G%vxiCdvD2a>C}nK%Fe8npJ|XfEz;ojiF0nZ-r0yRs<1wO>-=GT
z{vVgVMb5hSI3jyn-{ZWpsQr^J%$Tiy_9xf=`!#*VM{A;&|JZ-{Kf{NXAMK7!*0ZyZ
zTvW>t^m<^Tx;DsThQa~EhfRXFRsI|ZZ<j52d0%Lc>_cnq=v<>;w;o+P_AZrY&99=&
zM;=f5T%>yv54(k|-e%lW`|!h;%tzYCmU7L?Uw`5^k6HT3Fq>Up?StxbYzu0*{Tt%+
zuHB2?T^-%MH|)hv;n*|D)!k0fr+TNkXB^IxX{+5+b6oWOe+D)?lONKLmcKo`^pE$4
zXUlD`?r*n~&Jx_@cQRGy)A<z&E*Z}zx~aO{6*_gwQMpdi&wjpjeV5b|aihCB{~2zn
zc|3NT_I7z@a=vj9?}?CAZ83|IS(plsmd}&?*xI%|pKtERa~kizRIY#fUVoyCra{v+
zf1^z0X}OKk$$}EPJ2xJ$dbsk?#-(lsd2cnf*Iml{Rr7m(c<Y&^YOhX4niv1N_;=RV
zdY+2SkNJ=COJ{uR&MaTKzU@h&PNwX`mdu%f7A)Js+)^!7@>rPTGt3@%9=CXG_w|S9
ze+HJ)EkE+t{PF(yZ0(2pN6f!l`StP`M&7>jQ|njn-b0IY&&>1E$(pchQ^%o|pE(OZ
z&8uI)zj;Xqmk^ubdD9=?g`fUAEcSBU=}+!g6IUNA3~Jt`)YIf&+|{^DmD}Kz)|;~8
zmSkz|2?k~J+^>YC9zPXbaJ&D~zPtkWsyT7bt*gy0oY`y6^+Entl)kX{ht<*BKZLB#
zUwtyUXj;)GlSWm8ebQOp%rezp?SB`>y{$R%v(vwD*2nX`+Y4Ua<J-GuSM9`usim4p
z71D|IaqMzi?@rT;`ttPV`ZJ-a?@nL%@&2)Y``6X=KNQ7gF8HzT*CShR*AMLN>(!^%
zOgs^HGI!~xr<^+b(!#l3Tr%>g`+lmxe!9wD_iL_qig-6f9tpNku3FOaME-l5<D>nn
z_TOgu^78%%FWF$nsn<ADKh$+5bSrBy>m0gdC>Py(#?MNA;mi0_`mKr|zRvG|bh*ZZ
zWt*G4(KCkKe+~$q=vLm+>LgUapnhxrriZMX?5A6-^DBM1cIy2Tzc)YJ-&&_o6Z4;;
zh1ut0^Vx^{c{Alic3s|bb@Q%i_uf6?=-pCuUS;B<lk)Qw8Ci<7a~#SOd#mQR*YQRD
zsDD)6t7~H{^KDy|?7X?AOSVnFJ~7sJpO~JMo6fqkpJlv0EmTMiSGoA%`s4KtHRY=+
zQkP$Q`{;_vU7>7SKj{<q{l&hQ7v1_<$Y^!U;F-E$!qkL0@^Q=FM}M4RXK;Q0L-DO!
zXPx@G=Gvo2o+k{oZfl;>V&mhhp0}s^`eOacThCQ_oV`wG*X@5&!@s!3;zNJm7k|N;
zs2^RI|1%_KEc%vxL-L;VQJ1v2mtvPL%y{>-VqwMfXXVTpH!pAayEw=0`r<zVR}ZV4
zt$q-p+tcyzu-WWV8)v=fNjB$Wet(Y9oql9K=MVjd-)29^7jtL*{zvDezWTLy4i=j?
zZpwUoY02-~VUh1o&Jf^J=HhppxA{@*omuA(+Bf`DZP-#S=KtugSSGj8w%4+rTpHT<
zGwhC(o-Gbra%D>X^)K~L%F={GS5}|<_Sa<N&$AE9jWcFlKC@bVX0l}BF{97!U(fkj
zoVQrN=s!c6ZP{bzYc-}1-zo=PH95Vu{78LLtI6s1t-Ti?2CL6gPJE`cB6s5i$K(?S
zPW*g*;8)LeJCTpJr}+(M9TK&WWI1ou^SCErf}<?|)>_x!Mit73|EYX<y1n;L@Jh!e
zw<@wDjE@(Zp1<iGbH{C^j9b9Mi*~W^Lc4Px6x~?wu6M+%*ENXiZF#sIyYAsrOEV5`
z-~2jn`Ir3P3@<m`tUGtl<noq@f9K2WYVTH`_R>r;`F3%Qv)d+RZR^L<T@!X#vOEaC
z_Mbse_v=~VZ($$A`X5HGX#HbcA#_iBuAAA6n#oZH6BoA}k!*~4kQ>AG$Lw!keO7Pr
z!{?3rbY7c<UB3S#?y~#dE04?WOt3MZ6mwLu<y^-_6Q`7!S9i-5d9J@c*Z%SK!|~nw
zIrk{@H+?lYbU5n6+Bx60XXNH3O%iO}rCH#$v*S(ao%Q`wW_{Rfu5qZiF8}$?-+e;n
zE9FCKj(!OKmbL4n_}k)#tbdoSfBIu)>57Wv*xmD<J?WOUx^w&P%a6|atSv!#pJdZ(
zKknXTEVJ*8o^A0z&d!Au(ht*H_Gi`e*VtWNv!&MF`$zX9jkj;sOtX00bj?=JP{ynC
zyE3bUmJHv6gywj!AIgV6JO2)>a1Y#KedM0tH4fzo=2=z=$_tbg%D=3iWS{I?^tC?S
z|5pFeDowHJ=5l5qpLFCYpF7?p-eS_VhC4aofmvZ+_Rsf5=d>SZT$!60@1fVJU%x0y
zSKRqaS433Ft$^4+{~5%~s;3{kp|bHmLz8Qb=H)vN{xcksez3*z@!yhPb?)mwCg0lc
z_wKOzT!Hh(mdaO(<7e!$YffBNe^B2}>W8=gwC8@?+dV#r?lRr2Ka2hLmO}ztx*oKv
z^A%3wJjl*cH#6=;*t<vip7KAhAAW9P`_uGV@n8OWu1Wp+N!lT2+QO0={qvVr_8-qJ
zisgQ&w|w<a&$6aRS9yxw9pG1!__JVg;|U3y>r3698dZgN{JSi!{7*z}%cRY`mv1$M
zOG*}Bwh5oyzT~RMuessAa`L}zDwZGEr}Od7b}QRCVc(x!>@00RrD}YxSSF>x&ARc=
zzqudZ<o@lKdVBKognvHT5A|=ny833Ha{QWACoL}DytCnv@0o^84-y#InG26^uiy12
zU)ip!@8*elrjO_Ex&Jro*Nf_vM?SAU{(Z$X?*$*GO(=4F5XKo@R1{kL@6r61u{<AF
zt)J#r_~*6Ctw}`^b;|!4*8BR-{G|N<(qG$)51lUgJ=lM0l`a2A8UFaHm+wrzU!G_2
zM51tWQ&GX`9Yt0jToWtU-7gD$_qRIIoydFif_b=*MbO0E36su$TKVbN1*^1O=2!Wa
zuQ|U$@sP*yBp%+yKinmrXfXV~{>e{m-rD&WOrC|$uJRY*{&c>uHD;di$#b^trdMws
zn^n3iT01o<hWT=zr~Q@d*2USj=eB05aePwF6x}WGME#X<|I!TK>gTW2eVUY&mY>z;
z$qBw1Fz31YI))dP$J}bZxq5CZ6*Cv+E>>B6x@h&k^Etn-b)As1H2iz){G(+nYgb7=
zILtri@rRXfn~tR=74MCgc*AwA=*HPRQ@0b3!p_}SwdY~b{KPEPIkAsDD&kyHZ>@6t
zUzX6RT*+E@zA0@q$=EED6vX`C^S{c~lN@<i3VY@mcsyIN?(QnX3thWdKA)0{$q77e
z`|7c-&n%5o`3XBB9_=pUpCshsCMmnQ!QqduYjUCa?IklOdK)~KN&oye>+PRHuTwV<
z%D&hZa{knw$7}Q3=D(km8sa_a$#%_eM^jT0cgys-%UTux3e&wecLt|WYvRpw_iBx@
zR}@{0lDv@KH&=V^m9(iRgTl)ySPC!gU6Z>ruORXERT<l3y=!d`pH^Xg_&9%>Gyie6
zeJOwUEuQcHpP?zJ?vlZ#ss9<e%Io;t949(Te6cwAZT;H2ixSRV+bGV?I%SH**Ha1C
z&-`cD{-EJM!$HmZOv|N4JM6?~Fe?9?k;9X#J}3Ro_3J+}-=}?9^xOMCgXhGDAHB2L
z^+SIy{&9Bm@7T>JJQF7$UmtvHd(I!{)i*Yqm>V6Px0Ew}SwTox>>kg8sPX{DqTuxo
z{`tqYTr!(HmE~9Q>-dY=e(jGhw*=Q5&rbdreslxNwrMZoj)XLA=i0=-kdLo^`lZfw
zTjB+7pDfuG+S~gi>(cI<?oY%el%IwC^kDdSJnGSPk3DxhG*<T{TUh*QE&Y`@m$xU}
zI^}cy#rXv`GUd<zGhB_SI92$qsLW=~tzP@pr@~%T{>~G-V0hx^^huR>q%Ds>{IcF*
z$A@)Ot{Ln-dw1c?23^@JX|@Y`J}R>M8NZFu><Zl+XmH1;^GDAI_QaRXH?FUUjd}Td
zl1z#Qmk5L57RKwh_T=p6mg@a1FMQatRwrcHD(xFjQa;FBQr2B}T-m~Gd-VZX_fsCS
zzmj%t{%|i=J~Ur2;-<9qr=sf<qb1hueDZc@vk+6^6$49IchNgBHzV&p^GFKKd6G~c
zxAmnx=a+uF(*b>I<%wEvS<f+O|FN|EZuj+aIK!g#Vzn+m!n(?r+)8V2u+P4K+x}rr
zKx75`qqhCLOZPEs*|obr*vXp7G-6$R{<@nY-_A43r&aL(<2L>s^TWus`B8fNANxl)
zd^)%})|q4;D&Uh7+ui2&y63orI&)*3<HPgqauU~6=IIMY9xb0L9eMqk>`9j5m-j8#
zPx+@=k$3uVoa$_k%lk|7wtEP2i`}YFVY<8V#IrqJAEw0Kw)_}yJV9u+)b{x6#lQLf
zPTHR#@t+}Ue$%b^W2<%b9v}XgRUCUDCw-b_tkk8l#{QY|r$SG?^XuKxdqAe~>--**
z*WUTf_tcvNo6TkxN%pJ1llpTQROH{ZvEL})F6TV=*RpMg)m4~Rcs9nb*r#86pSSdj
zgyrRR4Cj4*=Ej-H*<G|Wz3{hMd;NL0IrrYG)#X+A2hV()ytVmxK*W>n4xH<QdN=Lf
zeDFo~^ZyJCZNJ~xwD$#1u_^NNt6P3)UsDO!?4$?P<?B0+9Qobl`{wNHh$FMjYTtd0
z3aNajwtcqHu`>ayd)Be9uoSs#mfI&<EpzoK^ZBv^_LeW-WuKe(JR~TiZe}X$+~boo
z8C&+N+_rX}Q@?3>zJJ!+H?tl-=hnHzZqr=IQ>_2@tNgUbAI}yGu0F0moAYPmgZWi=
zF22u8-lg=MrG))P&-LE!Sl<U#tP`)Wzn^xGd%^Oyrlj7N-&JDjAAhYn_DR+%<J`@}
z64w}$l%B>L>mEiHtgfs}da~mQ<FV{KwHb-C6*n#Ur#>;xcIz(lps4PZKc)H>m0Cv%
zdB%!*@EDo(l)S#Q(UfDEtF}&Rf&JXFUk@(#*{rw}yLyfR@BMo_6DGJSL|2?q{J?fB
zcW?bJPv#FyyRMjCeU*Op#@@BZbGF^eUMSJ$ATHY&92cpTGj(QRySn7Fy;<4bE7quP
z-O1#%xcB4A2j6*?H?cc+Jx<+tIWM5aGL^mKuBW}jjen&tu7^#UI9K!cn$I)d&b`t1
z%Ik0K(O_@ymYq9v+xSi^FmH2UsY}|$ecL+M(k?U3Ebh}{#=f0*c8Z>l&Mw&cvFlEE
zvr78kU^YoN+1d?$+3Q4pPQ5sLYVVG~rdHiK^?F;^v^O4)dbGCmppCHU4S_w0oeUp8
zeR+Lv`<pzq30kc>Uhibe7GCc7xvr%C=E?fycMduHTsVQJ^!Jjm)6t8LEi$TmVDpzX
zWb=bf8@0HM=5ajfn`*n}tnL({6Lx8xR`t8In@T37o$@<YdZjq;RLS2gc88VEG+$oZ
z_N2owar=r_n#WX9xW8A2`OQjxZeg45Z*+e73HH0Y_}_kVRb1O$`nh4^amm;Bwm#Xa
zUzoM3!hPnZ+M2x!_<z5eT`27+ryMxvpKRr_1-W7~XWhyX&)s<-slE5G{rUOVcFm6d
z&mbBR#qDbzIM2GsAlXQ~U#?Z<-jX`ezUk@`+S^6fCKt{*R#m!I^H{+(zGJ5HW|P7V
zRVS|hn&unqdHLNorPKQ?W}QmSc^kAj+Q9OF?JmBlcQR((nU=fnn)#NUKCAt1n+mHW
zFbMg+&DUgJp)mP<gjwEM(>IrrdCjNH`1eLj{6B+}Zg@k`f(;VtHrIDIpW9e+{b+rx
zzqw%JV*SnE<y!tT2-T!7KmPQj+{990`%^*he9g)jKCze=?y)?0{@0tbb)OH{Ss6v&
z$+CLGn=72;a;lRjnbFHzcegj&o1Wfvj6uAWtPeX)GGa9TKHgV*Tt@KH&L@|*oYrpN
zarr^tJx{)873`CqJeJhubgGy7)gvx_b=iN0N|wJS{~3(WuACg4eK-B)#8<cS7CwA_
zMJG>jr{J*^PMMA;6Hmx%+RS6Ee1Ak%%Qo!Zy;ElcABTBYrtnVhJ-m98oDs+I4bS$)
zTwiu|UG6>C9TR%@o0M~kyg2A))~r<7#a}x~^ZWY<JC%JO<JRV;>&;yCDo$qCrxvAJ
zv0om^+*@|s&##(3VVmW_#~U6n#(O&V8I+pL%D!4Z@wrXcns}4g^DAu<6U{sA4yP7B
zz0b0zFHmM8`_BN+J!Tck?0+<Cq94R_>GrH%9<g?Du42^9Svq153ij*ARfQj)C;g-Q
zWBbFmN1TuDGiW|i6**D-pW3eIgT?2{r|-V3GSh-Zz;}gAaYMzcJ>|bWvu2sTG3!n&
zT^D_Cl~qhellHcT-O0((Gld?0Jbq?k`4g_M_mW#yb06}&bMT?I<Ex&0-iX(`dfzRr
zTp#QG?1o=%i@BDdsF^13E;ZjL^Snim`xMXmS^Q{zo4#pn-t*9p@~vNfp9q-RRgsjj
z%q{u&FBhH3wMECTuUMaO#Xe(x>ou#n3oe$bTvEA`UUR%Q-*#i=Y)PH%OlC228rZbA
zY`bo<U*L7{%g*l3q`#kQ=Qe8Zo@)1aa^Ics){eRRgg4F6d#_UCxVDD#hy2H)W7nOo
zeCh63)136^cy!nKsK%4Bf$IX-iHNb}8uRfh6vkCQp8rE-{$by&OWFI|C!Jh=F8S8}
z8&!L+&D*%rlF{U@L;TC7$1k$ES+MtCtc`y7Z_f4mIa`ZGKAAc17H}3Yo~p3kZ^pWP
z){<(M&Tc(c6wY#_^4Di?-r3id{k>`88zX9|9q})*&Y=FFu6>3*SKP@JFRJ>#t?_O9
zw8wwxZb^ys@4YKtY>JI`+xv5ygW;up1|QSkJpb)lk#{TC`Jce+-bmdE+OOn9u7pST
zvQ_jr=WhBL-Sg+$0sZftkM?gW-Ezg`QJ!vW)0f(#i&X0O%zRM(Wu5i$mk(yIxE%EH
zTX$wzLa_c!)jj2Xue{nmE$L03Vt@BZ5pS&=e^0jaW6ycMIn#u0JO7w@-KM_&;c4ZE
z`z5od-%@?^JY&PPYmdFB9;-_=jCJMNRLZ?W_<YUv?1%h9e+;*5HQTkky_CCC;-l%>
zFT0&f)XdoI*F_{;|EBnu|K{<B@_k>lyUnUkm|TsWF1FqH@XA|!e0Q(?YPu`&p-QLP
z@n!tHID`KTO<w=b&H8l0hJE=<vF++YZns#EEq>V9VR8DT=$h$beh2!PZ!_Ljp7o1I
zUFzYJwV@`z7oVT!8K!-=+@4eU<G%H!>)e-DBnOyX3-s989XIcOm9YhbOQ2|%8mFbs
z<1g!zKeBgBKUkG?zoO4q?~_Yev1;$7xz80HBh(|F<n&D5V(|91>DTn5@jsORGaT*a
zp1BTm%v9_=jVl{{)BUzwOO%xS8SgdiTAe@ZJa(Iu@9P`(xc*l7Q~RN?I#$~8;vQ!e
zSGW5-uMN1{Y&PnruTY)S*dMei#qxyZ>v-4J^DjcSZ(9BRKf^(rs+%c~%PnNR;{GUn
zyxtVJR!`Ja*T{`kja4k$_;Vh^pM`5@D>m3HX8R``V|x71d6qjHVx=;bJ-RECI1k?H
zt1AgUdCSkp_Q%0>TK^f2-<S9&EZxoD5taJBEwSubY`*KRrn?Ocg3o6x-ZrtIdK&wj
z!kE7Kk8`y{_WWmPX{tVcB{#J|bc<Pw+J)jnT1w5Y!gXw4-&@!<$$w_7oNLU!IdiY|
zU-({;TjRVa>aOXX_JEz!v^!MmcO6xmV4!_DQP!|&U(=rRht2A=HeG*L<NAo(+FN(K
zVj{=0Opelwg{K+!ym_$W)QWTLlBSzi*7#g9dF_$=N8?w=j)^U)riMZXtRJ7vzn6aD
z0pFhMOEZ@r-L<XZ`>rWw#>&c;n&s@X!fnljI3Hh_Jpam6ub}W720tPLiwZaAM*N)o
zh`;-*xAci;A9*&o=CeFho^oX3j`GkG32evm3@m;xXWYbF{jB-HYVY+8RoCAtrmu|J
z@ZsO~B^e(~k7TRp+bvQNcYHiih4pdc_0w*_pSM*g2p-ASf3Vke-^tp-T+7a%ed%F_
zJ0worz3{og@zKipT+z3d9^E&2MO@U)d*|~Di_>`z|D9Bs+y8E9MQ4hUf(pCBHj5Xm
zrT%QIcAU~r+gE$>vcJ?rzmTO%&)@d{p=k4M`JsA|XB*p3ZT0o{Zxi^bqb#s{#hoWR
z<qdxynS1l3y6IoGjLCVMcP3Q6vhBMZfBrwiAHmkVEl+;TTxPmUA}!bIL(Kcb+J^H~
zw+WVUDC@=V%t=VvU%f^0=EJ!Gea$lE3fDhx@5s8jH-7rRN&Odg)c-xF|Le}aU30G}
zG=;X;G@gGP;JJ=pbJ`=J8TN-y{8`0sTz-A$n%y@ab3B<}r~Oza@O`z>yv4=K_bhGJ
zn$uHeQ#bX~{kP6Katc2}AI;}{<#As2-o%wIUfb?ZT(eB~)F;En^AhX*Kb~9JxoFG1
z#7uYIzt8@?_`d!e|E>QFkHg#RWNTzUUcKM3)#K>tANk>3_wJmP3Gy{PyZWGrVW)&x
zrR)Z#C-WM@_fJe%8ZF3iG(Pm_oEfWD8D#zCyZr6$_KUjvA55RMZjPdmbMAr{f=+5`
zK`N2COxs>^8yl#<7v6nu|IGCa8BU*_KZdO|c6*;&y!_T=WronWdyj(qj2I87Us=Dk
z?)tx*{~2WW$yZGN=6q$3@`qcek4SAX|B$h=>|<v5hRjzR_88euEiUGAHa-9D+ZwTB
zp4@V7jLIMNA3i@~Tc%;^&mXb*?BZ9~IaQ_!AI~fEOZ?<=>a4Uy?Tmj0J7gHVh5x3y
z#XYXS?)>w*&7tb3kGo#{`^<8)qVdaIf4{4_^8=>bxpkDwD`59xNy(`((;|iY7?qjV
z8OFBFT=HY}L91mGKb(K~ZD;M$=m>wC?Q4^Ib9VY~TKncGSF54hnlMGJZ?QY>a6Z>B
zUCqnwv2Xi_yN6%y>Ytx)<f)V5CZ<&0tdlq~@^Ik+mXwlbd;c@IeZ2K**0HT0osX88
zh2NUCJ%2@<Z0M3bSB}lq_#}Ns?81zHmvuI(UCAs8Sf|v}<allR?)USJn-Aps`A5r3
z)FfTYDSaDezqy;cnlrI0f_;WqSX-pZr((Xyd9F_8Ja70sCEos0{O$beR`Lrw$q%`E
zE-qWV^vAY;|GXJar8b=px)4;Xy=o3i_EOE=?`GNsp3{CRFZ@UU!`tueU%b~kegCcY
zD>^#5JNxF^OR?I)y)&0YmwSA)n_YH_e^Q*ilJ7x|@Z0^xAJyAxG}Axw$9;T$G&6tk
z{wvR7`EE%h#v4W3+Fe!OQ5rVE#V4_8O^d<jg57T3>~Y~)-e<mk`Xe1MC;iG#>u+U0
zEFaZ(eJhVD;rNv{eKmJ<@k*<AefFEri)`muAV15Y)oG=K&I94Y;n#nOH|&wG{P>^Y
z@P58Mt_x2t_)+Y0)op&};uxd(TYOpf)%^6DCS-k>`_z$1N6fC-OfcA=b-s1le};|U
zTWt(K96nU#{jyH$;vdsxucelEoNg>HT$MGwaHejEhQ`W-ZYfcPcbRMtKRw;^_*>pb
z@y;60kGmiGzVF(~`Bi##_uIH1GaGbwpO|D?mcUjl@7Tlou)xCBWZA9U+#mDmggJR^
zrkd@2n*HtiKhEEbAJqLmJeki_r~Jb?q)p_~`z`+&1dk{PF1tJFc3g6j)h3x77PjCX
z=39G{zpeaXxiF(D{_y?oeVoDRdW|bz1jWAm_TA`4?Ro=7vE$pcl2s=gX-Lb=`QV*?
zuuk^Js(8-2llFo&(W?%AYhIpNKK&7Q^7M=+(KlwSpAjN{<H>^uGKKLA?6>I6UNl$!
z&@R6HGG&*tew~||vC<&Yqh!-O7eAvlCr<G%bE`aBG2`c5uiy0t>>Up{uJ)9D-n3}n
z$Mm;*Km305Zfec>h4qK_T?w-I&rrVouXWJo6otyvlYeiV<o`6W!N9N1<L?xkqFMTH
zEPuylTm8w+UY>bR=SRCqxO1k8#hjC$*2O=qn|aVuLT<l9-7%}@-=6o{*guSX8d&@A
zJ$K9vYqqf5m#Z3NG%at>t7L9`887lj@Z$UX|2WS6cF(j^pZk1Q^!$#Xvv$u|pKY5K
zmi|*Fz4-WvJ0YL=9v=L|6jADZD{%HjuUT<(E|ve@Z~Wy%c#)T9N&5YLraxvs+|Tx(
z;h>qFct!Uyjgq6g^4q7q=bo{+wCu{4H$67H4OUBAC!XZsd>g;~`vTK1pY+{|?#*QX
zvi^L0?>&hNU+r(2KYZR+%3+w!w)MmJQ@xx%CQ-}g1WUZ(&uiQ7pt@(S?5=kw|F~s8
z{+uq(s`37;{)KND%U7#>dh+6i<vZS*{|vu_@4Bb{w$B!}<I~gKk&`g#2t#?{^()se
z6!=N^F@Afrr~mPvDBI(Qv`_P<r8ilwTYJsCNA|QqTE=<C9S^>;gim&|`(?Fw;m7hf
zX*%IYe>H9l5Pu^isuNzFH__;bwgBTnnZk+3vfs%|F#NJwSO0X6{V$32bL`XQS#G_!
z_4a#5&R3WHLbof`Y*)xim&I(myY{97t6kf^Ngs<Em%5y?OD^X4&v5+pOPO`WC+$iy
z@9}QrU&ou$Du3^2iFv`A7YvW*8Ai5UbUc3c=YNK;D{szJtN(xbugv9Am!|t~f4%va
zduEc2*#|w2yFK&Vd5-^>F-PO&>sZ#QU-zy((7EJuRH&k0C66QHojE1JpZ?W^U;NL&
zyGQy%|B?Nyi#tu$TKNm!&ioXcHERu9^=fb4*2SLd9z{<!c0Lw$Pct(5ebYk5e7%qD
zhy6S5b49!C_;_!2a-r;>$u|#|r`z2<FBY99>$LKg`2zK4Jx}De{%QI6Wz{LqjLTWa
z-+jqiRvi6a_iM^cYwH=IPR|Wj==eQazC(fW{Pwja(*pl9q_6B{;M_5(YFgSW&sU!R
z8D8^gPyBG^<10I*Yo*>ZQu{7=%C6nOp<@5yV9Oe>jX$H@6L!cSDn45>YtFCon=_<W
zTv&Pj%x!*|c@q53BSO+cl6K8HS&}^cG{YoEWri=Z_47s7XDu)G)k;`oZrc}fUGd>b
z-w%_%WtRW!Fk0m(*!VrX@9+7&rPsdOC2d-re`>?=D@hyY9eNsm;ZmH7*K+yYPWA66
zhE2NDQFHXgoog=JnXK=w?cL{;KJP(rLYbDNIqL+rgJ0J;1*V;OuVay97iZ*}rIK|!
z<s|#%ZN}F&#s@{~&wcb+TtPm+>g57W?VK_RTl@2(fo{5)McP|~g{Ho$3b_>$eWmR&
z^ZLgj>q8$m=Q&EASX-;ZuRZHNH~&2~U-x&$fsY(BF7idQFu#vceK%#&{I{$*GKJ?Q
z*S-6&$w94ykMoZ4tv&BJC%wBC-WVBX+#@{a`=h;U$`2I=L~WMcCMl)2GeDx&&HkMB
zGx;AHt}8bDXJ~T!cQISeiJxy1|L>PYmcOoFF)tVJSJFxN(=e&}`sw>00=uXB|4?y%
z%P*LFbPLmydHiQpvMjzGt*vi8|4&Tw{+9h;rd8aDtY2~ZYF)-Z?KfM!cPG8paJzM6
z(vjzqw*MK<X|HUKnXst6w_pzwpFwTi)Xsd<Et@2+u@o)rKV$1(H+TQJtnl59l56vH
zy$s|JPrm-j`udm2&3FE!E&aLG>a=c<_7Wp20dbYLipQ@!crM>sW@US(*t4v|F=cx~
z*%#|JtAA~KroWw4p>)qQXUDm3FBX*A)-NsH$9yGMuQd9%watu$n+y8xnDp+*vv=(K
zTOF=v#(m@DPdUG0bs3#oZ!%+ClG=ofj+_=_bMv@+{y)R2ty_I{T~FUxoTuZjknrV&
z?JDaT`=Ub=_P<t=Eo|`jvwF63_S(4Y*tn-Q$8*=cD6ctv@OWPH&+y5UbyNChJjk@G
zny;MLdUvPx-i^l>%0J&)ef_{riI=;U^f=xw=qf&Vej2~Of7FNF)i+WZ?tI))P_=%a
zf7Y+*4^qS?XUtkAQnTIjN56(Z_LZYSTg}d2Tp7CCZrYD}rhDEx3b~w;=NCTzb^X}<
zEg|0dk6X4oeww|~x$rnoOWBw8yX<6dca*koOZ;?FQl-weKI%vRw~0J<$~LR^YwnrM
zer08^|EIhCAJ)$}qJ39RU(EgQq<<Oz`s^P}H2bXn#&v<Ww)W~*zh3&tybWC8v9O*e
z{7v}b?23H-cXE!qPxi>jIo>Oq;P~KUeD8mT4<0`M84mNl$Xdg9H~$E8^Bn%Sn)S<{
z#&446x}Wp?$ydSU|5~zbmbH}hJHOeqYF&g@(7#uI`p^Go=$8}v@V#lDeQbuE<TkNu
zMed@<r!2_j)yhka|K|Ae<>jrx5fZn19yFidTQ+~olcfB9@#{-Y>~r0^rn)8d`iw?P
z?GwkUyB?LCzHPZs;Bc|bB%y+x42}O@9$bIU_{!pr6^qtPPJi)(?XJf5n?jN9jnA1+
z%4$2^^`GN4Z*NxV#b-V-EZp-JPn=NimC$?1EpDde-|XjFA+hJ(xQ^{H@cAL}Guoza
z>-CITC53-3n?0(YpLKXs<OR1+td{S;{tLYvb*OCferZ33*Ku-c>zymgtt94|`Zkov
z)Rh)#M*e3g?_s|1eU(}KPMufW;=$YhWWAjyx#!rsif?aYbhhlCRW31oy+oXE@MM7n
ziF3X(@cBl5I?~v9Qu1inp4xX46>b?=zB9bFWvRANsw}@_0Sl`{g2*|3<#$h>?Fq{;
z`4&E<E#l|T@cZ+O<8GGB&Yk6SM3__ZyY}(;s*hhgRr=rLEk1L5UTyu_YKxmHmn;kZ
z`Ws*C-Eh#o;(&yX<YWn(B95aK<ww_dS?M2|&-b6<Q0k+So%1f8d&Kc{5^JO?cd0_7
z1Iw}plFf3(jdwoAJ65c^b}E+d+0ApF2Q7}VU7qjt=M3mjxr$@<t@AgVcl;@o-7`JO
z`mP|0N4Vwepf(1^BKB~W=Uc09vT|Hs$>qO#<JtZ-FAtuScc{q!*8M~9(Zp_j;pm&2
zKO|pKo^*Zk?UL>d{~7LwzQ6Ft`9pa7;tkoWpX{0(5dMjE@{(7{{nE1)H!z%#1#K0p
z{q0>59Usi!Su(Svd#XzA6{&khb-69tN0pTYs@^8QkB|9d|D!weLFK#IhrWkbX~(nb
zB}P2!3iS*Bn^Uy#Sj8>J*Jo?@B_Gf;{}z<_bG~)^Bai*Pwa4E-Ykl;ef#X%tv1{L7
ztUneObL_C)8Mb<+?1h)UTr6A~by}EH<j9`o3W8tG)_GUhf1CHwcZUBqv;OtBTP50F
z-Sf8elqojdZB;z4zPNvB^|8sn9e+dzwd$*UIJbI9%-a)_y?1Zh)iCE<(6!I?kC*LJ
z7C$tz*ZOyt_sRbZGv5cE`*1nz*~afnwrx82$-+Kv@2lN93)mQB<~-j2G~PJlKZD#J
z>!OLbZvHr>oo@f>d{pOK1NRTlN&<g$a(rJO*M79lblM?XH(s;Tk=rIq%=g(DIi-J<
z@p}8H533Rl1<F?XuAgixRnb*+%j4CO8Rsi`7$zLD+`I3yo7S0&hOs+;wz>K5E#Unq
zeAqCia@X6n&*nZo7P9$ROrDO!r<srYeXct$uh@NP*KPhcwo$hp-k&I0(0A{kG~0%@
zU$ahHOHFT0$l0Ngd(PdfO?pY=pGOseJ3jX?o;MA9A10(fQ6r>&m+}0V(iQ6y<2Tu^
zNip`^X5hwWbBwF<SK97G=^0*OW?PPD*Q(t(!}eLC>_0=5^PcavXG;Q2!X*+IS(0yr
z>(&-Z%Wf=K@a3Dx@5~7I-DQTC*|vXk<MUtnA~)yk;^@PMr#Yi1zT7_X&*~Ywwr5wK
zUMwUr@qC`8=$7q%yJQzmo_1Php1*(8^LOicCb7u!`KDd;@_HJ5)kw+M%<;rgcb3RD
zV}ldDMs<tSp3Qr}!s;jS{DpSjIo4V`<=%7UZ0gq&CDv6|FZWSj_~@VhrQG!;g++C4
zy;Jx8{m<Yv<z;r|!}KnueHkrQ?N18sJKx$hH&6GPaHL<ua_+Az{~4^7FL!?OpJ8#I
zsFIe&117_+w}-D@DC*s6@q4d)bUnx66_v{#vhJBQLq#qrB~P*G<X)qDuj3>ay||?l
z?pbq7>6Vq=vs$&vlA8xDEbphQWL3UeE39ejxPI%q2jL%1ALQWQcIC0`hZ*Z<CT|X(
zuxqDJ1BdL<YOOVoKb&}2=zF)<PWwlDy87gYyhYJ(7uFZ9KAvB2->hI!#I;LK?lwE@
zd#ml+O816GZt?sYow4?Pa=h-FOA!zI{8~IFo!^kJu6+7_f7Q=t5v|j^lng(A>p1oG
zL|X4A!<SQ&W8VZEH<CRQZtFCU<B!(9ol$n5uS)I`nAYv|pP}PxzsTVlQ^`mBFTP!T
zZ(r!8`MTF_1eMxap0775Fn%8w_%PdE=;buQ7hw_mHqClx9#T1R;!hhszXL~vJQ(=?
zgs+c?eHG;r|50^Eg+z~_^rpQ34Aq$o{}ir9zs-O1nKwM>(p&xYYLhJHJvp*JL!;t9
zL)5&O{rdUy?Y_KByWsa#*yS|Sy)!o6xgR#iHJ$tPK4{0~ubF%&?)w;TJ><pzo+XV{
zCs?6*cS%Zdq?w#ZyIb|{yYX>5u9+N*IJzkIj^8tJ>Fw<;TWU5J*f|&;JYTV9o$|#}
zjjy~?-$O2)lQ8J2crSV|!7b>YWvs(-*E!*#tFv}3?|NJOcllCp9m|sbpv~3Eg?$rE
zUZnTwd~jZ@$8TMD@Y~C@De6m7zrQHBa`2q>qQFOU-A>&;f9bR%@0(Q<TVoFjFj(Xi
z-l;QvE-x|pXr1wg_CJdExHfN`bwlJc%e4tHCM^aGDtV`tynXOq`*lF(Jf$D&AAXOH
zbw5<KXIGBm1iLx9rK^*E?>MsUlJwMoy|?6Svv+L$IOW%p3*Eg^8L5*swq3T-G#0fu
zKUG;}507xe5hjbXC5K9t-t{c?(tTB<v@5*X#9!$A!+4>6ix=%V=yl_!@xf0#Iz1b9
zpUe}HtJ&)I;IHwcsP%6q{?@Na{Alg^AY0ZvXn(lUvwyyZI#0tATPxph`Kf!e|9kw&
z<O7fQ*3J6y_#pEm9j;yHTcX|ycgzY>n&7d=h_zVec0`H7gWuQZRyaTG>wMV#R`0XJ
zmRh#xYx4}3Eu2u<%2vK(;v6@#o|UXs4Ml$1w-2Y4Y99NLYgV~+L&)tLf7brk`=5bj
z%15b+!ms}s7_xq?^jAC+_;UM%S7PhuOi~knB)wH$U(WZSdY_SRUHy;q-#CBV{qU$>
z>E)KUUUpKR`pUa5sst4jO2z1&U2~izrF-dd(Z9wOuMfzJ*#s8sl5hGdxyMrYh}S&_
z##x+;^DJ*T>&#SnY{5LwV|~nr^26Tq`KNaKUcI_ZVD7V`r+06&ImJw~w_{XaUmW+3
zxy!JiclQ4EUyGZz1-ri9Y(IgY|Bu|?1%G(gn$9tFe0bbodSvO%+`4m#K|48ZclmKh
z?>v~q9>*y9)&J1_8*ZN;ZCPLYsK0Ah(y=#E5qk`Cc`hIGcN02sFPh2X8I#pKKf}LP
zKjI(ycPL${e`s(e$K>Sut}V$qnFS}>72f23DRT;6$7#27y~W4l2kqOe<~J|9P!szg
z<KMab`GHN*^=6k|Y3~froTS;M?S7@5sc1<FOZciE-GUn1#ZUd&|KQFc%UYJN;dWVn
zC+%bUqxg5mm%nbu58Rrzvbu83(j8aQuBP_RbK8D*!;(T*5zp_pt;Og4RND9N!@uoJ
zx6dgQ8cjYJJn>k?AMMY}o_{Of-}P4Yhx}uGp^B)Cr~PlO!nQq**bs4}-}F+Y>y_Et
zo*bK(wX8z5Dm?wsPx}o2rh6h+YVseh?v+3OOK+n5{2E>6%<ZS8k_#iIz6)}fJP^t`
zzmBy=Epys=LG!SnJ@boS6wK%fXji&eX7^^twS|Tf-yY6LR`_Q7dhV_(ZxtKoMT*w!
zi&o!ev3^dC`s4S#R>xWk*Hj#S=-yRhp>zH0l(^fjB|Z@+CI%ggTz1RxMKYiD0-NyJ
zxBp$K=ddZ-c=X}fdjCl;@BgzsdM5SU<t84#Acxwn>kXf(F4TRpb&Z=deb>45kIHsd
zuX`EJD{d71sgW}%)bYf535)Y;`)B#z^!vF-{I_SuJ-rWa_qMHE(_5GAEo->Xvt#Fs
zj-Y4nQZv@Pecb76(^oEI(5o_Ys{a@D6+a%k<@&w59}v6yVOiL*a!uzG-@pB5kos3#
zCs>pDk^P{&SX9NW3$CkP24)Gzd5XO9x^p7^+!ww%8yGZo=gvHK@o3%Bhj-28v*u5K
zRTD2{n_O@FOZ%gJgMP`;t9JS|iC4~d{)yRUUgyk`dby;7cTdB?B~d%`H4N<c?kc)&
zF8OnAlHg(aPvIXX@#@;Bv;4Xv7m}Hs&pu7Xvgc=@sKVoC2c@eLo}2zk{;2<tEA;Vv
zv0LYt{;~MbyT4UwSMQ@~&t#oExwSvM{-&=G_2-m_9^Z$`Al|yF3ZZk-w_oNwZ<M=v
z$>K^rOMY<UmFLz~wc6iwY<EUQ$<Kbguu@$%C$VDMyAN4G(UDP}Iz~$hYbP;X62Ie_
z#I@{=x<w9uaM$Y^(}(q9ajrI2v700kRDJem_DOe$I;!-xSMxl!_H#UN+@@-NU!7cb
zoQmhUxhu?Os;t?c(Pwd}vuS03$}Q0o@0)IWKI!_@_QSd`H#@&@#S(L)NV9~JwAM!~
zPdhD?S&IK%uexd1e(W%BXxNll27i<n{<wVfpF!L8(5nv&Z!X-O@s;&=>D9e^7aGmv
zI&?4V*b*M`2@FRVmdyHoo~iDF)V;L}Bu(pCGI!1Ef8c%phsV2jo#NuFrdLgveX6;-
zUnh3rlfN^W^ISijd=Sq1ck#pht!7sDTS_b3Hp=Z?;*p=Hn`9}}a6jep<DIv<Rd}9w
zTFXob&pfqVPIRf->{Zb>;=NhIy+w8_`W`uT>1Q6#r2Xdtr!NfQaC>B6b-h;G)B4Me
zFA006)V^DO^*_Vb{YQJtAJ;XS>=)d+!)@!@({|gJ?|pNvlVw`?_ktLAk#e!6i*C*?
z5504Hx?J1jZ&@GiZBG8U{o&T5Pd9#gTk?BLC38Nf`J|h{n~V7N2;F~o{a|PHqkf5O
z@i?82O|w_;UcKKa`e~PhQsv|(2G=fz1sbf%f!k$zk4*kH{h)q(ob=T{`3vsE`!CND
zJNb-zx3!y**pZ;AkrTOg6qTKjUN!Of+W5^+`kvd#-RN598U5An{)h1HI*r4>E&n8c
zIAbNd_uZ6x^7|^@y-N@2RIJFGDrFj)tQoUWaMI2P`I3*nW*^_Rz5D**`}|+yg>K)z
z_3Bghw_Me|Th0~=o!C|TQu%C3=ZpzP_Z1kP@H`OyDgAgo&x<;N4{e(lzNj<3UL(9T
z>s#^5kC_{e+}ab>bLqgF+`4l==L)&F1wJ`9Y4WEd<{Q|zHh<gr<K`oM{tD)!`&4Eh
zj#|ulKkCZcweR+wToa*n`%c7xQfu+du!|~_+&(?!d0swk({Z_PnhzgqR!8|yeP4g#
zcaE-~%Vc|p`oy%h+ut7ln3|{}u;KC+TcwKB5T?-RyIx<H`5vD;f47guai707?GIH?
zZvW5FWb*G~)!VlRCvm^5Q<*Wr{kzTS*)tBDda~_%&NK@y{#3~|_BXY^^?YbQAm3-F
z@#F4quNSlSx7(OLert8vchl8p&A*-4W_#`2k$EZf@|m|>$}s|$t#l$4(wC;zaD1G8
zc>j+g{bT<b*k4+0ZHbz@ZuaAu=Vr<tVaiyrcjqkcB*pOi8y}WvIX&K<^(VXY)2(^8
zN|pBBz7+o1``+(){~0>JTX20WnUcSDN!_kLVVke6wPUW)z0krQwtIH`2Nz=_iMQ9k
zhns!2*&Q>1>1WDYmdUr(_8r-wwMn#d-+Nj9_3_8{Wqtf(_N%?wPRu#m$YWAP_hDAA
z4VEE|OIfO#H#c9nezEw@ox_G<9SybapVpt=c;~Fj?vwxAuUsgPl4>;IyL?je*}mGp
zE7#vT{2=w{DbX;g)>UoA4HBIOo^RtGiY@B-&98oMU)|r;>xA^1gnTtqL$2m5QRQS|
z+*2h}TX?i6aM{nR=eC`ny+65Q?fpk#OZ88r`WkE&DSFIn#FMhS^juY4==b#QCeyWx
z`Z)J=6n|ac|DPcxWKzA@EAwD6{l9a!JU^RcUo%s33jd!HR{O&fEPg#cHi>2X<xiF3
z8z0n}zTa)zmwDIk%<FGIEBw7$=K03#NZ8#dUotWBUQX?K``!|{!2ehN_1LNY;1B)5
z|3TPk=Z|3RdoO>PKHX9##<7xTn^c7ocem%mjh%Ad1`lR8?4IgzzkxC9V{P!!e-@Ya
z$lc;^s8N<Zx6y8MetFut4u$BsUY1GyDdF~+u5EY!yp%taap#c4u62jBZ~jyLQUB=t
zQGUUfQarPgws(JNnH_Rb@9lcUO}n=@EV_MK^vpyZy^V3k)9lkDWjO?Q<(*uAX1`2L
zz{h<HW#-9$Z0}mThPP+)t6RtBFNs@oYs&Wv(>G1ho+&!LNOez+*|}v!GCz+O^3*pJ
zP3>CiCOReD=-%($xzB&h-{Q1%>b$-6tL1&O>v{H6KB!i|Qd+B;qs#MFd}jW}wO3Ex
z5jQl}V)6?S?h))ewCB?=%dKmJjvsD&{9RlwWs-79qS*cEwr<{BzxyAq?=(4U{$T0-
zrW%F3ufFDoKm44&={1wcZ`~yw`pVlp%og2sRj><8x~MskN$p~Dyy&Z2-?|^Y@2onv
zcEOEXH*VjKj=I&qvE93T;&xx1jjoEid=HZO#h%|d<&ng(e%UEw|21AqRK=F^etG|&
zfv-x$kT2^})P$o;{!TIzJk}-t?q_nw@rQj`Pn%*T?*=Yq4OhtH;gCBbwfMPi*WS0U
zMS29pnJrZs`?TY@4<{Ez^t4HwSfA+hOV<3-k<+$ckDuFgEaK1Z)Si_R-`ymCJ=)bR
znOEj6eSn+6C^@Hp1q;`6*#}b}Pg%g~c#wH%Ml{E|Jv)|$DQtV-c<gfD*OnD_EvIVv
z?wD>oaZuKH>gt^iZr20f&XJq<^~9R;Z)LA}^q<*PZMR_m_-xndqLdcysX;dmzIVx-
z^DgDPV2tg|9>szK58D+AufO!WbaU;@q#42!e_czF@|!nl<}GF6=PJj}w9Nm($+YJ7
z{b<HdyV=g!CC++t_~Q4;#w%@g`ubjFoZY?p0gv$Hn38pgo3xyotOW0EU$55`J>!|y
z-3m)diFHXY-|8*;l+qS@;((#i{68fRKF77`$y_u%{O;nJyPQ{#oHFNYs7|+7KfC_H
z;ty-j{}J;4)}F?ae)vg$%$gPMuaDLS*5;;ui`{ryb@#f0w9ezN80Gs4<L&<4JH71A
ze};pG|4br0F5Wq8x^zhptKyV3(*xMTel?#k{aPnsoi6hJR{Sq-8$X@$1E;Uq{|d72
zILmte_6;oqu4wCax%qxyZ@mf^wx7sg!Sdz(@mK6?YyBU^w>}U35dFGNYNMyBk>9En
zmTcxekN-~MWT~^ce&+qd-uiz+8Gp=IMW0MBFlXy4O)2?%e+IL5gIhR@Oc94I$N4W)
zc|x?b=TCT~VXAy2_nP<GxRTya9mUFzS0<G`{_vmS_4QSMEPKU+_U?@7xOB}!;PWKO
z#x(n`M*k1T5ARg_V7K+r>(#9;mzQO*x!*HPE|hru-azub&yVurecuCg&fFGYxl>(y
ze&cz&KVgwQ@7>Dm>g~Jx_?G^b%@)tL4wsp4q`#cy*R{I!V*TYSJRBX4Ims-PeDHbq
ztLj-7+SzU$FizOAQOLvc^=;8ljvueyUEW)oQEDWiwy<QSf`oNgSZLVs9KNkjQ%aty
zoApn8P_<|Ciun`2RCay#VRLZV@b2XCd&hTuS-<u_L)z=9)19u)62A1#u<h}`$mU<a
zub&8$TDf~;<O8kH{T&+^t9a(5+ub#e&-=spp>E}(jO`O+ZuzI_>nRzYEa+LS_u}*3
zXbFWc5|6vy9rG-Tdj9fC=H}P`85rK>hPf~>DBJBVysW<Abv(zv%R<io88~nB=lO(B
zS3UWkVcqKO^6^=}H$S{}Qf_Iv=rJLW$M)JXhR0>9etlhk{y)Plr&nS>78Xi1&v>uS
zw|A#P<M|EiXRp{b&s_Yhj?!26FXjIkSUMB=-?%TCBf`7x_1h-H16O2=e@vY9x9dl!
zX7yT!^nOkDe|FiQxc_kmdDR`3lSn_HyCU27_}`W^`AhpF>xAwY`L7VZe#)oTT<W%7
z?;QWNCm-j?T72vJ)8Fx*Au~4Z+xc%@R~HHi@=wj<>SME+dhqeevjH1-b-k0<3tH#!
zFedL`DgRsJV$Qz{zb>};z2Ub0Qzn^fa*dj1O`*S+OPKy_7dZZR(el-Q&R^Vg^WQt|
zld^w;kFD8oSooNQWRrWpe1mnp*QGu+bJep~S{N^7OmaPc)y({L%+W0;@`B4*zMs?f
z%}+6InebR$()8ok#N?ZP&x5uL`F=VnyXSF3&CXfk@*gBcdj2yUSY35JU^~OsBjy5+
zWu|;)w}0yr|1(@$a!W;z|Foj|sZrat*2(D^9%pIpKeT7oh22((ths#8E(bL|D-@l2
z$&mfsJFfd3Ia0ScO){V5TG-T2j!6mbUU7^2_-B#D33mJr{#Da1I5NH2;?}W9EmERq
zQo}ss=AYp#Q|CRK<es;E(xMGE<*SVDJe7FDeBCt4ZMT53$x~1HPZyp4Gw8@)oAKg|
zsG8t@Wi_J{h41(t{<?PMyW--De|&BF7rPvnWHY$&{&?1d6i1yyj}@lI?vyRyd>t#c
z*g7ur(5--zPX)qzzC1{2j&Kw0Gu${?r|7_j_~&u+%wo>UTnM}HuqHU2=UecBr)3)@
zZ9%gx`(^7NY}~cH)x`fseawfnwX1KruKh9Tx3jOhUpmvPr@5vUdU|pu=e&-K<ejNt
zV7}k=cgpogGkm4pxvk_lnfuR#Kal?;CVoh2d3T-GAB)R5NxDoguM3<yGy75atVgE4
z&kM8<Ch_t66dtQP+<5ilmfJ7i*WQ}vR-V85)Zdcd=byFzwtII-S@!7;jx{pVtsC-l
z@9jPCZ|cV7KNkJ=*)_35dUvmp#V*|?mmC^4p43s&TJn51^UL^{`EA|y9q+b8Ygbq9
zJ6~|^w2pCy^Az1_j0d=O1o`=&vcAr^@`w9jBM+6#w4hHWUMW2$sS_rI7zFMp@UY&=
ztnhf&zpl1y$xMs+-C+-Jb^i#pU%zMJ!}?p%kJDQu<1WWaZSi6dcvYx+CNaEE%3dp>
z@WM>~ecAW^*#EBk<G<kw`>m4b@NFqaHr|f$YuWJPl$uau|GOuDv!AWbZ>tL1U9}-2
zKiiP&%rZ@m;O#16k_r6#vd_LxzVIe}lJv}_8%rlFwpp#T>_K6xiiqXGgR;d@J08Az
z@u=9Fc}8GZ%YOOK_F*ObKQzTAiOd(voW9MXhF{m^h5JRBiC=F1xV|Yvew+TAm-Q8<
ztMdii7u_u>SAFyBy!>6k69?qXtG=&4vR2>wcTHW4)f90HmTB#Lb-{nUB>iPMWq*gJ
zMgNuUx#X%oQ(9=Zn^nT<gvSdd4?f<SY%{H8%f^eX=L$EJt=sad-e(@q-}N@3kE#Rg
zWNZAre@nDo@A6*pezD}wjS6#P+v8fN?Y5rZZD(>VNj&_!Rn2w5w<SBa_Z$hl*sQ(6
z?dAmcW&BI)bq#8wKBi7vQL3$5^w@XDy|eqoe;XzpSFc)sQr+^{Q;YR0>Nx&gh!^|g
z{P?Z#q4KIJQd8TOmy0f(`7mN#vGS*XsXIMxXPjVMZ1?>7^Wr>#rKg^sn!E4w3!{H}
zJ<C?QZvGV&e|!Its+z8S1|R;-UAcSX$xW4O?|fHhIKy~;oA!(T=J{LF+y9x}SDiL}
zNqlB*PJhi=lZl(mCmoXQIN5e*y@q;GW7nU_AL3@}cl>Fqjug^ttnHtY9`lx6zT(NJ
zrMr6Mrv8%uZCnxT^Fg?+@vt{*@0+}cKWCrC9#mA{sLWWT{ki9|%0jN7m0o5Uf4SLv
z=gbO9zjw*gAjh@jrv2xu&i@%)?bkZpnzk~x)zH!6Kf|)38Mj|=bL{_9wPDNMH0{=j
zhu?GE_B_AU?$<wt{|vhis-*3U6ZyUP>f|u%&YB=$&sM!@9^&QF)64kyKPo2nSDo2%
zE$mlP&J)kd2ik1vAJ|P#--+QUS&`cQH0iG6*K?UV>nAzyEA@1bpXq4xOKyME&cug_
zj*BnsyIRyP<l=Dr^3sxBp@;uACaXU?{q;XX(GH2P+!293zFIQ%r`1*J@9R$d6&{^f
ztTJKA1)n}k>lB}KWtl0;@>45ztXR@FD`ontwu3E;)z@FRR=P#VJ?|59!wJXlqMPkr
z=ANIKKk+|<&mDtr4_Zy7I<9gFIoK`!^Pj=$IM3fltGr$vyRg+G$AzmRVygeXi)U;0
z7G@VFYda;MV0qZiWqkf}-_)-r;)1?fKXW7)ii|8}zOEO%zU4FPy07XiZ*PBn*&p>w
zE@erd$;?Odv|PNat-AxCZVBg}7RM*AmA!Q9{-gt%U;emX+f=$&=T7Ezf#Zi)y^FnT
zu6V~PI9FVwXE96T(W*;}=I9ihTO4HdWUtdvwveW(FDp!c=JxeJKf@-L;gNXo{EWrx
zFU+~d?bGDe7j}%3ZN=+y`H#vw0_p<H8LCn}l>cPUiZE4Aj(9Z7mg&*Cdm*Xv`Z9vI
zcFx?g+TgTG%k~^iWt*>WFD>1;pO?vc{=NnO)bA}X7fM*4H}h>w@FA72W)ahqm4mkA
zn%(>=YjI+d%hK=7pY_-(Z0n=8*`z+w%|1LaQ|fhZ*fEd&SK^LM*Ziy}EmyVgQt^$h
z_Q+`&Ce>?Fo84}*FZbIr?Zc*9ZqbZPJ>@U#*9t7P*q33=d(}72<NSpM`P?r*WbBe%
zvu#=clW5Ye9lU)z(~Rx>mjy4EyBhScCNaNaR)6Cjf4k0tBhs^Ly{?*iTh8E%et%FW
zrGfpF#p^!b(haWp3P#KCY4^?5$OtVrX-M9`v?|1~^zpTSyXH*Qyj*o-{^5ARI>pQ&
zk9(RIO;-PyxlMYna*)|4G1-V)_mA@(vK30VT<?1QpVp5sfA;w7IHTWrGg-_wo#vT*
z;If;!rr^ZVyk058-)nl+FMQHI@g*WpH-}+UTF|>sd>&6{%(GqjPvvra)Q2~_%9aWl
zZJKbfSTf;2ljLFzk8dhH-`1D2&+;@`F5I+_PdDS-{fGCD^z*;|wn44^k$3iu$Z0yd
zhrAW1CnohBn0DYxg0$`Hm$qK#KE;YXd+vAD=7i`GB{c?CmJ%UN6^ny+=gl>+y8gUI
zo^7A>t8EjaD<->d*<YRWv-o_z$fW*9@_TM=nj=@F$~*DemM!~RjemrS#kb#6y}CtQ
zNKz&;&U4#?$&;TuS53cY`F6L~4F=&mwY)O7`L@ix`0UC-ukW2-&ow@LeKz^1{Ozbu
zTbeAMIOpa~T(#rQDwRxu%B9=B9A013l;tm4WBDWgQEt&~pQ}NhQb&cJbaus>1Z|!u
z$dr;UVX4q2@yft0`#_EH<GbaDZ>^E)?`eJ&F3>6bHeAfX?3z}D$*h=9V(b}~W(yt9
zGuxETx_<0F-`{Q3>v<0AZIs;Z^w@9Sy~wp4_9kif9!2Cu&kNCUX(({ZzTBtOaw#x#
zj`7k^@8k>b>v$>-zFl{`^-s87YL|!2MxBn|DlA(nC!dqFJfYCUZ~C|_e)Aox_=c1Z
z<(>cJU(C8X_2}l?rxZ8!oKQ@?#W2^~?C%ciGg;1`=Y4&(OaHCp2m6psv%No-t((O&
zc}Iuiy4$`>PNfD^IG1c>FR<k4sdYSB<=ZxKq5m?+WiN!*K4=n1uD4y5>Sh^NzEOD{
z=lSJ+npX}lUlVaP@@Vz(r-6Ta>yuA@@ih5skUh)wvsFjr*Y4Hxl@o3RIH?@uVZ0-y
z+<Y$k^XkXb{|Ik;9N4+X_=A4b?T5a4^=4P@EZ99EHb&@rl8RB(o{5`Td6;F_ESFRk
z{mb$vblY_kXPFC`->c^K^mGVu9C`mtrd>$$#q1*QWQlW?>lHs<KRlO7`n7embwtgg
z1v&+ZA;OoldJ6l!j#;+WSnsvW$_&%mwbj@EsrK>z3>*J596!&RrN4aL)YKI-rmLUY
zJ?YdVH)hM|>Kl(+o|K8}Fdnz{t&H!e@%-)Z$M}-4`;X@3+5hA&-zeF6nR8ocQr+Jx
zf+w@s|89AICH(7*ecV?|q^oDFiF0?Hd*OVivZ7ysP{1jxBCGJO?0*uMOEn^uF06U0
zAG=+$<fCq5?%PR6mC{<z$4r{>?}M%O)k7b*x@TPL%Kr7Uj(v7;`^%-jw<rHh`B2}#
zCV%2PU6)-ergnP1&HpI%`)5U}&o8FBsh1;b0<OK?Dyg))Lig=#F4lWL`D~YZ9Qx02
z-=XUI`{_siGu$}-E&fL@%dYuH;`uXPuH3ZG_1$FNvqvsAe)?&?%|2;|TbS}R6}{ql
z#qox(;y<|WXUi75m>thrYWY^up?-68mOz$9O#jd9+|?@PF(r)ph7&JKp1=5T$7$|W
z<^7K;B=&S|F26W`rtimK$7!w`ryaANDQzLv^Ufpq9Jl&^hN$gNw|x-rm@cQVx%bbF
zZ>@W_D+q8X$R6NnzPvB{+CJ6#gO>jpvhv#}=|0I{cK0mLe$7euo*({fv_VqP=6=Su
zO3vp=cUGwHv--36@qY%knz|37EtwzX5B}5Xy3w9G$7NUVI^)mGX0uh#WcPnNHTm|!
z^@|QYzp!dj%jNy|DveLRnQ!Cy$M?7W&8%IwUSE1;zHsdwlfbjvqBAZQw|F!JbT+YF
zQNBJo*8K2)2F8p!`Hwng|1|pU@k(qyYx3=+PI2YG;A1w+8Y(AleiyvQ;>N|cC!cKc
z58DgWUD^~~QT5#CcZ}}uquDd19w}Kcc~{D85`Ez;*gU~4d(%ZbHGe7Tdf_a?H8Tz^
zDeGevwVAWngH!h3d(qeR8NSw@)-qo<%?jMTe7D`zEg#E!{y2)<=c!R$mHB<wLW8?6
ze{H?{{9Cd&kG5W<zOa1i72TM{oAu7y>E4UTzvpJWkLmS>EGxI2kFr4>$f$mi!?NAy
zW!HpF`<zwPa#8p1)=dl3X5D+csPRUO_#`&rhub_>?6-WePkHCZkV(;*R=W2VGOhcz
z<4D#Fxm8aD`}Q=(mbd;>%8KWyiOerua{tbc;(+aw&ulF^v2)@v$*C$r?k65hS~Ab@
z*4E`6%T-fCUW7z1zER_FpZ}lIkJAsozxnuJ_38f%vbQUYYSXlP^^V>9&)~bO@k#5_
zS@-V!(K=YQG1gt?<H2oihKt<}{?L9C&s<}>{*Tk&rZ4wze)hU(BmJoQ_UqR_x4gb&
zzt!~pTj}o4#f90aOV{r5OtPy~ob>F~C)Tau_tn_4AMAB^zr4=W^Q-T&Yro9*?GnFs
z=``=DxVXEzw_|lCcr5W3Y5X%yLa<Ysx%K$1`J1;N=Wp82Xd}M#$K;1^uI~~*Dr@xa
z-Mi0$R}#&|qW*}7^B1a3UlHq|I>Vv--=jw!hi{)-6uU`rlBHd;?IAxAp~K77&&)sf
zsl2{!fA6naF?M0`pwDHO?oX_Kz~5(|5iNh){h|4rwfaX7uX-s^vFgEVDZ4)2V^bHu
zvhooR*Ud~d{d~SqNBimN>^8$gtJXhtS+nBhU%%t)Og4$mQ<M)fOJV#W_0Ow5f!8|p
z`u_a$95un$)OupF&F^V_WSLbXaWhq=+w95&%_Diw-nshpo|{-XSHAz1N7nX9&oT|T
z{<O<Al&n8h<I<CvlzG|v&E1!~ckh2vJD=y|mBniJ<3Cxy$WP4t?p5~OLZ!a7a{62G
zhr9nXNd8fga_iZb)4$@DrKHT7)RV_T+v*lDztUc?>3Yr2Los>>ELgsrtvvr$f3;`g
zhiUh`U6U2BuJzzlKIU;#&m-g9JFAaBt{-sPRAkqCaM{db|IWloUbC@(TpRt{?Z_?u
zH!m)q;pvh5^XBc($i5K1A94-J^B3DGh;_U?Fz4Owo)v#wYmWcctGIqtPWj`$^~vi_
zTsknT%2WDXy6>ZaCCXN93Oq%g=l9lHKCZ0!ylmw^=^eM_-9%qG#l1aewf6Jfxl51q
z$b7ysYmKVy0r_5|NB%Q6Uf%vZ@|oND{|s@v=3G3oGUor)zgPb*H+8Q3ZEfCOr&`gM
z%YIC1b!C<4mA>f$@v*i$O80tf`EkuNsmYROy5Mc!8D?hOt!(>rul?ixvF+DwzmI%t
zvsYxA&Ds)Id-v~|!aMiw@f_5g{yV_9cG<mW56q5CH#*jG%%G+5wVmJ(&h<6AoA-Z=
zKaw4pc4=$Jx-a|rGJfrymG$ix@0JN}-*@Z2otvw>Y{sJ5E211Wu`-FtY_4t3e$3Bs
z__x8)hxG#PnGdsjgN{nwIuPM0<aC+U{>8Q<l7HIVw4WdQRH@%Mca`>!vVECvR8}M=
zpINtGe){8uzkNlsZNL6o``7sM?IU%{AFdys&z)7La`l~_-rAC<pYy^Zxhp@V=oq~D
znOvzlajIg!1mEEdw%H%fJ6%cm@OIheM<&i|?yy%cZS6iZ$x`}=kJEb@Rv`g%R))l?
zpWAy<`;YxIyj&;gb~1l)Mz83<g~A%ClRk!ci?~d<nK7|t`Ho`gQqeEhRzJ*_d2ydN
z;bZT%_Oe@LNqzS+7TX2COX}e6`I*IW?D_4>J(G;T7H`pveD~FsKl6Q7(XZ7n)q^)*
z+Io|x;KX`swQJUUrUmRTkux{2c;9Dztt(3)HhRT2A*CZvgq7ajv309Fcs|H-_2nPc
zaUbHA7ccm+QN`E)dy!B4juM{PhR3Hd9(pkE$<xiDPqqu)Hd)oM!a`~Da#M|!u6Lzk
z_x812bLCmZam-3?>&|>b_Xm90EgQ?Hy<IlZYywyD!MCxYTiz?@O#W~*pR3$>cDmnn
zo(-JhjGZU$zP+}KTXWxq-B&)&)1J7cP4c_sl==Ft=l!ztZr2nx><EzfvQ~yKE_=4P
zpLk*LAB#WPc8Bh);5S#<E_Y~hT1eCFKJK(tFSB(j+rm$#so$t7^b*{%#{9#!+}FL?
ze<vHCa4>xEZe4QL*>sU>OCIjjsu%pambc7wx@UGqjN6&RldQv%*|%Sub}iB<Fw{}D
z!E#-X_oX9=*QUF<tgX+~KAl=@;$z=po%^6lxc}0g@NaK+*1G@W-2AcP^!GpAOhv{M
z^c9|bj60vTU3k7(@TA3Rd(yw1iMRj9`Sjxy&;IFt+b1ypJA1_aSNN45+0tnr>Vp0=
zTuQ096aMe1e#C!<mmYr#|IXA+YCbSo@`Cp>Z~IV|)TIi~?M}xl{JSwdQ2+Q{wrdvC
z&rah^oqFJOip#`>MV=O12DWWh;kWBIZ=J=@Fri`cvt29C|IYn$wyyHu)$jAO|E@{8
zbT26Ev`>%0>kYfC1)E>?{Q4LAJB-QymRH>J=MgjRnb}DF_S(7O?@ZPiWj(K~diuN`
zhy@oMU%!xpalPn|K;grcD{SVQq%kmkeLm0d`0~BApC9>i{4uO={^d4%RrZ<{xk{5*
zI}-mKn0=0o-{HudKFf32Ph|BER<XCMP5RGpxN1^X*`@<7liW^8MkF*isPq}%mhTsR
zd0M>2<WbFZ5l0=JzubbwnF;3U`hx5-#eY^mv=>a>6S^jO@81*e=gge7?}_J)mtnjU
zI5P_0A6(y6I^)lM;jGDh_Ltsq9C$95U00Jl>wateUi*nZ?{oYqwH1Gr|3ms%_&kZ-
zX4luKZkVj1@oMo(<;}(C_@Bpbp1+Cx$l7T4AN8w#)KxsbS`ztQIpe{^lRe5umNv;h
zIL~L;AU$u{e!i!jDa{<WJryRg@Bg~~Qv8kXsC`>MxNXeWKQEN!pjO}NBlukMpUm@*
zzpkg1x5u5IE5G9D*Zg;zzltCJlo|YE(X(8^H19(36Y7dfB!8cZkaJ)7x^K_*XZCN|
zEhj(vx9*hZ?G-x?JpbXSP-heVQoZT<uJ%BKhc!DN>&PTFYH&X2tJ|yn+4=Fk`#)l4
z&9Zp#%I`tx<NWJuYql#tz4GD5>AzR?P3ryaKlqg0{LS~nQ2Z%dY~aT`)32x{&p)?6
zc%O*(zE?l_|9pu1&+zv8)9ZhPCnjzG+fgTPqmbln-6<{kbk@5hf1Bsm_WRih7*y|d
z`Ti;R)7{t|5=&LiZ#lj6-&yW5_k;0UzP>wu%Rj=WPhng9pQh#V>!Vga+&y7e)v9d|
zdy+5T7S(@im@9kyt@0{wO$95rJ;~2Bc@qA`P1zM=cF!T=oYCT*<XihyA8Adj=$iH~
z{pb9}sTaR1zv!EFD=l&{ht&i=TWzmGOI0_I*B8Qk1VvNT7p&Dc-Pn9C`|&HUPqs61
zG9nHuOy_tme{NSroW<kApV;cP9{f2r<Bi+xSuac;b*z$J=T`eSyIH7jm3wh=O27Io
z8Nsc7b}eCd3TJf7d^)v*eFGP3u~^lW&3?J3-k#e2wClyfD}n1;a;#dPZ@(-0)JuPM
zaCmX;=E8iLoZ^iIzClyPEPGn!HrD?w@vfP;?t<~lkSAxBOK;rWf8grzV(WR+Rmzt8
zct#f7t~|bSol#|@C&$kwJIjMCa&x5a@2<@KGA$(caZ;ac!#c^<yL&z<3nb;PF}%Lq
z^lj3tFpCwtm)&e$dz^R6T9p8epY6Z)UYu9)swMof_#aWFSC5@OzHeNxt!&EO8Q(f@
zOyWATDP`yLBo=kH{h6leTB6R$1u{~9K)aL=-F+oc@%}*J+AZJ3&M%9xUSjRRC(EE>
ztZA=laja_AuX*g@$5ehBpFQ`uO3YsV-0J*w740FnRwPY&^sdl2k?o$-^Bdm+EY%mT
zm$<rC>bIY_!!cF<-I*sW4@$m19>2C)`PDr6c^YrmFUl_MFSENS?e;2WQqhm&mnSi-
zE7Ilm-0wE++zW5Hx_Fh<wT=q&vcJ!<Q*?d3^Fyd|apRBJMUKmB+}b3ra@VKdF-W*+
zUuD3?zh7-@p8AJ-DdE}O>34n_PF9lhD_X-T?>OsajqRej+K)u6j_C1lFF!AkZqruo
zc8uLZp>&;h)Q4w_beHV$UCYusqv5cEp$Zd!O!?Zq`%T@|uPSRETyaz8>i32}qK`Pl
zUPX6HO3z(XQPa*M$5DE#-s{tSu?n9Ts?%NfOfxOs|6N?IVw2@dwE{M)@Qe33>^Le;
zKQ`~#@}Gg}haSVHyB7BqXK^GoiQ3y-GCgu({j`~qjNQctY_1pn4*hq^>OaGqmwc0c
zo$oZ+TlqEMRj^;ZMYQMk0=KDh9#6v<CVZ6LAz@*`zG+&rmuaZV*L359z6VbpcmBNd
z-PZ`UE?ZCC_eyiD3?~Wo_kW-A`1%~at#9Qw-J5b<UdBdh5j&^arp9}=x82MIudm}^
z_<lU<)7v0Z@o9pLJ!^LUT3fsEw`$~`e>Oi{H{Cz=c~5Z7CGXSu-1!9ym@E$5K3Dyu
z^x0mUWAQsDeX5^qR~1pQ#wY5o{guC~e@OB^nWgiq=a~1*X^|3>xD6TJxXPY)SY<c$
zn|#wdsmoE@FP7?m@jmNz?_=`z*-z4^`115h1fQQF81dHTfxL5E>TjjUWpf{{-dk0A
zFtVl4@Hm@#rl)-0{S)CA<m4|txLU*i(6{bQ|JL;#da_S#HZxoEq_22TdbZAawyRUi
zZ2Pc-`c=nQS7ZmeY${1TkghKAq(pSp{ERuvr`_%@o@dzjWlgoW#pC+B32kXA{7(M<
zUaxX=9`rde+}^#8w?<`F)VwFcX;W`)&e(RU>Rm!T&y}!k8z*u16h?DzP2SqR;;``U
z<?+v>mb38QIQVF%)*~6;hpa_gx9EI)>c${beYIuZy!$zt^Y-?y&2Y?`7xyIjgng@R
zVw0!&{+MLDtxrN%&A#$_S?`kFGj4CuI&NJ!@pW+I{iK_ZW+m>QCcX2~#(5TZx%gxH
zwyFd^jd)OCX?Jz1>bh3XjIy$qEStp>_^#ZYH`i|J>G(TQnju2IQf3~vw_g9qC$(+O
zQup0v=eU{$<>Rz_uSywPNB4z#FxG8-b*)OR&*S*Lbk6lhv+a_%@7wNaI7z*AvCdx3
zQ$m*ZZ?4atT$?TBwqd%!q`qLC1q&7a9DaFU^lrsIiDkX!b#IzP3a^;w{9-;^C;BJ!
zN56XO{*3o>hacvaM8-tF-p*}wu;AmVH48)71$WJx@vu?i_~UOf=F?A$SGc}eS21&+
zZeYwM`vj${w?4h|E|FCDbL4~7@5^5^^zR)CohTtJ$=qjuer;Vwh5fgl>(6E!{wQ^~
zCN$wen&msz&5Jcol+3dDboMgiNx62leJvO4GwPd+a@vm73s*R$u^855P22zdjPJ8A
z=Re3<U0>gMVq?g>3A;Yo{F0n2ne{aJRj=8zw>b#`H-5Ug)qA~q`;{qp+UxVC55wXG
zOCp8y+xFxx$PPT#+Ed<fO}Lf$DVOREZ@C%lrZ2aP|GGC>rYQTL{LW8HVh`n7h3xK^
zYgy-D`@y&7oi@M8-xph|0#=Isy&3bO#=Xj~y{LJ$`}V$@tF6iw3oY0-=gp0sGU@$Z
zkKdQx=Qy3m@_keEJ4LUv!pkk$Sstu&zqWq;#5(VnMMujFk575^T)y#a(QRk<GgTsf
zJV|j3iIGxA&re@|=7mw&gF2h^7uu8hW1=Hk%-N?%D3t!`&0e-<d$x!}p3$zJUm8DW
z|4iDp-1VKyD&^f<dR?b@**A*RIjziE6L#{zd4(tcL^j@GI<nm7+xJzot{$1-(&#Sv
zv(2iBx8zd$o}TC7-V(oZKikb0Y58>XUumV@Gv~%Ra#JU#i!>dxR1SXn*pj*N>z9{Z
z*S2Nc$-6!Eh5fOuM?96aGB@pgvu5LwS4AGm^D>(cm+iVYGw;`wK<~W1$e@r&aYcWN
z0(X0_%hM#5HJ|=+&bI$`tlj*K<&F`;i{AYW7kw6b^kzos<wfrbwpW$jo4@3E^@5oR
zju!5HlCsJQJu*ipi&YhG_~_SkIsAf3c1PWLYxm~;Z(fS5?kiH+Vs@^e@cZV=drK!r
ztJKN=w$eO5d(Y#W8?-D=%f6~!R&S)O6*)C3@5_^m{@k3ID#cankMVb8%6yw>d-}9a
zUZ+UVQKg-!$KHSG5c2r;O{wh37t^T=YJ!`iJN3V=Oi0YzxTf>TS(X!_Yzz|9%#?R?
zI@ngMyX~_rZExgr#;(<jx0(MlT#wUV85tFkRes&<IKRq%p8^ic_@{BLHlOxP-}A2c
zJfr`@m$#O8w`?<hWu@Blz2FJkgvy{*t9#lNWlzX0XmBg4Sg&WbZ00JjX{$OuX{xwO
zuSik&d|04x-r=>C`&Q)HZ%Mi$(e&vl_XD<r^7kYxzMajl&wrJ4Ao{M$^og1*oRcgM
zO}xyMI{C}d{IBnyyXZ)7-*uL^@_ovNNzuPGQa82v>wiC*+UIfd@Vf^O_#eH!@ku+Z
zp6iEAW_kHMmWV~yl(y%q9lGXmO6>MjUS`>iOXj2=4E%AOdv)ZkiW4SQYbG7$-gF|d
zWrp&dhTOlmI+c%AYHw!W8^7UF;^j9f8!x78+p#n3q<2RU&q{XQ=eL>F9#lM2Vpyy3
zOyqrD{+?6o*rMkg{rmoyub7A2w})Y`(pr@-E!{UwLMd4;#lq8O8{;OnFGUtw?q1h&
zjSoFllX}*l$$Mmz@s<fWp10XoOcEB^`Sr;><EUR&uZ3>w_N{z)f9oA%&WVfmY}=7q
zQ+waEMQB3hlVi~`#Yd}jc5Odw`nhCoVB+R|y;fO*d-Np}8xAgWP2f*wpY^^^*LFYi
z%!hNz?W})H{~-J=?Z?qXnL52oYfFXpxXs!k_G^}8v?7=7Dcxg__}J9XSxNm=Keqpa
z_x{EtO}%~c{^bkKs&tA>dKuMwbV^2qUZ~Djm%W>{3_pve$n~C=U-v7%;g6!qTG1xg
zvfW|+CR@UJL?*Fa3*fs@mHzYEm3ti9E}L9tn<!K5$+E=xbdtZM^1{b`U+=b`e|_<L
zqS?N5-56HOKc4bu`H%GfP>Vl$pD%Xn`4-cg`u`cq&P>cQ3v#s7ZmNHjxOnT;eU}d?
zpY#vnSNM~;wnq5J%Ljj>9tSobT3MH~ztUz`$%JgP2Mbi*x960%d@^ETcy~bZXnoYJ
z{|s$=T$i5CW$V?McG6_Nq4o3$Mh3wWwy(DSXE^*e_-LE|5AU%1;jwFlb^jQ~Jhl5K
z=I*E@^NAzp_w|bpD<17BSv6()*BhT-r<golRc1dSw*L66Us(c?73+ig4izl)F}$VQ
zdx^0@{N&uA7{2)ik}u=_KD6hnXn&+PY5BwW)<3C_Vx8i5on2^j)6DME@sfK!%JXK<
zY?OJnfBEh8H&-91stJ5m)!v-D)tEu3c8=waPVXKDr5$?WeLEQHww`)@pKYJSy}uoi
zKk6esq)d}c+wo!V`5QA&^Y2uVj7Ymx8FX=jOwWTyds~n7g@ruMe|=GA{*8^l{hmMh
z&+w-Fx7fdHR_Vv%S^q?Q{Lj$D-}XgUI3jxXlYLimYM!?yOl5ZG-SgR4P<wH1l0{IZ
z0@uGz7x&XTo01Dp-m(1tC;Ne{xclD)Tl589+!Oqe-(Qk1D(m5K+~=e0#ErXi*BHDu
z;T3R{O0j<zW4w#?xapN!|1Q+a+VDQ|bw0Sy?uY9dpIJV3Ip3>zuSm7-QZs*|bL?JP
z!hA#5u>5yz>!&{Q&!2H6G&Or^uHC=o7oHllN!gu~_1`}22Frcvyr6oikM_4>Bke?@
zEmYoIT^lX)pW(dajt9*r*Bg9De|z}1UB#leU!wPx=`sg9a7Sbpo?UilMedQhXK$5i
z-Ui(`Xd(GBR{prYNJah;d7d@Fo>vy^>H8hL-O$Epv73{tc9Ud8-=4BRuODkY4P9to
zrM{o*<?l7Ce=BAk4*a-nz0$D_$^Nk?mW44J^VD40s3O2-*uWkbAM@kn-L1ST`u^M0
z9KNuGAGhD6+j?*I<K9B`K)K%zOwAJvHO^U0u#^$LzTs?b{i9<QUu9)B{EYg_{(RP}
zCQq5K|7`irz3poIB6H1hUd)Gj|9^WkV$VwUEALnnd;j^LuEos%ul>Ec|A%bJe}>IB
z<J)dMTfQzU&f1$d=)t~~EZ?U8n!EMHj<i1M<$aMn8&^&~?J4`1LvfN>=&k+6|8Cby
z*h#*K)4fn*on4<-6ZnYtR_fh3>qVE|j=8m}yK~VdmhJ*+!80O_k|pJbEk&=?U6J3C
z-~7k+@1$9J6GeOGiC#8Yn;t6m=#lECJ>q7YGsFHfWX@CTlkQwTahuNu&%H72HI{D2
z_x_z$;@^KucmMJCTsIG9%v1Tua%<hjb+4?~O%L#Rd*+hQ{ft?n8#gvNUAq)5>Gsok
zBiA4Mk7oX1U6a;#)NE|eoqP4`<#W&9h-iCRd4B)5pa1pp&OeG9F4ibNJnJ4l%h=}n
z1VizB!5RLlhqWrZS`YGWd8XVv`RRgl+SlyFvO5=MPkb$|TWx!6HS3XZ?PQ(8wM!(l
zl6R-`vK>v53Y{2TEkB({Jg@%HU-bvikH43#h>reI{a7~msM+*+rPJ2^Dw}3<LYKv1
zav|$xEzhUcDh7+0)!uAYb5Py-pCM~K%PV^>*&59cy?N_RYsEa&uWVU)>E4Y9jfr}>
zPtAjr4sF|<n`+!~TAPU>%({Jj|Iwf$w<i5|Pdai`FLdXdI^#XL(Fe3jb(JFYzMS6i
z_Q92RE(T|dleM-S%M`j%Dg1NtwA%)PJJ|V!Ch@vwe{g=JU86exvBI{VjE`?;9-RFB
zp0lC<7M5dXY%KD#3yzgN+L!h5`yUbigS)~Sm;bT)(Q4NJaK7AJC*9zvd`|A#FiyE|
z5!0+a|6N!wdT@vE?U_$Iyk5yJxhb__qTS9PzQ3LSaDGT{*`r<kFkk-YBkh-ZxhDS^
z1Yhz!54>vfbXw$+CjJeXZ)K`gekM&~Y3<CPuXC{T;cB-E8I@;OuY_LP_UCumg=fqA
zS4`^N_3P!|QX6;w-JW^#B&K$`I85C(cjdg9ISJ{nV?_ct8BZxN`?vMoJl&7Wd;SU5
zIBehbLw2cb^r3x*SJ&mfTbI8kPvKH-g7f}2MbW1|w9Gx2pi*&HRAkk^&xY4aKQ8_!
zGQX*GKL3yCN51dcAFR%vSn|!#bk8B{i85ZNd5<mFbnHxOx?D7?^?5GmMCoSUV<MrM
zfh*Qb+Eu;$W!~|Wj|KUsf4!(Vn!d_>g5yN*WSf$;(e5ez#k@y1@3!0e-EH&giujlf
zm;My4d~t0;Y(-gg#nWlW1N+=}^gdQHRX3a&dgIu|HM>(vbj;@Ox)=Q0FLOTkAJa!O
zYOEjL<@$Vh`p3w%hmBTbYxkRODr>quMUPK4W?fxaU}M~|z#}GwxyLk@O{)63KY5y|
z-j$$xe|O2--QJV2MD($QY53cVQ72|QKIxnHHA>d)_*paFV)0qQ_0wXV-<~tiRkt`_
zleBVA^b)SqbC)a2^l9IHUA*Y`;x$)P+%Kmp<UMY_BRBJp_N<vFHhA25(kJns;p?i;
z=bzm$@;t^?uk|!f-C8oD@w~{#z`Zj=LZ>$B+i$*IY$!cD<CgJti*M`2|896!^Pk~|
z`ut;&1w|#L4@ytnQL{?h>t;DI^loFSghI8{NBvvp%H=n>AJg{VJ6E%yxaZw2ALf@w
zYvbFyZf>>r{Lk=G$i_~i{2*lgt6qKj^#2T9LXwQX-#kfQR&$7d`PRCqx{KkH@6_F@
zQ|e3Jf66Y3|C`-WL0Q`ykFU@AtN(-FNdNHdpaXM`&;R}M#$V$<t3Ta;Y>|EbcKlJV
z<_hl(t3*n|wrq=Ie^mds^tT<myS-aoZEURam+~X?+3F<XY7F*Fj=Ye&j<-i_qQj*3
zsV$ot&dm9<oV{te>CcTHl@IO{`Vii|;IfT!%C^EgnUhYN>m2Q$w;-=vb>ntxH$Uxf
z?(rL@y?!`vEr$euL5D$ouan^Q6&A;r);ZT?Hx)kKzwOMAE?L7w&7OHF<^Mu0s^;&W
zdVcPs*R@W$c@<~(EL`*DNbuE%PpWe5+bZA2i)FLAcbJOE+FiFZey?3O^;>U;>xRor
zj1v;iTUg$zw?BPvpUG7=8|RuMjQ^%vetQ-szqWdg-rtvh`p;CjR$rB0{z_?GfZzm<
z*YnoSn;-R;;cr)D;)i!T*7x?V=v`3$pTXV9US{(AtRE~7oFru4zI=ag-@m_IKQ5M*
z$s1&Ul{oPFiN62gz15Lx_7`3JCC3^UX7Bq?eq(IFN=r7Q!}}P&NdCJ1?EdlHd;c>?
z<gc63;QMB#eCPq2FE8Vl+KGhp{R))0#Z@Zre{R3QKMSw_3?H_C)!oas*x>m#c8Ndi
zduyg{vDs%3|K?@o{44wa2=7wg{I_GDY}-q{`6{n$S*{E1V86qBwr*C9`~;QhPd?Qw
zdH?TjU2^?F`!vJ4BlmgM?si|y`h1;OB*XcK@k{<Qa6FUGxFS;eY4U#t=d~XSH@n|V
zEw6~m{T4s*Q~mK=x6A%NuC8@1E>zlj^iYnol($^X5{aMFm9IC)oSph?_Hz!OZIe#l
zkT<(C|8&(PTf=~V7t6&B{#5MW;nA(-wRWew_Ev^}q5X^R>77^?W&8A;vtSSN!N0cJ
zAKrYuEg1Npp(=j1z28A=C%f)XwhAg|IK(DzU|ypubD)l8aotn_v(A=T4-Ri%e@khS
zob747`_~pGsq|DXZL4lRaeis^mOWQ=E=FB?d7y`9b;^_QvwrCtdaWbYsW88p7keT9
z=aUyt_zyh)vX&z^t#?Ckrp=shYbJiH4Hk-zJg8T_C3}AUY{|b_S9_NP%HQ!U%wu>d
zbAJ23pGBvCh0hIJdv3+nD|b4ZVs)}l8`z(?9-0;6Wpr3U|C8wP+ppLx_iWq8clwGi
z*YkhBeD|N)uC%Kw^V&mYPs#dDm4lCOwtrn$c2>W5&AgC^nj;d&vzDki9cVI_bARX@
zqtJh*Vp&i9&i(%xT&JxFinV*>YH(hnaGt~)`^gEH`<^T-HxJijZ+kFjo4IK4SC#A5
zWnrFf&kis!SQkc#7dz`U@@}cO<ZEd>!C>b3_|nd~aS?@kZ!FYdI9mQlebpDsg{*0*
z*=(va&O|>~UjE_Het!E08^4!N{Bin#P*n8kLg^cK-d98?Yy7?WWD=wNb<y9YE2DfC
zE}hu;)6V&eP1m3J{|rr=E0T}eDO~-dx+<fp=K8c-WpgceR)|-282auE{47xTN8z!|
z^;;jby=8XJcdOX>s_x*9`P~Aqw+E#7=q2c0KGR|)GylEI%~j>)vs~ZIf2p0Ry<Wn8
zcj4R5J^knQS|8dlbIX%SvP)_XUio~?<Dl%0uj}kiU4A?HWLk*T##<{Dt*gJiy|llm
z*Yx6ijyv1at&?TkUW*mRM#m&f<v6XiL1qH8@d{b~yOQg|JwEa`ZSA~u-t~H}o|;qW
z!_SX11vfeJv@F&<q0m#huIai@^Wpyt;tCtLH{5d7n{50u;or;t8O;T<=6vmae|JCr
zvHZdMmQriYXFKHbJf|++v)xnV$>i%#@~q`5zOOrRao?m1C$DZ>b8FJ^*e$6$w?@oN
zR&q_?P;6J6-os=qaG>k)p6bF!y+y~&cW=p_xj5nWm8T~T9-7A5d8~qcUiOR)KQy*+
z>Hje-yVmd}I{Nf%*AxF4mO1vg{H?mK`^flX@xg6A=U1Pul6c!$Dxv$_r|;AUot)ZF
zH%-^dh}14BxN~To@+>o(<x!Q3uD&gI`Z)KJ@UzCA6ISWVDqjC*xW0Z%eR6KutNfmN
z-jd3jVwbMR?3iY-K*4R=z1k!53lFe&{phSoeZ(78c42Er?sgluVBH-R2U8M1&A2%u
zeSe(xoBEqVN9R9gZ**gqnsatS@qY%L=e$4bw!VLK`J3P0`A=&4tX5ad^5TE1{rAPc
zsr%F4Yh8YL<kW8WUoksa9>}av;QDr#^WO0X&zi;F-&?op%~H3A(|1mu<S*a;Fy8o&
zTrvCMkes>QMQ5)t_KE-bC;FwYbH(4~58pSh^>d1S9n>Sgt7fN~t@W4lIpI$t-`amG
z+jH^PvAFwIW^1?BhH+olN}9mr$gbgV-p|N5_Sp2*=Zz~bA9`h-lknj2CsV)Eo|kV$
zE>)CBnPBnQHha;wOS%uWW!&4I6u*vVjw-lye5W6O^{mUUzFl;c_B7}(D}2VZ|9t<o
ztvYkpg=;wfUdaAa>SRW~a<9{V$zztUyUtZh$J?LZ(aBwUXK{92GTWY4tDfgt^?Zrw
z*?1(`&F=0i@5spLl&$T{ybM3ZcuO94%YFPQp?+@3wd=;5qJ=WMKY1tT-<3Pke`!zG
zFXL@I+j*7-C&)C1C!P#`f86${!*@f4GvCfw{62B8t=3wqCj45(&%OiodpMrI?g=x<
zpY>wpn~a<O`rl@W%kVs?6P;SovuS1rd$v&B%(c5qjbl_kto!0rbn-J#<DGu5=lb6z
zy8GrHtukJ5C-AiB+Vl3iFQ@OjqR^1HqipgrOPMFtwc0;s{#|dU{-fFL@8*5FS$5)A
z#eLI1<}DZ4wUuMNLgO_y_oOwOl00q*9C+Af9saHPW8Sx4*B{#Vyx(J4kn`1I3$N$f
zb<8vV>~!7yGk;I**|p8Pw@3Z6FXg`}{pjB8rK(q|Dy~cm<=-d0;$582*Q7iyla@)I
zxo7-5Ppa)t|FEg#vDVhC+?4(C7ykTb=wErRWU<$jHMjSl_;8-@-<5iClapq9@3yTL
zN_4st%{uW)(R~ws0p9l;9$(t~-1F~N(`erIzz?sFEM63S@8@3*l}8zmEY-I?{%ZPp
zdB;EDyBX!1GH%_Q`b~R=LC<>W!y4AkLN%LCMQ5H+wh8B6^~2W2dU;f~(fLB&wU>7-
zu-_kh`s5vlJBwwl>k`7>yz7%%b}|0?!k<1HB700*-v6zfzx1Bm-<@^xF~?M|i@iGL
zvx2iQ<I@wFdKtN_9{HH6FYAjx$iGef@UQaBJ)Vz3FF&o|d35RN+lW%jg!Pgqz8qYC
zcxrKFQSO$#PM6;Hc?8{#c#yta-l4X_WV+d|)@@g=Z26}0DY8%@-pT5d)yGR4S5FA2
zYLo8xxaH~TFe~{>*IVoJ^rf>5_J0%ad3asXe=qN++wtrFa2E*meEI$Jc-5Dk^;zDv
zX&nBYdsLU+@s!uLn{Rt`vds6NJ`H_Emao68e>zQH_D8q>{I?&nf+O#^Fs(hJlUT#o
z*isS1@Rj}EzKegS+9}s~e(XQua<TNS>(^}8jq{##Ithi@E-=s#pK!*~CgJnRvo*&G
z50xmh2TzUo)w8<mY1pPk>t@>*n!LX)cHQIhg3TZEI<DulWcAzbJuE51*l>y6E$I0^
zj`M2!nt!N&Jbh@sxa;d5VYmJ>_*qqU7w++xV>!EM-9ef5o|PwamtP2fZuBGQ{?Xix
z3dU|5pG;V%%zI^hLP5oOuV0J5rGNPHPvDA;v&Gan&&hs?jSWjU``FbNTFAcs{N}L!
zQi+|xVRoOnJEm-z_WZ@)JyoApIUT$AerKvK_vag{+2ZW)t<810XS-<jjioKj-#5sV
z*k0K#di-V7)Fa3BPqL&We_6LXcz4?6`6|6PCFFLPem1(eq+BKMM@;137H8pwTsw}r
z`S}-QMXxo@Jw8J?L*+rqpVjt<zAO3athrI(!C=8-@w(^twI?5<4eWf<ln<WqIr%GH
zerd&wUA-aYwo(D#1G`n6+k%f-uAA%|@%Zx0@Hsox|NT6sHFZmZ@0sN+&xJH{s#9`J
zcTG&Y<S~Kyq`kiE-q&rRlg)Z^+&Ln*eE(@={V!>StBAHu%L;o930rM1mQT88EK)5L
z-pT!Z8<M_#j`aq{EB_fv{xf*>6}4<`eSWQGVynOAoyK`L{uah%o3+YJxO2*IYeeHg
zl@-jQuYMUETiq(5E4<Eb@rQNp-u-U{PYPQ5Ju;{@usFUp^W3AUJ!<RT)cjo)aqc1?
zTj-Q&$Mf3zmqyJKzb(O#z<+8lbI=9VNs^b0iWn1*v+vXH-{Bd?dw@sod1KrXRY~o|
zljknxH9D?+r9SFe?w;cxT@D(s-@H2AMo!{M@%8!7qn=f-Ok-ebz9MJ*&*baI?An6(
z$&)v%6Q8qQ{?ww9ix;KVugtH#Qls6I@Mrz0&u@zCy<X&)TCZh0Rh+TY^MJ5hmzjm+
z!^if@rM4kgJ+8_+KIt#Kv}EQj?y}VP$DhX(Ena(Z(VBU^B45r*yX~23>dk9+-M?h&
zozsbun~M%>PRmZ~m{WR~js5c8s@lER)~r(S4SSt^eB<HcxdjUzzgN^|nfc{pe$92;
z1q*V;Zuyk5%&D3)>vmVs8b2e(laF@RZSCmUGU2J$ob7Hkzqa>md0QxT?zs0A9U<fC
zmCrZsN;_s3@!V7Qdv&LS-PKodqI<i;FaNt+zVyz^a}Cq_3T0X&EA35qm2!_OynDWk
z-Rn{M9v-DFaXg<EC43L^%>PsB8@Q)QveetVV0Kg`gU(F%Cw=C6((CtDRm417^y6`H
z-#R|sjPpS|u59^R?|nt*i*1tqTka`_N1wip*Zd@H?f2{nlhGZyLwg@x_n94ZIX8E^
zvq8Vsh4XU3S`1u{=dbP4=%`qB>Kw1*R>`F^c3YXAI$m;drAiL3)=a}b`)etDjH0Xd
zX@30HWxr+3SL+!^Jm>4(dgS7K-LmaP+|hGY8a`FOYWtXN4&S;QX0yjH-a1a_E3f^-
z^27H9V_wgi-tlF(NBZx;ZGTT27`|nG8m`VN@#kP!<Kzop*Z7)$%em}2S)Qe0+I#Q5
zH%503@6Iw({~)kDk;RPf#mVCgeOn*hGVl4P8S^7Q=<*-;<&o!g@7~;Zq~k@+($tKP
zw(D;R7-$)-<&aRHr+v4E@#B2otE}f5S7csxtT+*Q?NUYl)Vcr*!Kw2n*#%r!Ea#_v
zYiY;f(6XTT%ClOgNn32neSh$NG_$_^NH+cOJeiM9{`)ka?%M46+~A3U&om#m+akLf
z4$Ld4Tt7M2J}v&{`NQ}0K8pAK34Rdk?K?Z7xM<_cb+?jkT0Jp7y7eLdj^w_=z8UMU
zoM-!!@FQYcy6diwvTJ*P@&%pyJL}l<#_b(>EqPUC>}wrAvInw%%l`QEN$_#|sSECF
z_89F~yXSa8__)IJy(Mc*r#{we+2eD$@b<FygY_HBrhn*n-giy6PBbg{Ro}KUw_nwr
za&Et!^Nbg<akdJTA5{N+hQaikdbghBR$e7FOQx^<abG{^zcI{aoBXIY?S_ZsY~Myd
z^Mco!s?j=bPK`|>g?FyswbPxse~U>G|EYZ8&kB$Bxouf*cD}SGYVOy|g4Y|n&VDLB
zasKBYtuJTv6oWXPl&yKpQ~z94JhrFQ{{QvA(mxKbsEGcy_v62P`?>z9W^CUlaIqwf
zQ}^!Kl@Whdhi$pGE<c@%B|PlfrxpXhHfNK@*)zf%?^mQhwmp7u;ra@`)4p4OR6ba(
z?R|Pa|I*W14%?>Z%U<1jiDOd6pO?w}TWoR`>^t^z%GR3R{|qeu87_V4m;0lBwZ{LW
z_2G{d@evy?ezh$=yz9(lSG|QxZ#yz%yS7Ctr%ZlZF6>`vQZ8t%GF?f)>&T2J|1AE*
ze{6r-{b+Y=bijqB&AuPrz1EHLWjUJrpMf*<?2gv8XK$vptlgud(iP%!u!LKu{dDZ|
zpK8mPrg~j9xK#I~X6oF3)&Ciy=dW|(R9SoZ-M{^7IoJGW$XRWx9Wwv$KB3EMSD$Yc
zzpgLV%X~M>Y}VRYV#cxOF6nM5d(#)Xc7|lcCYhDD7Qgr_{#dT_fq%QX{Z_uE^|o8W
zuVrU1HGMnVaYdH-_tRTmMy*}D$#3lw=}hI;WgH)mn?3rtx~FF6$JIwbS1Ej0?DeDk
zp?GuHN1g3V*W&qKY#02`uy{?b%v#$s-@3LnafsP|Hkr=4O<R-Q!cP6+TIIL%x%)e9
zJRi$4U5?yv<%{?2-Fr3aGcv_aF28f)l1rz^p+^sX$`$*U3c2b$I4->)G~)8LzVNnI
z)w8lZ>elmKK6u~#PwU6$-;S=2^W|zpK2+9odp`W#&HXz2#2@{&8M~G()LL1z>bk(4
zh@&RXCo>m5fAV>!!u*Tx`|LNcH~lGmI9ERMhvh2!!~LC64+UeRcb~7@c<(0ro|Ai8
z<8qap9=VmbPSp$Z*LX5T`^VQuoWc*~4@LKj|F93cyyd*mkLe-P!<xgkT}U&Jid~hZ
zcFkJX{QS&!Lbs*!n(iDcPdGB;)ULnzAGbe#e?->UvH6(P{Eo-|yxFrvtp2Tibe^|%
z)A1v->^pNN*lvBcIK5@_e7~s+I1Bdq3EnJt^SHF;UVhZtsy$N@*8DPGeCuuYe((Cj
zoX1@rYuCq5{A_=)|MukLa?C$`*ZfF+7`Jo1M9IpqU!FDImGx`lUmZAh>az1w>zG>y
z4d*I<Qk{69)1lLR-Q)Wz_QHEuAK0`0$@<8*^kKI?r`LM3*$-xGzYX_@(6^cKq}_kp
z?rEw!rd6g0dlz&|q<XYZOH0})Ke<Nx!TejxL;fzZF<tlL+OgY#AKBJQTq>0ptLS#P
zwm#~;ckFdz$MR*qEN-{%NoOyQxO+`dXO)X)o}B3PZ`}{r+v?=A<cvQy#nvCPf0Ugs
ze>>`SMfQ;>x%uVGOz%`Bd6<0N-By{#U(b|Q9qT6I@wCtA+)dT~GtYihNqBX=wOji=
zzuvv}Kf~%zmwflv&NF;y-<A7;`;mRS4ey8Atr^N2_w1Y<@zHGKlBLV$+D)(h{HCk=
zd-q#m-Af#|gT&Ttx~<Y}q<erjzP?7`NB`sbw~Qa&{kQOAa@57VFRy3cb-V1icl&*t
zph$O4<-k3&9!bO<aMjwdeVU5c=VccHrpN9#IlHi;KkmaHd9HU`UYhoA-1A*1jw5AH
zo0#P1*nHh9hgh1w_bDBEf6{_o_mv#mjvuBE{W)%AWIwpgDXFjfcz$qS_}21m6P;q*
zbpn|rgJ&jk98hLWFmH-Vo#waZaXiZ;uj{qB)wiE*x&5r_wd?awHs9SZec8|VvYT&m
zUdzb|XU?QfJXd*NTddsjYjTvg)=3RjQ4g616aQ=setmN3jf%yAm;RVr-Fvwq_T04T
z63k~?Wm+aLIQQk?IktMQBfFX|MK^r5jI>mcdC<S$%leC&t6!Zvs+v7J=#|nf*@H7y
zK9)QmcjsE}wH?nau4`_Yw{A(}e}<Zgp<6lkolJeEe`dj-`|rM<Sg&%$CRC;DW%jCL
z*Iqm?pZ`56)KYur$wN=dRrsr3l~itV3tF90^(JcDRGYfE8+YvGm6Mk*uliVj>w|XP
zq4^R~susR-YRcDh4+;NS{p^0n{q6JLG=IoC^y~StdA3`2_j^yX$nWdTFJ4>Q=Gmt#
z?z`O8DtcP})S7ES#~UXVM*U~lqW+fmL-(=z4gN=7Y`Gg2ac=L!A1arp2X5GR+4YpS
zl9fpI>5721;5qM(SzW(T;1(S>E!A($gG*a>)fdiVtL^IbQCT!^d;h;F{q6s_w-i=z
zT@xz&y}*6JNp<DV>rdx*d~(%)yZTXNqmp5<&<2@LN?Y0Or@3i=dH&$;-({;md^@G9
z_e{F&w@uAqC9k5>yBDZT{Hy)x^0Dthp1<=dHl1l`$?90@9>8^5>Eqj%_nG!b9CC~M
z&#>^LY3U~WWE+=H+Ye9Q+Ir1=et^B9<l}_*=htO_%Kp~6)hfN~d86uQr&~Qe3Dd%I
z{>@x}Wxmk8$Xh=|;!o>Ll+aI;ZnXAu>I<JU$>E^opVgm)AMbtETlz6MaOb5b!KQD!
z{EMYFZ<?;s`_!N7#w`ws6QXURaYF9r3XA_UBu?=+-m3R)SDf@SU2e_S7YctA$IE4l
zSv6i=zy6}R)Aw+R8{C4O(U)JxC%ueL{&(Iu;elI0mGJg2>nAO{rrPv3=Fq}vkDlc9
zye(sMo-^^~?LXRgAMRdmKk?^z_DkXOPk%MExo>vAu86(9{@T7jf4iQ9Tq;e~ooc>%
zs`~y3&95p%Kk<IsomjbQwszR(wd+(`%i|79qy#x6oN2HNx4gUK`HJ<M>r=}v>-=Zf
zrgV9&XNIY~<}^-EmKFwqP0hzGPi?ncA1xbricjY+KflP5{>%PcCstRVtLW}OzO*i)
zCTVxepYSWYo9hcaj(?AAP``g`zwaK&TG^u~J<7EuuGF0F`?u5dXY|LY1UubVUU&N6
za&PVr-20zlY0aIhQ_r*asQ>P`y~}>J{tc$s{TtH{JG|Y~D`XVC%yZ&N``)@qHF7gd
zk1g>0&oIry@N3ndgZ~+tYGU5~?bs*oKKGa{ui)$}Yu4?*wBK!?P|TjH)(>&TO!7zU
zL0bzpOt>hYKJDxp6X7@em7kvPzkXW&*xW4j--{fK|1&VeEjR6aI8#y3RcaF3r6Z+*
z|3sZ1-@Ur#KZA7X?(D{$Eejiz|4yh5DKm2ZlyfY6&dOu;Tz`~p{a=gPAJsqe*O_Nh
zi~J;8t=!2@Oa0924LwCZy}!e+Y-!q>TXj;<U|UFWlVxyU^J^EY7Hfn53>9Bx{xi(W
ze!86ba;V^)qxBry!g6|g_`XWL^5y0X{di;jinA%4imqHsp0EG;D|qhW1ZD$e8@aE?
zPfU9rRBpB6{hH<dZ*`g{Pcpo3dO6y5&bJd6HDvuSn?5r<TF}*b{__c2?VwXn4jS}Z
zNWQ#1IdWIl(_>+_ntH0P5mP%PWNlYPywBTrDfhXWOF~6~MBUb2o;Qc*Et;b;^<BB!
zfr5I+YpYCli=XSe6l=$NG42z`Wt)Np%bj2CSan|MSb^#kCQEspF8lWj>gT%TpWWZ4
zG`D!0k4(wQ<d-q;Z{K=m-d@muhDEOOc@t~NwZ&;YE6*1PMdrRs6t<Z#m0kOp@)387
z-=~h$Ki>L*{cTC!>|?W1kM4RSaP#3znTbsm$C>YcUcXs=XP3mRk~!TO7d{-8Onm)i
zec%4f-%}_3I#<)6y78yP1mg)t?Cb2;*2?p`U7f%9FTc6b^j$TvD}E?@d=#Cr``VU>
zcN3UgUJHiFd~%tXxa;e=>}R$055pVl<SMQosya8H`#j&;wYP7@+>Y5lQ!va@Ay4vP
z%*wdpS$}1Il&t;F!0~m>&fm8`)HX}~jDJ+qwQGIb^PD7k0f)DjwVWr<t4hAM-}7|g
zRMAjY_2g$CEh<h~>H2roXZN%JFg`ecOK;oE2f6ldl;ZhgV?E{mUKGj`3~=A^XK~w!
z7uHF8``$lDZ`zZ*{LPQ#$9vU-J}YzOuIoEFbz4(NLsi~`nwj5L)IV4#Rbp6o$%^%j
z7PCBm?2#W2-bT-eb$EGa@{j9B<Fr0}I=s+x&1%_~91}Dd+Y0|(tDZ9_{6*nWub1mi
z{M?!N*g|{0e@xx+`=VcNoZ2@#TWjUR2fIS=9uHW*;osEH?Qa7=l-0N1=lNs4qN0Oi
zYi)GUPF?;PJwf+aTzwxJ?bJKk$i9s6%i8|7`J(&OGow7FyIo(uR!m*6r7uyZUPJz%
zMyb3H*E9Rf`w|tKAH}zt?Damn{Xau)t(JR4^ocID{4F{Bdya`)+~WEeJH^m^wZy(>
z!iTo9o75%T$?rbqvF&iu8l#ELjdTB0eZIi&m;HtPn_1_Q9~&Rs^DN)DD_!MlA?r!?
zd6mku{`}dU$=;)KQdv-3wnMdD^8Inyy&%<kh5s42ryt@oVhOr`^8CteJMGW!tyN2u
zziaROsF3T%t^D&}-QOQS%-t#faN*^LId{6}-t((Vkl-tv=cu%A(x$Cf7XFC*@IJs}
z+flyF)y(_;Isd%WBdSnTc$)c5_EY($Te(m7x9M(8xIOQA-=1}6WaQTscm2-x**yQB
zNPbiLXPyqz-^XsAWbHlj*rvp`sQUVon^)=!&CXx_5HC}|uI*gwietS-cMOx~-rG}h
zwER)xX05uIl;kh#MK4IcQ&S4NwV<ftoaMTA$1-%MPA{}}53^LiGyi$~jHJco#V;Of
zXOzol{%3GyklCOz=dY&HzF>{VT7K+ni`G_ca#=fn>QCld%Qx?7%yW=bDL%PQ^VG2`
zud>Q7cre`AlX5+HnaAy<$6R9m*F~Rih>vcy?yrx38M}qgY>``i>&7n<>-Dznp8KKJ
zclPdUy>)R{!;XC`V=s7|mu;2ZDmdv+m*S4rWC_a$VFuX?gUapo{-pCC<zC-?&-ml_
z)^}?cU;g6XaZ9b){AN&wUJ$R>qk}5OG0sY<$LB?gxuzJhopX9?zwkf9*7&3EyXraq
zss5<C|8W1|*Yy$^=HI^Ouig`MJ|{QIQZ)C^;#}#~#tYLD4hV?|&Ux@_`|bMl`^<mL
zKlbfiQ&INJ`}SR{=--z)S@ZOA7L>c+ekQnM?h(5Khs&(Eeg+@BFOk0g`r57e(lz!U
zeb;OczEycSBe>V=V%#&<j4NwrA1(Ur7Tyv4oQLy4`nP+M6<SwRdA$6ty{M9WX131u
z(loJYQ!a;HjKAA;)8y`~T<fplcD;X>|FK^1(w^my=gOPx9(h}GUDdkW?|JD+)=ttp
zw3El(^7*Cx^YUA-%Q5}1|M2eB>%&&QTg<|~MU~|wsR}+f+>o&9j8opZ=#1x*&-Q24
zXZ~mCisSw0|7Q2&s~@E999)s{PvYvI-`cCayS=;XzZ5C)OxI}Gn3Ct1KSTDo>7Pw6
z_Dj_%zUW!Ml6{s&aDw;ggyg4QO*|4$^d(ike_vm$c_8@P*2S%t#G`b#xj&UWwbp-<
zMa$2v_lqx-Jeha=nD^s+fvjIGN7v1I6v)%b7&>8|a>irb78X`^g;s{Xtq%&;HLv_p
z@@m#0-M5=P3ypjY6SebaIY}G7u}f|;KE`Rwn*X2S(5XxBb>z+_x5o6ade${0*xR?q
zdmWsbe94A$>5s7Yr#;g`i|#Zq<sUf7y!**t?Jr!MpS9=9YZY~s*_D1YYkc_D>r-Zq
z-MJ*)Pq**Zoay{~-|)I_<DE(VYb!qgC_h!N@0Px;BSo|+oQqNBVP)VCzGl%cd*8R^
zoLP6RCuUCLeT6xE?(yrZKJ6`c-L++3rh%EpKRND%&%eSiUR<$H<UHG!c+)5Srd^l*
z_{&(e{3|wUp2_swdgJ#gdf9LNZ!CAXmb*{uVCixlUxv$hs&h7{{GFDx`cw1OKNsdO
zA2@IN$#svB|GMKWH5(iL7VntkZtti4CH-6c=1I?wZZ8is65aG+jUY2~QOJ1-9<Rqd
z9+t|J`}SP#pL_OioX36Lrx80&{LQ(zM&;5U&cf<^#$EHQ%e1A^^==n1^&kIvePNB-
z=6#n-Pxtd>g<Xz{&DvGEZF#n~Tg^%#-jhb{FZY(Ob9{Y{pKa%UcJCEgRbICuS9E8w
zo_tb!ulPs!g(%tf8>P9zI%d%sIea2drUidapJ#lbZ2ig2okhX!FDumUtf^ks61vD!
zByorO>!|YbuH0Ly(w&yCUvQeXFS--m5oGfF45z}!^H~@7ZJm}KtR(t#a|3_Wk6Dwx
zZ?$dRc;QD?#gog5(_}s|%OBhQT3yI3LVmVP_~akCH<L@%CpI?T+AHlpOQj=a&YUOn
zvpyP|zc=gqV|?NAO>L*t{`d2P54@ZcI^Qtm_s)O_;U8R0mTpxaT)iYcPyD*x^Q=_t
zNRMdOB!eBt^R}FxeORe7n6>cVg>&{&P2N*nf3`39^J?-LnMqnd=Qg}DiBzs$yj|<W
z{(CCPwv8v&M7~e#t9(04!EAHtoq~eGIcqa3s!S(+ylu0H&$jbrM6gMk^z_8tXLJv~
zJbARd{`8VF`tOa+9=$u~o-CCo`LoL+aq^pj!Z_)bwx7Mfg|@l5N_*b^<1oSfdf(K$
zS>N7V+;vdyro^8$7V8h5@3=4Vbw2aIi*>e_zr>dPI#luX_KG>TPAmFFM!#bUFn63}
z9PfE}ruEU!Zv46a%JTia(w3$6sk+Mh{{D_W@L5nnQKaUe2eXC!srAy4b=RM>WX#>X
zN3O7U=cE0KChKpBJwFmPb?x)sXY-Ft7dv&~_C4;CI_nk$-JYGaNGGrOp6kiS>W%R}
z74hHZd^pf&T^(D0B&yh@Z2h+uvs*pM%9jKp`imG%Up?9pFY52IuK2j+f-gJ2*GOhs
zN<5eOc0TLkyjyo7J=M(L1|1N-Q+#b-;)VLm6<;NzZr#fjj<t)Npi^WvzwAgo|75eL
z?6N1B_EsH!G_7}q)5okRv-Qi36>mLK+12v2C^G8q+>ZF~MU}^yO&^7we(mn*@_u<&
z%hv9ludTu-i*@Gm#4t+DU#P6M<;ny`CwH6q`Cgy3^<^sfL$1^veR#Hx^P$Iw)mk%_
zl>2VnHMPL3QSp{hk^kw2iglANhxciEc`Ys1^LyOHXH^^{YGBm;ed4aX<DNM_x3<V`
zYoE~P&sfI)mut7Sx9E<Yea@$qR|Hwhd|k)vaz*M%?Ha!D?>X*wRfO)y{b$gO`F%Zd
z`Ku4N_e`I}J~1h*XyRh)Z3p~B!&T<lYAL%<ci-_Ya{qx#Z=5s|w>kL#;qK}#nV&SN
zV)E07PsNunTz(swS2DX&q-GsALsie@qn0yodrZ5g=dG+Sy0m%a#TNmGW#V(14Axy#
ze0}2Q#+YwgAKWz$`|w3LYl3t6^H29m5`XZy*(DTIJeF9u*`?KOe*1$(ZvKys-@bBf
z#_0-w|DejxhaTVAd9+|x&DpshrcQilXZWKuS@+Tnw@-iPsd7x*{PUyU1M?)wBNLe%
znXR>-%@?f^_)-61w#&z~oeLfx-tgM0q-@vn8_C)6R+@cBd8VD&u<z}UBNKK!@7?qK
z{n`@U<DH8dr@Zy)Um2JEtp3(9fja)|%NjRocC*?o`MXSq`Erx3RrvPC<6$jRLgvoi
zcs8mhW!<^zZ}A_>TTRv`2YhsIFSU4o^lVQcLs!EhaUD*LD&b>X>o`om)OXyi-?Akl
z;<5SZ{|pOe{h0nur0pHA_fdnGjrn@FZl}HEp1^Zy@`NIHo1%KgzPg*&n>;I*dOQ%?
z-uZ(^=6adt?{Aim_x8KAg+^SE_o>a?m+;PhYM9GifrN@Bh9~F!XPEw<A#RI-{r?NU
ztRLkc&ljn?CMV<1TA_ZZYJS_5+efCy3%*mVPLT^%+BZ8>^h@Qmd){V`zBtZs6Ovdu
z_3q{KdHd7-MNh7cd|6oI;IT(?NoJvY=EMDbH*~j6$z5>9JHPbXjK}-_-bsu;?WyP%
zz<H-9;BWOq{XY2*t$$Rm*vV&XzURI&yL{v6!WI5c{N|_jnF`)sb%L8o?M&~4(0>7b
z;-WXR>?OCp7x<yX8}Pb5<45b_`-iqwb#4_nX*VtT(~_>pWNyJpY|oS)S1XI0|H%J%
z>#VSaXZ@yHyZu{xf8GA;*`<HiUf2_~{qf)WSpM@JTldC&ek?oxfIXKh>$0ASOD@IT
z$~>PalJw1Ic45+b<2#3S@2twZ%Cuy6;Dp8ryW?d|^~L@jpU3zyre5F=XW_E!s%>kR
zMZbKxAamRLT-~W(kA0iO9qXGkPkZNMak*qIkFXe<iK2J+@BO=Se`-DJ>w2-R`5pTd
zKfL~N?|IObeAUYjYpZJY9(iZ0393H5dTZ5;oV$xAxwW!nosxc<^kDn*_U8Jm_-?D`
zM|7nhZSOZ-n|<UT>!xdQ*AJE5v*{DtxKlT=SoYh-r7>;_Q^fnyyWOWr`eX|m?{V$A
zIBnOC)uGR7I%C(Lta(#$qib52cl{4W`6IK>_u0$*F<kWT{5`JgU;H~K$H!&P>RY-l
zORBVQdKLG{&2P6wIZxjcvduj(=h!Vt`7?ZCsjcVVy3PLZpW(nYdG0Uuq7_}w9Y3zU
zH+!|+?97#~c1?b{IofVPSK3Ca<UhM|r(Wq6oFvgQuV_t?pXcfD&o7r`&u2`$zD51-
zoP1O3-Mi}rGp%(0ZuZ=MZ2m26nMtu(R<$>GHT&%84%%&~e5mf+g);{>yM$=fyU*YB
z{F~imnT`K0>=V3FW4*>=)5W#xY<wTF?X@~o*_+EYzhc*t!Yz|x_k40M*w$^t$@O+t
z=|Ohk;3Jlo=Zc?}xbIrMKW^La$x(BDWOZ8afBoy{gdfk3)bU@gPhVjt`KKs1IQ06L
z*PSNOUq8G(du;iVm*35|sV>~QBYT1B%%soVho5L`z5P^kVR35Z{=@o>|BNq`{M9}d
zCEL2be~b2O3!Q7PqPuq{RL{&adu4RO+w|(3g4=5@=_qGa_LLdCvie(n;2z%(<%eg>
zzpeez_~eI}_3G2oulK4)T{$*?LBv^Q=e(NTJD;9%R9Uq-ddJU8`FB0#j)$&aWXBy-
zclJJSo&3Fu?GN`}o!@0A`{UK=;H!D1x?CQ4LY}6UQkCjga&t}}R-9~@&|T!y^Qu{1
zw`OjPXiSRAhFjXZfA5OFy7u1uCnc`O7hkWgOTQd7zttpP^z5n{+p9I6yi2OGTv?W7
zODgVa%$16sVt8-+wCn6ftVN8T96x8K{EU9IU%0~fk$%&bw^p~0SE*Qq>}s*ka20A#
zzL4@ZJ)lxjwy^7$`M0tkTkcERaQ$ZxwNrm7wZG*{^!+zCwtDPwPt!5Yc>hFA^a#I1
z%0|tDTXyzWGWV`xu+e|Z{`j=L#E&+8zRX{#t@HmVeU81M`fZL!*SEVVa-N?yZZl{x
zV@Q*kyF`;|ubuGW#|0NlUhh7B-fhp?_4l{+yj^U4>SEmf>t8SYeEgO-RVn(Eh#7a@
zxguM3(b%Pviehg+wQpFxU7TBI)w%^e$@8wBzIW!(-5%fVr&azlw7-t8<cz)XV)91$
z4%JDYU3YBUI<avg*J>um;GR^ECxSQnvOn)WdVkaXgXabQBws3x@2pDtar&Q-<+gi{
zYd7DE5)TdF+%j?B8Lt*;{^?U~8u*I8{XKn}Z&LcsqIW7h{@;r#|1_>EJ`yH&{?UDo
zS6p@}`|J{A4+j5dc=c#6NBC6Tgj-)Mo=v&BWL=%@i+fBTwm0m5(Dk1|vc~-3YL{&r
zJ@@3TW{`CJ=9^cY!NG2GTt-9WtHjy5^Z%|&O^T>LXuD58;+V~D>w4ZJ^SpT6Hm>Z*
z<@{bClAveUr~S$JXt>z4{U6-*d-|<e!uNc9rK!%axnj~64arxY55ixbe;Zrhe}nn4
zlZzwo!=eYzd*t=mm2dB@n|%0c{I`~r{|vL1|C>-VFP;Be^!j)8FWn#Nzlr>i{V--e
zuT7xZ@`rD&1E%GRW-UIuV{4atK;Mc+iFHpH9oSilPo6wmGig@olm86cTlO(s($9NS
zQhx1*bVjP8lgo<G<g|MiKY!+3!gz!0FZ<uF2NP=aKKd95iP=lMdO2^7VQ<IZ;;)bP
zaea9D`jz~LAWpg1rNNPVZq;``<yu@;YamgZ{a)kB<dxww-}KL1S)NwcSa;c~yuVKJ
z-|1Q3kKE^|nD#zkwpUxNOXjUBVb{afDCXbm{dko1KyBB-=(7sKr)K@R`J*-W5l89m
z=JjiPZZ){Lo83#@#r#xLYxkb72VPEcusARI_^bZ6=jB`fw${W=6q0)EwntrNZmaBU
z<vX9_r~YRU-Q$#BXYgaPllM$L#Y;;%l=iS0bbb418L05c!F$fUyZm0qnS;JWr?(#s
z@aDU1v-{vajmvx7lT#~~-@5P2Q}okfn#Ik=-ohranE7SQlIxkTmY6h$R9lv6M?7tP
zHucetvh6e6t>?C<Ok8pB3G?oa&%3_nx0MUY^WHr6ljWZ81i!}z)g|A#X&-q$>(S+7
zQB%(?XY#w`c2QVB_xFY)tDAPJd}4h5MdmMCps(AKD}f*Pm`b><^*C7e*H`_5>9s2@
zyHXd&xz#MY%dGRd!M)<<Ijf$J$CuXj{?<9DqP@md%P2iWIg>^3fUUnW^SyokA6?tJ
z&9*OUwJy!x|7LOCw>7JJMNe~_C>F3ckGNT`z4GVG;-0_Bzilhzov*ChnrkH+AL8cg
z<dMKxZuh%(mE+Hr+c9nj9#^$1)EwING00Ec?%LeR8-KY!u$=Qs=WP$`gU@$*()R29
z)4H4d$n;N_rTFz8euX(_)n$J1KmS=9|J!u?5#9QS=cYcA7x;1LRjt=M^K_+qmpmlg
zH9I2~A6jRgd&gl)vW3L@cALtzugv9zx31L=-Q4D>v;JvdG0%D~?`L^QJ~^A-TAm9L
z?mM<e>xSper58R}ERwkrzVdI<e};p$>lRP`rtu?HDVcYXa?M`Lsps>n{>uIE*N|HJ
zDt!&Z*Z&L|;Sc7&S^YaaE1uns<q!K0`^pdRBd<#zzh->vg?N<i)1G_Dk!|x5OZ0A?
zvrhl?{p98|384}zPaLhAmKneG`=R$uziQ9-?z4-0eUIUikjACzzv<pH-z=zn67g90
zUZnKujKe#*)_h`!Xl0qin%&Ye$#;I_bo)EO{+o>LY>zL$Q<HREZ*oB2y^M8H=AN8>
zT^v7WFck48$6RZ-y*86GUv-`1i{w&e`<Tyh#UJ~>P5lx0h`)3D^n0uy*Uc>CTlLb0
z<9gu{8JmodHRW>AvX7@eW+}3;Tx<5Doo#{cse`$d&l*3w3T<PvRK0BR>)C$Za|T!A
zl$OmZwm<XNo89!y<Ml4pb9-;N3mI9pN#yXcU%$64xikID#%)~Rjz>NCVq5Q%t?^Fk
z+OzX#o<Es*K>0fF&U&wRxkA#5&L&qJetNev(e3f8d6Da<ty}Xp`9h1Ypy->9OAfD|
z$S_`({JMI#YRobBz-t>juI2juPRuQBZhq=@(eTU9*vPv5rat<noO8n-oqDIxB5*=^
zs^>fVvM2u;9&df_$Md$?YIXGDt<39lLXSA4>dck+7kYNt;%w=<PpSR+nO7hEXSi^M
z=eldkqxbfyB{SPIZdm?jIPSTomv55loz-nBeGmSXyi}ZJd1m*%7@n$Y8J`uMR9N|a
z<hGVR4|QSfdpEzgBxviAyM6D^H`yvkMtVd{N!<Nxr|Y(+Yax@uc)Y&Y+OE<_n^rBh
zZBBzEhfP@Rl71$B+wY<hlJ8?n7gtLhz2WN=ZPpa+d0YC*f-gUJypC7=cV(B4_@<0w
z<~P4-m!+~6Pt{o5?>u$=@>0&gTkZ`_UMa=%XUt<*KYf4Z-*{h-Ej!*xr(U_%+xm@b
z$IJJ#zWpeZe=GK>e&O?H!rucwx3_<pFLOAbZSlj`&ELvxlq}8}IiA{a`}&3JXYX%m
zTe$w^FTVcLMMvTyzUE$<)cWm_rNkt5Klk`U`_BKUtQ5W9o^wr7v}>INlM&w|52bzK
zKR(W^QMxX9+I_`(%NG(}JO8lOH8;lZckj3DXZX9@l>4s#<Gkj|mHN|_f7CtsJXQYn
zg6Hxv*AM-Ael(u%)hwA=CKJx`p1%Dvi%*t2_m*AaiRV|s@5XPR-2WpkO89}-%7-uQ
zVkXYNA1%Zw)AQx^<<INXAF21)r}d^EHg}Ks;lHF)jQ6Bz>$la*&n#f5n5I1~=j*|P
z3fEsm)OjyeeyVP^_}zTjAO1)F$$$7ZRd?M=ZS`|1(gOS5tg~QV`1s?R{?2=bAFgeE
z@Ns$ObT-c=Qze+CR~$$x@|3mRHS1ffyWbDyM{m_`JwLEdZqH>Ew@>dB_UxY?5GU$2
z<LNYsGzm-gV!MauimxBDQ?KwoJWIZ{?)K7K9V%@ZS3SxS+btB@@*My2mIwCQ=gglu
zd8NANogYrVYabUIsyZ~R*0Viu{y#(XecRRV{BL}Fneb!#Lld|2a|??l51c%F`;NBx
za)xL7gm&oI1Rdm5O?tYEFS2s|=K7S()cBq{(TV(b=RNI^k>QT+nRmnVtHjmcGppno
zd)MZaO5851ciqqVSo5KEwzl)<w|Wuj(?Ax*?R$RVt!N$F4=s%oMrsR9W_$khoRrxY
zEz{FCr+j_)Ki;V1hjaHWJL7Z7t<}%+7-Qh%fAw=~%NM>1I{BgeVA!kqR?~OR+)&XI
z<I&xG*}7k$Z?5(yKZPs{%WZXAr(0j`|9WA6etyQ$d$-Q2Kj+DP>U@4jZrh&kVIT8m
zr#{NGQOen>@%*>dIX$^kZkrEpjGb4N7x23GsDF~-yuzJ{D{d{wxMjd`E_#{guORPL
z=ktwyQ?=Q&d&*3IhRCijsa2U|Ha+0O-?>||zE4=;%4Ku>M%|1Wsadk_UfJu7G#^?|
z-_m{k^Q!N&_FS&0yOlkSN9Fd^Iyd8(GvQHQF&;`=Kb?Lut>dkI4F89<uL4{?FTVQa
z`t}`iQM(Ln3l7YwW4XTYhPdHkJ+Gg6j$faIpBBjcHRqmce_(%v*|z|Pmn!07(=NFx
ziv`J?dM(VfK$OAE((<|J%t!wjZZ&_4{SmV4_M`A4{%kKcYi&!~c}1Zu`Lacu<=pcZ
zm}81gy}B~}-Q~K@xh5YcwA4PE_;u=S!_Mgv=hap^E9<0wKJfZ&{Iq+9{~4OL*B$sL
zDD0m2=&p0@B!$Aiy-Tu$4y#N4y?f<TbhP}szdPU0`l)<0{zJTeyO`jcAJHG~2k%ci
z@VRtv61Ry${~obJwjT2e50=XOef7PdhI!Vt9~%4T&7a$&l|G|%%len=pVT|+E_)gE
zM&0S!)p^H$NN0XH%0JoS)04yXoHvfoyPN%dK1bbodA_%%x%$WB*-g_nY`K=_^Q$Ca
z(aD@h(V3A#f{Dh-JhwehJn3mF{&Vlg@qgTBf5&HCKlc3Lv#AgJxt%3h?JuZaRdWlo
zNVL84apl{dTaRC9Khf{J{~=ia_WQ?i7e6vTI^VIh)Bfq)J=cC^tyGrZZ56t=`}o0Q
zqV1Bw6Fk;m-{Ie|`r*n`7B^OJ+g6=XX>sPaxY)ks>Y~?k>)gK{{q0dv|7hOK-)1$=
zJAZVqQCnYG`jGpq*^x7>Tl&J!SsXpmJl&{a!I|ex<vfq}&-0i6cY6L-@q_gZb@G2#
z)+9eTy}G{LPJ5a}$$NpQtX;8xmn{0wnDu7k-P20CCx0ec^F?btlxFy+@ni9kUE4cN
zg;!MUd;2wd&pUDRH{Z82JdvMPy=|7O<Qs{U>o2#zdH!&%^&|T?-~Tgkv|fF?Zmvl2
zl+Ss}l}fG3^R%yo_F3HBE-Bl!O3hoyQ&Mf;Y0g7iKGa-Q)>XOu<<jv(&tg2oh3%p?
zexH8oKZ8oK@sI89dv=(auid*zJmuO<$*=dt!uJQyTD?9d(~5Q8<Z8L;rKQ=coK;r*
z%6}hZFoW4}vv$pa=TBJ*iZ9O({;}{w{X_dV-xp>^UGFlT8-HY0-{NZ3Jz`PrH%)e1
zdN@6NZhW-7l&6x>+l5o_uDAlf!H45-J;j^rlwOn>|1tSsw({X#j=%F_rH_<}$Eo$b
zy4lcs^vw5igHw@wvNls&mUOM%+2;5~x#fAkoosCOzV@kK&v|RTJM$pr<NU+V!zTS_
z2%PPi^7}u-EwN7rR=<gzocLT;;+os44X+Gr?=`Q!73X}crc-G~!pA=<6HkhMeg2m9
z;eUqKdVxKu>__;U=83i+sFS(=rPuDAuDs8@chT0>?Hxa#-PDhA?=t(zK4DFAPxI#Y
zQh(lm^lvdSyOy7`enFR~Zc57MSth(QekD%PlyA3KH%p>?$+ka!IetdEx71zP`m56)
zNqlv`bz#OGra8U8J(VY3mwEho{qFjN>U!hgkC80(C)f_Q*}j|o^Fdwc&&>}H%<@~2
zuw~*Q4kKlw-EKx}7z2(oe6x5Rzij>nlc3tw$1dgC@4i$r!^o=Uy0LKc8}_}4vkqDb
z{o6H<b=KL;D*Kc3x5Wu&=$cHr(0C%}@y^@FU&ftg?Y#WH#5T)K!E=$$iohFYcl23G
zj`=UQKmRP3J;-cV*6m|Qtd3NCQ~2_I{jzmQGlN}Qc$P#7wMd>kcEkVQ+4xC?JmH)C
z&-`uHuDbE1mhZ3nB&F0GIgXOBJAPFYxBT1sa?*c>^xD>?g^V|rJd~X9`@_Ngb1VKc
zv|o`f_%nG<V^7`Q*V!REirGZIYt^-cKff_IHRXJrR9+SD+P!O1&PwfS3(Z-<W8mg~
zSLNSS!+nkZQ$<crylwGUf;p~s@m-%);p&XxUmny=y%K%eGU?3iDc_V$pCx6!UU|`P
zdGgL}Wd#y?b#wa9tuwh(`gm{A$31pY^L6+<e-`a&e%p0p+gz7~&Xj}a`O1Hl=gj;1
z@SMh*o@qy?O^ul|ui~|*wCquLf3GSQ?a9skhn9$a*gVsc{YF=S!*?rP=BK+RZ*yS&
ze73m5XtNuiLph6F^D|p*fA_fxdooj!0@hhdC_J~VDp@6PRNK{f0guYm^QRmw?iBtC
zU-qA&Sy=p|@r3Ilr#{?{KD9CNyRo^eV_TAc0)x8kuInGoKYrY*-&?<Rdw)&rhxz_{
zKk~#We6;;?tK^rA(cP1U!e^g4n<QN@p0R{$nfdP}MxQ6g-`swb>DoNTkG^j<PBF-s
zH957-;<w74&+)DCoAxyqe^~s@?b4&a^Y!%Wx4iq~q_fApbct4PNv3z&{<Q6Fk1Qso
zG@MbI<gn(3&Y7j0kH5<E8S?W>ZGD*bCF<?{FLv5pn|>rMloBqB{(Jnf+S14GyW{xx
z{%2@$kH50jR_)!{WZmSIw`b@rjC6bP=ft~*(T#iSQuLcnpPHn7v84Z&^CPxd4}4{p
z{$OtVxk%xOoY&@+Ctfi1gundH@b>+(itCT+5B0a~Vn15C^U6P+)vvkpHt#WdrS3U#
z`kS)vpH;e<&(BxSoRWWQjab5Jh5TdrB7e+&^gk@AG|gq~2tS}^sdP|ANY;Fz<%2mB
ze<baXJ^e9cW5C}hLD}xNpFXL}osn{5me7BO^c8RamfM~E@cpfJ=9-_mkE+eKgt4?I
zTt0MeMp~y&#wAI!Ne7*bH?U_-a#+82pX85;`;=;2uh@y#XkA@5J^a#};E2k%&TBHW
z9&k*2)ct&(r>bOUg4+b%qZhM3wjYpBzqUto#S3$Td(kncD>ipNn`M|Ub)fU#f}br*
z4#v(ol@zpUw@XXG{HnMgcK$pS`G>8hH`ys3d?+tsHn%o=WyN;CtLtwEUJZJ??`H0j
zy{%21Z*t#Wy8q_7)fC|sJIVtKckuRpzWI!8PU@RQKU3c4t@c}fAvNOEl?8j3y<hp4
z;YaYdx*wYt|B?Q%|H$3A{2!h*w(DPPx*K_Z`JLnKSDo8uovU1Cs4<tLa)M8y{+72B
z%um%Ulb5Wx?Ej;8$q$B?v){TNiax(QmbIypX=kRF-QOk8j3jiH$QyHc-r(Q+@1XpL
zp!|k;Qh%EkeDFU$zjK?N{KvHAYhJBTy!QTKt=*|xmNqZ)TAwWxxpvIcZ1t_9BGC?K
zcl0(r`D^%b{$u;b{VC`9j(!M!w7y;VxVX64^jm+ot<RQ--17T(XYk2+mmViC`4)6o
zIX}elsR7rDhzE84vy)Z_td^*@UM}|jqG!p^FBg8V(JQUExq80YAMML~JQrt_2fY%!
z>vny+eD=Jnos)DeVyr7OC8s(s$y*wodCXIWDSOwInn<?kk6162#;d)$;c`k!_r)`}
zgN*l#LPbL-OghCEp;vh{YU|c3f65>0Gyi!0fOlGR;j$k)OS^OHjvqC?d*jB9*tRZR
zi-RTsl}p#Fd`{24xL0|CNxmR^@A~#@_t-!BtzTDR9ohHqQ}$k^XBDLpYxZo;U-2^g
zNqkiFVV2%+-P|h|6iwH7@^hp1dda{~5__Ho`K_&v{j$Gy|9bCR&s~aF)#pZ>`Y>&E
z!7aty5aTUDyPlZ@m^B|0ud9+<zP8jk>Z0<^-1LI=I?YwbZn|+5n2Q!HVenwT(|F~&
z{X<=;Lx=sloh~d9pZL7UQ$jU`|3oUgZWCYSbM<-IhxXWiWPenC<a}?`@;0RpDZ9ek
zzWg<Fix+sc(!}Vz$tI;E(>56R9DBXv=bQ=QDm?3|md4GV)?eH28QPs0U;H*#a#E~P
z(itPA{yE?Iiho|~-SzI0$&uufvz1@1{a1Be@!@F;rAzO+x5X-l>8z==HJ;eFByE>>
znBmJ?)hg#_rX(%=a6q80;osI%``7PzzwBLS>61#E+*|?WJi)r%C(qWL{T;2@{NQ?r
zYC&k^nj(Ma?io}1+P9m2x%=wwvTf6gSSqJ7vZPi>%36M3&-8ccm)!WH_c^}WGW&Iy
zK0Ud0lA$J7i>sC8X^otkRfWf&UfWgh?rP}oh4w8!-+$AXerDfCt&O@ux1+Qylvye#
zr7$e0y~kGMc%HpEJ|f%b?yXn9O2k=2C%v`VQ=*=o{GVZcynfw@dBPv%+qUi(l1<ZO
zijBT`m}Rp^YfR^oTdTL;&{~n_ZSGegYj@=1@#a5~i+c5sNcArI+jl#9vVZoB)UJws
zS4E73nmp!SnN!5?WF?e+=ji%-83o6(o<~I|wRSx2N}uuX`Nwr}ve9qF10(e~1%7TS
zQ%KSHb2jdC(mVE_f3)*5HqYH{>;M1aU)3LpAGp0f=1AH8G4Fh&a+PJ%>HMX4Z@bDE
z9yuuI`A+g)gkqTDtYWqchQ~NeUsl<_iTtP@^P&8Y+CITa_x_!VeAckaBUZU$dB#ks
z*GY#Jf()N42yU~muv|ZXkL1V2kEVBT(e|FL%m3T_;H;$=F0b9=Ta>)f`zf1czE6Pd
z%AGUyrrq#Jm?z>P=)ra1z1*u?f4<wZZ>{xr`?ziM^4OQNdN*ax3SE15@1CluM>cPH
zTPk|$_Hm8Khn<aEJ-+R7lT4c0to)yW&sjV&WJ;Fxx2^k6fBIyf7%?+5t-skmJO5_+
zqc{7v$W8ohUlZ|R&B_Pa6?vxnh0}g{bIS`x9hjfi?jL=_u_Q9`&*^rDLLMgVshn0_
zKhA$^_;LCX|7~W+Js-p0{AXAml@Z7Kq2u4#%O-!L-gz&({yuFUw`Sg#-6s}r-(D+p
z%B)9vW_b4d2?DzXXMdOf$0hpPH2&Z1{Tw>)OJ2Vhyb=9!*VV%n-~D%AW%4dvbU5$5
zZtL#+inVK(?eeI*qBMzFCsV0K@tD1?ol2$@d#g?4!ao)t?l*2-D;)G`$z_vD)7zPg
zE(KlsqI~Z^L%REl)wkdG+HC!M;vP58<DS|$W77pIiyq#+cj~Y3tKTQz-qg3<vFha2
zrpcH0pZ@ZyX8lL)hxTt?X4!atSbcDx;pUx}OnLP_CSEnM$o(q$RbL=NB8*%6%H`xH
zi-moeYF(V~IC3YZ9-qZ&d;ZPs-xfdSf1CK@_rq-4@VLF(F0ax3@;jctqDkAs<o0S&
zmgD(<XG|A+b}2eKdUnCSAgd!XCq76ni`V>P{FrU)stWm|*JiQa{Wf#SkL!LPp7?9b
zyY92U=|J?~O&l%r6B?Jd2X5>7<f*s+($zEbJad?OcK>JC^q-->KC`y^V4UXVI@uq6
z)w)WTgST$UO*<BA?YF(}*!|k0TP}59t4yAi<a%(DTF?7T7Wd*@J2};>z3g$OrnOSH
zKm6NjvC`|@@z?Ul){FjUIOy`9A$_jc<45kt|1(JSI^8}Tbo`O@4{_IhJF*1}m7)|k
z_I>lzEv<}8&F<IZm~i{4N7x-PdxanKKLj72r=R%1*WY2&hqkRtUoJGwEq30{WO?`9
zk}HW@ujo9i&U}+HD|=_2&NJU@AK9j?S`lgd+K%h*%Kceq_5At&SbbbK^FIUU(YtSF
z*QaGy#jWXIo>f(P_T-jH@>|?4MSGTQuFTUHx?-cTz#}aGp80FhJ-hr5OY=+DxL?^K
zeeB1~`iyx>A9c5geVAOh>c-3Y2_chQC!es+nRLTDe_zBA|NWL}g`d4U)xDO8DTxKw
zY~OY7)b%Lc_0RtF&A1#`bNa)D2X<^P_VHb}WBuX(Ex-Rr)w+qRUha~co4+!?Vv=#i
zt<_OR^X)umg{16`jO_Ng|N82Ovo|W|Eq)-qpRdN_KSOKfWAE3sMjYR~RbO;vh9*pO
zc2#y2+Pv;TctMWDx$**|y1Cctv*bH(9Y45M?AEjUP9NSM)jYaw{>senMSJEa3rBM=
z-WOa@?##UHSmeyMKfGru>?;20Z~AE7zQw<%YL?EdOSiZ7+za+k%U}EO)8lE+ONys&
z@4B&j@t!7^oJBjiv~QoaXj&$>U8~<{+g$1LSL<Kb?)z5$P}qCgwfOb5+kXFh{Omu2
zR7TbP2AlBO2lqv9oaDXRGh0RDw34WOk!w!V#T^I3j$1xw@A^D@t+$)-u9>PGa{RMJ
zx|ZKAySsmFUGE>q4?Sjaq94xO7kt`gk?=dNIoo#5`s!_xmlAU}?QrsXp3*OwW;lnn
zEO5u4iM7A&|AbsNm6i6roD(0i^V*v9eIZ*Izx|#0&1b=L9ubiQM@!zG6sZ>v?-?%a
zshJ$J`OVpT8+SewpBxqI=DYTY@xq5wV~gJ(%Vs|sw#hkrc?`#l8Sj-Wk1NK!N&dp{
z`B&&&_cQaZE}kb^V6<B$z{B<+kA?CMn`^3fw=TI=6VTzrGEadeWf?=_<xGk7d#Add
zE}rT3=1<zSKdKM@n*ZZ?`*HSRvulQ)sky6u+{#!y-<W0E`S_W+OZ-hXhIhENMifcp
z{XR15uif8GZ*xuhf2e&wwpZPuQL*jvL4DCZf_hh7J4M_&#J4dpaQ!*@(Pwkie};o<
zb%qmFcBkzBc*QQxG3fjw=>^6+gy;N{x&HF_+ld<fH<%yylpn6@XT2lF-#BrDjM+WQ
z<5_>L+f%Nk`ks!jTK{iC&9Y?nuW8f2+kaX7!TLe{Tfv9&4U=BibN-25Sh2|ZZ}E{|
zt!D&oy4;$zc#(^0r)c@68B^FN%g9VS&n_39w4bj|{@=|i{v*-v1@1(>xV3Qq?p=F7
zif}La+gCj8##;lIiL!HD{F?0#-8WaiWheZ@?83i`yK<yLCPzqoy)Sa4H&fgB>3pTD
z*YoZqH#xp@b9^u{q(0xD`!)NKef$?qSGQb!Jm2$r-eU0$NA-?1dGk51I`;I+292Y$
z6D8MQu)My#u<OU<Km9X{VwPW?zuo<aJafhLZ${VuGdyJe$To5Hnp?Uj6Emw>4lLN7
ztae{>#(RaidrA+O{&aoxUXVBVaeeof4<Qn)^S*}h%)WPxT`|7*ftdCrcIV^kU+#a~
zotXNF|K{SOA75A1HovmcYd6_;>6Rly#y96JDW1DhEG>H{d~nbDQ}|(j!+IOTO#2SO
zo@uwHd=FeOVcOKFdufh)=D*iqNoFWv?lO8MP~rCe>c94Lg{7Xgae>|omwxyZ9o;K-
z`OPJEx7{=S?@1i1ux^i=DYx(I=X(>^zWSB6xO(;N-G*IGt0M9wjLa%e9Q-BoPxQ?`
z{#oG{bEMQx>t5OScy;>gSH*Fn_1}K`hJD<++BjEvGkeRiYo|`h{J9r#;GE&DeUo)I
z&2_!=<DG2p>(HNd%NO4JvE1#-^9wGwvZKyR-x8Z=X>>bzO6ubr?dKUUj&7(7p7neF
zx3I}RTd(YKtbW+*n$Nj^;<L=MQ!!K6Cn~UZvdFnPs(f94jyt+v?X}N5%_zx$RZ2Zi
zrwAQkJIK6Vxj!%a&HkJ7F1>f#e)ahTXT@nx(|Q+`%rf3()4a>5Ky*h!!C{F5Yd4lm
zR|>Q{)f!v-_|5*Cse=0?GTt<-@D7Wa^Sn65^ZJ}`$Jf?X{diSqeoSA`x<ERp)V998
ze*5K5>v#WWNZI}S=0Dz-yfuQV){Ta3oLjur?udOqx&C~-*ee0~u7AoB3HDo6PO1om
za`ztIZ)=d<=5^=wuR9-qEd9^0S^mQFH_r{_`SvHLp8R|1b)HdG{gGK8i@zSO3;lNg
z?KYkD{}~ec`>vHwbT_I$#J|!@^ojw$fLm{aO`aR$l&>r);m^z8ynU=|cKy))joW%n
zif69N{kmR1Md+kZ>t#Kq!>76eB{u8xxu2f)f)nJ{T<Jys88#e0uJlCjJ#$v`<YQ&a
z*sovOwEV;I3%_c({~k5HseHpe!*k2(`yJcs1h3>Q*m3zk!{hrWXEM8Nn4NLKt;3Ol
z)#C92hQjy`dA1tv-*$iW{!aR%b}PO;r)_EBx5tI$d{3{;WWDlw>O3{i*a;dTtbG^k
z?QhxNlB-Vpv9mh2*nCP<#?-Q}MY)SD*e~t3-k;jb?edZR&Dn?1wO+S0W7eKor55lz
z{_W&HhZP=tj_(g&t!1jMc6Z8uhDiBELG3n~-=F?xP<}AKdB1#}WkvpxIPL2-jM<OQ
zrn_CS30zcB?YZgdAJ@v1TQ;|LDIL3XD0%m^l4+6VHD{RA7#KHg{dN7rf`2#VSpKfo
z-N#)M_M>;%kK2bnRiu56H~!C%ax}e0PibFt%2rn6837(UruNTxAbUV=Kii$7=57C!
zeq3c^^zW|cXDV#{w502z!}0w2Dz(M&OE<qd^Pgec9_hBb_n3A{?={Q%D98Uha@8ZQ
zKd+}5MjiXD{budzucilFSKs|=cevK+-o3PNmi0yKRoioGb1q9fZP$9-eBsIC7umDA
zo}bxiBz{AJr@8<2ooi3bHP-&V_&Hs<@9WQ=N7Wyv_O15cJ9X{zKBZSSoqUm<hglVP
zgzv34onoY6?3}N)Xwjb!3v(tIl_%TQzUDhs5yrM7?BrAl`4c@!TOV0p$+NGQKec1Y
zR_g`tdUptk_GfAKy36k_mtUw7d@0+++1TR&6X%_U?bjFlE1lA~_Tf~UL**0CFOa)(
z-ssM)y<0EOUH;+3mp`wo*h*7M`V|a+etghV#u8SuFXzN%K6YlVyPsbkRoc7v43nz7
z_Bw~)%d*-hY)T*ZvLA{HKKsblN!CpD`T3o*EW)22wAroa@ctNE<<aUXD~ezAafWQX
zZ@bLdP1SIl=Q$&z+QN9Hx@%IkTZA*KCbOw&*lc+6FoJPT@;XP$Us5+O?$27^`0Lox
z;$;=(N555ly*sIW_vVY{udW-2vn-#<+vN9pH@hT*jMUHINAKU}f3Saizs2Of$RD#S
z`Rhz3+g@F`YrfZ&waUL;cl4j_FS+*0XvxFt_L{Hb-6y7suDo6<6L)v!!Jeb8N3*gj
zst?@1B^HnsReI^z=LNNEIBt2`<OTnFw6FT_lDAv`GyDk4Gbzt_()7#rX$tqn)R>h2
z3|n8v?fmfiarz<Muv6!~FV@5^iH$ufb>zd^C((x&DmI2GJdxvgQ?V}i(G~l=ACYVC
zI4yD!ir$fU>OaG}*AtIhu3vN5sc_ZKiO+qP3qSL}ZTINqKjW7MulO!`?2|oV$<D2O
zd&7(RsGqkViLK0Co_Xz_{B++4m0epkZ5o#bRRpZvc#z@Y?gY85Z|t}6zA63_aB*GW
z{%aL}HxCyXNuPdFr~GC0eVKJqk-Rfh-dsM^cz=0d{GtbMPiwC`ek^RVmuBUBIoI_^
zA8NABG2ra!TW*&=&Cx=x-SUs+n*056#+&zEPQIwK=J9qRmMOdT6^L%WEc5Q=ysNM6
z`4;tkkMFy?ze4Uqid;o+aYNySM?25o+9&OpBcP?I#ALSO1iy0n^6d{}Ey|`=EbGc$
z6?5I*bnD8{nsnuTOcE3HE+2gA$h_g0#h=3X<htW8uFn_WV^_fGq4)IpI<ZTSx7!xK
zj2Fx@nmu3qWX_qL9O8X^-b|JUA2U3de`>$Oe}-gj&D=VZA89Y!zRmX8J7Yyc!LnNp
zqV4IDlEEj=Km8)nt7-ksPTpYA)4s*37w2D;Kg2TEMmRC;hil(m+5Y(13C!!&m#cjK
zTi1HY##8E#;)it;t)4FHuL)xA6Z-gF&+vSJzb(7h&;EzY_FT7O-C)sW$TfH8$-@i`
z>RrF|E<V`ygY{v0#pykI^V3sVrl!pcc(CCF!+M#o7VqPye`K}G(Yg3*UbMEKxn;M!
z;Jw&Wxoc1OMLce({<?lbeUAKXZO^|`N_3f{uYQUAy8L>cUar9LLfI__dki`4tKO_T
zUT}^{@qtkGi&)b~v+6BX?r$+*shS@X{?z@C7{BYk%YSEl(HC}MI=$$}v>Q8)-}7Ew
z`L>TgM=bb9(mw094I$adD=)5DFKKQ6Qtn!I=UgkHxwaQSm-qZ<c(Aoz^6Oetll5#B
z)rW6cv~Jfvp>OJD|NX;F_cw;~7d+Z$@p1hhk^c<ePJgUDc=K^|ubCQal&qO_wZ;d3
zh1@PrhvV|EH}NZ6e|~lAv%EXWWp6fok+5X`Aj*39={XT`TZZTB3tz@x`k^Oy`i1wM
z#qzWEKQDf4AaQH!%i^oE>#gg;Y^{&(7yqa7$K7bYZ1(hBrws3{UJ)B}Pg$t?c)88S
z=N1RKEWfM^_uaRD(-hMw^HYpIozAi8nUj*@B2t&M)45n_pM^x?fj8{&|Mq6yx)XC?
zO*oJ7{MkM0iVWjj{aQ3%iY70cs-c@xD*t-I2U$1C?@Vv!eDJh?^3QZ(-iuWNJ?rdZ
zN`CRLe;FZg+J^6?I%AtB`_%J0--j)#QDSlkunX+ztC#!Qb8VNb+n;hzb%SX<3=(!b
z{xfi0=zFbw^7#6d$AA91Zq0joP45#!9{~rJ!rQNZT-|RO=8&Su@WP*ce(<@hD67QS
z+J)24KZ`wa_}!+r2kmEkf8TsO>(}cC>yO3;AC%{wcTnBzSMAd?(NFG#E=V{f=6mWu
zYl?4=biqM(#s<@mf6vZ+`{vZHB5x~JNsXoZk}t^US(lvm`j!4L{BXU%D|!B{5v4mO
zox5st^T>1~ccHi3bDG{5mGktZt2dr4xxSn;$g5g@#<PlbJ|TbSJ>OQ7b8T&n^TXA;
zX|K$teY^Hb;Ct{{^%FfFF0CSOL+?0?S)ONJZ~ADOc53-*r(H*{giSp0W7?~tLlz-_
zf2wG#I~c;Vk?Xk3gX@A1*LPISZEwlnBf0u^_iE|afjnw~yQ1CFJy|A-$!vP?Hpt=}
zBXie{3vc>+RQ7Dv`4D|CZ&L@4B>OG?X)+ThL}!=CFyHyQ)R}Lk^Q8Qh&mOJ*U9~FE
zKD$)^ruQSm59aNAJRe9GR?D87p04waSE1{X<QYd9trG`h1e^Grli%}A{i*ucoBM}N
z;@XH;9Em%-zCE)H>`+zdyesQxWF+Zf@%Y~UMdz9SUAf10Rn6D@=m-6F{fDWY$;B$$
z@|1oG?s+UF(XA2W(#&jQD0BVu!N=Ms_4h=sf1Tf~dT;THm^reiXXd3&erkIq@27uZ
zbG+unN7<)B6(gf=%dNBOHJRLO(|J?z>do!%K0WB4U?d@u_~n(o)Zgg8Ev6igyN}I^
zXkiz4nHO(g8RZ!o{z1z>?(0vhBj?xoGCx<+IM04j;y=UuYx_g&6D<r2A4|^o+U?!5
zxm3Zk;PCCfy1lP`F8*iO9P?2m{@YrU-SsnnJzsp&?Uu{+&MkJwxL<Mg6=lDg>+JvU
z?3FLGSKN^OCm$mCxpDiOr+psBJS`sgFvgo?7U|US@2R-zy(CEF@zW>57pi_;zx>Z|
z=Pd2p+<xY_Uwl~A^ND+n>Xg2jC(hOdAE`>5{n<Y1blT6WeUA@sK3vevtia>{vTy(2
ztjkwQZUo6WO4!dWsFT{gySF<w+QiY};QKG8x9+?$yyJ9nazo|wm+@1s=Z0MP<+9G~
z(%HqjTWWU5pW3>pm@RbwubaywSu-|B6o~g!hvc|DW8Sz<>+0=X<BZkHu6mrI=MxY9
z$&TWjxwh!|ob7&hdcv(@TDV_m-7%Ngl5V%W|J07<!l8E0y+xi*keaJ{W1Uf@<+?oW
z1uJ(icpar_w5zhK>dUiDCO)rCs(UY;VDr2^|46vC?1zcZCb@<sy#1WK&bs;9mM?9&
zmp1)pC@J|Bu8=-a_Zwr+zT&T@_x>}qOq?=rx%|h;!Q0}S?-@?|vdL+l{FR$GHfo7P
z+r8=Y_xJi&@lUcM{(zk3wKxA69`avZzGXfa&#si`=LHXM{UqQioqIy^G~=8U;rKoE
zTWY@))SZhLQc1Jl{bAm^v;P?y)?dE2fA;>HaUmD~#ICDo4=_3@H~Hb|+t*@GYMW0<
zJ`v}rvcf`A?n&wTt2Ne3&$g|4e^p-nh~K4d+v|_*rrXW_9r`2L<5HenWNuPfU#49;
z>+=cg9!@^>=Ah*AKOrB=kJWNNyt`)Bmk)7gD-Gt(Wpa7yeqz6tQVRpyfwcGYd}~74
zJHMW&$zA#5vg<Ch?~`ANhhIFY@b?LCVX4mPPp9`<7$vi7&uiLSd}RMt^W$stj;^hV
zF*%zjuYM}#K<=qNOMd26(+(W?X?XI4+J4uF$h#Uhe%{*Pr`~q+rJT-3^P~K4q)(iR
zx#Q6J<e}e#H-ZJnE%?rU=DlJ2`i*|Wb$RyXKi)p9_V2E0oBUAPTQ}bK^82UP)*Za0
z)|uCI$Cv-+@%ITD5AGeb>=cq%I?X&@C;z9o&yOv)@{cTh{QEE4<G1q3zhw$;`Sh&R
zei(SzvgZlU9GNGLmuLMpeiYyQc2D?%=s)onbW2ZHr*wUNw|M{7O;$Pm39Cg8-Eu8@
z6XZYRxbbmguji+Ox>$>!8@HsghP&qe`7PMqt|Ofvf8iJVF?;qs>A!7X-RHN@>~Ebl
z|L}dujDOZ2Ro~1K|0X`WazTV|Zh_i-&sm&vQ+nSPK3OFxJInSQhrGt`{G(R?85;kY
zF7Mu-F*hQ!?fQXj8#!zIO{dH%Z~O9kt$mPVF^`n(?e*XG&0TgtZR4J%Q*Pm<y^AWI
zm1XQ_x0AbD@$2)W@FpAE58JB!IkP8rezo@X_uJYR{rdFm(n%Tj-ad&GO4@Mf<Dq^D
zw;1i`z56%+XV|>|=>0A^z7OyF{d;QyAKve%I)B91-{;c0J;rNZHeEaBx@&UooN1lh
zOQ*;uPnh&FOXsv`@6$<TT<!<c__S8F{(T#}YwOy1*Yx$y=vumQT>bd`kLd9S`5pQ4
z$HeTp^VZrZFMMt6y!1uztBuEb&jd@VM7(*@WvQ>5ynC0&-8V;Aoz66wXP#F0745yL
z`C)jEjrGTTzYF<aYGv0ZUS5||zonFOVbiB?PxI2Y{SLWSaLXiH?0V<2&d@m`suCOR
z8EbU@PW-3z$8gKX@VAx^=d$}<t*QL*{n*AEuV%S-tY3UN&*WsjZdCN{(;5$^J>vCE
z$i6A46zS0yahmD882b%-mi-Tw-{-ZF{&4?rJhy#DZMNG-yDi_o%_`fdw@`MI|MDBB
zRNMWeOH6m{*mLF0C5?Y~YeoD;{EJz-PK!)t`O)*b<-^zcW>WLseey4xH>=dMW_n6V
z^{Q2&rS2ErK6=j_`)d0=^^d%LOO&?Fd%EVq<#)PEw<jGwE#TkQInV7*s4TZ)8IRy5
zne-aH_>O5(toM7CZR|Sjx@WJmZFkI}<9<7LmvKt`oE8=qF`Gs4_kzji<z#=`{)mqF
zc&@wj@%q*}w)rtze^futT=SKC_RMm(3sKQWRm66!os;=|;oi>2JB8h~q7TF_cK8>e
z|MhtH9?pk1bKm?^du_h$W9F`wUEPr{qoQ1^&E~Gi>{c;4@LFZ#xm8^?yPL$%GUxPh
zu&7V&JM0=BcQR7r=3QH*ZQ0BI`mb%%<H}S|ef~?<_3D#4*-P*CT{IE=yX>C*W~Cho
zXWlGy<Z_hMv9yr1U^m^lB)e?;uezyu(a*O|7Ghenyi&Pby}9`~OXKCW75^Cycl=ZT
zQ!;mt^arPJ+WhjjUK+iYQk%QxRHN=<O~v-$J#B_6dKd3RANtRbD%7mwyT53c#Oq~0
z!qq!cf21$CU*o)Q-<29yk;(rVGVW(_%M{<ecPGYVx{;AXXP$EA-C1ngLpzS05*5%8
zeU`AXC?ez3zPDQ!eg1iSdGM7($vbDYZnfR@$jwe~yU*VnoXS^Z?_UW&W52ET?7P_?
zieA0<pZak6*$s>nZ<$H2+fZ;Sq|fTXbGfZwHl2M|ad0M|SCrP{%Z2MF)o1_By7iyo
zp~$Y*C9753etU%`)cHs^F`jrk&-2UrYM$vv{~3g=*Z!25{^sPWEa5+PJFnRUuB*@R
z)je}jZGPUeSC8)9y2PHob9UyPl{)ixcdAI=f0lB0%i3zY?#u_AM;BH29sbSv$C~#{
z)zm9*t{dD}5;3@Q;CJsXR~e%flL}SZt0vrz5U@-C!MotcvfBY4-Me&BryYy6)JgW4
zdSv^HOQ(Nt3Y9#?(d~Astl?+!3HFOe;`#rWmnT2em%0~|vCZnswe`u5q-V-5y|hj$
zeMj_(wd(>78~JWspsmE<-5xW+x$K!lc+k=}l~Y&jy==>WL{9I@7T?%Cb{Arl53+3I
zEm}8S;HHhgvdtwAmpUKU&5C!{iN9+v?)e+I@ZW{`8>dZQ6!~(W&X4Lxzu$)4<9M`Z
z=hj`@415c^#3Gf>UYf6aN6cr1wa0_-<M##snf;0Uap6*i9oO#dn?9yZT;W=9>*>`q
z;pI{-1r8@mF5Q^nV_<u=vtm)3hJ|FoMRVn&i$Cmd+Ir%8)P+64$?3@zEZ@F8K0IBR
zW6|Vi9)GU%teG9sxVIuFr64Q4Yl>;p?=LqVtPB(Sar6JBkMUCSw{IU8H@8}TXs+Jn
zhdlMEZ6f=wywgv)w*EnjiO<KQ+AGD)UaGy{*4`BvZOHC>wEb#S`{Dl#EI;&*?MkVa
zUVb_6-P8Uz&wl-9h~h1*wcRN8<kriJDuPBy6-$J-6#O(2JviH#{nLL2?mxNR#|@&~
zKYWk6yr(q%;d?IcN7~OPRqxhy-IASQb9Be%?fc|YGkE4Dx$yq@tm?+-e}?^;{#*Tz
z^AFVv?9p72E&h+M>D2d=TdQa9-ZJfRz|O8TZ7y!tqM$R&zGYYZ`^k7Xmv{a%$p<Ra
zH%&E_F7Xckx&5=fU(400^Ok?{e|TQ(;Dh&_y5dJ}=StcnuJg@(czb2q73O<!w_;V+
z7nw?*u3oukQpXuNVfpE8k&lYEUaedAcVT@>yjaC--+dpBAIgog7yOZ?zp0|jTXBWt
zd$EGnAn%IYM;&Xzjx6xZ<$F0{!_=5HrJv^i5x)Ik`x{&H#`R}*<*k2|FY#h?=JO-l
zrIu|^yDnvW=aTU9h&yqS-hXFjY+Cb7GE98p)9oRB50{jN*e|H({wMrGp2J4{@$LH7
z`2uT0b$id>__C6B+wSGku^ZzhzH(f<#(rS#vhA&tVvmV-^O?;!{`6;Cq}x2D(8-(f
zu3h`?eeQJpt799E+`k(?ZGL<5r~QZTZ+O=K_`cYU8iyadA4RX_J~~fxmUQ)6-5Tu`
zx7|y)Pac^*Yt81n-i0QU>i+#qHay{A%{2A)*X0NEf2iop6Zqk}@`v%!UwiNWQP-~)
zTQ0kO%KjT4VodTix^6r&+p#P5-Lu?Ht;#Zb4BH>e-{KFrX2beezCDg(-}WmyTje*M
zmAyW<TBl0%iQn4i(MPR3l$$Cg7ln8>B=m^nv1Tv-VgB*-k$nnVtkU`)$?E?TvK2Y0
zHgUzPf>m#3aXdY;_PI~w!V0I}Wu`Md(+qcNE#`^8_Tqf#nI&8ApZj+G*)Ca&S=n!1
z=KH@sVV}a!lyRRkzsB=J@G+^l$!ju<V|2f_ug?$r?Qu0q`&ov*oTKPw_itNgF_f=a
zxMX57gC>Xn^7^zNs}J25dYkvhpvLvFJ$J=Q*Q1BdW>=bioLBx^=oR;>=u>Oknv;&p
z6g(9(i+t>Mtgy!V<KYMA+rRFYxL;HDaoyB~_wL2Hu6vc8x9!-mjD>xo)BLx`G3{zP
zxznRh;)+V%#>vtJw$}cCSJarAA8h|I`@?+Siq!f3`}bd1cwzA*m)|zU8z<a3Ds@UJ
zQct>w(_qGl2`Y`*Cl@;Hjr0-~deWW0sQhbfxc7IP@8Q$pmc@71n1Ap;B4@v^>({;4
zhr_j39?hDz`B3w3H`5-KZqe>dyH52n`-ujr`yS;o`@7%t_P+!1;&nnb9$P=Ue(x&n
z7kwpcqIUX7VB`(G#Y?t+J~8>_wrhnxNmpbimt5*RDfaDQ*~TL0g7W(UU;TULiCvLD
zKA-=qJZHuAL%Swi{&zvyW!|+Xx1H;@udgr8`vw|M=il_K;^~A<+Ed-;*}jy2<Ne$D
z$3m0tx9N}8_^!RF6tlGT?6k!xz00$zik)+1!u;!QxX!a={p4<_ci~y-T`8l!Kc+e^
zuUCYJ`>uUA>yQ2VBR3zZpRVve@t5Jle};~KT7RrRysELea&q>O>D{(>za9~L_*SWU
zTIO2a)Y}?qe5s!vP1wvJI$;_I<7?B@kE$y^JX@N+<o17tq#yp_-oLqD7d?9TR_}4?
zB<o&VmEJ|=Ix$<cP8(^~6dd@MAN6|w)^**#Jx~2-5HdY$eMBm3IqUJcD>7IAUA+9&
zNuGjecbT;b->x0p?l-;OcGU@$KG*PLqWgU=AD<9;_>q2>oW{N_mrc95^EY_rCL7HA
z7TRR{U5($&;>=`MIiK_s?Ab<hc7OaNxs=C^TUfQd-}Lv|+_l$pO>SMUQY#CXe=Ggi
z{jKqb?}i_mXEgs<`K}pP`?jx$bFa9~5)>Wpy2)+(L?g#QmWf;Z?7md!h^~HeH(h^e
z(*4XCo;%GaZ!Y7zd$cYmeVyf(XZt<(>DEYG+NXHSzkb1wnd|dv{8#bj>Mgx<QOD3@
z+orcp4&IIVTFa+-2zNNT9cO;1-&N0Dll@`Zv1`wd^ye0)SFhx@u3l~FGjTWLvtu4w
zYv$!RoS5sz%zJxk!{79_AIsXbCM|igcS+8yS6_U#`iHLkb0qVco#FNW3=jI`#op97
z77Lp$@A#ViV1lpCzl7~qLf<`_arfA|ja&XDI<<J6-g<MATY`O=otAogjrDKlieJYc
zg+93+RX6{^iv?HLEo;(Loh0$tb(VXRfl_jVrwgOMW7nSr*Gu*byuSazFTZP_?1hE%
z180X^t;x>LPR|!UtL^nqao4Sl$0gFsk}o=_Tz~ie$bW{L+{fy-?EfPi|LAfJ`|jC6
zALTYLxRY`1R_w2XY1_B26*|$m{LYqp(W{FkK9|WGMhF?k?@cs*V<#`~w@%H=@cGJh
zC#ySa`X?VxTyCQ?rL?U7S-r}ChRx>3_w!e{KYk)!r@wdWEbaTkuZuWy7w+zoNSt&#
z$?wIpls2=7D{pw5CPmI@ob@gK_Uy;?&0qI-&f~tc<@S!Is28`+lyg0uF*9%8{f<)&
zo*oa9l_uD1Y`P;DzqWqU_CG@3kJWE{|CaZGeqY!<l}mQUv5~%|g_X;G_*p#J`Qh2t
z(wt))Uqfg8v!1e@<I~C=o!nwfmbyMZH~+r-yV`{R=Iw8je`v4xBl_e1q8nMa`1`h`
ziGRE0v*BRz!uz)kJoFNFPr4VKUEOctqL>-UWpMHyNAT$*cAAMFZceqTsH*vx9X9LI
zuiV`7sG4s!J#vwnL3Nki|JEP0pYDHKagR0ooBEH;A(OJrBTEWJ*G%&1xSzFKQ-(2q
zj?mjf+n8l|KF|8ob7jp}U*iYUo9_p1%eeOPt9M5lk4j`>b(`U)9Zws1C%J{lH2Aaa
zE&g`lV_NTr_hBE?59YUo$LU@&;nueNGB^0}JnbEu_wBr_|5mkP`IfeCcTB>k1t}d@
z2{Kx;z?kh^!1^=a|5<!g+xT!U|G`<)78jN-dtvCOtNUDGiBgTnzc{;B&l?u-Fy6WT
z@@CEDgX;2I-v6kNe^ys~)N(7I=f&>p`A6mQAMS3<UL3hG^_HGW;pcQ2G1dOSch+3L
z-hW&Ex9^{FjpUDq59Jvvf>b{GUhmRbztuXrK=^!0%dsUVMOqfHcurM$_-)>!eR?03
zbnS|rwAjq<x_0W^`+4k+JLd2w9)BDk_d<Tl`Xg$8m;aNmalQV2UHbM9kM?Ni9J}Vy
zbnD^FG!H$MGaXCkswn=Na%*>S+@&cG<AVBK{xc{af7p4cH)>V>*8cvQ^u;%RWL-M#
z`H{WdG*&on(;m6xEQ9lTox&;Gr!9<<EIJh;P*rov&!BGB-}!G!G?rY=+atg7c(usp
z&dAPQj>#tiLK3$>Ej*FR8=qNszg}dI?#J2R>b6|3QCt-jcR%CTySe()lJ6HJPfBgb
z<+$i65vdYZ*d(19$H`}V-{tT8KWh6}u5Gm!`XTgJU!iqb@7virDbYDis~oJG84o5|
zr+3}{9b|V(&+B^r7rUzuuNw#cK0nhwZOcZ`XnL)a(wn^R9!DPMiFr<MU=J#&dMvsA
zEWf1Bq(1@I9hCps&$qSUJAdV$<$ng7f79yDU5>q5cf6i|Po#-BSN=M^gz#yGGDS0F
zKU_?_yKRDBdF~S#o}zl4Kd#j*_XSO_HAQ^dHRbjd5AFo9S2K7Fj!T}D)n0YIc>nxo
zHQPmYR&y)=68<}RtG@n$`b|ePo-^qSK9{LKJ?F=-p72}uw>3p&?cZ?z*lg?974N3`
zbKI-U)XEFgsOa%y|32}<DR;#NrTymn)9ocPcgaoutyxi2GI9By?bnxtJG2Jat~p_I
zaEDP_^1<6%=1-A5qWPEi?<&)~TIavH{g`*_%*Wdfx5TIKO5>P0>DgTemB;I9vsNCy
z>we`a|M!y1pKOJ{&4|v`e{3>s;_)X@ho)sqxs+*yZT0x3#&Iyf;<)3beP(|<w*0o0
z{+9G%>fV;kr+2?)F+H>1`fc{ft`(J>IgAHbK4`zae=9s7I=@%%WUWqiDeG*F(B8+#
zr?5TV$(``4ZGFf7<loCT|DA24IrFVbNL%S`r4zjqOAXG?=qV~bVV(Uk=A~VYOZeyY
ze|P+qXI4My_jmt^pVN<D&idtl?7ZAe*K=$0OFvdWyyPmnNATS?L)A6MD|ObK2o_w&
z__ITOr+od+k0J5f|1LeaYqOM91=~l}h6Dc@GCtdHO=eiK$ajhHgE<Rst=^Je7XEO)
z#QohhX&=Ad`F1E%`Z0flBd12{k*L~k`LB&dp3;qvd4FENV?JvO`?tHBXMNJ{sJYJ+
zJ4Yh2|Kw^X$G_)iALRYAX0!V5t^e5nGb}lBpXc5CXSGu+5@#m&J#ON-`$MkY>xFPY
zPs7PmU*vYI)Bl})_<O~t^^ZC~pE_|b^3M{k>?K>a3pc9HUUTB`dqqC0{|uWa{<{8r
zYJBmnt>;eNi`hPl&CbbgPulit5nVi=KlLB(dh*u$$eK+(3Gz>UvQI9WTwozn@~ghL
za&oQTsp8Ct_lu@>u{iH2XI~+^a{DHwLkIh1E5EPHll3y5AkX72yQ=r-l{XL9%hW8E
zo4+<jE!FJo?O3Nz+KJEg`0h2YkbAzjCi&y^hv%DY;ve7VtN49nR*rf3uGA}wj=hRl
zJaz4?h;7rI9!yo=XLbGR_Hc_WKcyv)6~=`=`kkS^Nnllz(%(mIwg)YLrIfAD=Ikt(
z`l$HSq{8%ue<$kXFYU4Yc>3|arHL{Haj_NWz1to|v`<TQT<~%;!-2v^l}+~kd!Bq>
z&-^1%#QV2N#F7l9l#ltn(chEPb=TkJy{~6^Kz?fV@;4XPzBIR&-e={RUM$it-}B|M
z(&E)3p&#DOSh9g-0`uba{(F{`vV=dmekA`^c*F<)H}@ZA{u91`GuClU#q?uZ-&Jk?
zGpP2hH$5~Z$Z56JsU_2b$|g3Rty_Hf%c@7|K>~MI)W1|e{aDLsj>z+i`>*^;e-M8t
zpXv2H)gOxszqw|ne9ZjZ*<~3r|IKbmK9{Zsyq}B<`y!st`nfv(L;N9M`$zmoZm3*Q
zy!<XN$0T#jnxlu^S;AR-pG!w1riM=P*Ys&fR(bO2roCc?@#AOf_;&m=zM8+}-_0w%
zf1a5o%518gCt+?=AR6;X!NSRawcsA>N4@4nuXY{3^-g)K@C*-i<#N8`4VJHL|7L&T
zvNX-`3ZC*y|Iqy>6{dwH%Rel>_)p`<y<5K@t*Huc{kr?7ZpmA=W5*t8FEOfLw*0(e
z=er~8pBilvSlz-}7iSzHr}bm?Z-<y4Gq=Qx+HSofZkF>XturiMO?l&Yll->dr;J1k
zUs#Afnl)`}X7$JQ!Fx7L@LO-X#_NUO{b?4T&nI!d$i7umsFL|OBFgA^UU&Wb{|ved
zU)4wb$})ViC2HT?J^gB{!gjqYEUx%{>=)b0Ouo6x_MY5brm4Gmy5i%5Ih~?q0&_kp
zK2~1OUi^4^|JU8KUq{DF+&;hLxRtvKr|!<#XS6sEozDBDp<u3ciu3KP1DB(`d-I)p
zdJn%9?<qW~{N~5)pFO`X*IB&UUe(vU<nOMq=_mJu{%m)Rh-FW_eC5gS>rOqg8Lr2x
zXU47yD!=iwIBfIweBnF3`IXsvFRuKw%jipB&P!G)YRO^jkF(YOviMu1RE@l7jc|S5
zMT>aeSm~9?r3va4bIT0b+m3TBpI{;PpJCdp1<~il?%j*2d7?gJxqZn5qvH8~`>wva
z<=4G5JGjE{c3`V)`jwI$eHYkI>wG-+xIpsoVu8ZfajiL8b4}L&jriFUW_jtTliA+$
zuXaCN+qPD|J+bd^xx|BQtWCS#g~py?PQJZDCj7FT_4O~>_HDD=HZIljOw;q9GC_7h
z-6ub*R?CCR8`huf?~{{gKfHhQ=ZeV>pKO=ozH)5&;#)_{7vAyDbBcR4A<}ED_{=9e
z49_^+Y0o^&c(nTYTh{!?@7wD)T(L9xk@_h6^NNhqGSjZz+SvBpKSA%7xe!}}AGiCC
zrp-KN#uF#ho1ZI?xe*!pe)*&Ri=XcJzZaV=_cC!^Mb-s>-LCUleFyJXwKMNLKFyE)
zVZ2EFLHD;?*30}mw$HHd&@)T5OV_T4xGGNVzws`)j9H=7>2TMRI^&AjkLDk$Z<}@f
zNHzCret~VBS$Sz2r(N?lo1z);FXZC6hYlyTcwFWrD_gEt`|<p-z2yBG?vHb~_msT2
z?*H%j4)2pX`gNBsbSD3t5q-y*p<d^~1eKEv4@%ZgKJjTgkFVCp@-5RJTzvgZ^vX)F
z*|Gf3eFLYx(zw#R<<DP{$Mft3FD>4+dz)U_t|lYH^Uu#${S~|XkK+%+hj+7i?hDnp
zRxi8l(OvMLA@S0rhl+i%OC+Cnd2bfT`JgKJc$ty*+xgu8j^5wAb#Cwaj<qIpqocN_
zde0PyIhn6=?cIXTWDn(zcaH6!PEAxeHC1=p{)*!t>%{tx&A<CE{lwE5QCl8nD1Y$P
z(SMixc|qgdSkJo~w>`dIXZHBxy48p7@q9GzS^jB{akAb*tpt;>EWH#93&!N_pH<HL
zKUAM{{cGWe{%_TPr~I+nHhrGd2esZx6|Y{og)5@e78V_xuH;;37TI_Ca8*M1OaGRw
zd$m2c^&NL=)8=T(3(V!%?!b7=pu6YEuj|Lt>~s#zdb-$ke|Y|9+ZRu_E?ch|ed3?O
zpWxp%HGUuR+uqouKYq<UpFgu|&b-jQ?-u75@&xTW`#Z^KN#dzv+=em<auueh<0{NO
zF1%U0RkrBUms_tKmuxB7nlY*3I>Vkchw>G7>`EU`Ja77!zy4sz!mC@j>zQNXUw*eb
z-}Yu}u77aj+Q8)k-h~W3x9;%nP7a+GK21|{YMIa+5$XMkf4m>ccgJs)+x&1X`+<1^
zSKileUh{1G)~;KYYM)zr*1b~+jR+Mvwo2lJGRwmmLfWr>6n8%ES}1k(t;qY@k}$hu
zlZBnV?tZg#e%5*Z5zJbZ`$kW16L;RE;(4}>@BcHrezx6YZq$W4EgLVtdGmc`>}k12
z6({a^oX^|(YvPB;|2R(m4*Rin((7Z>qxhR2Omt5A^y1##g$EAVuAQ}|Zm(Y9<;n47
zKcxS0Z2XXY*eodPKZEd}*tOZ)#Ww6|yY1H}Yj({oRHf#Ke;HfVql9dkdihin<-EFl
z-}(o2>b!dLXSA(P-o85jyhxqmN0$i+MlS6QtM=&K>)P>r-j7#W?<PJtFZg43Kv%?@
z^;?rqyLF0eS|$H2a=TXYcAt{<FV(+w|LwC+(Qlr=DZJ0d{loQxW@1st<|hl?&K5rw
z>-6vLlO3Jj$4g5td9B@g;-}%k0|y@Mm)v8%KK4bhquTs+XIb~;?>NjpM_A^Gh=t$2
ztCi-GmyZWcjS|@8ck7q_XPYzERp*Ii2~WKpZZoAu@?&`0m)*VfN5q&;S%>KSOV@8c
zpjiFa&wg(8zwQSwY77@2t^78{ZD!Kc041%TE!ykPDyHd3@CdM92$y}lzVlYw>W6>R
zxK}?e&UmpZF*|piIm2S16z0!z4stiwbsvove(*s@>|4~o*<wqRbyt~BIkPP2w!sl?
zCP`6uo5u6D+F3tVO`el{CnTs>?YC^`^^O`x-l^wy7G3t1-6Z)gB`Idn6U{W0=L{PH
zzsjzDayRIiajwn$648mB$_;#;kM_-N@^7yfs?l6tvHH!DTX72}uKjb(S-AILglN**
z11FT5_&6Tzu|D!oc>ARq`xUPWPa1gSE~zmHvMN0xe|~RSqD*q#bDLF`CjI>F^0%X!
z_r<w(yj8blNuFOEzrudwlyKvWIIUS%g#S%nzVcWV$5V@6OulvTnMDh)mX?>Ytcf_y
zJk_FKW`0ukSLbisd$aR7f6RM0WwY7JjQO$Co^J5Ja9u5ZEqig-ocZ7OBtQL^{(61$
zlO6S(v9^b0baZyy?%|P}`sMzS9S=5M&w21ub(XKDYPx1)!$&1GPwNi$_gp`U>P51}
zr9_X2y$IuYoL0Lh!N9ii`ThPw`)>T0Y$ATopx?)h^{q*?Ym&5mmFwet#k!a0*H``7
z-<7jrze(NN$;ZDh?dOm4lK$)Inz+3r$mru2cKM}cFBJ|e&hlMSB%{;3{DS%Gm}T>y
zs;**Kz|+U>^&%*CRn4BNI?<oLUUSa;x|Qv`dee>)rx!^%4R*OF|7@?<y6AcCQXE@Y
z@>R)*x)}LOJ38{eeK@{;ecshfbp_ep-OH8syxQ_r@3_C}*ERVwmwcM?pP^Q=^4Htr
zufx~A%Uzcv{pQkfvzWif!d~}Tm>xb@Su~x&U6UbQ`MT&v*=z6oB)+Lju1WQGcxsig
z=Rkvf;N=%uXNsmY^ET9GYiVy$NLQ9?TO)m<Y|1&?e_OO_4~LXVxgL9=K5@sX$C6*p
z77Kd>=^OmIx;lEk9#iOanQJlo(`PB|?zfcJWM7*bG=J9`m(uk4HIbVxmELdNr+;DV
z^GVXuf5kp=F732A7O|vb_0*W&Bg_+wj9<t1@00mE;my|hV$MryY_Gb$F=FODb3M$$
zF<(Pl%j~hton;SREo@|$F#YxP<6^Ja<Oj!lN;KZ3G_L=Wz1vY~U6ip=W%c#t+H<=8
zto)FEV87gt<lN)!f09e{OS#!LP0?P^`MoGcyk?!XK1<_{r2Rn;#5EGNEcWLAlGmSa
z`gXz6ji2Sa>XUP${xdxKw(vvEE?2&l$*RY1b~DQEj#~5SXI#p|jnZ2j!^_?-w|Ol3
zpkA~-VSmSbwl}Tk7P2jU_<Yha>!nUdi_R?U(f*c}GAZKV&j~#Zjx5cy{;JJB^q*m?
z`!V@j!Xe!c<~Of1ee3LZS+VQavm?{CZ{ITET))iuqK`-O-YT8`Ji9g1Iftt(<%68z
zkHa7B13su!nIBne_Mai_!`Cg}J{(<fOXc}*yO@5XbCz8#ItGhE(<Yit72M}qyH)1U
zrp#p(KlbQY?!8uL8S_Wy$7+^~H>1y8zdUvF*}l&?iIYtEeon|as4&OinDNB;wey+&
z=~Ng$j6b|Pp8em|IME9=sUJQ+>OK8(HQQpFZQo{z?P{~o)o=ZfJ~KBiRUlqx!Y-?h
zCqG?^W@i378_%&P_2YKmkNY+*zFAT9^^bg_?bo~K)~sBfEfjrHFkatt-;NTulN~eH
za*6Sr_<h0Z-Ov1^@}lz(&S$6-&AQL=ZrOa_tM9%}E>B&xCVblUX%k}(U3z(I>a;6e
z)s-pI%R6Uy6}?dDUtlb?`S||TTfb*sUi{*V#ab=H@+#wZy}=L5-+cU_9&^#g{bA}y
z-Fvgy=9d=pE?Zfe$uq69@Ofv+&1c=k9xqE}PUJ6``1VQb<BHS?Oy{59<M|P}{!ihD
znp^MR{4QPb@}J^`hx3nEy~)-IH=9+~nz8P1(8PspnUT{1H{De|b?){>!>u>#Ql}r-
zZZD-%qTlttdeKX%)^~H$m)<y-n)Ax!b+q?NMVBp??>!2yXvuqIaaf>xt3bZ>>(~A5
zx9&IZldCcLD1OA3{fO0)S#c|K3m?ATYZdL?JL~Qvm!@ym!gVu}sv8yKwO)m9ah^~v
z*!XkLhRFwZ?7AxR$~^tYi(mG!dX+OGO}<9Yd;Fh)<;joy5BqL=T(^_lx_0g=&xdQn
z9WL6qF5LR}d{+*C=h9jKuGOlY_HB!pdvKP<(_0s}uF~>28ePn9|0DCa=?~p4z2XP|
z$y}WG`<NYnlW+R5m1<L~t=(7Iv_5Oy$}&|>y7uCh-_N!w?&R@4J?o=>OZlzm2hJMR
zi$q4>$~?Wi`=yDj*3UTKnD`SPZ`?Lrx^>y_pZSKuF4F~-k26^ta<ndqzsi5J{^)iq
z{WqUKD!YEX-}JV|^ijTO*0;dS>aX_O?A9dj?)Ja(J}mOC*sbX3bn}A9$=}lE#zr}-
zyx;oxdE8Xjv*CAVUyina{dMCP3BSm&z{$I9R{LMG&scx+`Xm0Xt^GH%BO7Z>KeF9A
z^IFQiBlYvMOC=Rj*~`Qx-i&!WIV5{wq3Dbq-QTC37b!RNc=bNMDE5c>x4a))<vJg&
z_UB(Wb#+CW_gdqiog1X;r<XHM%v+>j<Sle!nUnlkPZ6)4<b#=#-~TgY$F~%}j8nV%
zr}p7_;p1!mSY0yhF5Puah3C5x_imOw9`nkKPO8jS;}pJqXf4y?V=@A#<Cs6pf3&@?
z#`)pf@}vJ5nAexe3LpK&?UQhM+2y#$o?Y1-H$#&?uf3)j_D-~NQoi{ad(B(BCEZV@
zO(`@rl)JQeQ`gftuir1PFJCs@_KcmR>#j*xzSTGFito1L%U1X2uU>omjv@cb-BA&z
z%ViRkCo2CtE1=aDKFM;4g=J7fE`$7n(wlpjS5=fd%|9G<W_ncX>btjMGC%d+PZRXw
zDRz0lkUZ6c!Tg-8^r{E_6Zi4P{+J)Rt4sUnjM%deXB)0KxcFwJLG&HAiD%!Ky*N7U
z?)RgblMAQlG@rS@z2FP`_0m}9Bm3kozumJ|**AY?sjrt~e!8NOMeV1Zt}ebU8zv_k
z8!ehVG2XU$rPn&e%RTEZ)lJ`Z{kkvzf`jLTzAyS_`|sadztx3Bz1z<=CacSQe}8-O
z^@;J8bysGEe*MpI;PqRtbC0aM1J`7htu2;LK3%Tn5M}doUqtMwl-nEL=Cw2J%?|p}
z_~0!2Z>3MUarYv({^XsbZFMqjV@!MT#-3G?%tr*TpY!P2+;Jyg=8yhwmp`SOCqLf0
zzwyiIMzj47ZIx~uTy*F5v0fEzh2oV5RTPt^pL9O6UB|Ov^`sW5Z_<UcHeLHJrz|gV
z+<D255|jM4DBJ73Hi7kdIhT%#hg{XsW7~8;)pHiN>Xyx0xqd&Hu`P9ygRDWQ2eaM#
zkKPCO30<#ashA)7p=_^x*E^kD@!wXT{kym$#Df|;ryYBC?^{H^+GpKEweupBN+&3b
z9%kZyW>WQT_s8Q$<v%P;`Y5*f!CvvBzmk+I;@-vEc|X@S+2mfXF}1nz>D&v>>Qn68
zwC?NHN`JIJexLK7@GCR1{|u6G@56Rnf3xLxyyl%4-PgA@HJ3$iIdpbb$=td#uhU{q
zik$9!<7ZpidL+1K+0(LbvHQ<_tlO<NZ?E6+M`ja$+gE&hciH8_*66chxxxWkc8W*Y
ztt`#EuA84V?R&S~!h9R9>tfqGi?a)tYoEFH<haSIjVDAmzTIb8V|aP(;>&MJthrAp
z1j-a2Uw7Ya(xM*iReG~dEo?XuaE8Hx<?DL!ACo@@d;BO}c=AK(^0s$}AHLnQ>A>Wp
z`8rl*OIN!5s|mZl*)_lB(?O9>4%dS;grdDxPfxfydC|XX^2|CV+1}c=X4g-)NnEsl
zH2H$`(@=(DwKXyy?=~dgVUF$Vjq3hha%cLo<8wQXuGs7U|MDX{{y%CzVt)t!cz$G;
z{qgvYS;yOL_)Xko<pdM8%vOGjlzQg5*dsUY(nSTqy;mmQaXK~o#!RzgF@KJJO#T+}
z!TrtI-*K52Ykam{wp0BP9B^sfl8eHTm!5=Q(b0>XB;CqcZetJ={gyj(W%M(l=$b$+
z4~O6B->&bqTK;DDx*D4wGnc&hW!||}ULbSYE!*#{YwXTfXZ*^&!e(5Uy+nO#*+fp8
z(>vy+&7E9zd%*<7`m<;2_#5Pz>#TnyM_k;${cC^Atg@A<iK|{&HPx>6n(gb+6C|B$
z6;>O|y60Wmw(XxDwcRs5ca3rN&+WWnTfOYAW~$d(z5KlYPVHW=TelZ}Nq;k6zp+03
z{w<@^-oO1j-l^{i@vhF7zLQxM+B@}#|1;IrM>jYU_h*JFO0PZ9cK?h<u)5Lpch?X1
z-<CW0wO*nk|IvhPA9~+zeY)k__gxD&@7ijXV$-`MHtw+O(J32Tg4~64HcK>Ah`ALM
z|A=0eE!DR9WB>8^t>OpY%X+TxOkN%D`f&c6$%}5q9?i}aFpqk(t878}(dE*bQzN1l
zox3jGwf3;rDO>eN*WX4iuJNjG+qJy6PX2bqELqml^?a|si$%Fq-F?@THj8a`&}6^M
ziJQ}ek9FF18D@S+iQJY~vVPLpPgXNdt@STkyL7sL$os$QE3bPkeO!C~LVeHV8tEUm
zKiv9$B%XcCTm6uKH-GEC?Y(k+`$XM4ZBO?++5Ay%u5$F*RBn&6nJm-ZSgo$i^OQ3c
zUAFY0KXc}MiG7y$v!c`wue|X>IQo88@Urf_Z=css+m*IB+bBL>wEb*G&%8u)uH=jl
z;c~o>@^9^bQ2p=Bhm82GcTao_neZY$^U{|Jo!-6E<}OlO@;;IE?9w^kwhMZvvT#;x
zxbLt1@;cwDrPuXpnvdR^x2sP0W&9TR{yMpr`}i)bnfK;L*{@61i?f&i48FbPSKh)@
z?YP^KQLl=%?zl<{oaeO9p5iCwELT!dWOw#h`L>nc_ut>XY_{D}o8r3H_dnZx|EPbY
z{m1hMXZaugeSi4pR_)yS6VcMu7t<?CS2@bWl}N3fdgb|VJC3&jEt3Q;&irwYrDN&7
z&>zk#{$03uIQiq@hk7&D{V2P|dPVBit@FO}H#bIT?a9(TySmcI<)oxxwBMOaQ$C9>
zk5o+jJiVnp)3*B9J)IArsZN24d6CzT{5rRERqTs-;#U+e?XgeS;TI`47dn!xB%R%z
zdG*<zjXK|*&rH&;D_j3+`GL~^3~g>d5+B?5+iwXe)Nk05oBL(0*rf-)h5FwnnO^bQ
z7<H#TW14qlhhy6IbILs?zKo~z_0+X1qA$0|?5z9G5Px<?b;!j_8S)Z)<UgE#$hZC@
zTRdk)_aX7?_e6K>{cuM4^xnutlkP6+yZ1Ng?}_Q>dsZ!}R@_$Lea52fyZ;UK<Fjh-
zbuNvq@x5ZBy)xnz`|qk}*&0nV_k^mhisFoV_cHF0^s(yBNV{v3G*pusQuOM4|F-PU
z$d}I2x7%pexyJY5dztL-8!D1LuBhz!DBiZU`n-{M&#mJ+@wdYGl(&7J8Ey7)k9Ao3
zyvPaF=MP!$^?tOzdr$hK^&R^Zu6@zxnr78AJ^Zm>)9u4y261A0Jft4oG?mEZnP|Fa
zZI$}=j)i3*w@%FC%UZR=pVN26&6V2OwOhVKt^K-n=3T$3|MXw~`nT0q|7acWkNpqp
z8E)11{g}VLBJbC`W0#%>?b!3-%JpgCyQWQC_KM5fzdU1OW|~V^#J+3aKDx#E8ytMP
zxrP7lQakb28-A#+TQu)?@a3<X^D>rio%crm&CPtNY@=V7JT7r6<X%{kYdA5^;09}l
z-Rt~Ck$<E<<kYj<ST6WseZWq3`>v0I*Wa(xS={e*<;&`}(!kWzZ}TnU;<uiu&xnZ7
z=}ToS+mcc?E9Ac59{1n+%MY&S$q4%uu`iIVzm{#G?iBOz0;}5P0>`?o6t@fgoZ!iC
z9bKTTSLYadB>1S4#j>q?XNAS=HF@!VzxRvTTkkLR@_hTZKK^Qd_dm`*4nI=!*GAty
zue$f&^3`!mmR({lT%mhJI8pEL!iuZ!a<AE2RZi_br0&`|voY#7`|&FOCL6~O-|oGB
zWFx%4RXXzWvF?iPK~5KLzY?xbJO13=YWd{y#WO=}A~>$yzPo*z#m~zR%=$kXAK7Jl
zZ+@A{3B80XvwbhD-`YL9V{!kR305)O={*N+uB~ZsN)1wI?XWkV+%J2%K6`K4e}+eU
z<OF}rU18fJCmpH(_$sqETX!Yz9P9VG_X8$H`re#&waHm`m#@N(z?~NlupE9WG|wzz
zj<MhQ*qr<G?oXdS%Y1Eg^%pyVzde8QAIjg%J`|^Z<)3}VuW2*$ALMt`sZ9GEQ<1lD
z>-MJDxXMQp6DD2Ucair@vAa&N&c+RHr#3L`_*?bk=VNO@^NuAy3fIJE+9}UFcI{Iv
zZ%*E#>4Ce2+)dX^xUYJ2O7`=HYZt8y(s+NLG@fQ+pYxwVzQX;{`u45!+i$IJ%q`8<
z%|7_++-|YCt7BBx-u*jw)>QfQmIZwkvFU#w-SuVcdE{`aQod*Z*3c<c`fqlAERXtd
zzvIzIwplf7rQDK>CY=x5w5M^cPxrQh?@rkPC&EncO5QTt^@ORu@WdvK=QqA;?YWpg
z+xOb_==JfT*WGIFCH9tNSn6JipZR5b&({A8GXJjaQ@&E8{bBy0fY^%qW8XDPA6f5J
z_S&)SN}lOyZuau%-Am`)^LCvRxkl(ttW8!*uOeTH;IzM5KZ+mJ^VHp`XMOVF`cYrK
z`-jW_8GUHkHhtSZncaO~OSC6#JXpQ-=BsZ8+J8=UTz2#6(NjuloieTd@#}A?{~4Ov
zUhL=JV_5u<`>b^E)~)@)TlfEF?OU%pckZ>-sVaHXg_bZ$s<gS@-NzYuXyYxGiw*4W
z^xr)F?O&n)c>a;hI=dJDOs<)%b=(@Ue#wWg&o=6an@!v9`9yv4@>`}`n<JeCxc5eO
z)=m;Po){M|_MuIi>2g=*(dE_ev!hRM`yDA)7eC|D`f{<Yc6|RCnwtMJ92Bg{f8fvk
z`k(dRX@C4z)ws@gy7=gdjsN1T{TVwyvTX9;nQk?==b)Ue-@SrE57eISxHb8$(TRB;
z|Ekwcd$8*?^O|p;j-|APXt&2UEV~xRp)h&km8$E%1T*Eg%w6AW<G<`bLsmuH>%;SG
zKCtdvT>4P+Yk8mY`rA#(dpC8x=+v|6WLD0bWGQ+%_lnmuHtkRSZ(Dzh)gQF8&v`8>
zr*<iKpVXh+kBoi4PQ7-W>_0i;%95@NYp+PP&WYH1CET~s=Jx4qPq7b6guGc2r*eM(
zp?`FaubvNEI=kBaBhzk`#?7r~ezs$JLq^i#w;6WfKj$B2>-gZBnBTJ^dgly2x1#+I
z1Mc06^?sxgmLWNHZE8UG)=%au?Hg>fwT^|xZ`@^LZs=NQ(D&&6nTU6c!P_b>1*}`C
z_3&b(Gpm*a+lkfN!yB>-D-+MOUHxYCIL}-|aVJaoSDEBW%X0ru_AEy(7p}F~Z-2sH
z$Wvxkjlgm4qnbOKr7!0(o#6bri?3;Ku*;9bAC(Uu^0d)^Y@2lP#vHAza-GG^*DO;~
zY=k(p+*hpEzW&~3t&w1X>;!+tqy|F<3x&rDG86lFBX(U8U99#*TV3Hf`_o@iVKEcq
z(rpSwHIEi~F1}qS|0nXt`Xzt3cU&s@&miC}*8Na1;hR+W<os`iYD=pwc%9y+sG%TM
z{QKO#rhO&5ujQNi##R45_Mf4DX3Mz+iOicG7syP!EOAb2?V4xz9ky=zbVjbo?UMc(
z<_2#?1p#T6r^RzhCDu&I*ZRVm!1jn~Ql*8(^V?t6JI}lqX8kd;HLCYe?r!-V@l1ad
z7gsdh{ucDnZz=DZPcJ8C2R7PnDcUJ`Q0K$j2@j_nd%4r`j>y~tY)@(*|IYdm@yGM;
zgguoHkIeE|^4oUG>8E#2=k8DayK8EBXUtT^{!=Gj&k<VA5Pmp*^U-_fS?kUQ$?z_Z
ziV=RDSloYU-@6|#S8b|0H_v98^F+DnGRObjym#C3FKg+;HH*dSHcpFmoBhfCLj2aa
z8Q<#kFK=0ElqnVQrDJW)&Ha~_uqIV3PBThAtDfig$$Z|9lk3mw-;npYvd8wf;*Ye;
zQ4yEiroBGlvQ6x%@LL_OO>G5dA|s}qV7FjqR{yg7+mtJbvmaG;&gq?Y?Fi3Td&_@2
z*Pr*lnI2a0pCP@Ur&;caq1R333CCXL{9CqP?rc_6MMwFpKTGPmTf&z6U-<F-=zLK<
z8|L4RKW@p(oJ`neK3}9pQzh@ZFQYT--rdF>&-xQxw%<s}H<{pg=<VU~7jvg~?eUra
zA;{PK@Jg9<-|hqAZk9GbrhfR<w5KQOmWqm%QsZtG!<>)JAJu!lc>7jAj_=fYcPm8f
zKZ96}vK31zbHOFu&O2+?ELV_Q+<d~iVg0^`JB|O{n6}+;PW@5AlEXH&e}iQHGbp+x
zYt@~#&OUMdp|nwf(d69t^*`qqJFbgydzxmKFrjer#N!*!X5Biu{Em<P1%;FL)d^we
z<5n@Q*WY~g)S*SeO}!0{EK+Z-JwNrcJbg}2^_TT$RtHUvnjgttTD-s8z;l~&A>)6B
zq;w7U-)ka5HpJdNS@<om<gS&skp1HW!7=;hua31{v}Ok1ViqAz`KdYXE9P%1V3?q1
zyZP3hm6tPTN6w8Ay6bkh+TjVG2e0I>uZh92cebn&i!guud);#RdAFV=DV6%$Jb66v
z$CcF<o6DRmj)lzkI_Y#~rS|mayBpjBIF%F%yz-dkeXfhI;n=?^PjA@{pEo(1=QhYK
z_#Cxes@YrUgn!I++v>W_FU<peUN=fAD=YWM2gZI`ywIr3F7@xM^lj~r(~q6hUF@Lt
zv2Xg$2@Ib3{4d*8`uxv${+d)h>rctwMPIoq>(k;noO4)=)I0vftXq&g_1dy9b%}F@
zKOgN6{m+ngU*LuN<MLzAKP%s4?>4zMao?+B$`^73PpTv{9J_h&vCQ>H^N*dEdbv;S
z2m6Dy;SST!Z`}P+y=S=&*MzXg5!0%Rr|K|dEaBm>P<WD3RG;x6%G7SBdftTn|Cr8q
zp4U1W5LkQvRe?R<AN7acKfc<(&9xGnn{PHfa6>~vM_;hq&R_G_7TgoLkYgGf9RBY@
zrAOn#8><d5cuguOyzuehS@#F=okB18YqL!|ro_Z{vR&7D{50a*!zn2bnEUoz^Kbj(
z$=18-Rngt!il67{?u(P)T~%SJJaJz3*OftYmrVR5Fr{SQannK(&yUf8AO3E;EPv}^
z_nDlT;x&al=@!b*PD=dE-g51a>Z*)7oxY2CLJ_x)JqkEDmupRsM(Pb_=G`_$>`|X(
z&BM0s`LTD!tDoAO`<vW!8{Cd`H}^blIsZED`lEiq7r&-=Px98Du~hzMdDd;dy0nRA
zE8p?Qua9~)-Dpz(q(2?`&W$^_T>WYr?&q!P6Mg1YkE-FD64xXThDl2~C4=}XUdH@q
z=-!eqoU!ejbL_szMbp9!k3Y9=IK{7EA@lZSY}xFUx1zIldB@#RVyT|Qy@7#QXvMFZ
zJN)anrvHh$mYY{HS5G?fQowcAlfBKUTn6XmzLu==^fTE0b>-Zw!jjoLKl?4VnN+dp
zMf3+Bn`t=-GS62&ZjAf<(Ei??3eUwXGuD53e&E4`>4Ngd8RVvZ&VBN5Pvk1s!wZ`e
zY#ok0J8nO<mifVL<;u#Xj>Y1$MT#Q5x*iz4pY(|3fqc6C^}SV}!j|>7pPl{dsY>0i
zf0v}1-G3WLI`A94u9JE$J3VHz`q%Xye;0jSq5iiucgw{6XZLOAxg>jA{On!@w&Rl4
zjq4fzF1{K5Eq~L-%%x7h-nZLd-FD6Lny%+__BnGtUTDa^vOhD}_Wc{(%<SZ%Z$8gX
z+T6G*yD$1rvJjh(`DME~*PqYaVqY-1HvC!t<qg7Fn_|zK{$1y><L|thoK<UNUX~a1
zlxn?MwSe);yu!cQC;l^J$hY2;xbjEyQNHB;Xp`;RcJW+#=B_Iwu_%A1<WJ}3J~s~A
z*H`yviCua0ckUloy=k4L1<I}L^VO%xNY9wMT{P^uZCwEW){wso)F<gT)S2xyoR(=4
zeIQJEo|kA6=Pi$*;tA#g7C{Bt4~%L;ULKn}?{od{%r8G)#PR-=Q+;@!|Hg~?AABU=
zl<b(KvHXL{_en=qA3j~s7Cy1f!0+??c(1?qm;P8Mav#)PwZ`w%DyEO$MVQ#El4ba=
z{ydnu`sFqI558uVh6?QmPG>7Cq~BJbq^#w{R2TMeujR@0SM_<LUq&rDZoBPCNWMA$
zrychgk6mJvl$|~C-kx_VN3L{Fnf<%?FK>Z}xK3rY;;j7ECm*J)UiG8QeAneXDbGCJ
z<b%`1b2gvN+5hQcWT!s+y_33fo`&0(X4DJV$(=5^WfJvlUV4CM>$>E=fC?3fC#eN@
zPfb1XPTSjm({_P{b;&=cPWUAlyCyK=%tXmW?t(nW_l9<Tz9Pob{EoM#XS4NdldAcl
z*~v<WkC=zQa&Mh*&*|XQWoe(@Hh%fcq2^Pfq*^1#DY|=6=C7qK^E0!zPs^MdR>{FR
zm1Uxg*K$rFp|S=487jLC)z(z5HfFeg@c88$p__Fg9p_AaS6dZ&`Hbp^FRBlx{q=pe
zbEg)U8Mh42<Ck&SAEO`LZ?6-nvAp`H^0E4Fvzbc|MZF7%_*uA9@MjO3-&Gy%1R-_>
zsaIQNgWnkF{5<U{nHqfVk&(On(z^H>zwJLhethix(f{zZe`hY1ROBV>{m<aHW5=#(
z-=x!`H*)kU_A2y+yY@Cr^U<(dwy$6F(6K$&jW@lj+%c<9D&m*;x5rmh{BPtRn;7G9
zTIX6-($g8aY|*<5_zL*zw*I;Pa+1kgoePI9PAfaK&FJ{f$IO!JugCY>Y5utV(f%Lj
zf&UB=d&<|kY_C(eyrniMSK4=D6Sv6rU3;2Rojyx<Py4h$aYkpb&hnm`tv|y{KTLkS
zbba&sJ>hC|vt@gNqHl@uIZNiNdRH9smQJqwDUy5ec>Ma;HNuS{8$S15KX(1x=?i~8
zcV+Fo-o4%V%(|Myhrj<C2Vb6g_{3`!t|fAjRT~~RwC_A_w{`PJw``3+xyhw#qAeSB
zlsPRD7RJfGIe8+%Tc6S6c$nnDb<-cGzj^+V`(b_S8XMoox>|>1?Y!?R#J>D~>{-%p
z_IGJr5rTWR9#s7<SM@3Tbe-Owp!lWtmMUzTa$Ae{q{>akh<9qt6AV1!IMuh--YIx}
z%js`k&E=qo%46Qqi(jv2efewp5r6K;ig~AQuFcI)@_y2}ZNh2|z15$Tn74YctZMML
zkYzi6w4Wm~b3dz%{|b)JS}#B4CNWxCFq`rp>=&<yKlG37!}9j6)tmFpmM%NC%`HML
zbZ%m=x5Pf@IhyPXENl&9*B`eRtjPQRV1CD!UcFzpUcK{H{m<au<!UT&N#j35`1hX&
zWwp;Pd$#J+(xvBil|0U#KXaCH-mdGN=YQ=fw@g;??kQF8oBFH#w?uuW^MmyQ&iTUA
z|J~}1XMPr>E0EHBzUt3~4<_bf_Y|*4ebbyc>(O2DGj9FU_OwsjEj@*gf93jX>u+-X
zlHXLZ=$T8Z@sEi&Dq~i?ZPL--AbH~3x;+=SdM@s>Nd3EHb^Ox(#_vThm`d0vnysxb
zu(`0xEcbB21cv<crr-IG+zs*ms2?t5KV5e1+_}5TWE!5!2VMQ}ZM%HOS8a*KLaw5V
zPfL5K)WwP(a|mU4F7x?6!>ixSk9wbO_&9Aj_nB$WJQhsl))qL<-m}8C;rNB?Pv<17
zZCG{pKf{^7+RB+%f7VajoVf1R7H+`_Y%xvzGS{Xa+aSd%Xcw)#tUA0Wa_^OgX{~Sb
zxcPU>oRIj-sBk?pYu2LMni;W7-yZJx)!f|mXIsF=ulc@x@9qazw-|h$s`BLXy)8;t
z-YExkxId05-OVv~R@nP1Uyf$ChaX&{cDiT%&KuG3n+=%P@#eXfc<^3cT3FU2@MNCD
zfwedEnAJR)Uq)Ko$qKVNUEOp_c9W6u`K%54%J&>?8l+#(dj4pROm+Ek$(jSsJmw7Y
z37Hy-G4Iws3r;KS5vY$kH!tE*@0`CE&$$}idj3~%a^IZ(r!oIFuT<@uTU_zr)P`k`
z8mIb+t2D&4%9N|{X)oHMFEY`f%p$&9%5C+d_*Oaf58wJLt_k1I+~g{H;Es>Zo82jl
zUfaTDJAPe%zHjCO`&;RUH)>_vQ{HwpbpBKC>A~}s=c#v>|8remlHWONf6o?vp^Ey$
z;sUqt-*dOQ_PV;7b+PJ>X=cA8ji;UoT*kGiDMm)Ga{ZjeAFm&^HILr(;Y-!sb(`V@
zZ8m!5T)Q3rEUZ=KfbbNHga;alC*r5=4|}lUZ#=KXmG{5o)#p2&+frFA$6ol+`q9(<
zJ$rH=%(e4eFMi~fcIK{ob9i3oUFe<Ulb4%2H|UkbE(vuZ_pLLMXT7kKt-El2njPy^
zlhtS411>+>H}!q6>*Y6#CmjwnGg2~~xS-ARQgn@Bn68Z0Vm@ys??08lZGU_|U?+Lm
zK2yFUPJaLH3x5JjKA%yrUbw62#Z)70&7Y4V+22oA&agL-5qv)V`z-OJ{Osq~XPE7p
z6BXaSr1f3yme;Grwp?EORWiop!@;7D`M+Z(O88G}-Sm5&k)_=^VZrt_%QdWT-uyLB
zWXhtS(YD<W>wERT)<%7Ql(u!n%P>314}FvVS!d==y&ll)e^a;j`9u+|wI$OVXE;jR
zPc7=YZ+<G^@{jxK2k+kwe)zoQkMIM2v6s0Y>;11Zd|1}JaclK^fvDJMSMHa=ucwu5
z6O*c2$?bC4Zg#nVzwv3gva_4R&&6pq9|(-9m>u@v$Ij@pL8mfx7hK!&B-<nD=RD1~
zNtv9<avr=>9oUjAb+X^YH`@z-`Tf3O*84X<KeT&X{_=Z%r+AdvcE0(=l{(jxLtUfI
zCS4EQIql+tn><>aU3XhnZ%?20@n`$l^_|OGr)=zdslV&m^?%$-i~aO(y{XyzaQ@BJ
z$EMe_EVVPZm~W%I%8|pn^XqBvUbQFwEDNKR-f_H3+}>w&bZJDy(-<w|1i5zCzcb(L
zDg5mcQFmr@d@u9iY4ejN`Fcg>z03Rhdt$Ci)2CC~&ELE$WiMWBaGm(T!P7>mRG$AI
zd)=jY;Xirb?%7|l34JV^#j@jq$;++wLWfuC%`McKc;}wm@z5)(hBI{+OjKmucmBEY
zOwqfc+PBu)r~hXV{c+xJ=Z7uZo1P!56T2>!tEjSjoB8FJO`7q)ZP&eFUe(I@_VFz9
zBt}oRYe8S1x*PR;%v-a(;`GB!7vt_${bx96^WswTB=6*hUq85aez6zHxMeeI@4nR!
zwPl?y-i~kfFRYpF&o%qI#xcvM^RBswotK!HEOBpV*y=jjAJad)ez<PQe+F(l)3}P$
z0UxrmPe0DJKU^jCa!uU3>adMBYfD$0Oe|4M$&{#_J5AE=xBBc(?mv|e{xjUNejtCu
zo1e|T#WdFVNL5e4-4_?6GfK4&7KGeCFd_P|+H%p4z2avK`>oI3df0wa={o<q*Kx8R
zqbst%HU3?^<-Jsv*{y$TOP9R5Ubf9lZ2zsO+TP8}Z<K5_5i^^xb;-q}`6WF^AI6*T
zZeBI{ZIY(u(Q4PyP2TlC*lx_Q;-5A7+F$>d<?$cm-^?uht$h36wfSr%{}}`$;wrYd
zK8?6@SY}`C=0kaJ!#KoL3WCfHCYjH;DcNn1Z@7p3;r!#V?oof|nx60bzKg$SkMDzQ
zS&yUZZ@d)NVLSBdfp+DzO=r0lN4raWz7^dh{#2_cqT~D-c{V%Ex(oZ|>(l0nANnU^
zHsQrB@lLU_%c5&PvRF-Y$Vu4Ia{G?%zWF?!N}dI+PYM#l?ke<Dw)fhn?eDRAe#BS*
z;qjyTQo8+zs=c$lb8SqvxBFjR+jE_B#ojwczWMpAw_8uuZcOc67NPj}a?R_X*Ob+J
zHKRqfRqwBU`}*g6Z=Pd$+|xtqrd3!!V%>hE!bbPeUGCUe=VPyz9bS2Q#a**mJ-ss*
zY;S2byzOtgr=WJ0gXpGHjW%!J9e-(m%ly&vH?^4`r2Y48uIGLc%--#B)nu=){(I&u
zt4@#H`R>~`CF@kR-<o}5o}rSfgyPL>rg!7}<F|^x$^3BtXrS%0%^!tc2VPy5v*mRx
z_mSe4A0un0$(qdHm}z#cD#T2H{Zm|uT+o))b}y$z@*P{h&&Kh?z02QDfABxJzD0hk
zc+Vc)r4{Fo-IJa6{&#xd&aM4{^Fy|jb!ncFPwzNrw>a;5fKAWG&3h8VRNZgvD`Qva
z<#E5J8S?DerNF12KTW>A{xz3xtA~0mfBN4UUvkZ3xBpnY>QB)Jo?pwBJ~+1h-{s3`
zUFUqgJ+rgZqs6vuFP88)y?%Px*?mF`95<zBpQ%%;aDFhq;Y)7tBfZUqg$pYtN6+`$
zbv<v7=~6d+y}YoK$q`fT#ki&P7=)y#CJX8bS6^rTP=9E@m`&-&V~@Y}{fK<DH~Ep-
z-iIA37i&UmcBwv{dvxEz!l&-l%X#A>!|uK0-4a;ICj8X%sr$2?xh+-4kJmH(Sbbza
z&!57F7GHPoO_OimcFXkX<vlBT@BGT$nC9s=SATkC$wn=sncTj5UxPT6S^c_0l{I3^
z{kQ#Ru$z8YdE3;G`zHOzd&M8VoBcSyYr2&9p?uzoWv_#;d^x>dpy&3{Wyj0EDJ*+-
zOLf{awYH=)%Uq|q)zAK(@i6;^K4VS!-$gZyqU$z3;;zm5&*1lA;qGnQFO=Pl^Gy`-
z+OWs$;-N{0+A1V|u1F1=m9eRDUy+Uc<KxHX=08-tytTe#AH&tRHL<m|+0_rrcWtZg
zp3Oa5V~Mm<yPb24f4=^7-E}Eb7pojIUs>|CUc4sqNAHLK3^A7`2Yz_^y{ELkbJpqC
zR@-LgR+i>2vW{9K_A+O8>MYZ2lTv9FgQJCt_J@x2?_WAKWUfYtZ|?p2*Pm_7mu$CL
z{jKrux;nl;ZXZLhO<Y!CcReoG|77%Cw}1D(9S+-2VRNHrl5?)kgmbTC4B{2HYi&_T
zialxGQX~6eb<~Gt)7QL`<K4e|-n&bjOXi)9*s*cj#3#Lx^SHw|%w78^sc6EMOA^<)
zVo%(u)qbSjVN<=hruL(Mf8Ia-TUq-gHeN~=|0eZ!?;NYpIYKVmwN1}#v)s}5vvo7K
zzFv$_N?W|<zl={`@^AlV_+~oaW6M1M*7-c;HX6r&+pb%)=2M9Lm+C-E0q6e=Hjn-@
zOv`S48~06|U*fWtL4Exn!^2TQ`@a9%>;M1CkNdIRkHwp61eZs@{Kp;7^~2fqx>Em<
zIKhuR^K=DnyR)c1+d272+aZpm%hxoOcFpt9-E(7kXrcDZU^)8_mmlaKvTyBF@Awn?
zNT2^@xK!`at>+q7O;lU@kb6hk+^74z&z4=S^ANgcuqcu#=9x#zj_q6rUw<|Kmj0pr
zEpO#--<SLBJ}&RfllR|$?a7C4-OGQhdiu3mTH?#@OtE_(-{zKDM?N-Nu`kNEkY%!n
z!PBS5!q2GuDE}yaKu++7|3hEti27bR=?i;uSN&*u?f>CVSiy^J=2AMHxs@y9vaWOH
zGWBmg{Vg(K+T+u;zaKiQIH-TB|28!)&LjBJ-%Ho7Z`*6Wxo+2++FMO|m&((RS=Ar*
z7mKa9ec)I5G3kD8|A+q>#IqNdEl<uaUu!nAw9uw7^Yu#c=<MT@&k4HbKaFk++<Ga!
z$I$;yeMi*%xAknT3o`2T`wz^syj*&tZ>hwF37l$I6`C%wT;aWY!Q8z3<2(It3DZs~
zavAU>IX{cz+yCKy|Nh*)-f{mKT5d;w6kD91Uii3QG-H}niEmcvZnc}Dt!s{jZuxDy
zW3G_qg(Vwp9L`<(*?01Zyy$<1-2V(s^F>PPB{KGN)Jaz?ciVG8Z_%!6(!V_xyR4M<
z7MYgr@4akGfy^<L?US685AEr0Ri4)C6Q<;6*yVL!_jmc$t@|GrZxT_Od+%v}&wPpc
z)blJA`A7FD{W!d8uK1Db6SC^$`)+-Ao~gEDzTe!GOZtnZ3jNg8T{^RD^PSx7QyKq0
z>}}fK{c@ho-^KqK(pSFin^^zouD<`ZynNGq!ORIa)?S<W@b>H1GamK5_uYPDTc+-2
z%TG@$mnPcmxBL{z^?4t|kL4@9*T=^HyC!x`>deO<p3@y_rLH}XY(6qgYL9q;XJ+j;
zlU=)Z=?e(mJF@X0lS%Y!L$?Ptr62BpTkv;teTKYvMX=Y$^?mv^x{F?Q7O%Sh`j^^d
z<$JEnUrs!lTe>3ZIP>473ufl%9_d~tZ+hz3M~lDj-dA%r%-Q>kf9n0%lB$wgv)lgG
zC7)NF^!jeM^2gB+%a88o@9+L+@p8YwAIVjj_Pk-29=+2Q4&S~p`{}M}8FeRB_ipml
zU32{rTZ3zco=_(DVa~e>#pf&ZAN#iV{n32*zGYgST=QW$DLL6Ix;3^BfBbQ-U9Hx>
z_U@gth0ooWISSujy6ULOg|;^JndLeKN1q4_{Q3Q({h>Zr-8p%2{;nG4%%wk`AC&4j
z8mPX1+GGDK%RejbXf@4<inj}EE1#s+=NVz$`_>>m)jqN!P~XnxhjaLkw-0pX4+j2t
z?HZjOFZ?6j|6+bg>sIgX+l9;Tzqt6a_^g$0nT)IHnfD?S?;Lw8Fr7ntv3zr{hIZDv
z?Roc$-u%8_x2sR;q<l%;;kCcL{+Rt;y2tiI_JiqtU*_{>O*d4Z{LuTa)w@e!TZ&bm
z-%6EQb1ak5qjOtD&cmF^jH+wz=$C#h{?_~P{&C&p<5uiP`x)+JY?m{=D(_p%?3t-!
zs@)OG9slfi*tQLq-aETRm;~O9mQ2l&pJjCXb-&z;eHI_(4`s*S;(C89eEp-l#fQSn
z>trs~1X`K@QI<MB;iJjwN5KUvR(Ke=T5b8XBiN|@WZ=)qAN1XS+<#=>^G|+m>1zGH
zIKk_SL-rfIGPjzt^lQFV<=HuxDs^*BCPk_q2^ZL-md<zP)G@Cgl8;|rUmvu^GN0T1
z)T>*W%kJ7$?Vh{kcK60#7pwm>aD=zosD3znFkWhp{NLHjD>i*GUAO*`gvoD<#opG%
zGTUC7{(W?sZKF=$(XtOJDKT0*dY9h#@tgZdz34vP8nz2xy03hAGf(luxm^vJx2`qn
ztgpCr@}|;_b@NosH|+7+<gI;VRnFp`B}<dfo#8bO`(gWW`oo<2%>NlO*7F~H)a_a0
zvWtgzt>5)u!3Sk{b;J$Up8V|;<tuHv_Q;wx@9arOW-3abe`Nla{kPp8m%rWrY$}@n
ziB9WZ7WpD-@7cS1_jf+svwyPRg*7$KhQCFZ&DAM#)ZKb=nr7fV_IYaQVbf24dYt(A
z$_9y?)cn-I*QtxE>{W06Gkd-Bwx(V5oBs^!Umd?^wf%^GkNuY8O(paDnXX-W_Wf|3
zg2BsK-e+cCx^=1kp8u+jb-EAsdFWjgPIkNCXnf+?!*8pv?r)o?|99qkUHyGh|1OE&
zTKoJ+Z_%p{S+mOaCW|iJBII8^!_1FMrR?KoP8H3Wci8UhUFD2d`FGl0z)tOt;)iF8
z7yog{){XjiNjB`*E7`m!OSWx`T4LB~TD^RW`7&)CkB)uWVs2Aq51aXx%-<3=^*;m4
z(;qA451+po{#d=Ugumlf?YEX&ynQ>_whB1s+CDMg;90oJG3VK}3i%SL8ntI)yQVH_
zKRL;gYrUVcT33A7O23$mzXPs$mv7$s>t$^%Z<rpJ)#elS4;IXqU1KL(WBH@~QNP5G
zZ1)TQOkPI0Zd+!O&FlA{A>_mNP8-8@$9B0`9kDcwy`ehE$kQhJlHgOLJl#okMwji(
zYt(*B{a_sN;p@DGxs~~k^m*?@+>g|~65#jZTceD%o2RGXG3lO_Z{xSu^N2q<e^mZ9
z`?34tdl;APTlhGh?~m!_8oPTkS9{W;?Rg#T7K-0mAgI_LuyJqek?#fFZAULe$az;P
zOV>}^FJ7bgL-s@RxB3s~dulAj`aeE@c)u$*b;IV5Em1Mw!Y_I+<H()uKi_{>U*wwg
zYZve6s#s_)v9t45c6ow_{Kg-#-OIH~K78)(_4u@V^{r3cc~&n|)3bM<jJtky9$S9o
zsoBq?qVAV}t=Hcv_@CjRwoT~LKZYMIKlUHF-xBrw$Y1{BLeW3UK1u2%ZU1oZ_RWQT
z*B(6&-rsTSaG~t&oed@{#aXPaJFeDE`n%wt(U0hFRv(`3oqlkA>)ItTuY3y^A72&k
z+U=g5slJ0>_U#s3-lJEnuT?xu*ZN>FvF*}<e;NNy{AbvDwf)V`2lpj@@E?_v*!i*Q
z$9eB&@2;m?f6ukLcgf<U-afDBShbfCP3pdrG(vmL@-q3~iXZyV&?>+A_#YAbZ_%?K
z#y8tkug(bnw(E>R=C1axT%`#9&PSWNGT*#;TX*sKj-6X7nb!Ec`=E14pn2k#JK@v4
zBzGNow9?#l%k16dm)$PaO5eKm`bmvnc$8_uyz|_qXQs_tuK!!=Kf}R<KeivP`|SMq
zpW$t9ZsuCO#cazLo)zm(xGsJ<(oshIR*7%YTOGs0vUjc*9M}8GsA9O!iK#C1?@s%C
zSyMZMn(7~_zs)P=+C+Z1e(av&hx;9WtXD_f@#egw_a)ZqoaTJ@dGdOpLJso2(_&9N
zv-tL8Ls|Xl^L_T5HMt+GAHDDR$MoaXYu|a_ou?*FdhRj*?X+U??M)9=w(an3@>tqd
zvBX`YC$u9aEJ*vzyzHIpmt1+5@S<<M;)K>0R+U|z>dX!GQorV~x82M-qEjRKZnF2A
zm#P|Dc9~rNIbU~1VVc=o{*@<hd9T0Mp6U3=L$QNnLX6R|E(WgEa%L+eWRf>9ls#I1
z*K7Z6LHDNpFD~)16>%^B&k(h9>)s|!-L*4S!#ix2w6e%PUgw-Jp=#oBr4>;>mLJ-5
zPkQB6j>Q=dwWU4IEbL71vkS72{m!@d^;iBCC%0YvP+IhB)0CwmH?RI^N+`K<zwO9}
zf{Jr8g+Gh?v$kuitZ-&1er5Ha;p=Mgx6|Sj`XsizUXd24lk-$E<(Bd8VvU3X!|N}@
z=2>@$%$%~3rFr6ng8I0r?N^^Hn(RJ5oY&%*;gsC{FN%L<c$Az@VB<PIr}UWT>p!oy
z?wM?RV7tz5Ij5tMo6H5z+1gKyIx@}dg3b!2lTw?eCe#Jbk@@~BMBuni@zIjipDJ6J
z=TGgk466P8J3Mx4YLVwT_qX{6PAs&O|2xZ+eb+8eW#2f}K1;8|3fY=Z?NTZZrzbpr
zpR7HBll|@dTXFG%r+*v$_-D`Uoy~gl(m~!z;j@DNTb!S%DVHQf6i5hfUw7?gJo_Js
zf`5X4XRA5(ZhqzRyyxAe^;UJJ-<}`$bxuE^FFBLX{ACJb&(qc;EIj4stiq-|{JrJo
zuYZg$Szpw8{&tKzRi_$#H@33aOK0u(7FChcZOoE)LL+yjtMKhST37w=RMfSNnZK=n
z)Y(RzRhao`hg?k2&)ZygP8sjc>hr5OF8a0nc=pFf{5_wKC#v2FJeZ#=Y@@YqQGmpr
zlst9q9qCUkR2qu->;nJJSev73$N3^W+^Rd;F#3j+rNElJx|;@E5epyixm})kZ@<b}
z&80!R>(A`}_V`PV%<bi%;|o41ua3&H-{Rh>BP%QA-z6uR^x5rV(_&|7C+kF+Y5mqA
zlLXoow3+IzUHYn>{&&;cJw_ML>BS%TylG>Tzk2$&DXAOHZ1(gd^xizlyx(3n_C-|K
z){nm<x9{7!ZQs@{KbAhMRE{(|BjmW?2=lTB#V2I?{j+}OvG3UScT>sTm!~U?zN}ZD
zuxsi*|7Z0w*Yy$>pPK&N-bF&fRQ>h8^y|O;+b?NHvYg$|vVH?Yeblubm*1(DOtR#9
zA9#%O?WN6$vqBn#&Q3oU{&DTgygc4rwKKZ}42tXn<7bDic)#-NMz15ga+gfI?D1LS
z3y;;TYu$eXxhL+J=lOy+aO3VB#)%ua_|N}mSRa+TA(Wf<x!uiQ;X3nn%|4!-cF8ly
z;>`1c!h^rcmi&(0`=l_&>ByRud;R50zPyZF=Hq^yWqt9VRc3k%7!Mq?cw=~LQ=ns#
z_U>jG>4-$<iLZ~ZO*=EYWM#yh&1zXwuO9hX5_~}2{$Ysgm$j+IGIJE-r@y?nd*$T|
zhw@i``2Obc!+gFU*^l=hd;M1K5_e_(p2+2g)u-|lPL|Fz+wQYG<B8<D)FO_9<!P4b
zIseMC<N0lr?sMD8RYZrdzIpahZHHutJ7=QW%8GRn$2vG~%Q#Ow5L5E<m*<D7h{=z)
zA9J1EbWiW{DZv9jx9D2$zdY;D(~sh9rTgVy*z@i&UK~05N`L6J_v?~{I1W4QI&=KJ
zA@ei#b(QC=WUjxyqi(f7V!HOWiT@ccNq(HUMB(MV*!#~a^AF_nyqr+uI_uEMt^+k5
zE1BO_b~>{7Ieb3N%Gk}oz&xqe@OVTG!?m@05+AL|d)o9$+t=^hJ!37ccJq%jLly*_
zV|Zfr%;LD@x$KwgoBlH}*x9|d7k+llWJb=^lKVn2wYzRT%Xl=^b?Y8y4UXLV+Q)km
ziw`P%egD<J?LUL)+J7oPHoIN=!ri@7=W8!t<RykpqOKd$?ta>S#=xC>{?giKO8eAA
zWfou6KU+85uGVRC)E9fzHGk}R?n{{FG8&4oeNw$O@r1<YMMdi(+zj}*-rk+(zQ3^e
z!E0apN5K)drd1a%*?Z>9J7?`ByS-MmD6=bkI(%Pk>(_ej8pjXvN4@|0AHT)=t+Oa)
z`)-4~PAAIDlzBK$y-jyoFuBQ5)clXith~jKFBa`fT6yuEqB56dW$5&sFZ=dpzjzo|
zw0-%D%E`+n9;(o~b?g13Wv$Dy1iHIDT@NOHvKL(DdE@Xi%VP{r`eqz7JyjF+VcE=w
z`-L~%6m5w$xwPtGKw;afRgS-JC^yf~`pVyG)nX<uQWD+0$;<8X<i?3-bQmR%Ka9)&
zI6HRB)jf_+Ugnx)%S<w9XzNM5P~cW6^L_2hZLgPX+ju_E^>VpgvUmCZkG4Oy#-8~o
zyQlGL^wsJ6_qkPtU$*Cax8`!}C9#)hQsQ1RifASr$r8JL@W6x0>e=dj2HDTNQ@ZK}
z;(sobteKvm5^z^=ha~$lBU`Iy``SNDYh3#JlOx-59^stHKJj`fLaQa$>po0j_|H%&
zv%0FuU14I}p1F@E+gTfh9}fbp(#*<UU?&pcJYm&7#SfppGE0|MCsn?@{pEGs!jHeg
z{cm);J47e$ynJO{MeeSqiN|C9nSLsN>%RQeuj7Yut+>5cCd%KwWx>^^U|(G=qkUwh
z0;}ZVW$Zi)=AM%D-%)o}N^S3>^EaA3FPmgfb8Gr_ab{?u&WY^@%MIs<o_b>SAZ3H(
zg9&xg#tWAE8RnPmH>sOE{q*;h6aQWO{!G4k*4asOZ$I7Yux6<r?-$Es4(F^N%<BKv
zKF>P;=KW(u3_JSW_F4u{oV&)~XI}BGjrG|#zTOpoV0-75$-L4__g_x1oOmk#el1hN
zjKvd}&NlpTFz~zokZt|jaNWDx-`sp;)@gGxt@%XlQsFFLt>emh6PA^=sY~)z>7Q+k
zpZ;{p<Zoit=l?TIwA(GdB<;`sGmmPl%SGxpu+E#C;xNgc_0XnO1qa^v9(cT1Zl=wo
z+U&32efD&Hf2*0dx>aF%(2{8iHOpnbJfHP1|0{oE)z;^4mfhbXw|VWW?YGKiE|0!-
z<E2%}l4wDhXZ%{PR6d8a6u0FrSjScs{&xSH+aHt<%xBmmZQgDt>ROwez53j)sYl9#
z{;mt#IZfi~+_Q(+!nhWQ9(W>W?A`OhMASS;cz5x%X_tP*#-FG(Q_5Yj<7UKf<x>L7
zr;9OrowBqky#8g~sbdz`PxBaw)XjXf=iAw>OtY6wQ$Mb-h1Fl~#gD(*JG-7Ga;@p=
zIgpT3#AbZ(XKP)2n3>(2n@L?qz8^ProtykKBt*Bs+vJ!g-y`Ggynp)Yz1Ei7Xzae(
zle{xEvH#MdDYMFy$~MX^=`0sosKQV@p`h^V`gt{_ix20jZ76y<n=Rv}bY_rZ!JTjC
z?9XN2TefFw0+Uz&d^h=jyFTi7pDyO>TodaM$9pUGLgeMljGGCQpT!=WGVylN#Q4am
zk7UxOo>!Lkc01p0r*dC){~uxD!@Ft}SgzREKFns6N}jsA+M;HwE!*4Qj&J9DjJbc5
zx8C`ZefoRtL!AXBzw-qv%7U(IbDh}4TXlhdo>;=g9sLb{51Vf@xPR<-oqX8-gKs>0
zg;RBBcVzSrt2?K5^f`CmHf}wkSYZ)x^SJcpILY6ke^Nj4tzGiN`C;lNSK0j?Ur&4b
zo<6kRq}_X}p0d!ET&YRX3pu!REzj0{JvhTXs%MpZYEb;bpX&uY-L^!>^5p-}n76dB
z{=@!5*NVKKo|f;_OUV$O&$0Q|`3-Y=@^Y9PJdVf6X@B;A9Jh3N%+2|#soqZ-Z{C0U
z>7EdWPrYD5ZN+h~--o}Q`xrL=5r4}(-qLMMPff+5+fLVgbJ@Nlz~M0~<ITS3^RgfC
zcS+5u(wUqkz;kCdd$&59K?=`|g2D!8x#DBm?|$Y+abNkl)AN*2_b0peA7rNW+8_R1
zsK_tc@>$10W)-)`gdKH-O%DsNJYT0h|L^iIcg?;@pACAaGU*dP-yTh4o=x4oPAsqI
zot{&A-1JgK*)s{7{0ILT_-{me%9PELeLP(?l4<)*k)C&V4+j3Ru$1X~QlI%Y>hf>n
z$Sr*?pC4Z;`Ec?1vykb*@w4S-1pky@n&>s}?tg{{vz)HQUk`rpmpk~1&imzUr#`(>
zRJ}f3LfC_;;q)Bd8<H=N)-C^cv}~T*N4@4pbG>})zA5IeInEPsOd&P?OGHXqzLC1#
zeGAE?0*3GFPuYrTidDR8c=%rB$@kM5$Cpc-kFWdsoBKDTe=dK^*3+3rXG_-^o|hH6
zc9%V_@}Sas!=|Tu`_*;V+)Fn3w()EIVM{yXisr+!*6dThZnE>%>G)ljbwzVzBo(*K
zOzt`LvQXl4<c_2j;ul@Zr~hY=tuuHvpHCHZ5(#g_jXTR`ntnaoHgl!7>Y<~lDkrxI
z>+a~hc}*>0>E(6C_jb&0tU4*r|5Y|9F7i*}y8RE?HkxGBGs-`Y+23gsap~V7|3|J*
zpZqA*ea$?7zwOo|PriPw`t!JJrMjPB*1u2gFC%@gdYXK5-<T!8W$*IVI(gTR`j5g|
zSHJjWvLV{*(^=NNpB=w#TBJHnJ2GXCVS1=yvW5CQ%k^HD?d<>PUY5FcJ#KHe%e+s%
z(=KLt+RaFtEWPbWUXW^;7U!)VKcnjKQ}SC?kN%NoRoHZKd3MFqT^DmA7ay$gEzcIp
zIiYO5@uW<xw)P|c#vIfB4tusQ{UUL%qBcxE^1Ue|Uq5XUyTQxy$;us5j!it#)BMa~
zIZMxjNBh(){lu1tEG;e9-81#qygM7WD!tuz{8e1%`WL_6&W?K-yyivm)(11y{m+R1
z%`UnhzELqbUEw)<5l^jMO!)Kt4Rt(!ls}}u_5RPm8Q%2AK6P>I!H40MygiysXH~EM
z^tTFiusPYZm{B=(!|{0)zw^|~LJJQnU*21@FR{7RQkA{r>iKy7sNmiw{hnQchCjtL
z?e7*XVSeK%zc%C8MZPoqbv^bxQlDp6E{Qao{AuFx70I!_dp4<X%PiQ)WmIqfVZHgy
z*=Fm?0z7)`g0J7`e;y^c@7;rNW!A$h8H?B#%3OW1{$FnIIotNCtln>I7jND<qF2&A
z+t6g%v5dJkH#R;~d#YTOBDkYe^1SKK?%$68F4znFll_tS=t_-ac52xq_nZ|UBo@!Q
z)4T4h^-QIE<;&--SaWJm-varIORuW8=^L5ygsaQ+&G-8A`tO=L`5MO`tqWe>WB6ge
zeDAf@MrYL)uZxf0x^-8Z*6Ey$je3tu-W^eL3luV*BfI3UUZ4}-l2G4%V@XSupZxP4
z{9R<n{z`n8{-OPHw(~pRehJIm@_J_O+w~<ozVbTyuz9F%^UO=0bip8FIqTDo^{3d(
zu3x+_^R=Jfy*@WJeOXjw=4z4Rm$!~hEi5=&wCTu)Ud=qcwGXPNwP$;A3Z7XOCX`Yf
z&secK;6wd^^&IjH_bcXmU8#xHK9Ilcl1|=2gQdIMf14h?^7Mky#0j?pZ_e0vU~ymi
zk&78sX|1awE1rj3`Eu9mRHEGU#WB8x#ipBLC2m=Uu6wGHtl8P*vO<RS=k=c2D@Ch9
zZmsq`9cy*-=g&I#LyrnSFOQz*9agvUkICQlb<ExmR(!3$<sD=tT+#IE#ch6`7i(9$
za(1ycx)fx(g>DX%y3Kuc9;e)^v`MayjI<y8XJGho`C;4Qk5xZvLN<M1{r%D|ztf~U
zU+V4UEwf)QVvdcd-QuLDvg1nbx1(wON;>)Sv!9$=xN!ZPT$}7QKmIcWcOSYn$81-O
znON(Zq(}zu%4W8C!36<l6?ROW70EKmB6w<V0mItache8;a&OZ!v5oiIkQ*GdYhvB~
zZ{bHi++GnoZTp#@sRz{}u8AHK+@!VPrmBr?W=KoC$@c62_@5N+2{+l<f3cpqM&|EK
z`|MusNAo-DWc;f?JU=lZvV!;B)7@9UOy80%vF`02d%Xppy;*y%3GOysI_o$~QS>g6
z@*`dIO@6#S6c)cZ{Lp!ZKfxd4=012YcJIgGLxPeze=?VyEwyj^x|c6x*JS@~Z8uxO
zj|X~s3F^FjuEQ28IJ-u^>Id_0{~wEw*jZlM<M~)$_*J=_!qIK*%QB=gXQ^D;(w*Vb
zTVrz9ieruXWwBeDYgzZ6T0Z-kSMp4o?a95rqyK3Buz#fAbTKQQLHY>i!@t(Po34~*
ztes}DM%@2W%1-%@x?6XZ1e?f}UFBMGq$_b|EQ9IMXtQ3O9D}cOr@T$g{u%dIf7z@z
z`7<6VJj}A5lYihpgV3Lx5A_FRg%8K`)a1-k-QQ>O+M>plMajDRKf@-6C8riHk*nQ$
z<Y3e6711Tr-u)<eTvRpv5U<zchtt2A?fkIOq&C>+L*D!qugc1T8^5uNU6fRcZk#B5
z^Voyw5-~+<{!Fqrs|jE8S|G#BPP{pEf3y2M4spM2^Q1HK>duNW+1}Y8=BOcEzD50X
zrcpr7(b77eD+wRnmM_<vzoPz-`O5Rm5$8*nt(m5Dj%j}SE~ZB(R&U*Vktusd#4ca8
zuQLp5_?NA3@7lewSL@uL_Dk~2b{g6H1^+WVl>RaG!~4Tgu2U|aEv{efnavWFbnEr6
zBf6Q(ek}I#$e;J@sm`9ModO)UB-Ll1xyyFU-|_EaJGPptkN$_H=Q<zzXYi4|W6>2G
z-_(`aRogpU{Js~)MNLZEy5*;w#**EiRCKxAIUQ9G?_TwEpW27x2lKoCGf3`JJoxZG
zgGg4`t=4&KS4U<(kKfz={X@i!dwR3~E=<y$rm4KOGw+fmkKogT5s??S8~%;|`26Vo
zM)|Gshvrs4ShwxEoz$g$a#>ZYVk#yd*)?bS<X2^8ejjf-f6GvvRFbxHdv#}WpFxwP
z*wr9cBi0{%s%zh5U0&%{rFZMqt-znJKUr5M2FdT;WpA?Oto*Tffi3av_8c{)D}Kly
zlvDUoTf3as-e>Es;B~LBpRYJw_{e&(>dusD(x%bfvl9*59$lT$qT}}dra$W+>mSP>
z{AcL3`nL9?@$q{0ywcdBbLS&2Chgx6X`?mm*V!-gZ*II98FilZ>Ar>aT<1Q|-aRug
z<(Bd^*KqC+&$d5YtN(4$)i3qJKfI$RAKoXkb$8$OLsD<#WOPgaZq3Zm5Bv7+$f=D>
z3S(R@7;l*r?X9|{F8s8D{+IV}o`1Oiu>MVN>XIMZAM4KBx`IPrZ{PJb(OX+rUJDQC
zd#OKDcUi@MhKhOBUK<oM7a!EMnJjem^vuV$dqwLzOEz9@J$Op@Q;lkVPgLC2!Vi7N
zkIYm1aBr<>PgKT7oonAd+%=K9v%sdR^zYPFZLRv8;cXF%*-DE)b6j(XKCJX1Zr423
z58?;nyJsz3y1%`KIkB+h*WTBwZ&WlN-u^a!wX<Hi`?uZMt~;uYOD4~5^YoY|@NrH1
zmLHRUXZ*WXC-NivQGe_1V9yWy?a!tMUskU6)YVJhxZ}pOZ?kHT?(!{O=5M3dYw{s>
zwY%2Oi4)%V)+~N-R&&XZ`K#|bKIFCcy{J|lw*S)G_4`hJ6NqDylztP=pZjf_5!>#`
z*>`vSOxdoLt)u4~f8$i}+@;!O+wR-HUTFH{&dy-FTOap6Z{5fKN9R(F_HzHfogZeM
zj<y&4WA@8$L)sPfiSL!>zUe)>_39$M+4&aY%Wi!$R627rKuUl1x+^u+rK??Q7d(1=
zde>!>iW=|bQ7>-IUAHKYf5yobQLkq0R-3PNhvS|3!F=f>dXgM7FW8ybiTpbimEUP%
zEt~h)z3H;wwKpnKQ{OH6^m4jHtIq_TUA4<6OmbE^`)$UvUD^e9B{NJ?R(^b2|JdjL
z=JN-%=Xc19?6F<XoIE?8=Ve)b;y3nL=N|kFpMD{B?~#v@ol^0eC6fEkeRiG^ujF{N
z`>?mTc*}})_qv}ipSUzWWBU6NpTC;BE-e2jeq^n5$ki=xjSpLuw;r8%G57hbU%DoT
z^=CiX6L4qG$y}3<UO{f#f2t(hF3Y=P&-rBY-?e*0S69qC{qR3S&zCK+!6B0_9sBIx
zXQ_AZ*}IZ0+qXCSYwJurs=~>1*kt1l!QM9C1(v^)kJt;@>HcRp=w>JSBl_|6x4z46
zy!gldBlF>pud>F6X8CR@-1_(I9&NK(z6ZFrP4LWX{m*boJv}6;TZT2hKJ-HpKjYmW
zN}s>2_@P_5@Rgie*E`*)`;M)C-McEA50%GO8oA`=@zf=1-79w9ImPH>+_~_$WkN*@
z-s;85Ub=KFYt_n>Z#JhNJb!cdQGKhtjE&)=_}lRj`|I0og-uK>UH6|M^=OH{-X2qv
z>)xp=?s?~=2J=o^bgyQmws#?in-Pn0bzSlw@5}o$?*>1z?=ZDztw{ON?6&jDx~Chi
zs&D$RC+L3Eo--Hjoap*?P%cGVS))mSJHc&!N!{!ky&w4>zJI&^QNGir{Gny3y?9O1
z_78_DCLQ)|HF<07bH$|OYTl&kTs`mZ%hfhUQT$q(vWq)@dQLczdj8z6_&3rYuOF>S
z-QHEB{Gt5lt!a~2x=arXFN}8ydUP+9Uu5;Z7iQO;B=Q&@d@_!Y^;`2w``-BzUn&*W
zo?rO?>Ys@p*w#Mc=dTDpHa$-BL+biA(*=1cm-I}HP2X+LxfRmQaVb~tv2Io(gO+p7
z#iP0Tb}#>2c)<EM;)meJ<m2~w>_nq7f0;MFDS6LSvFp}v|7#_+-Vw82{bx8PeDlb}
zJBOFMn<%DSN!=l|cgN(@a%s;dh27k{NBPiwq4i(vg){8A^-IrlM4mRhlE3C%P3A(i
z$q#pDuG<jrdO3B%-@aGh&loK+H_V+B<~s3Fa#LN!$Nvlm{RKTg9zSX|{q5Z4KMq;1
zjXEpsH|t)m(CLVarAs~L>ldyRu$kS|nD%MWq|7;PiKU6t{$<be{JN_5s;B$1UrST=
z^UuFC@!OZzJKUYWoAKY+{4L|hylL_*b!vYsKeji2T`TOh#W(5Nw`}g;&bp_L%B-(b
zo%cxC^4@pp+(WZl_?S|(uRp)ux=(O_qiKHkJmC-g-M0__Gx(6aZ(;Gn`ND@~d-rW!
zel+c()2zJZg?Z|I*;}?(hM&o9iOzU@X!XV^75^Cy<agF{?NR-0m0j@1|H>c7#jm5-
z)>c2x&drb6v~8#NPNgoB%Uj;6pN-h+yy8x*?8TYM)0o9)-0ZT~;aB{-+|Ii0=6snN
z_J=p>G#%MHOW*fSQ+w^P_j1XG?P6k4$)|arlx@6yWX-oX+l@S*zTL+aVX-4fscT=b
z)``zDdU}g`<FfSga<6W!wYDy)(ysh+TI$K9N&of>i^Ru8WKOde*SU4?lf1mmE%Ww&
zhs$zJB@^x%&iZu8Qt0kwKTov`;h>BQmO9Egr<VNX{q6h1|Ka_P{b}`l8HTSqS7rZa
z;Cpm+E9aNL_D6P=E!Wtkom-x|^mb;Qi_<ONhM0E^%A1b8Q<xU?+upJ!{-avG;E%M+
zN96=RiXQ)VZF+X$!|b(U&)${yyM6dOcS3tf*>rR7@_d`%RY!6iGA`t#_uh?V-}mo?
zobul#Tlr-&<At|$-?a|A{D*OA)~;;F^_E*NJ-PH%Vp(;E>Q1pu?`Bx9z2lVdY0Jdc
z@Q9gHYU{5)^!yz)X;b+9+W!pfm;W&ymVT{L^HIESORoKqvimZniWxS6*(Ja7W+pHM
zC+8bi=9?Z~rGHB(_LKIXGohhZowjLz`TX$vTW0g_{|rfDKSUqNw`Q;U@%-V|vlA}q
z>+JC^eE9low(FIzotJ&v{r(;Ay&tgg(lq90QFqj5Z0t}8jbyj)uhaa|ye`Aev@5qd
z)~dgIORsK8<nvuyw@lUh@|ek;Vc(QvHMcj+jMP`^@ohSD*`~SR@2bCDe|SGgACMQ_
zGGF$G6I+*s-LY@?L{heFR{K+FZq>GM#op`F<!@~{{M1!+&Er#jnTKWXrTOcn_V&q5
zUU~ZL(yQ+;N7wvkh`rkCw7AIEtQyqN{GoBa+dkub(=_|d^8F^(wmj!m-)?VSnwh+R
z=Vhh7`px%mR?PPfRQb=4w&n97(-W;cIqbg{t@%3jw_U~lhtvAi+w27Y=v-2rcKNW?
z+&fjWfA`O>*dEomCw$+mcdsrkHaIC9b;gB5=DgH0vuSg$dq0xzv9bKEQxpATaqb7L
zL*BOjNABrgvhkEXw>)9puCz6iMXt>Dy|QlRqP|N>av6_WeNvz9*ec|7QSJUE>zRK{
zKMEhdC-r0FhuQ9)U$f_W*-K<!$}-OUw#xgaYGc>iH+fE`k6!-Vx~-^Y(=mg$J2sm?
z|M}0JlXJNruT$Cf_0PATdcE=0<#K=LXZDg6ryqQM-ccjG_{FYo`)ik0>^t|&HgdtX
zo!hon&#s8l*6u#OWs*hG6cah$JKbuhXC!wry_2`UCTI6|X`Sewf)DzK{oAdcH`G`^
zl1)A;e!5(Adgr31_s(6~+$F~MXFdq5*zSC`V&QGci4%;xW`rj``OmOrds`iEMfNv_
zD|QBdxOVT^a^Y>xy=(V9vpdu`O*?+nYRSg?FTaOP=v2C)?h@@1$+J*&`m#Si_jT9S
z|7YNMJ8kNU+nM|LKQd=se(@{hR@+paUAh-`Z0!zc&OO6zd#HAr?=nG=r)L&uoJ>1^
zD$yWosz&n5-LEeH%&(m{f7(9RLq=8J$w%z-^KULcP``P5*B<dl^V{lpc6@j?`O#gk
z$6nX>XfJy0bnn=$de!pd`F2+-OMd^(d^}C!N%zU{jwOrK<n<ftF4S+7Z`l+5VcYX>
z6(7Tv+a5jM{_f3}6OS(3yHuMen{@4n&BR;L4wvkf?^2h~jx=OSZQWrm(7Jxz{+#^I
zUE2@NDDiK!->Tm5hySDYL95=yKbnpomR_{=n(kN2$g5kcvsY_8s?JFN`7NiJ^$Eu@
zJAt3~yZ$qz#!7$l>Zq80=)MSF_k(<%*H-37_=Qg|k2t*|Yg(Pq#q~*7-mZDpcKLL#
zUh98`cX?-wPAyIT{AX*-@%ZAlW1&wLb}SA&<{vWY^=;R(U%6@bPCb3};bO>@<=21R
z|MfNfLH-{R?a0gZY4e$C6n=#NHv4h;XkFRF2Xno6-9xJHZ}u!)@MF?1>)jeckNqoJ
zw&^L&W7~G%)3?f;*$&4K)${F1{>b+Eu$lXzsFLeZGljRVy%R3<h<kP66Nk1lj9G>`
zW*VudkGNg;?T!zuKN$I+A&uAn;q~Ly`){3o_`YMyeDNBSA5Yi6-luq>RG)w1x6mo~
zX6EInho;MCbf&xWM074zz2dfUsyycp_v7=dKB%5O_~GoAUr~1xd?ut>Jkv7ReI-GN
z-A&ncb7TDVIh@lIUq2OD?iX{ZYTMP><-7OYwto4^-sEiI<km>Hx9-VN@=O)YUOQ@~
zgD$_%S-!2s_@E8r&Cqu4ZDwgXUji097rmbGpFzk@yT<NA*ya!G56@G)T9V5gv1`-r
zD_^!vi<Vfr^RoPz%@g+p+88^Wk(8CQG~8mCaY$q3!~C8)`wt<TPcE_D+}(QTP=!$N
zj^ep@EKbVK;d?CkeCoBdO&^zST$R1+l83&jdgScW6AvkC#05(Bd1!Ioo%4B~_S-N|
zv$uh2`-2~6B&@ucdttKA$?l*_Tb$Kqt1ewSrA%X;tXJ)vH7yUCxSl^d_h!ZM!aiT^
z+gBz>FbD4FIr-GHrBcL<&v0Y$0rfsM<GAG?PU&<1@IJCF>fh3Ay(Qls&ScCuGI95u
zcbzvY6rM|}OV4I!7kynOXLRLD_wTj#2g(fHAHM!^=uYPO<g_!Jm>6e?XDns>v%&e(
zYQ=+x=4>ra+ECQ8J~^`BNuk)RX?y*9ZJg6rW<`l~>g>x~v|!41#~n?{H_psp^?IA<
zR`pmxX7V%h6FLvJ^?v29W=oZe$*B3-o+r?BdR~#O=W!nGH}(QGnisB|UjD;L`{bM3
zs=lZAEkhf_f|fM+9d7(Q_l%o|Y}Sv@-#jkfK78$0+vG<TPp0nl_;*T1s9@EagejE~
z%!^&;H2G(JdGSa@Z2980Q(Bi}*2+uWIbB|9?Dt)4^V#_Z4oR#LatmetGl>6|tvsN<
zeQ`y##}&QAscRR`lhpHinw%`rv#OO>nt4awv3Cx~eUfK=>vjI-`!T-Ngyo~|sT=pB
z76_d!wx8!e&F)7RGsAXkx4LBGiP!t4{Ab|*;eCAb&08<bHr(xXd*#}9>X1b2y-cq6
z9txdep6X=|9va;CA6CkQT{V_4U94?zAZ$uVQlHv!ziYEBj((Of=u(}rF_n*zMeV`S
zwkigWKdXaoAKtb9=8-b7rjqhZ`>ItvDat)843iFTe7>~aNq&?3AL)a?6KhJc?WO*d
zRNJ@8$?v%JbnAxiQF}g4;{5bwN34(H^{LgJk5g?-WLN)^`@#O7frafqLsRA-$-aA^
zkN<L8{n0+O&8WZdk@aEOISrF;<eD9bzGc<(Kr-|;Lu#kwdd|nUCU4q#w&7u=W^q{A
zAOFXTALh6Hv&@d?`zKwo`rxc-oq09NG8;3c%vQZkwEcVUTGw0WPWdygK1+OFN^iUu
zp*6w(&aLMy{~0pR_s{3iw^9A@-1X9;9amy?pG|uf>m-@`q%E|(&pUn7<ke~y4kfK=
zu@Vc~`S1BZsXr2b=ltW(xb}<xkUYbW{KH~pS;|ei<~~~+0~t?nx9G4{zP>)|`wE-j
zrwUEx96OE)F!t0M27mo|>(274&isCy8TCxR-rhfMtA5<-?DdX1k&11Po_TMQ%C+|1
zv2T-c$Dd2dlPnHPoK9)K+5h0&e}-v$UO!~2iThxF@UOY+NAZT5{Osyf)dNcMJlQ#X
zKW8O4{+3jJ|DQpqp{h9kMSt$2(@T_3?<`<nyxr^m){mk88M1e>|KZ(#Y+u+mZ%(z{
zyZ_bIrEiq^Cb;$G{pbG~82&Su_v$-++<N>-Z1Rz+@9n0mCDzweE_f|yws2`&)a3N^
zq-~Qt?v-$EQ9c&AiH%wFeZ0fXiuDIS*WIwPT@|xv{ts7uUFRcDl>JrjlrtHeI*=#m
za%BB7i}&#_H2xV)6_`EqJ5TZc`Ojy4+%NHC^26ypGMW1{FMj#`HF)Zz=nN^3+rK~V
zR@8dDLgBYepQd-)-c5!6OZRivwOoG0vHXwy@qdherbXG$Y|JhDVR0*R;_-hr{PMl|
z%fB_B(4F;2?UliYInQ6M)BZJm!;kb2@kb7Bc`xxp`0(dD2M(rwE;(JG5@fEjvL$|+
zt74l~O5c_3{~0#Lzo}e3_xgOkFDVwUS@JpM{dKSH^A>z~*1LME;H$$u8h>}#ANUt1
z`hJ0K!L^UO7ESW<2)FpP@?YuVXLpu#d~!I@@3gl6O8A%V+TR>?$F{#JtB8sYEpQb3
z{@uf%I#=)Tmvv768UAq||E+P)GTZdp8s_r8A9nngJZ|k-`J=Gg-&248KgR2F`iE>U
z$Ls%4|9pDKbbG_|F#@%<n}ci*pXNUkVrG0N{N3O0e}uk2uzfuJ(x2dUx8)8_yA=4J
zVbPWAysQ2*9MrJUE|jiM{^Kx{&yV%ooVDloPdED4v@@RJ@uF}3&-$hwwNU@IpRG>j
zo_9fF>CH(D%rZ}A9qF7G9jUwS{274{?r~Lhp}%!k|7SR;WD{v6|E6B<We{J1`o<mI
zU&E_DosIv;srlQ<S(;Zq?!(*XGWol9w%gsP;P{(0oijOckG*1j-b2+@EB4EOvY(sZ
z6jj!o`tkf@(Zg<`>;6P0*`=k0F}rUnla82RZoJ*`T;UuB_5;7%cGiB_e{?=qjrjv!
zYrm%Rp;t^L)H*M=PnY?1X5z*cWv!+aOL(5}XdJEglT!a9IQiR=5B0q@@sF~zeT4(s
zk5tXwwup7xYGH#<xr$pA)?7T^{Ch&xW4W&%u6Nl#XxqPi>9UOv^aULsRO+XHIJeR`
zrnc|bDHpNg`&(Zd{QZ%ZQ1*e{()5=&f1=jI*XDuNCi^+I{+h>@9yT?qY`N+8#fSe1
zSIj?H&tWI`C-+D5(#XTPa;=Ya(}Q-Z`rVY{=1`5jVR`(+oaFsgf6o2z|Ifgx^J9PV
zN9VYYTc5X>{AUpId~|I4%r!di&Q7>|w#Pf;5NDJo&+X&!ChH^w=lkDTFZZ9}pxJ+h
z+_(A<>W`e~jQV48UFpi6=yfr7T%X)JYWBPG7As$wP1pV1Jx$W{48kSWpH}?O!1Dg@
zzJ1cCtE*R3FdxnMWRmmb#ilbUp}IG7V;x)%^(0^0_e-d`bxF+=gHKcD?wT`i@5g2D
zzs<d3XZ+((txTrbKKT#J+aF|Ss)_eLyOkv#o);8xz=`jX1mpavRZ>5UqW6l{#1@yb
z?r{=ca>{%q*CDrw6}JwQ%l7+xSK9BlKm9+$&FshittI{4Rr)=DY}dY=E~kF!VMf}%
z%lQiWN+#z*OfD>YJdHWy_kzX-!+5n<_3VF=?rGFIz4!j)GOfvW`-NSKMhP1Z29)a=
z@XLOV4xW=>`QXWHPkG}S(=FTMyQI9%uzZ-A#uTEUE+}N4f6G13pvdD_pZ24B?aQ1W
zvCTWC(&c%pEO)u|26vwiRsUjFzql)WAZmH*pJ>tZQzZ?TtP+hi7fZd>QvCDD^%*~Q
zAC|hdvFf{cV^qved#lOQ6a@GRDqnY9GOe##GH;sUJg%(SF}voAMZEkTlx_aoa5A%T
z?iay{FArLNeH-ugM}I^0>Xv)=_e9T?n7~$KzcqK$;mcXQH=phKSI=_)U~&BnmCy=_
zWSRHcJx@L!cxRpPXz%QY>s#CwuRi>3wy|a3Yfr<xxX`|Z97&u{YG$6ZmaAAF`6#Gu
z`SHgFXCJ@x-}uY_x5JsWAFlhKm$?2#?HB8n1<Ie_zK?gPiJh17cfyusGb7`?Un}fX
zSoL#PQ?l*P^KxGw?3ewL{nr1$w6K6Z6Hm;#H(61O@uB`B3+v{plqv!3n|9W7qyI^!
zyR=<d;<`0g%{<-rhy1OA6^ABSzMoVbej;si_d=1~^XnUy{axfM@b9v(<qz-jT(+;D
zwyss&{#f$v>Ray*zP|it*8bn&(Z|`}EPwozd*^NUy($}I_zigK?DnpD|JH7M|A(UD
zrH4f>>n&VtA+%dTC2QIlgV2cQ1rosrU--KJ4mzw<cRJ2^+xE^GC(~7g5*uz!x}!f+
zK}Ghckw+Y-O=0}B)ZUee{~3<|XE-rGHdZgPs($9t3U|lLi~ln;<^L#mo5#9q>+TC%
zN-|Oy+CINq+stIZ_;b$R?5{@NVtTHtI(kx;8QzfLzYzXZZ}OwLcK5%DUC4c#`!2oh
z+V#U?jSo7`NM8GOyX<PeZbLZB#Gc2K<JZp5H5cBKu_LsIuh#wRdh3o%&vQZb=j|`N
zI{j2sF7&3*ElK4*i<#v;Z@){vkL8XzbXil2Be3zSXsi6G18oP6zYbb$sPIIH&vE_4
z)vmVwVMZ@XTqilru4>-h?7TZ=l3%6il$1#lQy4rYL{pbb7x_PraGGT@d6RaQ*dezw
zEe7f~4TbR*|1RxXyT9E|_{ZcUMsEUB7rinv-gt|_JCpOIh3xAW-OF<yFwePuynegw
z8uR;``j3Rnw%2brWsfn|yfeX=e}|*O1S3lx3xy`f@1IsI595k9+i!gGn0ea8&)46!
zC|tBpjy2;x#>TO}My1PpzRs%H+lB`jrb;+ZetBa3310Vay;t^W{z?9@Wy6aL8MEU0
zSJ{5uv+<<vX^R${)c*`um!AskWYDxcZX+1KcK-JE_AP6<znNd&(%m+3vip@9Yo21Z
zOm)}KLF_4$-0s92JF_#Xh>t(&Pr&@c{~366O>Gr**tT6*v@6!Y%=(`4r1w&rtU9|z
zAN*;SWROYz#eaC)w0N~$=i(RsOcz_J<CA;im;bl*AD<u27k&|?-u{PkO;px(fmiv3
zg`z9(f2;7xS-MmqQDQgamWR9M6l6b`-@~TsA9Y11ajN3kwUhQtvJ442ce_*BB6dl7
z*O&hcf|+r=7xfi(f3Ur_yf9bOW0r1`cCksy#8ap9oCMD=dr+zJMK1jDOOtHtxmn-C
zw~Md(&yeP?Tzy!jOC&k_XYPc$oVN+?wpHPGFZ@$CkCwM*+x6Yv&qO<>#`U5e$Ib1B
zKQ%O42BkI#lo#1Oc$a;=J}Woi@ZY7&g#R<hn^`&WaWZi4?%ddTUQMy5e7(<w{QT4(
z8<oy=B{Vy4<MN)G5Eu4Oc80Qc6Z7-NqZRpYHFc(M{xQ>Q!>4e^Mv0XNIZZZA-fi(x
z|MdNJ6|d*XnNM39@Yycl!)cH7jz3G|Dvd1FJNfPXeTuZdW`EPZy6D6AmUrut1UmD+
zc6z3%mnrwDNV_?GQ=jw6w=TLOkEQR@u|$<3ukS*72VPxLRBbD3oO)jJmG)QTZ#oyY
z*b7vMX|n8ow&Ci!YoVUZ2|GQ7i&o|c^j>%{Z^w!=Pb;kD{NjE094dOV|HLot2hWz5
zE~`6#UZy<AyRdX+_Vm>zE7lYju88&FWX`ai(eqV(xug5BU#0Kc_a|hZ<$8K8a!sA=
z!Mq#N%vvvBPH>vs6uR-s=g56R*Vb&YznP^keAc4x7B{ck>zd|_W51{KcqjMGnWuf@
zpFzg94|QkDf4MNKwmm*vRl3;hjkwUke6f%Q$Ga1(y8is`yd8JyKf}5HOP^vx{hjCi
zU1Y!I$&boKne!ayW$tl*xTU1GfjMn)zM^GK%}yVl&*yyeY650Gsmc4{HZ4nb;dRsM
zWdRR89G9M#tda8wR*)%I2oL^PWRaKp;p&_V^Y2y6_lgm7lixLU={d&pa&c8<Yw9JJ
zO*MZj`Qd@D(CpTYA4Ohjt4RhXZFT<45G_4Nh+Xn+ykzUV&gdoo86@WIxz@g@qBwNR
zj=w8RU(1`!)ZL@F#O&-Erq1>6XZ*Qw%kzen%-6@w@hO>W(hfZ-JMryU_TzrW4z<6_
zZ8F|{JSie4@!?cHOYYroy^&o{9#7mMQ+@r$H$z{^p!s(1-_7~p9`&>5rK-vF)St>%
z4_>L6HEW${sPxJpqk6d=YhPE|m+W}u@Z3J?nH=ZU{nb-tgbc5(KUrb&R&=W*vz0Tq
zSEzXL+^(|?)*G1_%1s}smM5>BZE#O)_Nj^O?2^aj_FVm;zGW`=(bLV>Z|&3lk@-9O
z57Up$k8bO?{o;MLc-fEc5bNAErn!3WPK8fQ&Wtjx6gU={?3VnQr*Yz}-)j1I99BI^
zbvJ#HR3N(H)04Gg^Jf~Ylw5sq((Ciq71@E_4)c<uPY9nm=`;0l!I$#^_FjMXeH1^O
ze~UZfN8{?7KctUro256~YWajtPR~4*X=Z)?TVvXEm=u+a#Glyw?!V|S`s%w>c<Z{a
zD;ECtDciWGuVKOyeR~at<{uN-i?km^&+n?!|7hMZvqtmb){kuSP3KIy@65R~^I@OP
znpKPLNrpK;t^52`N0P5x&p7T|!1Gg2rr)caar#YN#UIP7@4u`UJjvN~J$7rX+a<&5
zviG_-w_IL#bH-t7uLGv1c$Yr)^z;)?RBg}xsD5;oQH5Bp)ayf=URh23`q;RlPqyr#
z?!0riDqA>axs=UMJ$2-m{1)j}HQ)1XfkGU1s*%}sydUT7e5C7qxH!Y$)sk0XLU9_6
z37ck~ndmoBlWVn7^Xb+DFIY?eGjQz@{Ahi69>0H&ox~-*_qw@xXRd$dNUFB{@-*ag
zb7$z|DJRO0pR$_soJCXg*BtGgs%AB5O1f`%E`1o^E>x5K@oL}7#V^i%$odf3@jfmi
zcj?w%!KsO28;*;Z8~KzSm*|}?#IQsx$$dfQ;v;g(8$Q+_(yfo%^J(6{b0*ujZn0Xr
zr~H@h<3kr5bgsVB{deW!-#OlCCx!Epjm|Ly-^ti+C-PzXL0`^)A{Fid`*MRLuBz_4
zwrs!Iq?g*tYs_Zl?!OtHb5T-q*`$Odc3%D|D-NtTf3W>OLyP+PkE+|I=cbn~t(|ly
zW0KBy&4M@aZ$8~#HM@4v#mgmn<r0#QC%Vkgjx$+(I{bFxan^;e;y2BzNUG<3{g3a*
z?b_^z+b(XoeR@C3kBx!PYuWz2@Y;NHOMs10R+)LvO|ehfo;-)#`K4_<w&az{3;w(O
zkN3m*H(&lU2z=Sk`9u83uCr6j+K>DT?UC~D$jg<BesM1%a!KR5WjbrWFWOVDpWv1$
z`DfmLhKJXWMLfD}<CVN;<K;h|GRIwgy&~7<JPFxR;gQ2A?KYXmSL@hQdA*QrjK7r+
z{%7DU$#08O*?G;5=k@msF&zuSc22Tbw`Av}hb-I8ded_zF}ymF94XmZa#NvHf7_m%
zTr0u#GOqreIe)f`>IkoRpZu&|;1AzL8&$Ej59K?`%EE5#>##doke=S49hu)*c3!0}
zCG}2{%^~C6>g=Kq_p_C1e4Xod==0HEvEP=iyczw{N@m(dxApl;UwqKAx_kDilG`W8
zg6@o@nHNlgXU=na9l!dX@elKl;>WC>O?>=b=8UPW{E_l--MZU}`^snR32e%JEN~)4
zda57?w}$ohlu340KNvrrI{q!p&a(fIlz8Ws*syoMp4qzPD(1eE^A!$leKYIQyGw7p
zB|dHCXgy%y{H@inC9`a`c6Djty?Zhj%6Ehu_;fb%&d2w{e@d_YQ>$V7=(qCW>%#KY
zKl}rBbEhXOXKW7(zn|6S-B_wR*(<e4U_}H|(BqV(jO(X8`2|1jf4IGUk5!HQ!}sl0
zu}AMUKlbJJ`{<R;;90!t?!l^0?bE(E#c2epg-ue;4E(UXX!Vo%>-T5HcUrMNe{=uA
ze7+w-y2+m1ewS`#ci05yW{P*o@usDShnWXQs07@(ec)4GQ>2pTxA}T*Y3J&+F4kl|
z%8vDR-~Hiy$C{Ga`b;KeyUH5#SGwojYCZGJegD4g+d4(!buJ5BPZ2XP5E3w-sol@o
z_^kO!*w%lamrHW&R^Rx`|HH<0HL4%{y?z8g%KmHZe?|9ZPQpjQJ0^dvOm`TnOfOsg
z*_)x|XAkq5h5J5>>V-eIm%jJo`nQ6Q`rZ3vD)Quov+I<v<kWA`|Jp0`>v+KBMLYL-
zoZa)-=zK!=)*^<Uzt>teCaqSfN<Ws*T@!z`l%M(TkMbkG%;tRStX%H<Fn>eEG>a!4
z$8A2G_;vWe<wMPdLAlRsQoJP{o4@Yc_-OwRRleO~{f}hr;>BM{nXPBoG287&b<Qpk
ztL*4gDwF=b_L*dDarn;pZElwiOy`jEsJWmL_%w0Dq=l8&`kvQcd+EjL_@d6`$MnbS
z{rNhJuGlGLeV;B6*FD>N$~E<^mvhy&ZEcX5JySIPZP=$pg4#lFb|?Rw(NJh-{^Q;8
zBldh-eA!*=?GNoTos+#f<9oK){8ZgLD+?}d*)FKfDZ%NJRK(NKYTjoY@B2sQ@6tN;
zAKSyOnEJQd8MPle^<C@Qt+|(ORc?>Vy*W23=%Yl)-c6OpOI#;sPva_BWAmRO{)3D>
z^ZrcNAG`CHx+XrT(5t^#de+~kHtN{NwU3*!H?nS<a&b#f3Y$WJrcdhj2hU%As90rp
z(=Y3++TWVJ)zQHxj<{-j>DTh_wG;l&aL~yn`mt>hKUa;;kJQ?a!9i9oR=r2Bw<h)3
zMBKW$X0mVjw;f?-9u3MRlU8k%Y!RGOd|&cUik<1pX;$~U7F}IBO;^b_*zLo!&V<cz
z&ZhTNuISnHnl6dB<XT-e&3h%MYmd<c?pYuIGu#q>IR6O0i032!Tl*i*@0on;R(w~<
z@7w!@egu2g2K#UM7&l?frI+6rqBx#RanDzFH<;uZUG+?~<FvwhyC0Ju>i3kzsa}8j
zQN<wQN4`tj!9|-doGBMucE~#-RB?;Kmfl=87rk{UJHn+?gm~B0cqA76+OuiV+k0p4
zegAA#Sh1>0Y~J!Uf7t)7+Q;!j_z`>SpTtML*?|}8q_gKqZt^YmxwJ;-YwM0^^Lh7<
zoe#SF*7eRdf0fUYi*|HOyAolLF^!{J?y<{{-iPZ&Jy+I<Ua6D2mnEKl`0b<I;6rhm
z|IS`1xhs9xY<fYjOXl`4GqYby|6KAcRk>#9#BlFC_mPuw?6Yg6|4!VxzPpb3-;odL
zeI?!Z+tcGWT~}`p>)hh~y1Lfrk^T0mZE4xlcg;Jo%RR@Z*f8Qu;qn<O@{6kcwkLo5
zeymRGqxhTGvim!AO{_agcy+Qauo!QfZ+hsq`pq~;<2xr!?)iMwWK*-4oaeaq;}(se
zNmDt#`+j|yH!rtl;`Ql?d-wHw%Zq3JXAm=8y<fKCKf}X?mrLaZ{}^1}cXsi8v*|_m
ze8Q#nWJ|@z?ol{jto7FLmWr?F=JWeB6*yb_H~q-{?eXu>Kbaq;3o5FEeps%&dFMvv
zwr!to_e*45+ZTM4Yq9&cinmWZ$|m;f#!fZdV#ut1uRgQZ`&;*q`HyO=kCj~)tdaO=
zI=|z~dT!t11-g5;7~JrFTA#XY(e?1+GfEq-{JWf+rxfxjb!y876Na;KuOG?Zn*5K;
z@x$WyeLtcfp7<wlc6mkCqgbtL-uF3UeTy#K+}UI{&%<<D=TohQ-ELmSDJvDaUbIZz
zd*c4Gw>jHyzRT`B@>^`N{%8CD*M2PjHsfRboA`(N;+ew#PHy+kesDM0=yjD}*V^nw
z5wX*%BU3gsy^>Ti+aBnmI`h<)Q=4Xdf6x+F{Ahl!o$0~y<^Rsrv-}BM9{1{3?b5AJ
zuT;ryiTWbGUF;(3=6|>MOg}O0+9!^iEe*ax3sQs@H#Jl|o4)do;Pk_{RJZqht(E!{
zcj8yewOL|Yb2&C&S^D=*)2)L`=UuWcpBq$j=U`9oe+Fgq8N&Yrv+L!&S9I&ktnd8e
zs{19obUAlr@>RCE`7CxRU7LRHOUZC)(r$RmbHi}qp*H!h)IC@B9xcyXAAR?q`mJXX
zJg)4&e^~rlEoskV6QBRl*z58?(TdLprf>VFeR(T~;-30#Yp*S5y|Z1uic_uP!oiMH
z$MZgQB)@1_5%o=5U-<5i;KyOxe>+u3AJ>}oye)nEWs@z}l5Q7PO@FzmHZUn7?B2~Y
zGdemZschd7t}S+Vl3e!V?}znye*}BR_k{UA+%J?-wQ;)Vyj%Zn2kzM3`iy7xfjx$6
zwtJbYqzG)7=jA0X`l-EXPwblbi2n?Sv@=)mb5_L1?T|8C{7Czv@~!B~doh=s3l4Mg
zq)ai|sc<weW%g9};BDIaHScHU{byKR=N6Kx=|0z%Z}B7bqx;1w?jH%;6@Qdh+vDT1
z#mh4`Rpfh3`ngu_)S<IWlVz_2-_pr5^>)v^CVjhqi@-W>&IrBx=|9*%W<NUL_GNCm
z_utu1_kZ}$(5?SvZQ|G2E8gnn>8vriac6enviF%w`IM42`714!bW?VcoVYLVO0JFR
z!XN!UAI#foR{vBp)VW@8BPQ<ly%Q}*&Mv#N#o#|fhNH>EQ@Oqy`p@=gYaG^Czt~Q;
zLi@;nhRt*TGqnD*p7C~F;<co`yDlpKyRf<X=lV5y)6RzFT6sL_PZ9Q5ZDTCPmEyEU
zl`H#cag43St>)e-rN6gwntknj`0bv|NB4fy-TP&-r4GF`4|q8-vr1$|r|sXncYBXd
zUw-?rw7bBZ!__+TGk4xPoxM>kehTmW_4b^0ray`g$BS*z7tfCWFeU5Sti8{cW>+qW
zIlL?@&Uf!0BhSCPO05gF8*y*vTK2%QR7hZjS&se8IH~<VdLPBNS55xo{n2&n(SN=5
z)oha&yxbRicI*7P)vAC0T;G>jzsdR8sTAciyv52Mq5e~D{7w9!{$cfzc!@o>YqIPN
zFPTQ47q0P$<`=lTY;M(~Tz#iaR|KVQefGKhWP8Y#E7#6Fdzc@USeUNt`n!M1iVvHk
z;%-)p=bHR1*}iPni!HyuEVfuyW&TGb`H_Enjp3T88qpsUA8OxqkC=DW#&u~-=A^yz
z);|1kvd`90zGl_#cgnrrx7F-!pK>bx<b>8||M+U6er*1*KB)h|J*6M1>5u9~?!1s{
zTev*tRn?PUxhpqZ?Z1^X>9yFe?rn=E+)>>b^g3_Dnl?{yLB+L?^jq#(e`xR4TX)&#
z!d1P+6<bcf=5DUm`BgBX<68E~S(?iO7H6jCo^wCbJtsW)!}a6;86@`cR_wd}NNsY~
z_w8anZQcc+<hQ!>-)-&8JjN%|a5HeL<Ad<c6AElUeGTHCziRK>x^>^*e-bII`y7=1
z)ctM!Z|%BE?;my61m}OWkN(k~b!&Gfe|C8}>)o{{FD3BjuW<cVnX^{!?PB9fjkg(_
zRemoCOQ}74e}B?zUhnAZi+<GpcBz;h`6FkSS+B_Axais4v(F2@&b2zsceAu|{g>a7
z4|<)Vqu1`{+;g=}K~!aZegBbt+S@O^$uaHU<|?~tzSgbEO&ex%=rNsH(Y>P~KJlPJ
z${em2Ho}kiCGJ&hySaxkzvkAj)w<iim9E&a`$%&#N9*>P>Ix4g?37!)wyt$<YSEFW
z=h+ucch9%qov&|XaQW%nYsV}9Gq864@co@o6ZCh2$?f%x;#F#^A4+qS>IQw)S)VpL
zYTM;Cc>?~Xd*?LHyml*4XS;8HfsC`wwzru|T9*G@>-2xz|2FeSdvzxNvA^y|=4o{M
zZJF%9eWLn~G_$iCw(j<}xh$Nob~IUP?iz=rC5`>>UO#;Q#`Sl4MR!ELlyhS8gZyog
zrxV^*7Jp;=Eqg_q<)ZEq`^<@95eGgqvy|CPp66b^95gLcpI)nEvFykB$01V}G8<%0
zo8Y#J%`VXP!Nh)<^wTWY=E*-5H9DhpIIL;vw#@8x-}8TMv}_d*J7=_g;=khQQqz0n
z9qsrpCtX`(61+mz`L~_>wCv=H<WIAnF223RFUc-)vh+>AYdQ=}@w}%$3Lm|v(0}M3
zleyKk#l|Au8oB%K+c_R)%+HqgKkolE{oejdM(4k2{%2_NtB}{UKfKys(tAQ==}xsP
zkJ8w!dpC=2d)@qRJ=4Cq7wqhQ1V7w2Z5RK6^UM(yd6x{gnQYjy?egOQb{VI}jX$ox
zoU+lhyho?<y++H{$^Z6!{vq{4_&)>7jQ<QxEB;h$>iW-cct2a|!c67X=)GBobcJrq
z{5f}P>d_^?trDl*-C*}3&-mBw5BLA^uKl}e{UY!G4E_7eK8PQ_ohhTtp?1ae<(vji
zu8rIhR~!Dxn>pTZJX-H(9xrRB|6|dE)78Zy99ArMl_$U4`77M@@qCGj??>kGd{|N^
zwN3o{E#9+F%F7OABu?^p*HWbN@>{2p`>hifcku7wUCttPE3~k;xHz(sr6448e`~$>
z`CnK5Jo+K~pMmXq-GMp|kFWmSb@m_a`+9Dt2;8*Y)}KD-xu)uxwAY#6=X^ZAwr+Zb
z^FL0<{|qe6AL{1w%@#j6S33L?`)Re!s>hb=?-t)V@soe?wcYVdu~`#eY;<1Xmb>(%
zE~moJ9KXmSPKk4c&0SxsB_qtDC&qQHEG@78HKV#}Vp-3uFPA^rtp6uF^FISi{gwFB
zyMFLLl;C_^Bc>!K|3Tw~?cVJ6AC3PRSgQUrGzC`7K0MtlPT)uAa@Q3ncDl5E`*n4u
z<LNd2GA~?OYA;UUd~B=z+B!&HCT)-Q<LSq2vmcgi%wGO-!|gNEf2CYHy4QJ+`NTVi
zR;0!oMjTY()iW^OYxOzk<>#;L9c#_shfMyOesKH#56<g<sO)byxqbCV>x28E8RgQ>
zkxS&%ua(EHPA~9ywySowAM>=I1+^7x_up*(X7jhNKDjpOHK^YC-dcBZt^YoYueC|9
zeB(p5Z>wGY=0aS|(}nF?oE}YV%DR(7OYe6^{oA|Z{F*GIE!T~=Mc(dXcV#FLtzxhc
zZT-){xo+9&^OmywUe_d8MOUubSgNu!UG4hH?~XrOb+4?|nJlJ0sW@ueKQrOP=I32M
zn!P^G^188ePuKZ>yV;fhGsuLk_q}9#pX-!i;iJ1|O7(lDr?bCOuvoiylDoNb){9^B
z?jLO_IIeKrG5t{y+k^iMGuO|5WB*XBF8O2Kq*w0W*G>O<`+Dt?%v&-~D&y2H&XNCB
zsr{c}q0%)YkC}&ezAcMWx_5BuzD2t=O!w>Y8_s5aeYDbV=EK`=F}Jg=N*1p_SuSor
zn`?ITWz!#Pd8(?9TTT4WptG#^Kf@O>)A?FAo=njT`ndgwxyL;V>Bi&N_SAb`fB!Ys
z(XHa{InC?$_&@5cFMT>Y^5eWy{;#yRU;M*ZyU0x{LWTF>$uL>Ft(Uo8ab4p$y!3qb
z^rPh;xAm`!_e=S#lxz6CG*~QcyXA|zu#&GYV;MhA$^ESS&+=dBlc*l^;0mvAXB~Ap
z``+1Ec``HiAN3SH=d;;eQG-KvU;C^F-<H;f8QHbOOY+pdKXZBZv56~xdN6M*@~wGv
zJv_sJ|6z!p{(6CTP6h6JO+!na{+*9Kzhe5a3C|1aYJ2Vf32*IhEnusj^;7d}^@~16
z`?YSRXC0cnh5by0ji+(yEx%F!VMD@1gENeFbN9Y{{rI%N^4x=WU-lILx_(suQLdw<
z%KRf&cpv@V^RT<F<j#o*)7<mh7yoG5_+`c?`}0}*`Hxf-|2`gPZ}r3apD_2ih36l7
z-Ltt8Qgod83jgyik%I~G#b4O?I}O_pPVP_s&+uyP3Olu&!>Wg?9#|fKk^Q;ikK^t*
z&%c^UKYGihnfUXa?APjN3fB7F^}n?A$CU59+dOaXow@nXC#{f=dXrZ+%3g{-dH?&y
zV~77U$OWIRD|G*8<y3ULQTDLlU*5R(M{Cc-zdBtlbGcL~D$D!e>4o2?EnHS(wLkyM
zTXxSG+k;hmH~(j_czveE_k;7d<d3DT$0k2|-@Z@cO76Rhi)W@@T3c6|*krDgb-3@r
zlTx;QbsK){H$9UO^Y`fkx%u-&m)WUR&aatYBmZx!U5WncYq9?QU+@1=dj3b)-g(BI
z?0HN(=DS~woc`8(Rs3NaNeflAz66i{#hNmD5+#;DsvqgU5&h4=^5KX4Z>OyLyf*3|
z-uqlhygcvx>AhEdX7yg!5#qget<Je}ogxFn4`vgOJI1e*7x+^!Jx;poo4aaBck7N6
z9S^h5Q=6XKZeUhv|F`q{lk(&5`7350mKQ6H&HB1*lJ)OpJGSnsb6L!FySzkK&Pnh(
zgWT84(=Sa;waN?Ibm3Ldq^wX=yQ6#m&i&8uVCFru4|nG-Kf>P{pR}`g;<H+%U+?ZI
z+vv!~nR;$otY8pVczJ?0`;q?)8<zhO7C(MZy8BSt>!VeoQ;ZIqWQsnYC%RyQ*UZn4
ziyR6#Sw7!eT_N|>#_^%Y`^Mi7?Du)~ztZ}1E3@aR_4WC0-c2{WENNk1<Xdx2{P_M4
zUhi+*e&pA7OT7J`Zq}?U@521T*{8KL{eEX&ddPTu`oR*0$J>46vZwyo{GWj(Z{v^U
zAGSySD1OM_BPUmK^|4|5p3QU3p1DqVqVje^+2a-KV?Xixgih_8lFRaF&)3O`SEfuU
zyPE$m-T8R<_GAAt>nDD)Tl$}Y#pUmUHFfMS=X2LcuB!+SpY9*4>+|vc$(&7po1Ssb
zZQ7&GdQC}0s8U&7()6{}`9H$l-}YZxl9~HQZF_T}<)%GbrzA`&GS(9Q8NTbbcdZzY
z(4M+iN9(7ST&pwxcx`6?o4;YNbgF#*Gn_U(+4*pnXq~?K{`$#g3uir2-0c7KpU<BM
zKiWT-KiYrr_YR$ZnlHj<3E$PssJkwAWCH)*O%7g$vImmf3ykB6bD7K@#0c!LJYj!r
z|APLThabJ~`sy#I-nu8d=2zd`@?86OdSz!NW{OxD@bU36^I0{Yt60DOt3Ou_-$%B@
zkL+zG)pwrT<+g6L`Td6F`uXq&s+#ucL8s5w?f<~{^~k?-cRpM{`LF-a`KKa>j2KUx
z{Gx6uGs9J-C*kp*kMUPr@4wmoTd|^d`<)7D*WSH}EeGm93F{U{P5&eO`<wN(aP9@C
zGvby1iU;oM;V+Q95k5Qk@T-@<C&hPedUT85({=ssKj)vtz3tu>-k%(=S9kqZ$*ul3
zS07ia1pQ~oxR|#{`#(c$h?{No_PzCy+wXtymcQ8_tY)k9K4y#hyN>tCljZ%*#Qv2&
z*e`1TpfjFjpVklczz??XyG&24`6|)m(a$?)k2V`iV!(5yt%nQx)aFL)j5@h)U&{Fo
zgH8V7-|G+0KY9P{--q4zh3d|?AKc~WSiU0rmW$Y<NHcA#Q!zYW58R&I;30GUso3n_
z3N^X2<1Uuu)?{9LyUO3TMabFu4$I8kXFHifwYhVYgqAiwn0S3@eZqeRvHE2Do5%fr
ztginM{m3Y;qR*Zy>w-UX=f5NCP4{Gl^lL^eba?7<nz?6ApY{u0=YO2PL6;YQ3|qSR
zN1MOUkNv*0J*M2fbyR2D=QYAMY3ApDS?D<=8F{jQTz_##Rj7eQ{OXh0W&i#&{78Pb
zd5x)!Z)kXQ^u|A4ul8@?f6G(jyyQnMUu$uFT}sB{rbp2=(xINILS7#pJmeGMJ#2eC
z@KL?g{*?2#>|RI7vCTiUIrgqZQbqFR9&`B@-_|}ouPjm!oij<pl5t<+F-!S-_dEYH
zJeYld)AX)Ao=YnBAC8wct<`$%?%naQ>(QZG87a|AUF%KFmKBI3tPHaCEe_lN!K<Dp
zzQ(cr__q17CDxOs8AVhEz2s+>crsO0f2ZDw`!lYT9Am9jleQ_CZnNDced-~5?mv=$
za&Kiu&7FT#){Xl_O6%J%yFF&A1<Q2ZOSu`;+a$fTV*l~G=4Urvd$-8t^OM=`9UG5-
z=#>5`_3y#^{STV{Gcf)se$?xKY@Yg$)h4t07KL_4+Ri?}#2{L;vgs6i@V_me{F(O1
zKbrqX+RCOlyOh1*pU%q{*NvTxy8r5&Fk})5h`RTt>bXKewbbq3MYA$OKK*!m_UHV=
z@@-q9JKpFd&e)tg!AiiBd$OX%lgBo~^LDJi^8Ti~OZPuf-A(b<MzQ{N=lbe`_m%rK
z^mVac`IP;wJ?uY2bM*eKdj7Zdd=>qNr7rXq?(i*5y<Bb`C+S}IHYh{>gUf%0+tVM~
zx8!c&s4>i5buw%7#$4;bt<#G=-aO8j_)sO~>n*#fbA2Ao^*;7Y!lw1|idV~j%<q`h
zH&d?lH-r0<%u9k=6-m(xwM;t7XUq%m<T?Lx{){#m!RD@Ci@#0#kb1iAeE$Ppp+^<0
zD?WUiGs$|*CIjzok4-7NBFiU5Th9?w;j4P?|9JhIogcFwv>*8P!~CPS)2<6!SIhG1
zs%+is(BnQ$`P77?DsE5m-BQ1w7kw2kSHc?}^kL=J4Lv(&$9(v4g5@dO!mQ`peOFYj
zpZUn^RnVgAp7EdlGc?u4g||*gR;egI{<6kZzN1d==1U!C`)=J!L8qQP(ooMmekz4o
zQF?`zr^GRX;y><d?rneD_(0a~nA)ecTXc&eJ$V@VDs`_sc%!)CqJl+&xN;%Og8Y~t
z8z27uX_NcFCFOvfQl<1$TVemb3B_NPcAiako@t-)o<GY|XwSBN;#URsUEovQyIK2u
zT*r-Hvwr5NMyxnmUsm6H-l<?x)!h2SvSq&m{w}doj?Oacm0i1ZS#u`OyX4d<OM*Q(
zxZd2bE3`LS`FP&VU%NO;ZoIQO)+o4tPjmj|r8O@<d^#6dr&@98$!Z3@EgS9>a9qCd
z&u06>xX({x?!@LfoH1;gYfzhg=xn06$=i!{9`6qCFM0D|N5&kjvs%JEf{GT8H{^8P
zZ2KIrHAqi2^Sb2eMLdGXKeVplj?R>4J@)L&e+Ij$3suC61vs^D^e122!_J*ozG{}d
z`42_)58IFb4f`Csz32F&?hcjBbDP;b*XEw_<^RZYQtG|)92ujpufNW|>#nlfkKNY1
zF19ev^HDuR%#XwVJ1#Ap{N{3-XKtQ_F6$8;DM<&rJ_hAoldP{7KDg^svHGyUtLY!P
ztFNXty_4JLd&E6w<K#CF9(<3HYYDG2{O#ekq$=ZIw9FT&=FL_ty9{r7bGo1YIDwJb
z?oa<2!8ne43>Uua^}2q<Y}eFdCf{~uT#DQ?mES_+KZ8lu%%72yC-w*)XWIKuyZ(#2
ziok*SE7#j>W&0dI@5r4ujaOs$6`Y#H6teJK!3~B@k1dYI#cLjXk>1&FxBTh+!!v6v
zKU_aPEndJzzHmik9Phd9E1&ND?3=~AcglLx*EYdS9s5f9desgj-+Inc#(pR&_CUSZ
z>n82B!68oGjzY=~hnyq@1p}4OD<|=GtudSDTh-d$Skf<ABOfn#I<wa||9xWkX{|Tn
z#>NaBl6(s*j)lt<PmDYIVe^CeZFzr;#TGxZb$fVrp^<NL%BoF9Y@weX&r3-DEUh?)
z!OM+PdNz0bvfy>IHdU?VpSfyQsy@ej?jPX?F3gR4tM@+cxzLRz#m6Qd=3?Kz+dP6J
zHPV4i#leB$-O*~#D_>>nUY(A<_;&4=wcZ|+s#~w>&dN;RJ<UC=G5JWG@5VkcMYlHw
zCsiYQUS!y_$;Y@CHCYtY?C8!*;McNbR$%V=IQeCKP=)`4NiPd@&u~9!D3)#s@J{BP
zd`I|-{Cd%|9jhf?om-=-ZgEqd_xyv;k7ip(n4S$vtld`qbXUdmX>PM3*%Ce-X_Gj|
zz^$Z{c;d`V>+Dzjt@HV7^7T9Sm_NABc2i!!f6dFxwKvbIp4}r}o@7?CqwSQj@y|;~
zE<Ad4FU<1*-x@O(_6w!!o3;tOOfpURtfF4!wr7RSUk<ygkHzZwb+^oy$t-Vr`DJ&t
z_tL_8L63L3964Jydc8Wa)c@=xj&q#sqK_YaDESyrIQ8qB;%kSBVq;$Ylm3(VgR%I-
z@#9izI~Sa<RNE)Sy`SgRv@-L_-sRuIK5gZWHF0Grj55<p-0^vy^^_Ys!(75-#1F?e
z%-^iuXlI@w#ryZ^*{yARADUcScqMQBtXMBgAxqJ>s`Kp4w7a+L?LM`;^~lCE5yHw$
z9{V59Z}fa5FMsDh!y)@bm9^gzN~_!ES^reqoEEZwk9%TH-naGdZKnKvcW|pC^E~aC
z3x6a(Fdwlx-}_JC=AF!0_RVk9D%AE|em?JP$x-d1?c!}O3uX5#Nps`oJEj`jd0I}q
zX|<EgmUq`(|E1e+S?!-%J%9FonbPd|&N$(ZV!J;q|0l$}_DB9dx9(0=&o}vN-s{b|
zaWFHV@22jPElyF-ELl3{YdTK+^h5q&yzGzu<6*PH4{>hk&VQ?G9Ju=$=sLwXlk2;6
z^wwMxzqIblO~Y)}^)q*UlWzEUVmqVTrG+#89sU#a@qPb#8wH#A^%XS-ALR?Yxl-eq
zTAr0S*}FgRli5$>O0)M$(YGIlc`mkI%(?&Bv;AiOG%F@OK73zhi}iax-(|OYy`A=K
zzmjq#q(gaYrAMVI$B6^SH|SLRJ<|#JaOC>V$<MY*&66wi{u%pQH~;hgd+EW9fhVub
zzVv)={Xu*C6#tHYYM0-wS+hl6Fe*0tgWB}PUc06)K5BL6_Uzl*%OakBX1t<v@zKPZ
z8_(`;o$H~qH9G#o^`qx+8b7Y@-s5#oAXoo*IM1h(4}Vu{TjrEh2C`3F?#g;{ueimQ
zjESjDnhg4iLM{@mKcyeMYkk1-;o3^|wh5WxRXNvpEsBb`Ydd?(v<(K)&-&N`4L#*+
zd>-uKIj}J7<oZkeH;cced<=gZ|8RG$@R3h9oFCuk%J5vD$sT>>(T@2?#GN=3gJmXJ
z$Hm%kZ+evQUjAJ2Vb3kCPtIk9KA&>+?!A>|rV$aBm%poznxp#s&C-YOJM5VMGqikv
zY%}q+&99?(3^?;bLzhH|dU#h`ES_}DW9B@CvqFc>L>~q1nScI2Lzg|zpUe-Fk4mW@
zzR#O+o$b8C)~oW)+pddQUi)a8**~+;w(I2P>^sW6%Pi!a7Jh5Fk^R2@W|3_2fhg1Y
zhuQmdtB-Atd-W~cyejpJ*{!=vkIwNd=eafi+su&ZzFooveG^(UBNtUHntP!5%Acga
zQ}*P3oc?IbN7=O6x=Y9X!}spEk|t&PM~!o4>gFw5KZ#z?n0`j}QISvT;v56f)6<jE
zTaN5s6Y||kx1K-v)RD_QFZQ{wJ<t0i{bTe|@%@{=_x)#hxO(x<4~r_g-S%AkqrW<H
z+F}0<o311ao>JV^nws4x^P*+p_M2ub6Bn<ZaP^(|wt0FxnjeWD-_L%2T}Ad`vE;W^
zzUy}D?*02@_9WJMVFvD292@#xDzB_~n0o*B)d|<T{{;Ndeo)K)E$8F@&bNy%9^LgL
z?D-L~TYc@zUzG)!p7z{!FZ$$}`$;nd_j%9w7u~V{+MBeT@C7w;e;5B#s+fF4{zLyC
z|1H}${wROsE!4lV+oMFnWQK}!&bAMk&%9?(NUMwR`Xs`?b6dgk3&%9BFV_j<)RkME
zYf=_hf9cA*(+bN21J|l=`&XCr$NZyDyvWoo_dB<hPtLTOy4$qprHY`hNuA%5+7C|q
z61r2m`l1VYC2H41%n!Ko&nBv3@}XVtJ9O)GmUo!$(930AHox-W^)1`BUA}hD;}-Ya
zsEZ0MqC(!!j81BAUUdAk+w9eL{~3Zlh)sVit9Qv>`lVHR<7w5N_o{o$gWOleIBH}^
z&*;gXE&POa%3{Ti)AC#k@06=Qiht8kr}@YBVvXX1)3duDu74GDdPP)J^viH@s|Q;n
zQkh<cChcj<S8~gaaG5sA_1|Q1ZD~2pG~O*!&E9SCUb_3&yuUU)4<%Jq*6yFb@LY}i
z5Brba-xmLvzB1axZ1SIQs~of5r3QVM!}qrR;+QA>J0s3a&3ngU&vZeL*^}<x|K4Jd
z6Kj9Oj(hutCf@2ppI(%olv;aiwqE;!sJ(L*B)+|MFIZ;67T+m`yOb5By_yVc-uwKR
z`RL>x?~jwe_5TQcZ0mn?o<Vn{9P5YBr(dQ;<!+mrzSwl>-!8Y*KFRwbms596iHyAM
z^zkH<r|2zjk(T98;=Am)>u$#Be>7YC=)6?L?IV-3rIuc~UjB(U=n4DIxo0MuzgymA
z7u)$$+4bM66$j+j6n6=J*Sgvx<?WgA)xEiQil*t?q`Tkj|6l(XoN`%jN$f?BQz1{w
z#bShyIX;#@w>zG(Ci2Jj56dI_13rZ9u3d7^mFHSv%<U74Di+R9pDPmNF-g?3W(kjh
z`zgboaNb3Kl>aW)voU<cFO?Z5bNyWZLy3j+BX-O>SK4(<dU|PBbjuFc(#~0CY`#66
zO(_}2)wK`*)7ySk!8<lEFttcB&H0nrJ2$J=#}Wq*ep}r6ufK9#tXIUIO`Fy&Tpf7H
z``_Jb{~6ToPyAbYc)q8e^!Zipdgng8Yo6CV?;P*jkG0cZO<(y-_2GX8!MY3cw=O-p
z`^TequaEqb_^|Zun(y-@w(Z*yJ$uHPnbRKUZqYZ%FOXQX-OKIJ*{7BH)7CFB>2H@4
zpZ;*`^+We%URRYho38J8XEOUeXRMCl+O>P1c$Yu-wK3YWT6g1)Pmhc}6+F7;TSm^2
zZ`vpHV{y!n@O4KY%k$;Tdb@bqwNIQW6%S?|%Hi%%t2ni5$*Kk7PLdIt!4sRmFI|4f
zpRFePhu?m|FB<bBcYS2Jka_XPqW=t$^SxsgrGA_)R$DE)jeBkDY7>L#bN?Aq`&1`|
zrIqQ}i_X&veZ0Cn&i(k0)enzs%9?oOq3J^P<=^AJeg0IhY=5|F{n7h3vmYP*&+sO<
z`0-p*`-j49r;qFt|LAk^#@Q^L^-M7~OZ-KaWv-j#JHd&G<8GXj+k>sI_p|@;6hG1}
zt$n}qpWw!i+qxf2-W<Ad``+K0S48ZmCKp%o)H(i^?eaB=O9>a;eNx5xQjGZedH)&G
z<C|{9cW#wUe(c^lu~eS>Zr1c$d{fH{XFlAsWrP0mqu)w|d?h2LRA-1ykoa`Wa;A7{
zZT|<mOScb-M}3>U_(z^UUzX5wkGAN{urJcKL27NkUd1|DD$mMLo5H$jCP(QGK9z`r
z(iT59>m9wiWVyuMoZt6<{o87<xG*&C`3wF7?{BOQ{-}SXUf}gU#t*GqueX<WTkA$2
z{BZBCO;n40((aa%BFElDw^e$dmeGnzo2S(GJHG9m9s3XIqvG*f!aHn?m%rwGQ1NW@
zybBps73R~ud3yJ~lF0w&@M2}bA?q3M1!t;$nqpJU7x^f^>wWEqtjphOu5OK98}D{G
z?Amqzt6QaegPy&U4pPdVkvb_fGf#Au(nXUc{@hwCr<Dfy#2NivVdDroX6n#<(LchE
zq+`{ORGIb4O<!sHu&JWdx@F?wSYOdYi+9JkC<!$^*nEuhoKaml?}49-``?MqjxyhL
z+1K>i?|0MMu4-TU?Q`JT*STERtovE{1=UvlvRkMlwrZ2hwugLAcTG$#e(tI>Nu_$x
z?^U6j%z5UpZ7(wF-cil}VZF?i8so>cd7rBHIz9Kix^(BnXA|G$=q@Xt6sGs4W@qDR
zV<A854_e=w>bQP1ADyRv>5rmV>(bl2P7jqT*RtN7?J8HSv%r1oDTOqK4J-}D@fRzr
zT6t_Tx31lKd42qmpDzQZEU(!7YJO`xXZ}9Ldt2YFxh}R#clXp;5oJF&?fB0yEwFNC
zK>eOK9Pv&S>o4ACuQ*VnezAUo9dCx2oK))pp>th%`s$CRm+h>v-uQlUzXNN?MH~Hv
z72%FsJ{)TnY&&*LwTa`qn4&;}Seok0*{cmzCV8r@ubriOOnm+N{|s?kRz~qJJ)hUg
z%5ihXtm9pEiWRMAW^G$vP<%Dn+VMZbzQRARr%pcHY5i^&Te_{!^1{Exag%aYZ$8V_
znsHJkfx-5N=#d}oNB{AB*t=uLN4E8uS<5^YNk0wpnS5S!i)Vx9ozG`QybLG3TTqmF
zY|GLm;&)2!FZ8n&O^jWj^{eootNM-UilIeS#j!pcMT@2TLLU4RUAQQ7*{8n&Md8o>
zHGeg2zZNZT*S4&2!D^9S;TDPWE8o>yedX5WaAM?cve$Z3WB$;!&tP_id|&n@-91Ld
zt#Nye<DRH5Ti)F<_i0(>zuBo;0-+Y7w<8@6q^@4I?ZfqHY#)Dx-u_{-m)UFQwXdCG
z_b#1No0TcOXc5okuW#6kkJ^<K+m_kPf24mT*ZN_5+w6$lj;2p;_MN+J@j2zI?UBr@
z=P&SitUt52I_8><@0ys3=J=WG^7CfbY}#IYgYkk^pQt-SVeI@P`7*EU1#3d>JM}}3
z%h{}s;Cv*(_%rzL<L`66Csi}{u^zMgS{^jDuRl52_WbD`b)lhswXg0RwQuRKIydo3
ziOsb>=gf$<B#!5M)BG0bxyyTP`_xqVGW7oQ7nVzwUlmT>I4^&zba6*o>d}nIAID?1
z*qihmUgvml#jI1|4o6DAt_sS0-_vI|<!;=wJo6i0&Wb;}wlMYg%9zF%mFqrTe)Rh6
zCo@L%#=fney>D1p*UvSxSl-xX9j<?EtNzXS;`j3Gf1D;oPJJ|Cxw3@CuP>%wueaCf
zXH6^XWHFyqcw^_kCD)&_w|?!O9VRoe>)TuVqnC~gz0ddaO^n(+@vIf6wfvF^HPQ24
ziFXHhtP^ro=v40A&V0T6^yHscW2=wtlXttcm80agy;|9{b0va_HHVlF{a_Kb;91h#
z#Bt)$KF+Nl-%NX~*zsuVx;<6b_lfT@w2Qkr>7nEE8K1JbxkSR9-v&SGXWu85E64iH
zZEF3u;!yi-c5<hs4t(SP^ql3~?Y@X@oVSX59tckoVLYe(xc)~(&X1{ShxRMmwNLb@
zsX5>F`O1Zm7e`C&c24te4>DA{_0<0E4(I<23tc1M=6-lF_f-DkKZ%Jy3bdb^eY~CA
z$?8y3_4?d@hHFhJiza@}eksql&NBM-j1&L9aNIw6G;M#&9#+f0_cm^r|Ngf5m*jZ;
z`5lJ+dlgLuf3)lk^4eEs=X&8+${(8#d)EG*TXd!Q!j_`-|4#X)->K2tl>D!E)s20%
zDJB0h<E_k(2;Et;<4=~@k6xt$m4w<|fs!|0rEBG9&v&#x__}ldmG}t5FXGyN9aiOk
z$d8eKwPb64VKM*L#5e{!jXR3}8KRrtMos(^z4Lb44tt-gpO0_2%2{qZ=a0n4>>gJp
zkNO+4l>f|IP~R+P+fjeQC{6Bm^iScqfcYXzED|-J@Bh!RZoT_QuT<;B^Vx53O;!Bl
zzw?Ftht+#B1<rqqz3`u5o1gm&-Y`3Xk19qp;?AW`P@lPBG21N(J*Nqr3={aQ(sp+I
zGk6s!xb5kW@Aj9rKK$`<or_5AF2}w{?*AF2>Mk$Xnbx`9MsZbkS@4g%U!04&gPXF|
z(%dA(4Yx!}%62n<75)7FaCUY6E&c~vr%vx$EO__cjU$)&)@QH0HEsKxo=;q-*7RAN
zIAQu_O1$*@<v-6YEZ~<_uc>pnp80TnpIM>F$BI>7w#^VeH+9*q-;okEH@PCx%lPb;
zEix*cH0h4Yk_V5IAM3Zq@m<{#EA`xQZ_m$ZMO#vM=Jj|S{545?@9e|nUEWqQ{DJY|
znQ<l`)=gh=fBCnt*`-E4Ns}sbuk2Z6mvOV>Sadee9G*F|Zq`dzuw~wR_S|**k&aat
zk6ltpSZQy-*coPdP~kyON`ZE0{7kbml}~GxYTWf&i;SH9P4)dU^Fqo>(Qi*~?LU;g
zaHdI`pViTl{|qOuuGW29#~;&sh}Z4@-<yer{~7u<maI~ATeCi`e}ckRL*6y^UUL^6
zP!|1ab5Ht5WWnu(eS5mq`;G3Y{rPsnerjlb`#!ea*12C#JhE-sc4_^ykR5BIVtGY=
z&(r;I=~=Au@n5ljlvz`?Ct3WwIGz3T`s&$_d{#V7xg$|3xvH$5Ys=~E7y3D0S998|
z6#e)6SX~h3?-N@0R)0A5>s6%s<<zE!b;%vidZr!oxFtD#^2^tO+Uu719^C7>_MgU<
z^me<w*$cM+*s+{(>487lt-F8NKRR)D@%C-T3<XkVVZmRX$e-alJo{mL@7kZaW{>6H
zEX;p8D|3rpRM^IMW%iOP+Y3$1b=EEKyL$iSeOdLLu4k`F@Cf(^zsY{$_94G>t=s8t
z?iTyEF8>)GhTitPlIvk~>~-^9kAF$i4edjlU)7cWyS(k5@`vkhMc4nB_fc}u)%^KE
zTW5Tl>}<&L)^1f%k5!Z9gPz}QjY?TnGT|IW{0hGfc<i0y&VGzOaP7X}9!az5rOl=3
zv%B5wD^mhLYuNSeWU1xP`ZT{?O7!_3<&8I6brR&F>kn`;{BsFk+H>U4dX-C?y^eio
z4#?cJ`c}dx<Iq`mjlXMOO#Sfpxxdb}l3gMXKDF)nm+R$!=5bPt#jPV;x5BO@#@zN*
zD*qYL|2pX8V&AzdmQ+1kdywVg0#7!EMVW>xw_dsXq5g=z;E(Vlv+7nBuekGfn)D3c
zBX!wtCkecMrp)tj>I4DD2VH-|wtt*{xW4^AgShyi4F{jS*mZ~7rY`^7#u#zK`5NYm
zp10QR?Q~*4<6Gx^@8$lCZ511PU%5ZizO_%UV%58R)|d0N^;~8pZrzo3{?DelLH8cB
z-`3Q>X7zZQl+C$lDZj<D0^MKbAF=2Ach+9CWJd{q=RBFqrN6z)bVZ_C=ah3w+Q=?)
zD0{xoFy1P=e&g{!!q<=dXV`i5pUlfd=hZ7aQ(D-arzR+uGOT=29X=(aURd?&mL2)e
zb39(yod4d={#A7Ae+JG~b5j2^c)h5wG7e9lDYf<Shr2@A^FR3hXZWGMyeltZcP-bm
zYu=eW6D3Nyr`~w#HH~pe;@l;Db9pPjt^Loy(*3t>YivwKv(J^%)!GXgw+V5tSjwdI
z`_v<k=-$JoFE0K#W+rLWwVS`ENiQtU*7(xKN>{cu6EAF*38~urY{`FyCZoD@VYB8f
zTwRfUd{*z?V@s91_2;wh>E5N$;(4g!9Mg*Tk+<6a2rjzj5P$f-fbJ6Z1+z}{{Pj9l
zKeaYhyf21#wfgI@hadmmv48c%zFF$&+QU=SSO2;HbFRU8!|d`O$`4oH|DoJ}RJ-Co
z!=ungu~M%$+);0t|EKV1!S(+PA3XDKSsneD{&#BG;yvZ9{@1@xTw6CUswVJiQtE#O
z&&0kNHsS8#$9Qw(r+stm|F*jK!&15VGxt<9?T=Xg$zDdk{=v-ptzy&uRMf=i*DJld
zxrzPimFv^*{AW05_n#qiKVQY9=ONoalr75r%F16fQOU#R$FZYRa?(zg9NPc8t2X=l
zuk(-7I~E;?-t^<&H~!D-rrmygY|Z@Fvy5!Z`d`MJZ+Wyn?duow7>_T{mhG4SY(M*M
z^0&|*XO~C$ifw$Tn`Gd4>TlQMIln~W{v8RQS5f~k{fK|-ckbmc?+NX-$~`2ybBoK4
z4Z$Z;YG2CzeR0^*#$0jptbfaseta*Uf6rC8F8SBBz3Y#6TUzYc9#ei;{<YV1-cz$L
z{*(XUx1vy1{NttlfA{8JoPT23-rsgFtCYI!Syhinm2|0^T`%0GFe@xmwZ~-5Ggmi@
zNKT%^Kiq5mdH-nc-ZW8B(6wP<g@W9YFVC-Ut&eqoG{1SP;?wwu#eEN(Havf&74hDV
zFKhL#_wE~$=On&O%>O%W_sfUb!I#~?cU5j<TYlUx{6B-xe}*Ui&!0co|K|PrAMbwZ
ze6h8CC&9C^Uncp=#K!o_4EYW5y;67Mp19}T>)kT{(*CeNRyB&b>=PgEc>8w3e+Cwf
zjdcxNuXe2COx>zw_Uhcd`5*Fx9&ud$Ua;j-T-D}}=8vww>0kfD+^_PTVPUq!fms$#
zbIQ+gCr`e%->god#<JF6msY0(3qu9(9KjRE45~iIUrYVlI&W#ZYVR+d38%O=ZFtZe
zKi^*HKSP2(-;Ybbs^9a!j!(Sj8IihOXw~G~MZ4x->Q9WCywx`Rk;rE)(??fp<(JKG
zTk$WoCij7_{J~i@x6*rZ-W{3#Y2xy3?$hzpN*orS=YN*hxV_a<gF|JZ4xi0-ufMD8
ztZTIARK!30+Se^}tM{_&D%rRrclVxhY81NmvgP8EiCU?Xxwtl}-kkDie`I~8{}1)@
zx2z9WXRP1it9Ad#wy3IotdqK%1RGD+&fK$;Q}Ts*Pea}Q^Yf4CGi3kr{d?u3*S7F)
z`pPlR)~0(;{d9C-Z>?QEp~&5N2kVn>muub!_X~SznYXR@HT{9nkA42__so9${_yCP
z#Gc@Xr>k$zKF=LFW!jS{_Z1yWwwpywx^vWS)&*wKD+VW@uVD?+OrD}4FHoWGw&};?
z6}SJme|XlNU%EJ>C~nc6*w~vl@7#80DV&hFbr)B9oB6I#p(X21g>DuT*;={3txmJX
z|3~<v+4trDm|c5cqxpz8#5Y&__B}7|!wP>N=HwY^-u)yg<|9`;FI)aW#E;bckK+Cp
z>}+00E&b2XuA8Se?Nu%Bg5R}U&s;0I9c?2R^N9E14fed~(=6-muHC(ud16hl|Ai0f
zy_3qS<@7&1J{YyMy(xdIE!%C*l<(%de%-pW#eDiLpGL<vNhaT?hax*Cc`UjsX+7g%
z_Vs-V+4k%<%!v=rcggWwdRIDM=EjZN5gAslPmfG1Uc+;iQz^PTlgVw>dy%3Q(x(d!
z7bfog@Sow)^#ki0t(HFTvf<9pfBZM^+#kE?^=oI(Ra~=Hxy$2O*_N*4XWgySPt3aZ
zq*8CkuFk_MSp_!kAEh7kcjoBo*l8TNwesTPN&Y|F-<R2)5fTi&u_nzjQ8A^->Gr0+
zkU1N_|63{PsV??*SNPSkx_HwYk7iG5&WrwTbNXAW)qjRJzdv3${cvU9bemtb+qO(t
z`ej$ow)eH%Z1LO9iWG4^I<wJ><F2&cg)=STz8^M+e3;(yPwT~gsXD{%{enjy*$SPH
zir&6w&$emj9z8u7x+~hfQ(sQCB~3CVLNxwt$&_Ove||r%?~l{@G4t_kf8ifZht9ow
z@04iTqI5O2PuDV4=qT?+otpdlt)DqU6y}~Xm-;R*|4M59q3Ziwf5I>Q(O-IxU;0O7
z>2J2VdMx>w&n#=bB7|aYpHh*wJG)I{Nt3-HXYAE|`g&6`H9Ymw*1rC1GfOb$(n`sk
zFYYhdyXx$+rH&u2bv`tY?SlTB$D6ioxb~l6t6pH<mnqxKUz@&tbKUHi$DgHP9#4Mu
zaX)QI5UPusrLC*~c;4&>y7@<pv;Q*)?eQ+(@6sJ&<e6(6H`6XPLMbwFgV_BHP33*p
z1w=T`w#yq=lz-dtG5w&1p8DTeZ~EIy*D^``XLzW3b&Z~0-HG~bdWRho3t5^hq9m8M
zSx)fhS#wrr;>wI@k<<LQ7C-hsrfo0qC-RE^vgwc7TgqQcIehrm(<>8IV|4rE>ho1)
zzDm&s6J?JC9g*{Ba%-+?{B+f#SkSkA(~_z4e&4(Ix-7ah>$UUU$|HG`?_c<4-(k<a
zPxFt(kA?Lg79Xsty?pbBbNJ;;k3+Ao3lG`3UA!VAEy?WWk$=esH?w)Vu5E1AfA73u
z>yo;|R!_ILeyQiHDf#%k<LTxf(^D&U#UATi?ElEt>eeUg*6lkdN2fGpF4{aPq@&}p
z*}GHbCw{ZbdHy!7iP$mk_#??HrO|(xkK9w)bY;Ds=?U4{-b|IMm3r4$c`n?K_BH&}
zQ4wYPpJ7+QzKrz?_lW*yU{$%iC;hif#J^MftTy;&KDw~J<gK#zr7d&a1NMG2+r8qH
zLWSPDg<Tmbdv;H}e15LtB(wBST{i9gd~0)_P2VwTcJGum)3$G0x%+0`+fTN8bh-3q
zt?Vev&))u%@8j~rYn{J^e_&g<<orkT!*xm@k1c;Bxz)Nh+oL*GI^v>VThgX!+;3SI
z?AkI-dUblH(yquehf7q;SN(hcDfq}PpLyyZ<rY5jb-L|nF4cNwyOB8Gnz(Si+wC(C
zo_tbu{ffN2P3pt>>~W_b<hRV@zGP$jV87sxV%P20OCr{$dUw}`yX@K%y`=Av$HRGt
z9;#1pU9qs;_&>wSxz72=&x)=8Q2yrPe}?R{k3@IhvUxD^mQknS=T@Bq6X!gbz+0;q
zJ>6-I?cS)YPoKi$+{Nq-S9AWh@Xt5@=l=h~pZg!!|H%0NPJUr0ckQj6!izfjk6~*o
z^JT1j4@Yfn-8!YcezxuzfwS6iZPH8!q*(3Eo-;H2)5@M_aCJ}W<GIm~>N^)~+;+uu
z_UZ2DTQ9#&-n1oBU1ewAE&WLnoBWjHmQ0>A$@`D<L+f~EXWnD;3*{E%C!Z`~k?<=>
znozu*eR0X;RUeO5emYS;>CfaVzpj6u&z3q<<V9`0TG!JR+r$5seYx<*xIcMrqG9l<
z;tZ?eWnca4r@QSo-DP|Dz_0JOmFGK^Whw<u)iXF|lRU5T#$DSDRnPXF{yXQNT6|_5
z!^imt^abNzP5USE(Po<Ytez^{P3Magw$2O>6ch;ZH+pokW~xiUk-SvKE9sw4A2Of(
zV%Ob$yAF!o(_|@<ta}-0=N=zaHs|p+<G5SbEkCNw&$@o`M&{?!GP%~fTU=)R6!uqi
z+_6e|^W-L{=B|HozuXIajAA}XwuwfGZr$#e`my%A|JBWZIe%Fe20yyTeI(^(^Rt!C
zcY~^SM}4S$H!J(1^7rls?8oyvxBX{ey#J8Bt;T%mkB01d2D6Xs6KVI^G40ZIudUOp
zJKvXlYmzn;37l<ibf>a!HS>m=69){w?r)J7_`|!jCg|cn&5T`fyY?A<P+Ph@b60x%
zb-&EDm%c~r?Ys5vTxICdRR>;+ZasA3fUBM8L&F$Btv?3)S@-E>$xG&adA+`8`lX6y
zr%jteu72rM-h654h5R?SIFy^7G3KcyId46Z^0s1Tz@)RE-qvXR*!kGM)#_dEgZSou
znpaBpGySpKwQKkF(&*^u6-%y|WGGeSP7eF<_<djW=Cl{RS$c~nc}L2h^sW>VlRqzX
z`c>ePyRwRA_p9$_U;q01-hYNJO^vh5ciArlt;iDl!}`(q&_CmATh=q&$qbJ3wpzDd
zcJH3a>lP+fOL>(tr%L~w6c*{sA+jcwani%XLfs#2Z~F@*7u-wIIL!Wpsn+rQ&)2c?
zt@WAr+XZU8W`C>sVBRS8I(plN-1H-}%qG^C^G=(ayCV9i`Mcz8o$*l<6LxlSJek_G
z>P>(BOquR@_nLJ7#yZIlpFK8a{1e{$p?TR%*_QI$BE2uKOEZ^bZ~7N$zVWb<$5K6&
zJIj+Twbt0|V|iSWdUa{Tam}bDw|nN^3impBKQ(o^<Kqu}>-YNnSRZiNq<Y%tbvbW4
z1HaFb_}+M>h@E+V*6-`ze1F(iK3r^mq_^lsbnUv^CpY%I<KN_Dek$A|;6P#pkE6=h
z=U3{u|DC(fZxfrEc6yOPP{N)$vAmx-&t%-T`EW+1f9}ELgqF#BJrBgM{F9$9*8gbr
zTs{TSoNF3=77Q&s_g9C%lkhqI+GK9T(WTYeUq64bG>FKH{C#_#?MLIIybsnhX2mIO
zs}Oo7;_<fkq@&=Dnb$0u*{9u&$V>b*Gx_d!XQtwKt%~1|k00%h7x<xl*iPcoyQNll
z7yGV^$&4yJdZfU=+$1|ua!Mx)mol%)({rIJ;Yq8OT)#1E>+`le-FxSwew&{0<4c?w
zlxib*${?XarN}mGQN^lL(uLW}jy)7%<rLz$z{<eDCX&F|!0s5=#w^Zd^lXadUjL}2
zb{R!$ZO)(1<$tjJc=g%xkZW7BW&L9|?%ZBoocSm=^Ne}1r|Q<HTQ40sYjj}R{+9v<
zpM?A^R<oqE@@D)<{-$zu(Z{v(kNjtlu2>iGm3#Zf{nxhqcKR+hIX?5c*mbdqw`VsA
zX?yq-vvG2H8}BLFys|^P_MqL~6@HvuBK@`}b?SY%j?a4>JpFIV@#gtc9sV;&eM>zu
zV`r@6iu>-V7oJB%91mVP>wQVDg3psl{?~TrGsQ+mXUS(?UE-n4!}gLR@KeuMyJvf1
z7w8yk>Q(g~ndcfZkN0_T&-~!?ud<IWZ{55*?at|xx~`Z18AR>)UVKdY9ls@L@l>Zv
z+n-8pwadSi{lK@KySma+{`09*F?D$Y;m=*HYM(y-S@t6OXML;V$_#O_Q<w7if+y`z
z_|Fjau1{%F&8Bo-A0fLxd;V_xClYB8Eo&UQhu!99z!8i840SR8rhZ=jR`9nEf0sRf
z%7^;HuPwJ!A2#xR_R4Fz*rlA`t98mg9oG!CH{g1#BW}a>bLQiuJ;jm62i_F9R$a*q
zPM29(^jdV~<LS)b8m5IE@AzXXV1M^QzVv?vr>m{bxex1ab;nIOzVOF<&$*iqZ2z!l
z6JPDQ74>tgCSLt=mg)K1S+kaOO6Y{Py<t38_-Aw6<=@)>uFPk()2Y$Ey7j(XgzwT<
z0<X-s&GNY=x4=}I`-JWtE#GH94Hx80P<3TdX?)Ccn_F(zjvgD8g{N14HSV>#)IIl$
z`?)at&E;=TuQw2=nC`b#ZqtvtYl{6p<d*oq$llQXP5$o=Q&HXj4BYOA%_Ltwdm(tn
z{fcYp`RDNwFX}}eO$^UwxcOXN^re}-u*iygZugTT{ip6eX7>9;&nxrn`Ft<;fAEXH
zZT0P8o~isT@xumAg}X#QSf9B0zTIjO|MJsuGui(LFMs@YkH_hck9{Wve($a@QWmsp
zbX&HD{p#vB+4?e3cif~bIqX`BV{O-W1|C24)8b`Bi0`zI#<%@<)=&KKW&Vcxx89lD
zyylPfTjcy7X76W-75uR#>QnU>rS->u%hX*qJHmZmzC!4y;ko;~S=(;@aa(I<uN+@s
z-!U_s>p#P_1>3IvdAwu0-PHb#F5aTnCBG+re7pZm{ckU?B{%91@veH#koG$Ka_677
z>kgcM9L@es`|rvExz`8fWOw*IJA71s_lM}Ydh%CSzu(XPqapg-2Hy+wcCKG%BAa#T
z+r_epI~dPp&su9Tcj8H%T#vnhKU)4XY_fmLzx?U^hwIioDBpDDOZL+L49DNCz5Qjy
zvcL2HncPq-<!AZPcRS<dH;Hxj(blVb{xR*ZO5S;EXAu8dpM3E?hvQ3=CcjJldi=(}
zN>lmvI*ZGUvEGi?)^=F@{Wfu>`s;5=_E8_tckMH+Z;t2s6Z&{}uif|1otI5^&+af;
zon6^`_szzIw^<C0v`u>axf|yscl}#<IcN$Gdrq~G{aT+{OAh>fRNJXGckY@@o-F^+
z;y+(<|1&&TJzrptb*AY2ej8!g-M81BjEgYM)|tv6+^M_lz<K|ytxM_;Cht);z2F<|
zc4?8@^PH+9tJSO@_$Le4cXRz`aO8gRCHwvKfQ{Sc$p3sPWd5&Z>(Q+Fymfr9yH2nD
z;qAJI_lkdFu3G*36=yZv46FX-y!&_Qu;;yy`}g+$6#h|iss6#5`7EVd!=g2f93{73
z+49rPJ#kmX=bz!Fpj~vHc6{+iB-eb6=qqf^*4!_D_pWJuyq)sjp8pKV{1Te}!Zm6i
zdSB%6&s=;frT>s&oc#LwgKG5;X4t8m|F-`?J=>0)=V`M=V%_YY&bwC_?Y6}A>mKFn
zQ`aB=)BmjK{68-74|*?V%>7ysQ)X4u|LaIh*rmEV{~4H4l+RxI%F$>cy=C<W_bY2u
zl0UA$@9X`KBmX}G%gn2S)9jnAV%y$K%2~d9+qp{nSI=aBt~a`3|KPs-57pAon<IZX
zhhOe4`K`8h#WD5^k~8X(=9}oRJ^AfN*q8lx|1+@sDckmUi+%d;NrHO<Cd~U+yY^1}
znhE{aw!XE`I)C$dSnjs{0)K3|nR~ZKP2Iav{Q~D)qwFuwUjO4g{hy(!<hZn6<BA`*
zz3)z{nJ?h0$^P1C=O5#^$VdD?%;tX!zp~Wmg}rE<!pof!%x|YnW_(d!$@tQ9$M$zq
zRwuq+Twngj@}tRq`G3Nd-6C<O7gF`i^{21A<vH<k@1*(Hw(0EC{ox+)pJ77Y{$=MU
z&cA!l>Hcrq>Z9NPNGpDLqY*3o_;|OGabtDj@^k#ZZwuK>eB1R&U%39@da1Xsr(f7-
zdEoI6*Y9l$CiEZi4t?`(-Hd84%|G?c{~46-$m#XHQZx}Sw32_+7n=A>NbAy%zW)sW
zB6ikP$^2)~`Y<>AA8*l*{|r1!UfdV|qiXfI(Y&2Uci!<T@ng1zKd#Ta|DWODmiZq7
zY-MNe(f%lY(0F-b_i3HS%W8J?e_7Qly*8yO?)Z}b4ECSw4$7%t72#Pezsy(u!?Y~r
z_lx-tTt9SO{)40c5AAnttN+ejR}uH0A@jf|8~@dg6Thf3n08l#cJ}>eXu9_!%~E;8
zmbRB=U$%VAc_-QKQ+b(*{ej)Qsc%X*Wxp4Gx^?HoUo17*MeTe`<YwB0ZJYl1^k(bZ
zr;ez6^cI#+?`?lkkp1aN-NFA1AL9BMJe6PG<NL_cu<p{eTg#@`aLtp*-CN!Iq?~(4
zsf5MB$`6zOai=d?x&K<7RK+q*hFe0q*1mK3#93#*`7lTL)!v^+U891WpT0h`?@Qge
zANh}TZuMlZvVL;!=54<_{~4s(-2O9Ma4q5dD1Y+ze}?nF()O$6+S&ZOai8DBySjS)
z&F4oauHEBy-}vRMsR#3x*#ENe5Mg^$o_;0e`kYts+s_}HE2a^A<UVVSYqnO8&-=x%
zJ7f<$X%!3lnS5i~uUVP_bN2~HJk+vpmEZ39QS0Qfm<hGL*8jv*C(9m6;@`Rc(C7aQ
ztj52knb-c{dUjA;df!FezdN5_K6mL#-In)1s{S(^;LhH^IeUZdN_C0YxC1+sS7;XG
z_CNjcXl2m!Pn(h()~YXw{Jmnnz}x-LHy*!kx|IKjb=l9B``7l1mF)kassHBnnhhc1
z8=L=lo6R-1o6+^Lw|rLp+ruA}zR2r+59;~$pTTjO|21J%;Z0?mfA=hJUNvu{ef+{7
zoqaBcnXg>^{88M#%IEv<JK;~h&VO6`K`S(Ta@>yA{>(S}kB{%Xn`b{aKdSDUJd@tO
z_dPj_)c;jWDoXr1(Z%Yndt9n$?;QWDv*SB|{H%HZbk?=*M>((Cx*mU3+OPj*et$ie
z>74r1io@<R<|L>7-C^@vT=WKi=Pa)EGx_!=oj$JgPE78u+|uLGyq9AGe;JA&la0DR
zyZUAF^B*aRf3v;rKfd0XdrmlL%KUG0=0BhH=jE1<x9%3^SLf^ho~&H2X1Z;k^8NzJ
zfDN{0a}U2hF7h*Qa!<AV!o}YjuPr^Wdxz)Fmnwz(|FtYzdg-6uOR*x!2bW8(l$TDN
znY-92(jxd1>)Ri4Uw_^yeSL>5_krA<kH3Q1JJx;tWO>4tH)rWHpND+MU!MH2_2KFX
zVy_S1@?KqEc4y(Ai^nwmkMOs>+cE#JnB{+lWkq+~|12^6xiR^%_is1GPUXF&+x}UU
z`Olrh{5G`o&dI>e@4*$bAL<@At|&Qv+c3`iKf`8it{E|Zg!VFcC$2bp|9g4C_J8dh
z>)Y7-LgZ4FzphOB_`rFms;K$4qgJ;3yOKZLKj{6aiTkYEo$0ZUQd*Cle{`^?e@3Y!
zi%h~}OYX=0ZT}hgYJ49=pXbb!Q<z$JHC=T@=38mzqPc5l-0f#)mw0=$CYJw5h>gvR
zbzR3F>3L*4W0vKxSh#$Ln{2S%+zWQ1F*kn{v2D1PtN*NXl67m3ja+1bXw1x}-t}rB
zRWeoA-RcDYxTf&tr(N#<mGbfAe})A+*U#MYzGKs!wfAQ098Z0^W}_kR!~^&2m3FS%
z?((CtRJX-=cT=RJ&F6Xl8P=wrz7Z6(@A-QF50@XAF8_5`?X%p4-SsaNuI0>=`4~H2
z+)P}<{rkd+^|P+oPCv5O?M_=;rSRY5%0I(n6F)9LGC^>A(4LsWe#`$1)7}I>P4e>&
zo^NpfNPVsJO4$zOpI6+n7v7llRl2@EPRqt@xyg*j-&^eewJh6u{juNLvfJyT?iIdN
z-NOIpvWdo)%(tmGK3>_eN1<kU|61>FzZ?Ike_fx^|ERR}{GZy)sFaq{yXg|=|9%o%
zzr43bys)|W;a`*I>#j_)|I6kTwBN~g$>co~9|>kn=RA4hkH=b(YtI}{D!-1qU|Qe$
z`R{)Qez%tY4Cl31PXEu~r0W~@BT(@_!-UXF^*bx)|K&1vnsV)M>EwIrlbs(~wyW;=
zzE+~f-Tq!!aNMe0@dr;{mkV3UUG2@?f7O-yp?<3o)9KO`dR2Ar*#7xw#a1rJlMR1R
z`NU3r*NNojFKbWdOL*<CR!Dyx>r%(|BT=7w^_`>t{;sh9#eKQ|@Ooz94jZS2GNWjp
z{l7S~rgu%c9`Izze};!M?dE^vdL+s!(O{dsZR3xFE2A|+cc#h*|1&-JQl7&`eZ_G@
zIjt>jfu9~&JimYDR^gYkc`xM|*M8;h-S$sq<3vYhLAz(lFaKJu(MndnDs^b8>Y|AY
zD?d*ASK$*JGmWL><f_7&z$=N3`CEQB^%%>{j#jsIf2O_uN`0DSlz_?Gi2V1@+>gKT
zt+e<d`cd3#@4hXDu7%th8n2CtP92sAa%5>Lo}hVoJ^Q7DLA_?{mQ;oHeq0|mDUff;
z>4N47GCcp1S)?BBGyQk|Kf~tzZ<81MF8SkoDYTSxVaDPsxig$=CF&OVEdJho+3=L4
ze__nj{fGWD$ahA#XKr1r8vT7^deI!g@2^*1u3`VECeHoMfBE}I68{;FuU`0DQ@>KK
zUS-kGg~~s@|1&hT)E_k1XZG(@Rn0w>4?p{l>|^shGi}!#gQV>8luv(F@AK@}zHHe$
zn?+_$_``FXO^<vp$lTR!5SheX+{u(bpHJjn%oK?Pz6VwFEZ2Yeu<66`4wVm=U*0p@
z)b{DrH)Y<VdmgHKDit<OT6iK=d0lb*$>o1UzyIS5wm)>bdVc?Z2IkylJ3o}2-F)K+
z_t~WuVcJqXHP_DExN%(7Eo9Eyb31B^mo9e>m(Sle`Oklb2lJbw+}ljvx9#WC-KX(G
z|ERxxuiw<2Yro&}txPX^`K|Kpv%Zjd=B=MjscBE^(KA%Ke#~4-^@`Qiwz-cz^m5+5
zd)Bk>XUe2xfkVYxW^$<Hs=wDOZtkmF`%$&O#U!7jqeie;_4WPQS(##QR(Z5C?LPc;
zRjcMRv6I1{dv~adKK=FmNagzn{cbzl_FOvpDn9PU7LLhxO?N~Fc$PKWryJF*XnuZU
z#{|LV*n;C%TT(S%*T43E{jB0<pJep?yCrs$|IV~it~<A%X=}gWAH5$dKfI6qxUTnc
ztyQ-6^vkA#xs^G(X=zQ5eY!rV@D^>CPM+l5)@P}dz@U(u&-i2K(wje|L$3T`d}wR-
z?)tG?*EXhYjNH0(>y_(eg%NiYXW2TJeO5VDGgJ3+P0orlTv`j(O^@BT`@%o@J2g>1
zte5<VI~L6^;JqSNa^9s!p3kp_M(J;ky5lMP_tGt`4NmsOT&#+90qhfA)XV05-RtcC
zQUB<Ao)@#GT#C3CVYhb4?UT#0neHWOd0dV?tTLUgWOla8(Zxqnueav(+v~3kTe5e{
z^po%FrvGPX=bEahm1VZ^LQTq!kMYg_r0)DtyRQG$TH}wa+WcyrpxNbZzup}^sP-vy
z?W3L39^I9?fBHtmv7{Sslo_ROmcI3Vp#Em<vX}J&CCrOo+o?=VF^}?_sCvhLd42kZ
zE<xEhYm|3XUsjHZS-on>Gu0HsRc7xeZ}sQ;6Mbcm^zuKPlRctigOBd&-TQ3vs%+ju
z?mgE&E?Ur(`9w)W#Yo#H>16G1Ms?A5@sj&frR!VcEH6#@(e(Pr*%h}di(giC9lNgP
zB6vjiado_wy7k<eMI8%z_-9Nr+01b$Z?4wVob_strXOFr_1^v3ciXqMZ8&&k`hMTs
zWc5eKkI3^@Y(DnS_`~rx*Ha&sefYP1`K>J9`p2nlmm{y_iM-$2?0fc<Gwa^Zt`a-9
za6MfdHnYj_P6hw1_(%2~>+Ce6f6RIx(&YU*L-$=t^TQ66OSxNCPMJMPw{^<G$2+&|
ztpD*dOz4i0^2UG_E5G+2(!aUg`A7Z3z|xQ6ZtX{AExl7!w>&v@wRic_wq4uj&dhl-
zi*1&qZj?uGk!QYgitMS68ysi;XW(i6ZF%@n>GdtQeWPOKK6$s#yI1R#J$2ized;H=
zt~h>+2;=Bkb~jwwsU_{S-s5F#Yc-Y!9-k)o`rgUxzm>Be-E|jR@-_CC{5&%|&a3-$
zGV82=?EMfQ)%MY3cDJRTNxjG`?!VhouPxK~{4?A*IWW*-QuXRBGkf%2otIg=v;E3{
z2EP3%k~Xd%emi|+@0jl#>-5`i>yBOgkN)c2ZMk%0y+Vd(vE&`U;No1Hl*gu@j=vTE
zaQ$#S-#&fMWi_T<;a48b)p@)2l4xU4vP{{&(6vXFcHi;3B&@u;?(GuSQ}eRF>OZ{x
zM^O5~^X`B08F4xv*^g#xbN>zY+q!$_HrI>a4x4<`ndD}3bDEE`Vc;IN$Ilp^?d6)h
zSY^qp$dU`67Hb~Qxby$wzp#?K?mpMH>@=0Nlzcm<bsne0W`~#_<vF}B{C{nKFu9@N
z@VxA>AJr=}qEhUPuN*VU?w;Pn)VEgK!rwqKj)SFM&TLNd+QKTng)1uR{+8+*^jou<
z8NKrq+>tV|zEh%9zMmz0?~mvsaq=0wSIp`&uK2ykTk~#lUq;x~DXS%BO#0nv5!3wi
z!%dZ>{R=+(%$Gk9u`{jGC)S7M{(H@@?X$kT_!soz{H{|!W@~+P*6;J3;~8}3!CJp%
z_b&fle|^=@<Ew0>L$2tRhDSz=z2vjm;y*R{z~lb7C-Z!(|F(6n{?TQt?s;*_$rVNd
zGbC>vR<C4N=JI=XK5njW<(+-(=C{5W{YcY{_nnp^VZ9_f;hfWP<Ht4=L{oC|ZT`OL
z`YZf{_rdL4`-sb1x-)vdn@<-!YQ3)9LWf&RZb2@)#FKed*Pq3E>6xG29An4)+b*j-
zXzF#BpE>jA_4_M-y}$5&yW})iopX{)&3!f9tls<#nVtDHY*P8P=Nn({dfsNA+8cjl
z+kH-@OZ%>>o;`c!p4`4UckdjpO#YViA^LUUkzV6C?nxhybX>~Ui8K1oQ2k;)&!5U4
z!M}Z?essM$SHJ1yulqL>cWva_82{4TOwIb(tZ!#l8o4|R`<(Y}?|zO+o+8bnAD1`T
z$^9w#c=7tzevxi_&WwFFSM^PP`=-b2l!~1?ZDnGW*sJHKHg!(QKCwvfmRIs`n-dpP
zVziG=`&;zm`O+GlD>kAJ@}=rd?^C*9`tXsj{TnOK3wnx;NxQa8i<Zo(IjemlbKUaD
zl#C_woOOB?GhG@B>}Re>3k_9msaiJozQ6T;+uRp*ru`+$yXQva+}^(Qiw*OU_$}&(
z{M+^!T-am3{KvH1<VXH3y<h)LUY8Z-aWV3h@KGLfIe}EJxJT#S#oxQ>wOzP!W`yX(
zQ04WP@3;PE*!=w1`YtK`j{N@&8519#=Xnul))l>aKTk!p&wRh?>eIIsvkTs8--~hU
zIym=?w2Gm}(ZzFpi}o|tr{}l-XAu3TUJ?9l`Bj(c*X!giN_%!iHci=4k$!f~ddU-!
zZzgzhPX3#{S>ANUqU5ivNtsh}Px!~L4U3*|@yNlDV~%F~{qDuhUVE-9>(s|rxi91e
zZ9*TMHPRJ7sK#r=A)@rt>_vRzl`V}wZ9R{x&wBFJ)6`xt{`{IBUC+FCuU>BCt<tV@
zu4?kddIjx-=v8`GAB#%%q?`U?(K4A*r6dw`Q^MJAs}D<j)ux1)l(MzPLeJ+-`P#aK
zrGIK|ZFZI4(`6Go5>EcC4)M+NZVB*~Yhd#H#kckD%@?yOdsD8cE0_P-+>w|3HTl!}
zXZ~9~)fRpWR$bOD<goauu2`I#`o^g{|1<1!SY5HJ;O5;)kJY|eY+MwdP`l7(s{K)Q
z`DMmoYqxZ>&$xYTQjCZ7zEFm*3}wG&-H5oceP#jo#5+Pq=KCMonr!^j#bsY$p0~OB
z$G1Pq)~k!ox-zYEwp&xwoWEapXO_Lp&urD5#Af{C$*fadXBT(G_$+C&5xg$9e{STg
zr|(M{r|B4p2-vsC`OEE@Rr~jiujJiNatA&)Ubg&VH}$;N?tM!?t(Ngyo||23cjDBV
zH5Ca4(ii0GtDfX37*6wKldMqabNsUI+D#Wuy@h7XMM~`JY8}3<3wmaD@_f{<Gi-`W
zPu+YTwq)LN;nhE?{jWyYUP!!b?PtX9H`VL5&t;Qpj*?nAj<>qH2O}PKIw>`I%V;%N
zCV75Une|$w%gtIq$UpJqn$@eVr>cnL^xb&=X?>Q&*X70*>297G#h?6jc=suV%Nj;)
zle5^jiBT_NSO40yn3vx>_9eR={-Ct+*@j)yb!AdFzA%oRaOB|H>-Q41Vson1rhnAB
zUl2Au<I8!|S62D`k0%+dHhg>K`cZMSaxYE}|I1sWwp=UawP8)TA)0&e%^6wsi}KaC
ze%!tDGgCh<JMR23V`sgaGZ^D}ZvObk@z3*_;f8l^tmVJrkML?0Eb`uBQ&8Uc=d7xq
z{z~EHsT;qybw2JmteO6}!Nc-T_N(~zI!l(E&qhX;?7zaF)=hl0LUm$I=i{1RR`V~L
zeyKlvUo2+Li*IlIiVP}js%x{kwoJb9e5JRy{0hU0HXpH`Yt7j?6OXGjyqzG#`J$kp
zUOC=2BTjW%wn=5X#rs(|V=IgIOww*#ZQOLt_Ly#F%u{WLR~e^wnANU6^!AU_#;4sW
zRo9&}A8Gtr%~My>nZ8Qag|Db$h1+KS;<&OJFNOopUw0kab?uN@=)Ne1Zxh$J@P%Ay
zj_O!{e?8}ahL+y4r!!<qmaBL86-mhazA)k9yZ;Qg1;17CEnDM$hPR^qkBT2#ar4)e
z!AJTQ$iDt{Q8n3B{KB`(<##>oy)yU7a;}$_Q<*N^t;fIfU#P-I<;ioplqPY<7vFIG
z#`f&F$k+Wod>-pH`j5;>*zo*H+ES|*HPaG*6uO?d_k1O<3!mt&08>lz1mQ2|O`oPm
z$(IQJy0Gio<+*n*h}lNGGMB&iH?uup=D&|Dzq>y3|L~aepF#X_Snv@)_j@wsA{<{L
z_2Zl*zdflAYhC(h+UaM<Lel?yTd(`?uJpdN=dZ&OuTS*5R_GwN$#nL%fXHpn=j0{+
z%~HFzj-SW#_-~i%vzK=$O0w?wdNxw(iSDrn_VWL>nn>Mv{Vv*fkNnHB31{qY_kt!v
zL{GnxWBZZ3hH2OFwvyEg4zr)#xUJ4!;;c!w2EY1JKU0et{8g4S<YL#?ownZ;-=%E$
zWAelH*8IjNKX19tPXEuK$n{~p;D3gLdix*Dtka!-_9Od&e5N})pBTT`cDvEmLxG9^
z(!LYEPIu2St~~P5T(LE1rRrvr<xvIY-5Y;?E(9IA^`D_BYDP`BebX=2rst|T%Cj!k
zYotbfKAZfHqxC-n%dxB5XV<f2Nfl0>{EfFdeA_Wwo89xYzbf2ue;u?~dk*ti`)s{u
z`(xHtf8M`${)EZ(2iff(%!`(i)wPLCkyh7!<o)xQ|JH-kKfQb#SGx8;!@<4r8}n8z
z|E+$^&g63Ezo&Pn{Ac(TnD+Be_IKg@y`EBu`?5qM;~sq6y1gj<^W1gy2e;a9{<c_g
zy2p>RkABDQ75ws_f#1(w_E$yn`zCv?!_EJA_g*Lo`)p(R@pLec-OF7UO}-xZBA;yb
zC;ZEtB!vdc<+_{AEmv1`O6@teI&A-g{U`pV=>KPUaDV+Rr9&_7RM>xOZ8Cka+HUH~
zl`oIg^u~s-|7|+k{Exu<e_X5y2fw`U`=$G6g>=aAwb3&D#pMN-zvPeYUlEw}B=5wt
zrDBsbSOmW=`6zU=H!U=1+x(*c49Y)a_x@*Sa{bS6F!GDVjf(n5{B2u<*yZw87V=+~
zE1PNm&&L08i2cKR@gJgOh3+^de&|~i^5JpV)+syQ&i$3T@sE+=>-ejk+vb$muT^Ld
z4xE~He6y5d++D^rp;r_C%=Z7S{GZ`q>KBVUcWW#!mgdN;*t%n5o$db1Yk&Oe`Kvu^
z#}D8C46K<K4j*0phiT_th3B=qqXgI&2)_Cxf7$Np-*Uz^=}(R7@4H<2z4hqx=N7id
zvT7H48`dW6UqACtLHxo046M=@!|OKxw#uIP;6DRXj2HjkpPyfMUHNDJ@7g~R-+!uq
z=huWvt@ycTHE)s=!|O)5sp_9i|E`|>HZ!_doBs#He+I6~Yo!Zr1Uda)r}13N;z#WY
z<sUOI+h_Cl2Z{bRKlnE7;G8#iSMoZYblP$2jLWYi8Li3JB^CI-emmCr+v$(k<xBkh
zukCcUZ{B-PA!D6x{sm6y<?mfLwlp8tdQ#l;q42M#+V&NT-cHf(+i#$@`p$jVs-^jF
zb<=pS*f?(f`E28=+jY-c56gP5v6uhB{^`wshOPVG+)q2i`1r3<%%q*+a~+g_AM*%i
z_-1+`(|&9Fo1ZHdOgewOO1jVL{-Gtp7X;35{Bf=K6pxenQN7}6X+CdeIP*G{Ev@^%
zsF)tkif7)R&YNBS?fT*Qd@*egreDtWRQ}kvGGuz--=gMw`tScUG}Osw#>?!Je3cmO
z_fc<p;XJm}Cn`Z>6Bpjpq%VzAd#!!Ca_^&gYQIX7vcLQe`rElbv0p&;*6~CBygUCh
zr293<|0&TeEWiK3PyUDcx&`-=|L9)My}#^ryp<U9YmwE#=YI2<zA()Vzf)tH`KaQF
zyv_{U0}1sL*WTFUtXI%D<G1Ge<?8<#nj-5C1gG5m5%%lA_Uc-{zaGEp{;txfe=se6
zlj%Nbw<|V*%cuTcrknJ<|M&Y+{mk@LCc%fdezf0NKlAg`eLJlgBqJT)cU|s}QGTlD
z_<eoee}?vi8ihW8W0#NLyLC_4N`13r|7R=yb?s{YAL<sDZ%d^gxtlwAlivjI<NNQb
zO<uKI$|=O^{D<_G!>iA#aqSmf%eTCQ^Y7DIPVqO|kGe&e&L1!KaR2jdlau|I)RL(1
zH`R|$XHUuXK5FPMG_UNYMv}dl($43BYlEy5-&mckvwu=^@!RPK#?OTKx4M;D?>NYH
zf5Q5`{co-=QQbe8_or@8>H`0lT~FWrXGp!hY3Z7+8r-EnA1c)K#=I7^+n8K@*fdr7
zQQGyqM%BKo#TB!jiLr8q$#Pg&u8;qi|K{b#L&wr$<vq4uS<K$v_B2_gezzjqp6rMp
z#=l)7HI)yV2S1+tG{)inG^t%8m%}r*``u@mesBMo{pLs33$CgxiuZFf>^I!;H=A`&
zcJZ^yv&Q*0PbSYwvFH7hDK@SBh#dFFDdP8!>E`I>C7!cy-FK<a{i^$=J+C7!?kQjH
zHSNL=<)dr=KAY}!vwzviC5xs;6;x$tURtS|e^u^YP0Hq5QL(2SCk1@mdCW7T<DlhN
zH|7s(UjFerxcx|E{apsGPZ=iX#p5%V-SQO<-BNA&-RREEv%-u@rIJA$k0)74o!+x;
z-xm3oojU1%x2FC}2(K|L%r0(QCKPb#_(duGqqTX5KAB{9a;<mOoqxDFKB~g~xKw%9
zmX#%ILzQ=L-_^Nr9_JJ*Uzz6YW3MVw6Az01^v++iCgJDj=%byIlb;1VEMSxDE}oOZ
zQ#d)^?T_J)*2TAdg}hfpwLjKM^ZC#4BJ{fJrAZ~vDrfAm-oB;p#lMLC4_3|JaQu%E
z|M6J&!*cAK8*QW?r}~B;{?+rkQ%7n0#C;bt)L!fh_7MC$>Eo7k)<)&e$w%dwF8!1K
zW42-M_53yZU%Ri*aWrk_T()hN`K^^@jYZv?g^r!w8D}IT_}%?``+o*j&cCy^tiNsl
z&FT6c;l-wVk9TZ|m>+%NW@PNYt9dgk*!Y~z3#8c8zFodz{iDMHAFdy{&Chl7&E>gE
zb_zwC&*)R>P+)n-!@w2VtUO1%$ZF+!)oW8NtIfVxi?Vh$t<JArzy6Q#1B=J;vUlUM
zrBnn@KGK$$_R2Uje^=y#?V8U-B<z*uE@|x9c!$mEui?rca`|2M>|6Q!<T(4iKAu~-
zNINp?^X-GP^^MGh?wl{`OYD4~*cSLquPB&r<NI5DrSB%LxtVq8>_f@Yc>dFwDckxU
zUf6SLji=xaZY8(6pjB(<ajGyemTg@5$LFJ7w|HY}=GPZJ>$RhrKAbL8IknMf<u=1D
z^OAVi$(PUAuetiDZ^)cfzWJBq+F5lrdA$qV`Mh4p#MeCPgMP!-=(Efr8!nWVROhmt
z_uTP0Pj@TF56`4+6Z@y;mR#gij4nG>(|WmDc7J*e`$zFNH$U!v7~WnZ`!W5n)%=DU
z$477LYK;yb|KwY^D&p*ljBn4LRdc59+-#Wn!B@uZo@2hTk4mw!(``A&=@0Zf<;DN-
zKC<Vl@%qvIP<yvV$=RUG5u2~BNpacDDfWVKThNP(n_N})MQI=F@wl`6{q^fn_mAth
z&KI)D|0w)u{UL2%@$e6My%}qiKE}6im0Z6*?vdm3SD$a+@y-eRrmnT(qSJ0kPSr^z
z+MjQp%lmLK=EJUcbHC=DjEt{-Req}H#YyjlAHy~;`6F~~k9g+86HBL`-nwh*m*w-M
zkMg~FX8B}e#xz5j^9@3egk;Rj=ZHmJ{&@eb;fLvm=Wl*{Y-`~v&)iknMV<>Y&Az=C
z-SX&_<k>Z!Y&So>XAxy{QbtJSU<c=(rmagKME(<r`62W<^aJmb@6)nN3t8H}X)l|z
zLp7z(;)%XWhUh+zhktLLykWV1+Lr$eJx1n7L9@qk3iGbJ|CpL6H*<xrUT69eUn_@;
z2Ti9g+2q=*#;?XAbTVHg+{lPY&9mI&ez2QRMZ{5E`7h^ce3G8L-x-uI^Kzd2g|GP{
ze?mUW_Rfj2>tEr$s9)%o>CwA~ciGI^y0>TAC+nzJ=9A7$QkdYX_oJs*(=|bQ`M<Nj
z%(f@8ZGPN;bN^APwyot-XII2J@=a2j_sT&kGx@W+P;Mo+(R=9)Zk1<iOjo{&=ilP^
z=q&#c?Uk>EWAC4s7<*E7>D|RQjCZwH%AUP`>k6yjNy&^S?y3ip3~zca|5JYDNv^k(
zox-$Z4`$}x$(q&0*7?&(RL@K=q`CD$iA>m+0)y_$C+p)YpKRAV{{PZH_vz02F1<a|
zD{TCnb>r(}3@6v^KM>FHPp#s1bWerWnJpKeIXrXiP>6dI(Ze6ppCk1q-}J80um22Z
zFMV0D=CNL6a{08>mNM5$iQSABte^JRWxrnEUi4$W_lKDmuieu%RZCP}x<|?KnF?R}
zl+^hWKf@Ir-p=!XcgOR~g46p}YgO3TEH_*GUS;v;tNW++uYah&u&>lzmh0y<J%O&w
zd%QbeuAAQFeeIXb^p-ES(FeC}mkL{)FT3{Ml8M|m7EC|e=hnG>S>b^j_YDFkNUO+Y
zzkJ{F?bq`5hyNK`R{M3G%HF6`_R+asrSL%FJV((hlPVh?DGJZ%Zq04;JyNr^|H1y&
zs_k7i{>vlody37N{^_{r=DQ~*oGjJZbetvZ+r(3W>-5ql1#CDpGd-t)kGGchkv)6-
zzw`22*w)&v@0e7$c;Z9(AMU<W))s4@>|8$SRJ~pV+rs2>z8_LCCoVN9YpJN(w-ifF
zULAVHQ!nlAq|1A!Py9RkQF%v2&1Ri{rw?6uwp!!U_UbKb({8`J{-sC0-H!3&^rk=D
znUC)GSd~qFcsGH!?DNBCyVI5GQ(f1*EV2pK+gzP%bvno7<V3};+iwcILT!HX98KZ;
z^1fkD_~ZOr&fy;x|5y{_`uMy+R+#bKbJwb+Ts}!fzU!IxZDl&kM3&61$30pfQhaKr
ze^7rEe&lS}`vdZ#sz2V<h(0QOBrkD%WySQPAKdHHvw6SXDZcNhHd}VfCLM8ezRmHT
z<wa6=Cob;J;k(3t?fnn+^n>yuQGeWiH2!w{@h8LZPL{al(wAlT1UuL6F`D3Hb93F6
z-D#6@7rmUz()-NLBVo7u39C(=P7!U3^X`_sxOQ#ZtnBM&{uzZ-J}p`MQ+`#P<cDK(
zAHEg3ez?l%P1{X|q{1DOPo^C+dQ+Kvx6}0In}CHP35-1<Vjn%ZnALfXtF7HM!KkWi
z{f_29FYV-g;Ww6rOr97Kr|^-j@u98Z)_UQ4hZA%7%+K7oQ!85cSw5BJcX%S({Bon2
zVd^(5?}$9^uWQ<GZJ*oge{etl9_QsXsn_>ZF3gx!+Sb1!GiqDs%2%^$XUB7H^G&wh
zGQIf7#+c|kY8>i9#}$LPS=Y_t^$JTXm0eu?YCmI5=!fM;-WI)f{BSFFb>xBRJf9Cg
zUDI_*qQi0LY^@t7Qe_N|*Hqui{Fqr-yF5VS@)z$U{?q@i%xSQAv9~t+=k34!^$%9e
z-}J2CymL?GTIWaI)iZV8HbvabsOno<v@UY_Jf~|L_5?cZ=rhSw@qM$-;n0&`-@EM}
zY>^Y)Jnfl%`+o+uJ=v?aNcmpd_bKaA<}N2$qqEnnXYbdGo|#wX@<z0M>V6wm(~5Q3
zx8`+UnXx;s?n<ohx0z9qPl7ytANkntz;NLB)|5M0n_M}%?(0}Gt7kCpW8YtVZU5Z)
z(*GF_Cf8?k|JWya>xcHk>CHBv1$ZUPzp;K>xGMg&YmlR~&U68H)(%%~1&h18R~&P#
z3H=@ZpW&eEe})H(;`#q6{AfNX_5P@KuBMIo^4s@gx3_%h_Le9v6+Wd9wzun3(Tf$!
z3rhbpL|Clzl1R7ISgHM=;o$aXS*vv~{;jUve#ChBFDr?Q6-*lE803DK9{Mr+=r8lO
zwP(+Fe|>FhW%{)D?GppWub*YJ|2+Fs{=2H~@_oTG)9p+?)_0m#sxesZ`N+27;^h9H
z-?z=W#rV3lhxui^cE#dH%QmjO>ydVOOQZFl^TrXbI!hk^ShC~u%pJ$o_TKog)%#WD
z)QYBgdv?u#arTk^4-NG<x({A=>i%*4xc=a^%Z?L1x~@KGv#Qq2A?Eq5J>o~=KSY2w
zE%x>9eN$6gxNb|b!b>T$<uxtOSvZ64xK4ccXn#}U<M*<v^XKYqv|7~UQz+W$)HsK=
zH>9fX@U49<*S@Tbe{}xPe+K3(p)+r*X6Xd;zTw`pJz#p-lcycJC(mhTe)y8<rR5*~
zOXferZN2hB_pgf|?f;>-{7wC$o&OGec;B;i{fyp6r!F0>`1-r{j-KtlnBU>O+50~f
zs2_Z>c3!RV!}N}2jch)fUqyv@SRPbeJk7D^tEI*Ir~TiaUx^O*yW~$aN8pxhp@~<%
zZr{eN^7;0kM?0sQ&lCDl%wxW7+UJ>H%4P~Zw7GHUZkwh?fWv12!xVMJ7$(O9>(`$6
zVb-Q5G~f7=?%(6Bvp(v)@UnY#b?JWwmVYa3O#d^mzTW?_{no-Ci63%JC+9w$dE%oO
zOH$aU$NEohcz>VY*!Qn_)`d;~8Jf=5<nO!o{L&gb_M2OuZZ??4_L24ejNML?JpP?#
zcwq2*$=CG<_y176;`lXQDn^S(M=Gg*<&GJB{(fTnj(nJMDYm9~*VenOQ{M?&{M<OB
zKltnM{|r(4gpC50#+58uf2x1gp`_ZS7H1c~UoY{W;b7)J^NJ$r<VW+HXW7jZz0J~c
zr=sbDPTvt$F1J}lo(T+JE!GtujsFmRzN?OLQ&+uIjphZD9q%|j?ma(Z-X+-{z;M~~
zL2*2LP57lXUuESF{kr;uQ}^f;W7GXJPc5#Q(6p+8JyS&{C1uX_Q}t3gZ*1a!TUD4J
zwNvN*yLk00L*I(~1wS`M#JuyLF-gow)ZyE~lh3Ac9$NEQTvmE}{AZ)1*QexNwohGW
z|6sGcbV{{%#y_qb9{K(6SgM}BfA1OlM|jzTnmwOm_U--8z`E?m+(n)`amqim^Rsl*
zyKd#~`g3qn<hB`)6~8>3mhj5mmScVI7O_eBd_U^m3IE&W;bHNLC-774h9d3b`}86r
z>kqkBN`|uOMtjb-NjYhF>&X1yX{&4*n6@qK=(p<E|5`1v>(k~*=`UH^|A;NJ4Z8W2
z`+RfM^$DAF)Vy=uIK`{exu<vXJ?@)v{_C;X|F~;EWWJNS_xs_yy)rB6O2u~-Pd&db
zCj3#-kM$ute^jn>H(8px{hG?<g%y3*T;@GFy8mjVXos6DpXGVcPwRRU6Q-|E<ViSk
z>C}Ss;@qH+Iu*X!;#>QEw^x)&y!7<kns@yCvl{1Me!1N9FU$YQXZ|)nv-qtY-$xyl
zIdyNp9Dn|wfoamNSo?q6p1<`@ok+0LyWDAU{^s}GKM6bXtPA5$u`LO^9k`><fNRY<
z2Ajt`u34@tbc$@7J&s-TG&<dPBta(Oi%n0sYn=E(u}hO>j8C0aU$*?4^uzZ*bkh(1
zj`05$-@hj~tGjtqw5;z3{+dN67|z!2{qX)D7vp1n`5#%gkKSYZ`1IKF<#&!gcULLr
ziP2!0sG{d`aZ^LN_Av<oH|-yJA3~D+`6{|J&Ty*kn<@Lsq@DL)dnsp1$0WYzePJj5
zsRmhxznuT3`@viDLsiQgYYKmR{E$2D_u)T7$JUffx}~r0ns6SNXDS%aHg(TK)jdm$
zP6dXaW(&O|Fzd<M$r?v@?7s1G`3x_=Gyi7R$^U0K7+4eg(dpJ(JKi7r;w9pu4nOOz
z_Vi$#S?;#UTg6f79*4rt7e$Qgx7%?4cBs1+wY+uN^{u_GYu4qM{O)yncTX&OgU}`Q
zSso9{`|j*%6==OD==r`c`}ux`8nX}bhq^gx6d%mB(>1$wVn&l2JBy5P<1x=yRdb$9
zj^*$9r+HAUab=C!huv-}ySL1{^{(Rhy}QEvsvckMU;EeZ{`=~AWv%H>`S{#dz483@
z2mNcZS0CiPa_dV}_URqmxlY+`Q>RL-pLyu$r=2nk95TIUukH0a{*O!cqg3shS?gw6
z9ADzYSAVzapUOXtEaN{3Kjc3&KW0A?&tECEY+>@+o2LuwIV<$f_TJt9%XLeUBTrV>
zB_pe&&lYWFh>g~&S?s&>!?Ss!{H=csjs7!Su9f2Ce11iAUFL(}ACjSl1wFIogn#{H
zzkj#<?dOlISCn=8&8WYw_Al$}m8iOV`^;11@@6jIe!*-1$=-T~ZE?nzOm;?oS<g}7
zrS^8S_cR5E^Xeyecl=|xzC2_87L}@uo3#(#^Pdrx_-!)l>BKLu<<{Kzqa_xr9Y6cC
z;^PnBZ-21gWAUFMf4zuSqgi)W;oZ2vKcAyM{JS4D;rJ~R3;*AnH~nXLv-OYG!QX)|
zItwEH*a-D;8dN+!x-D+6koC$C{$snN^>4jD^sP00`;YonPA3?T)C=2$|7@M4$^Nj}
zWy4nGMfKOeJ_|aMIQypjovF*;eoyg;?&WFzcl5x&m9cSie-~C%{rI!X=kSdfMf+9P
zKfGT2?{1xZ-@~NYhyJN;ZuxY{`6GY8j$gUadv*G(61MtR{?0kC`ups|_kuN^mqbHn
zCT+d8rTW1eOOCeJUhL`{b;N(4(b~5%aP{Z<_(K0z_pkr4{Cm~;cT$GSzt5h#nD^aG
zwtpC1Hh-Ib6Ti5a`N#hZ2a<E@{NoQP*B^BFr~I-lLiywQqZzzA67FSH*yV^mZS>S#
zobz~rf>6c!6?HQI?!<4ET_Ux-{g3CP)wNNdU9UXfSlwCjy7cqIL;ktSI@uE8)s@M5
z;!k<}?ipmiwoq^Qc=Ma?gAJ3qrq0>>Uc1bH=O>xuW0GZ_&A+~B=^lHTxo`XD*#0;F
zZhzbQBh!*wW%@+nzb_>IGrUl_cBg*J_d_qIcmEXs`yxgDw{E@St@yVuKYn6Aa@>7J
zvclG8p82)gnRZ*t|Imm(Ch_sxTYb0bH<RYtPdT>VeeIXrM;W^vo#MZJ|GA_t*ZC#u
zq0iTXrqsW^|7qvnRQ<Q|A5I?NT~$|jg8yH0(E7LhAC7z~T@f<>Jv+!A?QQWN0{J`q
zb&~S=GUK8x!b;~o^<Zi6<FK`QY<eQg{zH(jzstw4#SiU8E7l*D%Dp$++S$f@SJ-OK
z-lo+FC;8_}H?84Fv3Pz(Fn<2W_O_YlTvqNm#%1$;>#XXi-}c5|<OCkinQm7cnd+|R
z9rtqW``kyn<*&2uKYqS#(?0v{xrYBP3;sE<w!_Y}f~!vPy3W3RRrSH~C+6(`5X8^n
z@M?Ozpq-TE<aaYob=@v2|GOO}H}|jByZQeaSS3HK>0y1|^H0QR-cp+s#$S)TO<sSM
zSl=;~>vZYQ`kCMEhc4dwpJDxue|y3o^|vjvfAQ<+l$l@V*?(LcUEdMqGe`C7#`B3f
z^?yR^)vD~@K7VjG>-C#m=^g)M<M*?yUEY(Ek~lxz<!IHs`M<rgqBcD`bo%i2_I0^7
z{!30Czi?v9e}>A7_3;(8Uh_STe@*B=W*}x4dnEtgo38qaYa?o+wO4T5ZunyQXV<}x
zkB?27plc(iZ+R@|Yp+)D`~^Ejx90zL`s2E#U{j67N1<euE#^@*4fXeT-}yJC+G_qO
z=L5%=^uPRNFM6)`GgI}K)yYRM9V;^8UuM6w-f-K0hOOz{3#`>Xg!k&6_|GseV^ja1
z)`F|c_HRq?*m8c>XV;HU7s&i)IAQk9r~dw?D?7F7)xUlh`e3{CZ|(ChCu~v<OPE@G
zJgs=kU-`=Q&*AKUM3~;4W&1r}^7ezrLYY?c+^>Jvjb-isBjW34UNJqoakl-(ugl`x
zfBu|y_^Zj!l<l4MH#fbjckg`c`{d7^>Z?;e?%-}uJMp~9F#bI2{y!q+em%L9k8AW;
z`%47>XXrns9e4d7SNP%yi~kAlRdTA||0Mla$kDrRoDbMPbN?bW&n7`!<sJLV7p_tM
za=X)Ye_nrZbow6=yXuZ<k8U5SviZ2*?MSts#VeU`-{jwQF=uZ2I=jyK&#>vvze&MU
zrYG4gwCk;pSN^X4PdG$-T3-G6y%F8V&&|nWslNVLZT|1lJ9i!=drh`I(r5oIIkt5D
z+nKdy9ve1HsNY!dpW#8KrgNJ8iV*u)`A5vjP3#hnX3HPRR}pw)x&Bl~efI00_0Ra3
z>#tic{u{Pc@$VXu{x53<kN@7z@SnkCwcq?AIle_N>efWn1Z`&xy<(nq$G=l5r=5qb
z)++qTqq?j2<odgN^<HwmTi0VhVRhlZtM_=qn4+tXeEZ4&?~KM)^UbOc({|Olzvlm=
zBdej1An8|mQ2tcMKII!cm2>&+=12Y6(En}42ZtP^xOMd}XU%_dHR<)Y-9L(#WL}EP
zD!!+>$KF!TQDyRh(4YH0%P?5a$`iP`*)s7}nSJQxM{2$5ClzGAs7w3{t&*4h5fyr*
zt8rH{^Q?b$e>DFyuqOO4PklHy{#d-c$?Eld8Mgu|qXRBWc^~UiWoTAitoM`8?~c>a
z&KJw}9oYPL<v*cUW)ogXm900w`EIf2qRh3aZBCOkN_C}~0wz=j6={hi>h>;eTFY84
z{ME50@S$V{x1`++$<@xWAF{V`yU$4}JX#kQ{qNFzo|K>U+eCyf8-j|T=zxD0;`wGX
znx1g0V%}5#W{Z`k?un9Bx{uCZPTl)qO7qi-%9T@Xj5SV46#o1EpCN9)S?)iZA7b%S
zvadDEf4MAwChU#8)E|{oQnp!_|NUps|8eEFyup*{5%U*uFMCl`DB=7i|KDB@6JP69
zEC0NHa5}#Go_y)wYa6rbCaeFr_I3Hu?t;T_eyve|Y4xAsW5`stuRdYhUi^;9*v33}
z`RA3>y*E2gSpIqa)HQZm@sk#5KP`N#HUD+&wfP^lLvku7Dfice{FdYj_W1sQK|*Bf
zp_g{1+xLV<Pr2n^YAJfvbyb9q(Il>Rwk;YL7On7HdBgSJrclw~e?qzvGLlz<o+ez}
z+E8`1@=}rg#Z%4iw9V=TGrqlwd>+SEv4+!5A;WNzlmo|OmU(q^f&=msZ@h?jt#x1N
znETIP!E05oO4V-fST*Cpx~jiL*%Rf3O6(r)XX5qRFZjpqt~dXwKKC1ze$%3R<J1qd
zM%Fr-dR4#vIXPvT_2$2C=D!S0`gp&6sdddEJ|iQm-?f>KkITvCxg7trG)>I%t+W5u
zy^r3zZ!P|JhwDGXnJ~@|$7Zx_u?k({@}HsTlHjj5XR8E0u5b7Mv+XahmrdfsPsY#t
zPh73(D1TRZcUwDex8$3*li1YP6e`KtdaXDcQO&kPI(?fbo0W~>_Rmr8|1&()x!~{l
zpTXJtKLcl2^M3~0<4-cZ%wKrL&U{u}q3ycg|I1mSV>SO7&U;%(|2!VEZS!yY8o7@m
zx#Ar*oD1W$AD7Qwc6(Cci6;s+Qs3i$cx`dM6n|;TkHsF$*5{uFyu80~NtWrB{-&DR
z{|qcI{`UN-T$mN5d;RcUW2f1n-KVDgXYgpudDk8!;nB>}<oUDlef(+rxBLGyu$=pG
z_&)>7=jrhu?;kebbk$BK`<Cyu$@OdF+-)W~CYLasO)nJPd8l&=^Tx#)&nGHNU!0o#
zyFFhtvqkh^esavSt?aFPf|tft)JJV=dw1xcTHB**55+uEdyh%VN(h{C56GUhEYdIP
zm|1$LO|t*@S?gaX|2e&nrzY%&Y2K~$!<l<rbJ^CedR@+RNhOlm+ooZLlfVLIP2UCS
z@69ewzW#alk$7=C-XDt({Ca-lt-ek0qwc+4pR&2XZ1U!|Si8i?TVi+RwmUI*IPWf;
z@H2NCYp=-aW2frZ`Tx-R{zvHY;r|SqWS8vUs{ZEW!yC&!Y%!0|+V7#zm%UdhHBp7l
zEJgPTXVaSr+u!vu^YC2%`1`kOMf;I|Mjy?#epEl2E4%dUn;YI4jxIs(jxO%cU<~Cp
zmOFE%iYNSX@DaC6N9pT_RjV%6y}mimc6Iy>*A>y3`?z-s-iT3|q&~N0iaDF_pH0Un
z?ckD_#;h)@op=6`?cTLZ!ZyX<I&pE)%6ikfBsSygd!v6ueoQ|&PyEN@#edvB&To8c
zQ@kMa=*2zut7E;U={>soX!~zxouZk^ZE2Ccdpe(-TfOlEpZn^}s{2Q~=bGJn_WD@(
zTb+r@mfJ6HInuH*z_Zu2k!$Af1;UMuv(5|0UY@S)-WtyswEFo{ZTbI~f1G#w&(M_d
z@8T`~j@!Z4xBQk=bO{!{d#-c6W~R)B39~CoelPD%;QnlEw8Jt!KfnE(^p7bydTKj<
zG(Wg27C$x2dw0IT%d>JGe81P5IIMB{wEBSVmB#qp`#&`O$=-f(ZOMNIzSpyQ=Uj-s
zbNu<yvd@!sc5k*jsh1i)$;s_&{oUIWXNVN>rEIg`x~?<5=vR7=DX-Jx+8x`)zi~@>
zO2t-w=XrEj#pCWnrn@W|4m=Ut9FBMDNgY02`eXizM>WysUahZNe`nHP{=@!4btf)V
za39$<zspYaPvnop$I)xE7&ETPseP>7HgDUji<M~+<+s<Lm06e~xF=P*STQEqGEVhx
zdwuTR<j4GN`_%t1@BQGnb#3?e-M`b@OXrFurq=4jxlB(?*`JxRS%b6fW>6$!8Bc+D
z{(Ir<`CDSDykoMfR_xsKIbSw++2t#@XDpq@wzbQB(hakuo-;iMrx<covYXC-_@9A$
ze%C#v_Ji{!_DC;$C8c_8hR<f-)U@gKIpUH*rv>vhTT~Js+Uu;6jFDrrm?wVNGwRwG
zJEO?0o~P$6Tl?<b^3U~;;v3|}{%BV(t?>UgX~*S1q92)k<~?`Vvh|~JX1Um}t$WWb
z$(+9X@s3Hae%-sqskUcF_Vvui6aH*ca`UZQQDOe={@>>R3<>ue>qLIoew02sE5=Uo
z!k62nSH9G9-m+V%74I!Sx6tI`4P_O#XJMIpPR`_6`sa{m&HNerv;CX?asAl4`emH<
zNB=hdPMc)eb^XhtvjdMyXL06cmwnvwUFf7r;hx0gN_DsY3{l(~taG^j`Pb+C&D7fy
zUR$?m_mY1K^D4ei3Z1GH_>9Fy?SZ4#{-g7j&-zr9#~1Q(Q_Q_L``7+@`!{ChvphlH
zy!s$}@%jgk{Mn+|H~(P#aOrWt1nUL6Kk6+OU6Y=vTonDX>Fasrsna6*A5XA1vQw`=
zm~a1Jp`6u}TQBx$ZvL=D=Wx=Ge6OvWYvdmq$Ny)@^f-`i8L#uC^tkBH++~^5r+?EF
zo0@U_^duLB1m4>x&*v?8_oq0#z2T34d8yErY`JIWb>}sFJ@BXM*}mueQxX?nIJPZ2
z@I}ARkJjH2b(iOhE}8cJQTP#k;cV6G&pp4cekd}#s37;zEbaVtiVR<r_BcCk-`0Ix
z>gv%&w*~VH^BJby<5;M3jD1>?q=4l~?zw0DD$kp~x@CXJx_kE5{@`6nXH`76h7?Io
zFE6S}mo*OmC;fx}@Z?uky-#n=wBKU7*X<EgpZmLoX^jlW*scXmsC<3p+UF95`C3;V
zRZP3J+rD7`gNaQ4K7Z5su}n{8@?X7kiaR~;cy8aBc;cMD!sjpRSwE&+za`gib6rtw
zw)@}tdjd_bOgQ;mvGS|Nx2Y2v_r@G~8qZuHd0_pe{vRsO+idI~-oGjT$U5Vf*59e`
zPR%^65fZT`v`a+ynK8qUpatvv_zcgV-Ou-*AuYaVpYadbwLhc}*701`-{Wro=IFz>
z(*E1Jt|i)h|9&Y>a)D37(uMW<XZ|zHOZ``5&h_WL@e#Ms*`MS4+BdsxeVA5LTl(;=
zcfiN+H;NCMh1Xoll+QY>uW&FqUs2+l=*RN6Tjr^M^zXJ)etoNS^Qs@yj|xW~i|4Z0
zYo6LES;wK7azu{(oZ;*EEA5^3DgL+A-T$tv<NvWc?8BaIaWX#=KRk}yIWM|>OT*uF
z5^Iw`T{D}Qsv|PFHKy>&tRMA<=6`VC-*<m&+Vlr^^L)!)E}6W|_rFr=sB`SqyF{Dd
zBh%R;auW;p-g7$qeZR)JHz~}gr=(qZ7-c-&_2<d`pUl?kMG0;G6kq-`=AZAII-ZJC
z51Y=Hre`#kHL4t5DEqCs-*2a=-{%Kgw}=aSuFSqR$-`{X(Y*4_b9x#)4?MoLf1Q4J
z{Rbyq<A?T*dotI*winhd<#j(iPk84?*0p=L%}D6WTs!m1LG75>)vIy?%C+*Jzk5*p
zvHXwF`G1^0KZt)@_2c#<evX=i*<tf8-FMr+cXQjJ{EaJiG%gaHKFK0aK5NdOnOr}A
zc1nnT4}2_Tyj<(9`1BJ$L#JQqSu3`tPQv`)eSYt>4+jgYmG}5C*hR?n{b$f)k2~I9
z_4{zp5Bs$HTbCcQo)Xy+ezCjlKny42%ihB*W#7(=eocSl_}ik!?8naEZWZ1S%lmqk
z-TL+I9{1f%+Qwh?r509%<ZEx~>0v7Sb0GX{p#0(Z8_ti`ALAGKcg{}YM|}3;ABzus
z^Q`^5TDB$7Q~KtK{=9A99pCFQwR7$;pC)OvWWtf~&Y6Wly%Dzc56=g+aXOmbu9knk
z@OO2_HY@hGfsd`Ti(7pw4>g}ZrTg~AocU#I`n#SAANrLU+^|pR;)KS_#Zhces{TAy
zH+>oZA$W4y{jKhuad!heRlgpYl;b-iVdFAR1~z;3xclW>E5CP`=sF*hVq0;mvOll$
z;cn~gpE-Xn+}L$Wj9K!uu+oQ$W0jBgXFm8faVqE4eRKLhZu}(U%vtO->+Z=qsrj+>
z2X(%@ZoB*^e}%^R*?Kec=ACJJ<$t|^Y2UODE@$eD&sGW^`ng@t_&V3c$NOV=!n^7Z
znktCx=d+2l_$d{eWO&zsGvn+J#(jIwKisVQ{b==Lh3B~sk2}w|<dC)BwR~%x=^T@f
zrMLcVvv)hazgbxRaoS$F#{Uc)a@}@UwqJRd)?oNgP<PLI$^Q)dF4oVjnfg2V{NJe`
zw%PM;YM7AyZM&epgHU#K(<y%+b{_YKao2yxMxL&I$j^B9;P<t8Z_{`$vso(h_Iy3%
z;b*IT%szj$r^1K0-l`n|-@BPVes3xC-fr*PZvS3t&!l^|CV&3xaYkf{>WkXUhs!&D
zq#qVr^ZMEQj@HMjLJ|j$uQ;q);eL#_&i;po-rA&7KkHOCZ=W!geNEYQ4dd(5X^Hoj
zi{7c=51#k@&^(46+XDYh&CPogJx%cMEW5e?KCQHTdu`AD$8RS|&yCBj`MK?%+9g%h
z;`4Jww?x|QDfH*&zrW-^!}^M6v$J^rGepaYufC}^|HHQTf!o}t2^O2JELv6NF1KP+
z0$=l!W1PP}&ibkDl<Mn$UdKRX!n~h<AH1mkdeU<JmYRU?`X90*%#uvRow73x!WXzF
zHOS33=qdd9<@~WYuI)Sa>}s-{>FmG5U0NVz!Vc*&g`ameGb{}B7CykXKl#JA%#cZW
z$B%xLHP<TZviZ*t6#wOS!(E@gdUexx@+|w)^SkZ0xc6K>D9>$@-5d7t&$ij8rIok4
zzf?W4{7IJ$Pt$#4{vGQo)?bUi@%$gh)sOm*L;u(d*x7OZF?@Ks)8@w;rngttEh^rT
z7akL(DDkv$I{Uk0hxV`d&(L^(^Ynx7Z{9x?Hjn2=@zUs*QMD`1PZh9UQd9J4ck0s#
z^SpQJ_^Vv(U$a<k{mP52&717i?UVNZP|k1MC&H~S`zIq}kN+c!CU2RdbtShg1D=-%
zoG{kus`Az^oZ|5-{AT=zK>ubt@sIQ0*nebp*uG7_d`af=_$^#U@AYQbJeGS?u<7tK
zmjlIHJ0#XG*q?F#*7pbN-&}mK`O*EZUss|+H>c`82uRtrtM20M=w)$kUk}`3^Hkva
z=e<9-|A%(}(fhZG9zA~epW*P)*@yNC>{64|eK14!?W1YOe}$eB>Xz=wYto-AU*#SY
zw#VZ7T+iS0jW708O0775^*mGkLANco=?}zPN_CySMc)@Ro0*%tdJhN7v3ECFjAneF
zdi#0q{pV)l$xKUU^i;I%{_Xk4^+(TthMODqf0LW88TwmywLw|f1D(qs&i;G#)<5>p
z{yBe(kH(pPXxpsU`TXy!X!Q*Lo690YDsw^}UYMFV=kvY2n;)Kk>-*9DFt_O0&j;7s
z;+!hQ4eI*b;z)ifqIHMQT;Se=(seT)JoqPG+_g2bb}s+se~K|Rjvwy7`TQWhZNA{1
z%asdX*D0E%ZdBsdOzGLBb6`S!?ZyU+Q=*zXjoi=I=gg^JBkP{^-M)9e+#dChvk(50
z?RV<?cI~(K-aXmf)i-$ZCd9ZbNj#Ww-)O}N9uJ8V$9OAvgw`__EGe=3IweCRW8(R+
zHA~(rXIRagI$_Ek^K_Y#b5?y><#U_a9H+jYR~&NhlS-e);+P4=`~Oa|;`wK?x|q{%
z-=4o#{A<<bel;@p@K@Po#_(j4g}hfooHuvN4!MMImgZxHw@qbRzP(f3KIL)I6XDzP
zkI#mu1s&Wq`Q(3wuUE8c88`b?pHM6Pt@Sgr!Q<E+xgzWT3|3bzzMpjHtDdf2-RT16
zoT)L#URgesEePCrp^4+1^)=RYXCE$6&y!YlP@j05rSV@qSF&14qyd|8Q>~TMxqvs~
zJ1=>!y%!rVeJQ1KneU{tHf@<QQ*ZCs{CU6Z$@5=-b3gQ3ShynY?5aD)m9xH0UGO?*
z?u0upFW%bm>*qAziC5&;)`aV9T(oAprH@>wo9FlE{m<hQY7}>EvNCTiU8roi|Ke9(
zbBPzb_}1HG-g&H9)BdvSZ}$P6q{T<RDE+%M=|98C=)e3Y{uCUv`lH`jcFktf?<MPh
z#QaJUZjp{&u&$4z<ae*?^6dF~pEN~Xcq}FvA1uu~>VHqx@Y0Ue)&CjvTqid-@!Rs|
z*Jmt!a<)J;u+K;&p|<dK{EO-(Uo!qP*knEmo#VT@_SvnB2j||d{W&4~as91-Vq5+$
zG|lzoQ@)y8^4FDX-fA62ez~1JU;k#mIjffPnfbZpgX^d2x7DuMcF*X;ysdIieVq@V
z<h1RMICt{rqxfU{XaAdQAsVc`Ffw2A_J0PZ?*9x=0{`lMNjQFLUV6vE`Y!SR3<py7
z|5U44_;+<l@4pQVe2gd0FHa7=9=k_9W13(6ZCh=dW5?fpGW^f*YGG0@)0{HP@9Q6(
zxa9HgMsHX*@2c1hsS{70bGP~W_3J8ev8cG^856R?0%DF7c}!C&;J?uPbxFd}6M;J>
zU#S1OI!J}1OMK$%+kd{V722qkn{(Dz{Gr(F6&dFr<=P*d7=PoS&IFqeFSU!gPKzW(
z3b}WwaRiAAZAdbhZ-1Ai!!*7{tSWTN_gU@DL05GP)GABzRh87@6)JnKJq-AHf7j2B
zzb_2`eh8^MRew;qCNg*Ny&BJpU%Ov?xocRmn>Xo^XXmHMC#F?LJ}r%(xxZY+!{1(y
z&2ZN5!~eKk7af08e^dKdmCdZKt<NU@ox099!}++;?b}%sJ=7+6F&dgQ_PKxj`$oXG
z^8NJrp(|e<n;h6bxBpqxz38(_XB-n{wh5kSU6jEby_)gUG^g2)x9-R;Z{m2Rt#tdC
zopE!=9_O_O|1-pFt#vcJe95|%d1;k@kI(T3*PFI#dy4i=Tv@T)eS%PV<@L`uUJER{
zH^<#%Np*3YGG|Wy?A0=J>f5jFwULqXo#&>v<jUIOOK<D6YC^Uo>FmjTw8A@C(Z+R+
z#(`gP{D*eG75~=vcZtabw%H$rk9M&;>g`|cdwl!slCPhaK8ib?Y`SmOztGc1l@9$8
zm}E3zIZJWd!RMdW-|ZLtcUFGWvdtgOzg6$}@V#Y0`{8(jypqQ&m(IC$Bl~o2xXY{x
z?mH*DCC=XtjI=v%KgaKCDVK+F$2WtzUuK7_F2}vLw_meAXa8-XYj=(={}cAnb^95v
ziKQ}oZJ&1q6~B)z{C9W%cFr36qxS{8$^~jpl$6U<y}ul_Z|9GXzm@)-+rQau<A=P@
zN3C-2cW#+4{`yiycGT_Fu{UN$hwj`y+jDQ9ho|Azxs!LF<Vh5J{Oq%YDBFJ1{TZ_Q
zhvoV9>Hm0rxK8lW^9x)0d0$6Oo133pS@V6<qL-U(SK4RqzVZIs^p^ATGYVE49p5?C
zS)y0VR9q+gLFvh`zCE|+JG=fa`*+L8N@u=MzPiHm@3;Khp0Lk<bbs+Yd#N|k|F~Fx
zhv>xBK3lmUE02v~--m16DmnGHB6J?8e^A;t=Z7nJeZS>CwIAW$KWZ1&lw980-?3|t
zmU69j=$46MFBjiSY&zt6=0v+PU(NM{2jdvN<lkoh=5S$8=x_UbHSRxBANm>}zGwfV
z;F-SY%PP_36ZsbBY}7tkn9mbwl%_j<+H#&}`bKy6SMc4-aBG>b<F{4oV!v_vq4WP4
zSQ&o&Hd$R*zVMIL&VHHW#Sc!G1%LW380&n{)^6X;wX)vd-v5}NSj@G*sZQ+N_OODO
z=Kl;FbI(+K4xV5$H%X`Fz~jqZKb)dl%$jOeh8+xJ*K!YVly#J8(yABrc&*zyA%J(^
z>`dw86=^*u9Dn6A?MiNF*|PCqu+ger^Q$xGZ=c_hxK)4sAIlH6M|$icb#lLUGr#`y
zvue-$GuKl8GrZkcxaLj#568D}ZmYc8@X@_v%?+9V45fN1kM|j$_xkfIx>GSwT-Dw2
z@_L()5BE;XTzsSIk=P?VZ{PiEE1z!g4{_P7)xYwW=fnNC?T^e8zoN9`KSN8=e}?eQ
z`}@+oBWv>4NBy1qAme-P4v*!P&N_>=l{6$J&Kbv7{$c;|^<(>Ez3%dL748q`p1yJG
zltOjqKE-%fiRl@|GVz(0Qj9jO<~`o9Q|8?X`L1b&rte#o_q(Wh`zD`CvUV;{c_REK
zWvj&Z_18gbc*Kv!D#i2N|HFOdBkP~w^Q&II@nby_%=+6U`QNNVkL#?D-APYQymb1-
zsjxZj!N#jOKIgxxotnG8CaCMC-PH&Ef~&t2W<IvH%Srz|uWruFKiQAg-zt8T|8{o$
z`pjGMZ~iX$vD<6wMxp-<nRe^zAKrCM-;uk||K^!Qt|i`k?7r~Cwpp<4_uAvRx|iMm
zNJ{OpnvT8g<$tWJug|XtKFt4!`|M}tZxMZ|`9W10cFXrKcz$WGR;8Yl(euKcr)B<a
z-Rkk@`QO<#+P`D&{MhvVsQs3*&d1qj88%G1?tfA7!<z|r?|7ZNEPWzxox*<x*Z!v|
z0;eQSPwdwz{x!u;DZABWQ^r2?7Oe+seyPn@eB6_CJ^UDZPIA|qCm+pQxBO=ieEE-K
z*PbTc@PIbYoHhMIXL<Ks)OOkNbDHfbnf~27i+g&$l$966MY~s~J@Qy88Fo<epz=b7
zuM+FLcG_z0UYhT`$i_KRwL<^+pYtMnek@#ld(N7F8e5t7%oEr#UB1PtXXhX7nOF9i
z{n&M}{iaRms#|K7+5PRm-ZaQB(R=bw^vkR1ZYM2Fr>?HJ?D*l_;w3Mu-YuFIZuR!&
z#><Z<o|@e~wez{5`;G0>rT6itnl_)*v^|?R-|OEO{@HKpY%BggYF+lDHDOI?`QPOS
z;<UC&9#_}t-y*lerf=%y=(-DbM$HUAULWe;-H>OJTX*@(q#G0CK0dOScsY;v!{7T|
zd%{;Po4f4Bv9uk#c1&0j=*Gc1xAOqA&8&-;Y$B7_#@vs1Db;k>cj-CZ^~zmNXIYM!
zPH|WGCuX?If_>EnTaGnLCphoC^rJ0o*Yf3GpHv)?-xA-w@X&mT8k?EB{(Y<UyZ@iT
zEh@Zr`Jd8{CQEtdssBhfE1a)?L|5|p<+IzJe}z{kKhiMOe6O3c-00-;^WU;tpFf#?
z+S6=KkNm_dA19u(y855NX2)$M#q-}M`hOOk{P63g`1U_Si;ooE3iwn1K=jLhhQ41@
zXRyDm<KJQb<>e#qN_)9v`PM4C-jDB(Oy^m2@4WAn^?yEG&*^_UJ?i1Y?U!ZU=ceb}
z{Mu&x=i1iXFY9@}PWIWPz_&JE{IhmseNs`*yNu1Va%<$P|1-4NHD1_fU-9Y=+rQI0
z9O|F<Ezef?V`y4+Zt8E38fU|2+OfXj%Y|JYf0=Uqcwt5yS5fGeY9aT)ZxuiOFg#j2
zpZACE`9F<oetzlTf7<nYTDbVGKaqiFSMJ}?zm@;3@<$0xl~-O2&pCJh%v-bLKSNf&
z?8yp~*Vesm&mJ}^X{?>)ZtdnL;y$_Y<m06^x&IkB&NrmE&f?X&vbrSWbMx({wOz{#
zAM&$^1<fj2sNOWmYx(lc*KIas)=n#NH(h*<{f_T%-#@|W5wm#XpFLr}tY$y|UA9sF
zt>Q;9%TI^yy2tNX@(eP2`iOfz$B)#Cj<`dI|5e_Pb#uR*vsm<;|AV{sXVSJ_`FcC~
z?~BsCZpQDwr;9kNuKOppUnq5EqSf&a?k^PnE~(QvAiAtgNM?e~i6rNV=PgT*Z?rg{
zb$Z|5O{RCb>eVAB9TI!_S<PMUrK0@W8h-U=y{8QeKBo5sB+ILJn%c4F?=`LyjkQsK
zWOAVS_&qb9!v744znA}KxbQt~Yo(d?F5_vb&2N9mFSvGpyYBp{-?}@$oYyIw`_#?f
z|7Yg4neu-`<PUhNPc2-Pv2a&$naK0~Ve6Zs56f9hb)WuG`&gmq1NpZcX^$^|zji)i
z`+o+$eQI&XpXeWxmpat)oFSv=>wkuIx1zr+d|I)u(|)GDY~!oCd71OK$G4cuNNa9+
z-BA2**_-W-lTX~eP*lsBcf0QPKCYcf%JUBPFSrsg{|a;bgyRpkA93U9{@8ys#o(CA
zr9YZ_wx50}=3f_`U;W!I_9%1gtNViaPyIx;UT^=S^H`_AxK~Ba|6$OkJJDr@e>yAn
z@V)$3|D^7A=6{B*+gdADeQ*|O_}=%)?5|<0j{KH;-G&D?O)lSZar=+(2XEpx<;^TQ
z7V^<{>OtOVMitSAHwo4L*&XrmSJ<k$)53>8-Kv=E6Yo@`y==Y3vHG%$pWjFSXGpsq
z%X3eg<=4OT_qyBPN-nimI`!D@%<`X7H~nu3`_!;*+NpkH{g3Mptn1F+vvm!*v?qP(
z?G67FAD+1K__E=>rOB`CH=DoJxn{J!eV=B=w$GckPf7dm_TGUTKg%nnc9|JpS;xQB
z{ab0?vHGZkad+;|{3{gwr}h%}+i9mh8CXpc|C8<Wr}V>{`YP>({}~wM|Af{H?-$%>
z`|tLA#yZVc^O!$g@3`%9ZI3<cvemrTCfnY>nWr=DmB_S=OP`)SlUz9Oo@cYpgm=9Y
z8aG}rt!A0OJ^yWeKGWgc$ER0Dr0ac~##8b5Uv0bBU;f5F>c`WsERW_65`0pY6~6EK
zzRvmV$Nnj&&J>LZI_ebkJlxN0`=g70Cq)0r{E`1iR_pnpe|nAUOZK{{ZQH$VM{`Zl
zQH@(CUY|&CJSh6FUj9QI|Bd5^?{ADhCizGG!L+as$GhH64*zhaU+G<R{gzcR(NoSn
z%Dp)?wnJX~_$1HuyG{CkXr#aGOkBy9FR6Rz_|}=J8#X4mRsP<v-s1cEdH)$6?7J_p
zC-LL*hxP~8citC#-uCoMuit+LPtUb)uUSgTdi#qXQhwS$L-NgpZ!fQ}t&Z`2ke5CA
z;r=a!Ld`vKd)D5M)}0d`wrid{PsRBuX){_I4r?ygf974X{^Gtf|ME=kmYqMePuP2|
zu~+up<RCt!os#$3?V?uPS<}j|dtCjBVDz<H-@DhYUA%q!zIhst16DOXs9C_n_?_MH
zX!MW5Y}r!>lOI{?@rYM==;g|(PP((%z)`1&|7*(P=8fJAj`o@-zI8{R=XK1L5wKe#
zD5CXd!)2xiJUqPZ%$N3ypDDJgsJvBnedqVn2CZh7C;q?kH@*8{*geC`_77#Q)Tn)k
zxV84{7xOTwC%&9}cL~OHxOAQQv14-O??!QEty9l-@ryaH&6HEQvVO~d2L6h+wEa6b
zUwbz1&<{`UI}uTu(GibR5;l4z3)*CudHhVf75(hlx;OizPA`tD@Q?oCxn|jv>7GSl
z(F#eE9tnLsZc{m7!m0fhg_kST`FumKn#A9HfAH77wGU7JF<gD~cuMT7)UNVvNkIyi
zZW~+oJW5!yLS}J~jLerCckkXi+Up#@`(plWUk{tyykEV);yZ=zoRwixD>ZwQ@=&pq
zah^fl%h)v%ljH6`(C@S=KVtB!t#A7V)vZ?wJf?5^bX!na$@>#0!@UJ|cVADvBUyZK
zo&DiBwI6{GvMayrRSw=AyyBkyJH4LG7PBOj+(KAV1y;nQbDiJK-ozgN@O@_-<Mln^
zsSj`GrmF6rmllzG$78+vq++!LuZ#qk=g3{vjVbiIHNXF#^_BHs3e}bhaoY6iWhSd`
zFqS>~xJquu<Lg(#KVJVG_ap4=AMYhEI~6<c=ATwJVlVG-mEiJM`QR`4XZ5e&e;4}p
z&HwN^eoxZ96f4%x3I`7++uqV(mpB)FCH%<!jphgT^VeP2FSO63M&io#H!mN(Z~Of6
zqR-Czyq8|Fd3!EWFgvL<&o$w<2fOqxp2B3q)7-!R-Cx&kW~6o2_|tONAI=}O9v_}w
zFSw>ex?_)C-op*^L%5}GA73dQXg}eYr;zX2ye8j6#&RMn3w}iXc0VZp!7sndeE*jJ
z42Rb@%ooYm{o=W&a_P<2nkK1t*Xrsk%?eQWoOaXZN9*oR<w&njyHj!=)NRe!zd7dD
z{y)NxAKpJ)8+Ie|)vxdUCAHCkeL)*%=<4UIZBF<k>9j!X!U>~?j>k_$Jlf0st>dFy
zW95Ga*6_b`Y-%5xc9!gQx>X$^rL@SHwfE}N2CWN!c6&^3<Lr@hWD)#O{HSVc?JMi-
z{|wCUtP)v8u57>lA$m@Kv;Bif@f*Vr`9^&|c3;XSwe(Rwliw_-%<^fMrHf79{=Kqo
zO~2aw{Hk8=6P+?{mIs4(oH$TqC-rx4eNun({f)o=*fl>CoA`85=B&4C|6cjzUv%Ak
zT2$kwWkuJ878&+#o6xn&-SNQs_5UPZ@0VI{pFY1ko@bwW=Jjo1aXeSPMAq1gzMGeG
z^76xvGKbG}If@v?xOlaB&OXC3cg5)*x$FP9^HW9NA6n1<N>^d#JJYkteuX<DrtT7m
z(XfcPGrwGxlX-2$kC<C~J_ZJ_tp4)(^>-<+>3g=k|Ead${=o0_e;nTvmplGe@->l)
ziu}9#Xn&zZh{x$uy5Z7g63f!um{o*(iu<O%|0Vy{`{DkMe<u0uv!34Vs&U%7aaZTs
zK>3=owj(izey<lwN&S4K?#;Qn9HEA<AO17koPYF|`kT$a`F|wUcPrJJiGH-$)8*Fs
zq%AvoX78d??Ku-47fMf^>9ry~m1Fnng&)-4%>B@PsD5is{g&&8)=SnO@~$jgZ8vev
zL6#3EMK`|^b6p(!O)W`2Y2i)n)=xJj)EL$ao38(N;mQ0zw&zY6_9W`nPn`Hc`rE7x
ze;2;rdcJkm#9g~T<~2Uljd?Yl>5_G|zkYC&S)0VZ)9QMSY#+as`UrmBcyj&ue$gMt
z1GfF0YM(AIocU?S(f%Xq8)mw!*uBWe{?vmtc_+LI);#qyGAIatasQ@boxsh1_vJ;_
z*74jqx#Goi|J=oH-?e^vF1)nV_`tG9*6FILJ#$)*No#q${OGV_=Z^mjP1zOFVRM(b
zf4G0tGxmvE?h0q0=xm0M^E_ErusnY^=d*-X-0z=t9$$YZ*Tqh*pEdF8zR3^wZ?3y-
zzx960gYBX9f<HpnS%mi(igB#ovtquDp=41lqfGb{_CEst!IA$NvU8=Fn6|BcczU7I
z$)_{ReR=YXS{GaIbMm{Ul0N6z{sNQL(vqO_dxcC~49?iNe)!MumVsaQbl&z(KAY_g
z4{{i{{rY5U&ussoYkKCx{|vX+AJ`_er}3Vo&dn4ZHnCFyZf2)us1{G+IA2#B@9Y>g
z=fU*(kL!;;pZ2iAT<`RM2G9Qt4F&ZZ_ui_||MvT$&V!r$H}}M=HlzyW@v<#dvA;Vp
zd|}{08Nnu_>|fJ<r2jUk@%S+RkBIm2`Yp1*BKmoL^!u2JEll5DJyCh-KL49n7nVpr
zDyS;6_RoK+cggs}^M72*t9^D0zlj&fj}aAY65YCevI2Ym3fqd~$!F_>H`FBln40^a
zfpv2GgL$hT@%q*n7C(HkKJn7id4(yHPO|h|;+WyJyW7PtLU6|%(SO=Ue_vj%nQ_bQ
zT&~re-P!vm+n?wD$K{_{EB`k1k@wEPqkFDT@8%Zpn%4I!r9k3|(2f9ymlF@1O{`FQ
z_1)vcyq&q#+>=-Q@OpL7h%YMh?845<S4WN?zqD`Ze}<-6nHMYSAFtc+$(dz-(nq~z
zDUqQm9gl;jJaRCbw0tq!v2f*{S)b}V<0P)`F<hK+ZP(l8my@^L3ca}9K!SauVqa*+
zg)cqF4lEDcEHiKGU*!W=LVZ@Png2<CUZI}q<ztt+{-ytvPpdy@UBmu3|3_$?GPB2w
z$?LsNH|$-rD0cB2A>$kK+V&bhRBx_{+b@!*(sw95=L}a*YUhmS`;3p9{$l>k@bX)j
zJlBy|^J2>XDPECQt^2gLtFOq4=Rd>O*9(70Km0!Vk?xhZO&dD5&oe64X^@+@Xg|;K
z$LpiE{^`G1U|L_y{Hgofv=8Pz3YTkSxicrVM2a*NREG3cJpXvy^hx~o`-kJDd_UA3
z51sBm(QW>kW2$+4VGm`67ykR)^>@zSRev;#i<ec{JrodiYjQF?tr;P@v3X9PzmHs{
zX!GyjAAYBg*l&Kfv#^Nq)7#wq#f+gFbT_;!s5pP(=J}<?Pb;2FUHKjJ^7#2#Q}^_r
zy5Ihf|6@%(Z=G~@*sYRdtlKVMIl*x3=EALR>horvJij-&ruc(+Po8c~eEzZ<K6&Ed
z7iTC+JdHb{E%WWk=lFH=L_e5r>;AC%;rq69hc^>%x;HFHS+Qlp(~5r|B-T%`&+PAu
z=gs}kkf9s>KqheZ4pZrl$sv2T&N%YHq|kMCcBWFoX#)-OZ3Q!L?YArYs}?IYqsOaP
zw0!;D;-f3Ox>}c1e1Eh4w_uI;kBtu>W`1N<`>=1m>E}DHGp_%3s<>sTG;v{Pw~oe}
zkTsWAp5wbQLp1B(n*R(B=E;BXm2atIx+s0<pZJHVQ`=_N=j(2c^%t1-FmI_t?t8n7
z8b&4`&vdq*zoWB&)ndKee}<;&Ka!WW-se61cy8J4H?wqiX&)6fwpp{fLFB}p&B>B!
z>i2f#-&X#|9sZ&FTX^I?`HD2NtEJICPS>gmxMg<>w?sbwx#7)ihhFB>(|+&He)nu~
zTXT<{TES7T&HJ6VUD-P0k2cTiDzU3;o4Xs88I(0VCK%c>ZBUr}GQK5#+x|ad?T6>{
zm#q9Ee{<F?dy%+FNx4-XcfWK<%XG*V=slHxv+0QSPKB<Y`ycDS4PRS#&CY1&p1-SV
zT=O6D^PW}M?a!Y1=}t%LXGZI-+DCikUKood3UEq1Fi0|v=l^#@s{CNSXy)V4AKvSu
z@7%oca&@ZQ>}6BEGv?V_yw5J<3Tf5Y+3Uu~osz(BRq^flNz;Xs*Zb*RNPm9(2!Gdn
z!TlNX9hr~%yJp=zwtnTSprbt3r~61AvR=Wp&}ord%hP1n5ZSUOPrKAdx~5-j<378T
z-^o><#`9RZC&(yW?ssu$$?9dz0c~&Fe{I@Sv$xJkUis6y)sH4^sk6IQ$*Qt{S3&K(
zpvPYl<K0CwKD)aVc`csu=DP*UJXhX^9X4NN`zjvyf6{(k-&QtHV_vNJ(Kr=fyX<Vv
zx~ut1V{aV!R=j_jV9L&I@p_hwK@9BA64({OXZ|tzkzc*iH~-PxAe~za`GpM5&pK71
zlJIAz43k|>Rq3zk0hh#otN$+4bKEKJ%X&u0iphCJ$vl-%>BZ+>Jh7?F5n$E2-9GPY
z&9YLh*Qa{s*0LU3ZTqFHY#Q5xpS`(>3|qH4Rl9Pe3ob9%-CyK+wpi)cOQYFS+}Pe(
z{R+Dos<_xmnw=};`K)KNBxd$2vpoM(FZHg)O0KrjdbUBFUrNf3z==J{J@Oy^ZCx}y
zWf{Y*yZ(tUkJYa&?i2`M5-74z_)z<wfopGOuIjN^wue3Q{*<4W_;q<oPWs!_JNKfm
zh2G(mJaOpXR^!;)jVD#if4+=(wMl!%<%TN8zt+LCS<mFTv&;7{74%-YW!biL=k%H+
zAtQnChT@*jFYM>~<qMTOF7uD6s&6g+eI{Xb^6kEgwNo1uZXKQYL88F@RBipjr5dHO
zX1feicBC+J&$}Uc{&Lr^+YhEKX1#t`)+)P|E!X;JRo`4j=4TOGdF5^gB>2aeOv|fg
za(I>fWM)pjvRsMRJFDIW+t`Z_oH%CrZT;f^4C&oZ<{zA=?Y;an+w9d9!GR5>x4v&T
z-{o@t$MJ%$%9mf)Z~pLE@@vg|&Zz$kdD`#G{`${+T(kLgq?umR)l+lUzE00S@|(*n
zcd@M2lcF6t>vMW8KiqPgOa47i|3aDImT31ghG*-SU0HUg)c$nWmPuL1j?FB)-BG;d
z+j`}{TU41Jnm5=4>QtYRI=6huiTYie9rUhWSNU0MCH3V+^1;_J%inskM6G|*zS85>
zTD9&+bLBo3H#yx~9I^3y&O6f|-}`RXZ-01d{m+>Ae?HS+)m{Hmd%T)Ybt&7IIjQo0
zrtUwh{P~#WwTPCEqUAfDO$tv9?pwCwui48tMgih}k1fvc|M@yLC;5Df;d2Yy>>o^l
z8UGm^kKUht&v4qC%GDQq<ORRVxBq8|TJ<yMZ2y0T@THbl4n2zbV)MKFKZETmhri1I
z8JcqM`>v?FAbyW0dZn&=myPlxUNL*kuFWwgMa;#Hdi-o&9c>u9r}>1^{_wB5`j7RG
z|7W<#X5HU&eR{x;{^%cx>t9s;U3$q?q<fXo@j}tl&O&dTm2aI;QDEG&>;mKSpF2M2
z_t<!U_|I@us=RNHWVPDt)tTj-<*DVIOc82M1+O9m59loQ&^mFZhifDIdwa?M3<rJf
ztbc4iuxokqTa$XOAN9c>S+`89TDN=g%iP=*vCc*!Qv-gU*|7Qf^fN6yZ@D~DKWkl_
zZ+pqM#!m0b&)EIzUw?2v_9$C7{ej=Q7lnVPKUymuH^sp6=9<jwvz%6aJeJZV^ZWCK
zu3zsT*1z$5_@ANcK1Ydu=RT>O(;Vv`tSx=d>^o7s>&x%y+c#-hDqVYWTqC=nK#DEk
zz{c}OcGYeDR?n6FPkPgK|IHO`x<-}}lca=~#;twBW>eVvaIwP2jpsNLjJH2H-)}Fo
zPa<<-Mfw3djs2H$a-LN#+}3_VqhIyN^xQ@j|J{F;!l$t5FdH&IvCiH%Rnyvy=kx2N
zl`G>szG>&*Ja_+}NdKY!z6)wgzv+v-4imfeXOX1Xt?NG5zP4|<oR_;!&QN@o?t-a#
zN@sc|dooWA$+6%0(vENENArG@`HVm0kN&gE=lW3{_mRK7<UVhG&cdCSYkVKPF5iFo
z;boP1ip$+)uW)RNK69<(+Bqp>Wv13T(e6jzkD7frRbiA{_2b3Ij0r!=wDryZ%GsJ-
zy%t?DNr6da!ilbrcN)JfIBZuax!&QU_*?If-ADf!U)oduh&Sx^+h4p#-`-tQwoPo>
zv_<a&J0I-ZJ?$Pxa^Ius6?4{HIwQ0F!`tU(AHM$j&oKX)$i^>=>(dv0mD~Jb^$|Jk
z9}9Co%s*ByXyaeM<i&pm!7ugvZ+1?)Rk<cQ;KI{+x84^D9h6&|TeN<e^|IV%Hg1U|
zhDU!)KT3Q2@c-@hL-^Z@t9;8J?-h>Sd$qLl?baP{u1C##b>{riSJS4qa%`ORh<oOu
zNt(xQJavm%v`IXFo=%;`k6*W5epS8Va@}00qUurhOoiTe>N`Gc&b#zZZOWfZ{&GyG
zwNsym1}a*d_5CRP=zfo#_A4=|^<BxA-qvqkw4?3PdAAL|X2<xqp37S|PrD?OW74A>
zPwPE>=N`y0FoYOv4tkpH|N4a1GXwiY^_+EAZ~6EAF<kcJ_2K$W_q(_9Y6te}>#Se9
z#>U>JSnbV{jaGM=+`_foIF$RcgTLi}yneL5M}GVC?tiMU<0P)yFfO|J!`koidy}<g
zD&pY`cm2Kzp9|Py8I<oKxSO@R$umj(!|ez1Z_obr{&!YN=AOil$Td;2a+N*zZ{9jP
z|Mpvja+TAno7P<L=04$(&J--Duzi~B%-JvJvj5`>Uw@<S{63oxW^0$dwrW3ezC$=}
z@9{31-=-V3_LYild(FF}-b#N{WbZ_m2|v?<Vzx!z+o{?%xw_`OQ(vO@B+tC7`{j51
z`TOJGiVEfUAMKB7y&uNz*z)1&xz#JYmpZJG3_JU*I4@aYf>O!hBaDZRo!TK?7!%$-
z^Zt=ypZ!H1YiHWuHT(GZk5={6E@?OKiX+)V4@F8C-9+6J7#R2+gDTERJpSl<c8-0~
zS%qyebLQW5>N@hD;lSp&yV4~#GCo&kXFQ%`Iay+Dua-#l*M~*>?d@*9y|<u?!S7LF
z^e@w8c`bK%ciQ}7{8zDdNncc{-0`&)Nt*sGHoh`hu?H^YP2oFq??1z-sqMBd<thIe
z=3LKTRxz!<{iFNi8Ts@5W_u)-%id8Ja`-5-TAfAwJfnx=<}FQ2nvea^io99lo|qGI
zy7=MR*rc%MB^QoOFYI5Jd$uS}=fjnKc9#<_-~0GB=bEGSDxNK^b?;RY66CBtpU*lp
zC-l16@#K}M#oz9KbNsv3<o<2H%q^!+EWTtDoz``|EdJBMx5t?tUHH!+lsr?B<)rW=
zzJSHsU%Aa+6!}uD@Z~n{jz_Y;Hrht^uY4VU%D#2Ynm?kvvnpI{n<F-z=Gk!Kq>&Gs
z%|opTk9__!NLW6X)&6SzVErGF;$u;!bFA!->DvDjiU@xCyL4sW{Q#~V3@3WG-7CJX
zJ0s$kaIC(xTwZiWamb-!?Sp^%_tk0K^j=<*_9OIB0@v}sD_3M1ZFsru*U`I-zfN*6
zR9%<-`1zQf^#`||tJk-GwceeP@F8#Ux~Ri~@j9_DcD3&Io_pfR&uyP2?sDD=NnyBi
zz4+n%Th-sfeym^SzU+SXwSdY=ZvPpQuPbMp3mrMQIQ4Ub(~Ad2RvsP}3fC`es?dIT
zzwfd4&NW}&=JKxj=Jnus5%1P(Hb2U>&5~y`p9w1XA-%aVII4SA&6-^j^V1$ZmtHdK
zPqh2_`7&SiWp8B93i`nxHs7y3?4s#Mk%A?D%l>hz?A<u!=fs^qS&H;7IPJ)vA;V;u
zu}}TSPUlyj?sw1Df1A%9fB2arqvrC8CX=Q|s&)|yI!|xP)V$z~JzBATv!0#oi}1((
z(Qj2%rNZ8CWOMt^;C@%IanBx^bxFx`^*cOXWOLMr{K%H=|K?IBx2^9^^v#<cQ)5G-
zU!F_Z+`(}8$@Zcs#XsyzMGZbp-g~;wZtj#++5PALY_W^Z7yIM2v-&(wY^-C&cYz;=
z4yT@7qA#)g;xkX3ZnX<*q;7Uhl~(+rpt&ll{79|y;eYD;KbFl2T=VtxeYW^}Zpv;#
zhu0t3m274ByG=7tCb^025{I&U!u&QnF01L^PG@%M{kvLR{j7b8`7M2=PkO4qf85oH
zS1wcDnsVz8&yUd5{Oru^#m8mB3No*4RH!uTFzKB2=#Ub(?CD%%@gBMMb?%~bUYt7_
zzr$J5?brJFeQ$owcKEUXqj})vxXWIfw(h^W<l@)YE8afZF1Y1ZU;FC6Z4Wf=H>Gs6
zx!A_bOel<7z4A}g#vMOQ*^lY7c=9by*17g%%d3l1o1%|wpJBD~lz*N~d+@QZmIrLA
zT-y)+XJE{<Q;ZjSSvKkR-Q&7{F3xzD8tQiCsposM1-T1+O|lgw9v)PdG*y|;S;KGN
zxK+MgH&^Lp)Ryh$;u({TJXN+&p51x-OpK_$;`x)kix~@8{Wq*wpB8*HaB|%H_`|FI
ztSOvO<FYHZ^wFMeE*tzsVk&Z*o}cYG&i5lt-NG)X%h88Nd!bD8w2J6sy&vUHAD*^-
z!qJ=>=OxSbXR$q6d}3-?b!6i?2hV_ZnRj=mJ_uj&pWzVe!?tVo+h>V=p7l>Q@YsKb
zN#3_BeD{>|?Re%W$M`~G)kc;TCYkp9Hl~a394=kz^6~Gad#|otEPtxIXz$dtxk(c2
zJg>}}{EkY8Gi_Yyw0PPtvDcTj@7nsGq2WJ6;I^o(^BNyUuRMC-N}frz+Oz_`>l1Ff
zgwJ_C%`jnJ!A<swak;B1Zaq63amh~cm6@ubNpHyd=~KlurcL|RlBRp-TgmB?RF#74
z>u>+)F1`6G+-j1t{8p8Xdvc29Zr-t3z?1$waq{G2eulFieYxMVi*N4oOevG?*RM~T
zrE+QSns6g`g$UK{)xlXF4n9hn5<GK%9@Hsd)tXURJO6cXmgvi4f9_xF|GJTNe&2lO
z9hYiUm%cFae0Egj#DvYP*%42-`kM)y-g!)K`$mfc?yo%7)qDR~`pA9zg%az%hFf!;
zgLhrYz2~7KFd;{O+NJo(d3F&?K3CY6@>kvSZ_{S&>*k%ef0b+H0*}|3)xX<kM0u?0
zPdm6+>!OiT?-NOLhTEH1Eov+_T;94nUhsC@nP$JM`dcFuK0VgrTeKj?DgM2P?o5#n
z2RF`XY?eE=XmkFr%l|lojs*A3zaIaCO}=HH%FDu=8T%wJz0qG+)XUOx`rFKf9$VQi
zckj;S)d&yzWG=0ItSIY#>p$&`e>#`fnQ}*4PpQ~aU0Y_sCi`s5PT?HR9)1%Wo}Rfg
z)~iUx+CQxS#<n~45ifJ}&MiB(?7os(q}VwvJJ#z-?AfeSHyJqHk|)%>;(X<ob-vk7
z>SY|~m3jXeJon6;s>3%st7k!_*!`?|Z^ae<JX4#UB*UZB^JG%i%Al2E>o-nQTdOv^
z??1x_pY=RH{xckwGyNFf@_x&TwCVqZe1(2}_S@N&GU>u$>034@4tnTn8Yu*Ce{xg7
z+Vh#{kM|EmdsXK6@)&1jE_JtAX7Rw-v$8m0>60Wen>*1aiP6v0Ja+v2k=|;@@iI>E
zW9jxT6I;gxeYeA}l!k8ZV~q$bwf0#1tVu!od&Z@s-zHx-+W0_UwA7C4=G}_)qxF2H
z(J%7<Xg-SW-o0bX?(V>Uy}G|`u1C&Hx%2v4+vmhXt6gsXoUNR9sWoJa%c-T@w|><h
ztna($cD-+(ens%Zy7i*%-8%2fc+Gs%GLt;c6x@uCxqUm<X7-Y>Gi=YyO9TAQ9xVzN
zeO|}%W4CyljWt{UN4M(VdmaCHugSQd^V`}}N+s&k%V~8rD;A2|XKxK<e`fg1e`er~
z&>x3C7)O45-d<z+;lrIf_m;kI+q$3a)vnV=_deQw<;#yG^GT~Fem1%G!l}9UjgeDR
z_Og%b-@JSzFKV|_Y~rIOo3>otYQ5LbI#O3IB5_(p4vW!LVZEPk-|5s`ncg5)8KC#Z
zR`a*ZtuCo=g3G1%#{Fkd-uk2VWAvf<f?qke>}8Wak=B~er?)8L@LcPF+1|TD4{tnU
z9$+-5K{8U-Gwf{D&W)an4bMwVbiBLe*Lr2S7P+=P{Ri(e=hw)7w6rNrUUfjnWuE%P
zH_DBd%m1j%>fN^d--ex%+vjN(l>K>>{N3x%z28p-EM7NXUjH!E_td?A&s8IXi?`bL
zNgtk7c`<4K#x2{tXRpp~3HxO3rqbpkQlOG<uW{<JWm*s$=h3n<b8+*a=+!T$Pgr|k
zdhv<Qj-GS|&o&GFtA+Dx!g8N=nx4IU$31zMb$8^Y44Y@tGknq-DtnH!>722!@VmjZ
zTD?{O%iq#`os#bIK88b<y?;(UDH4(B(ERTCWK!|1%`HnFOL}Hq+P_lB(<{*LrFp(z
zdo|m<hyPwazP8nM_WHo)_i<If^j7C)^R*{0J7_w0&;H%%`=*(N#2)2*dh@(Zllu$S
z@~G6a+ZrF9p6h;OpWEc+FDLG~<X>1KC9(E`cxCF;^CwoHD>ppw{?@u*GtXJc_ul^y
zcAoEcww&GvzR9UuO?}f3&(pZ<&BOjFGBIP{?lgP-ou(h`de^CUm`LjjL<>HBW%e;v
zLzZDC^Tc1*uD|vF9eShgg8kOg`A2$rZ`$ZDIG?`k#cP9G=Tk*bZ9RH2$Xq$r*!r!_
z&ulS=gi|)#5174O^m0;#?&r;pd-q<N@a6B_-ZRrae*E`H^H26K{ugg&tY4c{@K>t)
z_qzQdb@E?2PTSuo*!t`EO#8XBey=GHu#9dH|FPp}wf!HF%l`SI{}~RNZ#ge=`%T|t
zuPb|OjeI_G_Bg%rG}##`y1(Oi$?1u0k`J1jY^;)M4um{tj*qS>+0uPH{)2bCoO{K*
zl3n5L@83@-;5xbJtmvN{P8K$QZLNX=*LuevtDC;<vFzCHvHiQ+e+K8D*AJ~Z82CuW
z_CLcc@QB8<d8Z$~(SIDBy}!Nil~mtk-AjkF%~t8Y%~Ka#WvqMdxL8MO!a=qVrzK<m
zGuVBMOI}x#^JD$e?C@DJzd|n9Zu#VLan;?aPCX$jGzEj$47fhNJX%{U{^stZ$aP!y
zsvr5KvTMo&lOpeBS>`LVRooukvR<M3+sa$&l+?Y5yG9Z@lb02-Pd&ci&ONv76S+IX
z0%WYb8Y9dV8ax!_7RY7)*?4BIrQg>_OJCJjC20mvxxMlK)xSDY_7k%jvi_O$E}rf)
zy>@+j{`dML+l<;|Ztgv#W87rkD!uu0%Er6#VV)mPA830Lxh76wo6%J6{fBowQn+U%
zUVo#E$+&rvLDlth%OBRix%f@{#@4s`2lQ8G+_Knvg=e4K7EeXrFn258D<3<AJRaW`
z>3X?^z4V_<@zTXLf*<Z4Tddx`#aI8JZ>8v#@HA`b$hAv9rO$HCS9WIEDAE_fQ=!n~
zAuql8)7PMKE49gXjeCAP{V+vy-sd9*w^|%x?mCv{gz&%Te0!OB<9X5JS@v6wzqz{f
zq}<9C6`v2Ue!5}8s(TLC`P>);k1RQ>()&G7FmlF(Rh$apN9wo4zjglL{>^jV{e$vi
z2d<c|eOX%ka6fxRbC}d7w`-R;o+OlNxUTWn>bP?51?NeQvb^;t@ACiSQvB^!<MMau
z7hm>=-xjZ`vAM8yc5S-%rmg?(?Yq9D>07MPr{{iG)aQqOp1QQ_**%d6A=T|?*7T^c
z`j%cg=ok3Rqw{J{x!v@?o8<#PEI+)n<h-DA=Jj9O<}MT2uv1(1TK-pln`0N#3nyu$
zGPz1}74duhdH#3aK7)$M56k=isZ|_4>>>4^;qZS3&Oh#tJh)e;M)!&bUV694(yjNn
z;-=8+{RjF_zrWf1c>PiTTgKnkHy@ubS~~kbgGl!DOxCO4mag)-ZY~|O_Cl}Zjy{!%
z4iQNakNi5i;}_g#NN7Jge@l5^4b#LeYuDEBe%#{xy}G5hV58?2p4BOpHIG$z3cEi1
zSj@`t@TuhPwf1L@UJshI^H=Ndkbf8BIR9?=C;X@UdJVt$tv|+#Z~fqL<@vVhSmWgI
z9pXz4+JwDfpR2v@S?4r|MXnRCPU)ZePy5Hb-w*E}h`$;ANWbyvZ{6>0CHDnxM|ewV
zc+B>`rhBF^&q3BfUaNmfi|*DPEJg8~)@;n)zq$Ucb~01tZyUv>ubxiz*6OzPKco9;
zLVdSo%<~;j(l404m#nBhyno~MH*X);CVgYJZ?nl=e^SNq;pZR;Q;Yn^`D$ss#~$(t
z&fJ!F>>5K#UCM`f=ll$MuipLl`u6+VC%!6+E{e53b^P_x?QfYM&%ZVMALsqY{(bgh
zY%}I5ZoT-&o%hHzv41`RhnL>Fb)HLf$E@lGLCXnS&MiHdqkcEe{2$lLT)Vv=<PSu(
z=p2dpaqnP?C(qg$@3vH^vVY&RF4En)>+8#FyUt7fXE^Av|G^A9p%4G|rra~Jv;Gi%
z#PaJ~_oM8-*=xPuJPzs-oyIZg()HriTdMsh7sVOxJkyeJeOATfe_Vfm^WS@Ui*4qA
z2CmD&ACI-KdM)OBctUJsq`T~_=vxPKWv&ZmO*h`;wd#hhjFE>xgG18kxHNIr-rll@
zzFY1;t^V?FjYg5S>fL|dpRRoGzjgUg@Q>r)tbT-l=zH~2hre@C(so8EkB5D~gZwrB
zIe806r>qj;5pFx?`7Qot_<?&WKf)j7cg693lqs?avlrT;wt07TS)X*rzO%Wx`|en~
z`6O=Q=)A*xtf(-4uKo7sZ#f^!hCg`U_)qmmu<O55%^sIsk4~N2@}D82!uQ@{k!dSV
zZQHP<Nb}f%*;l5XddtB4dHRw4KeXQe5z&6ke{AE2c8AMbw5|F1E86a#sJ4#oRNuLy
zL!-?yW!Dw8u7JxM-Q649V%TpjWVE_|a@C{U)J4}nT)AfSy)tI%p1=MV*SFYn<k=_9
z<v%XJmH#-ea>!*>d(r2+TJuyG^-OAA<4)#@skXgx5B+>|l9~1FjDS7Oan>J~KbY72
zke};^_CL;(AL@@>lT*L;Py5HJ*GCJo#JwgQUVh76Wb%>K-^6!S+8lG}lwM`Mu)P0i
z=hb>i`%M1Z-T%1cKmKQUsIpJw$J9qZuDkBscO`M&asRCwnohlX?6>Dr(@e#Uec@u0
z6}Ucb5<2}^%#!=(=0~={-=^=}b9vpmn&_3c@4TEAka;cm_C0@|Ytzh*{^^cT>%0_^
z;QM})#Z5tGqZN!DcGs9&wXCX6o&8$<PbxR@k+DVain;D}yK<lIPcQ!c_@n*--t<H9
z+s)hlGi1pNWNma$Uy~vKq4RXIQH<Ngle|lh9DC*Y?(!+a%?hqPD=Zb>pA-3)@I(5W
z_TNtXg!-<3l0W{g{!@5qcG$(z8)|0Xr|+_zx+m=O=A$+}O8YY>Cboqo9q7@T(~}bZ
zDRNDX=#TzK@tflRI9*+OrElRg5vw_8E3MsT%ii2~;nJz(yH7twJpESAEWNA#&F}Km
zWyf<9>%YaWIevP3&my_v13`<|+pn!MsYnX+`)c~v?(?k3dve!m*Z!P;CHyVpe+E9+
z`Qab)kL}Ly4wJgxyLDxLskd?Rnmch(>z1p(56&qo3tGJB?3SsM!leCTJI<z8<bS*K
zceb4l=%~p*j31{zl>K^d^U~OgG-=MjlAUXwXFl4pr;J<nQlt#)EW`azW1f05ajbvl
zcl&|p-qX{r=C51QuihYTd0y7>;P?0O3;#20oPTh)KHt9!b)p~VcAYMmCMR*dWy6-9
zOC4`>9y=UlyBfs(go$&4P)P3#>+pxa4F5h^TDJeeWOwtHzc=da_4Sn>*#FSF`)_&S
z$HlQ%=lkxs`1b4FwC_<{x9^@LY`AUOm(!h#n_fLXHOXuWo2P;2osbPI*ZV5wd++{e
zyKeg8`{#A;c^&G0?r}+^OJkE@x!A4l`BU8(-muncmj1T-V{+w)dH3?D``q2!Wtl1I
zv(Np#_3-A+ePznb#i=_aO}~Y0{cT&p?7C_D&PyiM(bdaJd%Q&)QzS!K(k*{|zP3N@
z;hj<&waB=xs1-}<YUiGQE%D1JR@!dE-xeF=+{HC4mvVEG1pclLy!K2&rQx)UV1eiP
z?Y6bM!WaEJn=jvCD*awKx*>7@<;A=GjJKTlWGQz;vHf9m{Ko5T>vQWkGkT|%w#5r>
z7Pw(yesR&f!Z|t5|7f@UXJ{&o*|ze-@*wjEv-iqH<~(O#5vj6chvQdH4f(+M^FMa&
zxxC)q{_6Z?iSu<7_Uw0F_jjR5bZpxD15&P!-t~ocO2`?`T)W}s>tmksUeD_@^qF7%
z5}R&1Blnv4#5>VmKNw_=y<+~xZd6bu6Ta<F`K3EGP9N%KYdt<WN#*vJdHgS|!mhvN
zf5a`Tb?&xXhxYl^F*Di<4!TU+<l$}`@mAW+s9x*y3(vb%^ZJw@x<AQ(%lq3U{zvq;
zx*xgge$<6udS99y5Ery2eakfM?4VanY(EbxvOH+)+pGPt{b=KokEzQ$_Sor3M4yl^
zY`wDCI6v)7qhor~(V6|0I{v}&3*@(6@A+f@C|)k|hp>CPS)K6oz%Jhz5&JGys`!0e
z-M{x~Wt#aL`J(>}oa<XnZ)a~Q%e6C|;5l*fi8$-;>u*_DR%@(`I(z5mnUc_1+uFYc
z{#O5Y=Rd>d^xpa;<`4D{+q+BdDnGK>pf+17?v+&vC;yDXLYrLO4@O=a|1+!(*m<Y;
zLfU?*{|uS(H-aBcKa?+Z<B!|NWvz0H7u<=RVRHM1zV23)o>eAi3kzlUOxn8JhcVD(
zzou$3pGuAWiTfY?@^1wnzQ1|>k=wCquMc00bgk<9)wiBU>Df1zM(@e{9CwDua9lDH
zNtb*dzu7GQL*)K;Df7-Jm-Fnz+}BkU2laXTI>n3JpPs3^R4%6RZO-CJMy=d6YYUIF
zZ<o7g%ys3?`{MI+Jx)zmvS+rlcoFt}pU$<dvv0~u9rn1a+M_3ux_pxQXEuJuP>*BQ
z-&W1?KM-+j`ig^(EuKyD?yk4GWN&b6kx=2znN}w!H?_B(I9Gf;|KqiD*L=&56+|eC
z)!!)WU`%>)`*_78!@VbUJG%ZHnN+DhZ;ReP>x#O!>ve0KKHZMb4Eq?ZyLH!laVL)j
zGnW{N-sX_e@bhPx<j7DNajR%b$fAC(-bZh?*$ZDhK550Cni=*T2iLp)yKt%0Q*HL~
z#7XZe!}7PbrWM(2{d<4Pezj|?5!=iQ8yjamOsiO@mpbdJ&5FA>r@AYK%oC}4P#7!U
z6@A`2(t~SL^sPxZ{wZ_B|DC*I{i4NUE4OUl{`Kd)HTU=QyI%g2y*x@@?Rw-cW(kST
z?L2~)d%nr;*Ltz&$4vD(xy!CCnX}EIFFI4&^7+)qYJ0K|y8B$-<C$5y#!>a?j?XqH
z9wtmOnv!6)Ikk9>T*cdX*9vQg3;S-DR-BcYu<mr}PR1GUC$QyC+!3yl>S)0rGw1Q-
zrIK-c#oq61PJQlCTd?k5_Mg5o|4y+@28OQ=nyup$+r+?sndL$Cw^hfFe@l2HwI}!Q
zom-ne-{_xGv!rfs_J#8;`!~njyA}18Q~llz&X~D(zS;bB(`@(pDB0tfn<sK`&P=Y2
zUrw`~PTs-1-!V|e)q2k6BTM(h-z!*reA|+ab8FLf7jgZavEukb^@->G=6zlNpMjh0
z;9KSG*?Uc8wtXyoYBW<^x@I}c&l>sJ1=5WN&heI;-)H?3T>MC4i@%U>{^HZd3b(B)
zyV^Yd97(#+7Q2aw@8R5qn{FIDuDI@xpqW(F+136tKD}x)ck2=SzKy}SuiYl^b=TD-
zjqQ24UVTQKx4eJ-?w(k2+~euet0tRnNbq<G_OJTS(CTwf@AA*Wb(xkj#asKo{P`HK
z`=jqjl#Z~g*1o?V4eow^W@O;?m0>jle~sXc>&t#5dwe)DtHeH|^=YL+bmi^y1v}o}
zpZsNAXJT#{=!_MX>%wt!wX*Vl&D&5Do^nHbO~%b2e$~Q>UraCdck~?o=Nu)hDeaN=
z_KsXttzqM@Pf>RL53)Vd#itc+c5^<)k>sBDocH{S6{U?2cE41bciX)+Rx+}D{VBt%
zGR&Wwe}>B|P1zY$x9vYeQ-RK{$uG`*y8g)Y-t<zrg^ROysjj&wbL_+Ur<;CF+}arA
zF8O8Me};$md;V0sU3I%6^vhbWOW6_YzD`Wpm$Eu_={@JV>#S2}pBAvvY3+EdTHm$L
zv%YQOkEv?^8CuHZzZ^?T>8$W=Udi%dLCMJn1(v4YmcMa-5Us7>HKE3=Kj%`#Y1fZ@
zt>ya4N}t{KOmr$|KGVo>%&78w)|brCKB>U9;+y^7rN^3k3;SLUzxLv<N~LgxgTaCX
z9=^HOfvxriqDLysBl86-lD)4t&lLK0>fXbMuSyY9kJX-gm%XDmx=;JB*Wyr%W8SOm
zPrZqg3RrF7nKgIcBNv5wueBeISg+cr@ptWtS)pQfOGIi*Vq3wj)JMKMs@J`_@>_!I
z^%h<Ae?s}(Kh7V#E?*q=Vcyo1!aI8yum5LoSU>5bGS}-T61xKbdD`!ezwn!%d!s)8
zkqWEczgzbGXDI(_FS=*B&x)UA^9;YfjIHY~-FM}%#%Y(^6<=Qet6y4qu6tE|=F1Q9
z7Pp@t*;Ic&i?>Y5_F$w8<Kg1V>;E&ve_sE&YpM2K<G-3Mci)x%Zanq7@NCE|ca~g+
zcZ${t(=3=(8W>N!a**|8S}K(H#;xw<n!7F=yHr&sr22g9>8oF--97P(RjPGfmCHQw
z4^ztWls~T8`u^_J+!E{V*{-DzTgrpuqP8ANe|J`P*RjJBC!Q_%)!W|@^l-A<j;2pM
zb2shrXBK=Fuw}-7hJC%I6ISQwJ-2-FFEqtS>y3{_oV`@x%JhZ8HOJ>p|M+%8zS6B*
z1>p<ltYoPcdHnIbX=8o%N1<15rL;W?9zWOCP$)d+ovVCVVtt08N&9-{1@_n09@?$?
z<T3l4Z);yZno|1IO=$7irRV2<l|J8bEB9j8WA~|t)Ev7aW*FF{v$n^dsS1nPr}S~g
zA@7I3pSqq%5-^sV^Wlh0ecabCcKh?6p4eo_d+rc>eEjKqoBo_w?9fnrqiWvOmqEw$
zqIb+G%`|yid{oya^^v!`e9lEv*~X$!1s#T8&)07kT`*tJ^r^n&#jWf;J&M1zSLc3z
zE~$K9cJ*DJR0AaynXj_v*T%Go8;XTK=xM4hKVg4uYv_Zo1%LdqHf)NTr<?ycHm@N1
zx7zO}yRW->nyfzDSl4v?Xw_`LMbF)@a5y(VJ+|Pv{M#M!>+80@3M)Im<MBF&gD>aD
zl>f>4<@o!&qQHs2Q$;4v`w@8ldY4x~_Cu4Fx$Dk3=?lc4&&|`_a{F3Q#7SwFl}{V)
z>z_$E{4Q{JPp-Y@*LB}+9jX_9_5D}R_E~;yll(3zT-$1$&3o#N2lJUEes<ZauWRQT
zAGoJ=^@?}u@)Mz(m<_o2>|2Dd^gB+DvYOtowN}`>`ft)R?R3NG9--aVat9tf5PmtS
zcC}uG^2%b17X?=Ty4U=04$75361MDCsa%qvO0lbs?|0R<j3|$#y}xa84sSfnw1`(f
zK&?=u^5+KrXPTzfOeIE2tV*6d7gtCGe46-7z*_uO;ng;On=5frm!HlG);uTt^{jS$
zkjR?q<p+0HytmW&QFrXYo2GBiqAhE^?nV3O_WXJ`CA_u5`shAAf4&IY&suk8SG2r3
zVKF)B{o|g*&6oC;A6)j@<Kwi}HEw0IW5W(T+&f8o#oV9Y9o({K@A^>sc7D&+zj80_
zAD@oA^7fe9#ixgBO$zIun8vS<dVTo8&dbj}{dEso*U@+TSe@o%)tQF3OA`LM+b^rS
zzVJtyd{@-Eg}KW!uH{zNS20K5ym@QScOgy2?Hr5weiyjg@W&KntN+$Jbe75T1>@_V
zq1x{SW7XFF?Oh)0Gf~=NYSYGmQ;{=P22?UMHWXRNq>FfSExsHS8fjMRE#CCc`ej)1
z+kb2yg{Gg#y(PEEU2b85GV?Zn(-T>8Mn75~xaK+se>nTCS8C$E=(TE}&d8J=Su0X;
zetpif9j9}xo<#m<$mLXP6@PksR$y_D5JS%7c}J4(Z#Dnz_1I<B^<zwBJ3i?#+3uNa
zeeCgKrllJ=87B58U)ytQN6VH;wmvqo-))UU{;u6x%ei>xhvVJPw{M@y%yDjUweYdK
z9I26)WxiNQu3PW<ch4TTYi5_tk7TdlnBZ!YyXMaHm`MvSNO~&zNw$ACDn6RZ8}GQQ
z$@;{?S<fpOLzhW7xxHH$G5-ip)vU)gkqdv+A2Dn8tQOhn$+dr~lA`w0uhvt_zF8hC
zVy)1Z=Dv02OR}GL*m=K=fA{}0oVj*E^CS1EBCEAd7OJgRcIg*XV7iy7V8O5~c+R7B
z?*AEB1%Lb!d!yf{=dnFd$?yt?vEuPx3yyAjGJlsl^Q@oS<3H@1nW?(^<l@`zvS)lH
zT-$_Vla&Gw1Wsiz=l#B^Fs5wggZ@^tZ?0RbEiPX36mbzUXcRqnNJ2C5)8oFyTLstq
zm)$gK`87W!rv9Ltea39hKkI+^<zKwg{OO*fh9yITXHP@rmp`kMJ^nK^_0(Oud_tn)
z(KDA5ERt`d*ZXbz&oDjf2bVo#h081b<i#(yJ<{&{vm&gbX>OmnqL6^${5T_i(}W7;
zL$ge;>`Hw%IaOKDeAkg4$0y9Y=T!AMn&vGjdsct_%&zk2rQh{G*?YbH&+uUJ{w)fz
z_dm?^iC)GXDNs=OpTTZPb97n#hama>%dXo084e|#e$soq@bbsTE5#XxuQ=DAN%_#;
z+QVJ2E$q~8@j?OjdG>prb07cu)%4bjefe#A$=7V`E=I>3YFsqSG~!v$bA{FG{f}+j
zva|N4{hlq0Z`K}v$y5I!=s!cZLB_{y@p&d2xeE?BZ8DoyUV0~T&%zCQoG&WAuL|4$
zA;i8rYRj2@;vdcCu3D2I{z+-Wl+PDhUCv#;BHYt=^^?WlrS=&uO}hKct|kR6Ett-A
zdxIahwsP@p%VP{LsviDW{OJ5q`%c4KFX{zsTq{@KTC(8SbS1V=GyBXJMoet3jb>kX
z;?crg-EZypl(m0azf-<c|Bp!bx7Gx%*eHYiXzsM*e?NuDpWFVW{)a~STkf^-(HRrG
zmz^%GR&rWV@?%O`kU;8@JvB$lEY_dZ{HiuJx#zHuKUZbA?)T8A;o7^I8KZBMFUy>#
z@5>*w<?80Mtw+pNKe3-?X}mo@KwR$8rf*yGPoFtalJGUN_V^2_`h$UXHg}x&ESoG{
zF7&dwd7k^p;wwe`d#(I`Xt^K1ofM{B%l9y(aYyDl<G1}=SDvk_s&TsP*Z5KX$S-M)
zPiwyJb!7-*yHedY&8BDanY`Wp3)eZY?3$!>gjGj?kKy_LOS|S~>aBk-zPUg3yZlnn
zy7;^wSF;XD&$eYu$$1;UVTXEt40E0F?TJS-*8dT`{y0Z#Q+-NCirm>mvwE5M!k7O{
ze;)tv{n+;l6;|&L-%7usFgqwyd7^$!&a<}C&!^XHx^r6koRme#BDXaw%*{_ltXyw?
z)yDW?%ARS}t8KOZ_#D>E=JW`uFG&sQKOj?eEnhNBce$Fnmwv_i9e-;!|7U1AT$7k7
zs8{04!Bh|tc}Ku{p4f-&Pqa(xA8e49)_v@`^uw{vr`B5SX4j?N-oKaMI(PA%k6+fG
z`Ona9$MA!5MWpHcj*`DzCwmXhd}qp5TDE;+MMUsaxnRxn_f_Ns!h0&358Pv^4SRLl
zebe?X@5p_@DLw_hB6$U87B*N<XU~*3_@dlnzcuB))@1%<|DS=sW%d7vH9tDLTjKWN
zDq*8Z9KTJ^S^a0Ih<*HNwL$&CbUSU2hwQB-mKAq*xEC${&)~IxZJpB#Io==cOR`_C
zsn~w_KSO@@4xvvsnPXLVFXNmhua~>g?pmnzb%iI3Cie7e*Xkd<)!s2Zc=v_3$y;@f
zuGPI4@pjv$2@I|U6%Rh$nRj*5G0%IKss!Jxyme0F@7t~a8JbSl1VrChv%bb~LDb^s
z-#@LrKFPp{vvj8g`-1PUqon>b{1G#M%+|<Kbnl0=bLotlzD3XT9d4f3X~`nfWMmlM
z94}m>`mk2~=;q8@WplQ9Ts&;K-SeG_$C6nJpWOQ1aJt<6wDQzK70qLY=?~wC$;qep
zdta=vU!f5`Rr$KfY2UCrJbhBqEAD){^FV+<ZqK!R;lQP)=1H|vwQo<A-zr}JA-cYM
z5t~$f^B0S!%Izh)3zmHO$$RMe%U%1VfBa|o&%ny^<MMC!qhkFZ<HL95DzQhhO<W$W
zI&DrYr?$4kq}}HZE6devVsP5DYQx!@_oW}T181gmJw6!EJukI@>)?m?ZcP^FD%HYR
zyZRmWl&kIGkJ+>P(jQlo)iPxt?)~|A+f`1n`x)aj7W*=tPpjr=oREm&x;Hn|-|Zd$
zB)czyuch`M)#d(e_w12I-k+mgZqk8{_qR;!pD%e{`QCnq`mMR^>l7<y{kuJ5{knuJ
z$;adMex1AZ+P>SXUh2=GZ96V3-R7O^ck$+F4dJ7jKN%A^4Bl$JvU*;S?;KxV!4{pJ
z@kgJ>-0h$Bde#i-yqR)l^P&xlla-C^&#kFDw{+^hgsSUr=dnDtZ7V&!-6ZNy@L&Gp
zH8}@=*UUV<CT0GE>#wTcZmwMUtlXySFZU18hrj(h<2RRg*Ga}OnpE{z^|nmhz_Vso
z+ia6+uL+JkM^Xfv<L8?x&J=n4=hyWY;ctBFMZ|Ain_F<h|BLpt{|u$-Hx>Ug?33vF
z_vGA%iASE6uG~9o`~Bsw>IG6n@ABN6GwtQSsDJIBx)=S4-2Sok+|+e{oUT3EyJyFx
zwNhW#-!(sI65z0bA$n@(f<x;nq($^B*GpgBVjJWe^vs(#J3zo>UGk?jTiN;(leZ_j
z-U^rH`rz)T{cZDu?|+0Ie>?f(a^b2!Vjq`HUXfAHW5fQKH|dhB*XK7~+p@lQP3K<f
zker$SbXRcx_nv8|RdPQsKK60@i#_u{<gu82GTk@#<Muf364j*mH?=ko*}04iEaV#a
zv;H%vZ>*fF@^{YFTlSYTKD=K2`)IBI|7*YbkI9SvXUKTZQX_r+pI*iE$bHl9d(XPX
zy3M?-F84^$c@gWw{!8vKtvWwJzQE$K=#TE-@&6ePX8*Iyn6<h_{Ri{<*vO?vXJ_6z
zwz)WW>E2r>e)CUWeD~(9o0WE6YbM&97n!M2sbuE#_3QPw4?h<DXL!i|#`e+eZ0VP3
z^@8^@cNrahZm6w$^-k)Oo<E1o`!sG|m{Vl+Z2z>keCH3})BG_z(Qb2U**4?-(|LQB
z7~PFImGt;@pLIrh{VqPg3+!HBjaC%|?@eE1IytZR(zX8#jkkYn{<d)A2f2QQi-&El
z>#IDAl-YdVcw?qYrF_k#6KA|VwWpOAPfPMNeKMctKSSpI{(lBPjy{~5{_yMiTc+Ky
zVK?6>1o=!CSG=NP_=V>T-{py|ygN^=P^sNA|ARMwPyJT*V|!IH^u=3Ca`P(Q=Hzaz
zNb&BtvNECRYOG$$#0`EnE6zJq$<#aAZ%%*X`hfrD??cxv*D!uq6eB&mr2MM0quugC
z=>@5k@|7hqhIT$$D_SOq?fw`!ZCjJ&LZ{RB>?QWG)E%_5{X20_=z^?$w);0&o$s9Y
z=;E53d(n$idAII9kuvQy$E4iPqBc8{EY$xd3&x%NI8S<iyU>s7qxPFZ!Y5XoJMEb(
z9CFR;<!67>WgAXr+c;f&5bHAWL&P)Ni)-3>pQZG#t<U=TwO9Yq@urfwZpR+6O0jpY
zTk`qgB&BuIer={ot}%H$KhCqW%ktKoewZm(x_Y+92GMi#RvhlhnPd6q$FJ+{adH={
zZ_Cvw?Oq;eG2bZjKLcBx_5EoZCVl#M=#tODLK$=6+eej3BA$m%W0_?TKI6%~mai<2
zZP_ONmQp>psB~`9Gtph8oGLp*r+(|v(3Ppa!FS;F(b}W63Nw%HYGAuid{BMIzt~lh
z>qFe~8Lg8KPknjl)8UWur*=Gc;=HTe`K)x=ySe={>`ecNU*5;}hi&_nk}2Ev?lQaR
z*Ig{UYx=$&Gd8H++03uQQ+VN5$rt^b-_G$yKiJ-A`g58_-dgj!5^pai^;9-RvY+m0
zV3A;$^F{R4e}?U0Gq&B|yk<J*OtlT0FX(Qv(u`PC^E*#S@c0VRr}spP7yM8^{B2fB
zM1)C79|PyD^96kio|I~xKfit*Z^1L6nq6{za%<+As$ZSIc>ag5-1N|k{~6Nz+xCh7
zyRfryoyl1aYsJ7Poq9<jx7byi(*k!0w^-N+)CfO%-)tlNTfOeoJk=lfKU_PiQxjcZ
z{<nQ$?6PM&qW=c@tFFI0+xp4I&C|RWMI<hpDl*~7tZ()|bowU$-TZO-!}>$n9!D-Y
z<}P-dpdgns>D{NtJu(j}+v0T{WTq$I+UNeCp=no5%(iVmD$5_*^2J+w|46wuE$ib0
z)oTm#AI}b+Z}WuHq0gXF&W){zHFe^po;%69>&yHSV~-xwE<XHt>-E$hst?xMA7M&q
zJM4KgLp@n}3%~J+OYhQ>j%9KiCVw^$K3jQh`h&aL;rpkDUYnV?akFz_xwiaN#g4q(
zyBkDg{@K31XXCp<ZTZq4=?4stKfUv#`p`c4?YrY2eNNx<x#K~p&VPpa*LLpB_WZo=
z;g8fDX4M_t0oUfM@V;@5itMwz+iw*(Pf(eMW7=-5tNqqbZoWy43!nP@!spkyX5Zs>
z&p%qVM?QVlZzk@V;@ose`}B?{{PS5(>M!X#WyD~5QN8U^!VFi{#^WD8zF@!npW%93
z(=TI_M&q4JUNNZrE4_T@N9LyW63Q9Oa`U~86>obkJa4;AVvWhCIjd^^ZsN;+yZ>hL
zq05<d`dhAhZ!p^@`qA}7!0Jz}@hU5G@~r!$=d>PR+EZoEFDYV^eYmjsnC;ox{NL6Q
zvorQ&mMaVGs&C%v;y6$Iyy0`XnMt1CU&mCe{Oq`RGrN7op93HHTU37dKW@8f_U^;g
zpWFLNdn0=7UNqQT?0Ix8e~N*Gz{$@tt0&E0c<Wv(=cH>F7l(ab7r@ufUL^dpPkX}E
z5)J*Y2lETL&ddA@F*<fi%Dnf`>eb8#gZMa1Z)aWe{c!tu6n|@}TjdttpdV_}i<R>X
zPVcq9uuOf2q=Dh@*Hi6{p8O4qkNxYnYWl>-j}p&!wDjHo=D6)jULAkzlI_7Ai~5f!
zDo1iLq+ETb*<_WPEbq1bx5^LK8vX2#ewP^Th5u0zQc2yso9QaUlfQ3_1?N>I?OuN~
z>inDg?8~<cw%*NEY2d5ewQpDIACKiVVppFvAO2^vXEM*}wQ=r}Z#!lN7=B}Ta{X!O
z-Nn(@zuLPr*Iev+ll1TMKh0+UA9o+hYMo&&t-7!$d6WK}hMj)`9+WFz2ygm#+iKm$
z2mNhU^2bXb?y+3Ky}Dw4>$Lh!F^Agxp45FXkXsPG@W*?ne93>;<_TUe<!ryPCXACa
ziE-wU%Nu^_IUKFr{zvqE@Yc)!8B%8IdTUMl$lAK?s=}nDyBTjV_$E$Xs^g;cYxBip
zY70en*De1XpI=$fCHCs!yOaRuvx;{<?R<Lo#@F<m&2n#QvqC0vacnR8Q(O4YHhWf6
zrplD2T7RbPxwC8Ec-g%;d8~HFv;7HPx8-fs&%8Nb`NMEYRA=ejv`{A3ZEYfU^O85_
z?OVv|xjwRGQ^hgE?}gWU>O`|2?m5ZczW&U9W19<K|1+dY%TLSv_4)m_2?G8n>gBXw
z7|iFg*%K2q+vA0uX4Jc#R|J|=c6`|Lu6WMWt_+Xkmu*)+i0}M0^;qlU)z>#QS^oJg
z9ocn)TcD;TuA%3-%x|9X7v)E#^M9<$O+NPC{@|`_?18P>I`#Hhe{TJFtTLhE-Oa@Z
z#HDmQPp9xm-1+*)erdX^e&(r46aBOG%1@>x?mokyX`$#^8mFlC{P3-kSDZ?>R8D;D
zed=T%^=!`u^;<tIZ&iGkJifJ7_R(H`|BXNLAH=4eQtk7eZR@L^V1Lba-%6#0c1x2d
zx?f<7n-uu$X|2E8;<6z334hG0J8I&SRi-)pRo3&}v*KJIi~kj-<&Eb9FWatu^S;%p
zX4dg`X`jov-0|+ydQ&T|E_-pXk>$^ga}Ebz6vkzKXgU^K{;0qGOYQN$Y9ANgS<?1%
z?X%z$PvorXd#l(F{T0jHW1bgOyfgQ4A<qIUYonD<3(v7jyff04Nmb>l*>01Q^WHS*
z_@bDY_}&Z4Zp6Qv)9@rAp-JNL$G3jDiVx$roiBTEYKEe$h2*PK234Odm%pl$-=p~C
zN}f`Kz$UG=`;Pb-I5qt>ygmPA$l5LXybC<l_omn6B}%H8Rf~qI2!4HewBqc`l_!JB
zqhx!x>=WDgv32U(bF;RIO*HbD_Q@xj{nRPz(@K*BpJ|&kXEI7obd*^0*Kv#MmYrKB
zz0F&ew6US%R8QyLSuSauz32X@8E-8rFyNcIsKVIcTH>zFoBIQ|cGg#@cfYxppt<#f
z#6EeOPKI;u=P*<yW&Jw3<=R=fnfXry*3LKQF|hB}5}zYKqpGKmU*=;=%(|wY?K?l@
z_tdDbdNph7k*XM8rGtjSeU_!c$NhHv`5f>0$Nq=qquu9uBTr2`J-7L9vOtl$E$8E3
zU)GhW?%aOWl>7Gd?P;GEvI=(OSZxdweA>yqr7g*WrGee_yZXV^E7sfa=PMgTJkHk<
zD2UE{&hYj4&!g2p-sCK1nPmMsaq_aoy8TS`H!mNxi0)L~x+!9lhlb4dfZ|D3AFuo?
z&G-2st#tQ@zSG+Y0`~%c_ilN6sG-2fsGx`~`^`$dFKOE+g><=c&q-jO@AK>T6|?K!
zCW&{Mnorze^Q-<h^+|n3XjROk3a-q%GVHB?7#CHfJ5Tm+VOF_e<a3HK`9f8qd;Xcv
zG4^j(uh4I`&(d$(b>{ZW+&`hqZdo<3i(jr!Gjn{!uq&yy{rOw*O@al&KbTg_9lmn?
z)PIIs=O5^Iiv81^(Gl)&ea%;M^+m@M>qT#>Oa9~79F?f$Rde!P)s3ve?l8NTKa!X9
z^Zu|qd`MiVa?*>ATfsXY8)aTHo&EfNiMn0eUMCAinNWSvjG&6*N9+4*tczy+R`1^W
z&B2Og=auEVJL>Q6oN}#oO?TsY(SJ)n^eNwZT2Zy~J;(k(Q{|s6mr1-T^H|)qWTpLI
z%}FyDU&c-T(05VoN9W>O`!!2-rmeAR(o>iwSG(!a4*wv_b(0TPwN%A-Z^?C?ow5B&
z&XXkjU7MHH`&{2V^U}8)SzGF7>DInneBiY9E{j>A({E0yFZTJPeW6D0mv2v%?di#?
z9cGgR%qD#>?A-BOX65VH7_&v!75#N?+BY!&yq^D2+pGU@yo62m!v_m}*LRk-hRQNY
z|Gew|U=91jnCtIu);XTAUt2$Ys;b6r<G&u0eD9X(D4$sQS%~BH`#-NNmr90B$h%d%
zrSQc2IbT*PJB2qkzx`Lg)b{bI2@WUO8-HE%^0H+=b@OJlZ_cz89~UPcIQ9~>%jdrG
z+FZw#FFtgf+z_UGt&)F#;r4!?aCMF@@6w(I2M2ro!(G?(^OCt<9Zoo5!}xykmB(8X
z0`Ej;?UUZyyI{xmJ)Pg4)XsnNc9J!}VZeWeuP-Ow`{Ad4=VO+#e5Fs>?f&I*X_j_7
z*15T7-Z*J3R+jtb$S2Qp{_Co*-J4o3Q`DiaB<#lbcxuqi*H@Z2Y&mQlO@8XHoU=SV
z`O>1RcG9oR-Y<V8eAijJPi4{}OBo?+i6?pOH<)icTYjmezU|sIrK2^DB4>&>F1?f&
z7U%h3&JKyMC(c&R+}7k7mvQ0Px}#J5KQt9Fe3M=6cj%H~qqGcjUv2f5wJRU~oVxCk
z;hd@GLoR%gZ{B4c<5|4wZkFDu1=<l-Ey^krcl0f9ej8@0UElm&Z<EgT6C#3}Ze2`b
zdA#pC_n*DCug|2mihdWfky>r6VeR;5^)id<tlP%VKH2JB4*3ziJi5~G#dPufN%wNk
zte9#4Ze;@d1K$kKk8#r6&Z!T3^)CCJRM-7|$Y1`@s?OW?W^aCn_vP|_nml=)t>@~%
zn?GmTO#B(vHOpaX@>_q_e>bD*=04nA&->%`!{hCLLQ8Y}Zog#MGRyT`h)v*akDkZN
zzG}~V#c}e&uD{FwalGP7yZVo@BF-)Gv+*fz`Ew_pe_lU*&6g8zxBM>Mkgq#~eaf%x
z-z(p+FOOeqt8_(qcO^?h?gO#VoF}DE<m#GsD!25TKH4w-FXighj4JtK{&IhGfAl}}
z&gN&XF}rNTU&wRT<hoU6&}a22C!d%pbT@bu6jcTuE%1D>SL)U!?)7}0g*rh!9@pc7
zll&HEb_OtRUtwvzxw(nqUf;ju<+XjUoIdu<T`uc!%zgh_*9ZK<p4leb3MVK}6XV~_
zx5k2p!*22Vy1&_1ma=n1JenhYQL0LB?(!S%Cf9j)s05kJdHj^C*0}4`kIU<i@*m3=
zb<GkD-70TcIB{ZmKJWEB`={G~nl88{St(~NdB$6jD|w30Qh&>PMuq1L+#koKek^(t
z^~a6Znr+9t<KC5p^J1co=iU4H_r#N5T(>0pytm1n%ClMV`l~K?)W@`$scSR8g;nJU
z-d4IB!zT7&I{VXdp0hI}N<UrKsZ`qV$A0M#ch8RnTd%5G^<KYu_^6U%gtPLl8Be<M
zVm(t2Gf0%)a?OqX@jl?g+dcF6KiW-;JG<0;S4r0+^S~`?U++kG>^NXI@8)`*k0J%9
zSHAqUZknw5o>L+Zw|&^8#~*iWM|%I1%f08L`XqJFuQlcGj^}@}weNJmkK#p{LTV1a
z+}_>3T}g$VD$!+jC3_g3rCU5^p7mkA<m<q7w>!4He3N_k@G4JfB|SGIPKoz{ng8rR
zicOWwRQ8^*m|<thW0k((^>Gy|w!D{*xw*r0&GnPDr-G}EW$$|4op9H<`LAzfsk+*`
z^KO#@Z+v~vcye`2M%aIbo1YFO?9f$mEi6h(z5U5UFx2zd$9a3cFweQ3pSbAN)5*W1
zLUvZ%*6Z>NleG3`3+#VBF)sbVUU!!rpG|u0Jd^qu-bsm@t#RI<V^GAP!rb8Tc;mWf
z`T_?RzcO&y?sBB}_Yq^xO+8C;jm)Ck4);6Ro~@WM?ati37pGUg?0i_L!k=A{yY^AS
z&FG2`N91-U_k6c|wy)}g_sjLQX46+iyXgli*Ld~sGIzbHRS;5otMV0}Yt`;Q9$jH(
z8=^gTGwfOS@h$g#jy17;)~tWBpWBPSxV3Ee<J~*A%;fnlwebGal{XH&jY$z=;BCHs
zndMoJuDRNy<6$)`O-kkTwB@$xe>v(F&~ap0bhcYvLclbOP=(Kta@yAtx-?9r)w;O7
zV>WoS9X1v`vzcL4?8iU8bIO=@>|U!M@gaN3v|#t&H=eYGx`lI{+Z`Lhe9qnZ#&?Ug
zvgMEFR4r>LiG0%>Gp)z;n26qyV|N&*sW2E%?s``;??kKh>P>7Zsa%!n6DodPU0v(A
zF!71qwV%`Tiwy51|7W;*Yo|qNXqUbIob;dRe;%70-IqQwis8l`KCk}_bAm&b@P*kb
z-4EHbXQJH0Pak=ghB`G^K4)$|9vpZ#Yqwj{gy}L(l?T~>J_$D#3G}#Ey!stW-<;&-
z{vTIsYb}1G;i2%nKWe(4tL(YWk7nl<hwhuCF;mEMmdockD_tgN&%gVC`J{?a^>y3&
zLY`|y2c<Vw3O<%D;NV+YWIV6(SGb!^l)kCAJ$qKB%(Pj(Q`_DgYkOoFYj^&+!}}A;
zr(|lcJ@3nkb&JmRJtA)2k#ec&7*CgDg~*hkwR3WPs^=~(;Nx7Qb$+^=#cpH&$Clae
zd#bi~TzjA*r?%x%>5jXbr}jPf+;W0}`C7yhi+4wUJ=@{&(COf^nV}qar#|`M=67$8
z)Jr>+%oE8U)H~L4L|4ye%e+;jJ|o5YOZDm3o@|d8i`b`e9$#AcS)=KC?X4;Iw=9(P
zd}UR_{?)|K>xJwt$vSCq&Ro+;%u0uKZf}<hSh8lZ+;Ig4%XQPFV+B+`$Gz`LRnmBz
zuJ!a>k=M^0v*SGmddnyFe2%MK>RD=fZrN<{q?l>Uc^*cKJpBE`EKa_>5Mut(UpPPE
zOvQ<VuV1*vU%fN;o$|%^rSkk7xnK7BoqER>Q+fHQ(T?dm3RyZ9B*-wR9(?8TX8Szd
z4^O9rZM!G4XV1KAC!bETSii6}#%3wE?1gD8b{G6Sx%({D_8dOHBX&_lce|`z{^h-a
zO|LTaE@iHr<>B^zN|RL+yW@>3{_LVV=X!4GkG^W!JvYvD>lMA^EnVU_rOq(x1fKl7
zeY%vkN7<&H2M?IP7tVT;^XBP}KHJ*GGZpz%^HsERGft>ypE|YXrmTn=ulu4Oi-OCV
z{xkTQYv`(Mb$YK@aVv(|q^3c|rbni6eq!*gA2TZI{rj#RcH1^9Oy_>q&du&~7BX}1
zox1Ho^V}u%QD=j*U6NMCKQh@<{>az+5!<?dT33?Aj=jiDG76k$AUY#meVx(bhAN(L
z`(?M|UTl9;GS^8-QcBo#^QPu!JO)AGw%;ZnJfBk>^Zwh~JCnAaYFg718T`ZXfpAZC
zo!!^ESDyp7m+jm)^V#IKbgh*qm?td1yxjlX){vb^i!^<0BW~aI51ZJv=aWvt8|H#n
z)^bmN&6!mDy8ol>)z7cLg@<qU2+-*L?zyAp#Q_<)x+DX?iUXp{SG<bP+%@fe&`h6m
z&)jvKo@}>#Eb&LX@A}uZBGI}n(*tx5pBFmR7V=sCIm6qSNp&9|6kqRpbvU^EqRiXP
zOPU_;JH0ddd*a3|$(G05CC@v)ytVJj2foeO>`iu3ucC^)nk;Obm*3&MU2JphS5LXa
zdV8(hJ;_4zLiuc0Kk}B2%uQvL@bF-6ob!CW&&R$cf3siPvwJ4g@xKhbv1O8X@}ti(
zZxwEd#J`m8a0vCg^v%o2JLO4p57%G$LvO-2oiBL%HMjO-_E$UWBR=+9PZkQsivD{x
z^Sf>DC9SqFR)7CP`>y?+qGxyYG51+1rI4&B*C&y(&RS1vD_La1pFf*e6nAINlhvR2
zZR?lTp8u^7uM#g~W1mssy)x=b-~By3pZ_!TeOdoSpWpne<+5Mq-?QrH?$}Y3Ch}z7
zTmAjcUzLx<e+cgH+sFU$+QNt2?;CH$?O*!RSVb&q>H3bmx65}nI7@d%u{WjkZZ~9g
zo;V>Q*<wAz?0?)h7e#wryFP#OvGvc6dF`M4Xti5^!Gkwxjh-=IR2`K!tY5nLhw+Es
zksq!teq393{>ZF*%d?kBw_Yk)sk7Gg&$o*rV&A@-yNb%Wcc{HoapftB;QFJ`{f}Gq
z!?a7LTd&urt_{+D(cs<EeJtEp>eL<!w@-c{W)8MT>nGlcoOa>xvl(5yH{FW7^Cs1v
z|2n^YvwFDx!qE2`u76+3|G)lc|9^(21%G0<{AXx6{qR4-A#KjUEx#+`kBToWs5!oq
zKQr;dXZfk$rdi5YXR<f(KYD&NzU$WfgZ&aWvf{Z*E!S?%Oq{tc&g{Ua^aQ8$_q<Q?
z4k%k!K5qW1{`T?5?+>>h`_FKz@lWoDe)lV1Y=tg6T->s{IyO?J@1^gQVoupdQ{IJ6
zTym#j&f{k<T<b#qI9*k_T9a98bM6xB#N?o#zgI10zQN>MbwkUj^zJXQS49sO&AReU
zSNz+FzsvU6KB|rv`B8jaYToqvRHHl5cOrI0pB7npq9irwVB`CF+1&1b*Y3|+EA&?3
z!}}xa#cnM)<St@$_1F5lKg09qe|LXjRU9YythHm^)ss$a?poC{&)3UHy|NMKx%i{&
z-n$5qwYNlD@9?e)HQwv*voc2B!LRE2>aP*!$~->b&2-b9f8qJz{kOvXfBasWdCgAp
z${)|wng3Wn<a{%}|6|#kd#}R7gYUBK$~Rp$&t+Sg&v9l0mw%!XYyUIw{R#UKpZn-+
z+O62SD|=TTI3xJynCs7Pe^#GkSCIS95cMPan@{5(`w!P2`5xVOQ0j%*nMqDX?QbW?
zdTx<DZj&HaIBy2ip34VP?H?+A<f{wi&KGJtF8K36VVurO*Uze($}F@G`jw@>`u(Tw
zhhwh%Y`sk!@9z2RpXc<SL2Ir0ThR}BPyCl3U+<DSO}s+jsL^KTPZQYAOpt9j?^hT<
zYweScGb?6tES~e&@<FYpiLTJ&_>cSB7G7q%eY&^WV^cug>)K7<B+51(JfM0&g~`pE
zH7DUnhHKVQ9+T*ezb${)SDZia>-gdIf)&c%S07r<`q5_Xm^XXVbN@}D(+s@&1b8N2
z*6!OA)_-_EV^*Ek<vp?wvwhT3FCWP%Fn9Sba9rz?MUEl&{G97g#owNOd{XaE{=-M}
zcU@8a*tfs9Jmp}^#HDB7-&h<x!CZOq&OSeuRowcr_C^1MVlw_oT&od(q%T;zBJ-E)
z)1`M0Zfab&F3Mt^@{C1J?ZuN$Z|9KwICs_AhPrYSKf`eAg`(1~cFTAEXE^9lr(F?z
zVE$I~u6>3_g2H~}?b4f=sq$_u*N^Vd(CwES-3yxE7<lWxd6L+~;Ln)-Ve+?qANg7z
zoxl11$UM<YrrEk#--EL~5+m}IXSq+yezC}t@0!KW`_I(p{ms5+|6t?(E$^G_Z2#n3
z-O}IMX}iB&XWi0k?^|9e&&n<PbkEw{*uCM@w=jdFT+AmvKM7~N^7ym(x4g@5OXWMn
zqN<iXE?@nlavjGl&OY6&Ywii|_BvV5=N<04ta{ku;a&IrKV^2#`MFUbcJ0sk>$jT=
z|B!#Q{Fr=CokCmoY3<s&)2<hDI<&T%Th+F1og#3kZ2sLXM^^7RrFJdtVEFOy2lv^t
zr1*N=_7`p6we?GH<%&D&9;oe}Ju@=2TeL@To60#M(-0ZPc$puwzuo*1`G~)>|IvR2
z(M+r6h{*e|#Am5ZOi(%%`%0WIZFkzNlyF{2HL(ZB)Fu{q3m9$n|DjpmsQd2Tapw<u
zD{WRCk>7Uz)}ftp`~2s*+ZN6VGbz|QCnWbm#Pai&#$WPIyKWDUWRSEtXZ7)AZ0pu3
z5<2dFjQ<(zzW!8S`JdsS=boBr8@w0)kayoKZa6)B*0)#h^Z2Yd7O;P2+O?j&?&AFq
z0rFk5RBnAg+{^4!A^4x6MCVIuvYOoo`K*0u*6z-mc`u}Vj5^O8r1kmovs7<ROKaz_
zx&@Aj?6aS;{AVbstq#8w&sMT~M~&!5y;l<R3qHJPNUT0vu==m|&#OOXe~kafrM%!j
zLweRdy}cjV+jZAJiHORMHM3ZoJSkjj;?^r+lMYNuka1JLXJD|r!1P*;?T?)wlU_ei
ze=GG*=VRK|`oiSYhjTS+ZofS2s{3rMiC<{QVz)C3jm%bRxm6r3zILd3<x1V$pY!_U
z^;a#q>|4`+TYIhUTbsz)hc;;J=q%QZIB@JjWs;TD;@_?{K0g9eW#lBU*Z40!uKVuq
z1lzaU=X`S2vNCblS99X7bDPXMb0&`UPuD&6nt$ZJoWj4W{~3Jyp2vK8Y|fLWxX^kw
zlkbh6Ne2&pU0?k1Y>WD%zV_l}?n0_l*IYUgDCj4dUMeBGY3}NGnJE(^OI}%)x}QF`
zIpRdH_s+j&|IU9i|K<MXecq=Sy~TxG6{$hd<%;UlxJ~yYt*PWzp7!gx?W^?%{N*yO
zmLK}-_UOG=r*6VW*-sv)+<$qUuUR|O_@;BNa=vxtx$GT3g41^SAJQn9A)+C^D~WH9
zbgi0zhup!9{m1r2{+)07TJj%j+)FX_nzfHszs_#j^EUm8%c;;dXSUYKEafL&@z%+9
z=N`%}o&IzFvc&7}Cw;Oy-&McWwY|MQ+gA8MnVrP;sgv%R8=EXFd!)V6om=qn(|=!U
zHvVT|P5<$7WyRwMeytCq=jz?NcR%QQuAa?{r^!lx=W#AQX0!3INwmK*!>{YgkA2fl
zACceQyXV4u)7*r<Oa6`qn`W84zqu?<`?URorQt3$rXPa#t7K1hDn7;)8DsG;$KLC5
zd(u6<S<}DneErNIaM|t~f2MCcedhUkTO%vEuWOT}e|z!#*>CPs^1A1m?&OK3ZI87Z
z{9i|h_4mdJA9LpU_V&g<``)@e=O@|ze)#e3^1E&YWhQx*51tsD&G^yuh;8f4kb)IA
z^ZxP{$VpyHyqve}^Jzw%gpw0KqwQB%KH9c5`{~Z0-2V)nT>U2=_j`T&5WdOgPtf<-
zwv!)q-v7w$xveL){-MmZxBc5*<UHZ>zapglS^4n^^&?U?pLnKSc(cJ@X62mX_wh^q
zY3-2eKjO_9TGo~ubYq@T`OPNw2g;9M#?PHElVkJxJfE-T&v@5n_WqfRCp{?s@}Ggr
zpy=<X{a<%Jyfkh9_2MU|TNAY=zpy-E+gg2X;Y$BCf7CwouGty!cD?EB)Wmb#r!x!t
ztp7aQ6Cb{%BBe2gfhQrQcuwj0y;bk#GXG~dG-K<`;O=^X7!B?7MlU~_v0p!R{$bpj
z#o`v*?|e;r&z^kCjwyOw|HtHmv%b$*6CHCopp-Qzd&S$^A8#ucU-*6fLR9YlMjP2h
zS#t6pTZ(IUT|HCgFA%#hdBVbAxu<t`=NZ*K_&G&*V!UFF>6LX0KC1OrtDi`?YVuqn
zZ=t?o&F2FLWWLE}zmu2y!+6P5UOanN>)X~h-wm_Oo7~$zxrJ&Lt2uBzGh_I2@OIyv
zq<!`FM|b#XJ@*T5SQ@2&YxRwfw#kq351-`|-Mi<*E3d`U-6}kXuk<t($IPkU^87GI
zW7G9RZFc_|G`7k9buF(KuH%1UrQW7{W|HKjhjSSx%zexy&C=Jtes4{So$QZlzYkmQ
z-hKEv-zCVS!H~&DXobbGM-}I4D^{I~<vLls`*qUBou(Sz-?P2zWBnH||GTn=?W0ls
zAybuxPYdVWXXu;DxOC&+<$rVyK1UyBm|{^-cP@15j>AlgmG((Tb2Q``x!V@TGM!BP
zmYtE4Ytxw=yXoXJYsrXhMUD?0UNHReH2q%kBcJ!r{%*UxO-<c}|Mm;Nuq{5mi@)dV
z&#nFZH}v{h!ag4Qpcy22b@TowTn3KEeSTlRD$n*$`)0;JVJp?IGxyv!7AkK&=D(8V
ztL^Fs{G7SjyLW51rQH{EmjC8>thS1;>iXq*EMnIUtWJwPnxoBNWO3YY#`kqPd7-}k
zH?}TV9iBDa%5L+OfBHYF{rfE5mMrF+tj_erGWl42`(=saqI&HgvppugiVVBaw94(I
zgy`X(bZd8o&v6{v0!$iaOqo-vW!&%cXm_sCz3bWYH611FOA252X`emz)Fd-FSJ!7n
z(v+vk*W-_DyR}OBNE!2l$ij2(m#^*f`f<OSD{G(T<_2TaqkEpRS)a|me1CF$ctzYf
zWhH~26d9SGTC0DekLHV;>~{Pp%+nZ@T^*KSc;cY*e})CuyBh<ZXMVMfKBf23-n~va
z+vxRtnVQ`7z4yY_mo9x(_`D(Lx8r5CJNu5F{(M>C`<feistm>NWAge}s{Wh%z<X-G
z!M#7mA8L>EUY!-OaL>lt<MLl#EO@qCyX3@y^<TChS`)nX@D5M=C*JQaf3ZJbFIlio
z#=E=w-TeC^{~3Z~^PZ#}T(#N1I!9$s_e3G_p!z*?`k#gcdNP=M?R=uLadw$xn8Y8B
z^_McY)&~A`jmzynH~-efgp2<fvi&=*b=~OwI<cT-PC{(t?U;YdoO~-y#09N#!h`Ns
z*gt<AclUQzW`OxyZnKR>sbBl~Gpr`&wchg%&bw<h|4UA}+P<=F7pK|J(~OmQQ2W6B
zk>StqpS?#UM7?FBCjT~?^n14Zuf~aw|L$XJ&41Pse_!O>HjCpPCm!#3IVW^_7{iH%
zxeK<-$XOLstdYny<+%KG=ZW)9h9`g3?Z323Th=&g?leIyu>_~4C3EJ@+cV!MX-~T6
z=4+wVa{n0~{%2^ZvfH|FeaG9H#H?-l_36thH)Tp))UK|Resk^plbdI{K21&7QRb%1
zc+RaV*89Qs)-BfByWi#?4>Q|%E9-NHu<?suzdF8pSM+?kxv%7%s>iWU%NO-6+vl?9
zgW1|u&MP?IrwP8|<(SFb&?_U;;h{X^q{_rQlVh)SKfL|d?9lU|o%?2e%HDbQ%xit?
zid!?DzgzTx-)Hijt7~+Wr9Wr?t(3NLsg~QbkLO3##zy)6l1qh6^_#w4wW&6n$9Xm)
zp8bbyh)$fzrKgV@zwyS@?N9j6@HL!!S>)}z?<SwUxqajD$M@FpTDEIBYQOgl_Wt#s
zp&{kf(JxjfZ7d(2j<on_H|Le%_uNv0dY+sA8N7tuFPgpSK5~u2T9|F|&pA<PJByci
z?m2aLLv2;nl@A%8?wox3iPPeZ=W)}R)e9$QFS0uE$9#czYrR<J%dgw6oU<29Z~h@w
zRN;L{S0mCUcR7Dz;u`byOWR*ZOxq_naZVd+!<*Xb;#k)8t&jTUvmEa{tz>?AZ`)Eg
z-xuCfw{F~;{^9w->po@`@4aM;c-yv4u>P{)Xt`DXq4$i3=D(~L*s?UKg4y@F^!m&G
zk6*`F-E_=8rS-Qk;M{Az7&&+Q=l>bj$L4d3uTJ<V81-r1sd)lFibb^4ezY$YV0ivp
zKbBc}`Jco88UB_sRYX7R{kAZFX=IJd<$I65WjtsUcKygLHYq(~vE;vV%+nKWjjvp9
z^e^bXQ^23~@Q*J~)S_*(i=HPx@L;a}z+uf{`P1J`;z{VC7NxI$?N79Z@3Omm<sbX4
z%<!;pxsP6`PJ11ArR0Qiu5et>>B=Q5Cw*ezZRA$rXq_S4#D2=RX70nc!T#dk1vA5)
zUfpvvY)X_qrq=WK8n*)9!s|Su4T*CEIF$CZN12O7t%=%FUao6(&u&3V=4`b`9)Bi1
z`Kp@yGvq4+<2;MWURUFe2Q}4+D6cs9a=U_H;|;!St#z7_*0a>bH*I{$yE=B_(<Psj
z(p$q5|GHLw?|c7F^`i`Lp|*8x6YFW=Ny?J~jE+2cAZK~D^!m25xwWdR4YgYO{1b}j
zFEfmbe*E&%{g}(|HW^$y*HUsI(((EF?>kJ7`>lGm@uG#QwDSGbk4tY{c>DNjlK3|B
zj!i#>1h~8w=e@YSN^XBi<15~@msZo7Gizq`Y?I1cDdRGA>-C&jziyaW6pI8$Z~My9
zS~|6G@|-5uqJ6?UH(f1}e^Xii_>owq;=!j=o-0)UX1+YjHN@sg;qCs<vpy|<ciMRy
zxAXP9J%tNmcm6x|Vfx{Wa0WrU_L}ADD|Ac)IL<3K9yP1JeVh5&*$4dXlUAy5>TaoC
z_IQ2Z>N(6;(nX)RDJ|AM{xV>Rno6NusOL$B34FE%l`Dd?y=NWs-uNwSZtjOZ@A@sT
z_VIpbb}O4&yeu}+$iVMm-A{%&B{9kBU9W`??`PAIFumVgqnmbugXz+tXG#SgckD0E
zUipr-#yNLQwwPhg<#(~-Wp9_f^ZE7Q`RCWM=jK0Vtd)$-icBmycXIkXckMY(K2?A2
z(>^;-uKdo6UXM5ZtMyFfTV^HC)zfA75)wM~>d{-XIZV#NWg=qi4VB8vvX9oO|Co2+
z&OyH3hw(h7yN<2Q$zPMdu36~t8J8*XO7q|6%C8N)w8#5lt#|Oo%kP#)yk+~o^RD@{
zl&J>6?0?t!pK*}2zP_O%{m88NE~#rryrn!dIpgo1+&TA}Lf0!Jr|s+(kLS%Wom6)$
z=9*bpRm{(4_L8r^?Q+?E|3g!S*CTF8F~!o{rT2dt{OpPq?8<V<(~@{Fq3m-5;~HM?
zWB;UfU77t`{Xm^Sleue(=a$<iBN*pDmg>r5Df#JUDRccz{hOt~6<^nH`Ok3ZKSO^#
z@0vBY9tUi^RAadIh0A;`%dOGcvwt4ZR7#xsE>S;Mo4IM-Vj02sDgU%T%-hX=<7>1v
z=T~pWoqJ}t)Ni>ZRF_g@sP#*x$x%8cZHLi4okNc{R`iIPzrR=*6#uAeQhj&a%5Gt=
zz}}nB%l=thR+(h~W3i2t%l`6zs^!f({P{m-e*OL{X#J5$1>fff?{OCR-Q@pf`#o+!
z`tNAwiSs;HN9}Ll5`LNYT+h?Ivse6Pl{DvEJocnLAZFPIyP)NgvJ&O1<9L1qKCYLl
z=zD%ZPG;jYU$<A09Ffc%ldQR`XTMxp9-6RXqr;CJ0Y7njgY^rh=?QkvndK?7A?QUn
z`y-!^wfC8SFiu%l@JsgNAIoc2-(Chfe{}N<e7EFB^@k_NB^c-YsQTD{{?ONJ)?d~e
zneWfNl#{RE?mCU(Rf^Nn=FR3>1&)#j*%v+*y^^Jwxm?Fi{L&Ng@H6*PFS#r|QOcmD
z8S^gmq;g*6xx%AXz4wkyd1dydYJSU~$_F=XoHJMa=s)yJZPEqpj=uI(-QG#No;KU=
z_AWcCnWp;Wvr)yv0?&mX-48SSTzP!e<R{Cu%?dda9!}kPK>CUy7vss7Hwt6kZO^S=
zR*~(seb>fW7bog<mIW>IR4*v&J*?6iQ)l{3<C=+W+@<?ITXt<xxOuR+kmurw*NjZA
zH76&m*Pg@>_Ir2L=dMqyd{?TKxS88|TzhsUuTG@KeE+T~_BY@CiCwniY5nzAX64r&
zH*W7(mVC}?PWt4S+^v5%^m!z)E9BZGK6t#rZqLX2xAw9hHH^xZ=gfV0S)n>ZXP=_H
zj?xn66MHU1{8=H}82fF9!h~|BDz1-zlkS?F4SICwRLPE3|NA^D2OldJHSqf%Utje_
zbE$4*t7p-hl9!JvzGSLx?mx6o=vvD<j>$)M8NIr$*?P;Rn0rQ$#W_X}#^-ZBH_rNJ
z+gEm5zhR%Wd-Hz=oj*!5zde83{&ihk<f2r!j%}ap3jEwz9?L%td|nVTVWaZXV-D}<
z+5X#lQT+7Amet0qnjeWwbJ_k!`#(e5CZ;8cdld7Y&-c9^Tl@Jx!}XeYLB&s>|1)st
zAMU;V?TsA&mb=>}??f&s{q}m!=bmt_Rk0oc(K38XewVxs{27#|5!$ur<HYX{Zzo4?
zl{7Ee_n0-#zj)`Sk7wT=J$*bCRMzD<J(m->JVPV!vmtvKgUoYL+x16QCiOo1&(Pxh
z@at|DmX7v=vmz@EZb!Hs6ARU{tDi3!Co<XpM=e{c+19@^&8Gg{y5g0ScXqbs6M==g
zf(ieUJ%yClT{?B{xlC@*k9E0|<3H~GR&v{P>RVlgh=(qne`ZwN3z!glK3sX4y2Z-n
z7AvE)j_&k29x-3uCNgEB-PDKgIitMH^FRI3UzA%je@d%ay`FgUq?<NPR-t#@zjgkY
zZj$xLo?j_NP3gnArXH)$$L8PoJ?qncq0H@3zDKt%eR_1y?YE0|u-)C>Dy;XR?`X(O
z@x?3IGasuI$NUV~aqlMYl@bZN{|pbKw#-{IJ<Qv!y7m6?_r1GnTi5<Q{qozlUp;Z9
zOAa5NCm%YIjnQ!P%N)K-ZtnSBPfO?DVt*XAcj4V1@kgZI=qFdoPb?IPvTMzV<z&y8
zb=|kA<b`ElNPbPY{-b)SAE%H0vhC}9Wb5U<I#$bG>y)`*Yiq&khCq>xS_@LU1+3(D
zK9&q+^N`n9R+eS;YP!4D?X~UX3$G;(W~cRBZnmyDQ{Z&G$<a;X=gfA6CXte7dsjcG
z+i=~E`A4JZ<Gj9OuMbJJWcM&!dL_P1Xv33vK_%?l*d61ooh_z%Ej-K+(ev$H@#UZ4
z8*0QqvYpPC`B5k?_PN6CeIRSQQmlI5<#oy0=QtQn_&xAnW_kY7hqdvkGZSC!o810y
zO254A;<p=0S8T05=KaC$Kf{NuFDBg*ebUJ!)3?`R{kr<}`-1-&4jF!oKU~$aPC25~
zIy}$1vTMmdEsymb|77D-&rQ#8u%7D1T{w4*d)$omYwF~F<R7V1`dByh;eQ6sn`c+N
zy4BJxJ9q7-{8^QD-vp~4=RLFJTE%S`%F_R(pV=yFcBt&sx$kcs|G9qF#g%V=E?9Rt
z%zN+ojr$)gl;6_-R`<8ozYBJ}`+rzJ((bO6d+vQ@Uain0iFaF8AI_~isedc6<o@TS
zXOay)rJEKsA7p<a%l(i0=Wp8^8Pm$F+7GN3zJ14;rSPQK+``3wdu2n|qU+5fo_q@V
zDEGzfcJHa>3U$%-2h;cG#NW&h__)4(i$6!a|D*R3Kdhu*Yj3$Moi~%``u!B+gQg!;
zQw{D!S)J0o=3~e9ux<Twqu1X$e$2N$Guc%oP<vxS*Cv4la~e1&Ok($|T>sg)Z&O#r
znOl3S!V2?VuG{Xp|Jd_il?Se7T|BwrN}*v^mRaU%)79G_CjY<iuX_K3b^jSy_89)Q
zu0QBd<Nx9N!!KrG|Kxquop)W{zxmyzPq#9bZ$3X$WMA^W>nS-pjS|UIL$&-Li+6CD
zZ7+HKr+8mgz1H73{~4MNRvbHgeE)|4dBGp6eaw6&zqln)c6nLfGo|Eh73bm%#0wbM
zm@N*7{y6(+M#{fCyKfn93vy%M@cd8q3!|4Nw^PzMBTd#6msc`QJ#L}S5Wee2M1_0Q
z)*V-C+}Ew^tzm3siio{CExbqDr%h7Kq^9o8lRS&NcajgO_AZH0mg8ekzy2rtrm22Q
z)!aRkB}}<X+N|rhd3_SMbKR}eW^NraEj>g<tI1vRb=(%INoDD?OBdM(?N9fWJ9PY8
z)W>Zb({-ks9sBHgaq--R1~Zj@8%+84wma84<w2f`KvDLye!kb4>1(sf*PCQ*eq|WB
z?~@4cNo6+XNkwPaFYm3L{UF-(!heQjjl>o$@6|s}K1p*sm$Ye1*9kW^OQ#d(_{^E-
z6(0EWb^hU~FW;tbn^o~S<%+4Gj)eByW!IH2vsV6kFwbKByj+#X&vKiWth!oj|FD0_
z-JGC{PbWRmo<HUI*6zZu2kf6ujNSj{tB&}5SsUfVRFzFJ?&~6Bj&m(wbK8_yWvRn(
z==MgHF9Ckl;e8RY^|>#m?Yd-S6?<e7Z;$^yi(hg@b@Qga`OmOfw)brR@xSs%T>qWX
zG5H%F$lq{0#j5m_b_1ir_E{(YGccXsu`~YW?m6GK?2J70@A|B_?LGSx|LDw;?o^qT
z^nLfC-o<alPby8Q+Q4RKWO?v~U-q}lhxgfj5S#nZUgSsjqx<dl4-G%;o18VtZeq)Q
zlei!u5sw#(JkkQSo?hl*KeHrlKmR|~41M*t;ve207BIVEl52hV+Y!N&lV_&be5(8L
z`o{CuzjuDnf4IHvpU#g}j~}XcE|``pe<Zx{<@J*+y*$hAJ-u^Ad76z$`l%phJ&yA%
z0@_bM?=Et)bG=kFWper>^S7BF)jfV}{iu9I&g{dx&fJH&{3o_-xU^-qOQ77`<q<9$
z4su4EJ2tT{Qzg}AbIxfNo|?-K=2Y$3&u9AkJ+D&t<+`^rXYNI~Z0|Z_(mH#>s>^b0
ze*O%ze(V3^vV8E@{BZrY`#m<A52`uVmRQSXAHEgayM{|hJAx_lwu;2#Ny!s;PxAbF
zH0nP?Q{5ld%lk9qyXPtX2!AB&^xS!)cfDZNci~7C{{rW1F>fJ-87A3#L;jp;XDHbD
zB)8?rj)yXtYjYRAO0}$$+m|fA?&Pug(fO&X-(M`VH~d=9yuR@(uUPS_leLA#RTED*
zO$}PHa64PknS#3DIeZVej$fz|T>oS9k)W6NWVe|cZ$7KNSw<)8?6GeQ4~j1^`6m>{
zm;Glr=vF82NAHL3@01tuY;_W~i%xr8(k;pEp1J;=>Yn;-cO;ih3fJB7WR(+>QVYAh
z8t3^V_oeJ~e%wB&VPp8<tnZiA`KHgNWd2@zD{boRbD2KT(R_Y|2cG;{a6OK1Yp84S
z?V0yKr>~s<bZ2SKv3#aE87gaQzlHBxA3eY9Mg3;>1F_s*AHFU8?eNEW&jshjhrX3r
zsXm$KJ@;I%+HwQ2Rck_+xsH67une5UTYLJ0_>p+7FD2V9>`${7GX45&#wV}q23sb^
z`7%E+>CL;a^htEND7T95(>8V$p8jX=kHndM+_rY<EzjZ={;O{Ptgbs>|NEt2%)3Lo
zpPqP7<el7jS#;{d{ysVT4|cm#AL%pS^G_^YUVnVgMN7}cGHd~_Pq0fUluEoavRwUi
ztJbm46YsaIZa-`nm37@d^H2Qm$Uh!Uzuvt*eqY$Mo-gy4>({IO-(sp-z8^VLq?|eF
z&T+w$4yy~T`Z&2>PZ#}N`<uC@;BV{xT>HkeAN;>9yznKv`}9hsjV)W3Ogveyk&x8&
zb?T{e%Mzj_XI}G|(Ny4(^-t+f_2aqKkL=dlEnRn3W&8C>wnw%LS*isq-aC3ydQ<cy
zPwW1eIa1%`dH*DTG(VWj@3H-Z>yxDNo7SAkk&aJxZFD=qUS?4B&-D2-N$0}AC2uai
zc<`}c%F?&f+P@~&{%2rO_))y}PvRB*I+2=)_CwpF^w!*J-PZZYL0?ay>v>5~l;`B!
ziZ@F?i@ZBOC2{|mB$<Cjb+`6!n0_q(rhWYEqjJ__)8nM~M$Z*H9JY04nfHpQn|IG$
z<ml9w%$Q@;rebi;xNGgl<bPbRAD_SV{qQ`g>ou_t?;1ONG;etvUGbGy!$W1pxt04o
z`K}zCaEyCF44Z30_N9Hg|1Qeu{#|LurQfI+es!|<Y_EMg0wV7jeml}|Udz1VNbk<;
zDvAeB94)@^Naj%2uQ~U3+}nQt+M{D1ma(m=+bWu=Qv3X)`(wMs5A)m0>-ax>t}MSE
z_4Vn>xsG>P3^EHAubMbP^$ypQK9P@~llItu6Zmj$<-`9BH+MUHC|fS4m!oHrT{+R8
z@sfA5rcAm5U-9`<7NX4`yMwlD+P&Fr`uAJQ);~Jy8p1zk>6~rX&bUh`dNUOM_&n?T
z`<r#z86|V&LZp+fn8u!+_xz2|W4rmr>94YnoLR82^?TSS8yWkLTi?{kKD5pA7pS{Y
zr*Pd#Csp4xgpo7xU$fC|wv)2aY5redyZ;gScg^CD@xuzGlY&{-&6yWSR;UEjvrgbY
zw(<}2Myvj}@{d$^+}XTlp6Z<E>%v1Br+;7<UHG4Y)xPMLdFzs%1dlYkJ*^(+zr4I`
zdiZes`z`<KC)=L6c1m9P6W=*AagE25_B8g#*Z<p^eWYvGj<mN5%pa6CuQ_NgSefv=
z=)w1IM>9_e>cyV?y~fdQhs}S6`B{H+7eAh<-chQUSjv*ne@|!Tc_-294eZx;%k#Wa
zd${&exWY=U!+rj)2cP#<$rS&*KC#Ak>e_cEFQ*9k&*5NSf5*N*>h(Uk*xK!(+ne9D
zO|+1mt=wnv&b5|LZvH!wiH{$xit?5B@vkf|f847e`jfq5y&@l<XYZEV^QZJ3FEf6B
zv?ltuL#B9f<d4)x>`yK)5A3syypvG!^>N?Sult+7K3?_e+xDQ|)|%LgCF#p9m$O;%
zq=v}Z|N8n+UVhDzc8?3mtqzHzcU)`jFa3D^cGjntet~P{U+;V#*t+EXg&*a|17tOG
z74+6ChP|A}ar@+-*BAE4*Xn*hXzO*)_eexV+p&i?_;+m=3oq!iIDb|`;#Ky^n&h%l
z$<|+=XL9NPUg%~&E&KLA;g><L<XLP=Ixlh0WhzteN&8g6c>eF!^+k)HPO1FnE4S8S
zx$mbrPnUNpU&>uF?|ezGfYJKX+jS-GaGqDTczb!Bar};10aN#QuF8Dle%_>4GWPJZ
z;<>vk&lOMXUs@+#pBk$-(|)S-qz_&T1yZ{=860H3QgZxZ{5Aap(f=84ia$8oT;uh3
zVV?e0e^HMOGfJ$(yn}PhTy9^BpMNf|wOqtfURyu-^PO~wV}^y-i?2P5usr2CfBJm!
zeR4l$hkfY(c6Hv=V%v2yOQas9^fYvxIyw2m_A?GY9Tg_d2|sx0kK~WZk29Blh;QCw
zx%&JnZ#|XHlGg`LZR|JB?pJ@B7I<hQ%k!Q&>A$x9IQgG})$vEX?!Ea7{+M0l@2J_)
zR9Qa#x2)(DEmuu}`o;T8f2I`ApOMlWANR-N@17dvl{KE1P4wALFOR+xvmiIz`|7%-
z`}Z)cGj}#!6?^DZ^Lxp=JQar(Esvi}oq6TM`MGZ2uKfBF=PR}0>E3nq^W8iCNIuf%
z$`+53@6cIi@_V=W?PAs|L5?~s4TVNND?ZK<D0sD8!j?mA>e@{z_hJ?_S<CU&evW_H
z{3zm&`QsCpA3MDelR7qa?X7Kp-5opgm$f?Qw5o6Y`(WqR9b8YB#%m|WFdW!s-yi=&
z)Ba8BZ{rH4^Fcp0{x*Cicv_@f$o6mVmY>_V99})OjepMJsVW@IxvsYYS`W>?Xi<J-
zR>Z2;{82V*U(9>C|H6+qj~icIUhwMD+)MT{HO8~!1y)!j8#NeD?0F(rFMn#^^dDtK
zpZFeHGS6d=KajRB`BI*X)zvkdTJOjP>lmJUc=G$BebYZkb9^=G+3g@*Jg0f`<xisD
zDrarY*!=lb@st%7o3Hj{HOxtWdcxv_%-3I~>&`p6_NLu2{O)0Q=lS(n&qZy{&$9V=
zTyE-(jA`#xq6-@g*z+vEh(3Gv>F;f$(>wPrN?%ivla#S-+1m$9e*SeHFJH!)e*AUi
zR>flf`T1v6SIXV&bN<h8G<<JGkjyD%=7Pub{xkH;`(>ZE&v>h&`mML@_NI&H<qTg0
z?)nveG~wCa?V4Xjt`}ebC-2F7|8RfXuI2~UFQT5!;CL_B|44gD|9TtMTYrt?HuKbc
zFn$?t|3|fQ|HG&X2DZDhZHpi4+V&TGpY$?nPL}Pq>FXCg>`AxP{>%G8U*PHCDM?=o
zi{gJ8*RTAe|9Bsp!6U1w%HI}?|A_vgqyF1zYp(e7=NncTE<C?Aw$p2lZr!ofU+l$0
zroO9*{+*Y3TD<oU@4CeT*Y}Bf+xhd9oc_IHlhr4d2X&#J&hFjqWn|bN^?UZWGZ&Za
z`_O;bxBj$ruKbZ*CB1iSri+;u>R(PQe#2Xn%Hq1O{E6I*$M%1-{xjI^aXVD4^Ie=}
z%k%vA*T33dSkJfmcT78{`JajLMcZF^=O=NncAQZ8cxhL*cV?K!5&QZAhUP6PbNKuW
z&tKYfv24BUU)w6as~2Bx54_d(d2yte<Cga4lJ9K)Gn_a5sHdA(yU1<t*P~a@o;H2r
zDRW1AmEOgjc0nF2O-Fh*$_Sr$9k%9O>b8zU#|6FTzA|iMzHA>;^75$K>a=OoIUa@1
zII-}b|HHfA9qk_UFZDCIS^RXL%c`<X2FLD{oU0D=R9~r=y>j~B*-{F#&iV8^aeP1i
zpknpL^CewzsS14y-DOJbz3yK&nHRc*Wx*T!mFs5N8j4SiVS8oO_~mS_gjvC<MLy3=
zPF@O9Q7JsQ?!4co-lsbJ)^+n+BbzSWGu(bU$Zo361V;&G3Aw2^z4=Anomt+M?~-+x
zML?$T;2(RhS<gIN_M4dt&f#BMIQcY}(7|)opN~I{DBoUGxxn36?_u-g^ILPZI+de}
zXIIV5z5Bvb%JjLy+XL@vS1VNtF0SNeU^jjKtM&Aj*->d0vcJPkD|(G*s?7aWs=oiz
zI;|U1vlp*3*lits*E2bG_lM%fzW)s8yB^+4-?dA<%>BcE2Cs9`CB1yHGrl~RwLh1!
zX=l%!pBCpV4_dswQgXJiHqYNJ^VG!fSibc;_xo9XStHV$;$-V6|NQnx(e>+Fj0NRF
z9S@xR@}I#ro9&wO?(CW+A7B0mUaq}*)5JGbYtIDzH2xwKedMQ2x_0xICo<Q2YupQ;
z-iS?*-ItZnAG^kWn)c4C%6n!VJA5MfKZ9IH@13WS?Vs0MeQfQ0@!{C-_TQ6MoU~~;
z*d7yBQQs>oJbl-@*bjGKWZVkP*S*s2e234l|JdHh^@_VM`|Y~pA)oTfD$iD4wz>TK
zdZrIoAI+G1okv2OXTG1k;NR@)Ho7IsyEv8Fw(auQdgx(cxV@m_7{BQ}v$@O8YJ^^R
z;d8;NE$l?jmnVhS=5?(9>~`ZF$K#imc6R2hNuGM`R?u!vj#Ga8HbT5A#;*+59eVZl
z_}LRSCErYsl@u>t?Q#CjiO0&eMb>gxH9A8-7&reDZO>g5dt|A4hXL~sONBXg_JP5&
zRoB(e@w6}BR{im<W4V=dbg6Zxd`0ra`NzLJT2tG1FHG=E*Mn^g+VecWtO}Ew+wC|l
zK|)66@qE9!DYK4u=GxdVx}UvMXts9bx<JP#GX!=V-{+=1D}2h&<SV=Ch3q%k|4_6)
zr2U_Px$fwtKap2@I*UK@N6in~#;^8aR^GhT%Wur+&v-6idqQs0<a_&7|1&(;aDVgt
zuKG0oTRAnZA8d}@KJcGGq~@>NEkP+0v#KlcX3I17YuwUfjJ^?)+L=AcBP76n+5N^S
zyXFtZ-`s!1KUgclT`jBb@nKs(#~ZOHw{AaHU-ww^^-1+>dz$}ob^o@z{qK_eM)95+
z^W?1b>o%rBKNh>*Y}DL)$#LdGH-)$2VfRWm&wuCPT0eb`<fFSa`W>d5qt1Vqm^EqH
z<(Ja8`2XGcUKbwgzixF)(6Yr><xjW2G5@Xc@524<>|I~^c`HO-ev6a7c&0GB>fc(C
z$&MMH)MturDRevaJ-kSf{|URpL_w8F8X4F8Uz|Q@|G_uDL4MQxgX=ryDSzk@&fceg
zrABs5X7B2ItR2VmRhO()5i9#x_wJ@zYP?}%W(rs1lY}nz(Eki9r!U&c{X1X(!Ka>~
z;{B2EfQ((K-`j2<xBC0{^xHoDw;Jab7uswx{5|2osqV?2j&&_&V2m%zkXmwIuuej6
z{py#OGM68b3i-@!`JdssGw;*gGm__&2y@)6xhkVQX~6`evX9ZnW!_8A2|1jo_VS_T
z)hC-S&z~0c+4k<+YF(kNm#en=vn>>t)b;;-bkmR7OI}CWE?c=IqwL$o*ytq}Cl{J5
z6pA>kcQj%3#5qs;s%EXt{-_>*N!je5T-T+;PjBzz2tRYaOwV1Xevjkv1migC2U8|p
zK4_&n^}(l<cHb?%SH6`riZ&jv=?V9oQ1r_7=i{#b41QNRimi>GFAt7o&zf~@{pwiV
zZyQTh&%9W|sgkp)&m!(X$%ACmb6Mu!w}(w~Eww(k<Cf@>q#5UZgu<EU8Fp<i6pGOd
zzPx-JyUAtN726~H$|e~3JMpW`KYVFdh|rDas{`*HYi~E@%&%kp<8Wz8o3DPrhu%N6
zj=aUS)yq#6&$IIkm-xDlPvVZt0wDtng(t;d&)NH2uU?pC6;jW?Pw8cuSI?&($-hIa
z`u5+bnmYFq6QA*x6NO)Gu5&(o{X4hZZPS&f+R}Fq^(9L_?08{(KC7^GU2<5}w1-`m
z$%4kMQ|D*3X{{=5uuDFm@_Ze`ihK9|-Fmp@-J{fLN}-D%Jb1n=Wd50ys?eJyI|9TU
z&QugEm*Ly<?LULmxve_|eJ(kjYDt!MWZ?I!u&I-u%JtVrI^WstR%WulAvY5re_ml<
z`<&}H{xfXc{-*ws{B7l<v;H%*zxfk1kGJ1>)0TaGm0zOwCckZal(}%CV&An#cMm%x
zh2<^^a+#^fBy?ZadzG(_{<o!(<?F<mGsDi``&l^o>+7%Um;Yx-mcR9%;mG`r(~oMO
z@7gDDnQwJ*d8+IR|E+5m_Me(^YK`RDbyKG{@3NZ0&bu?x<KUBH$5t;@b$|52H{zu0
zj=b8B_J4$=<F{?yb#<$5^wFxla~IisiixO*y5(Ko!E`Srb?ZzihtTpKrUS`ZYaG_K
z>HkpK-le-P|I2UFA8XPcaWCKa;akUypw(K(pZS)mF@}Yo$ZN^V`uXquKd#Fkqdx4~
z*SzK=&%T6={|pZ;_BW}0_RJJb+H&zxXK1IrlGX}#2F9bs+xLG6elHW}taARr?~_sP
zpE)N#V%vY3flV^#s(H-<J^s^M7{9w|KTGwO+n(O8|5kR<rQiEc&i8Wv&%jc6MP=je
z*+E-=tX{IEz}F~C>S%vk&?$96W4G_z%zF<zq;kr%DewQ@<;bjK&$eZ*pKrYLhO1p1
zy>Hi;Yc*~P@o7AvQhKcLgskz=y4k*<>)d~=l<z#=6MS&nq*vah-?nAn7p-XermXk&
z=A^rOcBBN{`I*j9RbbeE`mdg@-m!DsJ{}VfO1Z7tU8U5@=qz`jj%n|kZEZ@LyUu;T
z@nwU^>lLP*<+Wyih0GV1ZhsiQ%{f`!Zt*tju-?9vmC0+Oe{8$&zpZ4`Ec1-B+kQKp
zKJYp4yLP^^j^w`NNd|>6zv4Otb=F=uRe9o=<H2(tU%$VPP4;~x`BvC%vcavpE|XWJ
z^4V-M&pRc&A))v1ipOPq*_YD;&zes+JwBsZy7LahfhV7T@LXT@M{?u#kL*Ww&*zFf
zq%{4=JgMtnEUtQ+Ma8N;dmyGVd0KWrk;OR!!?@%X2l*zi?zMZaT_|Aa-4|Xp$@t~Z
zve$73e;aKHli%{bL0|8_;j*1PLVD&YaR*JO9aDH%|M>O9cedGC5;KD)t!7W#D!u&d
zV!L%elxxj99&OolIoU4vN=CBe?_)j|e~oGz)VC)8yC}cqdB>N0?yUXX`{eHIo4)Y0
z%&fYF#d1N<Bb_|WF70Y~xjauYJ4GReadumYn%2`ghM25>d>`7TSA70EsaESA$2t|8
zT#v<{(qcZJew)I){%pL_pQx)zANdw4GN(^@cRT#u+~W;akJnk1d^ub9^YMC_u%4Gs
zMN+f!w1T$Z+FcemD|X%TC-<0s)VBWpR~Tn=RoR>)Hd8uZKepuU`r;?+H^smD?q6A|
z#w|GMt^@-ELt%q>t9+@O2oHmHt;v!Uo_%Q?{~6}}_-lCl()O?1p<BE3HH$p$&D<H1
zxA_&%KeY2@UTUOd(9Ii64%Y2<Uw<&4QMV2JEAYY7zB>5-#Xrvf8JZrxw3<5o?cPk=
z@9lbfbiUu?xu`Byu6o+&xal9&3pRywTb5m5;z{V+x&GjP20@pNufu(oOiNc`m1{_t
zJpbJORsBCKK0lOi-edjI`oZ<1_c^l6Cok``QC{V&I&W#lweo3imt`5SdM--KUGjHh
zTliD!A|npdKN~7~owCh2KJn~Y_@eMa$$tjE`=>9QGOW91^YP~5#WshWCVwk=dS-fb
z#DjOj7KV@KS$ws>wAbGE<M$4!SI2$Zq;s^_@WqK1mq<v6#LE2pp_6xNao^4-5Be=U
zmQQ*lk?g#8N$e`SBu^U#2FvFX2hL}G@wGl!r?g>zbIerb>gY_NN12L~ESY|$S8H<J
z)N8G;SjBhn%JnOWA(g6UDvB;H{<i;!RE?eV-${1DN8W_Ip7!Z=`{Ym3TXxLcc%QN1
z!20Gt@@u1Q+vcin(H1>6XFKcXQ<6f$LMPb&7S}Gf^|wjeAG|;JKLcOX59NpR558w|
z6l~1dBP?<2=D`O}OHxvJ-Z6YX_{Uyx4=?Mp#moE>+F6g@<SAHC*(2zAl7(^NB<<%}
zw_e@0{+DxGXHsb1pR@h#a+-T~Y@F{{@z5?<XCqs1@22D)CXU1XhfTjsKhS-9cfWK+
z<HLaIVsU&QnY9*A)z`~SjQCXFGP59j<$?9xYn69>=-ZjSa^wA+=clJ$m_Ic_pz^C5
z*X`Bs{cj%n_9VMb+f#SZv|I0ew{4D8D^TgnK7B*<&|{S~Z6@dUE3fA({(EHo-o7=j
zdJ<#3q-{NGDzmE})&I~4_)*QZ?zHu9YmIMn@+N6}^E~MhV7z<6^1%8#=Wi_cu~Yi^
z##K)*=cD>8_06fCk24a}c_w*m(y;0CnzwxC`os3juX|V4A9OdZ7qQ-4J2~#kQ@I3%
zoUM1+|9+m~o>yVH{{H$K!M?G|N2YzYQ1Mkgx@e!_^k~<d>Jt0jn(0E-8$HY1`2?d1
zf6nif-)c8EQT(mqBk$_#nTLNo_KfsQo8)3}^ZZJNH%F!y?&aQSGs(Z|>-`^!@A`{#
ze+T|?Y5P&Xw4ZZ!`yrN8^IJVdtG02TX1wx1c;cK{pX_h#_T9Pv$KH>^M+3Z+1%5oa
zqj;Q0X~UMwP5nQF&3~lr+w`BI$@J*b8~?7xOV)U$M*8lXn4NdA=c(eh40+uN>}Sdo
zn%vk`q^@hteW9;i*S_R&)#XqApR&K&tJXhQAZOeDi2d#FkL;0~k`Dh9O55Dra6oN#
zF7LLBFFTbAU(WfyzNPevuWS0`kS@>lNhgI?@^6$qcfsSy&STd9WS+16Xx`1=_s{6;
z;~5gqW3KC$3Pe2SuCDr|_~buB;ZcWO3H?Fy9qw(Mk~2Nv%=yo$#V;qnZvJ_F$#s>a
z^Wp4a!fP$o^?!H~biu|ndtF7`Wyg=UTaUO{&3M|O_m%&;^roe?Gn$XHcl}lTq4}SI
z<;+Dpg%{U;J^gz4aBhM5n)O@fG@rP`)L?x1>7Tzg^B=BnT0H&8E%&yPjwe_2^i&)+
ze%|Mne9Wyv%eI1f@`3d)&L5~_y;39pph7&T$z_tncfS|wl6!dS1tfkJHx*xJ-lzRJ
zPy12Smr2W=!gl_8&i>)9)a6n`!Cmf8?EC5;%-Y9(q2&CgOuoq*LM^5_?U3Gi@VVWd
zd3&xOmecy%loma?IK5CMH98~UVViYv-{A}YM1Ole>c6G`t^WE}_e%?}<*8^Y-n0pv
zuQG|_$sF0epSS#KjE|{1eSfq0;q~ILW=-$?6TSXs{EdtY%hs|8#NR%(J*q<Md|{s3
z)14Yirg9Y&6rX24aC%3#*y8fw_jb?a4_QdQTKLIc<)8F_hJ#Z3Ob>sU^!}0P{BD!g
z+;7c}ZjC;x_Ue|yhX}VdxBq-83siRF&e1+;amQ+Ujp>Jf8y~ziK2(%d_I9Ctm;RR5
z*6C9?=KZ_5+_Pl^LtRQjPi$G+p~+qU85~a5G5kCCPxD9Ne+G{7#**E-MyDe#^X~b4
z-{3!k$CjD(m8zRpE9kvCB5JR`UG$I4pM;P6$93)haWOtT-}q1U-=)icOc%a>#LMq<
z^-bNW-eqo+IP`L(yi2Bes8^S#%rAC(Gk<qZbKJ4$nKrSWhk}DL<DEa>`OLB+=-G0y
zX=m-`moG0~{&(Y_;3YrYkHz!k=%#rW+n!t3TWt9E#`ddUIig-hd|}w7cDYZQSs~p%
zzDBg~yUUO0C9xh-=DqLo4$9YXY`O8N;=I<O{g(S5tYpaA#k;Io?Xc<7sk;tq{ywR5
z?B@-6-&cz*zI<JOp}sk4+3H9BH|INEi(*b)arfn|4;8c7Pfb{VldU?z=wsZpL`fY{
zwO`xn(wz(|I-|GlU%%(a_ir)tjvtYiTDQk{>6yH>?{nYhg$4g-&`sXEJ1p%#L!<b4
z+j_3E{~4OPUw*e!nSW@X^!=?1+e4>T*RSZ4Ui_b7QODzJ)4z#b5IR)-*X}G&K&Djb
z)Gb<mZ&xdKmdQ-2IL4^1wwL|ek`4Vw?#tSUE-9$Hn7f8Ypzh7JoCUugvtQntIB6?S
zNz{wke<WX|6+LVEDc==VF)_%=@VmeK+{|s)SSExk&nf=%n%&X!SZ~_oCnu76EdMiP
zC!A-#e`$M9j^hd0kN+92t-rc-=cj8i`_frI?sMCEspNE1rFSR${<C5Ze+rM5*t46e
z%#Odj=#I^?T@4B4XHK8AdA#G8VbAw9`F#eGd&JYr&TgIbNv_u1?N#CR<qt#a*gT*A
zIPBBI5OAi);>~i~e{)~I*zoFyOU2a3zaPKS=erjfnH{LQxn1zbq-XI{p7dM2i)5O3
zTvd(#^_J!n>-@j<Tw1&Aa*p>IT_4}Ng*#qdUMM&7^~9L7$99^vKi<8U%Y!B3dsx&e
z59xx_2eW3o)ry*@Z_CQREtcMY_*X{5Cg#eDqq{_ZE=(|fdGh(zN}Ek{BO-4-7mYr&
zxXVubqkn7C<r2pg&c)C9w{%=#?Bhv!F8RvqpXe)lX1zR>ANe1Z-MbarCMK@v`J$b;
zI?DK;x1rLa>4&VQo<9^D9(i@q+_+=Uy(Xzo<XXM<c8sD$0>8u3TF3JXt?x6vb-47W
zK3hs4?L*!g|Gyh2oy+;p@ObLm@cNy3Ra?%@kqy`QWVnylyLGqtOm3SX&4U(PfsKE(
z_su_UwQcny>D!%KE$6+JIb?2q>S3}ZBe$IKZF#M(52tOto}CV!ej-q$@uoNb46Df}
zRh~a%UueVUS}Mo$!EN#CibIjh?|f38&Q)H@zWhSpzpLkGIl2~mCtrPdv-;c||DYeW
z=0~jW*1w&{khxy(y5P?_vIjfTV{iM%9WN`s&>UYE8C!Qjs=Rwkz0i;KetWiV-z0dF
z`Q>(_+cAeOY{<PB<CZwJTqadw*E^Z_!SU<kH}t=`{h*%xkHp14(YA}uuFNw0d3jHl
zx$=|VRfY$c7yK<gTbuj%J@b#Mip9IDBj&JLpI)JE@yegQ@n`sh$oU=lul0Hq)@<4N
z*L>=abjgQ{!`5ugSoxoU<?N5}->&~|&6m4;MCyBwsYi`@YW`EL_@83$t_!J2WnMdG
zT{`dKi97FvG|oA5eD9g}{2!O%e+HHb*J}iq{5b79?OtwNZNA^MjM64<+tW@<*7)4+
zJ9g(_u$K1<#gjJIxBq82XlGMXBm2?*H?vb4qfGnx+DUIpd&8f7dKCD%_?)N2*?Q-H
z+8h2ew9fx<?~`xknN86?ZDNykx5_u4l=Yewk@L#v@0;XI-MYu8AIZs8RBD*bk=j1@
zUgv*?ng5KYIlg_rCV%;vgiV$_Mn!IgJ<ZqGOMa7BzwnQK@i%{g8Bgx4db)XnhlS<i
z^$%x#vHzjbe_;0fo0q?x{CNKGjJYmm|CF!nnJRHxB71qU+{Fn@YfkpawNw>8yQP&L
z)|K=1{Hw(>;a_!DS4RY`zN=QR9)9q*<dvm=*3NsHTb$P;BT(S@YyPL~i#E1}A{#f)
zYk&HBg8hm0>YbwD3yv>jDE<06Zt}xcp<An*Z?Ba5TmAgcqn*XG!WP`JdBbyktIzlO
z>^iwdUTd3{PqLEv^{alKw)D4Y+j_UiD!n~^Zo82F->=ez*Z<DC`C;lR+gm$>KUJ04
zEvWB*8vO6#uaeJyEI01xZ<=n{bZ<dh-2VQT@tm&PJG<;A8F}9M{JyzdjlV6dd+xsQ
zBS8k%$15L}%g2ask^CO@>z#@2IosEd>l-io|7YN^@6Oem{p50KJ^MYiN{+mDTeaDr
z{AZ{>>-gjPEwl6z#T!NS&hO*z%e$}ob5qr;{&e6!EuDWhzg#YF%XiDoc)9*i(0>LK
zZ=n@`_(iP*`saKxS;#4`>vH1d=lPfRm)SFx3O=ge+VyijV~wTN*X<wAT%0`r;jRly
za%zq9_#eje++Nf_wc_Br;`r)+7cU$y{cZm0ve&}>n{C_|-aS5{qI%1o4eEWBLX1B?
zAFbiecx$v+fBXLHUtY!^`DgHOuARc#^8MQX8BPZNJ^0|6YUsmPyd_2PKaKx07zdf&
zaa8`#us-_Q#r79_*%_W+-tm3SZ|=w#Z7Z3o`NwCy|59yHprSmnfB7TrPd{DX)y;XD
z#B1)F$rrzzC3)dDbsPTrL%UC`^}RAbXWzl8=e*0+uguz<C#c|jcZ%@D^Oj#;`&G|i
z%D-dyGihOPte@8Pe5YGZq6HS`pZfn~_<7>-m21AoHs(sbvxw=b+5dcRu<*&!^lvjh
z1@HVf^V{0R*4oOFL6h%F2WJ^Xt^0ehKi~h<rrR-n36B}g`i$TI6FnB6r6FAO#dcTe
z+q1=&vh;RZKKSzWkM_J}TDPSy9a?+yT5S9w#$NZ}a~1agc0J2`x7f&Np7DiQ$Ev5N
z1s!iZu}ar|wn>lQqa7??e-+0}I$~C)n%kQ;LDFmenF6c2`njf$WsMI={#ng`R_9Nt
zLRI=&k31LeXZ<q-drBTW{$Mw?x!k<(*py$TH~YVP&gto^{ASw8Hgjd|{$w`>+3)3V
zV^f!2+_Aa$=gGj`1@A9^T9KI6_eRXVy65*L<H;|IqRvfR;ql_)iln`j3<<T>|4e14
zwby+3yFg9YLcPFx<KKJjAJ0d9(XNho|NiZp?IOY_l+PJA)$1>HlsPY*qi*rgT|(k@
zzt@hdWt-S$84BJ#5q3<lOhefs!2bO6h+AuS#aHBgvfTGd>D2LgEO~4E>zXH3CtP<f
zF9`d1@W2B@<@?v~i*9@<E4nBAQAUmG(|5H|(x*cM@7_9B=JVzJnWkkzSB*1PFFya|
z!_@a}UOH`@iBqO~zU?TPus%SVp~<?rYqLz>6XlYVmh1c<>UX|<dRcdk>C?0gR}wo<
zs_XJhVh9U8|Gm8U?fj@W@7AhZez$Dn4$BIaj2nF|E04KV%PqcfZECRZ-8*6436)O$
zvll#GRv&+As#|>DozNi9obP8Nd?&7ZRM`LdM!3nvEs}ND95#um7ao`1TlG2KsqTzC
z^W<-nf1FPJV0Zawn4Ivn(hrIk)vvyNI_uE4zvcUHq|ajGPgi-d|HbDS%X*ivsfVU@
z*Pj<#{{3OU<NfW+FFe1rF8WUPubR~>e)uJ3ufBa^x>V`8f`mPdE!!sdG@mhEQpCrv
zec{V`dxO@@fH?)9p3e3=yL!nlvt8?+r^$KG)Xb?n9AAHs{XfHlC1IaVev6eqI6YaV
zt^3HE-TfOT`#OI)A^Oq%t>JIRx~uk^?c102f9w39`n-Khu1{@a=?*#Wx4O%A`D>`(
z){Q;lGX2*4Ob_mTg3LmU|Gw3y*Y`-pzvcbFeBi#^mc(uRQW<7ar<NInu6qzZ(c?{+
z?}7fTufEZ47xy?WzE_ccWLiO%RoYVS+i{V1-8LO8WNFSms*}UD%RoiIwSJC;{xWvK
z2Zo;xKbw(N6fij`FsNs;-?_6VSFbL0zx<yeCHPWc`jh27c9!N{`ycfG<NLczsd)Li
ziHm+{ANkePX1(^h(^Zp~UnS-|E(^?E>Mn6Uu<LKhw0oDsW<{$VnRdPL(Ko|$OY4=^
z#`o_ke{*`_AJZS9ADjPi24+@Td^mnYp0}bu=0~;ak*?3GeT%qW?F!m0mZ@?n|5;na
z%?o+kcDK}hd^~maYyKZ<^N;_m&&<Cu{bBhr+06Zq^40oz`!>yvl+q3M{LkRBuXk!^
zs!~M6gd_8^Kgt=M(m2iW@dj_^s!xUWcUOyQ)fcxc`g+N8UHd}G-8biR{JY5Pccngc
z{mtlaq91NXtf|v}HBaV3DMxt2J-H8e7rl~dVP#`>E!ftXt0h0>*c%ChQ}b_I<_Vvj
z_2tjT)=ADUL^SOu$b^5+{;l}OW#iu^{~5C8-()_P{(Zxb_yhkLg!XJY{4VB3)?**t
zub&P*_$3&>!Tv*l{4KWI-(vsv*eU)=zO#CT<5KVC86VB+>sMzrzX=oQsjtd(OuiTz
z*~uVeyUzAujn~-%NnVNl*_NJL@0DtM+5hrM{4TU=Iop%-pYLonx0>4$wQPFH{`8%_
z=`F1`D);xqG+%zI+!J~@b@h2A%bj7eo9vnAuaEgB_vN>&)qVF%4==9umUz3c@1D{9
z&*xMkuG<=wtvI>XI&kav?Ur9{>O}wT3%(es%il9+cADwAx$E6`xy~|)6KS4Q<gPwX
z+p^^MWA>?q3Q25LldrE=+f}`jXX3+M>9!VYs%Oqj`eu9lWz->a!zued{by)M+}>-G
z&ygVY_<)_(wv*c1)vj3{SNUMfW_%%S!`EExz>B7pCh}r0uUq*o&R5u;t^L|_&AUbE
zHw2}wRXm;<x#z?;rkQq039_%}$9=ee`1SG+eOpsyxOUB3yXbY;sWV4d#ic@Txyu=E
z5jtZ0@jCad{k!F5>n_J{-uk^ar%t+J*1JRBkKJ0{)ZX)W(<FuOzDxC{%5DGFQWnJj
z$H(NxDTdqMk8wyyuD2KM`c`~V_C}5J6n*6%Rv+3A^2=8&cl_Ai@g?Fp^FgW7X)8;Y
z`(~G2pUzodH!F8f*n}lIZ;q8Eo%x;Y+S_c9$9{SL2VeV}$sT`K?$51f{G<G1@58sb
zdwA_uZ2U1TW!u#p<-U8ayS8oHHtF9j)@sW<QwbNr%_q6GZ1B&!q|><A{@T^!Z!>>e
z)cAgQ-&to~!~3Ig;o1q8P2NWRj@`avyU@1IhrRhxJFZBlJdJ$l`7Sv~RyymhWRhIk
zaiPrr3|smSoaO%3{PF$4UiM?V^4p($VDH{z{3ti~-^IN3dec{#K3kWtJ=4=O@~iX>
zg&i(JUK8(3T4X*kRc6z1&t;RWm7AB%z4*tYCh3RuWBrz2-<HMu@2%%J`zW{C`C{p{
ztvlQOuk>|SoA6EhE^c`I*;y_Hp_PZHMM|)7ow0FT_jbxeYyEpSLMAM?zx$t|`quuX
z^*^+x_tc5}xcx2Yf(>u+nk8~7KdK+!4L=-E5q7KM!Ij{!=ICq5SM=8_1YFXwzbSmM
zJX8Bk@6q$&lQItdlRWt0cFCo<sMpgae_KcOZ*>*kKH+|q(5W2?GM~ch7oOAJ%-`u}
zKJob@gFl;g*<~4NINP2%p7f!}gW-35pl`;d0JG0G<kwao|D!$A#Ih{&yOqx~F=3s}
z(RsUi`rOnfKfT4FqOJIRPS?Y&{OwWy8E&ZWzpVFm-Lh_Do3PJICQW@_ekaLOzT!d3
z7n$o$E9H8gl%(vEk%<c0+InxPNo&|SVZA$i5d!S$cY1z@TZ$eDYD;mGwmkTL{^|b=
zSED{>Nm*xHa=5m+`&)s^?6YjT3ntZ<1s83z_<elhJgcA|#)o!2@7{VkmjBSVa;cU}
zR(0=qm_jzNKU2{-VZn2pS>c2B#_A0<$2_;a6~19|zUlkohfXzNQcnzHPBY(gUv_Nw
zJGld18@vm5rm%*3KfRvMeXLw2e6nxRt{@JRPEYHiv)j|m4O9|0zr22L-?m*pj6W7X
zIySRtvDbfw79(G-123-y+Qg@}MZ0yLxp-{iZu>bZf$GX96Ml#MeN-|3R{Ftxf*;Nw
zt+n?1QMhDjYwP>=Ez&R6>LwrYHGR5Ul8;e!URc06>q*foO`kmcD08VW=f!%*W15Q(
zeBssl&k%j}L3D*wqVkFa&!3%^$2_0*f9U%+_4Rdm0X_Gl{w%9b^`}34TkX_#R-qx<
zRYvUB+|@g|o8DY9+U)ho*xJlnCeeNNk2G)7eVL{edV<L{Hf3)Vwe~#8n;KEv#D1!(
z^m%uk+P3W<o;7AZ(&w)<pDwsL&N!Nr`?yNPRNZ@bKQXd;2JAe?$UbY=#GrY5xfadp
z{Ib8(^mVM}*YoU4dM2HG#2Z-l_Thq!SJovR$aAYXyQjWfZtLg$oh38Z&h%aG&LU8J
z{P}U^d;6CEXno-89(rw0ba|qQ*Ddu9Q}1nIK`AMFc4V?-9Gs$W)b=#mf}!+mMcH<p
zAUA~>eU1Uk*DFts_kL6xb@|M~jur1EFE4xi^3?w5dDC0>hgZf%g@n$@x)SvDdHvG<
zSzj~#Y9_4IJ+fxvv4tD=&iS*-T&DEobLJ+0nfCdNKkjzsMD~1cuFnRo1G;F(^F!YJ
z$XRcX59y61E4S_!shIY#WUbjH*3Wu*dh0x0`V5W+R;X;Av{EK<?#<+|#P46^Kje%5
z5%KqIG})HV$egoCe|Geg`4e)V=S}bVc)Q>0&(FsX?oRw}`hjciT+jTi{r@lhx&NP`
z>D~|R=nX%jKa?LiviIz|*?+e#>g-u-CBD1qdVtGk*_r#xww>8=;NXcD+COJ}jFi8n
zsb{>)<nHbX9w(G1$6uTOM|AzeSwGspsc-wyx%F8+|BuCfvplC+8f?6;aw~h?v)Bb}
zJKP>Tn7|(O&(|hgMriGlW`-%LNfzw$tV<<L-zI9h@vfMuxifIL#ckWL$4(!4m+j_i
zpLfn>uDH5fQtD)j<8BNe<1Rk57drlUy-a2u*T&0_wrt(EgOOq4vx$0o2m2zoZ@YW@
z=C>)Sx5ODzdgk-~w!OB{V#}6*OB<}2jTWe15K~CMkgoD&{fhl5?^*8p|Bn12edy;M
zy;51DfFtrd(wo905;zh>r?W6|d|MxDvf`Bg!efta+vn_muwvGQ`mS4{i+6n563-WX
zTWMam6nDE#;iu;d<jdzr{ptR|wpb*}SY>e*CzEE*^J41+{f(06<CD+U_5Ei!=v(@6
zRZZ&kgcR#HYj_yu2)N&T7{<QSGH2eM>ra=ry}KI5Yxy&9&k2SXPs>)<GFr$-eN?pA
zTP>BKVXn5P+fM!Jv|pBMTa*k=S?U#WCm0@JD6_l!`t|!8hohT=uRi;Cfp?pAub6bx
zD$jcD0Ev`y7mi-(DQ-A&{a96#vE(e~ZAqP*)ma4A6nV<>@mBl4xnE{u|9Iur-EA`>
zqWyE!W{D&@v`%|$^L*;$Yz>+3l1qalEavqko_bNac*_sr)puXlZ<*gy`cppp=dLq5
z54<j3W%XoE`kIzn_o{!h_oqliahh~Gul~7f>E*e5indLUd{<$?{DQS!+kVrQ>p>OG
zLDx-%Y<{1<?eR{wNVNCp5u<(lG1ikRZU1Kf>i#>sRKmvaVXb}G{+UTl$1X=)SvGM;
zz{Z10dC!-z%z1tz{B)t!_30-*Wtg6u`6KaT`w_Q){Iai&4K@CmZ3{TQ?sRVule@pG
z_U*=Nd(;1M&V2mvVLfNv)q1&Po(;EtL<dX~Jy(#Fe!Fk(P4~F_UO&1YuiL5Ge~@43
z&RON-h1HK%2d(a(Us5q=n-RxB=F5`nm;Gl*Tr2cB@IOOS&7Z^%=jJPRJwLkb{*8}T
zy=Q0dbw8cFz3AN`w<A40*W)7F0uNf2m;LEaW{>{6DEQ5~x|ko*57(_<Uz74-{-M7n
z$9A<$%zX85^G43*w?UgH7;m#USa#qXyR2(n|DT}$3{ANem)$;W?LW%jSoLSt=eX7P
zVsG4!Rx#SbzGPdsWYX)&4Vw(}+HC}?^f~L!-1^VZXrH~}Pi^{&*)P_9HO~9C@zy4r
ziF+4bo@bhGxv6a1)1Un37}j6W&aFQdC-q}~;)B0wFHQ7$UrLp3-BNT`Xu-V4yu#Xk
zArq2ISQexlOo$MS7d<}npFVfo{0*1Pe*b4!Qn&vhKhM*heSCXfWe1vGPt7&?y7Nct
zhx~(a#<6LKAK8=(FWD#cF?8S50;e_kLiY|_*!ej?`@<6r#tr<B<Ja$(-(&wc*ZSe|
z&Klu|EAzKX>*hP|j$HHa!o{dNhK?4Ii|=j=&lL1}Qt-e$K)ds!{^7O!&hp~><X<Y8
zT>ZLxcD!(A=hV)WUE3p;MjTXV+~rYJc)f7_W)s=!L-$4Y@Ghy?@0GIa^4DyObxBFf
zmvqiawn_NlzP7G<ZrZ2y7FWHl{by+Z&tUx3X13yTFQLVnrS^UA1%5;ynI32GJGO16
z>SCYY+m5_BlD@C1r}@0)>p4>YcGo}X+RtM8zIz|rmLJvs893t>KkOIf-~LKYbo#07
z^DbTcWc*Co%3ow(PO%TSO<uu~NfHI@&z~Rt&v4WH;l9a_epj#Oi?E8#5|-Dx#ktI*
zS!PRLQV;_}%7zm`bz8svXE>05OZ>oomao;3Hj=CEytr;B)MjbFHUG)>ZCjf>!mC{p
zGsDU{%l;fWy0P)6=UT&=Egu6~VoIWKegAVlS^u==!=G1D)3x7Co&29c|IEkzH$Q)S
z{-2?#`NjUN?|b!Z!b=~?rn_yp`Yt%~vcl!4N5`%{*!5dyx9c7@?R?#dvr^sqjCRk_
zkh%Qje8+qyo63*3-pLD8tUo%>{$pA5qgdB18l}oARpD)qX6B`s{VF~3^y$1y9vA8t
zF>G+(DrvUibiMa~2G0C_BLA+&3zyn=++(_6vR3}6!O0|>)N<b4nU_zOnrIg2@?`k*
zZCcqEKFRf9=Qo~d3HwhkKk}aE#t-{{T+1K-XW+`*Zs;%mZQ15kJ|`Z2zaM+Jca59j
z)8k5R6F+V>JZ}1Fj-=b3&wHG|`ArJEYx@4v-g|TFgAaX_7WA7JDLcD*`M11vYxC~P
zXIsk~*B=ZjmDS4c+$Z<p?&f#iE55wfH9n!s`nc!&lSvluvcEbXFpkQMXZv#UoM`;v
zTSu=|*c<Mc6bIU#{!sqy{nh6m@!w8&`0)1GW7)0enmGb0!#daAJ!UO1o#n~bvvp5i
zid9Yh&v0;Ou1SPk_3C^MufPB{>pYud!RI9o_e}2dt$RN2^3#J4AN|%p@h{`x>3M5r
zy*q!t{>JK<jTioDzMduf>$K|kuCRNb>=p`LI+!Q2xyrJ#fuWRn{pq-`A7zuLe_Q(@
zg=fC)w#losQ~omu2(6M|=M+Bi-w}B}oAQ-^GB4Rwu8ugKw(XbeyXhvzp7OJPf7h7G
zpu&Hz`Tj!N>MHxAlIz;vx@XsOZ91R$@bu~i_RxHbwi7Q5+|_o@wQv@?V?XhqyKmSX
zeZA+8+ZH~|^*$W6_FVs}!%xohtXt|~@w4ya_S@M^`>swe|K=?t{c>@;vc0v2O4Wac
zU#oZhXK0#qcHIy8$7kE7<~8|RWK1(SwOI3+FGoVmRE9RgDKgI&NIVEXA@I`b+}6cW
zKib_cty?$g!x<$(r_cM}#VpP<)Mh=++<PQlcJ<eoRZT|%TBC2h`0*!A|K{1F+Vd8F
zRLa&D{$cp#ELZ5R9l}lz#i#wf&2;?V&$E@s4|DemSJ)plyL_Ix?#)hRdGj+p;&RI^
z9$(sJ&;G~m$Ig|nKW3Uqv3_0c^;@cbv+=6AJx-fei~Zc#Q~f#KrAFw7^JD&weTtV9
zeyq0tqdcwcYv|kDwYQ%A3V3n5eAQ|d!?xpR4$k<hwd47nrf(*9#8y1|b}`rYMdkft
zj`FSl6kMJLSw3%aQ;q%?xpdi_jd~vPg)J>5@@Cp^wDlP)%8yt*>wNUS!=O{w<mcJ5
zd-p6ZvOc4H<I>7kBI`muUVoNr+PnXe{Xu@F8-Jo>i-R|8opPMpbWe}agR`AXOV(?$
z>&j1I2oRSzXTVx?Pf5ye^P}oop7RruJ~tn$h;%NTIH$~VotMazg<`vu&m4bjUvbIK
z`|oPq`EHkO;+Ndfv)^jUt?R^lWbR36r*-1n0-gxo5WLa#lm9{OFUPeN(|voIzV8$K
z$fMCbDdMIi!>{=ok6*^;{=0tJ^Ka{_=%3Z|yjk~kO#Ch-so0k$d))O;_M`rr=lzBM
zgkOG>=aFo?ZzZ?jm7lX>Up<)oKCb7|H(&3S6`Wi1XP!LFyJgnQE;IX=fg5ETROU3e
zKd4_@`}ae!<HdJt7JQUF?6PrcUzm}=?zsiWEnoK}%kr<SQGW1qjZ&_4*p-KqDw02`
z?Cer<KFg6(ndFnuHj!Ct;t3Uj>g!*N*VP}i`p=N0-(%1G;G_KE-Ns8}D%QJAd+fI9
za(<p`&oWVQCXZykQ$nGsx;q|Bd#qCU(Wd^0h(W+of5B?6UrS3rUzJ}~k$qV7<GZy!
z*5R$|W?x@F`Rz}+{|pc8d*j*aME{6io_@?u<I<NOts8bt^3+QXX#AJEusl!4i0uNW
z$^)*S#>eeHg#Kr^Ip44CweLmUt!tAazAI#`6_Rjf-u`UbGnbg+pQY>P{b$J7|3l6H
z;QO1$A1rVGr|`#e+9O`Q*Ws6s?a!~2-Fol(JazBL#2p!RS0$pixoB+WxMO)|?ZNd&
z_jk?b*m65wxN`o73Ab6xe+s2m9E*9r=n3y(=4bN#ra!Oqeh7=~pR!TzQjqVyX@5-r
zoWEThr+s$Al*jHjHMUHT{%2L^{w4Rr^?zK33u+W2><lv&T`SoU?x`aj(ss+4+1Oph
z$WvNq_jT5;<_2a4kLTZxe+&K3(A;jHvcE@8aQ?%*r4R3hd+nceDbsga_p{gQUb47s
znRu>&X~mB7vrZgo-s;C^-+%sQ@;}b2OaEP*&$4xY$M(;Aq}Fa*b1jN>?~2y7?^L(;
z#vT@ypK-R(F84Z1u7ZHM)Gz06g?~GPA5MQOzW9&vg*_pr_R_Jp>$6_(nm3d8?wonN
zmvTENJ(HfPn(=vM?2(sw$y&>9ctmF;PyZz&&yl+JoZzZ=bLabiwz=bGZ+NU)y>rPF
zm36c7-*11q_>-L`sKBYo`r!Z8{o~;y`=$3-o1R^IWY+Wfy3>}Xf3u$Ey->#EfTZ-Z
zn^Jo^7&Yh5SovsQ^o5`Mwx5sP_*?iuyx)(%*_(dcet0tZM=5*n)*Dg2;YXsnU(09j
z?(Ds}Y342Ij3v9L-h3z8AhhuS>w$#$_u=XfR~(#mzC2(-LRFhGvux$dciG?8sDu=J
zY*8(h75)@e*Z%2SB`Z&A#M0cj{|uFH!^|%3T{yMRX(PLBUp3F?qgCn6i{cWMHzZi`
zT$hyL%~f`(NKy6pqHM|D^YKo2^}~~#I}O!1wEX>y3}43XoRZ%@ec`8)cwN`zTYKb<
zxZ4~mEi8XYy{ogi`FHb!KbPDXKB>3)Sr<>fywCl4%=A_VzL52nEc5<cU-HLibM$|P
zrm7<;pJg0B)bHWE{p)l5JV(`z=FfIrMtl6H+6k`meAqAlGSG8V<(9efp^}n6O>FCq
zRT{qE_H^U?sNYSebX=RPuOF=Ebv?T$&U&W5`org4OcUqHiEiHQBe(NEgR9zp$2Ccw
z4?L3;n|m5;f3AP~e(}=$Z#ALXU%UTE{pEjZza&p`*9@z>SFS%6|J57eU7fVXbhW|b
zuWNs2^YD1z+wypGt6Slv{flCL%b%OFqTH_b$M>bD_20aH^xA3m%ylN5A1oE3UtO4%
zzrfvceX|L#k=XXg8HpX|4Ci0k@4rt!;<*07elbPKWAjv*?^(}~sMq>)^YYS&h1@-*
z^3O&8^gdpyvbo~Qwh#ReZvEwd6VJ3t|Bbt6?ab331M63=mTEj_e2(KkgVNR<Cl~%1
zPHpe}>=k3aOg}9lEI9R?#jARmYrfAmb<b2uXy_}KYbZVWvg=Rm>4m@k%zP=;wmwJ3
zmH7+v%S$_}?}jkhG)eNae7yhXvyZ;)x2?GkzkIs%?u+}=jfqd2wekZZi~9^G_ATMt
zdLnv@`1kD>w%!rDpBUNqGGawp$6Jkdna%Te&q)cld38HzMUcNs@9(u9$ypl$3g<1j
z#_~^b>e_1>%ZufVL_VM2Vf*pk>L1zudp`DetodV}c0Ya62cy+HG8wd5f9YEsnt!~%
z>eZg=4}G5x-IJVu<ie}MyS0-l7ETllGYi&cd6AMPp^_pvrz+fLqxMY4-DdeZ(*D!j
z8SQqLJ#qUaCdtC{<hkvCh7(J~Kb>m4^JKk)U;Ux!PSxH&bGGzWy<Gd|UX5hYj?N_y
zcHS}Uo4xsf%$0uz7m`05TW@0J`rvBL%<|i@N1WaDWmcq~$`AV)!F*iuShm>Kjf)O@
zW`t(Hbmlji^SCc-`mLB4qXkL+DqY|HGYHq{epn*MfANp&!?Q`czk083-81QK%%a0H
zC-bd1SoYr2YF%+p*T?@1(#zX*YEmmxAH4i`b=lD^u8OLM6LRwkjN6vF1x&ioad~o?
z$GYh&twpEgp1Av_{_w4J$E))SRIL41%GB9MJ=0zH(0j+NH~rdG;>X+q3{IR+a8Qt2
zw0H8O=PiE>9|opYKg{0x>8onGce2KmpUx9aa_^a)kW4;kBczqO*n8)4?J%D+m!56?
z&1Cn_&+!kR#UHK1cO9jLmdMRzE#4=+cgtkY+tNLYr`kHo9&=n9=@NA8T)Q$0Q<3r4
z^I2#2#-6z&xnz3Mwd(38=agreAK$dW)>bQeg;VT#35JGucFl!<R;df#y}6ye?83dD
z-<Mw5sCy^;_QC8KK~4_0+n(}ozvt}txW%%E*T3qO^r45bjt>%23NPQ<^`D_d>Pi*+
zv3RcdJAaQ|FFC<itG90Pw)_J+$L+2jePwR+^Tl-a^3$!hY{v8Mgw;eHxbStiZte_s
zzPaU@HRo;|5Zip*&aXoL)p^@pSBsV}Hf!sZsfm;7cQcQZ+s-rpX1KXj)uhV*3{JDW
z6X*PAxNcV%dvBw4?D@=9OddP7_ISR2c6i49dF>V~f3w&8=wGNh{VnTbevZu=x{u~Y
z_oOGq+&^t4WbuzP;6bVAi}L#nHVONLcI>|VBzoiWSWVRh6-|HFh;qdjGwytR;ylZf
zu+1y~9PvD+yZCvt(YzP|jz4x&ZOl2fa{J%&Jdu$z{8zE|_x$#Ffwd>uy~^$HwLZ?N
ztxN1bKI?eD>qpVG_b2PkEts^PXPLT+7|UY@xy33~-&Rc5cL?@RI=Uix&&reMmv8^N
zmfv>jcbBS!k1-eH^^#h>HW{A!WZ>~drP$wDN$B<o_7$(}_2z^X^`4!wcIV%n^#{53
z)UzKs|3iK2{=?C?4^6k@yjJSVcu$6X+qNBrD>8qxF|bKzuQ*iT7A$FV{l)qN^0$QD
ze(YWOWAVej-JAV>G=KQ^`M33vUxo^v(q_Kv7BjUa{i<8cce^{&QPEi<KIfuG^H10R
z3{9eS*M6lRn18G7_k;SrcayFk{?8zquzkz+c}~h*vQ=j$Chz&eTPxC^y|Y95ag$x-
zf%W(1|Ik?fCiP?YBl(Uk_P4FS>F%BE_~YRN>GUoBn@tK%ug~~tWH(dU`}a&0x07w!
z6B4HD3QNp6T*&@2`muWZjU0Qaqz@85t2L71w=50(qZM>@Wqsl4S^8^gZ)UBp-*qTy
z=SsKq%lo&BA6nmWU$Bn-<YW1U^RoMo%D0O<AKk}2&-KpokPTg~lP<ZQxXZRMQ{`H*
zp4*e@O%hD@qV*3Z@87omP|Dv$c1nMwJ}BGGe3;);HoabOkKxi-L*a~j3bW2Wy>7yO
z@6PU=?A?x1Zz}@Nhno67%>N@(oc*BEz0p3qzRjvd&fxOh#2s>S^KPAbem<1ve#XVp
znQzzSEL9N`=uAEId4k3IL-TKGKdwI%FI0D>{6E7M_BZv*e@uS(b<eMvA9;JEdZyWD
zUEbQcbkd_&(dL_`Ju=x|DYNUSvE|<<7cDZlmey^4sNOVl^XZQ@_D3Y@B0Sao78Op~
zRdYJMx;QHEV!r8e!=qhi7E5Y6{^{RV|De&%;_ABnS@&DzdG(e!E`M3a_A&aVvG5Mh
zRqJNf7Vf<9ply<+imU;5RblUc2G+Fy3{9;ObvNoIa{p*P;B`{{5&Ix}d$;SHU2CfL
zEmo3HyXtIs*zMH${3JGG&PunBRyltj{qX%*eng&iPq=wcjryn9(~Do-viqWT|73gk
z=1J$mJB}?;cH1=FHI!LPScA{~Yvq3i7S_K#{~6NvCV#WPvOg<dyh7UR<Mhs&;B{G6
zylbL*_pZ74@|N4wl3mq~*|L{@3hJ!sFSWZW<YDGIP4LL#UuEmtB{&M5ALY1It}4=S
zEb;qXJbksV>eISkMS(}Fy=uCj)k*$H{>S<8KLcm`AED;s_8)@&+8+(JTm0Z{)~Bm~
zOtyXKPP=S!ddHi0PqTZM)o-1aHcLUm`6+Af1WTj7{olU-?XXX)zfu3d|L|F<<ByKW
zS^T*9$hzgq*S+$-X8#!ywq3}}nR_W?L0IKOmz@HOd~Mc!XT6`3DIpjBwY2g#TMgfj
z^55G3F34}(emKo4y|E^{%v7V~bR<Kp6mOn%#=Et-{<<RGx?46MSmQrMg`>f(WATQ+
zTlXiQzp4Bv{LTDF{x`di&a!X)Blz$<Uq(>OkDy;-TQ={y@b1mR8SdrzawleqHYly$
zF!9<$xrnE+OWJ;4o#8z@eBqJ}1=;8SN&IK9>J^=TWY*PbjSEjR-+wi$N6L1U$pN=p
zy;oN9gdKC`5&eE*nFF&)=5)=*^DpAxw*O}P@%|gr-^Fk3m})YwY<XLD=SAU<DHTnJ
z&b_l{-^{BLE?2bs^b_vv7D2C1_ET(5NEgkVX85<b?q>Yf>4(<;P`!V!p07swgZ+Wr
z@}u{}Kb&v99eY{Nq}NdO!@vH&Egxq*xw3AOW!l!#1a)(6kv`6Qj?x`}&HgjAHs`PT
zQ*_Zz<oxp6=d;)SaC;xu_9{SS>O}pVh0|^)>+z)ci}aq8Y<j}G;M&w;PxFcwO%kjk
zORm=+_-FYi|F?bJsd*fKo9tL?f-bz9?e=4P?IY>6(#OoMuP+upU$pJIer2ZW+H2=G
z|DCz-+_eU`bsu&-Y-wHn@%^J+|E}AaT>T?l`rE0Z{>Zd{N|O&)ski*G(<`z5t5)lD
z+^2V~PVU>q70J~*Z{|s+8m2xqs(G>M)z*KF^SSJlYi$1Rx8twye{}zdKF=-p)MYh+
zlf0v)4{fiDeb-uFn3-CvY^3#f<r9yk7VOCry3UDM*F2X$GXGZbBmTEDAKJIYOa0?q
zH}S*cgY%TG=+ziL{#oi_%3QnR_!9s8wB*gqXE$d)p7%zQ^Vo}NHt!PWmG)-d^ZKT>
zPCQ(;|B-yee}<-_f49x<DQ?+%&5osF(e<Ex*K)T+*j-(A@Y%`Lw!33)J5AcM)cfyT
z$!ibnZ$4%?c6rId#d513*8foc&+tb?{fL$76sh_Hxp{_V{bqAB3&mz;Y;vBo*&;LV
zlC?YIrl991COJG&+JA=q`{V@`iy!mtf0((Izb8(<{qXcE|Nf}+zJ1({1=FK+syeq`
zUf;=cTk6%VfOqYz5fd9Dtgau+myLY!&u-q$T$}qG6|dbcOg5N)cUk;gDNmo~Gm^7U
zT~WKO&gc<#tFYPMWaR}h;hFQ#pZ_Cl{Z07q%$maACKZz(%fG$*;b@KTN448WXI*XY
zNdH(PUbSy+?%%m4W!Jua(x~oyqAhmF<Fog>J8MpaTwn9=*!_+AZ!&+oWc+8?qB6_A
zxo4K``(FJLey)43rcD?7HEm*g?y_4}f4kpiO&2?8s+lM0&2V0zS6*YG`<s?)QTto}
z8P>$eNjBZ{^?DtAd24jVy0q$y)On9xw``Zox#+IFXmganxs4|d%a=SBeQd{dWl!mc
z{6q1=|1@giw{6(Cf8WQc`&Jk1N;zx0VAHOC?=6u+o<W)t9YrbWu1OEi8MxLn7j74S
z_GNR;d2V-MyZTH%mt}9Jn?wcn`*m)4o2$F>#i1T4-}&>4{++bnl>g@CZ?-?`KR*9<
zt+BuSHP`!L?!NwYKej!)bx=<)f7Um9<*-Sw%x>i?wpF+8iY~vq<@WL^v!{mbjsAA+
zNBoEIN6+6}U05UhgZaa6@5#sROFiz>XS{psW!SHhF!6~8W;I;VUpL9%+qQ4lc0Zkw
zTQ<?zMeuHu`L+KHTh2{hP*eV)|JeQ;?>@PHUiPCzeWsPf<xr_5f~WfyR8Dhfd%&dq
zH2$Xlx9LCXKivM7^ta=m&Y#GAO~<Yuy%si4G}bLV;_ch_U-kL@l#M*zernsXIl8E*
z;L{2VNs}F1>x_-g7*y;j&HU}3UtMfnbWU$g$*t@Dez$UjT7oi_fA)YbBdI@V_Rp^F
zz^(o5ru|*}Z{9lA|0v(?*7cZ+HBYxrd&Cks>)IpBL#KI9bXTjDui2<<k+@~SkM$4s
zt$k8a9&}0cE>rB1c9sWiJsNWV8OrxBe;9w`_#c_lhp+GR|7SR8nQPMP_5AR!)YTRL
z89e44I(g)Iz-}SWf={#Erui-k5wf{%E#zW$T7%U&FaGiKZ&}kHJbnCXmip1z_5#sI
zm5(aDu9Mx>^e8*$&uW=nu5XgKS1|Ib^zvTadsBXQ&*aAV7k%Qw=N)%`u?yR(D%CxG
z<*TUt&aH3l0@dc%+pzl8Mb2TKAHc`|NbB0t^u<3ez0!3)`fbs#jNApAJ<TO<IA$$X
z?8!NBNb|r6^((X9|4ILC{o_Bwf&S&MrSz6BsyKZ3p6aGtXP2vAUM}C#9I&Y`t#N6e
z_KGtTVw{ak%(t0Kr*GQ9CdpkhX`k!UEpf7q_7Byz&G&Y-j*1K}VZMK^`Aon3dr`Zq
zT?NxNvY*+K-d6G6@uG>W*2O*M`3BS81wLOmWp-(&vuGw?(azLEk5wLg(B6Dy>wUo=
z@()?oKiH}0FEGcQ+s4!SaJGhicc}Jcr4x*WTX*J6aAVDQrF1*^L+Z7?%kCa6Oce5X
z_Uz7@6D#%@uRD9wy123Dn{0N|hmei;v#jd6MYo<kQfB0pI9FDT<I#MbO{exoHm$oL
zE^k)k$~Q%BlA38u?8O^Dnva?9>WQ<O6rMKiefZ`{HN8uZTnjjRUM6+J4T&e$&s#11
z(yt)6?e0wbewjJt>(f8_O)g&kYMx4afQt9Zm%HND?^wZOGdtta?*&ukbu1)Qs%L%B
zjVhE=Dcm`OJ-P4s^5t2-<g5?*p5~5xs}<n=?{3WckM7|N$qQB_8GQV)IIR3X!}hf*
z|DOMlFRD9eFPiwn{iFJk{|s`o3T6K@9M*5I)BY&e@pg`El}GNExfa?CUOTO(EHu9I
zTvBOYX#2NKKRTBknpL*=(SFHS<zf%qbsz4%8ga*};L^0uJ3n*i&ilExpYzVi1^-Uj
zseNRft!3Y}r*ct-xVmi4mRP;l@x6`@dhVU(Hc#5P;%HHF$Q&L%d;5>;Pir4DoPFVM
zzSfFWn!dkk?<@bm{C1yeP1*<dBmOtnAD8Ff6I#0N$0U2nAL)S?ljjFs*3W(G_rsWd
z%BG_t0V+8yOI9qXS#`g9*1yR5%(vp-3@_}{i20-N@z~r){Ji%v*9#wBmC<zT8C%~g
z(H!qgZRH7TuN<FzT;inY@3{}||4{$W@aFx8-3O)KACt9s{XI_ma>-dIk9GN_o^ocX
zts7F>OkAcGREC}S(<pzI{f|iOqyBG;uPVAKPCD!#&QdQvaq>Kmch<9h)jVf!=ra@9
zAUwG_YTKl1|9oHmjd*lg`|32g;8j!KRjfZE&t7Bm!ESf{vKotz5g$X$Gi;9UxU7C@
zCfmbLk6zw>_I_$k_4BUZx4-d!aQ(OQcgzp<z}+6pr=1Vlv1{Jb2#;rmqNkl!D?Dlb
zG$(;^%e)=yPb@g3&bz&T!O8y&udly3|3^svP>+39Z`>>68DDN^%Eo6NHt2IaUG?uv
zZIQN5)VGRqk@pv-ecfft{Etg`)$#g|`A4>U*c@Uxvf{br<derQe~<XKzTr>iB3@n{
zy~RgzSKj96i<Y<2NJ(HkS2%IrpQ`XH`?s-veidhY^_JS{J34_YWtmMb8J?^9&#>nC
z=k**vW-c{byX2(U`Flr%PpSXD$hhGjOL+VAqeVCS`6Dl{TGD6ywjeh4r0kJn0v;Zl
zjCW`WoZ|D4j^;m~<nZMBh5rmpy7}oJ#G3LKMyg!<>g)FIUQ%63-wjWmF3;Zw=N37>
zFnjQT!OrT!*SX&(oG#w5+FAQa)9o0&`^y|H-dSD0x{u?dNtIsb16ie%Hf>*V_jx~`
z^A*b9o>!S?-gZlH@gXsZ1oQO5^QX5~1qB3kzE1PfzFX(^yk$#uK2t@zpP8=UwrhW!
zm%6efJm}bSwMJjrny-NUL*vo92Q{%Dg?{*d^S`oYlB4viUlNzDwBIUR5$7;zs@*c%
zJJ0q@DPPE4|EK!FS(Z6#*X?HcXy*3bNPa#$!{4XsA0F?mTk!9;z@3c$44b#jUwVdp
zcE+t7-SaG~(<Q&0TtD&5^YcMkvHn^HffIjB{rK(Iv;Pc-u5Z3`=jX=rE4I7~?Up?g
z@!s<F0cN?muiwbuv_Bs7Bl&@Q;~w6;uK1%-Z{MEeGg>b;v(oyMC5w>g_o^P@Tl-{x
z?34T>s=*+0$0cO)>pA}t=7e9dXRs+M$#2`wR~ncodS{-*#X7~fsMQ`xXFgBe-d}m^
zj^cb}hWRJLFFjl^Ps||pKf{SN+tylKS@o*4WzyHo+aEXnwWvE*&#*^wagFxHf0jRv
z`$ql=eDp&)yfQygam$N$Dia@caV%wVc{PdQQ;($8hutBS=5M<n#Rh+?6v$q?@XqU5
zvVV^l#+$CYY!l@5<8w-%i{XsR3e#BxcK1~r{JQ^#y8My1(U11O@qBR8COlPi%Rjl+
zKQ@<yE*&q~6<j+v&talS>bEETGo1@0zOFC&@$^B2ox+byu}{Y4(>AGWd@xPYjpMfH
z&Rc$OcUsD3f6{rEEf{)ezgykiLl&*mk9u=2%6@Opwx|B1ppEOtWtZOjpHa(}4qD|Q
z#ME<Oabh3eImfW)YyE$l*3@3C;hJ^)@O{zE(YG?ImOf~6Pgc??@_wdq&*JzQM_c1r
zKl;CIxMWlRTeHT$>(j67?zw90UDtHoGI$ET9{O~3&v}>PykUab28G6h%x6u`_eqJZ
zeU#m~CNS!L)Yj+~GYnmhr0A?tW_YW>$7t(mYZ&MLYrke-;I{Ug=R3r=7W)Uk%D?sf
z(Z9VPwI7$*iGO&u{XYZ8`}W+oZ*!OJ58+oiRzLsAK^F0}&>#thBJYHx9lFxr_^)pH
zS+c)JN^bdzxYN0%tarqXv!ZHmx3#Q2#-sIIy>a5STU9kTl&{n$pO>w%y#DSh#~$a*
z{|v&;pb5C!+RTjVCtIF#EzV<zpRK;%^i3Vp-zD}L{*Cju&YgaE{mt-0x5O6OcfV8G
z(#5f5wf9Z++nQ<jCTlM+Tv2|<W*@^z6^5!0TeX6wU(H+>t@~!{zrFrJQ+-UU^7dA$
zzplUd@^xC>zxsoE{~0pZH{G+Heq`6b=2E3s_iwEHc0)AD;5N7A(gdE38lSnXJ)7Rd
z&!5e<e~zux_pl$of9L-RxH36l_L-Tb@mfDsdhe+PCQ4{3@%C;Cx*fr1_SRCd^Iune
z7JtX(KW3Lr<vXITH|PA(eSBXy<3r~53pZ~^MxHLuldrjM+}kPmDZK334F~mX=J>Pk
z{|IY`|7U1<{%C*qo^WHENpVrN8+Nzy1P5PLE4e4a%KP-tP6oy~4;UL`EBS<@cFZo>
ze(yiS1Nr%d_Y&V}8T^R$ufBD9f9SgQ<NLSje{0+QpMjNS_qE7SJ>}~{mdVVl>DxAJ
zoSb;hXzf#D&2!cT*}rr?${q>(&#>Wsulk2Nh3oMLw{3ftab@O}^Epzi0gN`rhOvv+
z2UM(ocKBPz$J8nFx86TuFZG{cP3T9qWq|=HKc{UlT@g?%dvW`PNBbAacg!=3Z~4!_
zT9dy1xYDs(b<>x%q&?+!m5JzWuRVG|?#KE?k7oIWY`9n}^w-4R_~g>lLH=icSpVak
z_uXpR`tsUut?Yl5g5Djyx##q@+`~3=1bfnZzP<mlz3<EZt#w!86!!K#lr#OX<aVgz
z389lRhj+d?V^tid{-1&6+vP=9zQp<mwb^by%5vR6Gk>=6iFTeJEFYe4V0qqm^?KBg
zNv~u6F0RSecKfhw?qb!ZISF=$rNm=CZtNDYYujlYv472#?4RK;vR&7wr~f(sIW4`j
zKJ9$_e}*mJ-?Bd1&t2nvIq^!)f(s?aEGM;Z-;Itrb!o|Yo>iPqPRoj?7Jk}s;Q2@P
zfQ$P~{up1;uaSRnyElnf?AWhQ5(_u%+CI&Q^-PEVB(L4#THLaG3>6D3<S+Oi;?0sZ
z{?_?pewiNUBx_qEk(j@SI(3@o{XDMxas8pf$EsIrVpp8jxp*{ht;r^DMMmb6W|cPc
z%2SdjpRK*m5;A4y%k7)`=B@bYr@ZpSqbnul=6j?+o<ANZ`(yILxsl1@0{dQG`gO?L
zbF)mn#^>!C6NDsZcIC>jK3@9%=KF8Gmr{RxUVOV^(V=X^@^uayJ@Z&z_3JznSk4;H
zb8fH5gURQ#mtWeGy1ZilBfB}bYV1;5x9)b&m3cki^!&T;B9_*kHGd8iuocdFzEA3h
z{J}V-zbpUfG9S)oTVDL=N94XkHcPtSeD|+za`<$!qoc{|IkV(B-rB{>m)v^$Fa5mJ
zTD3<ztG?K6{5bvST;=2SLZ;sK9IpcI#J>D=@22<ibzzC3Tkl-lJjFVmVgAgGJ&!Zr
zR8-6I{eGLfva&geiSN#IuF8WJ&-=Yz)-XQGXYiXfzipquOM|1OYxnG0w{+#bw?^kS
zd8K_eGE{D<+$^J@wa)Xg%Jmh0^tNC8<6kw8f7g{u7Vp<B+EU%Go0>K)Db8u*GUKfw
zxy%+4(w!>TkEF%;M)ibRxKGvJ^P5MWJMoperT47=422)xAG>SkFY_b&$gH=2_fOcB
z-?BAQw0!dKqdPYl&S_<4G=CzuZ|?C!{~0#tbn_qI&$noj%k`oowVc`BE%v{}m)2db
zyKtZRt({Db%EvF$%@^G1=gs=KbVWi+#Gf5Yc{St<H?007Ji*^${bBt^@#2U-bsu)0
ziWJ>CBY?qDF4-jEpX%#-5BHp^xFtMi?%U*3XAA@nUk!-Pa(p<YQAa1G;AV7&$CJ`e
zSDqyNHGCg`P5h6L@bP&vSNEr{=YJumaP_+X)j!t7>w3+sJCijFm(KpQU7+JhYL4@#
zmQ?%QtQA^@@u$ohj-9)9>sI{Kg`I+XjXK1Cg}*j`voGzc9qW&>OA*r|f`hN!ZDu%m
z^p|0bOkeTD<3-uKJ1l~x<+uIn%`E!ro1NCTPxA4qo2=!13+3{9&9j&PEwf*}w)mi(
z;E(AKtk1XaGv3r4a$#$B{$~HYpPV{8j6sqfTJAh+mWV0{IIcgrzUM!~2XFqHt9`Dl
zd2f<(Ep=LEk?Xy+#U@_j@)g_PbG-bMGVj@b7yIP>Vlfr_ztw)Ydu`F}b!(L-`_G)c
z`{s#@e8qR2=6pY!_3uKEH|yRlWmdV@HkS4r&rEwU>EwCED7Vm{iYK%Fd9^7^PfcF+
zVCB`UOPM!sT3g5byLl+=aGHfx#7RfHiskEP?fiJI&5o}^{=m2UY<u|2_1p5+-s7%S
zi~b&wAhhKb^I;R8r;(|O-}gz>{&^x(*ZuFP{brW^JoWkV!kPA4@(<574&487?fhF0
zKI(pLk(%_%JX`9t^1+oqUDJeF(n}|Fn(IA_>#0|^)5*4)c`4!QyBeigZtFS~yKX&|
zJ)~{M_OrWViMqT6$6*_;zmxtmG-dv~Qom*E`=i%Bu)obsDe10NcedI-RV7;_Y}&0V
zlkTG3p(2$RPTZcIA;Gn$c>a=})zxb6-u*dmZ?o>Pe`>1O+U>r&FX}DoKNLLgDOukc
zzkU4?lZ$I7U8qRnl|F2=Xw!t}p4)zVomjO)@SXXoMFtjv&wsrBaNhq~;+9RD#m_%|
zA9nc5E$4KVk9~{TukG9WcZ;3f`s44r?DT(}U+F2i>qq07yRSDMYgny2<<m@^BMlQm
zk8WsE<2@JhAR+vOR9d5Whskb>cWjq(PqV+W<lZ8mRD3)z{(7VtW8$V;CacyaO{&{=
z{iA)$j>(d5H%o0^_GRC^>6bs){`~sv+WR0!qa~YJg4K?NTGxFRyfd#Z@A>4|<4sR?
zdu}v-uU=mNP~y*C?S{*HbeUe7T@TYp)@htE?Oer^{=%*=>$x)jGo<eiQ+S*xcYtqC
zZT5cYbf=iT{WF(aR)?Oce%_jQSJLLm&;F;!3M}lVzTee#>y<rMjiYeU{^ZYWbuj`D
z3cuW)^}(LUCFr4uoK^GnKmSC(T<iGg``~ZdHMfISHP0trmazH#{oDGpuU*|T=esOV
zEvd=;ZJ&8|<)5eve{_x5w|^AfwsFZhey8bGsy~j|J_%vlcj`xB#jf>DC9wg2j@8;-
zi@pE;P>=uXc%^^mqI#!I|9Jbr_Rpg6`f-=v9?Xy4={nE;fm4ya)UVSI<!16Vet7MA
zq47V%gxp0DpQ@yN4mkeGIrv@lZ}pe5)u-b{eZTg^-+B5k<6qG)#|uG+A7+&XP5OQ5
zKZEimk;WiSh8LA<Uhm%0zKl2d^ok<CieJ~iimt0Si7nOq6KtRJBlyv6jbo8tydN$2
z&rqp!Z~w%A>`#8SNl%{?O8;4SJM(zn@h0uBN1ycvZr^n|^=V$N-b1Y_*>9ItuzytA
z&-cf2^~uWR(RWT9o#rv|_)49HyM>$2)*DoOb-Qs(_&s;++5ZeP|GGXfE!SbK(3>3J
z^`D`kYVFZGmrm}lKjU!B{+#8y`46|8wLfC3XWcvL>3zoQ1&`Ei`r4NjWS?|ftXR}L
z&F`>;-Tl8+U+i1Ud;ZyPP02A@(zhUaMZlgqo_ec)RYwkg&-r^*<?2~`@y_U@x9)eA
zZ1ecfu*sCWcGU_qrgMQ_j~Q|^c1paDs^>m?yuD5#!n5ME)T>=F)1{v}oR*lSDJj{m
zxUDksh4GK@&9N2Q2g|C$w%RRI@%D9`R=v!~;L|C~(og3@f1YQae9kzo{BeGVJolIK
zEmum;n*a8Db?U~AL*^$%cXVD@cGJRo!<qxKOM2$WeEBrBK4YhlRl$uJ$G%0+%UqP1
zyRu^0ZMTc28m62oolm28@HCpM=)Extjkec3$7U&EH|d3)?8VYZ8}<5Co-H4F-&~B5
zk-fOYXi3h)oz`<KEsx9nxvsge#(DdPZwq#{PV3HUVRPIS`9y1tf!nj>Nr#nHs>2s&
z$_v;SByMZ=x;TmLvSWqlsfnERdxDv5=K0%Ay&Pm5wWaKlvBdU@#j`T^7|ORRZ`-eY
zvOg~O)06h>R1fDx+l=S#K5^prafOmKt5?TL+`Dhq@vh{i+Jsw`ebKTUJa=!WG1^w8
z?K1n=KJT~U_RDL(dwgb?u<-BWzu%?5*PO9X|FACn$gI78&&_3to_?y`E@(|gSJ#cZ
ztpSTSoUgAss+*(Q-}mhA`nmE=3q937y?J(R!7N2(hP4(Q$JLClOue<^_?g49#Q_z^
z9WR&ki@g%FDylU5cq+^!_`r#C;<jvlhPM~2Yd^Hls#cEM<w{<n*v6KhDmS+oSvOS~
zJ^7@4`cM3t=qx+^D_eE#LUwGQ6>xD+?$iVko@-NHdc6@d(|zS_yQJGNwD7Qukd?m7
zyvj#g)wgcD@=kYc;>??gTiVRi&r9fj((~W{Fott);lwQh{GVR_D-O#&KAWTPz<IxF
ze&@4UFSq4<oKPiqcFD`&li5a_RdRZ#@_uUK>c7BeeCLYUt==|CDc8sBdG3!dT%X1=
zsVHgYEr*bTBijlu6xGZ7X;tJr;JdVI^>+5DU;bEKs}GCbR(x*Jww~{{nn_~wYR*qR
zALPdM_3LwmYu|hN+ixGJa@(Gz)RkT9^x11i#$)YgCL51e=kNHE#`$c8%!I|FPo&b;
zC~T-TQwd55TDon{s{WeC>Ng5Bcg%Y1e`U)P))_~(cd&o7VR@%g^)u&yynoa=k$AI3
z3oY)tx%GU$6}v^rjHkdcN6z}6!uNH`$IK?hR%8cn?)h`+X3R0Ggv~Aw>lx=Q{?D*B
zJZHUPq}<ufdn+Z>WqwutzV5&L#kN^T*7Ba|S#g71x{`N7Jx{&W<>}LluS}J2jrqpk
z7j`+W?oyrpRo#?O@mamCw~E|c&&^D<mk}@*SAUiL;yzc_rMoY8eQ#Z0yz$DH>}eg^
z4Pwtu=RV=NJ)?lf$KpwP<E?#3Kc=pWa{p-Uc{M**D*i1$$B*KWO5yjF^OMA$&Ja8)
zpBlhhIxF_r-WA!~41II+UaHJEnP;|Zo2`4{r42_MPfx#C=ib@Zw(7{|*HTOT)SBL<
z+9bTUX}-PV&&&Rg!GRZ+cbyK{&-b=1WYRs!t`#;iTPg$mohSHbeVSVx{?Tl5g3q=S
zXIA$<?4El2$_AN|U)QI27TP}Edi3F$_Gc&mg&HhayK)^f^SSkE<yA-Df7`dSa-}8f
zy7Wvd)~Edo80wgprp+$RlPR@$Z1Z@n*6tb3GCY0$jy=WK?`^R=(!2O<)$UmlcSA$u
zxHf$G^?c#dv#H5<Lmo|?c&*0ZN9;%T$MSt9>s#wNzgXWFs%Va#a4<D7xzVPFF)dNq
zBvZ&`arK!`ZW|dSc32nxT~T*l%>F~v{APLfH+zgf2K)ZV{pcOAvH5i4`#tWp%U?Y*
zk?6CYeWPUCmOayDD%&jl7<fKyOR+cn&v0;m{pRqtJ*FSLkH~K={gYj|`p2?g&kz3!
zd1rL(SJ+hj$t5fNx$;U`CY(6k`|&8(oHwF(>JJ9nKUfwoTqj=RvH5R%eUeA|m4Dh<
z8y9DpN9C@1CBCa*X5hok8@E|c+{&pmF>O+0;G)fqlRT$z2J}D3m)P-K^r(!_k6_(H
zmsavv*L+?vf7jKW_l+_S8D6x`R@*E1{=o~4puOMirR^UquixhWM@0OQddJfr-oGPi
ztT+A$X1(<Gw@8#uaZKEy8LGiY!j&Gsogm!ypTViZ>x0U1je3Q7*NVzlZGJqD!M2|3
z@0Snz{|LVR$F=yk_ub47|E}0s*~x$S`}fxU*!5jC-Yb4g`*qHDoloatXXRTu_YEC3
z#vNHDZK<`J|22R6{s;5+e{kCWLp`oHc}3l|d0HRdciK2Ae4h0DQQY!;lfIWHvU9l%
zrfrxi!!&K_iDS=`Jnb*tlltiAE~8VlXWd#&zggcGdxd*1y?VRsYyOo_g%O<RVlLhI
zr)grn^kd4Wm;3l5O>gh$yQ#Zn#gi+`gZ%E#l6IXIcwT1x`la>G{~11b*5980=s&}o
z#0U8Tb?4*d>R4)AKdwJ)FBE6DG^b=gN7m-E%kSP%T6@cO@7W~<cOvhKL`txK4k|jk
z&2_@h_^tLI{?-3bu|MQ(yr9PNqw43#Ta7ZwhvfvWw9X8$__Va^lEhs0q&2QZ&;Rj(
zZimSAG&=rw;p0o32kU>ht>5<ey7cD8FK6p|yN;Y%w7D}P#w62L^27OK^*?k?UuDi0
z-=q4#{^sK2^8_!~gg*4xV$UBNmofRJvFnP%vUhjxy>k6T#Nx)}dBS<Rv#J}E4liKI
z`CR><;fLkPlKiIp2lG4b^L*((-_`6@Ygg;_K77;Wi_0^W4fh_owwdip(&vzwQD;LR
z8_CYAJCq{7c9!}d8OQ$&EGMo-Chzz-y=#rRz>>Q^!eee2|9#eXFMxfeEo;@3_zw~O
zKUB(l;@?!=KjzQ2_ynV2_5|s$gU_Eu-%dULIA-IMz}=nqe$Lw4|6Kf`{2!V8kN5vc
z=EdJk`+jH^f1gdLSko^aIW4P;j;5P$Z(Viger6|6r|y+PQQmD&m39<F{ItAbUCaEB
zyZN_oX1we_p&#ciADpE%pRFP;pUt25%64nhkgIZsttNZQRJ1;v?%#5p$JfMvrs&hy
z-;4h>zO^&2KPY5p6=OGNpUMx_M>C%W?lYh4Jk4qO?^CDN{=ByJKf{~C{|qeYKW5kG
zuRi-AzGc_aJC0%8-RYOZQaFxIKV7jbEOw2jw8z0`b5>ufcDU#~P4njb^Zu>&IsX0j
z{QJ{wgTEDiIC5><wW#*aq>l+#1m$d<ZvE5V@l`y!j3+7L$(~lV!`it&C!|Vqe|-OT
z?tcc>nSb}!sbxn^KXCl|mVTb-ANEH+WEsAyles+Wa^S9=n@aa@npBymr<W*r?9*}O
zqas?9tr-3@>`ZI<&yZyNpW&d{{s*(|6t?|6-?C+^dywPi>v@Y_-~V1d_iy%7`;Pk`
zoc({O{%7d7sa#vJJnX}<Roka;=lbNC`RHvBYk@+CCdc$>D+VKWizk!)dZP@Yjy;$4
zDvi5jKiyuw{$Q^CgQfAJUw-D6u9tdgW!pI2dxyb`T_$EedM2wER?BR(nH*!a<+GOV
zt<5&UE=?wV@^j~(w=w@+_wV|D2Fb1d@-O0yKR$h8wqK}JnqRnLs*YmQ(ex`O+qN~`
zT$|GBa&4nZ*tU%`7EjJz!m)n-JxTi&+3SCpKmNzr_Mki0{Ak$e%irsau2lSI*!MJR
z{lfZ#OrRsbgs&{QYSO)4<n~z|H}%goVV_n8Im>i5^DQX8w*K}7&+5fX+t*DFzwpl=
zv}2{O{-9Hh^>3$&=0`U6;$I)H|FNt(S~loW$mOOO$7QE3L>)^o^UdezP063fvABNj
z%$w)5U)ziQyCyGP<D0+cNB-mK9X6id;)U)w>aCW!Bz@QJQ?zSn>yt^BY&Wja>SCJG
z%E4TaWE{WCPUAmA6KHZ&?eUf6*Y@~6imkgA`NU}F<YTWn`0h+%Oc1}p!+5)E`Xlu>
zoBuPgn0$y`b1VL6efO=hY1=1m@!1|PptN=3)W$pFCnrYRy*}|aE=^tM^z-=Fh70A&
z_v{Qe-gdog-!zxsTr2bH4fYxQT~%jY6MW@sz2GZ5%PV@zt|d)&o@4uFgQs0Tx5T4u
zJ4$b)Ha>nW(sRl)r@>Qw;)nD7e+(a|Z~0(<banO84>`ssWw&mzn!W1Q(GsRRUbAYi
z_@?wKr&mbV9JRMpnNVN-HJ<N3!@)KG8Mt%)^!gv&Sh4y<+4K_|uJ7@Eq$xQ+!+!Us
zN^{KvC+szz%v*AOPHf%H_z(H=?O%7AtZ&-C>FN2Svc5|9pT%bcxa<xQJ~K~wx2FV;
z%-i0LcfziG_@Xd<)3WK=+PTZ->+)v0-J0JhzvbN850k_9T-c-h;c&o5^-j~zMIW8h
zSI0)bntVJ>bfavGS#Dv$!l$8UJj4tp&Y!Gh_`Uv3_J0PJX@6JNsn@7~v_E>kb3^^1
z*&p`KX>xufFCTe&Y3A!p5tow%j~-=L&(WU7WUr7PdS?@BVt?7k>wjc=KSm#_@~%k!
zrv5|wfq(NifjtwBTRWIqZ|OAG;@^DRb$PU_x>H@{#exv_bFcpF{W1AJ1FOW3jlca)
z@~!<HU$Os)y?|+T^y5;dJ0?oUSQ#p_S?4%$XGBWmMY7l>sQ*o5;QIcM$A8neEUP+o
zoj9@3^_mfX&3;UMSl=pkZ6D7M``<P{7W;n;Z>y8f{I$hw*VeaJqUx5edNohs3ft1P
zcV~0{*}pk*=A!L=$7J6t9co>gR(|r4^nrcGn>b5rm)u#yQ?{j}E#lO?{d+og$=SaC
zeBJf$;yP(>E9>Yib0L+5+dT6*nQWJanM-QD-ZH`C=Po%9wgn&BkH>Sr{C4Tkt)tJT
zsu-V1nsw(S^QL{zI%j#bJxb=;xIwjC^n`?k%*MlEecRG=eM~w32)m!UwXJhag>&HU
z%PEmLPduM)(?651<#c9Y1oIpNhN(8?FVEICe@J?Ne4fdrOJDPIRd@EDiHrI0RxYMO
z@%y0@d!`-uX;g3Zx>Wv_^AU5kvs?Nl)OND}vO3e3`~J`79cxzk9`X5oBll<I4!f(*
z>V@{?*FNkQx%Z>~;n#UH7p_PZKD*?$W5Rd7S1R`vJ93HwFH46A&Plnx+%K>0$>Oxi
z9cxxz>fe(0;>+7&&)E1!?X9X;r&%UkGhw-$)+Kwe{C4as1K*y{6C~X@PiS}j@INLt
zYkRwC^nA`NpJo3J_DHuY`RhE`A#32q@t>huHv5f!Yn|eiJ)Y$suH_5f<$U*W_q7M*
zPOHpZSBeEr4d7(*^E2`*o|N74cZnV6>v@W^!+uPDxV`<&FCYH$`n`uFk{YH~7I;{D
zwVsH1@{N7+Z?nq7n~oJ+;}`dh3;8*D`=`&I@lR9g0w+Cx&3>d}jcKGR*PONS{?*gW
z;!W$r3Zl{$7uhFuE)7v#Yp3aQ(BoCghb0U6>R(S^Tlp#b+PZ~jZv?p&7&gAWv}e}q
zN2+J;iP>>n(tBzZGJW;R(|ivE-wTOt6@GKza7XN-I|W`s+TG?$Cb<OuEB*1*PNL`C
ztF?LOZ)iUMytI^4{{NM4{M<iIW&f2wx{q!5g`}%$+dpjYd}peiePVyXq{xUfUJK6O
z>-ZFJW7U)LIsOP}VUvT2{Z_lx=>=zXCfs=0arSQiO@V(k|4jd`tUG_{rBwP6@4Z~M
zUeBZF2Yoo-nYcfD|Br8T(=V=@<uOTVN5+i>I?<L2N&7qY-`@2s^FKo-udiy+S-IIu
z7M5A2u^kege$Zy_o$E{e^j{a|Z&v1J*|7fl7rW#uHnNX;t&Xn$Dr@&lLhPP&v+_Zu
z<&%s5E%QC<^k(wE$bDt|KZvcrTmM7(@1AS_Oh0b#`YIMFckj;6R`IOQvbz)bmpOht
zT4(oKeyjTNztzqk?c4XbKbrm4@A}b`%hgs)pH#c}oUdBgtfP(vKG`|v?gbqQ6pdJS
zN9yl_{|rrDUcd4W&hNaZK2!X=**!0_;$5D~Q%Y^-E);)J96RHvx!>p5z?NCw&QJJn
zNpbfJR_uE0xxH9s(_LpSi-QUr$)^RX9yIwDUjL{Q)^w-$UjXOjbyt~{U-$eoeeqB2
z%EGI5im@khlX$=FOpWdlR;qNpoHgfzL~>8@(SoSUo9>7xKTFk}w?pOI>z6SRvZ8%e
z8@4?^GyRtB)n(gPxGXrDpP#Gx+a|#<#HVt$<73sX27bxBif4P>4@G^Oyy}nT^}IE2
zKNcn~^pWxMbpM?*?b-{bX^;6PrB-Vfcs$zizSF97%dY6S2l;M&rVoUFA3ONu<D9zC
zXLXEMN_{oA<};hj3#ob{xOj5&?i0m2Ssc$<+mmmz?OnBH^3vi-rfHXV+XvK1MjbEx
zD15N9+Gy#CN%t}yC9zC030ywIX<nTx%bfIk``!2Fdv@0dx0xkGKD`{%SJ)}@czfyJ
z>`$)`UOH_5w)MlVTSAfw*(=T2PNY;vesF&%AAf4UcYWT>F#ndqqnfwsx0viMW$)`U
zTk)SEV<Q9Kk~w^f_FJDx%(`I9S{Zfxk^M1&_YaoW@9n(u@y^4h?|=NV-`d|W|Cauv
z@wdkh?L%==ANI{I_!a+c-d4WNYc#m|W-q^^y6c3>#8Y!Gomg}6$j-DHv%9MzYI}d1
z|7SR;QIr31w%f*!>))!X9&h=hU6j0|-KV#3^(zj)r$X9=snTl2J0$-lICM^*e>b1u
zNB+a|1Nv>#>bdPCGYvDW)aI<)c1?S4pTslI)O4NC-pVN_-bK#rRQZ&>X<eaIM4gAO
zf4=&|omW=A)q2tIvUj%Ihq~U(hx54)%Wj*!)LC@t7R}y?hoxFW8A`1k9{0?uJ+?DH
zGjDUW#>~{8(=+Aw$T9>}p7{Fq(w_B4#Ai*p*z0xS=fs~uF%ljeOZ26k8mcrUBpH5P
zmwdQi^yRF&rFxUgc*?dL^)5Z#)_U$LhkHOz6;Fzs=g~Udu4l^wKU*)WJL+aQMX2Ao
z=kLn>>Hitp_siJHy_)5>lkcs4KyT8-$FZAQ^d#FN3QqS=XV-A8SKKdZpVlv3qxNy?
z@k3XqtUcQEDK>MHmrK&KTftkVrbwJFkTCoi-Pa=Z??Kw0w&?1$+L3)K8z=HTo${pV
zG0z#sm-COC{+$0ir0z`iN3TmSa~6i|-9Gv3=6S4<l4+@F0q>k9au-NwK6z}xv~RN3
z8PyXHugcX%ao^Iko%v^zYwgGAhxc}E_;K&ntMh-AEW^ATl!V^ODDD2Ue*51^l?>lR
zzn_0||F=Vp(}(xnxqAOZUx-&7TcjG+Cz1U5iE#5?uk!-Q(mChD8CI%Jc_8@P@x$zg
z>sDqzka+XQJ#EsA4bug@I!ze6bF~ko9;;BF7@zlJx5s~mR?82;{y%~r&gXDvy|-Zc
zuf1>IZZSN*{N^du&@Hnvbr0{}*r&v#Qyp88?s&H1=5e`0bItYBc21i;f60gRwy&Fc
zq7JPzSu*?gRM2d0?7tKDH<|VSXJ8fi(6jb;p3Am4#cdbVF28%bWp@9UwTfQ@H=PnL
z=!;w@#(Q0y%b??uTYFW*@t<4%F0M~}e=GeT$Ijo;H(veI>puS>Z0`zLE7|O-lj$p7
zx;}Q@F;kgKX~*VMcTP*I-Po*j>}h1ze+K9H55D_vh1v7|sP?<~I9Ye;mqY&<&hN<a
z`gF%&R;0~?H7_>tPtP{&6k*uG5dJ>?t>SN;KP>+ln%e8mi`#S9nK|aKJaFQ2#4Bzg
z)2ppVHcs`PUG_M;C211l_X(Sxv+drI-y!O;!!!G8`G1DCmp^{il*<-;I(WV0RW|$P
zS9|{Dm)_0|{O7Uj-`>PW_Wg1iwRWkywqLLDEiKG07K@d#UK@J-jN6OQ#S>G4|9D@x
z{w4Nz$gSAd{}~u;k{?=IFWEdh?4y3WiFEZ$fh~o9m%Tg2sJt%x3A@gXgaQkN>*w}w
zS^r0P`Vsq$$KQ4@t>O4Mzs+R7#cMI)h*yS@&Me{I{LAHT?+CBCq_rW8HS)Cf%I6a5
zFW=w3d{`>`-?^$~Qw!5XP2)vw?$+_$GG%LVA*ap624VSj)9*WeZ9EcsxY~C5&-I_u
z9~bs)Shw8l_dM7C3@o>|)T$p^$@^H`z*Th1r{cE597YnK9F<G$A9mfz-Y;*b!F^M_
zblu#=IvH+unR-%|5hW*7)ZV}QP<?&fzoYW}ZgU@q`AVggIOfR4Fa&No-}87*1Lu0a
zADLo{^M89)T>j3de#J#Bv0uCWwt~VJ>(oxe>(hQ+pF79-?{a}Z)1Ni7N8bu+-uHI@
znYT5Z$(tYFKf2fLg}hGIw6fp3O_C0FC+|2soq2D)=Am1zd%FHve)GFF(d+nBl`S4;
z%K83${JQ>C{lkB|uJ1GYakuV(#<r_ZZyn!1aoLgE?H4xlAGrQmKQS@eb`KxhF|z_a
zzv6$(48OcR`Fv^ZbSCF%Tf=@k)<0Q3^N3NF;n%ePpxewPf2{ZX7`x=-of9r6F21e3
z$t8Z~_X$UdPrqu5XMNMZ@%xzZEBh_{EvCHQr$e{w*t37)l=i<*qDt@d9OYN-lsxY9
zF;4j5?~E^VQ}dtIcBf79DzK7Qz3T958uQDz^}m%eK6-u>54gHcCGc<m!?#{9xiu`3
zWx@_;+FI<eQ25Uf^?T02qk(gGt^aJ7&3Rh$SeVTzd&!F32S2Z!!=p6moN4EzqWH`{
zQy&2do{wz@j}^xqe87Ke^&|eaH%eF5nVfjGb5gNv%LcKn5ofZN{+YwZI=TEz$h&~U
zijFKl!@Dl~TrSlOj=dsK`L@vd(9ZMs${1(JSw7l4{n7Fx{sKSZZa@5TtMzim+e+CB
z8`IhDF5Bib@r?2@mR0SE6ARAm2-g#JsBB~F(=#k?GCOTpy3(@RJa75EeXKtYKAzwA
z;g9Q;n(VSfGdZS@IumYBoAlt0^=-C^e-157{&e7+^faAHm6RIA4=eXS`d8s5cR2oX
zy!ssGS`L}{KG$E=zlr})AAQ|qf5$z=jO2gk`VY>U+HJCl;jP-r{9-8<hqZg2-SU|f
zQnQ@()Q0%8`&*~;%O5$<_iE<tr>~-%d5S+v&yab%U-s|o>CCN5JwsbrQ>NXoEIM*!
zZJ^)c-8*k(i%k!!)4r;k6!?4g?;FR85A;2Ak#FEWTRZu~?8i3yx$QV!{%6Rz`Sf<y
zt<4fg>QY)x<u2jsIkSShU7e?JV!U>Zo5$NajUVkEDYxXKt}ebmuQmT2o9za+?1|TE
zd~36p>9<F0*xL5wUZw86^4=sp`?s?itV_SHPivm?Xvy4uySUT0EY6vS+i%nVp??1e
zKVwbQ-}#R|mLFcLRV(hjW6um7b91Lx57W7to-Qp_742E@r?ZuTk1hLUzmR8X>I%ts
zPd=sjPgQxbq<I4S!e6ugh3tPYMSlC#`EL$?REuwq7kbxX$NVwoRocvd&t}$?Es7PY
zdm_X?>G6sfmH8S%QvbGn-MvERd+eQKn+__yEx3`mb(eun6aR`w`zO@6p8ROxb8pG(
ztYz=!*Z;6R|2CiRbB&$8=29uCB5l*#{}?}%AJ2}y{gZ9W_JmUc3xp<p{7|W`-nVB?
z$*TBm`&u8%-}L{-87SXdGV_^L|8d=@`-gsA{WI~jaO98rH=kop=kk4=;{Ci;=azHR
zY4dj{lA89d{4jNXd+;Ow_R_UMm##!dy}Gu^?8iYjN2BLe^QUgGb*;_)&%j!KWsmU3
z!;iw7>XY>)Ug@SUsqy%*yh|lhIaF0mD8e~iC#AV_VeX})pZ+s&eiOZaF!ajCEeT&^
zPJg)a@bNFxYeI!hRmc4Pb^K?riI;hE<!krMnabAtLKWH$TB<xLyuUTG!rOOetkCsS
zcUXKv<~29=6kqR=cZ?6JiT>O6pCK#0d7s&pKk|?KS?|T4O;il7PTSC}z2fuKo!csx
z_ShKdaWLz&OsO$2eZ1jEeB6he+=uUlZgX2dN%|CBxzXoBo4wX<r%wx#_}(t;WaxSD
zG5-3Fo}#&;BK5*HGB2+d&pW>4#l%&a28(4rxaY_GXRvzxC6v3upM~|jP589P*G9K*
zcbG9*rOb2py0rCUc4q%GBh3T@b_M2t)j_3?we)2DT)n)?(=YF`y>>}5+@^=`>KFHx
z^$W6jo!_dc_@@^19B<(4R}h|HU3mUw{G9n8wwqe3+|L%t-SMHw$Zo;opZ&*np7noJ
zwsY;9-!-3%)qibG{<Plmp_}-}gUZ+Tl`ZqN+;V&4i)z=r;I$vtZMzkJ<UU^(SH;$k
zdfkS$3<9sNU8*kOp8vV)FWaSevyS~|h`oHcIDLI~*yERCON&<jXXtB;pHyzA>8r87
zLuPuk{Fi&u^S>0Sseg`}`D}mK9{-G6_DAf+Uq1PJUf@;Gx8uKjp1mmfHf#T~x_;5?
z-_~a7uaW+}RP@*U=2}IS{|p;7L%VJ*imyri=k8p*+K|h;PShbjec`hmvwOWVHk@)R
z{t>KrHRM0Tn%CF%uiv+-UV2SYy|AtM;c$hD>Hc?qussx+|9y6z?XO4s`E!-5Y$j!@
zFn$aBRP~@y{B%$0gC^~7@s8INWAhF<{xJ`GGCxu4`eXK9^{(TO!aH>&9-q3Jf3e~}
z!@Tmz>gt!7e}#Xxza-W>Pt3R8{@<<oz`wGEF&~Z|wAJVTyXU3SE<VS^2LI)<hOza{
zrrl?yk6gReHb3{<%*S_FBDLa`r#=uq@O+_6_=LZE-R%mP83a5Yl!;!chz{Jo{rZ>h
zdx|!$X+C3X=On#S;=zB0IpLqh)O3&hoAdO0PXB^G=^y!z{ZqV{r>nOmI5Ded;WO4H
zlIQQ*YcMZ=I6p4?h`w_0l9?&85&~A`$FeW~$^Yo=eRa#qKgJKYs}^*t%six($FfM{
z^}K&Kf5{8)x*8@c6sR?Sk74TxnFqp`|NIMm{_y3C`MRA;#TFfR`CxGFsq*WeSG%=m
ze))Or(J5E=es<N+Z<7yNM+i86QRsTu^UTjX_Z;W*o?j2XzxUmq|E1MNfM4$C_h02_
ztGxM_-aP+yQrX7W-jCjko3JjsrhZ%DiJOqBb;V05HG8fXHQo>B<{vH-crEq!!|v$)
zUsIzz84kUFuz!WE<*(~g;<JrhCAWvktpD)I!PdHDz30cc)%Eos?mJy^ITWmzai+Sk
zUGTvtPy54fv?r}Ko3-uCa+Tzp8Ddpu_usnp;E?ns!-?}ap7gnYUQ>NqJJ;%8bar^U
zi}q)OTYe$w%VpAKwcW0EMLDIX2dfl%Fj$;OoM(7m?%&h{_p-Kst7=(Xsbcv1c!kCB
zn6HoT?aB<AGIipdtYznB>u%3;FKm4Omp3ajQ~5v{;{*@+_8(jib4oSM9`3MwQEzi?
zdHZ{{%;oMj%sV-suh0K{ZOV%+Wr<I=Tfa1$sW{!*>A~mAEXjN0KLw;Kt4u1sQvA>K
zyl17+t)DH8ZK+Svo6oUT|7YmUj=p0u?WEN<Zw(dmxcN`Q)IIahnqAj8EM1=1@3&Wb
z&xg`?vvVI+Tb8!=9M~i>!H3h$Q)FR~#X0Ay4~20#?@bys0?L!;|J(5OW$d$+5ANpW
z8m5Hxf4?|Qz2b3Cy297<4wmP%Qn{zIe79MYQCiFQE!OPi_Puk~=e@b1bCz2q$&X#7
zXV#19!70;hPfp-?etSLh-rO3$58oCqdUY-8>fJpP+}GVYUMW6<LGSQ)V>!uP9!s9@
zdyw5%)TWYTHm_aoPWsE}lgGRshc4TezWT@E(7nAi{CRyB7k+T-%~S}GeztMv{+7@8
zGmc;XuzukmiG+PuP0}Y!4Yu8($8blu>dyh;rn1ldhxVm@6uB6mQOCcdU;47&6~(wa
z(OJRG*Ds$v@b>=FvRi)ZAFue&uzCN6kd8k$LS=L!n2Q>F?;FbP-F4kIqByI)qkGb`
z^xBnCtowIt3wx+C)6w?ZX1?}ih4Jc#S8tiWKU8w^)H@8vJkNXmVm`L^(QAE?SAFWC
zZPveAt-Xqx(j~bTFD^a!oPBG}nMu7zk}Fx7k6Wns)O+pGRe66Vm1|Se#kn2Vo^&$3
zWzO@z_p0z%h5gj5sO*AcA5W^WNZdJk;`f3l%@c3$TxS~V5z1c1ex~sCg=(ouzrC*5
zcrNu^ka5AYa79+eHL(o}r#(wc>dxnNpZNXhL>GTj<xz<q8=>;D_=$Jj#RE@j&wmm4
zpMm9*c|6O1h6mH;bAC;^thWD3t_^qc>TUBDsC=*LTPS~P(j9g!o7>$pui4LNoc5$~
zk~RO0@^88q?NejfBYw0#PHT?)arh%!`PG`jM+s5kJNNHO*4b7T<YjYW%k8ja(LK(2
zfzAdeAHTL|{^582Kpe+~J<OR>Yoyrbr!GIXfJgtvLytE09MQ*@cC+Qwvevg$-j_^T
z6?WXMWz9xWRm-h=rW<GJpL)A(*X}a+7azMkE9I^0uK#D)5;ps{%D>b1EdDN9uk88k
z!?Ecq*Tl{pWWBc3P$2W$!3~wOUU^(7sQP01uV6cK;OwaVANkgr-!|<HtJM2y>z~k<
z{d?!krSmEy>(Vk+%W7mAcQZ2-{sm3`9;)AZZ|d6D`(*xh{1LC(%qvv#QM_x<cGl$G
zpFS>)@M8S^YLe;e<@b8JiyZDP`Ojb?e#)z}UGluo*H_wqm3}GxsQR={_TR-LZdVKS
zXUF~&oACSV^jR4{dA`ft_4D{*@`rWVAGwcgOD%t#e010QaM`spt!y(Fc(1+V$7z>#
z?04!Mv!`whnKKUyANc84x9P+B*8LAA`>oD?^uFsqgQTuR<Mizx;yQKWZV2AFV<C6s
z**=EeC1EokOLEEd`^`B2@Y>GH8)q{=XSPt^zO8co>s>o*)Yg`NpBHL#DdbxF8`u5=
z^M5FpT$sI@|JLM3YF&jBOzqn?dx+buO=sV4Vej=tTmHu5f1G>Q-+6whe*5v}lCKJN
z&*MHUTbgWOTUYz5N8&%jKGr&^%?CEI<t<lu-2BRF-kj3aZ2vq$U4&0CzL8jG&y;;`
zUU2aAss11S&Aj<{*SCy+9X0B|nf{%;5cQuSEo1+7_XBTzmrXz8Ty!bw#7&7?F1x0*
zzpynjJeR%xN8^76mXr_2`)x!f{E&WZeqg`gs|`P+)#pd|UDFIqxpS~P`p#4q;RZ(L
z<yHTRa@Ieoexbi!a-9(8B=;^ioi!^C&Jgh9b2xb7iF|R~<i88luRp!0yJ+jQ!+|?8
zTGw1q`Svg7{1&an`VwJ>-YQERt(;nP@_1bK<~xTAb@t9$_U-mRnZE)1{xdYO{JW$*
z{o+>n#$7wY9z<3gIwEBJ(rmW)E7!{Z3`hPm{7}07cJcBb&Hl0459hc4ah6@yyfpGo
z%u6}N4_gnJp53D>)9QNk>zWo(!MO(wDkLP<pP8HgP;K(kAH92YmsOPe@80LVv`^yb
z)D4xPlb;62I?3L3E2vK2T3jz`Bfq%9I_%<`()BzMnb-Z7D&4tl+PWr3z3bfz<4rBU
z&&`Waw`s7nSj^qLwpL0uCnuRz?Tg*jYxWQ3$!}>txHszl(f<r$c7k^@t>k9Z{N8<h
zvg?jE)*dmwW0$@?>}pe(qxpP(a9~CLq5T}D`2z0wkM@fDW*5t>T3?!(_flp_n;xfg
zvx4uEc?YVlAG;N|^}$}VpQiO3KfJvztG5YMy6&9d(eQ4niov0aVirF|1okou#$8<X
z<H+sTVYkdWly~k(>GW>-%zW2swLx#dhuO0;PM&91+jKNB+w=GHG=AH|Zj*av?|%JL
zuJB|2f&2V9dkQONskJV1Or7}DU3L!FQcnxz?{#y&uDQ>9^x<5qn<jg;INqez9&={#
z<X|bD6r#U?`QF~ck42>XTi<SZ8y>c8<LuC#+v=?aEqy;S_O3`dW_077C(Gr3x)tdM
z;y6Fn*hzo*yXn;1WY#OEjn=H;X+5ZrAh08VT|(xQzuy@fp{}qipR=D`@H_EwZ+x8C
zxBm<Yn`XpVN=t0iS^Z<)@_BoWudUDg^=$3~d6vCTd)CWsU)RavCU*Pj!TCDY+lo){
zglIh3Zo?coYk8N+=~}yI-VzJ%t!xNXKEd)>Sz*@aA2spC)jS1<m4B{2cEM8Kx&K6+
z>GiMfDzl@MkFKASai!eg-P*-{?7I%{3}s<h+G%TPw`}FhvhwfZ)<QQw9WD!v`1W{$
z@#TrpzqWUro#LszXK7Q<qTP8qe%58O=e?em>=(?Md{+1SoYNBoRur)ZA73tiYHya{
z<i3udH@!p4s`Og3E}HD_JSOV*pyH(Ix)(w|3?a`~u=m~F@%YoS8k37Q-jAibSCo7d
z^tfj_>CrQPJ<&8t#`%*cSsq}wT%Y0JY^Ro)-upFIHp=8oPM){Uy83oS_i0w|lKA*P
z%-h=XTvRXYtF4uJ;f<f&v73IIckVfH{IpF%>A^Syqrwv^h2e`o_SmOJ%NBjDd9f|0
zk}uMwZpV2E3Crh=U3Th@tAC^iZ*P0CqT<g{)ksMdj}s~@Sw1*Ews<`!{PeDMyQ|k{
zZMWLJphu63xku~kL0f)V->MlkQmds;JYE@9^5iG~mHM__U&6}n@n2QsG}isM?0u7D
z*=g0;+Uft;&c3NVT428||LE%LAD;iwmghZ_T>UKjuj}j|54&P7I5$rGyu)bT%um-h
zntr~2pkL<b!;E!mAMYN#{AS_Ar7gQAo%zJktP{9G?@7mD9wzHw7a!ksyMHXs<jNi&
zF-O*~r%hL#Vls+8-tj2Rp?bwh*-pE!zrM*^FKvG~BOy`0_LS%ARlRriOD}!4uCBQ4
z;jJI*H0Bv?$@LQSwd*VMthyQdYe`LY^56X`P1y-g%q5SXa;vS|H+7Hce6b@oOHXhg
z=P^9~IPP+JD(@lF%{&an`<WH`4>TFy?s|OdU}U$4@*RImzvB02>#C&$t55v(+q`+p
zB>VqYf9HRzyp~@YFU0xBV^OBANpF%nU+3>dw_G13TKsfmX3;Y~TW?W5|ATjY^ZYHL
zZPPz4KJriTTFzG8eDBM%s=Z6MdR%<_=21hd@nP-$ua(v}eiyjbJ;;>Pxc*1|!+(b8
zk9GZ(s&l_Y$t`M2<+>el^UT`AZ7fsMWcphEW*^wYtyiPGXlqBu?WH|F%kx7&9dPX5
zV{xo_l2z69g}uG2jvl@3aKQRP;b(jGcl8gt;x~WY^X%rH;75Y3%yp;5f+z5Wbcj4}
zJ}Cb<uJgnE2kTq*r|xI1iTYvwF#GrH+tK!$eDv}rnN0Ik-|lW1acJGeXIdW?_wAYW
z*J8)s$i%xs9QP%|?9JYPtF1pD_2=%7$*Z^Q)A=#6bazR4RmYaZ%TL?9E2@5*_%M8b
z9rIP|>`gN_O;z7JKdim}&ij+Q`p2^Doq4&sw*pmmN6x*$UZ(J8@f<dW&r#y{H@WxZ
zcZpwHlVG9nh;zRBGESZy^8Z%-I(%?f)9G5Zr5dRr?U@IjPb#o@JumyJ^yw6Xsiznl
z@65lpuB-6oeEoQX+2!{7fBb(7R<y@%@4EK>NZAILH*5Ph?DOn-GI3X4@tm^b^<FE}
ze=|n=?a$ovQRU!;Noz%yxHSG}U`leg`})iFQFuwT$JA~Oy-K?ol3!o{)wVkIz^N<M
z+U<UEn@!=J2eaOkzOuOWEIxA17CW&Y!N2W(Tz2}q%TD%>^+n(N9r@z^J9fK96kSwy
z*U3mRWLhcp^QO*^&=V}5SnEUV`S+*w^HzAhv`PKQsQYzp(#=bc?isO6yEe&f2j9Yf
zk*dyfHwm`BT5NOe{F}`mq`iLVKD4aKUlr-H&+wz|7WSZ>p>kQb4()$&t#PNKGEZ!S
zh2D`_-)d8~UcEbQ+U&BsUOuxM|1*S3y~`1BWcgrZ@zwO_ztkCrLQ7sQ{B_KILQ!yU
z)PBK}75k5-dv)r)>zwo~aOX*dRZMqJyz-E#zJAW?<&KX+HXD4EPBE6MFmIPUSA6im
zu>$+3ul;hjBD2E%%|0nPyjs_26kf(~@+4#Nr!UV<AI_TAU%lke^=*gW3bZ>ZofKlQ
zGKgI$S$w>}uWH_$c~{TI7r$KSKRqNdGhQHN^Ockj%e$1#t_L<<5-8qh#CFYbXLkXk
z-A#t{uDy@n@;#2+GClgzGlO$|sp(uv_68QL{uV!rmOR{iBiwvdRK|P(lkb<`OCG(u
zLXGp9!7|Pco+C1P(K5*sZ})Va`%(MY^<wF>AGME}b7u9<Qwi1+(q3_2QP$7gFlWxB
ziu|QD*Akn2<4ev5b4T9yJ$L^>`>~}TSMK}}-r=$BBX8HPJ^n(HdW&z*StQ1gY;TZI
zJZJLR>bj{9=Wn`mVCj`xw<oF;`!Jtb-@j8)B6hh-72hAOKi~c?{KLNLNA(e@`lI^H
zCv~?zsQp*t6P<Q=%LJ#lhqf_V-rn+{r#L?JkI0Y5>U~?Hv*jfYf8&j^IFoZjK7H5C
z?=v~hpS`o*_S@uZ`^x(CZ=9YwZ^?__9`|hhFX@(lGuiiX|G}d_=6)~_+nDQhP|P;(
zmdB~v$K||j&*<^pjAMPe_?QHrgy8wlZ-49myZTS&$J*aTH32{DA70ye#m2l=bJN9j
z>s0u4RxUfHtCu&+eM0Z#Q{3(%St1LA7!Iocs`=ZtPcQBVb6kY!>fddbIHC(hRw^Im
z_Hg9dvx=!|UGc<Q`&IYnoxc(O(EZKz{|v0j-QW5?q~4qPuvYnaRpix0m#)|NR<4Zk
zesb?LPd3+4p?3x|l|M`DnIy?~$?yG)M_v(LGqk>@E}8Xv-pfC4lfUOP73UN^lCk5m
zT5Ufkch%>o_xDaushRkjHG9(WME#bxNqhP}d+wQa^vt@xiLtlNy)erwdSWTvn78xo
zh5Fd|jq8ut=DfW0vd&0N`p1)?39-4IH~q?6>Sn}DV_wE*owk4G`v!Y98}riN-WBZ;
zSN^!mO%%TGmf92=KK0>l#-0fpT9QdBf1k-rGVrbUzR&ef{P42OZL{iI_rx!&=(9HM
zm59+gXxOptD$Ams#S=e$;$N>k-(O?Wq&_A7u*qAmCqJu+IqcS_woGW%E#I8qFV`K9
z{ayL*=s&){>;K3vkD8&_e$0+{r*HP*>s@>=r3{>Jop9DDnd%w1zrg+0gFJ@*$NvAg
z+#kNJKD?jj%YDAAYm=jQzs{R3cxq{!rQ+5d2TE;L%C#>%T3_>h^W9|=MS^uE-ig*o
z(JSzfkr5CPynk)Kp8bPW@f)tU?$7DJc|H82U(bb?|4ct@-7{<Io}En+rpz+wrF+lx
z1+ynAs-#Qv8BaZ7zwoJKznYd&zRQ1x^}9d*`Oh$WGY|7h$Ky}-uRH&tzWuZHZ=sj(
zQy;udx)sh-%o$Y0EaYYR<!zkkZ>!DO`}D8<aj)fIdmehZv)g)``Tf*C95xSR!Y}UM
zc(1=W^TA)Q+pP1%1y4jPq@PZz`ttkg!~L7g`d6J!f5ht%ZMdyDQaVDQNYQ3{%!8Gt
zUw@pMFxAI-fAS-PEl;^hF25{3bN|r(8~bE`9Dd9#c6QbM>=idzCQQ7!YNh%@hUfR?
zw*I;B;y!PUXMX9Eb&DDk;&rq&3#Wtz6;(1cPP`HRRWVm?ap`aMKkgqz5528kc754|
zsVPC_mF#&R&q+5__ho<3eq`Uif5X@IYhQNM%t$X%>y6fyZnM;~YWQ1tf_=Zz-h0x^
zURqslel`70pUi974~{?Q>%9Ia{n4)NvbRN7#4{DiM%4oM!W;AJ?6tnFznSe5?W_FA
zze_*Rb=&NRTej8SO#RQ`yMH_L{eKaH$5*ZsepI&i$;-eSZl~gEHWz+(`aG$g|KHxK
z^f!OkX6~wg^Pk~kUiS6Vr&AXnTTm2vt@<UK;kmmfcG|Y9H^#?y&RN>#cYDiz;ZuiP
z-B!PuY-e>%-&A^a*v>1>`ZHD?c{0h<=D7`1@r63k?GL#_YTd3TB~IB|$)QtJzVBjV
zAII@0#SwBUtq()Dw`cku?rA<L`HIi#U+CS84BfAhDXx~=`=nEkxpU0So40ho)h{1+
zt=30cMq4fIp1(f-X5}Mpd+rKxpAU8OS+1>rtS_7;xLYi2(zC-}AC@gpj&yi8y{e~A
zL_k<si(ma?|KX?>tJr%JS9p0<7Dt?W-XrSP@%>xOKha;2AGo77Uf!orBY4?#^@_I-
z8f!dPda5i>$uh0j%CNjxfbHpa*TmP`_S@K)*DkK8yLahR#lGv-QO;ZDP24_h`O`Q@
z+f9`Z9*aIo4XnErmACcxjdfq@uLr-h@3|*G+4INRN3ZW*e3x4tI_aKq^B(VNla8Bj
zm^K`bz3=riD&pRwpzDqkCi(Fv->Is;o@ut*^vSF6smj*7lKTw%9V7LbPnC(?i0DbS
z5&RLpw|)7^g=affOIj~Uj(*5LMdAVDZuX59PfCvG$nEL+`}uDR=yIp3w$2Zq?tiQK
zaW3CfqU6Q5O!1A&XBJHBZ2VT~m~g4GR$2Yo?batf^AF34J6?akm37OdWKZQMll4zZ
zu}W{>{YBzG!&k0fZNCG4#C~{uxK3#Q2kuzUM_;bwsa;v0GAmxmJ77j@^7i~`qB;df
znw4|aRb;|XeO%9f>CA?8Q?A~7`7Qm`KEXntqBpm?kJ#Ten=*asSNj!_{~0pvn|{r2
zf4k+U>D;I@n^ud(3cU++Q+QBtO5*uKcFE(W@9uA%e`Id@v0eQKZR?&%?mL^FzcSjj
zv{-WcP9eu^_DTI>&r*z(P8$pT<g*rxpLCz?pR(^#?`0L=oi|-B<-D@^n5lMg$po{?
zibE$QBHaqsPj0-mKlndGhHTdBupgEW`^DlVd@f{%T~=9SJKOc@mXA9mRT}Q{oBp|Y
zSU2&rl;-ic?7H?}mmj@nc*@;sXt9T<Y`NO(%)hf=rtH>RUi(<TZ9aqjgGKdhZ}upE
z4EEW+d;f+?xm)qNDLXgqatM6VU9~||;Xgy9v}U-hyOX`<KZE*%V)hTcUk09i_@AL8
z$T3rR)e%!!IdiV{)8Z#x%T5S+!f=Ys^3=So*Um3`X{UE(-5yqz?S`H!k9}Sh5qEmo
z-4lwbs%zdSrW&4=V+@=-|FDAL=EuKmn;*I#+JCD%_`~}Ced1fD-DADHX0qWK<AUka
z4lMarZg4JkQb>VI!^gXxLE694ELH|z`epp5<miLPwo&#y@we2!sr>l<!Q1<?{<|;M
zweilIHhQcpUC+-wd#goSVR3EJ(RXW85+2H*?(=Y3P*$qC`tzmSxa<=w-wvD=<~<So
zJg9xbO_{_tgX$;Y-#CB!#Z(;rmh)qN@#C|~!G#ZbtIj=o?^Un=eY$wzscmPocl5CI
zc`D!DEPc3m0$)9|{exBVOk4V!{xgWKwNv_Icj?yg!*cf9Kg*x$(On~Tb*KF;LCyGS
z#s#f;LW&J%pBucm@nu8AzSNbUEB<VLd*IJysi}ukr>Qv^f8W*k{%z>Ok8F!Y*WR7&
z-I0HUDOIa?{^pa<+(Ku1yEz-4bc=oEwJn^X*!<SgJ!NW-KGo}9<>UyM5V4Jc)t`Bv
z$2ZZ_-D@Miyfk$>b?s(Iy57vwMQmpu`8hmjy=6V;`ex4U8=qV`bmc`(#q=QW^?a`c
z8~9#FHy9WcB_&?IzqIbskJ+JC>yPjY#Xk_4_v+YFnS#{lxoXD}p5K|KxbdL&yd~Ek
zmPBouo;tH&%^K$Fgx}BhC+?HVZa-pHeA<xZ;PQ;Zl&W=;^9pKzGW^y4_MTDo<dKQJ
z`!sy({J+@q{&K!Jry^|0(@O>Qz59cgU6GcVx7E#(<H@&2>+dhSX85@4IPY=Mznd+7
ze@p++YI)D**xM=pd`{~ttky34cbfV5)A-5rWfw^0AKx#Yd1U47HTU;3e3|wtli~T_
zX)J%UzgnqlEm`@T{b%?y`L`J-(|-q4991~9<oZetm6V5XbMMrxpY^Zom+OW2phH*w
zeU7i%|DxWvR`R3nqm5JYza{JM3j5D+yWb>xzOLij^Rh1|-qAkOvvfk<-NxgNbNW}x
zuUuE+apN?fe~g?~#=80{$r-J(mM31upS*WA+WFVv+nYC6|7X}*b9PSIt+Fq#82>ZK
zY5ggB|6$9e6J`@`%6z_(Y<h~xJl}aoo$aoV@5A=|WN*0@-9NLDUAoBb8$a_r>*~*u
zeq7(&L)6vFl}%zijtdnnc_MeX@Az`BZPV2>nf;0-9$TvP72dymZRgXS>`X=l24xef
zgs<EFXIQEnBa>jr+k9X7mrVWqsyE+i&xu#hjVWKPd$K2isV=Z5y|3!4{gd#tTSxbv
zZ+QD<<s99kd*3V!*cP!`(fYva?KZX9$NyZN*zjbVr?TaPTL1i~QPZ}wKfmF<TTgr*
z<Lkbi>X*N+c@^j@wlw+r@s2GsxBRtaY48<cvMf(YXr91VaXj(9=<}+nXNu!JRbp0~
znKR#(6kTScnqByCg^jn&C+%}@RC_kuGTSIqIOk(?Ow8mJNdo=TEgs*Ok3Te5!|j&P
zlWWVa1aHh;SJ>B3cv5Cg;W@i~TURf<vniYBf^28+(P{(sEC05h<h;2-<mt&@4-yji
z>x{C_nEz);oMzorp%c>o=-2c0ar2*>Ys8x5J1t$h@~zPn!?PmoDoi1L4BG#cR%cE>
zmb>cC)N^Oj8LGbgXRuwhbnmUxQXU122P|a@uYCNgt?P5`*S=>wN&QclZ&t`wmmfG<
z8QAVt&HL3>R8KrZdgHu5Wsm>N`ZC*k#qup7T^1cZg*zFKS^X-$Z~AECeOC6wQ%%PA
z|NLk8`uf5i(>3p=Zn-Gz@hNqBQeIx+R0&J@2K%Kh3w|kknTmebshGzdeOE2K%~1NL
zm)?#5b5{$&lXI%P1Ut{yJ-I&L<fPP7tH*YK`WXH*aD91wFzb3iWNb?Go#`8QDu`%{
z9=N$9UB1YvuW+9D-ipt&=bF8Fxoe;Dj@EgWUC;ApOKKe`eK5hp-fP9BT}n%R^Uiy1
z3%i<Qq8+T!nR7WHAX?{$f1%7m2ZrbKpT_Neus7)R;a%6J>{>pznkD>N_S5OV?Yw;&
zT-LXxhS>=BH2B?-`uW>qSKl*<<lY^U(#1VuToHx$m1n(ddCRwU!GeUNTeB6ar#c!<
zJ8`Zq^yD8+zt%51SFc_8Do*o9Z@zu^R?lZ!Z`g0q@BH+XXNAqrx_~naHprJ4KI!vU
z+gEutKd00;D*COZoW(Q7oAS&P8$1}kJpXwu_uXQ_kFKwE_DHTz<tyGAa$3#e<q7*X
zhjo_vv(z+q@04U;zOB0C*L4?7H*2|~m7<$$S=mH#CD~>997Vs{ziIv0|4{xwe%~+i
z<NUpLvR7&n(;r$szOv=5y#KUof|V-|9DU1s=eiF|*|kfImV!$r*_;+*T4ndXW9`>B
z`7KXm9&1&6ecq?}`L(&;eVg?=j~RY>ko+>na$B&!bo)H9tv}OdmE~I7evMi`@uIWz
zNxhW**Zqg@e<=F9_3f3{kLsI>+*szT-`L|e>C~$#F>x^irJc5Je;5Bgw&(u0=Kl=M
zefzXu$8qnvRG%*2Zg!9F%2MC?w|+hSlr`O~b;oCgjoUkQZyx_(vw5o9&mKRvYyTp?
z^u|?|J~#J~ooCp0{OPNTS5@g<ueM6Bj5_x9z^N@UADg`9OuqB{(tftXf5msGwW*n|
zd=Pqd?wn=U?>tR^aoKkJ5!1WoWmRFzAH^mg+4b~$*B{>%ce0|^t+&1(cRzOHv`4R=
z74M2%HsRAH%U2Z)i6L68fgJnH1$FWqZOV>6JzM#8-B#|KPAM7RMHw1uH=cMKb<1|%
z_D8F)ZTN78x8m_LMXpv?$)|I>R(-KJ$+|mje|3b#F|(V>N9QSSFY^`Zc&{hf^`BwY
zgb9Ux?mqt+CccjOV|>R*lchw0(cy)?a!_RSz0+$d+C8qEY|0gPzoNgyv5n1J<I2w%
zA-1=FHmFOS<I8T?dVQUO@_C74=DFupcuHQzP08H0#dxi?s;2Ck>Bf=<2Wt;7e_bVf
zH^!}1RA6dekx_A^b68*a85e;EkJs_bJik-E>f)=Vmro_hXdag-u<k$p@!9-M6YcKl
zr<HBv+cb&e=jSVOeEk0Fv%c)--g~UKKK;?|9rNE<g?`<CE7HN**_`1wPu}Al$AjZ-
zUf%l8Fm**sX}-oh#^WlFB}BiLABrsTm&~+N{J^r*=hoF(r?Vuc-qn%b=gRW9Tyf(a
z%`fYf#T^ev%2rgawB>jI@psv6(=~Q#jk0-yVU|-TUf49DW}9l;#reBD^56XmKQYf{
z_vg1?!~>j`h#Rh&cfc>6S^oX3-?I-`eTg&wQL(FTo6mch`o#U7oIjTYFn(uklU{$S
z_<YsR_Q&6wzwGCKb<1?ylsN6mNsk=Xc;{#<F)^1OJn`V!hJ&XxKiQtU<NH*WU;Wa7
z-{LbWbr$3v^RQH@Q`@)TNBP6q=ecUa{+--0%Y5g?%RZN6m$`O6PYGD)=)BiKVNOrV
z$GF@N`G=B^>=!gSZOFM}^R|ikdM6&b1T;M^eEHdPqr*R)4_1#a*Gav)@H$?oCjL>l
zb<d{b0(pBXCoylgyV%qB<I$$0Aw@+V=jOz&J6HW^)BTFYkNMmG@E1G^Ec$kFqSVww
z-in$0VgDJXWqDX0m%I9H<Np2IcyjZe%QEI1k!H3yDVXx0>SMfuN^{WPwOdj)rX({+
zA9%P?cFK{)IVn$fr}tg``lgr1y^LA-#POQ)bv99362))4ST22czD?bgeR|E_KZ4cf
z7nkebGSxnvv8cCe|BQ({W+i?X(G&DM=f1$^`g7TPE7j&5sz|x5{Z2t{LGiR-*KhCN
z=6fPn`LI>dvN-S6E2G&ZLp#HN?yX^88R7ZdaDLgNRgUWH66+VAT(Ec2&L?TXS!JDZ
zpCeMX-8g(EN65jxvhiQqE?cY5dGoFd%dYaUNtV}Ow*2<|W&g3AESICwrtVp9_`QYs
z!n{AlZ{rR>lxL3pu|4+E9$Bg4daI*`EQ!hTduB|ie>rQL?Z>!v#*++po_6#Ky6`*y
zTlR-}yC3p1-Hm&FaqHY;8>_YlEVTK_&2?N-L8kYIZc`DP5nIKbAKO352Y=Y!_AX@u
z-{qgFq9-lflKboC)^mNE8X*?jwL7`LHK<60k3rUoZ{F2|KmIcu3Y({X@txxQB&NQb
ziSt5I1g}fj7T)gq5pn(5+P7NecJo3~rONtx<){8L-hJh3t=Q+t-S(N2vrYPr>n+^(
zxoVzY^`kwS`Rdsf>(<B|SCKYvU^CY|wej`5<`v)8ud;D}cq8pnp3cIAWr2M&Wr`>N
z__ufUvtE6tz5A}ND|wxNXBXqMlUD^Df6ly7xcx%C;DhiN5mp<gNV|7C&D&Nzul2#~
zNYkBZAI)~voUT~T=5NlEHd}g{?)~blzt82%Gni#&y?wrO*5kn9qVki6t&?SBzQ{7H
zIgzw|!{yw!I_0(VZbqLr(v#Q!>~Y+dTkglp;|!q(_c{Mva)2#HJN-iX*FRNPPUX(q
zYn7#SqB(A=$zHkV0lhBEOz)iX{Mlz<{N?r0idz+PBbjYavh>V3w0!>hs&BC+dJ7-E
z?s$~b8emZQT)l_M>iN=|3+h(_au^;IUZ`&^OL+I_UDxxC|F6AFX%64|L;8_r%1qh3
zFS$;U!OF$*8@(7Glryi(K3$``qGONpvdj++>eFuB(SGnav(sR=hsEu4o(zKL3*(mZ
ze7jtu_t9)RV`Wmm%avmuw>+XH&sl$Y8*lc5KX8&g?+d1<_o8Q4do*+GFO})K(0D?=
z=5a%9rLx7kH#Khq<2P2u<a^%U`MT_al8W0qk4>99Iu0td9V_BEcKPzp>(8e5>@l_7
z-nO;+XWrW<zf<2-tv0Ei{k?qqWpCO2K9wDP=AS>kwaxzG{@YEn;mRG4c>$j<nN5t&
z(u;m(?UDTH`^)&*;@`zV10@f>?K|YXIy>mD{~XzqA_3cM4Y+q&ygaAfR(#>GN$aHD
zcc;B+F?dlFbGvuqmfZq<Mgo(2`oFI(Ke+wVy%z#^g<`!oJbBJs_^!IDI((+<qv-0@
zshhSI{R=tr)>R?#cT??g`@dDMN+K1uTz>Oy+f`@90}m3O=Wl%SPxPXfuWQUtu5+JE
zN}o)~3R@B5asC*`fhP|pUbji^)4sBgwZiT8@%hp<#t+PTPJExfanHuSfZI-oJiGba
zm>R50*U$c^S+Uhd_2Kr9mHyUmZuAOvJzO%&wNJsX?nT;3<~b$n6aO<bg~wDpK4QO}
zN8rcos7b$gtq<Rtw&<ck#G-reMFd+q68<cl(^Dk!`AT?fmC&!LF+pX4{?Ai%_N__n
zTiU+$=d3^HUn>3cSidgnkyFssx>xIp{xjTVmN;;<^54o;FTZ`)QSK~1E3Iw7tNix7
z+dmoR+j~pn)H1J{?YDTOceKdz_B-***Y?QAU7F^--|Tn&eIb*=kGr)_Ia;1%c$}fa
z*wbJCd}rDvzl-+EGap=znt5yOwfQT4_7<%CHc@JllC_6=PrA&`xCX^zRf1<LRgc_y
z*Dbsy&AQ`o<+=$?X@{A@pQ?t=U?>XzAh*lv>(sAnvNLw<IC<+uk%t!3q6u}0%@-c`
zM?KBky4T(Fs!jKcc^YNgzD_K2c`of`*%+{4Li%&{#y)<PUpI7a{@s!o%$?gc`R2=c
zCR5*SdG=fN$MIh=s%F!Y47O_=m@`Lc@tl&Q73cf5%nd$L)}5QL^zxtb#dYQfR8`p1
z@{)Br#B)~P=t*a9+Oa<EN{xByD*3nbxzF>?Tjb)m(cRGSq|Ab!S*tEQF*wM0s4eW+
zo5sMsyZ-oJUZ<Y>A?uqSXJ3lbIV1B$I~f|v-sZeJ=O}T)^o`#hm7Vdyy|G>|4t|)n
zd0~y`hf`5m+kV$PxEB6#>ZcR6J4zFu<;le~taD^wJXd7=S*|}*9drx9-3syeUZv=w
z<lYU@XIeXM6sbrA*nPX_sc!nZPV|a?jq*o1k38v<?Qx$IrmFWSbp7L96S|2}F2y15
zgyby_(@Xy@#0k`TJNb)5M&CJ5vi6d}L~cVKx2HneLu``+KQl2Xi+;46CmMUZ`2NB0
zZGZju+b6v5mU3^h$+&gD^U=SnZI_HTL>s2HiPf>(3*N{&g=xXI!g(C8<9FLj+X#MG
z{*O!YLsC8Go!GTYul8Jw%h<kZ;z_gl6&;~%BF{5}!dz5@dgm<&|FrnGR>els-nwXY
zt+?t+qkyJjLH0QhdYYT8uD>il_`WAj@rVD%Z2xPy>1_Axr+McaemJS{<U~W`mIpnb
z<NU<-*!FDrI`yHhlx@VhwLGylb$ofE375Oy{AbWDtChO*qxoo^(8u^g?{9hj;eFI1
znDy;eO4;^BYIk>KdrI0IE%m*f>gMkA=E1Kg;V<$JtQUE;?YiL0sMu>uGYxc3>j+tI
z?AMmNw1d^t);lGgS=sbh{Xv&~vXK#Wx9!+}Jb(DR;@JGh?>X&f+>1JLKWpP$mYFx(
zST7~`d9tUo6wf>T;O)_W(;w9u9rwHQ`<-x68{ZCwzh455cJmz(aA%R5dT?s$tEOJr
zx22zUZ-1El#n1ZD`?vMqen*}&%q<Dp6!f3r<hr_pe@uQXf0S8c!v1a1Yi}NFIm-zv
z(%5-6O>XbK-Vnj2RlK7xB7W=hmObSkAAhs?xc{(!)2`g5|29AJHS+e(wvFjm-19)p
zsjuASskkcV@iXkEPiEDgnPt}SPo?kHt!o*T6W=}y5AB^^X`OUftI5jPEnHdJLE=Mv
z)BP>)c0SxM@+vB9<;t_BTRxrSx~o1@&uQD6W4qH5+{(5^Y<Ti)->IeHey5`4+b$p0
z+-{M#_1~I0ryt4>^?U1hGOO-4*c2{_%dA>tz4g%D<<pfd8kvp0^6X^iS+ag#alGEY
zQ`bJ6&o1a>pQgTllJ&F`lHL{a3;r`yo;V+WYX7?Zx2zA}6a8`fw`umS?LEoAb-zts
zdgt!VyD>-Zm2SCstjLk&Pw&MkLTmW^43B@}{%w*~6kWqT|46a+(yLdGEmX|o*88#X
z_PWaxkJhqD3u>*(i;G|XQ=WI`gS}ndaq03aDrQ}>zj6H7ul+Y0o9wq97m4n?H$6OS
zw_o+{w*L$b*B`R2n>Nqj+I-&~{%X2T{tAr$8Fa3>A1v%)3i)JvwC?C1*M0L{{<i(`
zTo$L<+P8GE<AJYxdga;oanJdy{qggm>xQ>~tUL6~@#56qUq9FWef_0Ra(TwpTABSW
zb+vPJ6JONWKjv@PFJ*F?U+Bm4kj=l-W<Ff~aoN4QZf-YjPCwK6?ep*Ly%SFc-DX}{
zyWpMlJ_i2fb!YGCUpaX?_I~6IkGV_>x0Ug~EBA5ZU;i+^<lp7(|7^M+ntom1Tq?i$
zw#vV}g;{S_O+NnAMCbJGW+i0-ho_HJ3knwP^UUY^G5=uv=3}cLtQWd@=jHXc>kn<d
zb<fds>!B5!HcT?Q=(q92!f64gA{`1GW14ttb8SL1RsFWEJ+n6V&F(+v{)At7>LgmQ
zJ?QE8_m{$7KDqemm2YCHN?Cbee&*AFbw)lFuWHX(l^l=DzG0*NaISOo_Sq2;VI0e+
zE)}vrCCSD#k3nUE@#WXe@#%FZ?{6qSUf&<J<rnDSzqVQb8T$LW^Hn|_UV8hq>}uZ)
zKg-tEg}94M`tzT`Kqokpg)Q~m`6Kh&?hBRLw|0L#@AIR$_`!XiO{xo<vS+4hF?;kE
z*j?Lj{&TL%u@jr#25Y%pV4JpACM})4BSdNbx@lkDN#rck*N>PUSZtmuTRH3f)=6J8
z_jUY;KN@HF?@rs{!{4s0m}ccSGk@ul9_Eua1@BbvOl;gaXF``@-;&A4Ig=myrXPvg
zx~=u$i+z{N>ut<7xEV+;+c{OSS6oFe%8fxxA*E-6<+=?S{VQK}E_=CJW%_n`9kU5;
zpU$eUpDvQPq^A7V@`Y-<WStNEXAs&a>nz?`dR9K-!owz)iTU{@uTQ(Sh2(y;I%~rz
zwaco_XZ{}6@+(IV&9O|lRI6vB#}q0R)cw?KpK0CM{bKvm^gE3H82;G5jGNap#Kuk2
z<=W@<A7`jBhWYFEU1wnGJt(1d_L;&7(Y4?Ho}baT*Z9Qaz4d<e%>NlO`ftwu$7TND
zg^lpX&3>CUf4qH*WmnVloN3d~%b(KMQ7K}dQTJOx$z%RX?XBnJ-_HNfz{2s-yz!s-
z$&Zh}$y|H?PyI)--{#L>=SscOuGr(fWE1~A%dJ~nyS`oF+4e&GoP$N=cc%TkQ!ASN
z=fB$V<5NiVx4P^TziYl9I(f)G`t;MYo^S6~+Mld^QEzQ0^5Im)>_fMfEoWJB_l05i
z)`s4DrMoRWBN<NW^F6q0=~N}4J!R+AOE1<fDm2LnY<^z#R^s3<{)cbxgqMGKe{@of
z#*f}5KQ8oMxOIBl6Xn#@&2w^Ql;7(Wp3XeMBgi`W+@A7f%Uk|ruC9oE_B;N@yQjUW
z?1j^moR4a%?{+!m`R`lB`b!yJ#^vtM<{b)ovTn`AUoU@a{5a;De<18--j7Kl%<Dg@
zODcSM68?7nk^ADVYwC_&o2SD4v}5aR@jG^j(}Y$h?>Jrd{b;?xe}+x-dzM_b;eM1N
zyd&GZ%|YZr%XCZ0S4Ib(bp6fwxctcOdWO2g=D+lo+uZ*8Uh2l}oA0eRU8_pmw=-3i
z>0xM*k@?pr*FUS-YksToTIpE3<v)Y;Klk74EstKL$q8OLdadsJhV18SbU&x@|IvAB
zr?6>9*Z0#IddgE{41N}VdKaIQVjx?6{Z^dhe}<+-(RHWibE<v3dUffsl{!)fn!eq-
zSMlBR+mE0}qS^;MlR778?Yj`rB*8cTyj$-_t$2}&XZ$>wLB@Aq39ns})9NPrV`|3<
z1+BcCz8ULtemq^6`A_?Y>Bm+78GMf{_WWqpxiYf2|BfSznemCG8(Rh6ovRLiH|enU
zzmFO9lc#1|Z|T1ff1CRsm+yzk->!dr-}1-!L(MDR%!jslEStCQ>|HCC9W*~XEn-Gn
z;I|1Y4*4$El3?1QzVq)2-9LdJFMpHx7}v4*cXr5yd$;2@Y}uSY?UJ?S)OSmIot}mL
zwx7GRBD3vn17G&fi9e(t@k>VjxR~>YU-@9Q)yB++TPMAHW^$6nS&I3y%!AE|?qLb+
z_LsungfxEHJ)fuIb(oyc<*giQo9Dm%{%uosc-mW^y5#Ok6_10-N4&RgVq#cT7;CXd
zrQrQEzHgQq*QZ=v(*G<y{OaTEm5IHFSKMMdB;95sns|)Ern)#Fb9=VQY^Q$14wqBw
z9#5WN_@b&hOueVX?L&U&`aL=+pXYn+n0Ms#mSvwal@IPwwDi3f_eS_w;jP{A?QvWm
z-Fr-T^S_y$DP^hduX!fN<=k>>#Q<Y%nGy$wS018Ywk#EQ4Y_Gj;2F8)^ffu@>sx>R
zXV{plFj4NgR&=Je)OKD)g$FE>IYLGS>}vai|1rHXyDn9?_mPF*!i`tAx@D{6hzUgA
zKAbZ1xNM@uxAkfl>;&#q=zZN|S*Vixh(+<e15?Q5N&Yi9XRAs*z4A=E^xOgGQx00v
zFL~wt+FdT`mi%@J*|ycS&qU&9s2hX&O52mRp6WZ-zc|16JjbJ~<har>v*jXJq<{Oq
zxb?|<efhF;_fOe-=9wP0*_%>wt5oIkr1(_bpt{_fx3{mdioQKH$tAflV$+>g3;C&z
z<@U1*<(XElP=EI+``4?$-Mj63UIcB)IUBLusAl#3{$u;C?Q^R&-t4ox7n@w2WmPx5
z>gEaiy&Jdte0e@&_O1O+xrbF&RTanc*4-0J)9;qzTX@oZp2#Knb;X}!kN@P?7X6`q
zNs9ZoTJwK~<=y`oJSYAY{*oWFb8B_Z%l`~-FWNb5&-6)jac6Iw$MEGp!`I*=!F!^g
zD##x1o0Dw+x9VK<$$c*mo?l?UK;A2J;?3=Bw)Hjz+CSL>-qa_YGEa{bX|p)A%}nE1
zb$?;sR?|P14?o<}r`Yn@-}2-^S%2HtBHk)ttnu$<7+?2%`^ER?%C4SyHD+b&%4TwE
zc}P3j>*vi}Blluyp!H%Q$-5i+KTWlKRZ#f$(zXX%c1}C_zNe^CaBBDrO~aMRtvm-3
zgsRdd-_DxH&+p8o{mS?Q$N6b{tqP~V{u%mZ<A#mfD<1Ehsr&p^oT37^LR`qE)`JJ1
z2w&bBe=WIK)1>IK&u+<-`nyexPk0_*-luhLy81-zJ$wO=d%m80eED_sv}^xldjDK_
zq$bOKdLCa9|I^E|FZ*^?|J-i&t-~{DUSXPg-*VP%&+kjFRSx>g?9F;^`-**YcKKYI
zvaR>~ng|(lb%n+`DU&S!P3^gEbYiW_-i;?;IsRv`|66t0J7QnN)Wvxgs+$<z&pWhH
z=-VZC)rK_osR{mm%Vm#md>N&2KS}hoT3Fht(wvg#{mVBjzb}?CE9}LdX)k-~wyx$|
zxFp&wIlA6(hTx>Vf8BjTA3n0^nlZ`t;D*A+Egzd-AG5HzR`V(9#+GSsUVm9VeecGe
zUB;q;liXRpzWq7t?zOe=#O~(BnR&NJtDQKnyzueTVmYagHHAqx7sV*tVz9M1p=>`*
zds%brWTV?}wbm_JsjeV@pg-#KQpuHZ$Cs@-dg!`=&bp*sJiAYAm)`h&@2>Ly47RV%
zoGwl0j=SltlFuQett@a@;=IDIkb=`$`u`a&g)r3x-FV*E|DPfJr|53gO$XLWBsuqd
zJf4%ZZQn9Mjo2Ukfz^qsSC6!+$CcL{X8++Y`=7yU{t@%eRWAc7PBDItnZGHv^;}TJ
z<R?X(7DmSyU*EoN+M1s;IrIH8Avq7pCF~aJ{U6ljwqB@6P0!|yc5)~zPPu$+NrK6?
z`!>lE{}eoarEM*_5^f}&`{G<(tebZ}>)Gmbwc~xyOj%=^nDq*eTON2HHJ>}~cj(8d
zy?;LKKAsi#Ea>TsM=E+o{5vGiJ4Swr(%H}V$8r0!4E-FHyDv7cdBHW$dYQ$ywf?Qe
zvy)e!yBYrP<W9?&KYLbKzMs3~%lEYlms%R7ybm;<Gd*Cpzv;0@mwVR~IE3YhozMAI
z9Cd46W9ssXtjm$p{xh83y<76PO4pjF#=Q@Y9p`dau3(p4rG5K$>80!6e<#g*vSy~l
z`DuIj*prHEU(ddLF<*7c+BF^X>s9^P=geb|n`xW5v^KzxbG5*lAeX-I&SZs;#}^#<
z^Pk~dw!@(h>rcFK42TfE*dF}lXoT3SgwADwlg@aatB_$l9@GCk>ST7#cAX0ivAcMR
zdrH14gm|s;J1DWXFWb*(*<PMies2VuuQwi)ZO^m5zQSj7Y}Bbu6Zd(<6drrzF2nWU
zySwNeajmk=2BBXLeQ^J>-mR(J&dY^Ovg1kr@}J+<=>&hD?4BlDz0Gp1QLx%%89|53
z{sM;+E7;fb9<YCSZEy8M{T}wFuio?DdN@VD;$;%+&kI;Bxbv`#fas>Gc^0BiXW2f^
z469F^U8bb7wBc0ayyv%V3$zzrPRXtNrmOCjI_XhSIG@uBEpC}f1qO@l|5lwAO`BEC
z8?-yj>i3J1zwwXv?OgJ5Q>Wrb-hGRgx5csPz1egmLC$C52iu?PXKne<p!M!%zW)i;
z(A2<#F+Gi6pMO4Eo4CG0;*ZUb&WE|-?w|D@OnP;9=1gw`rHo6#Q(1B~o=eK@w0(W#
zy^Zv`Tk)|`Q7=FL42U_)lBZa(TgW|B>&$Ks1)hXC%?FR>wjOc1W!L>xOsQqfWD9or
zJ*S#nBL5h_{JKJjU$gF?<E_2tpJ`ux^N+74^6K1h_Yd2am#J8UHQn-T{9><Gz+Zf!
z{AiWy`ZxW*UGKQ4<@3!}O<<BfxzJVl>Nb-W=JP65g)c9DJym<IszR&xrSNkP-G~VX
z7>p+v&q<#6dfuM!Wj~?=_g>a}c(r7j;hh^ElaJgr3f(0iQ1_bu-Q?@DzEu0)%zwo4
z;XH5e_qKO=g5}=X*{gp}H*7w@w>EF$dfT4G`=d55{3B|{r*P$u|1xKldYuU@v%-S=
z>MK9F{oVIkfM0UGzHrZS;|mL$=g8i&RX#jx?zFid^N#)YJ`$DRn{(^o0+tnhCE>*<
zS;T|-EFP?ucMSe_x!|_<!~Hz*JAN*{^6u@yn37pH)n0#XxtRR$H?L)l*|c4A*FM?B
zd-u#)<viDlXLq-X2A|dLy<7Rt@Vu=3QEC15{|o{)wu>{Oo_GCc*topwoA(s&TE71b
zfn2BaE;ghJ-CoHfyP;rr;kn{CpRA~w<0~chg%rj!rPNv<l+(GE`;qsMPIa{XK^dbH
z^Y#Chu+Lik+xGV23h&T8IX|z9dyBn)bXz2=KIpjm-cmb>i#C=Id5wcMUE2C`t468B
zq9%{~UIP3RHr`us-_oaDp-JNLrJd{fGQY{OTt3#j;C`IZnq|4~Wp|rB3+4SR@TX?4
zRp~EQ&G^~p4nKKS`MyE^cks8ZS4`Wvf~2#b^iEgL?9xa)`9=Mi{gv?BnJYXtwN9BS
zK7oPR=J%t085eBKADriVefH5^-Tb60szN_EcP`{PRK}}jU*d35=Hv04(6!}9Iqf{B
z2WZXtT=UBC{yWzH3|}uFIeqJ7Mu_O*<mSI?|9CI)d=$%kc<I!<wYup$e{SFuH`3C2
z@Sowjkb6zqKD#U2r`GGqxwAU$yQYx5K!=fm@%7PK%i2e$_uHHmUBat&cV5nUolhUC
zcc0w-;hgrY>5t4i*DT>(W+HZu&w1?@A;HE!N+}ZxUpRhUAI=(hh|AD@a`$1kqN1En
zYmL43wR9*ss~(xjkdmiv%b+5ECT(BC-+4Bok0tBWZe{=K>s{fVo-Fc7XXDND1u7FS
zpK_J+vSX8+v3<k4ibMW=^JR2%RU&Gl>sb^SPUcPfz{B%^Sw!P*?Z2%vAL@(NU8ooP
z6LC-S!_)hnHtuU;G-tmtn|`b1)0-G(oe4)ZA|A=)&2o(hSJ=Jc*=o_Cm`Tqw_5L$l
z?K*UfE6Z@_ujK3n6&vg8^%_?mmt@?2GE>KU%Xhn?V{Z2LS&#R`E~?mlB+B>N%!jM>
zjokZF@>RZVJHg#!_H4(FZV7gKznP{#_g6A!6>f?8@H_flqQcZ`kDtf9XWgu{jjxim
zky&A4{PO)9*8dSweysj>ey;q{-mF{aAKpK7+9i9f^D(P0+(M>XJokB)>_`p#wn2Py
z(V1zTbMK|x$ms73=9Vfes``~zZMfpun{RgJ+y2h1Q_qT86DQdn_~D7v+z0uaZ+ou0
zAsK&4`i{Hop3S>Oe5T)8p7G>C_>t|?Hr&mc6mi2{#LW7jE<d-iqWxYK`8oFYg7_}&
zP+nX2<KJa@89VkGz906F-Z#(R;5Jvk^^dCRqL<s_H0N_aS}*3S%u#o_woX)a>!#eJ
zYv1U$2(~<Py>-v&pYUCm39An0Eez0Sb!rf-d(ZHJ-KT8*g~Cccef=rQJ)U0Pv!}1}
z&;I#xyMOGyeAROsW;U%1XM4|a^4Q;7S8tyVNy{$U6BYV8+E}cM>0qb*;e+RD_gmfE
za9u~KQ#eS;{Fb?K(N5)MZU)BZy$)Y_`|iC-^j_N;^G%tW>K63XzFNC=Q|!wL(O$QE
zvh30i7QW(R&vSoZeNF3}`kvcSi~jz-Q*g`E$WNs!z%eA@K;yBB_h)PVGnl@}oV&P4
zWaEKv=P&Jz`#S5=mE%c_%nHqOWbc}n$y#0Svt4t$pM8DZ{@&7uv6HW~O_{g+|Mks_
zUj@5=cztAB>w(BEy#a4;Hy>^J&tP76cXPbKkEq{ujf?BkPb@3W&Qx$up07Kh$j{=`
zb6Jb^i{893wbti+ecDdRJW6f3fQ?Mv<{5tr4CgI=9k2UG`-*RWTgi=edk!dW-YR%!
z2b){Zp&imr3~QFR9n7<mJG|QXT49~*Q|<3T-uquvv3GsVESb-dE&htjbZzUIu2Y3Q
zE;pagNtn~z^<(nmue&qi`TuY(yYt3q&#tBxcNRVQf&}(ei+cK(*7AS!kGneip?T-h
zKIa*4^vpIMyR)nH?r}fP2YpuIkK2#>_xkg9)o4CEYi4@o%Wp|3>y^rXzu!E2_DEWR
zS9<oUwh7HAj~Q59m({S;R-SLUSkvOuzUP<r2~VwAv{{II?%R3YefQ%}?X^4Q@w7`K
zWnxONpx@!ftqm-~_t(}{{Ym}t{4vXwt-S0H{cq_mYM55JHuulZ6l;b9e{a9-<!<tj
z)IH|LVQ;zpE$7EuN7pXfb?s})B+JyP$vb+K5+&a73iL9!G313EXL-!F*DJzZV_jIy
z>4WF)ocZhZ<Ltw;*+=Gy%=fzR@VC!~llj#=%nH`Gy*5i6V+%jS<sfV1TD|>`kn{0>
z3fK1MyG{KPy;kaS=!bL5Q_WsH6*zJ2lCzHc_Z4f_pJ_?aJm$#GEI%vg-<^M|AARpc
zr611cI$yXVG0Ms7Sl5B#ots=TchA|$%upO(S$FXMme^-=e|uCoy+6JyOV;aogvYa4
z_nz+Q5PP!4^V5v$b<A&dFRS--oi;e;nYy*$&aN&08AR7V>Dx11Z>~+P)~9#-AD(}u
z9yCc}mW6?{-ZS+L$yX*-eS3aw&-)`{XGPa+W)1qda7vzX<^<Wp^QV_96wVQ<JX<xr
z!{nyj{S6HJ;+`Jn+w)86@%x)`S2UT+>Vk?J4lg|M{L{hp&+JN;uKa7fw10-4>Eh+P
zor@V;XO)+gMBF*CuHdi`kNxS>^1G!I-IaFn^W4b%r#JhbV7H+BWCN~^CS8g*<?lzT
zPv#bLP-IDdANFnc;)BJ7C6}Wm_Fd))*pPbQrnGhC%uoe3mA~)idZ=yu!r%CxL9ixt
zg{S`Ey>`#Oc{@uPDKGdm%cn?oL($>ot`-c*Hoq$}PhD?YCaN^A-}&9+-<&^+ADJKK
zH9j_<d3|0<t#^39+sqX)#|xMHs-$=ch$QQ7e&}a&HRsFG8qvr5+vN;@xIXsI4L^3P
z=9ldyAG^D<S2P3;YO1CSJ8?~Ac_0uW`tP0g%lXarlKa&D@O)&QRI%*b8)-@2(+89)
zJZ657+!0U^+`RK&avL+d=`YWZ{*SgFh`*KpE#q1Z@8gwEw(s7ty*MZF)8ZX%FE=Ge
zEV~sNv;BkD!ss8HuWkBwW&gY9OM0F*&PiFCz5GZ0%s)@+ZpQIk(zUT(_$Tng>uBdf
zNw?kGKFxFqFF0Yd^Hy3q-(}5D$CxHqC_FcPAtzsLFI~aK8|`DfCzB`WU1Q)g!A%0*
z`R5qqD{@csJf0J}SM2l=JN*xRTR-eSmh{?pe))~l{2CUWm-FYGda05s@jb}8u_t^&
z-N|W2^BM2f*k4tN_55P}yI04fWkTIiMW18$l{K_`7<YU;E%)>Kk-Noqvu9sgymq&o
z`iI{Udw*DeTz21YZ>hlT*q_yRMBJL{m<5~r7F$X_Xgs<8>fY>}LbVl_jAoY!>m6}8
zoM*Q4?q>nxrp0sQrv6;~JE+3#*Qr<XvMz5XReFDG5}7V*cFH|eaaRxHkLxeO53LuP
z-x<$iQZL~yY`Lc~b<!PH#!tItCFdk7PoCH#_0f>){7ktsL6dy`D*Rn+vcgWQ?)ZNO
z-hHaKmh_iC<gGq2&8@pq?E8d0K8pg}rwb;vwDE9j#PRV~@*mc9dUQCt+u!9>{H`?<
z^GbS;F)OBZv@^&akXzWlwEF&=kALTXH2xOz@%Uj$smQdxBUxgr&V+`(kv`+9!&b@t
znaSY($`AbQ+jiOP(`boz)}O`@U~?sQfreI;Z||q=3iCJ=Qa&I1^6Fke_NqTy{_<7a
zGkFzMEB$-^-k;lQ|1&&_SpR09%*-zq4?Av8wR6aE*2!zxcAd+!G-pED6Eo-Jg?~2v
zsC*>-d%du)?rN2wE$=>gP78G_c(@^ON`in_tMX+Qnef-{T_)A5@3)kH-*)X#_Knb<
zHER{iIYeC=HWu7?Kb6N?aN_*V`qcOBvx<M55B<=$U0~OK@8wP(PdqrjA-#xAYkuX4
z^E~$L_g}4As;&Io;BsKklDztZ4u7)O|B(O2JR|DP3_Y7j*}YA>d~UaJZ-2`X+J3jd
zLPK=2ZB_V#{|tw-*V^5FShsLV<N|@0+pMOnmHOD4dS6m`o1;Rl_HU0LQ$I*QG(Wb!
zQU1e{eX0=$%acp<pDtds>SVr#MC5{;nn{{Z<XS!y@z(3^I{zkh`5&RHHH8oKWnLA(
zHoSGmGfCN?J8af%juojI<*5^%bev#UpLh7)sg;`MUi#tbKQn*M=baz=Jv1_7>h<R<
ze+GV(KWu0FWBPA{%sBBM`HSwpzJ6<QwC}fS6~0H_CB~DU&P?{drx27<5^(o(T=fU-
zf1HvZ>m#q|eqG-ub$5OHn@MVE8!w%|y*^s`>0Rqpw~x4g)bQN-;!g2jh9B;S|4DsV
zekj^k{IHlord95Oxsz^PGVRlC*r=lQ*iv0(&YZ8$_6SG*T~x#P@U40H-b?zAuj+ky
z+N7MH^XiPxWfq1f4;UQp`1?rx71o};nA5d9{n?CHeOnei+GacdTiTEK5BcAcr}5?=
zvJ<$dzQ08zH#lhfZ@1NI-|mF!-7oABGTvqq`k*kR{=vq0_Bxq=x9T^nTmLwo_h#gO
zhC`(fmir66yqDm*f10hO$G(k|;v}zSJ1ZTNnIgn-Ct-#1v-eyThmYF}n$GyzFL>8+
z>5W6iB97%s&Bq**nD_s7m-w=N`PcgH`y6%>6~W#cezdO1x%_qY#bsy99(u3Xm9OT0
zck9G5P4zi_SNCsQ@oeT(cYdkj=h5@j|1+?istNKJsykC>`y*BKvUDx`k;$HdU1=;w
zSKT^Tr_#?Nq86!k>+r;$=Nk_FXJ~qnd5isk{f%4pt;Mg!4PMp@?^De5t_ZVuYW6Y8
z@`~R3D2}VMo;^+2dhT(18iW2B*Bayh3@i~pCV%k%rv2mV<N57Y^ZOU>*l@+<Mo!>5
zr)cNr8Ro^e)|}Rya$NmZ(j3u*#Ttz}W%vvKGc<Ko?0;DPN3{Ceo)7GAj(?ba?A!hi
zJwJpUuhzJ(e<jAx^Db|l>h^72_s-6l5%t6=<<8OABzM*0XBMnEwrFWkX?m&be+KS<
z>3a|Vuza+cBY4sJ;-mkh>+Z;Z@LYeR{qThf{%=*${gU_N7U~u+jEITLn$_4-bLmd3
zr%;|PLuf(g+*PYqAHRN|sXqIC!+(aYb|tyehwIcY<fS(*pT}G6xo3Nm!4fw2os-ly
zPiVTqvFXX@Edrbp@!U0u{~1^w{GF=a|6u!@=S<mhM!PEBzJIgFnB~^D-8S79ziO{&
zxvY{A{r-+kp&S2)b=oi2bNuoA*xzMZskrY)?YfGzduE6H*W7)%_F4Uw2~l@rcASsD
z$8x+z>W{bivEaPWWXZd)&uV7<i+@rd_oO0fm*Xi;U74gU@z(#^mbcjG{}%tj^+;Cw
zm_6$r?nkSWEq6>gy(r3g1t+KEJn5@F9w`hA=5h|q+FgHF{GDU!e^Wks@1`sNn4%&p
z>I1g>tX<G>^Df87wiubplQ$mhdVX)ekezx&Y;?SHvC*MJZ|h3ACNVyp!&G5mY1^Co
zqF!Wu+J~p@tzTcH9Ge#UX8o3*`_7kh#yqw@eC&@5+o6rJo<}QZ)RbPz4}bnIegDkV
z!qws&+vVMtpR=y>`QiPK`}cna7R&7)x?jt0d;ezol6N1DEjF2Mr+(qhV%@)!i><{b
z{kvsx?EOYx#k*E3{vPQ`J<z!%<)6l%_=T^O9<E!gU3A-F;@UgDTl-IM-6r<D&)(0f
zex>`N_#YZ^n;&ZMHLr7C@p{?=#^<r7i_R=wcHOWwl2QImbKlmF^Z$r$K5~D9{4x2P
z&#oVtwfwL=Z&sb@_Nykp8_Uh6=e%c~v8(^>MqiyoX>)^jy^bm?6BQ%_++W$qKH~MU
zdEA~o(`@SQ`0W#aiVJ-ZS?xZr@cZ=J{%+ImoUZ<!U3d2G{?DKP&iuMiyyL4Z+sAFU
zUzu%WKkwsgU?1}~xu<UHx9M;He(bZgcKdMs5U*C?=0jE0v!{mZO23wR(pg)<!OU_i
zT6a&Dzr&jaeXe!Q70dr|rhYI!Qgvs)$bW{E`NDJAKHZ(8*S`ML^|01$A3CcimkL<M
zuGN_9c&;}4!{Ki&e<#&v`!{dne{{b0p3v2j+bp{#s_mVh^6k;1FzN0)t}3f`pZpo;
z)OCPI?&>d9nRQchUOqE5xfp#t|HO6SM<p*m$XKLJ-m^4tXQgYLXU$Xf?{e86_8&2*
zh`Js0aq_E|%d&#>Z|W?ocslp$ocx&=m08mBMDh;x9=CiVzxO{wTD(-$kMj@pkKAX?
z;H_K{lO-p8wdVEdXD)Z{r`1k8p3P7oUT`8)C5?qg<Lyt0mnvDRQ$794CZ3vPVPVt!
zBmC}vhK=WY*Y8n&sNWHOO-OflR7KXmpyw*nGJ3L>Jb%g)!z7aOYu4|aPzx`;@(cg!
zrYx0?c(9MN!tVT0sRCd2Lv`vO=e|8*pS6ACoXlUvnvxpdIb|kU${sdqDsH^DKe#?+
zKj)A1hu@Fribq_m<9%7Bx8%Bq*tbek-NH99f}h2vi+%Lk@nBs+1-m-?<NllFUi&Vu
zebE14&9AuCt1XV5&5r8hOj2kqZ})HywOe&wvwrs6t-nJ*taknJpCPwW^!yQh`PWi4
zF09kEwF~oecYNXcq|-QMo`J+)-^#D6R{Cz+YW4EaZR1bJAGyDI{P3^$<NB_e%#XXH
zHeELDO%J<bYI^aFg4DKM|4QC`d~->+E9%CYjiRYLuH=aZ{+y(^qw&o=(F?ad+r0f5
zZ=QX)Lr?hBv`^7f_gsG`yzBG|t&SX}yk+-&U2ZvOTfB@<uBrNvJGK8PuXoh0o#x3w
zV&COz8gwpCZB^zs3^3my`1Veb2lEEe&u^dpG2HCBEP>~%tUZ6!zbhY3AJAF*P~+Lm
zss1@nrc5bo+U2XZ>-Kqn<sZ>U>z9OOZM^zv&bs-V0`l~tPu|>Gda*L^&zZaSE*ESp
zlVzvP6bZYq?Cr)Q3;_|-ax~r@ndJFolBdd~Y`dUT)#Qg&kCt<Ed3zN3R|Q;bY`nF9
z*~(*cEmj1Fc_;r2D}Cj+WYyKlQ|7JR_xH?BW#w7z3s0=gtl4Dw_H61l=E6%$=bEfC
zYd;j?A^G}o{OxOJ`#b(HuW2YOe^}DOclb?I>!0*j?lZLC6jVOGv@iPa?nj?>>?H5<
zbuW2!vHrf)yu$ws6SF_^%PWgdJQnoQ;-BXFD}Ud=_#C?CQ$TE@{-HB}J~=eEs}{e$
zKmXFYMcNuCzOu+?b*VZymfkWl{87Go;>uJ-%LC`EKU5yyzu|5Cu}SXVio2`%^)_uO
zdyul5$)3;t*mm`%Th>$erE^SZ*m3+`^1P~#Klr9jO=i8gPkK?3fY9R1ryKm`Zv4?!
z$+X(GP+`VF1HR+gMs`O2dDiK3$`+aEUkO}tvHa+-=2ztfQMV=}drWoeX^K`?U&r}2
zrY86#?}bTW=dK+*9@uBGuFszDb)e72n5Yx2p9H)=ncFp<`m*-5eQTZee!0}GYi4iq
zi_c`YH4vRG@&5JO*eQ!8Tpiv#efndI#meO0hQ7yDditvVGkkr$=|al(t=l5jKfb#~
z$n%vs&j)|mM!P-XD}Uran0{pWoWo0Aw*Gli@gp+w(}9%sh+heb#q%ETEoc4~@Z-j{
zeKAqVN5rS<U0Cloli%p$eTlynYco@KteO?PRQ;vce+HGxh&hLO`OB6@tdCUvx%oM-
z(M6||-<GCYpB8;kv%lZ+*XM|7VXI}|eTn&V^X|O)?U(jl-TZfgoobv@+V0(#bv`X^
zI$N95e?b1=v&}Md{xkS(U7Pw_^wq`INw1Go#VAiW5Nqwh_{wYP>ZZD$>}v}TMQ-`W
zWAdNjgJk{0Cs!Y>*);d(N0aM+_sf5_)7!IULbFQxlZ4{e&DW+x8y$a^@IWS6zWjFA
zU+%4cd;iEwFMcJb)8{Iovog2r4&Tj)2Y)_kuiyN4hMmC6j~#h>OLscYIVrJ6sQ!S<
z^xcNHXMKHHkv%_TQ=eG8wf@<~hmQQ1JRzv}RkHG@-G3(A8!pt&G}_JFZlV4Dip=#m
zQ~oWt*PdZNm2%6`Ci!Rmys5uT=5LmNbAj#VgRAcf49shL3+mQQXP19&dOuU1eSf;I
zZQc3Oho0|~o;R<ko$~qL)upS<<DKKC)JQ(!n*Zskex&=Kb5iq+KU}qTe$D&KE&fUW
zY4@GJE?X{IJ>@ue`NZ+ye|A@|y_glZwK88iI_kUuOU-NPO??GMP7^1_uiB;Fw2w6-
zcf0qG%4Mhayp?KOxauD3`QWx){pz3OuD+9EoqzbPv5$AH@_~Q++xrV@_urJu<g@QK
zKCf~2-!<c?^(@9y|G2Y$&i~}|^glz#^@%%8-RH%Bdlf&Y|H$mS%tr()_Uzm`N$`7g
zmBhc8=c`*K&fCaWZC;{!Ztf#r>wrYzRp(kA=G}8vNqP89VS3>qu?IX)s>0tc+x<~G
z;=|ev(+`DJ*-ciOdN?v;S4c{74_mf-{&LfUuk2;(^s|ahkDl+)n|dQ*Pc{pW!wX{;
z!-+q_w>JK=e<m6<)$4=zzkBshDrWXylGZ%DUE<>G=_l)F{;U>1nBNiA-?qnJu6xP7
zn9T3tQUzOPu3c*5TxindDJJnG<LcEW<y?(;?s-$2ALzH<7m^O0cK46zN>|ylOONh3
zmGnt1Sf?h%e{(kbEx(7CZOYeQTrc$F^s#yBpH#1JUF-Dq@s7q~+dG$J=cV8MIse`B
zxqFR_dm3XxFC90oU!rt!p5IsA^MANa-vs=!3oV*z-W^q6`0YP~kj<(69=EgvR(>^K
z`|s|y{|wvxXD$8P`Om5%?VRME@`oq3Y)RL<^eRr_qHa=<-{VibE*tDWNbS}?*uAvH
zJM*LS!)G%kPID~#Sh}&~;LB}y^ETCMeYYr?t90erwNtl*?4QpORQ%6yJS4n!*^l4H
zs!SJL{<8bC2y>(SROa=Uh1?#?T|L_Q%PRS8R>X~yKM$@y<@5H?U*%0VL$=1KOsQEi
z|6%IS`DO<n$T#nr+q=YGV4qTjambD>JM@bS7tXB@-Zf8C!k{lWF<mIfforvrN<;ed
z<j-MK>N)LGPUNR%)~UTp5-Mgfo5z3ciQ$tc{Z`)|-I;3JE#PLU<Cp#7=bxHihZk2I
zKRi$LqkvEDzv~~KO)ft1Sas4Z^_R!*uj}@{QlGy1LdwVVgZ-R#(K`3!W=DS5(%ayE
z=2z*Tjsr{{Y%<K}w4ZF2XQ*hKoY(TuUR68(KLeAe{+{1H`;VWKTDLarLtXZt^$S0R
zE&Xu)n^Bv);hjGoSGG-T-@Nt1-z9pr)4u(C6nNf$O7ewkTcZ5m+|5mscK&d^YyFe+
zXH4IEd-cf3zk7L2hs`~B?~d>5*Xh>q|7NS0#&Bz1??>eWm(3moAO7`h@+0e1or)qG
z$IR>!hkvh5e>orZO4mM#|K|6jU7u<U{w~?#EiA8@`S?CxR-JV5#0L4`w&>kVp08et
zU9fKne;#?feUEd~?)7bRcdxIk{kZ?$`3s-cS)JI}J)O6+`P1I{kCTtvNoLq@j$1F~
zzB02;?!&vqo#JWR3)kCD-ZXJrX5N?I!6M4C$=X{cPx512zuHdn-^u&Zb-K}e-@p0F
ze^6g~jsDzS;+^}qtV@1zh?)1s)`S_)bGmoTTibPJ_kV__fPeRI#r5)c{Ski1Yy2o|
z-gC{`2eQ?E*B)v(*d<r4Pc}2W7^ZIDFZv<<7=P<NwI8{w_RN>rqrI{s?zK-Tckv@z
zt>^w8Dk`i7cjFGqRNn28SYq>--D3U8%{q2QF{gUtJnO4$PS)&P@Sj2Wy}^a$sVbAd
z*uD9<{>}FP46GI(WZ&%gA*XXlc=lR#mkaCL7+!UM>pto6_+MrEKJCZ#0)O)UZm|>h
zR$KfyH~nawKnR!YSAM?R857^ID|(+^6176|anT0l{@F`Q<GJi}^KboUc+k2>Jf5RY
z<MsWUHD1%UPfw28I3-s?x>T^_kP*9wYPYQ;%d`C+|HS??9IUp_kma)|>F<|gyI7N$
z-n;3}i_fQ*#uz+r-MsU6>YAR4-<MsM&l8vVBWG>=SVm>e!q&x|UH?2!O<DVFRk7Q@
zN#=jAt}UDS<9+#W_nO#`PiO9&e!S}6Vz$S7Zf0-a=)Qm9iOus&p6{1$Ei{i)yZTkr
zr>f<<xk~Nh!a~!-RbMC0n1B6s{3Vw7ZTWu$^S>>dXZfEYBc9>qJc+CG%U<pYeE8zg
zr?$H9-;T{t-R?6-z~@v|I(ye^o%#op;y?K8zh&(%r}TH`pV$?*58FA#{D?oY@pai_
z_6fT0|J_){X4oLo*DU&Z$9(yW)c2EZ4}>4C+)?cOpMk0S`c=jM4C$w$j(N^MedOD(
z)Q2}qb7dMz_!ji-b*qxvpLfBn{I=c&TPw!5@q6Oz{xdW&{&C*0XX-wQn#fH%I^^%(
z{?YC>O}hEK;yRt>g4ImA4YD4lpZvS_Kj@wRA)uc_=ktvWDe=xl4#x}^zn-w=(%Tm-
z;TLYQs#Kjk`1N(X=ah=ahbmrcS^QAH<$L%)gLk08G_F-I>dJ4%uHJBO=RuXan)=Bh
ze>{IbPGM(1Q}e6#@csLuU;CE+X8Lz`pJZum_JiwP54oq6bxC_4m7DE5^~#%y*PrHR
zebN{GcdmZRzL}M|*|i@|A6vMv=$!cBs6DGs39!9bE9?LKNBEtGJLc=G|0Cn0`qE<m
z$<5|%D|7qRnm#x)OUmb6yz<@t`K_HlOP4x#6yAPcZ}nZ*{#*Rt6@Pr{&MvOe|2Sp+
zG0{J^D-WK}pH-c4eg4|=IJy4}O}X_49sdL=Rok~n{hf8@xA!Zdm)krRe9yQ08l&<4
z_a=uo{-P4=v`?*2d;MtTvAfSje{T4-)%*6;`C8s<4k#FHPR@9H+_rsh@vOb~XLE06
z3JotSeEp;9`s?kD`yaIbXV^BsQ!j8&^@<<v2e17uI;*y@aMiix%FJ)RUHh=|{p4?r
zP1aq%s}I<JaMEwK6WJ6m^zXuc!P43+38U+RFE2)CNF{5WV~+8=E}q4ptg0t4$>P9I
z_vb(N_wUhcy7*|SXIWEm{>3Gaf6UU^wPl<8r?V@w#Ael`y$+scT~XXxIWyVG!-lO$
z-0tT3m3FNE84lY1XUJK9D=K5%Kk*9Y;8?XH#;c`MtlVZb?mR!cOe`{l!65hHY?a5?
z<@Zgm-!lJ?;QVhw^UwdC|HpdikMl>TH5}2avCP|b_uHG^*LHhXSUXBeu(sdgF8s98
zLiFeP-vRXp6Zhwwzr}a&`QiP%YW)w-HCkjGky1Hpw$Ua+q0`h;R8IH6r)d+NPB~~B
zvWuQ={3zYIxjkpP{x_5RfA*|<yS&u5`uxdz$BGYJUjA|Se#M&b-)wb9;y0}AiQ4{0
zg#A(O^=_N^Cpxbm@H5vv%k*SnEH3-8t4sDz?ZUHNW)}?Sto-x$$Kv0KH6A}+FF*d<
z{@=Mejx9g3AJqCivsn1SzbSWVrKxqN@afPi>k=KS*T#4(mW%0rDzNiYbovZi=5PN0
z8Jg<quFT)=-<jI}z^>tYRnB+4Tl2e0)ibtKsMSoL^*EsRZKY*G`P%)r^tk_Q`dN9;
ze&c)4ahn%^EB|LWs8c5$|0nIE-17YDN7mZ5yYBau&cDl{Y+uJ~c6XLzI!|w_;E}jz
z4_bw6dRS|hg--CB>KZH`7qP~9>$<fZ``=yeo7a0UE^XiWySu+9ZMQeJe=z4i!v`mM
z)*6iuf9mDxA1o@k5q~~8_uGv>ie(qKO<i_e;<Hq3QSMpZ(?|BqPPI>KXFp@SA!uLp
ze+E{y{|rr2Ud`WX`}&XM4_%#U_B>ynyJU*`=&#+Q{$!HJhkda<Da`qK4)>2t(lb+7
z`MdT%!$D`8#NV;6ifSxAh?K|4|Hw?&$awSQr{31gfIri%ntED${m-(_D`@98ds#5y
zUwTaD#YJ-$e7vr1TlL)Z@6w0qt^C{;&vqW#oBLS)>F4@;{~0dTmi>$Rn18hL`f{E1
znq^Iwf?}(eK7D@u!q5AU7o_~iRQ7nD9e4ZP^J&UwwEGt)Jh^_rd|m9eQ|uDA+$GL`
z=zsk>zV_dx_oCYywk*+Mm>#IuzrZ_FT6yA~$Nw3w$1}asncP}?=kbcKzy4}JuL(a=
z{Jbc3vFMNZuXeu=+%ez$@KoOKQ~4jazX-16He-um^0PI(wplGxmpO`^>+Hnyiu<M}
zvb^Om+{j+`rtwN&-Ez~Q&(AjAR8BeGcJlR)&zCQMU4K4l?ZRJIru7}SEUp#{Ro3xP
znImUlTX^SrQ~lbsX_gPx|NT^dXueS1j%01t*uB<yk6FH~`L=_x<L-sO_Fgw0W<CFZ
zVVbAV`@>dGZ+WS)yIhG7;P`oT&SU1!$Gv{I`(3#bnOSzL<dTu@++7<3ijKG$m6`j0
z?)t6lwX<Rm_xgjy+9FbMi!5I4e^D&6{^_hA%#K$|CI9FyjWKEXIj!vJopp?7yyq|(
zvH2IqN^V*6__MzHC84j{br<c-H(vb5TG94bUMR*jKP@>`!T4^B3ZtjwN$dSf>$v|^
z{<ym?y2jHub35OL6O&Gw<jNFr%5Fa{S*W!mhc$5Wx%-#Dp8vMsisI~teY2Nr+U#Ds
z_SV~&2F3<Ydu7R2b88D&>+S7DOZB%^{CgI1<6ea82}zbIcZ&E6BKlW+U98uY_2$Jf
z)x~x#AFdzEXZum_Wi`L+kLvQ6y;lU8Om^m%s0W<+vpLc$dCCJOW*3L&a=)zNJO43N
zoGMoNE~j}RWk&n0U2CT;WbwYNmG^ktY%WWMNks+5@wydr!?g1^zEjaYE}`;V$>R7Y
zwarS~<<mEN{Ft!X&_=Mar||1~-^44asW(1P4V!v?TTYIRlJ3)fj~~lEI}}Ljm)t$F
z=y_%$?`5%9hC9-2KE_@B(0xp5TjNLjL%)_z@89zKb;TdY#WoxNc2%dP{JXIIoHyGm
zBcs}LPi6W~SLiN2@?D7W)A6Y)DMH658Cie%wm$Rk43mtn@jY>(m!7#)yx-%#C_3?q
zfb;#s6CB?-KEJl3n8$p_?esjk-Ni90<zL!Avbg3O6v=oZ$zRr>s^03;T8}*oIu72J
zi<o@5>&t%eQ@UR-s#F{(>uq?yy}|IZOt^Ao_A{qT2h6oo9-IC-+1bAD{Oy<arE=LT
zZY9NUyRoYBV{ccqrQv^uk~wmGl@EULNPS)3G+%bv5B**D--LxvRN27rIoc`pi0+x}
zJu(}4dmpcNd)f6l`r^~P%x*SImC1MJOrGakX|_>1%g|SS>SP6hj_w?553a*2wD=x5
z*lSvz)v?Vy`g_gALq=hf>?{8;|4ysX{a7O&_Wk3{1szM4F=wfIgt*xSt0Yd@^r_)p
z+<yjzwezKFIRDPB&x$qU^>>=^qwbedLiAqSJu_{NpKeqUTJ5gze)4C=2^_EE&mV7l
zpZ|9K<2hOS(xMYjFW%Cmmd1T1d(tMC<6I1u=L2tlTl_8KqkiKW9p%lJ*WG=7Cf{U|
z$C>*Xv;TTzO62r@;1k`KP@%l6)+_GPvdvYMb3`+p=52X5^XK*7zIA8p1?<y#t35u-
zcPMpzJM?zR<%d^uFF%>e%@%RT<C#Z<fr`EsyHoM3AK4BU(?1+P{+~faqUN)BheCTm
zr%JD2RM9-=O1(8v4o*x*T5nYK2*zJmKbFr{q5p0256v|-qF2@l-OGOQ=XUn8?zi?S
zI~$u_tyU^b>e=(4?a6~D*B?#qsedp-eoI>G8hN>lpcl6uy_~jPFh)mckMVhqgcqk}
zPVJC5ovULdxZ~p-!yT2`Z@&7<N|q&Z>fg7E)IYxYO^yHKd@jeeFWCJIr!_E3uRNJ9
zAwBy?`{e~T&)Ig~ziD*s_2GG(SN^a`MwZ0-MOWuf*(m7aa(ddi%iljvyuep^wpwjv
zY0f;s`61<J0uM#Tn#)X=NoHsDzijXI)Bl^(wY+sUsgGw{cY1KHI3!TBfMJ8{q&=VK
zJb1pg=F2O~;If<YE-NCpoWEy(!@I=J=4y@Z=I`a-!Z|Kli-v`@cCzR>ue2{`SO58E
zeRg`j=#k(v!QZvkEDAVP=frNq+$#A*z~V)5*Kg@>x|c=kOb(Z4s7z7OdKW&Sd&4_>
z{o1{jf3&tO|1Dp4QR<Ta+8_0YKb(}k@_zH%>jj4md#p`T7Z)6KWRYDyXP#@O*VN2o
zMvK|r+&g{Y!OD(>UR$n4s+P*$ia%2p&s(Q*Gp3^WpWy4~+t2Ru6m~DzkTbzRu|ki-
zNQU|M22N#$@2~eUS17w}y{i7vzAfj;B#U)RyEvY7c?iiKbZJ;Kabc(vpI`Kx+!Ge-
z?Jw0Q=64mEF1@#Rb;h;ro3v)?Mp)Ze{)`k|(z9lM9D7c9>H6&654!`l{-}Sf>-5{9
z>zGo`p4E<;vz(Zg94eiln6vUhV!P<;zg26Lt6m+S|JBP>IwCW6|LbS9mmi+3`p*!#
z@%{pns=kwwqCw8mg2G9T!e)UTuk7;Nm)0xX{}6ls*7nEG59s&&v(M+t+!%3O_T0q$
zY~7P(#?JOPFT~`svlgWUi8Ovn?wMr2YJXEydxP$S*4)y`y8q@x8m@4e5Tifyv$2ok
z-^W6nthf8UeoX$yE&rSENAS0oe`mUPiCxX#+Rxp-t3OdL^=u#CXSvI526ne+?66FE
zytdZOy{jcg+cM{CT&(}3;}3;bYKbZ@z8Jsv%kT3Kg&&=Nd-J#Ft9q8C?K`iw7~cKi
zAGCks+X>53rY?-A<UgQ#TSC&}_3NLZ%l=)Lm;X|>!=L-rh8rf%Y8h)UE`Pr7XLnNt
z%b&egNqc`kzPD7p*-n1{;kk*?Z$DPlT|42?C0cWAm$SmLavl~HzUH0l&z0&68Yvm2
ze4g0HctYOm@AtM9!E+`3yuMe-Pfb64<H|SBsJr}SAI0C+|MttiE|<6QBXeZ&_ROP)
zjxCVe;c=0z_`ZB^*pG#e^QB(LbM6r@T>sj9`ytP-;mL)?CP#MN6Il9vcWT?2l{OE;
z&t6Z^&|$ZAmVX(y@bOKPzxEILn{yxVT)OXEUGdXKe|l{(*96PoC*R+;xqk6nuf^46
zk7f05pPX09X?Z9veR}OW-IFpGj$B-DS~FC8LZ!v=sNc;G#QW?-E0`a>Z{Fkmal7;M
zBXwMt^_6SmJ)57Ji&e`;DXa>vs%(|>*v_b>?c%IG)t>d<@o&{L*L)Wf{Gw2`!dCl=
z;uWcQ_N50TwBD?}{q)!a%dhNf!%|z@lx)^}zkF8mwDh^tqLu91_QhYeU;Uo<Kf}Sy
ze+(H_1wU+mEB=wb{xvPa>&DAlVe|9T+Dsk@rY2pE=?HI#K9M8CxAp7%gSGYlxO6{;
zhh5&2{;}Qr!}~-2d>*GwW^o_aTfIK!kc45_;lrXcCmOd;+1*f-6l738r~ZcjKdznY
z{~fXCG|g|TlmDPLakc-dSHAUs*Ih5Zac@J$R58hU5~`mU_UFI5UX;t8$A8Z*^S8%;
zhJ&&8+2?QZyYBcf<<{Q)Z6-5M-e+qSzI9qDk40sA&s%FA9=r1@_LdUX*&p77w_D5%
zpUPv)viQ%ZJpU)#?8^>Tw6^!jnXV4Yi$5uvvNt||{=NFdd-^|4e%Kr|qaxem+LxE5
z7B^cqsNUT%(Xi=+%cPY&M#cy2JJ+l%jkeBK-JQMLpm~Mo#S`C7Sg7=S{b#W5%#WSB
zd}83;bC1qT8LE6$*`PA{RZ;!ibeo4a=IgTmUd8@t-Sh{ayZ+ff(Eri1Isb=z{~zYR
zVkY&y@!TeJjo(zATb%uE`Q%L39WAVq2k!1|V7E!0_2<ifhNflN`(!@MKe(fGK7W>@
z+s5kLOdCmgqmxP}y#6y(hKhDGREYkGsqEg8C_Fzj_|I|q*6R6v|4eF<KQ5cN;C97-
zh9ldf?k=0l`0rfTv&V0hSX5Rs8Sji|&NRxa-NCr+dRg?tln*yfg@%S)Dz7TL^5D##
zplRBiQT-b?XP122H*5ZCd!GFn_eFk`hj#t;-#ek^V9lYM>V+?x56H4{SXvynx&B)G
zQ2ni`b?P<7A9XgL{x@^!GCiIY<41PfQxcn-j6!-6J|C@@FRL^B$Tz)8KPPXltY5{8
z%5#P<;|_kP|2Fl<#1GBKrpM`Dc%P#7H^qC!$x|m(84R^Ad^~pfnBCN0Up}3FbN+<J
zqgy}D-+kXPPwa2wKjR-cS@M!5x%P*xj;-9sxb7wA-#L$-IXF!7cx31DgTY#5)u}sQ
z*0+>^uBz%vua~Nk`BD3LuWD&^={Bp@Z7Z|Omv^pRTyJI8^s??Mv#WvD!_R$P4=azK
zjo)H_^x4PuLvxw#UQL|#I&jj<<k<ZxWgln!xV1yxxTna7-6#B7{l@)A`MGO6e3cG|
zU0Jm8V_o~AyFc>0qo;H2y4G%@mwQd9i1%sF-hlpjY&uH}ZduC7m0Zq#7Lw(b-u@%{
zALr|j#}DtaecoZG`$PJuc~tH~#pCVwy>_{1x%u?vsY{-e_<Q3)^Stbr>)Y%3a`(x)
zrat0t+%L7q^Fi76onrG-t|>>)HHc;6*fw*mp3?Sh<p;T@Pf+sm;Q0MxUHUhhzsqbK
zKXO0(w(!I0*lY9sufJWhX#2KnoN_g(cG29&EzitPnJ?fwv3=WAmX=o2OIh-wd%PdH
zUEHTvk?h*;`|(LyJ@1cxUmxz=q;Ds^y^{<49;EEp%2q8oGlk=$iR*36IoVexPo8pb
z|8=J?VfOCz8SiDY<_p+K{_sB%r?6cx>)Iy&<Q1zObZ=QsWQ<+RTq2xsTJU7xi7?ZT
zH+E0?v!wsfrhgoN5<YzWwsFP3^KEArT=)~a@bsD=We@ctb0$5yI`eU#wos4G^Pqm-
zD}iSeh18z389mL~FuP8r=feR3yFFe1e*Ut1e(}f?!G+gmXYYIW`t$Y^{~7H5O}u09
z;pg{j*AItjuAkQb>5uPW%cBNf^;U~z7EYP${j4Ya-Ki@1^Ye~Ji`{a{Y;AabG|ZSM
z*xOL1FmPwq)NZ-_b0Wp>eSdU6INw$;P%@u8@{jArJv*bheFGJ<%NrfU#S3<pd`_;N
zw6I@#!>iC6x$Lu=EWTU(x*q#TLouJPqU<C8d$X)U`(-ZQ*6m+B>*qeLlLj~b*c9AY
z@!9cYZ1$zUd(Llo@aDbXv`1P=1w~J1HE;gC{zuFQ<qzE7%ERuM=tezXCRLld*gk06
zwTtVr7jF2G{=wUmQ?|cZH<iomKg064SK<l%L2C=T=NGVF+O=TElhS4Lr%#Mi<>xE1
zs#>E{m-U}v=DU!O!5!+`w7f6gSpJ`ZWBy@Ap|$&)_SomVZdfnc7sEJld(9-vW7fg{
z86L`fn82LZy{xgPFrBaPP1%!@=kmQVL3j60^^v#vvOcPx^J&RH9ux7uyY`>>uyIfJ
zobdA1U9<l)Y+w2><y+c)UzW^oAEKYnzw0XXpFwr~3j4JDhI%pktp5xhj~{M7{Ci7V
z#@Z!&ckS9YD|FkoZM{>u_Z@h1=FG!nSIM;V3QX>&o?BY1-%+0+e=G0)x46FxboN9(
zVq$MEwKz9@tqfE0=DAn*UE+L^yOdkI>WGSjdY(naE{i#4p>fMXeXApm?pR&=Z`)^E
zKK3?w$=Mec&kmWsY09K&>wn!Z{u1o<pP@;;;@8u~`9d|`m){<I+PZFfvE}g^lk0)&
zpY8azKIyXkgO2-bk2~EvZ7SE_wYL<TR#m!7{`XIjx7Yu!`n#-g;)ai#PAp+sw?s5m
zSz)EDBa1+F*Y=+4KfiW=yxgU=x6tfMPxy=aMH2ojJCeHg6s-KU)Bf!IQ~YnY{%2sh
z_c8y?!o~fab%Iy!ADPEHsp9RD9g|erJ{^keh?w?L`S0!H+H)tKl?dFk%8JQZ{>(O;
zd3!5G|30m_f6z|!$K(fVqaVKS)pdQ=zb?u<wVLyvMVfT9T#wzSc?%nqm(~maXV{W{
z5Ii6$@%4Q3J)OIz$0inT(w>u;_clfP?YfW$OlloXHzb7E1HWhgT7Dp2banca^rkba
zRUfYX(#!aM*?alouW{+0>M!vh%8Io0cxG9W>sDoYEB?uU2DgeG>@vlDSwatF(wl=S
zqyL55q`&*m(7Aj~mc@bNFXJz|fBM|IU0aN$pnj<*<EJ|bA72JnCR-?fUb%S7ET1ig
zoBI=d`C=sv@13}kS*Cxg_+RboOM7&VZdp2YXOds`*=YZr0!%MXc}Sf2t9{{*RbFn%
z*49O}ujkz<s#vcr`^Q?|d2(^Jd+EZdk4t$HooXxoSYMy(c|35|yFbA?mro1(i%;+Q
zYV+i}WKqMX{k^3RmY()itGu}<Kla3ty}26~$V}U@o!M?*)~wT0norHTa7FMy@3-kk
zE(rHo2rI7A7k<t*S2JqQU-4HZ#qs>U_xHbWn$wr*xH8E2=fw@zy*HjeW4!2tQTB`T
z3>D#rzW<Z=G?h3rSxjZl=bkUJ73=4Px*51fUG5ILl6(1dTe<5O9@oknuY^|eMOe%3
ztg{lyD)zHE@vH9nfqmSPv)>$1u;G1D{Pk@1tsluAO>En@gl!Lt5tck$_O3Wy|Alz?
zrB@U8Og_0q{=H1Xhl-bHYhxE%%sMN*f5H06XI6$RT|D*t{u8S&9*HYx^06^qe78b7
zQ0jiu`*mNc9~?Y;ZLZBUbJliC<ESk`@-bpc`<?Bi|1%u)w9m<BicoL=`kz7A^>MGN
z2Y>3L)gJ2)_7rYR_g71t_$SEZ_;u3{RTD38Rc$zCd}*Jy^~n!2zUHJ_oWH8}&%gAO
zy~D}RHF4ZAx}MG#xBh2f{B!;yXPwG_hJ#x58QC|N|6N(1UhU7B9lrB-ct?#`lxFmV
z1zUDiZn|RJz{e8Qz-CnFvHyeH`y1llCJCMWE%v8;*XG?G-;OWII&?i;?47$@j#0O5
z$o3VLGrqo$pC8~P+gC3f<h}I9-7Wc*TwWI}DrR2Sm1drrlDF!>7cIx{>rWQ1XEVCB
z_B^L$Q2h^)x|iAi879lGda}<TEo7}sNOEB1@AdDa>YprMUE}eep^4$&?RzY{(?7ia
zQGDF&qu$$Fv0rAzKAw0%w{M}`!Fm4~UbZja$9~{HgFt=ae}-H954Nq9@7SmEN8_V^
zyQ%1@wSTH&whOuUeA54NuwY`p+vn?|zb1b;{O!Wu)&F?kZvRl;_m#U_qW$#p*Y3aL
zF3YvVPTLXqLa2m!!}<&TZT24``z2p~<gnAL5VJla?HpT?_u=-5<2!$=zWj8|mi261
z@azizxry&ye7f2{dGq#JQ>ULat6Mqw$L6VFo7T;>tX#c*a`>Mh`&skb<+r)Nwfyku
z;~xDF#~<76PrK&lGEMkZVAlJIJ)KHdgTA>kFT1#%`NR4xdo2Gmu;%^UVPjh?Rng|p
zQ_*%aglYRMooV0siccEfx_hMg-yiw-tbd((_PO~#)c!NPWl#7fFRoj%LiBRZ#frmD
zuHEb_%>8*b$gh|#>U8-Z=f?jGEc1TsUuN>3fqxI<L;KBlp1l9i`#bZ&v<FkAO3zfN
z%Qo0lhd+o3ewY^<xP8{sjr%KuJ@@~vI=Mf3{*u(6`@}`|-^_N4>$Sh~$A8m*hNcI9
z;x0esUQ?s?;qR45hSTZm<D<9le|PUt0{^y8wnxhZ{xck`T>EHhZfSh0_=8iD5x281
zZqf{pRzJJFcjGZOM$1>Mb+fYSKRD+9P``5SQ$%K*(dF$;cK*Uy#rk$lZ=cCKU)%Gp
z{)dA88&{QcA7A}5>&a0`4&I)yWNMuEE#b@k$7lVyx4qFu)Y^Wf%AcjC{~5N=Tl%^r
z<ImfV=6}TJNmr*y*&nLjxkSs0`)qAekeh{?w5P}SNBasty8jX1{CMdbo_&HpLLbgG
zi+TH5Z)>j8pY{1WbaS1PFBh;cbFDj7f5d+N2AA{y8HB6%OU3aqvd0*t%gs-3GqPv0
zeSN{i|A(UeA7OL1NtWyOFt2+3u6@SWdVy^54g2c%GwzI-|KgNu>BAb~2fKXjSFEf$
zmH*+{#+JX^BjwMyABq2={r&Ch^*1C-^`&3Nacr$&o$PukH%FpO`*{|BO+j@++ZWT1
zOTO*jvj6SU)jAuZf1G}-dSz2;r1BNh)6VL5e|m&pUV9^<$$g5r`c#(d-%mfNzoGw4
z@CUO^o#F@mL;NfiQLpZrasM>gZ89^wskpF2@;6h_oktt@Y5r$8=(0cQeA6{?GdbNK
z^A|bgg!XKc^4Xs^Q?w%I_6?oc4(}&0$b4CUwIaB=;L5UvlM<Ac{ymlTpP?r7yuQJ)
ziwkycG!2T&yFc^Kf*Rrf3{67y2c7J6<D%|XT=%@RPa?B*ip@RMecs(i`(>tFE_pU*
ze**KJ165CW68^obI~)JO;r)%@5B+a^t?w&}{S$XB_oH(3E01keLMMB+-POC>KVR-$
zNZi@NEe-C<reD7|+Gno6#r&;tLx0@g>Hqj&1^y^2p7AIABi~CK-Nn07Qs2IvnP+M}
zk1ts4;;{$v_xOyz`M29A{%4S>yEvae{XawN!;f{6VgWwa<b)b-y)5kc)R$6k_4vZi
z^;`Zk6olV>^dni^i>tEbr*gG*_1UTw_s*a4(|L6G`3y_n3x`iy-ukw8|AW6L=L`S4
zH2*`O{mtFq0xn7)s1u5)@n8S4@Tb^5*$Xy1)~q?foD~~$WZA8=A_6{Ha!GsEr0t*i
zpW#;dw`D&b{*J2HWn2H4Z-LaYb8eG;F6kPJ&0hXa;*6p2Ox5GOg_@bsIwHq<lI1VD
zADRC{*}k#v+JzdEADs(Md|Y>8jVZ6efj#_Fop0SSyEE^f=dbW*>yPW-<bJ&U&1sQY
z%lm9tS$3s3f3I3L<<MvU33DFoSs1$Z-@AyjGTA2>J74})e7Kyy;2*E%gZZ{~pD)FK
zdsX&F@AtO;XZb=E{bt8PDyl9AEdR5y-2YG5)jx0c^q=%KKltn2GM1{?DVygca9o&l
z{6f{^FYDIvH_kKKl~kJQYo$B8bB99pW5#}q@1kFtD!xA|J>z!S`NFi5ov#!hu*o{+
z6yK4XcWk5DkNn5>!hYNB^!I;iuDQ*5ukuYuLi+1jfBn`ahs~KaJMd5B&$&9&S}r~H
z^MB|5WdGZ(3!{D%{}YVoi@tZXR_5BT-XrUpwPaPcb%xBD;237}JN)^yrAj9yOZARy
zv?(}#x%qGQx8L9H{0M*0t=~MWZ9mh=(iK1QPwi>To9%pJ!Z{f}vz**}XS&>#_H%Dl
zpCu;fRz6j|@a6GK`{!7E5~|$lwW<8s=D2CwU(^TvNDPy|aplD!vnNH}U-$lJP-{D4
z{QC&A<vFXK-~SorWl1jyol*Ju=OodGTn!<$>?(DYrb1rAJUg|HtE;bHXI1ib#k=*l
zu8A|RV-sPV_juZIub*;p$M2oW%&YuzJHeA@&#DdV8-I4%R6Ultrm;JKLCeV2{Xaw8
zmV9orlkrW(_m^3H{l4bGrTXgs46^?jUWXkM@H+ng;xnO3(fWMZ+sZ#~F*kg<tI1Pj
zzOw!=l>=?T=dwSoet2(xvHan?V&A;oCa%-beUkC^$^8vKy^iqyIJEx9$M{SA$M_qg
z{xcj|xaxk5>2|5MmDQPRyk+NjocW#-eafdm)b-Bq8E<3f8};$a{AVzX=gwE}e)w&A
zww7nM>C!0yCpM+Z%2~7oaR#i~<h5>TYy{I9t_>`L-tw`2f!mWW9ZZzfIQ93-@0o||
zF3oCvwlekM>x^j<)2{t`l+dpcz<=`w|ICKCH6n%wq&LpH`eXCjKgK`$#d}-7tzCGp
zvRvG{S;Z~&=5CoSc1h1==GA6@asT#w)-!(IA91yI;cX#%_jE4loEe`T{Z4ygb5pp*
z*Y#(#<vZdmE+lUE)eoM<I;ZAA@#j9H^0p^EDScaSHuo&%K5|&tdSB4??lq;avv0Ru
zS(}&pw&h&FY2ih^N0=N-Wy|`$`f0C@n9DJh!#im4^8jYy3q14Y&CT9@`9DKOf6pwJ
zv%LFumjv$8_V~^4pCOf*HEwRh`&ZeE;%`lVbmW}U)jXwLF}b%@0w>gqyV+m9wd-o-
z=d3<gj#3*x?kN$sBxQ^|c83@9HuRMK;m`Z}EBHSH%YnbMYtldd{<i%?+0=*Dnt3Ms
zd9%08`nJ*fVbZoum+z|G)tPa?$ZL_sWyy(~8(Whs^Be3X?Tmidhi&+~R_#Ogogc}E
z%CC!E-?c|f&~#NyOvKr&X`4@MWDQimE$H`d_Ca~OTmKf;Kj@gxlVc}acT9Yq<<&iw
z;%%ktg|g<qbn{T#zH{2KTdI8rPNel2ecbhKnwoU;dp*BL+0QGcTYQViJay|$^-eh^
zQ*GCnzo{Q(-``Tt{IvR+|ACw*ZI%bVGwu0zIU+jNadDEDN0D>sv5KQ*2636cmcF}f
z-SJF=X=>-xzIaQO(#H#4#zj8jHF|fftn>s2=TFbW3?Az1muLN}IvR3)#@}qdEt{=+
z>+aoqq`xitkt?&^Vp)E<tIwpCu9<LRHlJ#de1^r#9Z#A(lnZ3!tRAH8I?wm|qSySJ
zvl@@Rd2_(x<^A=aS4$n6%8<V$nIZSU%g;Os&n?ya4{uH7TzmY(?@cykFShP6w9?kU
z`6=o2RJ}FLS%$|XCSTd^z<44t_I%4f^@_e*@3b|yhM66i5t&+aT1K&<wxxG@nOoJy
z0819(n0wnMt`QepQqAOaK&$yPgORx9-R9<b{&m{Dd)4k8iHSWiFYD<9Hkr+41v4cj
zm}M9Wj2q`%&y(BjA26xRKDAEf-^E?|t$SE*Jw1E&_F2(2dgqvD+MKwvCR;La^XZ9Y
z?I{x)|D;I$w*O}P<6TYqQrA_lT+Mwh?KxJi(C|h~M}CHt)<XxCWYa%8@4ni8X~v@6
zB{R-j&$!BwB*M^B@ZjN;cf~h%o-6RJUHpOl@xRp{KHPsPmNn7zPM{0#;kO~I4Syfq
zKJ;|z0rfnm$8(yyzAAS-$qKylXmw+#qK4h_FSdohZR*a(88t=s3)k3R5)X`2Gv}C~
zwK6s7;J?^~-<fx$$nALB)oP#Ke=|J#V@uSXdt4X81GjH$yQ=nEB`ZQ9UpG=*aMP+u
zY)@6f=hW!^m|OhFp7CDA^pMuIPxfstk6ov7SnP(7qhw~I+s_c8C4J2{y!?&(%<BbS
zU%$?<V3K5zX>UAFvi9}w9qk#i%*FG5u6-P)yZUJD@tzM~m6rUxH!uIs`89h?7yrn1
z*p$!r!|L2+zv$vmw+}T*%n&H-ozwi~9J@&5ozn~Nbm*x}R4zRb{`1?s`{o}R&)XKp
zW#_NGb@tKDx<lv8R-IaAv}WOydHeN3tme&p(!+B-x%AOnv&bmUm`x`R=v}DpD{%bj
zzwZ6gyp5d4Uc2>)w`OkLRbP4K)#9@~u^g>uBJXd#vXT9&^@qy!ia%yP+{^taZnA!3
zO)S^meM@$~)f3mac&_2$Vw*P;`7PhsR<3u7&3bm*zr!xA_n6Dd?F@1ZHs978f0TWG
zYfI-n%g0?Fs*#T-CnUdd3^-_i?{EUogR<iiR~}vdxp*-vr<3Q}YiIuSf7suuZ^!>*
zdEoXRi`Q;lw{-cr4}T}05!CtEswyevQffUrGiEBg%7cRJ*Z&z9|6Q}Hv08P|_KlFT
zPvF((cWpe5q|7L6Dxb7e%z;Dl_Sxe5TioAV|ET?#{Yb6#k$X&^SeG7~BlPZ<M@#Bc
z_d^=2hpk0b@(wUJ_}f(6UH)eJ!+fqaQPYpC7kc$lVTY1qdeSmcSIMOF(tgQr=l*zo
zz&88&Vy-Q*i`GoOzw=w@>xUmTy_T$3+xGUp^T+r9_)PvYG$mF<KU#lyhkaiE&Drk#
zZzFF%=E(IvEI)};;FZ#S38(cl-bIEmE%8)N(z*Vj^pQNL-qfO8Q{8OO#z$$atQRM_
zJV~z7sVRI>_2q2+#`ld|_*pBa9~7!l|HwAq_CG`G*VU3=UbpP&_!;DG@aZ0B;1$oE
z2d$eIr6fz9w||=aJG$=RKdT?vAKxFd<NI)Ky5^;l-1^|lYqm;v>b_Yk$DO@WdHbiU
zH<wzpC{2F)Sh?|Ry+cK4uypU54<<@amtN}1zkadIUgq)B=ED#7ZS9=YuQxqcd)@TU
z(Nz(DF3$J=u(-8&y-JHrZr7zWyS<))vu=L$@2nAgWGn4{X<NMTqRiKcyHs318=72}
z<fscT_U&D)-nZPQ)-dz8QPy>FgF8Pq$27KNZ$H(UwoAK@O?DQ``HKaHagB>=L_Wmz
z3U=z{r`e<iF5KqRJb5xpw&I_Z^{;gHAFTN;dg`hF<UhXJwP*Jq_*Zr8$KeSV{7hc$
z{Lj#8e|E`!X?dZe4|lHLT(8!zt-VSwZ(U1-1Q%xrL;tb4)k2xKLT=@xT@hjJ3A=1^
zl>P3{nLAnjGfa$MU^buMhH?3(vvU3UD&39G&hfnev1RGW^}2tTmQ*PGs7|fVlqq|i
zU8T&?u}U)CEr^4m#KQj4-ZS41>ZHXt&P$Bi6R)&i%lDt&wcj(Jq{JB~Zrs^w!z!h#
zxm)ett+Mbx7e8d3TV=*SL+*IrUH80fyYNFodmWze*=udKmi^smA!|3kH7(}k4pwHy
z>g!MZe$U@@dHKqyAdiEl9>TkpPnagjert7KG;`Op6_Yo<2#ykuc<bQ5G|JrLl_D40
zJ^Nojzph&QU2Ep+F0Ct5>V!>wZO`p~v#a*%#Ci7uWlmZ4_Q%YrSv>i`lR5oahwu33
zJYON|r5Vd_(|F^PR-sMuG>O02Sr#3q!xtNW)6K|;du7%7#UT3bnNRLHOO@PIR%u!)
z)*4lsUaqnI*thV*e}-eT;(NF3y;nB9RP@rSZFm0#w`tC+NZ^{>_g8yzSnoN9b5_4D
zyX3L^ZN0Vl?28k7`xlwocSz|UzJE(S;N$kgn|8HL{q}Qt7iWk{x!Cr|O5GHB1FqA`
zE`D}F%*k5XZ)}4PT{!(QJnTb$Td8K=9{rD#Jz}E|{p#NA_HsoeztzRmiIvf_GapxH
zZtxbmxbgR$x=0h9s<JQZ3qL$Rrd#d%fpvb<6P@#mUI%2)^7*OzE%HKADu*AJmy>1a
z?a%8TRj!lqi@N0{^(C!q-K_ap|IXezxAP<4=|lGvuN>aD`oVqSSkBa2fs;;$Zk!c)
zFZh7&w;9pp3{NIis@pG;7q?IM@A=Qb6n^;RM`x#6%|D^bmaSdp{>;^8a@1}u?VQFX
zDM{xV+zwajuo)jM-v7aOefNKc&D#&jOIA$(HuJ~sht~T=e^iH5&x}7jLAu<#`_ZDu
z#k#MLOE!t$SB#l6Qy^iz=wHyFl*6&ckIdhG{GFor)jL7wkAw0~gPrUdeg95<Qn9YE
zj#*$K@$G2c<A>%#k2h6n2`&A->)xfByMO0MZz+AZb=Mbr-jDIkpZ>i6zHarmDLWNY
zFVD-2eR=cc=ljc_^LN-k=>5;I^?BPq9?y?SKQfD6iCx>DH~;X2^UALZ4+!k$J!HRm
z&kM%8O#1^uQ_>{trx@PpbUH1`vxZqymTSWa<r_Ux|7QP_`tke7<@$paHrY$=-Szo)
zeVXx0HKn&tXM5M``|oMwO3%CTtTMLZ;nE_z&*?v}{kXW~<v!UTM<4xV_vlUBa`}(r
zn#cnk20|L9(jAK(*d;;(*f)s&UfvdyIx{)jt1VqsU905P(W6nPmj1oI_ie6x-0}zW
zbPCiW8xOmSPCI(kt!TN*-FJ_3!&e?)x7Es+GH+`r+auN-*BnVl+3atrA^+-EN@uh<
zh);}dTb}#8LfmsYi^1M2?Y4zaZ%Ccpw9)94&5i?d%l~{?f8jsFP3>>uKPLW;$h<av
z+WEiz4`Yo(_H+kalQnNGYdYJzcZ)kyc9Y1Q`qll?OVm4VKdso^S+Fxt_;tm~6~}bV
z{?+#{{CbD;u*9145+8PC6nh0uiZB1V^5^NrKZ;|omui^Qs$HsHeR`XAety32d7CAr
zg3dx)CJElrnp3|1LVSDu2e0|J<sY$bscOC7{`QY~-Vd!?e;-AjIQ>eYH7||%=2iZ!
z^<MRi`_uTF>NkgV|DFC}x|_H6$|<_{mK%QFD!s|5*z`2-?IKUXWj8Kcgfi{@;ChVl
z(f)}$Hox@lp6l+fv1qaUvw3U(O!lm~{ZsyWjpmoA13^vmazoG6E?yLGUiR-vy&3m^
z2A04duXM}zcmFX`yZznlzUcX7ALU<f+gJCa_df&6s=piRWTQM+MrD}&)7aKyY@A`9
zU9J##&UeqreDeogZ{KA9x=?ZO!KGCXn)tnb?BTx@-KiN8wCb_x&13f`yWdLQ*C%5d
zCNt%shTY5m40F#vSRHst|4XgkW6!I)Pq*&cQYiDmU;3zt{`H)V9%3$bjaTHea`$kk
z@b~<BzWkB(KhwWU{#}ya6n>EZ)_m9B;z!=<@CHeoihLc`n0zI-_;St;rHIcb+Y&x*
zFR;4)Y5(u=e<$Td>{Ie(mbdN6TV202etNEc#5OnY>??i|3`cv67d-Qj>|}lxR&rAQ
z@;;d#R~sIQel6QOH~(pVy~VzLv)7xh{B!Y<e&dck?SEHwf16T2Q#X9o-!l6$`v;Tb
zw+j4N`(cuQW1P;eOdH1s6%!)&^iJP(@y6Sh=S}A`j-RMoe)`kg{<HCG7ptV3{;{rM
z`tkA6{hRk6J!}71e6Z`%-Ar-md$-H3?%F>2$<D2HN7K8tj1QgMc>a#)-;IClKb~*-
zr%@s9{$t{U=>DxQetn%2ey!+1(}gn&rx@6*Ua$44AheMsZU6K?RUiI7wVZ!_h1-?Y
zW`9+$)_jk*&Z!Tq5Prl`T(kMr)YPgiCAD{|?5CZ7a_@P>4td==zxsm_{~1ze?9;1J
z?tk3gsw<T*@Iy`A+*9Dp^eAVumu>7i*ZO~dk(oO$YsJsiU+0-TUu)-)T%xJODcBem
zCK(oF5YqRckK-M0UHBmz-+1*inQ0Q`Yvk@;5B==^N+$g97UP_K>zD<$%=$gwZLj1X
zZX0gtTm^Y2zT)@u{xd|yb}&e+-&~)+{$}0tZ=pYaS3d036O$9WdUdNVliz|U>xXYW
z8F;TvGN0Q2^GTAW%B&w-#MJg*nbU2(xc}hgV-J^B_^Rz+_d5ON{HNg}1%Gok%Z9Ud
z^e$!3|6$i(lHn*4w1NFk_O{D+l>;t*aIbo_X8(0oTkGqEnPO~)vtArK`{rEDI?mUk
zD=$TR?_j+1G3wi=oSs$l_@kaFvn23ct-AL><Mc*_lJ%Oa=eu&=E}s4|)9BtYrpH;I
zYO`DCiWI(&O<P;Gz5J}zlLoW?!?$*>{5;A1)B0-eQjz}7vqEz{jpy%tWVH6;Jo%M>
zKZS)^uFc*ov3-gMbFm=vj=x_@9Xmc7o-_Uxwq<|6$!`5Cok!Q`+DF#4L_D@#xs%~@
zd}7_H{hQ5Zf4t^ffBe4S*N+eGx65&C?|Oe^*3ag*`~q|T?2gvfu>9?|u;OQg(&6N`
z)Z7#OFaI;h*KyY!n|1uK@JH!y9v{OyCI?>1U$F7YAIrxQ3Vq)m-Fskm*6mPq3dcv6
zfWOO({HH82<S1DGFlonOPJhX-`jxwv-0CjuuGTbNl<&Vc?t1vIHS!FPUnkV<eRtHf
zWVTn3ce%)S?=NNc_9b`ia-Cl0zP+-0!vn@&A8+lo_xh2&_LZRQwC7w_6AEhU<Fvm<
zKh!_)zVSc9rvAn+yz!6EH?7^LRO9%uwZ-bti>Re%w%rPAUK;cKO?+0D!1>}8_cV;&
zByPHA$0j|qZtI8jhu1gnYJZ#iA>xO*^Kbsve=1Qg?x{)1UhY1!#k+Oqq(^6GZc=TK
zcDuRTGVJzu2hk6e`@0O9XD{^Kp{llY>C#i{-md*+Z8oWF*RHMq8C*};C{6CM+Zw33
zZF1lCe&bF1roF8;yLLW$@rUUiKb%(_teD{c$>T?AOv4#A3x==H`|Rh|@;;PrjWfHx
zPVLej&Ba+(TaRvutGSr@tz5icCi%ym=;MkG1%<n%Hx$m1`YZ5b{>T21AH|t#{+-y*
zZW5~%S-QL9%iFR~(SfFKziq6xGK#u&Zb|LDTSuStoikW*WXjZY{OZn+<KHqqzJK%c
zG5+7i|IW@+-SuH#?}MAI%a*RpbhCI@I=4jY@2+2ug4V?<%{Kes;6ANem@SOe>Ce+V
zz2lGWBy(lY^4wbX_SD+<)@oO8hehpMcP+CvPrAA24)^3z>A*~D_qW-Lc871Bdv9Lf
z%l&6nn(oFdIo-RYi9?}@k3-=Thcb)cgbE8&jhz?XT(3PfCw+Si=r)?1Yjq}9|H=QU
zt5Dp$|Hs0I+_lM}O?R1GO1&*-o%@w4yXTtVMp+}ySAKO8yDlm044Pzie`!^vn{Cnx
zw>?wW?|O4NbM@EFzA+EZ6rARdDoJ{uyXUg!@~0)2_4jwzh%yzNz5S!&SLuVR!XMQS
zZqU1OTA<ec*v^wR(o0X6HPpI!9!)v@;kSRfUjOC`JlB`M(XhR3v-8nL?S~$3{g2#d
zdS~o0yFKUQ@yi>3UH4s9<NTv^g+-TjtA7%k{fY1E#b!S|H{pJryTyagk+~mU9Za!{
zIimmbZLkiXl-Ko?;4_7tcaIvs=CH|pU~S5}E}3~*aewl8<`2(i)FgkHnK$iU`Ig^K
z6T*Tz_Y~gzxTDs1)=$0o_GudzdRImkS;`3h;JbP_JD&Glz|U<dn+4~29IHRHq0PB%
z<-47mD+~RMChf^w%YV66{M*!B7r5lPf1D4we5m$f`pSDsA1`nm*=_i?|Iqf*{vR6r
z$936!&3^m;n7uAKs`H-amAjlZPs~1B+<msBy^~3BOJ7LUgnGHWKa!6;_Sal^r%_~Z
zxcvH@&`KNIN7^snZ2762S~lY?&*4cMeEjRZ9v&+Yi@0v`Sh8x#uV1n|<b^l;<+)b8
z-(1^&?ezU0n){E7+eQAEx#sQHNM-K6pQ+m={?&aw{5pQS`cZj_JgfcvTYt}x_0Tfq
zUcy{1qZ6c7f8OiQjr|{%Elhr@Qg*b%|DJ*6og;G!FC-KmGrp5P+5L@qK+g7vIj0pv
zJg%hPo%1#{KIlk;*5U&{eQaNqEZYC}#`+7#;uM~X%Bx28-CO_X{O&hff9Lns>2CgD
z*Pd3Bygn<KLpN8&xw=rNeGYTM84G!1v4j;1Hj4)M)~)<w`gd-9`u-cwD)uSXq%^yK
zbnkzoEY5MAm9Kq);0c51sh^(ja5DV1GGs%}+C5pE?9cpfe)j+1|Hl2pv)Uv^(fdd2
z1&(#Dd?m<iGOfU)Xjbh)t_VYw%Ep3ACwm@-us;3cxU!=8xYg^5#Yg^yBpv_0bln|k
zT@!t_$Y@2?U0elc{EqzYoIksK?%Rx@{YG`?my{KKu8y*c4g1@lR`M})(Ug>_{#*4<
zZ+iFVSIN77_x`T?&yan-D~|cYy7tGOrmMB*1|Jn$Tbi0%aJG1rdrpW+k!rKTwk@68
z8B}&oy(7mW>+r|u$Jzf3tX_YYm+%_>et4*2*{@H}B2HzAhs*gMpLB`$5qHFr?o+)7
zv?34HG;{69nR?(y^T+%nQs+BV`lI*ydOnyq=~$}u!s^tCExD2myh{rT8+$&nd;KZ7
zwx`s#_36LetCwsK_BQ!sbX?f)yvii8+T9+vj>x3UVO{_D&FP-cHn*j%ERHSa@?CLE
zd#Y~ix;>M&_P_bl-DotYnUTjWS}tp9P+m~Y`|RDG>(+kRdfw;b{G<7TSyDawbg!&W
z_1@W`R<nQB(_MUg-|8w})w0$q{<f<>7*wA>|K_S++VflEEU${4<hy>^boRuRFTV#)
zZ1Y^RE-XNq`A5<;v9~+IpXW|Jx4NeOq3V@K5$hzQthED<PGdN%I=BDc#QmN7TX^`4
z=g9L`G<`lQSG)M^Gp9>aJuQM>&JjMYkdjch=lbr}Gudu3d(QrgFMRTN)2WK~s*k=u
zm(=_0llafj)Khmle#^6d+w1*X?ixQxKO&Kod1J|^lMl|OpLV#!GUfR5jPiBf5{qZ1
zY@YGRP=D6Xc$+KxGkE#pS?~RLTI#L5)S3JAx7}ev9ZdyKPb4?(<(gMsvp4(a#Ve+<
zwh!jV^6C_b8@gTCtn9g+gXyiMV#k5wy4UxHUJOn2T=zBN(4BKTC#lA0$lobDms(J%
zck|?niuJor)i@owu=HeXwcpuy`)b3dpZc~bo_p4h$maE?Had6hUS`c-w#)wTiLdpy
z+`n~y%s-MZW%519Z<f%;>{=VImjXRK+GjS-@wAjkQxWywHTUMevdTqQb!tw`*Lqb@
zzsudi-p~3!!`Ib6*8NS{Z+y?|bdQL_-!l*L0@(PhpKo=W7H;;d`tFuaqpzPu7-S3%
zZNGkPU$AKB+{)is>poR)e!n5YDx%7(l{I7S#F?xQZmr>{_uVPG_dmn2&Fi0ew}x~^
zS3YxBmpt#lzTo`N_srfZ^%~4FjPsw~+I)J^#u@8E3MW<mXRut7c019=L5%TWfq}5h
zoR8ld57^CJJtKW)#QJG`{K40@KAY!RJn`TYna}+`{~6|lIdb?#Y^%Ox);D|p|4V-_
z|D9{cS25v5*nPo&dKpqrcFA;$+*1A47I7y!_i5^^drs;p2c!#@7d@HSr2X^de}<;h
ze{?^vH~weHKK#-6Vd>Sa_u4;t9W4FwTWQ9{yhoauB~r3S4n1>?l#C2`pUKB>@$bn#
zk=M7<)<4i?`|fk~*h-<O+Y9#A>+6*<l<Op{GJFy6V7=Er1N#U2Kfl=U?|!r6MV+Xd
zi66es`DBv$^vHMN(?y@Q)NU8(NO|MOANAv%+>xut9*bJ6O<fef@cYl%%f0ynPe!`N
ze%n-6TfbWV%=x$B58qZFt>-IQS+Y91*CjJ*NpF#Y+ca0_T&4CK3umlIVpNbxpJ!F)
z@uS)M%9hh6zCo6`OZtL@G%qerSdwmU5#;{xc-_{&A{9x}onQ6eS~Lhmt?4*FC$0Q|
z#mhN7Pv%E`T;I9t>)Cs|zj1p;r+DsQ@|1brczwmc(!bS{DzvRWge;Ao7F&CJ_1_o&
zVjsy%D7NhNxcIF1%lEavj6e7l$gJrK;i<2v@3nt3UFStoZ(m^(<NIU9@w@*sq;AR;
z(^%HT=|7E|Q_210>vQ3s)-nFke8B6#esz!al5<ZIXRcXjDf#slU-qT-Uuut7@2Y6I
zKPT#M<m1FY6^G2TuBhyls((^B|Bdrw`{v?5iXZC_-oGUu*6wz}_v_LNovI%1-q+n)
znX2WyKkH4)QJ(AkyA2QTb8K4J{?+$4TaEjN_ebmb{<!{UXvvS;bX{kDr1xt34e_o;
zt8-bBjvhL|F-gU{Lq*WSS>z(eGxvOh$3GAKDE^TBAaCbme(fXkgf2hZ(0A|IqY{rO
zn~ud62YatGSO&k0PpdmT>-pjRH^m>jHGh=$yp;Rp#nzvTFK!jiIk)Oo?FWC;nUP%^
zn?gOE&9xS8a8QvyTk-hC`&oNb<I{tTGGkTl-jCKbFSGmI@~7f-oYI_hPFM5nEnBYF
ze!KFoW%-9mrWa=2cr(2~^*Hau%RKy#DqqK*y5qijO;p{cWbZAH)Flp2J$drvPmlN4
zukG&j_S<^to~NvU)||zBjxhy?WgTU%pOLe^_BQ{P>DK!*_nbT!%Jnox#ND|mT;jaU
zgWuOb)GXA>yJWvEI5<jrp3=p<l9x9Z2KF=+d6~z2m1L=2aeTe$#^u=??;qJ!w_Iz@
zDhrESMr;O_DqkO~?c`^#@$Y-5YksI+@I<ZC1L=(S+a8(E45@pUs{S-xzH|ml9^=mq
zy!}Ei%cWc%)@%*2RQ$Y^t;jL$1ebgK6qyg~QCss`&Ck9&artV=%etGN7Hw3$@lGb!
z^}tD+ytHGCZ)ZKye{*q7T9ZlQeuY(&BxkF%>dtvEC#9<JeO&jl?6B)*kA0@@uMiBk
zc|37Wy2Lr_vPT<C@7g+sbo_h4bf$3PG|MD^8=mAFp~u3~%E~uBJa%_Y%6*wakv@e<
zCdsUa+If5C^qktsFsX1}QP!QHUaL<53@wT(1(KezXB>n4A`icPFuBioPUzm;h1nGe
zpRQCcJpEky)2e75e`S_={3{-JJxSdgo!t=|U@}qt)|6b;Q1^4M4%?WCBqaR3c);|9
z<K4-+TkUKA$<{bt)cGg4Z~B5W3lka{4Ng8)c8e@{SaW0wTiUH3Kc_Sl9%O#;pP{vg
z+n&8XKjzg0ukxAKJR*~=Z+wVxDOS{;n)`9`#0ieCe>DHLuSvU-wyXazFW07%S{+>-
zQzKQ?0*^fY?xH7NkZ>ejx4G-D*`^-{7ySsj{KhKDeWQ{`vhd0LJ*Tb3LnD<WZX7U^
zVA{$2>`vwPm6xAg`KWb%+UuQPk2OA8UH!Xpb)3R9(PV*1l3~tr-y{{Loz_fR#dr5a
zRo~XoeQKFyD?a!a@YH37Ry^0+xSxe>YFTt!PSJw4u#+r3*H7|)takeFZ1U2`t%q;l
ze#QEv+T)m-L%`hT(@sld#MHA45+_y9YyDHYq~h8$wWgP<-GOBpY01WB&wUrhKV^_>
zX#O<mK$FK~_tw2@l3wYaU-NdKN~YhYyB@0<BAoAN?>P6THL`-WaAI3ZaT{}A<)M%A
zT_t;qJ!c=@wdGgiZ~y7v8uO)2eLS{)(%Y>z?`QO`I>OU@p)dQPeD8ii_rv@wCUGK{
z*O&78$?M&F_T<bnYk?y|>XWmN^!@yM$@pDf%VUdg{f+m<{_(vCh|R7Ozq0kqm36*5
z_gifY+cqtxxBaYK)BywkQ<A~V`-)>qm&)b2ezwxMShMe<zW?im+trW$&G)?i?rW`a
zz_v-}YcBaR-PXObA^Pa{zolEMQ(8GB?y9U}=6N7I@k{Fcx4fClZ_dt_tQ0(My6D8W
zO`D%p%;);gkUFza=>)UPkpmOljQG{h%Rl<haCp6}&My0-^ZDJ2>$#2Y8om6^T`W*^
z%;2o>O!isbyUh4bDm=FdPhR)$Y(4ir{U27g;)l0?zm}a5mTf+Dc8%WSvLA=%E{&|n
z-4WdL_kriJxl*fM%~_Wjx0Z9u>tpxoKln%gh+kY`leMktKSPtA>MZN8Jxfo{3;(>x
zFHj}zU=B}@*|QjiiuIp&f{w*wxwbz$zhhVHlgXCx!dZnYCeGcnKu`Kf(9<@H6US^V
z53GOR{NVk;`<?O}f8v+lihre9zTBlza>}1G<uc5|GPwaokp-3Kx7Ksoe+cPKGyGlr
zCvwa7&P!$=S#KFkX$WnMJH>F^y79pT_qgT1gI~nDhMZr0aCOw|`kyBCXZ}V13h|z<
z*fV8)<<a=3%AX6ryiUn!^0S^CeCnfzpq@iPgHrQ3h8J2>wzFuss%}2!8d7wr$d7$#
z{j%bz8ZV~a{8#BFTrX_ZEAt~M`$~7*%mv$=KXW8SrsZc`*|f}mwL##$J>lP8eO%s@
z{=<LakKhCQ#QOc(e+Mp|9=L1Aq~`%Uv~!hK88^xZ9G&)AN+Ri2WXN=j=a;wa)=-=4
zoVxpWtzo=n-7Tpu*N3(2hXokQPU<aqzK-E`PWO-ZY45*he|j&u@sx~p?Dp(W>-Two
zv3LK_YJQ}m%H--lwSR%>&t(s!G8deC?^E)h;dS*@P6N+_=d8nyyzc0DFuD1B%|F@I
za`{tQ|J462{iAs9PELK5<5ZdNE8L@|ZgMjW<lFD{WYwFJ!$~)p6C_uiKltG4yw$VT
z70&m%x9rH_!c`S7gL0X>dP>jwIScM6TNh;z<g?ORFqvI_`_d}@!~OhsD_$R$l5hNT
zU;lU1ziS8O^B%Q5EA23l{r3KxcGK;N6XP@M4*V0@_A&fz<cCk!YI~HgC(h1f-25%$
z$<846%`S%T&z4^5-`qX-jQZM%n;+=ku>Q92$NC5BWomqX1V89aKN=_dqjp71=C5N5
zmq&9>x))vi`F)SYj7LT)^;(u(il-SYm;9Y#pLqV3__w1!4ll2f`l0-A_Fn(+-4k8<
zZG?{|rwg*op8fM%{o<%&j5=@3J=~{r?P<~Y+j_ai^W*bxWgo+j>EAql;McRosSo}$
zi2hjfqbb+UXyVcfS9BN6FIm^2s=@i`lq5@z^3RJq&xb!K{n5S1+w^OHXKAk4yO(8N
zw{pMUUF_8`Nz7AWnp){e_3Tu~7e>YLTMFj4>^O5;t1mHFP{MNc(W33kZoOK&`Tgq)
zf80B5k`6z;xn<Lfhj*sPE_t6?9q%jq@9T@|^KU=@w)&&=ckbF6!QZkqZ2Q~(>9_uq
zx{~|#_NT+O|8}oEGrc@t!=X^CQnTX|i?`M>!yf+4{}~=Eix+zH_D|t&vl@>d!K+^0
zy0-Mee16?O7o+2y?!}(ndTer`=$@n8m1%`M9pwqFcN{E~_FLE(f5`I}IF-A0&GPxW
zlN??h*YQ+W*{H7aRekcwb;l$B&Rg=~@5<`EW-f8dHG*YNTDuv)yZY;0{GlB>Dg_ah
zq5H2sHqEYyyQJ&&>*em+YWZ0qkM5io)QQs)sl9d1>OX_N_O6%fbL$_-Z`}3#`1>E~
z?_2hnW&LOP5O|*D$E5EOAFnNc_@80p!3QrwDo@vZbd{VGv1jc^uai6hdp3DL(b6nE
zSyw+JH}CfGU(YsHKav-SIIsHl>zVJ<jdXlgeZJ#$`OE{k#wBIS7X-9l$|gVjH%mgr
z-$ctYVBO)&^EoBo*JV9ETt2HPf78CX`|lS$w+}vB{YUb!Ma}$KA+Nl0R~)r`eOluF
zG_8{v>;C%pJzl4F?AeE2tt*cumOZ&rvS;4gyYDI(vOA(r?dyCn;oAgJ`?V$0{34zD
zJpVJ;eZ3PG@0-1kx6XdcAvcZ#`Gr0I8T2$hY;WJfFBF?|A$^+X-3IS8u66I8Xt^z!
zlX|0-WfG&!^%wscZgo1I%Kp=TqJHDgR~o@p`}&Jt^WT{N&Ff?Q+sKcJHrn|nv+CNH
zt|^Z?w@^ZQ?c13h5f9ay3oU~tG9P-lB*BTb{tffteOw><57)O^**E;*Oca~GI5S+I
zcj+2sZYd7ok7>!%(k#=GJS|N>zkf6Rx5bP7o8BLsYyWU-qi3nwe+KVsc~=tdW(lnj
z+E(?ZgHgm`{xlQjYx|a8?K=7JcE*(_f7hOu|9XV~W&CsZ?tN;Z=RdwPx&Kb{u50<f
z&tG5Oti1D|!L3H+!?ixghM0?gzkHqi_V0byAN!~7^!;g?!g&4KB5&(M`x08e{hF#!
zm)`Z%^gn~#5AH*Tl6#^b@#=d!o;06+?Ze{_m5hJ2KUsxng_N~Kf3Xi+8D<zhdE+%X
zzfAYNHQ!Tz$JU*^)wXPxY5$S)Jl-W|H@NMZBdKG}<ahttzV1!cv0mqF-TkNP=`NRE
zG)pZ~x$xDxC9C-tuIovQ>^yukNpr{jUD=;4H_Ysl+xxfW%G#UDe{$@fu-@>;#SiHZ
z|1-R0{BS<#N8m@J3wK`5npLQjd~Vy^`m3?g8`)DXnxAQ3_|z|CV%)B2E&bEC+Bh86
z?$0{S-n+VewbYfA#~QnrZTFRWwBgF@;HgrpK2F-~zbgI1(~sXD<oDF4+jsvueu!U2
z!F*P*ruP)54R>#!GLOD{i2u*#nMMViHy%Ddso`69u>PQQeU|XDSLOAa+I!NE?pyZx
zRh(?OjqWv`>C=+c|3$AbH{^S_na^m^zEl4hnwI}NBb9#id~?}-Ns|{$ukG0GTo=;#
zx%84+;<wiP>`JpcnwE+#4atS;59G5~#QzgmTXg!!KG{8!4u@RUOWL(%xAW(NHhglL
z;<8s8PP{m*<;ZgVyP358p^x)<s%65an$_Q(Q#R>S^)Ivj$Et^J%oBK&pWjr!tLpY1
zxz|^7*N4pfyG+Gpox7=FV2{)%`<urfyLJC|{G)VfpL%AZ(vBU$`73TKp1-+%;emO2
z$MfncPRg6)EGb=IVtBl-X@C32A6YxHE*-wsyHxCQT*kk1haRoGzFg|c+{daVe`bC#
zfBW;dj{aNU-*)$Y)H`mEv<ZCpEjQdbscfd6AlKQf_#WLWk^S?;eEXZi_D_tiXRBy>
zqOCe-B9rmf>6!80B80p)ya@Tk=brWNr=nf-(+cJJ$M(<f|Do~yp!|>E{|ur@Kl&f8
zHudE`w#nQ4!~)fQOBSEm*)5ZNPI5<2^1rHIT>qy1va9F~=6O0Pw95LF`1^0u&zF9F
zS8q}A{^2%xsl{{L-DOqtRxkdU`@O{dk=fi2=Z{YIS~u+pQxWIOp5J`??mwvtoqlM&
zplE+#pF!0-b%k2(8w;<ca74@rI=OlW>y+lkbJ@QpRqj(-Y(F#O!#lCQ?dk07hdAen
zX0M)l_uu*aoaeKeqke=heHj&Vy|Y?zV#oxJAS>awM|18~9McX<-!n(6xqlCb+@0{L
z71tld^%iIRN;>&$^}1^u{~63}E&mo-)tO#wY13MAX<xfsa>s$7=3U`7vCBODp48ra
z$NpuN@SGkw%XL-O9gmBWRr-#6D*XCrjqYpXgnv`NZ(N@IiSv==){I}#hwGR=Ok4P1
z$NR6`>C>KhpB7cGl;2&wBeacug~j^vEkCM1Z1$bvn7SbP)a@O{X@35)5)=EgeysQT
zc)nxJmi=!|Tbdu+eEU>LUz>Huog!Pq6YD1F_r#g*yt4T7yC74&<xc~w`;XL>ez?)I
zUDPJj+uvJnUy;4<>Cboe&ExBuYFd3VXZv^m8|%A^Uhe0wPu|}$pU=jU#muncny>fq
zS+krP#d1!V{ME5Ienxp4&*}NQ4hUWdKQo{6kACJy<wx^d_etN|kx}EgHuF|WhsBxj
z@W7)+J%Xp5Qkd^;{Lhg4dvAKk-?{c_`tq6O{(omyet3|vUZ+T)IpE^@DC-@OQy!m<
zeKPg;jWCM?79a25yzFv)A4|pRhw^WiKEAnj%^q#_zBfr*KR>h2+_UBK6HilJCy5Wv
zH*RTH7Tw9e{XCID`PurmQyauiX@&LtXQ<Q+-Sq0&QfvLt>?(cbFK>=Zo6iY8Ty1}M
zsn^?_1y_RW`u;O?{+j(e<n@1sjeRqJJ5;=W)PG#QbLFGo-FMTTCVpsdoU!Mm=scZ8
zoA+K*)6P$SdYtLFPC=uQMXH+~U&Z~K?B6D}KR*6PME_8|;Cfx%oM6|j`*v)(oTHqw
z>2k?gVfWo)+Y0gyep<-K_K4Zq*php9#*g{m`v11uXKByBEq?Sr1IHfu2YaJqc3j!x
zyy9MFxY)L0Y3bdze($1hXSeRx{O0lS(=xg2Jq>Q5oA?;=<NnUv!~NiX!~HG$k9zEr
zeEt0Bv^u6A?vHNfeJ$w~y7oB2+d4w;Y~PvboBJxGBvgu@*&SEe^fvA1ubFmCme#FW
z@76{JWm!iVX1Z#-s;po3@AI~I=k7bo9GCmNFKf$GEy30GmZp_?ckgb!?OM8M=V{R4
zP5(3xf6V@N?}xA0K9=uR?>m#O>V4Nd9AhGGHS=VWyYVuI=Q4a(KZSSIXUK2;u{q-U
z*6cFjJ6Tn&Z_l(me>Uk|=F%k2*ONTg@jsA15-;@c^nV7a8p)4~?p<6q{b1G6)|c%X
zHdnX(RNo%6f${0~OhMzuX)J$suHU~W`-Aj9&X3Fg1YNbyxEudCul-Se+x4oRTVMA#
zZn-gcPh`b(Bh%~ObdPS{;2rXL&S8^Ji&ouc3liL{@!RKIpET>tT~{@?b6)ncSrxQr
zv8K7K@aCF}Ti<M{dQsCB^!iz4Rx4MRajU0gvB_Gt#p&zwVrx#_-?sm#^!oOH@;@X$
zOb*|kv9+GJ#^iEdsYbN)!d=&wPy2DGx~*3^=<o_2+w6y&`>anea_8~6tISFG&DXZ$
ze&2p+o8;dPH5nh}kITzc#^2hfyubQoqJtcVfY#CcTmdb{wtM$19{Q}fvvNnnne0g)
z&L5uNG0*nm9@j_lY#HHIeRCgLGp@=u7n|@*np^i?{CvxEg4|3NCx1pf&e|Bi@WhU)
zY5a_S7N<2!ue)kmZ`t}UGqU``k2;0(A0^(LTmLQhPMO#BTvyfloywP&{P<h2O3FIm
zPr~!3lJYZG3D;EaexAa6zUBdc4A+OSpe1XXd6u)t2VPrH*!cC&>wEuB9M)Y_bNt&k
zy>G>~NB^0{d%ba*z`u;ocH>clnxqN6m+p8qlq!mR{adf~VVZ_j@U$?QW&Bst`rpiw
z?fQ4~$lfRCmwcJubxY<u&-Cf#63RBm8!Uf)fBQ17H+fCwubsb5yJGH`J8n-ie))aZ
ze4jegj~=@|%`SGAY2INeze3^ai><q7qzT<zuw8+H#b4<^!<(Cbv%3W+JH8fQdB6Sq
zs-xAXUVpT^ke%ysVnxoApF3FRnI3$7Uj5Rln9N;^UzHh2>^r|LvY?#p<R_Ka+i&d)
zZ-12Ds}r5O^|C^onS~Df-*29Ov(_#B7=66FD2n|GPqk`#P}eFqr2@CY6AE9}OAAi9
z7Pu+vR$cnu_VXF{L*B1{a(>;?4c8XmmFnnUsQaJc74t{akNZ3ARA1e?-zWCjd8gSn
zIq9i;RxUa<bKQkM=XbADwlA0c`<nU4e+IFCs&{YHCmde6bJCyLDTfv)S3K=zoFH1{
zXKP?}{qp^d*AHszi~eZb<G#9M(S;fvmNxH6EJm?fGt1BT|JmFa{#ID-KZDYL20_s&
z1s@N)RrL66Y}@wkm-6L>nn^n|9)6kfpMhn2{i2`W?6&?WO)dQJ`9RR0^dB!vjbfH$
z98++Paec0Tl7;JtaBUI4rA3>~ll~d=kLceH{>P>JxW8-qrwZ<eS5LkCB|AH(%i8P=
zXPf#H<?hY`5!1s@Qsgy5YK|}e&(PFRclFlu<Mnd(hx*%!{lz+$i*@Y0(`IpZqsrv+
z&+q(HX7ulrj9~w><^1zwGuaRSXW&_vYgk<_#(h@ffd#XY4HH9{Bx_MYf#>>X_lzHF
zp4zhVQvIG+*ZtqEyY}k)i(U7B1vgcwwOR?T?+kCh+5P(O%kup$f8)KY{NJqqm>>Cp
zZT;$_k6vu$?o|(MIsbf#&|Qvom!EmgVDeLSIPu2FPh?K(iP!qGLUv8$RA4&7zj~T|
zf7VCo{axa#HZI+>&O;|gfveq;v7pGS;rNa}tG9f3f25ZCh<Sa|N0US6D#H_I9)EYY
zKTY|mQ}Jm5k$DfUKi1ZsYBg!y;*av%FP)w1Rk+Z0@%A%swn~bct(oI-x}kbSLeb6R
zRUi3TO-?>sz0}A^R47`!=i$Lh&f0zL`OY`yTwm?WGvSrqCf+q`+fE$(S^qb7b@zw6
zjobEL$+?ru_Vr2N@w;{IUhi66B}_sVmX(-qaC{c2!^KkII;H(bu)S8{zZ2{-Rr9t^
zTy1~jfslc{)mzodzwZ00yK28a(py_KFWJ~#%HID$=y92%^6LJNeeXQB>RO%hZZmW=
z<edL*@@H-S<NKFoEjF8#BWn6l`D~42{__Ls0Y}^~$fWc<`S|5;_SEe+`GVB#od2Bg
ztLj_jzO^)bdy#XgYU`(l6HlF){A*H59&OZnQ!}GyV{*2Km4S8PF*j?zsc#Sd-Zd}Q
zd#AB^!1j4JDkm{E70=sgf4S>?=F}Mv8xMZ@_ByJn=e_BYxZ;%M%<CUz&&w>hm!Ke1
zBJZ~~R!?QOuty}{HA&9v5-iUb$Uly}m+&S3{C|eEVbSj-Rq~e4`_C|cX^1!vn_1ob
zzg1G^EqV3-FaMijpFaQg;RoOQb!uE!RLu6v=dGCR-kW-5@h9(}M@}f8TC}D}{Ema*
ziLQI|^|U`l|KpSX!T#{RT!r()?{5!(m{Yq+wf>E4(mV0o{b>_SwjEu3Fl2)N?`67M
z8jku~tiRHKbM}#I`?rL5+GKw`eRP)U7Ae2=DpjG|fAPenUNL(S6}~IEy_|L1<^?yF
z<g&a~x%79_e}>ez%*XC;tUoH>8qb-M9qpU#IdPqi-jhicTV~(5es0UI?Ois{%oMa+
zEo2NWd9<I~Sf9y!V0=sT)<w^_zw>(ktgoN=?N8=(ow)d@R<p}fqCVYr{l5P4#y?W7
zt8TxP6Kc5U{lw-(%7pEq=|5-ml)quE*{^$N*0II5U-m2RNbME3WmHK15TL!}qkq@h
zQt#lUYjP%QzuUpLL?prR=_gA|)#wX7Ro9i5NgTa&Qp3W3w(|DnqW_jZ`5~V!Zob?8
z%sG`avYxAAm8#YpF@Erkq42n4*JFKQ@id8s^9+1XW?kQUWx?+D5=-f-)ur-(vyNOj
zz4Xu>#e*{Gcdl=An(ce%=N#8sovQ7JIF-2{g-@7l{PJWz$Ja`A2Z#R*4J&_L%@@7n
zWvcve_l;ZjZ=&-z?{RoKt5SrsxUWTc3*(97dkgABKdN4D&6}4Ie%8~=TI0d=miPVk
zZ`uzg-rLvwcan|qe+F*jZ|xuY+f2(QW%ouOF^IY2v9Nqf!`9pL=X0NSpM1Tif%9mk
z<lWGg#o@By4_jjPJzf8xdZyB^r&$(KRbD}XzwiGs{A>85I^bhi_Xp)eAO1K_a$a|E
z(M{D)t)VlQ^{E&&pVm-xJa6-Dz3H~i`#;)kw7q(IW6y~j8msuHpK#bID_VHm@qEnn
zeLrqp%NKYhE!f7LcQ_?|&O9sry$6+*Hmh!EcfU0MG|Psd$eZozvYVT)H(vj={-e6Z
zTAetxWlATD&E9MaFSoy*vz`Bq!G|Sx-%R?wd!B#tgWIwGk+JcS%x|KyHXXd2vuRhG
z-r;4+$GPsLJSkbP`H}stB!9!Q&GphZxBN<eUvH$iuOc)$YeSD&O8g7~J`QCDbBV9-
z<zAcB$$v1KtfWx#JLBBr(?yX}m^?a?8~CakTx-}L+e+4yu3b6RdrxvQ(;ee_Zf%|i
zGJo$hRQ?K|?Ppds_pQ40{Q8W4iXZ0pZTWV6k76y~()5De*COnaq8VyV6`XQ<tkBri
z_UZSVu+NOr0-n;l%%%N|Z-|}z*WUHB|JXkf|Mq!IU60r+B33P&B%Yn-USwBqWEZkN
z&hDG`=XJ-wo%*|U%l_WL8jbGo4cFFO|L*&DX_B0~f>3?6%tRyM2EVt@=X{)JUGSqm
z<CeS4@?8Jx-K)LLrqvrxF?+e#_5?%m#Ov0bzgB)*CmeBsYwOXcePZsPIc6Tv6gE+m
zF9^7O`Kg2(du3jMYwiy}jXjwUU)M`yF45T@xM7w|`$UzVKOY~jyz#v6iNW((2d?Dp
z@n4p=bNdwUyp)I15_gtc2H5=wlWSP<_}PKup%T^C3|EFb3mrQ6<!0E=1>3cfdRXcW
zL?(*Jg%_<8-N|M@rTLs|mFxba(o3$K&a?BFvg^I?Zwc80Z=FOx999sV=XvtEU9eL2
zuWnAY&Z{A5CLxNUl{P8z@y9l-FYQ%6yz%79ivFOkdlpk<dzHj&9^|@8pHy$KO5c`!
zcd50u^65;^`DuSNeyrSm<h#}K?yjHLKjrDmiJ7F`lI#fFqj#})mD~M2d!Fn6c>BB9
z^&!8=i&^$fkM?(a&U&bm|8;dm%ZA%0n0|iycGfOo+5^|=+RAfRo@9B#e?Gr+dc4Hf
z_*VC$|9CI!nbh;CKDvFr<mY{3z39^ur?Uz<7=;vtujXltd;V~KU;XCqN9|j7)wkGq
zKDcXjIP!9rtImc)$4<SvTO=2~L-$Ff)Qh}3o0XcxR8Ob8vEB0Y%$l2%mrUPt_5Ahv
zoAuvbeRw;+ZS6m?AG@8mwjE3TB=#+&dSczHKc~wkvgckpzP&tzMabg7ihZ_qC#%>y
zbkcux{#ML>DD>!7_K7VsR5Bmzm}JIn5+JS=ojGNjOP-_|kKP52^#@<SXSiR%9sKY9
z57!mm<>|&o%Ws~3_-Fco!X3s2>XX(sS@51%zt%o|{;lIj{z+YVbg7j4X0HB`eF=6^
zcjV1^Kc|H%$|Ps9YdJiT({8J%^NfpHyw>-<xBK<Y8qqaLALG9*pZ@4S!`7oK+@CpZ
z^7_On{5*Jv=iG;nHK#KC+4;EZ_w;YIf7kwTUK+b5s%>eJO8-gMIo5^+5*zL;dC>Fc
z#sdMb@1}QNZQm#OcY%#`V)>(rg|&HiA9nrA4CCm1W%RUW^-@Fkyx<9Zmn7>xP2Rft
ztO@_k=LZXST(7(EA?jSs?dlZQY56m6<fip&KGSNr^EP<*y9dot$N4#bUr4bD_WZ2;
zz4>ANF<JFTMmJtn#oW*Cjgj=^>EcSa_K)e^qnV~6lg@qq=h?bD^VE0$X#E{f@%a&p
zp~bc<rElFbzH9of%8Oy#+E>`XVas77leB*U|E<aYxE6o-{4M5(>-rk$ABL5=Yk&Ou
zXSwBgMtvn;pGu(2`9duVy9(#uD=yAx|2dnBQ~tEx@<+Y-VOzGEe;10`WB8MG>BJ>T
zi{DL(ndIlF@_gs|FUBt>KRlM$P`Y_eij1hsV(AyR?(QzTb@xAm{loi9zRNr)6j}LH
zBC^=a=vmp#sF!NLU!6;l`E%t@QIX~gyO=9NC;M3I^KbmK@OyV+miF;YwIBIsZ>{0|
z?NV{>amdG||N2+n-sq7Kt?^VZ`b_OfJ+BA32a<czE#$s_H$3^|`nmmE*0*ixUeDzD
zs8PcEcV+Iv&um2>w=7^uoFlvBspm;q_NYJo$L6dT>^`yV#i>(rf2Nm8->upHGvaUf
z!8^x!o6l>W+M@UTo!TzTNcESOpVze?2wFe;GvDDJo(IYMKdm{rZBy>+o@+-woaW4!
zuh`~z&W-c<`j?SHDcd~RCr|vc{!wPsE&1CQ?wl)bocEQj^4YpwPm8qXw1}O{K7ZuS
z>$am)?DeeWy;{~=t`zvTY{PTYi{ApZ3+I%qJ9OCTcY0f%=^Vq1l-tLBl4m_WzGD6I
zI>DD0Ue$5$?n^NIwt!#O(ZSy9=bOhyzvh}oFTME7y)8zQ=e6N9w%A0oJ+q>WpWR9M
z9KWpogXez+e(!a4*MIRoa(|{aJ-@bEJ%)FKM8L0fW5M^c{ye?1<>r^SZnb8`pQBG)
z6uMJ;D182@{R{JdsQMqY?r)!Ev(NmxZj^3#jMh_$qzGLFmSa7f50@sTBwk@!Rp441
zTh%2|m-oB&`19byr%Yolb(6k+b$@HS{c!({+sCa!>_zP}WZkND{a!hz<vzNazS&dg
zcFU2l1>VXUsu9h7&9AS#6tDl_xt2wDcSY3e2(5ycb!!dO|NeXym;F$>TGA%_LHOlI
zJ3pmf+-m8(k+rd};0)WF^_K51-`*Rv^@Hph-pNJh_VROg{oC^4c86kk`-`C6e%jOB
zei{Fme$-BIHJ{RvkSVu&W=-9)X;=KpzeaTjcJcoaRzJQ^Yr7oxhq>pb7FqPfo-R;Q
zU*}Tf^H}orG55mw1^*eg?SE7JTdT(RN2!hQ>s{&1`Lbn)%e5CYOum?+I_1GUyC0^1
z3M!<-Kk^@b>t`E(XjaR$&&Rykg6cj>s53Oq313#@^>^_;<3G-q#9cnxt<}A|L&9+K
zrw1hmlCJ*z&md5sW-U6$+2HV_n4ovJ>$UHHw2ywMFJK@c(-&D=;d$!(X1~8*%>OfF
z=>Jd;e{23>opo=q<A&yAx45QNeC6joqc{Jwq-yWVzc1x3Y<W{_9scal?9YWJMkj?U
z`I09}##t&CUR7~!bC<n(An{K4g@3$1o_?%<@NQYDeA}<L-<pl)&(xix;ycf=x;(t~
z^Q(*VljA+^|GOB^Sf6F;YyWN61-Jh7tr3YI*S9_Xv|jm@_}gi_<Ii<^o@77gP;@Vf
zapLc1@m6y>L%;92wE6ee{U`6A_?LbBQGL~|DEs+ezst{2RW_bp%B`M!@cf03zdpz0
z?SFXTvfk#!`CE6lZtqmEj#hYHpuCv*Gm|At`ik}I?5yj~{ImX{o|*rcf6MKP`3IvG
z#=rT`AoS9`w&&nEL3M_W+opVBoH?<d>-P!A&y(Z3m3Z&5#7a38Zurlz{q6C4e~wm(
z6@FjvZvXmM$7Hs=Ivl^}ce(q2hNgr6u3vJ@UYu<;t)FG0(oxkXRbI7=!eaDiDpt;A
z-e&YPIaK9&hD_M>zWUttx6U6c%GmZjUeI)Pw)eDsnTlI7bgp(e3p&rv2t0OYo5A06
z#mDRo_T(-+oT>C$DvD8L#%HcCI{v)#zpcKqX6t_jbB7PlmOc~S7JWr!Ui}q)x#LgI
z)}+}tZpsqq%`uY_%w4}}_j=_wpW^J!rAL(*Ms%8<y7hhDo%LtFzjZ$P&*0j@c%kfB
z`&LE2=l<*U>5cpko=>~}O+Ded>_u5#`j*RU7fsx$v*Fm9+D{_#*LIkFd^W#n&C`y@
zPvxct`Agsa=@v09jQMKe<)7ip{q+hi32w4{m3CoeUS{0!rRP`P*-{sg!#6`+`P2Hu
zAN;@l|3v?tWBTN3ophG8&dr0nF6D8X%`KaGGE$LU&^qN&MZ-it&U<Xfek}X^sI67F
zGWa~#e&)nk1~=`R%j&(}{jq%5-}TQt<v&A<`XM=mtFwG^%y#*Hc~SgQ$szco?$2<s
z>?sdl1(XzSjOj1cj{ayHv)cT~u~jQuik?L++it(H{^sMy-y8O4>bIHg7uv%VWs+`o
z{aUa<`i4EOysBGnSE#V@^w~u!r<R_``u1S4rRb05{|qdPe;EGus?qtlz5DC=t~%)}
zHM$S~I(u*Jve>FSarWseb7#tFh`E)1Qo1L5H(1FvAeue@ZQ}gGlj|SoS)VM}S(Y8n
z+q7c2Z{)IB)vIs4cF)~!>;HBg|C!g1i(Zv}3@Ds^*EDy_-g(#WT;6@zWN)$W{KLPl
zWSY+X<DXq9-Eiun&oXlsxt(FAf1)c6Mf<ne8DHHemGwz}ONLbMvuWPj&)iR%`yedI
zKRkqge$~J8liZjK)NNhsCF8eyUQYVEX`hx`hbr$Q>+@6hMO>VvvFQNww1guQ_{1$w
z<lW!$S6cn8VZ|Ebn@7E$&D|gT@jt^7*%uF9Bqi^f+<$WQe}=cq@5X=dJ%5|q;fMRj
zP4bLCy567u@Vqaz>sWf7a&zGM>FLFjKfNupPn+6S_own9Z@piTv71-!t&j<hZ`=dp
zpZ{lgdUEx>jaQatPoE=N;CaU}c87GOOaaF+>+r8{|1+?>_`6c&@6!Ja>8leTWp6Bg
zbe>b<%iP>^<}so@(%F|7nE$E?a6d@!*`%NK#cskLh80E6Em9Y6N&nBV?ev%WZ|{rS
z59HZYtT?ZAWN+vlTdVcg-@mE-H@WwR{M1VMx9lIP-Tp4D<9lt-wY4llWq*%nYRO^y
zw0$k_x6Qw!{lMa%iq7)pxVd}S&-zH@N<P~^)4<}@j;squ0;Vn%n^l(`{7YH7X=%q|
zEzzluRW8T*{FAY%eso^4!uUw|Kc4G3_M5-PYCVe9zFleLV{Y~?c_QNh6*hV8dZ7u2
zo3u}S^%t+`4`GRk*`@H9>qz0t`99a*y8jVd{h+M<!F&0N>TeyFa;NflyUZ$ECd?%t
zu(89F=LSRS)2%#{3{~c<+P?nq&0ffvC*@$KMA8n{zQXud>g_Y%^4!*1JmX^P&TFeT
zN11+KYt#Q(_^8fo!KrCmi+*h`^Y=IT>i<sL-{h0!=Y45;OTOAqO_gZ;c2?!q)F&;Q
z4SppgEfU^5XVzaSz7v0@t(snxu%O;*X7rz~HJ5T9NCj$ItnOKtdg|We^>;dwZyq!k
z+snss_Du4Z)oayN!<YMe9ow4_##jIJ*>(FLg0dNJ%Pa%@FN9C^t>1EGf5v}?x5t-8
z>A#w?_Fnw&%<u7UzW=WI<NbI3KFPa(BzJ%K&(Ky=`cN`oK6vXToABj-_i^hw`NciD
z(eAV_IdzE>N4jdWrta?N=Woe>oA6`fZ{Ld7|HSx@&VI3O-Qq@_x4LT;qP@ALEk19$
zcJ3m#ioi;hx2MI__0AObn|@f|RFnGnzVMA7#s{NZ->qMrRn%SWt*s$f-T5@Z!{f0-
zWFKSl%@DC95h2^vkC(qG{q0wG)_a-#@qCu7I`RHUy=_HtwR0cOd>n9I>SVUb$4&v+
zV`d3ISXvc??5gI)PI_3(pD{%_Zt1<(GrwonY|YHR_WahG^Bo&^rf=T!w7qrmW!IbL
zPiyrzO4r@`&#-k<jaq!e#~RO%Qa@}J%?^8sFLBcS?f8uKxBn#e(@!PORM+|Lwu}1N
z$D1B<S<3x#UfMQex5Roi_a2)Ro?{2Onr1LRvDagG%n*J}j^%I9KaC&fkJQO-x|;u`
zo<F1NeoIbGb@?M%ulJ`fed*`V67m$?du_2|h@r3Yk&~jU-c1TuP)_i;_-lIie})J1
ze)YH7>1N*Ixo3aTl)vrzJxPDb{YSL5D{p&tI~hqx)hkz@R6QM&+jQ@eWt8_!72g&{
z1;32+nPPlJi#?ASO?`4Dd3Rjbxwv@Y7c;+z?(pyY7|@#IG&vwk>wT`xx2{*;Vk1A<
zUhmzf{-5EHWxCng)hCNnMc02zG4xgPI-Mq6(ZC*-+GFsudcA|gqrICS?SISqq5atY
zP3?#Io9u)>1YD{KeyBY+>T%rl*(Y>YO5c<?vf_o$xpr;kH49yQrIt8OSE&kr>-yXD
z55oufL-tHH)qkh&iCj~$`e2>G{wrHDZ^v)y_P?TAYOAqwmN8GD3rmq(<Q1cLu?ya%
z=B(HKX#6ex!qY4D>HTf;T)AoSVl|;3>f5*adcISeR8ha>k7upw9=?s!j+lLLnf;{C
zCRKE{bzgR$<i5zR5JO(mOy4(;Pd!+&^xT%JtgX>EzGQwlR@_oC$7D`)VN2dyy;QTE
zm2tao7eA_avup>$5rz{g%vT!cOt5||bA3yV{@-PGnl&On%0Dtc)NgpdR(H$!&Ra22
zZrf!xtl4}zliRB>@9C98XEvXd-Vy%yb^>dT#c%hc^S6q>IsYN~Sk?VEcOT4eiWB)5
zf4G<L)py7JS4vOFRIHEMxv?@=?P_?0+u6xmFPTi+=*k)KFyvOU?lyaa58M$i=6~?s
z-|=hSVkz$4;z#kVUy=*A^Ce%}a_m~_ts8eY>v%KN7QgfsooC}JvBppIlV8ct;KFi0
zuS=P6=d8T$&ARt3(x2T%&M2F^C+5pTyK41{n~`hFcbDx-KYpKgpHz+akDHGpYM4Jv
zKm4n|^Xu;mpH<tY=Y1EJxcvUaLAD!@f*g!IPD-d~CU~%|KPun8&*q2nquuwJYT_>F
z|1n?ta^uhKVo^Q1EFX`BY}yz+;nYFTaHkVDtRo&ges{lDPWxl~o7@lF2mdo{wm)or
zdq2;Q#m8rv&hOo)kR?^K=~nz1Q>C{HUo?G^6w6q<CO0`VPpNbA*?F#I)^V<-e;1VQ
zt^d~dpP?zYM)%|Ne*L`Cda)P#46gr^zWu6v)0XeyQn}COnR06^o4Z-%ep=DS#V4YC
zcj_G3EPPf@`^fLC(4EO&t0oot$K{I5nx7Yb>dp4eJ?mF@eOdXVe7aTfA-^U2Hgl{z
z{WIs*uGqZEJD<#x_}gBm_u5`yYd?F%tM{%S+-5%PwfDQa$MF$weL&xR_e*O{BZ8`p
z3yZAI7xb}&ov=BUa9}EPX=VRg!{25<9)FAZvA6g`^U+PWUS0k>>wLiF_gmVtXXkny
z4-C3iE;d8@{yD7^8y{?+v6L}qwfX({4-xTQQ5Jt!Z<TM@#~sq``62h|y2WdLCh%{q
z==`!fI@x4T(KV@<uxk^{>H<|BGtBz-pP@ybr?g(C?za7AzvlYoX6x%eJbs|wUK4HF
zU74l#-eh(3%Qb6fE=zH-&)K=9Aa<(zG$W^H`|^2@MYihb>Rgw&)bjFF%(QJ6gZ#c%
z|2^qh>brl%{I;LISywmhF{=6UT;yr}v%FW=wsk)*ewNQ!cdUNXvhI)ko`0v>+0-~*
zFS*}S_4Vw!S>JAn&CV`gSWzExWg_pi`Kx2j&Rn<rzDj2CH>K5#6GNsRpHWx$!}Y`F
zhszJwvsdhX{Qj-!V*9Qy?>Q?b?h#!2BkkC)T07h1BO7!!-_yPNNAua?WjCT-QYRc+
z=G~Us%{*oDtv~9ED}=vk{pgr4|DPe_KZE3p`vP?)nc<VOzQqZBIC}ou+@<?F)bASZ
z`^dMZYuiU1bK|Y2A`Zx9s&JHV(qx|acYdALzq9eeb!@NWH=DohU7u|y{P~Z+e$SWr
z(h&~RvvXI*M(NJ|aW&^^U3PRUTiQf%!D+?2WILYxdS-cXWu#xJrk!8f)OqjcUiQ>1
zx^?Q+yX#N$JU4H$ObhoG_iK6SBs$%Eb9Z@^>gjXu({As6c{`SW=KhR+=^ExA6IZ{u
zr}2aTf#*Njle%+WuYJkA(roE6-CKTk=k;dmJj@f)R5&?HGt|kuQ9^s?{b#Wb=C|G^
zGsu5kQ~YMee}<c@U&h}`|5pDo{>|}^(<6RZKYG2|*Dcoi#H`x^8<MVVzZO1G=iByz
zywf_xZU^2bd2L9&bI^JFsas$6xgH5x@XSKp=F8*LPyUsDx3Jn#@gUJkxM+FG<=nl}
zyRN?ezI%TEvw)+aXVtw0echI=T(MgF=C=#}JP~(ZTb-FTcTZYcB<tK&>myYsG&ud<
zoZDOb`*VC=-HrVMi~mlmPtR3<z~6Gp^O0_qY4&l4Bc9JT=Ik>n^EAm<Zm55Jk0tnU
z*TuiH>O>DOsfoChYwG6GeQ2Bfty@#hEp&=8i9S)&lVo&OX-+-+<M?UuTb>`?8~*71
z(fa~5zMXw9=SA1*34edsX|`G<&he+9qVmSx4vXaYX+LHkwGTbyHrKwp{&!XQ=Kl=a
z!&X13+x~Dq&vDVNDX;WP&Gx@N@iPB+RrH_pQ@&PTy|Cr;!k0nDr*(R+UuT_tX2%Z3
zX+biRKbbkp$n8nDT(7@>>yAnm!-i8;41Vl>e;Z!LGDdFoeyEbL&+TgHbC!Aa!d>6}
zIV<>XT{~Oao3W<s{MM=U9h+-bEnb<H+`#l?a!*zGrzab=dP=YE-@Ex&)|91TQ91jb
zRLD(z@HgtO^AeZU33+dJ{621X->>%7)$a{kZz_~;a(Kz1Q?^0%fXq|JbG8g@`*z#O
zebn9*o$0;&<tn>3QFFhTU7Bja@KZ~r!1#Ja@a3Lsb?YDc3;if#+xgM8|K<Y!S>D~5
zlQM!cS@KhEo#J?6tPp3J7#-f0=qGorWLE#;KfW4CABtBj<T|-Obp7(;=l$$IdQI+B
z)E^VF2{8D3=1sYd%44p(^<|YWPtCh=&icZ(Z?pcS$%Tbvnln#TjV$nd*<^WssrRG#
zoX%^a_k3V{e#~fhNX>Bzg}#~J&s(gw{_t+axB8Fj`-8vFaJp;Yskk`jTk_?Lo2;Zh
zC7TA>T(rG$b*|=btKB8(rR$?-Y)!5_c3Aq*eGSD6a~dk&RK7efdc?74VrIJA?i#g}
zp4@*z?Hc~F42j3AYPBzXm5zR$ZLb{Y-X^<r@y>wQaF)CmmJISUN}1<JeQxi1aQ<8L
zl-nxjLL=m-SSaV8;WIN&WBK-=>(Z2Wy{}GByeVOIs{5{)<+D561$Z|Zs-(}K{(3@H
z`25;6N7X)f@V34F^D(Y-{h4oE-^vR`(_`25_&vDGq40&_`+Aj$W+xlm_!a(U-#K*p
z?rw`z?i1VVYi;ixoz9}qz}Qn;zckI{{UkS5Z-vCub3#4kZ*7}0>CQEciO+tzJwEWp
zIIwnK;Gx|N_P0#qSvOgAO;GqEdQxj@^d8<Rf&Z`kTeCm?e)}!^!}Hsu)EoE6={{?A
z+u~iU&8lDW+uY{JYB9$9%KZNsYOea<vU6Tsp~l}?<$ZM7k2cHcUW)U%OS8*%?A)fk
zGjxMp!S8a-xI5RMK7X_SKLcye-&u8LKiX`C!?*6Zq?dB#U5UTZw^w%`bXgoUw48Tm
zL4?}vy^#kJcWCFT=hp4|vC9AE`6G40{h>ehmoNLzkl>lCdv?in@xUXsQV|hmkyH4m
zEPQ_9*?!G~!K>Yc#e;19uWqboU;n6ncKh4H5ATD1M1S-@vWxX@>xwP4K@T6!RGxO_
z)LX@g^Xq38@8CCRiWIQ?*)C!F*>=jhjpmb=$HW*XKWnQ{31GK4(#u@uw11ua56%65
zgsmU4_uEvj%a)V+XnMP1^${tt`Qok9EDqg})Vcd?)}x0?xzlw^Gqu=sPCPz!>Oo`w
zvH7={|8bsPUSsufegFG^0<U+?+xX%B!FqoEKN+U4XCxL~-&K7+=T=Ow)S=nScW#-V
zt(4biYRS&9{g>;*{|sG{dFt$bQ@zfa>aP8^uiNeNt2bN2GjIG8fBc_;d$VZoTrZQw
z7AId`d|mrC|JCuQJEp!>*R>JfxRF^a=XnlO^%hU1e_LM9jdoEva=qYqpZlyR<^K#5
zL$%+ozg7NC`s06wH&Z_(AJ{Ku`kz54;??AewMXYIU3Tl(Nxklsz6qulxoP#LM|Qt8
zI{MAUnXx6M;Pl6!itT|098Y#t-0qqCgy&yP_?t+#w2fE7)LA3Fq*mX2H+O#M)%uA)
zmen6V&lr6pS>u$^#h0p^-@e;_rrqU=jp^zv!P~rXClqtnoG#|iyI=F*_v5a=3jZ0J
z>MQCb>$B%G$GMlvY*c-FWP*x=)mv}NPq&X1Px805Dn47oxx8Z5_rQoPZ#|AyW=q`I
z_*1~+xUG1x+T+RRb$n}Y|7T$Nec_L}{M&^O+Ar@hUvjW)@*S`1o1=Avj=65xY4%=f
zMP+2fs?{l?x_44)j(3V0dMh7OySjJIpM9t8x)1l5u|Bs5m&;x?;okYU)ED($<pyhX
zE*nbPd^w&U_4&S7jOVxNT&ugqx=#*@mglnQpL2Zu=|OShBwOuEUo-k|e!Q<Bd*u83
zIQ2)ncf2j#YxgM0>Clg`z_w(KoE6E(6$@(F3eRc(DLr!8+ogWx73mwF?fb)v_bo17
z?&Q%IVdQsza!$Rv;_kUe*q9f*zkPI{ctx)1e4*Pm2N!pGPB?a;#Pz$5-44t1mMq~5
zYsxFv{fR8)In|oD-OXp)oy|gi9{=9i#e6?o7SHm>_V3(<_p;3mChz%K_@322&$#jW
ztsRy6YI*x){Z;-h{km-Hh8>&l*<YNh!o5R7c>XN0bQ^}&O5O=K4}M*L>io^(hkN!J
z{Mh@*UM|*Y^WWao(u9u>Y<9}5d@duu`@rK_zu$kG`%%aKhPc$1Ty2)So!vHxb3=|l
zU6p&|VXaqN-0s;H>zu!peNdf#_&>wVYxzR98*;<LTJD^?SMB-C<;etN32V1&2f6qy
zEzgz)EkEsh^HsWa)bS(#8N|~*Zf~=RuU%ci_wBn&8E@YEe5EF{8FwEmnkNe>&2vy;
zD6*1cKN!Eo{H^`^KLPoC6_1Zewf=3rx@h(48A^&bZ-y*v6ICyZer6rrP~7#4J@k^&
zl`E%Ki!?dU@l^X}@nV_FVSARM$MXz)i=yHW9p83I|LgDSvZhz%N=)IbLIOuq<TVd;
zb{6(=9C&hlar=rXIo~a_gUc^Gw-Np@`w{Q<x4O$;U%z#3{pyUWxxG(>j#gKj9FlI{
zc(`?1Qs)jmwj(UfP1e_M{p0_k`EdHjy-TiNJfQpbz@#^OHY_%pmiT+`C54#>mA^ad
z_EkNQ@3-Uocil{mYhHZ2y@<)`-+!HsOxb>AfyeB(t_C9KpP8hpT6f%GjN^Q)5WXRM
z|CX}-E4a_b-9Px<F#6EE6zB8q(;Sw+YYkW!(Kj>s?W}isi?e4h?2U|#mA~M-{b+vc
zJ=MQcxBh2nD;KCVdvtY;mvio}@Xw*|bXBu!PFds}-FwTDnV}-U;SbZ~gSV!2ukc*;
zLSN>ox!4rh)e=e0LJ^M@QYI~D_&DeKoQmvkw|@Aqim>Znt+$@V|FEm-lu1Xod<dMR
z+@4T$WI~8gaoqgHb=T#YO8+KBeA#j>|JeoyG4ai%T?)4yJg(RnKJ;KO7U!xsA-Y6W
zwd|Z-Y;6CEI(hFEcMm^*CHB<y@aEV<H76ccEc@BhVcz0duC(t7!z53Y>$S`N$nD&{
z^LN(Dh_s0eg~A>Y+qsS|{LHCm_c{HkrAorb6Z*%_bJf^y`*8P)oaoN0s@E^B7qOqt
zu)R-d<D`c*XD>Z%KV{s?&Teu3Qa%5l%8%xc^gG^e$=1mI(p;@|{ArZaS!JFE$0-{p
zPwd~ds@6kU^k~O1vo&SG3s-hO;uout{X1*Re}?UU(ms~1n`x}};>(Vk@A6Z_Y&deK
ze_y{_zH*9&<#T4ypQ^uo{xckO|EFFPmc5?kkA`uD|DoO)H=Gs!UDy-n_PV>(es_?S
zJKrTM<LzF5LH)XW^#?6#3_pB6{7?4p#y#ALnKtFuF1+}s)5fVDK0WAG)2**d{6eM#
z^R%|htA+R3&pQ6YwQz;|w|=g>y)M2vc?sQG>TZ&DE+_c7jo3cjGv0dBL(%_q{EPUD
zn-856o5nV+()#M!>+|kxm~>a;ZRxI}ebche{8RY&{z#m1n^t8kckq(0e!8E%tn+`E
z>?@C&=g=d#ZGp5Uqdym;<%6<6T0soVvL~45{hRky^=R+YrEhlSUdo-Orgi!{`zx!z
zt|fIcol5iSZR;y$JKVi(dH(s)`l8?7ZXfNt4NWWaHS>ysc591F5K-R9B7fqlyJb>g
z+}u?!@87!i%=q7y+H2|ye_fyDEpx%LFZI^xD^j~cE8APwEPdsCX;bN6X1|YS6U{nT
zEvQgG_#}nRNizCFf_AjsRo1_!Ze?B<&p&je_2d^Wqk6}fpVOqKW(hBij5G2z`E9!X
zLDdYatD4tZz4R{mn*6qYQ5XFuc+0fI$9HYr+@R9+bn3U-J0Bcas`#|eJULdC&>#Hc
zy6ej9aH(&L>sOsAm!9c!#PFQ?q>5M7pCgSne)`W)QRMLQjs4R4*`>;U#*>zQxO@BZ
z!hgLFLtXu}wjWKck6Y%Q(6#EY<=e0)Dop(TA6G5)E70!Rl2;`l)819geBD%PPO+aw
zo`03__Z+jWQfnC5MZdZqtX=zXrUE<b^0JdJFYu&<pH>knunNC!&njek;cYXM&m>FB
z{|wcVq91K)-ZpHXWxrrwugRPrQ%x@k{kinlf8##Rx-(Vw-F1qu>ZNSLRf03EVxJ`4
zI&Yb|UhJ0Se})>aiBA<04zuh1WMSBE{yP87USmnM9dkWyY}%dh=|&LaNtT|%dHh~K
zPJhds<@}&uIy28ML;bS82=j@^<Y{+1<i8!MW7>E4@9fa;Sx@~!92z?g%I}%5u3m=k
zKf|eAMKLk26Ee@`r%b<76W;YR>R_RsSxe|zv;Pbq^sB$hKlGP;xlbTp?0!YlOP!J%
zI&tqFJw14n>$d%j_|`OeP32Z~nc~|ARsZhWpPFy~=KM#tvi#k9qT+Me7yN8tNWQ;J
zd(-Y{+v;O+3O|yoW=cI>`gL~ui_?WX-F+4ZAIok1b26^N_~^8hCEtwMdRPk<81mSK
zv1qDWZ;oGAFkSvp(Jg*%FU_@I{r_D2^Zn=^*5<Q@+`=7mCU4!6S(iEg^76L*S^FFB
zncmENc)mlb^h}T0l5is(p5re~3OCv{%$xc~uws(O<LH@}&u>%yo4cDc_(p^AkB9x2
zFaPA65F2$S_Z{<+j)Ks}ApQ%VwD0W``ghS@aG&VCW4FYXn*=Z!H95_H)KYD=;q9^P
zuRfEHMuqCi<XTrA&)@w|=FfK94|!V@-x~e8p1ow+e+K&>^2Wca_wU(!Em!1tr;^M(
z14p~P2iIHdyVPZ9AoO_qif`wuer$ed|90`>ALk?<f7IPSxnQC5o#>i%OWW^F;@`bt
z-V3jfjqzD8_bF_@rq~y#Q_MNNq}au=&%siqN<Q$<>Tfxlh5fdQM)T`s>^uHo=02{i
zT<7|<WH!04`6Kvu(VzSe$^pAJUb@8VfB4tF<f~h>zkV+H{Uvehk&PP?CK>%%6e=l`
z&&Lq;{q_1A*N#7aQ&{8vw<k_|F4vnW`!0Nq-m-nyg*=b*6IFWmpWRkaU-Y<8;uiNp
zX*-Q8IbshcZx`ab+rQxLkMPP5`j6-L?@#ydn6}UUgUl(lj>>Se>nwlgeY)BIUN=vq
zC~&9N0b%JsukXnF?Ty;BSk>`X*`?o=@xOL`x$wCl<mKffT2n<IU)9yWcl+kg+t;4o
z_{Z~~p~>dog`%5hm;LCE`tYqkUt28H^IiTa?b6td2RS4xkDsgC`h~w`|AUTya`ili
z^B=G8G|&I$>u^fk^RiNV`P^J3QQdOg<IF5i6wWWL+xSQ9$NmTB`|A0&-0$4SFm<-y
zmB8tzCjTv6^Rdu$$phivH==i(DA9W5VY$Be@(r`e2JgSk@c-vDYk&8T<45H*4?jw8
zSs&<l^wpH)U7s`eANhCjp*`=8tbKCxjCsB1dS=|Nww20yS!v6EYCX??hJy<BDZQc$
zA6f1xU!Rk#mh1hd>&AbEv{M#^Kd<lmk^PVJ>2IMQekN_#AI_UtyM6Aj8PfwN%n!O=
z<T?M?zFW7J&njf#34gZZy};)){vS6MXKy$5eis(s_=}IfaZ{H3!NZRAw^#1pJFoQN
z{C0WXJ%V}L_VIkUH+k`~`K38)avw0i++<K6^+jaQZso+Or}_+cJpQz5(+c%@Q&qf-
zC&#PDi-xU!wo>i>Y`a-gxk|1sSkt*9cn4o5<LZrv*6hv7S7tVCT%B6+E_Y49{remG
z?%k10D|;Abaj-o3jfimkf$vA>cLe<j`mz2|edo>z{}~Rsu8GfD5hGBu`t(e-mgHMv
zj(s<t?O%2OhgSPr^Cf?zesJ0!(v^Ci-dU&MtU7Cz{JrSRNbc&Q8&7MF+NZaC)qC2Y
z)#Lu@JMZ<@2YN1n8t2U39*~<`uNZ&xKZDym`IW7Q!p^)p{-ampm)rNc-j|>3C)!QC
z`PRlaD>Btmzc{jL@AQ+|pKUhkZ&mMIJIRx4+qKl-E9(k8UmvS2jNi8ZgY#Yg$W4D2
z{0Utsdq4GxjX~;M|FkW8`%nI7xcG^2eogpO8#%QP&s+l49$4HGb$>nUU*~^@2fh2*
zqy0XZchzT9pYYLsq#5jbIpp)M+kO*oJxhGK@8y}ef1b+C@rx@S&$+bpa70H~@6NZP
z&u+(0o&8gOPKETOtMdf|*1DBH-CZ{=`*UW^`I}|uXC8RzFWu_3m^WO=Y;x8y#v})Z
zFDKW3KA5@iUxWY7AD~;8Ph9=-?1$}#{|twMPIXrnuDkn6tM~h!?rcuoo5#1$ES8$T
zw%+u@jVSY9r%yb7eUP>P$<F7m<BRJLde&#A{9S6F<(nRSF^^}S%!g}l`P~oxl#|Zn
zzoo~Xb0?-P!9C)Vk@myW*<lseB9lto*;D#Ixs^S(NIPJ0$GG{J<IDJ0?9G47!!;k?
zF_YRiIeX^1J7-Vb*S`7l&VL5On!HCIX?t9w*0NR{yBJq?=|6+{i=Z9bx3_lm9$9?V
z@%ZbmJ`>(kTo-n4+tTIcy35nUHT6@`t0VJ5Hs0=CJjp@XhCfim$w@SKt<U-%v$tm_
zc^>52U3koTo?G!b_E%YpHvag%So_o7W4%VN;*uo4G0*DF(Q6j{bbI~6byF98Tr+9<
zw#^kc<}~s!Iw&t=ko;5p<GSZJ|L&ZH98()*zfJp<@=d-?d+wv4SNlFMlkha%{JURo
z@0PjB+xtRO?w4mU9uLS9o`2eOw{(Q-C*6l(>Wdbt{7PrqZtBljaq5|c+n!C)&6Szk
z++z<e5o%gxR&Md&amM=yaVyn#oknL1mEQU6h!OC+e4*^+d5bTv<5IK_MRZN8RsJ<^
z&WBLtwq;MHwNL+N$hG&VF@98A{w?@#_u4v*itLcdo*$1N>)z{h?0k6dp6<EYhpbFG
z^Q&_6IL`=WO+T7sd@RT@hwWH+z$1H^S8--P0{=6xoW5G(-+f(tW%WnlV`g!RALh+o
zb=vr@-rPku_kZhKEn}{8**UjRS$C7!RpE{I7{l+~cd5H9zvWfkDLaWDsvmwIh-3V)
z_CG_{AM+2J51X6C>0E!SdUf5J@Swg&k<$*H%iT7?^VzYK>^8l3XP6Z^w*Gkgc)j=^
z|G!KADaL01XArh=EPqrl{A1#y4by%HOg}p-e#?&SodpZUET)_)a~E<KN_pdY^8C}E
zY)t#Cv<;3pI?23SJoWOFDJegNwq5je`(9r4d-crCzl3eieAt;YE!L@M%1;qXp-nL-
zi_PzDFWd8WUHdEhKcd1%ex)D2%l=UQ&Gd)LPv;6BoF}^X`Vt@Q^QK!TJ1&X#I8}7<
zmh#;@YjQXu--)>%)-XNv@A`e=XCMAEykY-sQp0)qQ}5azUiP9{>p0mW#J)XvDPZwW
z<C1rG_XOilrzUPQVwCgz&%hdUT^V%TK~qiSj?VqX3-8~);oely?|ms}@hw|}7k{{}
z|7U2Ln8EolzFVHBPE=?2^h5F7HiC=o*vd}muFF$7zw`5ziC@;m$(+hO))vY&>*Vs#
zpW9{cFP^o1(VLQwe8nC0w>EWe>h868y(s+Uv$yr1jrN(n+V)TSKSNXOAF0dX)34Y>
zf8>s1tYkF#7Hj>V!72aT-s*3Uf3&WyJ9mG(f1{~Avr2sa56_4Fj8W0f`oGqjdu|e6
zCVoIQ%yp;65vEfz8(11+mcMm;FxUQwJyU&3e#@?GOR4ou%XgP>oj7yP;QAuPZ@)G;
zU!NGe{%z$4?nnM_%l|X5TKu^CV1Co1>w(vD^7ZxBl)QWwbT9kKMV*r0Vw*O8W?Hg6
zCpoRpyd;e4$*x9k-IZ-~GtP^=^}Dgs>vvS>r11X?+w)4FzZT^&dDs-ccQ41%Yp?kH
zv@gECd|~0o^$*?Ol>ZK?V1C5@*7&#5tEla*Ho*^9d(RiIn0+AX*P4sEQ?~2eYJJvQ
zH+#>GN7I6p9byk@YvnZT;`+3{!%B7S_CLbh57#%x9*O@j>rdcE+c&rUBo}VFeAy{2
zc+Q`;80NRJWs^TxKeB)0|H1r`eTRKUtm+@#NBcYH$xl9TPwGPc(%w=@9aHWZsn@<{
zcURnU&d+AuBj}iSY15YNe5W_)9nY8hyY!FygWTe8!9SQk96t2x?$)R0rZ1>i_dB}n
zT*{<u?*9w|*_uTg&#m(8Drqx1D9yvj@@?ImeN&!?^-1$bg=(zY_h$aycdLTRp2Z6V
zZ}NRzE1fHmq<!&l@XG!pmwR=5R#v~xeYSPGr)TVo68jIK+P}Ns|IpZfv{ofKZ|>^I
z%xNEcY9`#yxK-rRe1my{?cdk8Y;+f$spI)~eE#Mo8`6V5K0m_#qq$hb)tlGqd*s&3
zCM#u_C+L+tnU`vR*X_&N^&Ozgt{%*h-x{|*|94Q`g<Jc3w)D%yMMStiy3dhem9%x+
z&J_{S?irV(Ui0nNS+uW7;!@D1B^y_q`dRen`1AEVb=U8yUir_ESI__Nrk&x3H{ov|
zzV*8G?6Sk<rDosCwn^pg*>)>$X0Gz$p9N8?6?r#^7b?FAR=awd*IBsZbVj1GQ{Xf?
zsn2?$n#X201?HVxc6++fWsldZw}u~2y}@&8U82^-`p7A{xw+gcJ$LKsXGdQzUHN(X
z+ntZ@#viZWvi?}SMD%>4Xa5<F{L?VI%lBCJ?b)q69$#^3D1V{-E%;GebNNU1e_W!!
z9qP{R6Yfp9y7Y(a$_i$;?aXS~w_~~8cYCJ<Ip`|wS)k`uHovA$E#~Dtg)232|Mafe
z%y_rXlzsmsO=qhu{Uv#G3}Tn8HWoM_;5GS#dVlrD<wxy1>jmsH?z(@QyZ5Tv<vpn@
zvmVD}-xaddIlA}JBA5Og$)_1tgG?RPypt?izcaG&OYxkpr5Tr&`!0R+@|5<U@a3nM
zr=Ixt`Ot}qQ*BaftJdl6yc!gCf7&Jg@V)CxcK?(s{*e8x;3NN0>Dv5bvwr(NSl@n6
zX!Er1k=NI+QID=Ra*U4V&Q4Oy?sa?jWQoAd<DHB;=fpWSRrR<0XLvAs{x<U?`OH6p
zkJkx&c)Is|drjuz=vVO{CLXTMRqI{6^gzn4e^+)^D*m>aRVKM^(XBIOZ#zyrS@moC
zvHkt`<^MBep2$h~yKs;Dsvom%drv;QdE34U#qC{T62`iFrvx~qX?guz)2k5Vw5ctj
zX6<b64}HygGfPXq*&01dG})G4sC3&`<Cw~%JNu`qG-oK@<*r%Ke86<gXPIk(&w_hW
z?p-VLth7G3?cT1{8B@3CpZ^xAqc&@yrs{f=rJ3f{ucn*iUcMZ!H2-bwdinnPEn!<9
z>9<|`?EBEx=)T{FZ_TA9b%C>eFXk-X)KtbYsqVtZ(^e0dl&3PYCb-t@U0P$gy}sK@
zy}2}d>Ae?vdfRwbIc?&M5We%adA*NJ`TF|n`;05pJ;R#rh3%iRQeykl@-o)*@-g8p
zFJ|5N$lh&}`cW+R)io=dumU{?#dSBF=JY%6nV)}b=jw}Vc~o^+O;1Z7)80EdeE%xH
z=cYQPT047VPA%EFG;{mSI9=^3vt9G<uB~|V`*8fG`TcdqXN~k$Kfde!Tk7l*2~~OP
z2@@x<Pg%3K;cnL-<&R6Q7rruzl$=wap4TAzduN#Sx9vf)CoRAK*&kD%d-^}a4<|d(
z8iOCM87(K%7oS`o>-KS)+q91}AL}jNAgJ+N#>{%oKU;tH+qd7Gp4;=P$ZCRt-^HKT
zKQHf!T(x%QZ;d~Of6M+eoDA`Qv7YDCbZ4D!{qFXc|1)eWvRdCJ#bQ4BWMSPh3*E_Q
zX3j`wm{72XDWZ?PKI`p2wTkOe7v4^&2s%|gU#Bu$Jj|>9f=lz$?Y)P#-Rx>gox;=n
zdrN||)ZGuC{FnWxxD(mR*BZre${}<9lV+PwjJ%59;;Y_%(NMfta%Dri;4O#Ncd7;R
zlEoxv{A^%uSD83x;=JXvzV5Mq;NG=R=TQE%pdYc5H%0HZ`(2fzXYg36!m68V@tMUR
zwYQe<_q!ez8~w?q`(gaSA9V^U;lJYACcL#vxqoZ2>87dYj8(c^=6scAEPH!U$L`?f
zAK9y4UObrlFj`wvZ();l{H9Fv%cfiZJd3|)wQi}JZdyd2kVVXK;}5TPiXN}158k}v
z!|WeR4qZH4)wt)*N09`Uc;g>e!)zA_nQh*jF!^ZiAN`M0Ti1Ly7wX>Kt&yw3bZ1({
ztRTmU*UVVC=Fj-F)AFQE_^W`2H99Yjg__PUUH)Lp_1fzBvy&>0OT7y5vU^nR_33N)
z-Y;9H?)6vtnBP9xW8W;tyxcIekR976skbhe@Mpo#JjQO_PkYkY%wL%8di?CX?2GQ)
zs$V?`&%zHUGcX@N`#yf*e1U(873q(~TORD{v$Ws(CF$apP0TY(_U={<w>=``Eo_)6
z8nCRa<@lj_s@*j~(f9SFbT4kSHCI%a`0~X03)erdmnnFC+L+~~wp03h8|fqV@uz=g
z*A!lk{g<wtyXxKz@5Iu~qHiyL@JsE^Nxc8vWr|9&<+0)`ALCt4KRC}CQ^VN(=;!v`
zOxA7NcW>VoF-vrkce99_?vb4EV`ZDu?Mw9h>QYiBevwo@?D>SrStGE4@7-Ld$LlPA
zUEllTc-)rlf2aQ8eXv_2Ot`diUDk9zPPxo2d#bBbQ|&dmpYM!G=2?8Xf70BD;8}j=
z&vwPdrC)Ut&2rT^b<*VitT#1(A7#&H&zh`zZhoz$mfL$fCJ*JtCW+@it7d(wzU%JN
zf41x1y<jzupXV;{`xhBh9xcCSRl0S>RwJEBrspEd`4&sw?f1E^T)J5G{I978SSB|W
z&f8nDK5govHM7lTZ~opV`*d2^9fsh`J^vY^if--c?b~|w@M2BXe%|-D|NLi|pQ*Z)
zu~Fe+Rms6Wzr)?F-l=!Q@}<A&ZYaJkb3L8CIm$!GZE|KROEdSAloFHk{4ZCpcx|?=
zqe$Z2gkM^J?zelrdAC*7+(_c)w|5o~zMM@A7I^fgZ;h>8YT5b!SASPOSbnVjhl=|#
z!Tij}t9i9OKB@$`>fSwbQFqBIg9z(AJRg2un(05|&6($!76BGN<l{f;H|OoieYE6<
z!TG|69A94~UDnN8UcI_I+dAUI_4?ej^HWP+L@`gh#nrQ}z+U@5L#Dn^#q{I*<!j>C
z{;~X!yS!~-Uq&I@<X*4S0d3L+8)IBGXWHF(VldTplh;Op1shXMe@*_+z_Q~<rTAO*
zkMj>af3$CT;_A$>4@dOVc1$omwQUZk+2$QCF0)c68GkFByhSD@ZI4%oqEq*ZrL|VC
z>N>SPKYO}uuK!EzN5>D`=Xx2>T*v?8bbMd7^n1=|n_Pk1RYCu*yw7f``#x>KoXH1Y
zzNnw+-(7Y7$bSaL8o7_x55`u#e7nXpzWG0cME?4mu49MNFWY#QnB1J%p~n?{_w*KR
z2ABB;Dm?Xx`?u>iZ_V$n-?041d)6OvKi_WU-p_k~+1zrjnR5418jlny+E=Vka2NeE
zy(Z@G>N?39mk%oQEPmX6$n?$X`eEzy{C9bEj(@vdc0Dn%*67Sp`-{tV1gS`z@=#8m
zRPp;hmuC2p%Xx;+y}bQa-rSlWcKd65{ei-HR(;abwx*xnzwE`&$N#w8Hkcpo?=$i<
z$o*&bBPaS-%{`87{r&mc@@?9mZ+|nozScy)L-1wzhs9B^R($JMW=-0(kzdTbes|kf
zma6dU^S3R3EB&GU@%w}O`F?0WENfir`e<%)Wb;uu!{4D>R`pgde=+ezS-<qgjJv7Z
zT_%5zaNMrjDbf71KDTa`*<7ug>NnTrzEhed88GRjN)AWz<SRxE2Lue?$KRBbe`@-8
z(jM809iDsV%@x{zcJ=aW-|Z*WxSrGSwr<nvnX*`7ZTS8Co%22ZGaPiYF<zSSYktet
zwPwo6-@1L>E}q@s@#o}rw+qt`NT#Z6k~8eP`m6po{|h;WkNijZ+5Y%_Sl64Fa6KwG
z%j1KK;PLsHpL1^?S3T!jS6O#?p6b>ghkqNrs27asH<I2VR<xk*UF6iabNv&y1ug!%
ze*69hlXuN}6({~->BLjp`j=)^*`Mt_lKHvP<M`dhx9&SxtbZP-c`W?kY2!mDcb}SF
z{VitwXZx~;YgBncb=dR_ecj4#me$-~_}g$*jHQBJh#7<YwSC1OH^;o%r+R5iw(Y0d
zg*V>`39LG#5zX=YK11&0c^o<EqF>mS)V$s(CH$#J_}BHOlMK_3-D)=C?sUC(_NU5W
z@oCZ-Dh;9^PcSR)4*&2?@l}1;!!7Q!E6#DBEk5??X?Nu%mScVoHxvo0lqOX^zdbMe
z_SYS2_9#C%dU4{PrJrs_cHUx|7xCvvuI+UDqm4lo!496KE4SLZYbh7^-n`vpVYlRO
zRrstwC0Em`HNUK`IJBYj$>#`*P{xAZrw!h7wmbF|cs^QY;CgP^^5@@=ck5;!-9F8p
z?~fs;XBtPR#7*v#A`88Z+0`5lmRt9%D6)$YJih&p)2{iRA3kMPu}?|tx~{XR)KTry
z5}uXDc}`1bG){a!>(L(7B^BKvKhD-Zp1tFiuGXoGYmc03k<?S+SijveO+k|{a>E|R
zm!Wow6_Wy2)b{%Zi|%61&x^geAy~PJv6aU>;jzkhi?wr29!;EXx6LL$qUk?FaLA5X
ziQ5d~tz~*Nc)EWtpU5bA@WHePAB^KRu6xP3s6y$y*PP=r(_X3Rnpn?@H*|V)OQK-)
z?!r`Ng_Lmh2lsh>s~<_n$|mcDi@W}5VqTL{ndSF1_RMoGN1MX!mZlf~Bu+7ylKDos
zc6YR4#=fMBr`w#>{xj@pn7rfpiYHf{raqY%RQK{j-`WS>m0zD;OLCw5{ikQ7bB^oF
zgNJ2`FS1KKH~sd!-9|T4xBsTzMe#x(Ye5A!SBu>JS`T+mI4tpG;?cr5$q$ZuKK;Ad
z5YDjT^q)Hkd@Y7{vm3vfzN->zEv+vXYs}fW_sSW?kS?Rwa_{(zn6z1c@18CBb2iiN
znCNNks+WD`8ETw=ux3A8FL@_h>5kj1rrHGs2lCaQ%dq||J})D4d7sc9o6S3ZbQeoI
zZRSj93r#X>IIQJheRCJj#0IN`=cd2zew6+e^P_oXjZMC!*~GG-^OiMUoP5i5PM^s!
zGKex$ZtmgB{`B2B?F0YOxxy#hqq8rn?y%l@!Y+yT$d{)Zn<^eln!b3X{I1x2<H`1*
zBKx$h`Zw+$z19Ba{looz;Zad{Gs}wh?wEdBn6)iTnlo5oiniAd>kYPkh4G8yKlsnT
z*{HwOyT7AOd7I#^D6`i^N}nE8Zr}(HQP>c-u>Xw3lk2PM4$V`)RA*Krd*vTX*7rl=
z`!B0(YP4B#H-%kKnx*E<%olei{)q{H*?+KC*!jcp)(0Q_W~byV*zB+Vq<;1pr_dYg
z98Vjl%Nxk_e2lX-mptjG?f!H2qb#pEsp22&`d9XTtbTZJ;>Y?2;oWv3e;l_qJ@>ly
z<!8c<zE=+y1~|#CQ5QUsc*7y#ceJbn+x|1{kL25*e&Fw4ucP}sb>6vm8GBxrC-q%8
z6?~@4X+@m5=1z&modrkT3hb}W_x<g<ZK0HqM{!?;!sE-!?S9xD+kdwCA6MJ`tiL<|
zX=NF;yG%cFy*lv9v4B-BeOzKSsZ-|hEAuwaUHrTGMedx?zQnErwuu@mD`QRe%jF;V
zXZ<TALG!fc(w?p@i><ZmEA9We{P}%l>st5VYwNbojcu7O-gC+N0sqXtx|jm?oY1`r
zKWFtlaFgV)Z&&`Av?0%I)2jJ<82_w#-fnR%nSEh6`v=K?Q~$N?*0?Euu(;p$*>~%m
z0xR!Sod0Rszxt&>)`ZIaWe?p%cgvL7?fm*mdqI)(ikFvG+68>PwV`L$RY}WFb}5yy
z@8(x0{MLJvVz=YLU*3xE$K?g|+y04W6}R2AeYAFog+=bAIfmzR)cmqvb4vIMtDM-x
zlgz{Tuk`2F-<hw!Z9KWC!tOBVlcTD4UM*mrDSf(Iea9`8KiQA>_?(a9S6Uxv?d3hS
z>a_pC*gyRj{^%VzZFJt?N7)wtncudQ{)wG_=7+zZQT|lnUC-rqy!_8_ZKdAb8Lh1z
z?63c3Ezx~)W?iN1$MbAUrWY2?^<P`hc4_X#e@$Licb434XGne>Fy~k3O1AsQXRSY0
zvD73}NJQq!oaAPogCaXm94$N*US=+S*>?4t{|wD#@BhwD=qj5ipfW$^***iA9=^S+
zzlc9rH)D0yYNJnz0sHRu*`D89SNcd#eLC0lnSb5C1Rb#2`P6gW#Q5(0FY4Or&Tc=O
zt>2?NH7?%TW#fb;37h5B-laa!^OsAj3cr4T^VTb2Rc;&YEoL~an(d&)E#z+TVB-CW
zXKT`bt5mEG`p|!@*2&h)cXi>z*&lajy?1MSboFARE!X=Txtr^^)Nqz1ZM*WUrQz}x
z|9O_yGd9Z?d7iY7%U<5}{67Qdl*^z0+_p=8Dcc_SSSC5PQvRQ(@X4hgP1n?Koi_jB
z>t_*1?nNCwXw$qyQ=yN~<In1k{Ezm{&R<j$^U<&G;tsK2-&PBJnme6q`ep`po8-$f
z*I$MAO?y{=OX>X40&9~E{@mKy0v_xPQ{woaPK=*xzcs!sZ^_>!f68{%xGGxRJ+ixk
z{rgLq;|j@=>AJIi=V*7$+WF@{LvQcHjgQ0S)2``WJNL5n(7QWgFUylx9NP7u=i5n!
z^7Yo&_VDVIOI~n3d)R!^;qT3v|72?aGb}T&mU>%q*6QQCIPOIcf3>Q!^nA0eD*U>-
z?E0tZQzhSYH|$y$y21VIR4sQWj+dAAn(9UG*nFZjU3}q_dotJGeOdiud6P5CMbS@B
zczb8qG|yY`oxMNmuhrkV^%*DMaNRufpCO~8@!M|0295`nAB5)^O|m>M`$OUS^XXlC
zw7z@%IyY_UQy=jg%fC18ZagO;zsLIPcgr~LkG}WY^^>lyc^)!}op1L9;X8uoStAM#
z@A&fI`ppmhlHsRUtvvX9ed*s)JO7>^=KQk*u1002-~7)o@vmt`e$3|UZzq=g49cJ0
z?juk<_2BERdqX~17oL@BT|R4#WYOV|C)Q8@$5a#cQEl&s&kox@Oj}r3zCeD`bN9%a
z_ZzYb*@R*i>15qcFPX3_Pw!OU!+xfHhc;Z^%3JTd`>Kvh#;n@a_s(6iTGTONRm05R
z@7}!HxTxuzzYLT6SH95sK}Rn}bQOhtwVzx(Pj-Fd5gXH#cl+1d_OG!|kiRvd?!3L|
z^+Wsgb_x8jKN{?wzf%0%Y43@jqF!<L*_ZfFxA(oUQRR^V|Cj#^`NgW6w$45Drruc3
zc!H$p_2xS@cjO+k@2wX;yF4!ISM$rN*wwKcJyi@>y+0DTE;aqYfnN9fX@?pd)K${I
z&;J(lci$fVhx2b{`|SVmxU}w9f1Cc|4|_gG-SV#0d2oC0vDqf~;vOx1`)JbLWfN9y
z`5<!cTR^?S$JNdE>{<$UMBH1oDKqbKS-kbj{|r2JM;~mLSR<R6P-wK(ylnPOlXd^T
zu0MU|Z;ST?f99?kr`p%n8U5J)k6ZFXyT^V0mOqk@ctfwhJ6WhZb&Br~$)!{3G-v$`
zKR*9MbbfcB!|Mm<88fO1ZB(Xj-(LR4_`;S<*;RFn{~4tInCpM=@A&Aek@)tXrfc2y
zKm50i^~HbGbIo2E_wCK>zq&u>U%ayEn7G3C)dHMq$EU6N`R|49pVoSLIphBfO}qcy
ziBoAfy7WiiVTY6FN_y39i7{WWy|~-*`}#>W)xVSeU5gjouHR#)S~2gfgg~IF=Uaj1
z8%sO4Iaw#Ht$i2!CE=Ww^`mSj?Ne|6dDf{Pd0aP1QpNU`!IXWT`e**VEA_2+`|w6S
z<NEsCEkAy5z4I};e_cxI`m_1Bvj1@%{cT#qd-1)=`?g<mw;$0L(Mah#?={CWk!7*6
z`Sz1Du4u{}<)3NzW<hHECw|s>3m;qF`yS37I9s`7d*#l_|9;P|{<rnTulmEiQJ)j1
zKVisa-KFt`p+w&6_nH0|cc&+2Yt8IayyE?4>8bgvcb9$H_%U+*C2{GlB@d@P{2Be*
z_x^`X@s-7o-XFW)X)n7^@m0L=KJ~1%E3>1vEPPh@dy7k8$AUHmk1mcWZ@U!yE>7~c
zw%*S8)L-+)(@vY>Yx`zi+9RwtJxQm2i|pFFDel|da(Bl|Z<pWYEVm$ix#`uH_k=FK
zeJC#W?S;~Fo=P4!PKJ4&2hVB$66c?p_~FY{DT6Ixow`CEf0zwV6jq!%w@)qiRMhT&
z>V1DCekeYk-!os(M816<U%;%s?X|qUi;bRWpPqDS;smaP5}9+-r#e|*{~rJ0`NREf
z`-K14U$hgi(9&0T|M0d)s&>)j$xj^?Ivd(dE1sTI<ZY<7U;018gGu#_YnNOpt-qxn
zww;@|VY1uBPZq`}828PsJb0r~A^3{nl&b6R5+*!uj6YiM5oa?kd8WI5^LLH+|J3*2
zS+i&E`8WCuKZNFmPxqEoeSh`#AMO0TcYm%Hy>w;TX{jHdzy0}fUj3l_&Fx{69e0_{
z`p?iAy2V$|_4h~5V(H57+W#5iKI9kpf1D!gTRWpy*&;+z<pF>3rTw$~e`w4<zW+ze
z{4J`_+e@q`>a{+2@XK|f8>`CBFt%TbeLH8mDBCphFMR%JkLttnS<eN6!<YNto1SYH
zZ~i0Z_j+NA-qfElKVz5Mm)YCiKUw-d`O~i358GOoZ^(Q*JH<;-ByoyXkH+J9?4mcK
zZdOFNvE4X!!E(-%{@<^eKZ)LUIl!a2+KD68dP#4@JR=9S{rl&oTIyHMKY0JfmPfan
z?mShz{G~MTi7TgUMc_I2xTy<yJo64Xb?tXx&Gdix*XZT7phgLvR8RKX%QO`(=qaik
zF5Fqa>#_a1%-XD9cg{uDOy1PVP_(?Pz|}H^)nC><YQwj1gTC<cODj%%yltkYXvwU5
z%ya4avpZ)mx%SL$=V#v~w+(ooy(;^0-bd-Q;<p!DH$J)TaKKl{sBlh0#g`|w+0sFp
zc1sui^pl(%6nx{$ww?JeV}+x=Dvmo|+mYe@{cHZypK^Ulvnr~xKxabyV1Kc8<=?6H
znfWbtOw%8|Kf+z#UZ?+ouUowJy>P(g^eYRmez`4Hwqf4&H*b3Kk~?q88Tsot2ANs@
zWdGLm<N1f?!*!}Z(jTmEx#j!&kI@J5&YVB4<*G*v+*fCBzi{WkcdOoWWowK)^98qU
z-l{Y4px}`PA(lEP#R^Y_dDYA@`#av3?2fin+P|Z<eB~hzH_n$ma$Ap1E4ZT>_I<gg
zbF|~_X*SpQu9;lDJ9f8jzq{e1ta%5$<|uQnjteWV*|zoFt!t;gdA<30`P+;i6XtIb
zKbGGiFLF;aSLx%r^{eAmf~I6HXbza>ERuJ^%lJ6A)}$rto<5k^94r3T@wd~D=5KR<
zJX~E<_>r}B+vMVvuBk$ix2#X{?kN+S80FHbvM{#o#`Z}EYR(iGc70ggv@bh{fyvME
zyy(mS3><&Vv)8`v)mzHtEs}j;qBB#iVf?c5tZj##=DNy1JbKK|^V8k>C#&DtYen8O
z7CrAg+iUXk`bXE}kIqlZuovE^P_f+cL)q5#_ZTZ5+|~BESmLSJtCa0+E7^Ucl|dk-
z%gv~A?X<Lmwydse@4l*2{wQ)!@7lYiJFn@jTe5$4K)QCx_n?jC^UwOO*|d3M(ksW4
z7Dt1<EpjV^8(;Xb)lFTUpIKP&P^ovmEz?TNKdV3A`n=fhQ&`teUF$0O1&J$?vTl0r
zwAJ6e`~9mzspqY4YFume)~~Oeetq(T)5WDGlka$h<i>vXI;)&ez--7+V4yu?^27Gl
zr(Bn!n71!DdCYiTGxN{u7tHSQU0e6lJCaehoOl0u(e2`g`2}NK)(9rvJ%6UCUUfaQ
z@FTJ4mYA)EfxWwm^-mh#TmJA{VrR{3ezp7G<Db<$7H>AuPGikglK9V%B7fdS{@AW)
z?d)i?{|t^DE)2JrJ}jtWyih0lg?0bI>f2jBy?ZBS_LX~{z5Vl}B~kSU)~fMv|DHC5
z-+#*YH^%+vKdhg4rY7%1=GyF?_A2+EP5R@%=s<<}TtBZXQ^aR`f4cs`F5g+FLhAtY
zahqC(_dmEc^X{0rXA9Ta7X}``dg`ry{b%s};r$@jaL<jmKIf`T-d(D-P+@#~v@~p<
z_=k6M<tL|RiYTl6>0;xr`mv_|lDux;jH;mNYp1{Z&!GHf(|-nL!*k~a!wkRd{ww(5
z(F?0H&;QDu3rn2mw9VrC(SZGbXXyM1k^9dOwt1r7(!-VA#%i3;mwDJ!HOE(aCr@Ar
z5<R}&|I(&g_kIb4OCNaQUY{7R*z?OhdH*w^rvBCWfBIJ}d=SR?pJC6{qMxe&(w}dA
z|0XnBWZ~uDSt=G1ijj@K9u&TfbN;aVLEPd;zUDEPj(&;OGhM$)nN?-`%?WP1D_=gd
z{C@Xs{EG7LAC8GtFEwnn-t?f)@%8yjdxF0OTv|KX=RzrGv}Wn5yIDq)Pu`S0vz?`m
zQ%w7L_K)93LRBR{A2s>%J$!leciSpCjugSADl7Mf&foJj-2e2(pP*@WrH{Io{#~t8
z+<NKmpSe=pyjEgitfEPOuTKeI$^B&de}=|+Q-7}c9{j3&QHX=&^+i1C_nCLT@A_r_
zt@mT)$LYuPC4VgY8RTA@eX6zb=V9)YO!G4Bec=jKljChO{>2m@TXE#ifs}_855E2}
zp7l99`PHLkudmmA-umx#UHgrPA4EQU49Qqun)`FE`LX{DBCqQCx7hREej)76^1bcR
z!!r{XKUC1p6=2;LJpbNC+u{pf*GKQ#eZ}NI1LKeMn2&kwsz-J`-MMGS<!hdAqap%~
z-bN~iPZBNSY1}q{O7g<9Rqcmm_56i@Om=o_xLe!qczKEPX-|VE=bm<?l>VIA@FcM}
z|4*U!d*STUws*JByKsv=;%?cx8?%dLG-UZxCF~l~_Ae`nX_s_o*9cm_WaUzcx2Jvv
z?fd)g-K46`KObA2|FB-1J*f4LmZfFsr1H#~b=zxAY_1=&`nEj(p~jZfO-<Ud{{Fps
zH7~nt6pXbNIL){GbpM&ofs}NH54PODg^p?KZ#ow-cbRDl*AcelLmvt_j#WKo&yNYW
ze)v~7=F(P;{|pb6l1<+9+eAmsvRL~>f^+UFbImyCyl*zw7iJ#H?s&edLa5+BgG%b-
z`%gPM?wow_bk~L_JbcgXYY$cE_!xLuJe%{MVf}?ar+bZSY&NcoP(982H~!v<8bjH6
z(;s!dDV2D9_OtGsiR(TsJLYOA$EmC!rqVy7fS)1x;rp(t(&O!al2=p|2mM@^n|4!=
zk@>9SQxE?I`qFY%lP`;YTi@~JzECCWmTaf*eXUdfY*c$Fyt>k{NMg%O?N0^;+_@(o
z?MwK(Ld;^H(VbU8r{tc8ZteQ_HXt`*om!^3QqLrj2L{2@0}l(&`m_5Ok4)Wq&ZGKe
z@w4nBK4cqDdF|`_r||Y4vp?@@-q{?#tgjq#^+XtB%mcIH{|vAHWN+AZ`KxUFfm>oT
zi~hx~5fE*iA-qd`mgf_7b;Y?)p7*&~tgH6AoO)&LvQ14cZpGWrq&^VhNVnY==XuUy
zeeQ>A%NJyu-A~^>#dEm}k8@F<OUi;!NxPYMU%1xWK2krmuKy*^zWGMwHY+lMqVFGF
z<MDA%!e$}kBX!Xlk~V)IS$tV1_33Ww=fe`m?%37evTgtRWqs*K*51B}onLOI965FB
zq{f}y96#CpXUqLO@jgyd>6O{_=WhiTue8*aE?_Pyu*(rVAE)gl8ne~v)lt=CyMHQ8
z7k(aR^*HcgQtkQRFYjYY{xjIWJE@Yc!c%T*xBqX}t&eIORvYx)Gg>+^GIHNH&$l-c
z%1y<Zm#)40%GH`xp|XAQJdShxk7KV)?ukxU*P6WXV#Y1keZ5Qk*TnQrj@9hbkrOj}
zf86Ov>3PQ=;R2=8*_jyJ*Ou%vzq&}tx;lyJ7{~Di%-jd$pZp4+G`FYRT4tU<`}zl&
z7baf|dS%rY&m-6I|Ju*p57YmMEq)+=U?qF=AM1ziAGuz9yB?oC<920{<YhsL1=UM*
zB4>A8Vii~+?f7$3{i5FFZy`S_fBRM_JO7ye@U2ojLq&VwCA)hbThrYtzdf>E!R5}J
zqr3NMi`eT+`#aA6P&)r+>7)M)opmM`>U3XU$gG;*_N6x<HtL4IX5_Q|m+znH@ZBb!
z@pkb9&T`&Uv4RECUH=&z^jq(lT>Pi>YS#NhZ-YEdcF&gPxGQx3OrLAp=VG6uA3u8?
zEo*pS)OhN_=by()gXYO?THcm_=C8Z%vz4A9lRg{%XGs5PXZ!Ea_gVKF|LNVhS8@B{
zOyigvuf7?X-rTq~;@}kTte<m}bt0YG3K-5a?VsNNL-YKb@2Ts4T(fn5D7$Lg{QO6i
z*WGGz0+(cOJ6$l(tMx?4?&j0lee7{o|9UGH|KsBR?O9{{k-y76iMKj(%g5BsXT|z?
zzaHJCw^VlW@o!D<0;lramJClmI?2)W%{=oTsjF(-|2CQ2?~Yn?w(xK7s@TlyLT+7~
zrbLQ)oR}eWs?F)d=>yN#i~joFI`gd0a(N!_-?{p_RsZH2e||4ml<}-W^Fs8xy>IIE
z?sNZVNVzXo<Fs@C)jhGbwtbDuDmzkp=9@jMIH4=!bzgtla>Xa-n0XgJ<8d!u@bB!b
zyrmzqBlmCE9KZd<X3r%SKbKEFsoJ1>`BcGDe#zo#?2Os(^5y=RcOTpJr|j0<JKOe2
zUDkcPebdD^DH+NWn<ktuIoXyH;B=g8!VZ>go)TAE*KE<XlsY7@bnh;cqW}Z%Dzo(r
zUk*IJJ@4z^d^^J<-qQ-EhrHPp{ds@z&nz41wiZ>+W4~<U=l_(S{GVa7-P*+!=RL05
zvHw_OGb_Af?b$OLe6niYth3Ax-c)*+;@rPy`StnN<A129ALf;RXy2Lqp>1+`aoxm&
zD`IVrUZ18iDSCqB$%v_fp`oD;f$xfZ>)d`EfB1CzVgK&wR(HOa|0-Rx+4N}3G}XZS
z=j@WTY`T(}jCV$|JyT#l@cP&4{|qeWKALyilz$99CiT6;RAkSli(6JGZSAs{WV^o7
zxIH~JRPSF*mXX78o8t55EACEDOrMri+!c0h?(ElVr|w^GeEmbUY-gKQUwGhd&3pHz
zUw;=r@z<TRvpe-tes5&*UoQG+7vt6|rf-9a9Ov8-o0uZ0<yA97d6^^oi|lKrJLAs#
z7))ZnCH*|#MTM#Gy841&*V}5WgtMfkt$h@^FUae*;W5UP@^j(J*5M51L5A_qrhK>G
zqw!koypQ+9C6OI(Pv|UoAb!$*YR%S<a<8)Ys{Ng$k{KAGaeK$=-7GrgLJ{lP=iL#q
zSYPqc<kOw#okA;O@(!vz>1#;7{kreQ>v)SFn+|00e&ZC<Y*%w=wF}jr_}R|#?o|hM
zxjz%*XNo;qyYg6O_)GnE`^{_KFQ|SdSAE<6_cWvC&$*F&Asf##?lq24TfH>?@1#es
z{xkSxXHLE4`LIE!Yq7mfyT+P54Cfn8UrE}wm0M$-Vxmb}deR!h&nsVkn!^3e;>7V2
z=K6P&j5yaX)tkF)b;R*Zksz%#x0g&y>16X@(=OciWQvWI#N(hU!*$zs%iL?d-zpWm
z@zT2*SC#r*yKjs5@A7z3a!|+py+MGz#)6dG*G<~`NAL0P+dpyryC-}Tr^K$<eV4)7
zStIAqrsCb)#|kI*TwihTgkHkE3Fo&KtWfPZF8TKNg4-dDR~{Zz-k7I7UHPr?l!(A5
zIzKbqr>nGlI;?eM*UC8a$}S^EhLS)Zzwq9kwbE{-F3l&W9+XyA<W#r6%fl_$XH+)l
z%Q?sOtL@YOGcdifllwT$Ce(CGu$KPK3ro)g9(reFb1bub{fs62hEozI>_1}s@E=dt
z!4z|`Mf_V1bHASy^x5THWX+n}QBStazpM57!0%Ih+IQ`wU)@q`eRTY4(##_h&q{dY
zL_TO-e8c8@W~{1Z{NAS<S&J-rcDJu}n)GD1MXK7|{ujR=n8-<Aw~^0&lKHJVZ{lfp
zq0J7FA3t@Pv1uKUVdF8J^W}E@(e-~sZy)|PpV7|l?yJC;mom3Sm3KX?SU5FAV!<9+
zi?rC;PtH9kYp5#h`gd+0YfNW}wf7Fk&3f}vCYm0~4SChKFwEhI(cIs&pXwBNJlfw|
z|3i1)X8xn=<$k>PYrIrkT$Rw~v81Pc+C3v?-o|hl9-|d&7yEq`Y-98F@|9m(|H12i
zm)YbW_dVLKX)K@jGw2?tWJ4b(cbkd;+tXWIlQ?V*<1eYL%uRoIU&ejK{u$xH$%_41
zeu4)MKYa4@P+NdQ@Tcb%$Fl!?uYWKle(Tn|Ter8bH9dWN`~GdS7>>@Epw`i6d27kT
z;w=UKGNtR^&wj9OFZ;3gEgLI#aktL$$Xj0e>44M3(~~aFI9bHUal-QX!u5)YOZ}Ft
zu)VzV?yQiWE7|wm)|_8$(yX&)ZGk~c9+!o(+>R6f+HF_=dH$c_!N&cZ@BRtY-Kn$v
z@Z^xQ?6D=cdW^h|xmB#c{+4mOT!min1y+WV^<NA=v@Ok*Dcg7~f+KiJqS_NnWoDJ{
zCoFCHzW&)+fAE|<!<xl*EPt1n%s6x>%hRlNg;-9$*o*IGM?;>Zy3gP|?_^;i@o(WT
zgO4%=G46gsw^kMWe79dTf99W?kFPoFq&db3Mjg5oult{Y?dG5Amir1Z$rC4smmH1Q
zTA?n>ZSd!yXiw^aBelP;ZC!dv^6feg%busl^EjUEztXnF{_ILk<qM6^m6z{zG@8Fh
z>&e7D#U?>LqAD`K`v2_>-8IcZz~is>Oyhamju@)_6b*SYxpDrb{c`&=&kOMj)udi~
zr)a->`;Ol-6_(Pv0WJmA&m5lLHvM(Eu<qNx(zB<;4V}KLuyIXXv@&r|U&V2y{oJN^
zgL0FDCkM`Wm-(b}#uw{l$%^OWT37%4{E~B~MdF4ZuHR-){u!zNS9AWw{|s(>md_UN
zJa)21%P{`i=iL7cFEx(G?Fnl=WHeQ!$nE{|Yb(;9-MwzH?s(9pd%DX0*Uo*9byClt
zSzvzTw`9lzCWeC#o|M0hKW(BmeOG;)clDfVCW}|T&gWbsYTiAcRlCH~_DR_%`zd_~
zBR9@rD)6&7r+MnTrbwi$!8^O)3*VN!E4%(?en)+3eak=dzwP=p&L7VEMeGTFD3dk$
zj=-{4zZj362{LNa5j0lGGGL71)Bd=%(Pvq4-;8(KXQwGzZoMkY$E#X&bQWjcL&v*U
z3cs$uc)qQO+oF7b=`q`V^X`N{pWn97bL(r5CkpzrmaE^M|1y4oo!rj8>pp+qi8`FC
zkU0OJA#T6%N70=c&R70j`lTG)s+m-1Ty|A|r}?k>e*eyymy65Guh-R!)~K;u(I3EU
zx{Z%L&f)Q|>o3$M>qOZ%uU|iN>X}J8nF_XEpIhY?%t`p`S{GAyvTE_&e;2H#th?P)
z#ri<v3Gd}-4VhZry8a)h1N!|w)C6cJS=@Y*qtA0hk3puf`N#DO1+DBn`vf!ogdfkz
zI`Yv?YfIU#KSDOE{kLwuT2q}{UJ`hGcGJApbAHy(3(u?Vx3kZ>ZT;8!+su#u8EzkJ
z=neH2vtW(7baTpIj)Q-)-`2O^I<fQPB-7o0k6BObbGvl-@@3F;*n|HJ50*}^<Nx6Q
z*48BITW9*y>|btkSE%0ld2REVgFZS^@5B_letI97aDqWW&M-cA`qNKGu7oVQRG0op
z;!gOcWv?Rl`<_2{LQl+%Eyg&xsY>uiZSBr=CYhIxO76-yk^0~p%hxZ@um5LQA2+-H
zVYTI&XV-0{D^=g_U1c))_NlJz8(a){)=hk7`GBSAvqPbr`;5+}!!!E|ZR|?cEL4$>
zV4P6+`n-SDsx4ZHudGZ%XCCLe^7^RXycN&a>c!nE+dg5w=Et4>A0{yu{z@rZZ}2g#
zqomgVt=VG1Gajk0M1M`NPHbeU4qtlz*hI6kynA;GkMZw(b>!<8QL*(L*S<W?IVF3u
z;qG0IrxMRsuq*c+mt4Kn+DK;Y!uRnT^^fXv)mZ=7$ltb4<*d;U|Dzoyd!yexsGQi&
zetMpbw(Lj4TQg)TTR(r|`n&DJ5<Ah^hl4Y$c;A0}c<Idk<lRY0a}y>;S-b9PQP%R{
zI9Zb8v0sDBll#w=3bRYTPOc7K9(|D;JW_+V<ehk~xa0Ah$FJirgui*4`uKd;FTLq@
z?HoI2WNyylyP&n^b9btT?}CUao;sb%#?F#qtoss99eMuc9K$2l)+1iRD^H7O-+g)O
zKf~oe{b&9-olxysEHz=-Qq{Uy{~6++)K))^@08=ZWGDA(KmR|07oRc%E1EpSBX;gm
zi*DPtCE`q3rrNi^cP_6!YwoJpk{~$Aa(<)W_TJLF=?{7uRr2LBgQ9Nn?r^!b<&bHt
zRQQYf;^M4}4Hjw-zMfp?9{AzjdcN6u%S*FW3|ybB6xMcotD++m@i>fO_u>sat0(P^
zmepF`y2p9NAK8z->yH>`tu0*~d*hYIPt}ED!K!yQuK2ykb8-L4qC3ZSUrC%X@vrc-
z2P>RfR$eHdvTJ+Uy-u@x-!}c8_~(27k)${^(JZ}?wVO71hcDgz`g0oZ&dXc5E534v
z{5^X}XX7-PHxr%p+%H_8^2c}chG>sx4l5o^5SLK5Z@0g+-_xe{x7weQtNRQq)_ea*
zesDKB;?m@(y^}6IlVAxucI{c(&h3J}1s7dTO!Vq7+sK?5x60MxKf^(d{|q_uviF=z
z3o{p0)EWfN54>{qZs4v*+!=ao?+X=d8)Y-vWu97iu9`8&C;8erum22X{}~!D_dbZZ
zEa?>T;YOv`-^$p1fA<T2tjqZO>srmk<T>GA)E~<KP%K-md&v9oe}>Mm3&+^c@=acP
z;+@^(*gHA@8BT<L&2RkA@SuDDCj0jO*^kz`AK9lmS>fNWU)C(YST8?n-T1ZU_x1TR
z|0?cC=9}FbZvWxvzisgyo8~XxE_ikO)}DktPxgDyKNo&zKkuDenfxo`T>{R8HYj{x
zu$lA0`1Y;6*S#;iD?RBF#xIidLN?6(V5;S<<N)rI`!l&WMhF=mtq+o8``cuntk2Z(
z<YJx7OLL(^44zw6CkIVezUF;=%Cmi&FVxsCsHjre@?qcH?BxwiO1B(kV)(kuG%UV|
z{`gn?rT?(s;(1~%bN@5UT>3*V`P-W2172HJYE{fS8NK!X^W-1fKJu+jd{7;j^)beO
z<zm)J+B0~#g&)Yyb7?-Kd#>DbO9GR?%IDz^_v|zLvHp>Ftgy${?77L|d-_gY<eGo)
zPK<|ghwS2(JB~?gqKr0-@#*ykUH_^4uzs}vZTy;7bpoH(<!;IL&K0U&a+rJdZm}8X
z6%r>LGMjvYr&3Mrjo7|L{~4NmYxw^&v@CzbxAf!Z=!U<|hgRj3ygmJC-_laClnE(C
zxo_t)H1}SfP#I?*bhhG{gr9un){3I@Q?1Rv&AMc3b$i+I=Qry)uN-+k|K^ufaa_I`
zyL9j0**$;Td=5MDjQOl~;xFR4Y|IXM$8ufFJ+p)1yy4H~b2naHHf8txwN(Xv#(h~L
zk}nLy4p_WCTR(qBkIU=OsZr}bP0rnKzS@54hA)a<b25X&y29c*el~yG|Kr~M&F>G$
z<{!5T>6&%+Qm?gp*nfukuNQ>M%O2s7OOxx2Kh+|Y#3C&@b7RxFqjUSq(rh*xKABYH
zsq!iNOZPvn^p9`rl>U_cXK0OGd_v{oAAw~zPvlSY^-7R>`z!go<|a|g6Ltwl>&hej
zrUzAqEu6boM5un^`nUb;JF<W4YlLRKwA%Oi%Wv&>*RO8=DSb5OTjaEi7Z<OY{Jr}6
z+x+{>PYN7Qd2#b>hPyQX-b-6^O?s1lq}{s~eD3m8?c0_=w|#sc{p}yyN0C!LO)9@O
z+Mfu&o4n(+&f$7_LDv5a`P%dOTOazI+W%pN=bxFU75Y~`TC#iErDObCV?8=0UY$9h
z|IAN&;ng~^ACrSO2t>Sk?l<9UMUs&D1@U9->shXg)u&Y7jW()i4&Sve$Wz<+t@H8k
z!K}6a8K%~p&6lvqntr@<|CD6)A2;=neBJ*@^7-dY%N?tBs_f_9f8a^!{H}cr7iTV*
z^~GB&MYP>Wz&)q2=bz~_tMkX_%Ggg|`m*hT+}eVJjKB2N<)eNb_xw9y4{O@Rx$eR_
zuQ=0#&((K4Ue4aXv|7CVALk$A3nH_9wQdMh{q(4+`gqdxQPRGNHTLd5M6^Qc%DVpC
zwp#f^a(<G@`nb8KPv*>jH1Vh3KhuwVTgx-eCg)5%vq@OUVa?MS&IWH!KKS-%H~*G@
z7p0C!>*l2Qij;=*+5G-<_V$g!_~laX+xOUucki)I&CHg`xRfO{HI#Yk)*Dv*zcRn9
zyYk{%*>W?j6`Us}WJ+XTKQ^rQ+_iC~Wuie~%(;J`^KPkLy4%0};9uDly9)Y@CCwhq
z`X1E#HGjQ%@uxa{rn(Ek4^wwlOlk1W4_E&8Blyc}@66w3Kb{{EXL}sJb6(kVYuy_g
z&*z*tz#ljD*A6pxwZC0U${Etu%x=x|l=$+(Uh8K~`X%>{S86ME1pjB?3IBJu_?1B%
zL%|oF*P7?<pH=@A@#pHr{VCSZCrF=o7rE>0#A}9qd)@@OKaTtSkiX%2oWv2aYZs2O
zv%j}yeP=FI<iE~B^lS0?{QTJ~W0M`P-f3mtAAHnL_52wF$9GnOulV=Y=w&`SFZftE
z^kZ@Mrn2~=jo)t8w?&Haeop+b!GCx7pV)K!ejjpM=VU9knNF8b6)f!cbGPr!T{j^)
zjv>KXj{is4uL*Bo&p)<A`)rMyvf=uun5)a4zPkPA{Hld5OFg5e1bqoJSje4s--cb*
z&vLcXBL;Vuw`~$@eH4R_I(>3ktSl+JdQ#BNi$yB=j~owvIqE0#MT`B?=B4xQFd2Bh
z-4bGWy5LpKgx8H%+vV<7E-f&PX70;$oVat%&V^U=k^@C=-I}*_s(Imk#+Bm!b2q8(
zoc36GlELbqx(b%}JL1LmaDH%h+xGGKkzVo8k9@tdZ^W*LNvWRQy7W(Xf!Duh*&8ls
z1~HrcNp)mwJh<NBN9BJ8R?tScxF0Q*R?iRAcZx|n{Aci-AG2xqX(4vO+ph|nL{jFl
zIXp<Yeo}s$&Of$IKiF6MKDynqeTRGJmmSw?*W3P@f7g8rQ-slUJ;T<3h>6=xfBG(}
z*qgZ3ZF7@lkh)@_W$@Hr%=bU6_vUpnYQ0(VJbmR~W8dGI{}~SQl}bL|_VMcc{y%1^
zCniq!xVkP-w8)&(<YnHKl=?jfN)N90|55l*|A$ieky@_f56{0@|FJ!O!_{S5rXBX#
zw0ryRJu^&?<VzU2uef!v==gKXGY31L&R)6x$@?SwH0M=>zRNAxc{1O;-rjf7zN7yc
zni76!e{20Q_qX$_IMu(?|7e?cZQalIvfOI!Aqm!_OY}w3B6OcvPyVa)vQ4qWW3BqV
z->YX`DoGYC-Zo{*?TtT<Kkm*<x%S6TeZu*Ek*t6oC%3!PjTKZI6_{2q#8t}rR))<`
z3peyBDsQv+eS;+>`S#NCHh;0K)oWkZ>295N=~wnk{q=AEGh8{IUtC<M9CPf#_H(^5
zXFj&%>=N9%GdQO8ba(XQTsiqOtlQJ`uHC8l&#<pb@c85ST&Ezf^TAJEyMEr*zt@ia
z$L~Y(e0!XeSN*v6>$I=0`(d$($G)EzI(GSXjNc@+R0VN{9{Ieh@9HJLeD867q^r!W
zIl+0yBAdGCBTt%kXoNZTS;-V+e-1x>k0HPFKLfu>{F~h?*5;Xbzn&eQ>1?!h?~mvi
zo!XNOwLF@YSp?5j*q7FbZMc@Zk8}N@r@MZaEnOb@v%pvH?(*zu{Rug5BR&ZhUl6Fx
z{<XPzbB&w&v^6j5-cK@{`u$>T^vV10KHE>*@tn17v0P~Q_jN&gayNx<-al*WUw`8Z
zTX)`j8Xs{*F2Mcf(z}z6$`sfIUJzxMDZbM6EBxV{sMvWM?PjlTWLo@`At-Xr3f`VC
zcP~7VJ0egVXZo<dA$-Hh)vtH0d35mY+e;OxyK1L>VsM|eY5okQ6?fZiA7=bxd2adP
z`}}ume0S{lu&?#8YM-oatbSz7=Ev5HGv?VYIKs#F!0B=C@}9r%lns_GdU&QrRA*Yz
ziq+1c&vwuEt|+^Hc)!3uZSMWNuNHoJE9krCTUPt&Nf|dAr-=W481cZW$V_lv_DAi<
zcH5KJ)TDis+qqo9tUhn%Li;1iI$lE6PXsDo&MEHt>pJh=e})HJ=e|Fh-!0@bDK5%?
z>CGGN#&hnt=bgE%wMxZ0Oz^W`h|H!YZwvO1&m`ntiB0?a-RFj0LE)ah3JV3khUBGn
z!jICj{rn^<PW`Q4zvu7g!#48*O0_?2T{`{sPr36SHYMhLepMb;Rkm0-+CTNlE3sp*
zOnwLb^e*IT?@v9Wx;^@o=coJ6G=3b7xx948hAZz)(l>NT=zjN<xz_vXZMuDx8Z)1f
z#KeQo_h$ZxvR=<!k#sNjlZ2`E?vj~pW+J|q7pONkDzH}f@o!C5J$_3seUDI)!|$~x
z4wu_}zJK|{`lB&BpWJu;UM29f$>aH-$Q5xhcRdzv=GxI?^l25x<AP%$@}CN{dY`wN
zX8SYUtZ|<8>c)+%aG_hyPfvDwblCkYdo1nfWcST2WMZEi-~JUhBky{J-h3DHo=Ior
z;esOf&oAS`*S-98|K_5;+=<7FHu<>mJ(yqFc~T+0=Pk4P<X6@jhu*5ZarIi6QS2Vj
z9eP#mip_>ak=*(|t;}53-`2-$X7;}1@`>%t9pwp@Tzi_&v#)&rHZJsGu25~<D~(0g
z4AwKg-@a}i*f(#-y2D52DOR6;w)Jwz9)n||8#oTy)Z9F2_v5&|*Oy7px;oEGYHYiC
zJnqivRk4$1{`|#w-|qMYt{ZYf6B|-zI@o+V!~e)S^scs7vu|(u{(wsxq}_@b6X&^Q
zOw08-byUigWe&qmhU((Ty=EMzSKI%;{v-Yy?~j9v|A=k5{MJtX$7|0^YjX4!Zr#3F
zH{T>zxL+$%_j|6shVPNKvQT?#zT?04{+(%R?aiz8AydxvYTu%o*S67tygHlqPm+?I
z{Vn>$@(BhZ>AgFi?LW8u;eUod!v7f_iE!60&DdwL_2Smo6+LBvf4g4VT~%58`$XMU
zZo?iX#=Bc5@0T$BEx-6b!$C*;T>YEI5qp0yKk^s56`Q%MDpEx_`gZrpH7VP+x@`}i
zDY^Za=i$nU`AH7^4I%%^;}ySMt=zCx|A+jt%V(A>JRN1T{C)Yc`9D;8_8EOV6Q|vM
zY+_c_vi)V-uLta16ZZL}&PlbGsnhO8igBD1<$ib2fx$-bYyO+&kI@JAG5xSr|0BHn
zvG3I5?KZ)dd$#obi=L6UV1H%ENtRXRCJi1O0Uoy^1Sfbf|2+7&WuMWX`XAqa$7kD%
z{nMy8edO2nwk;7;^|xxiyCzl};3>KN(w!)G*)@jyXQXH`ly!!t+}+dsxAoP1Q9Ggf
zLzePg|I}WzhhKW;@m6o0ZbDbuwgyH0f>vWa(QQu}diJ`xmL(Nl)i|5@%Ij^^wHFyH
zRvx|;_5IKJr|*yKl3TdwN7whmR-2~m+Az;MbLw>#8{LfuWp~Oj-+meA`6&CwI{mn7
z_osB^vXtoF+xHW6fnSBQ<B!CTt3JiEXDyE0@KJY<)Y9Hpn@*&3m2z<^|7eJ-J?9_w
z!`Snp-g;B-0`_;EX(wNJ@yxH|W8Yh!Q1H*n^uvZD{~3&Y{zX5E(OL0md3&tnNBOtD
zk5A|SaFKp^$|<()zL4bRIW~ebRb-1KHnU3n6U~`CvHwc^57phbUj1iaGL;uTnk&0x
zz3twXmm=9xTdqx<@QHWNwnxR2@88>}_jl!%^DT7@A5!KE@6(R<*Iha3-tCi{j?Xte
zY<A+VxCT#GkF#Np#4%|LiN7NM8Jfzn=CNMipB`!2-xmLgWye1GG*&4y7mrXcEAuld
z?mX+H=iYqsA-nyU&#BoDHG`Lntye9-Tv}YuvuV}pj;ocXsp7A<|FQh?zFY5^=QIz$
zs~vjL7A#L5B)>kN^*O$sS7ck%+pmWtKG(fgso>qP=&glTmHghz%C^6*FRJLhq?A@?
zvuT}MVNX@x-p%t5?UZM5_;~B}ns-b67NqJ+=Sh?>ue17i;yHWIv;7UvzV5Q$khx?*
z@~fwpuB<rN=kug^cmM3|Ifa+|qdxvk+5If-UQqb?xFwC3GbOC6=TwI;e>Hi@W^XaR
zLlG=0lY2fl&b#aH^E-Uzt8Ewe{8aSFVM!0#)5OVjs%H;hWn%x4%bweOZa%%WB;erw
zDwFk38;bYYyt827pU%8pxv}TV-I%*K_bYHuo2MYXx%t!EgLleKtXaC3yXMZb-LjeL
z240iBLXJrkty?%_TgcocQ)T(8QuqVoLYL0YuHfNR<a)Y2aZ1zS=1&bA$})W|RpBL?
z_g#u(qn)q5RjjqTer9^=>Mbc7b)Rm?`#rb0_)5XP8}B26GnWVLndEUGgXw|#naG)S
z&)=78a`9E1uW1uqyY$TVi7FR1dJ2Efda=O5mD%vE!ld@515e6X1bE$xRsWc6*H_(H
z7IFUk&O0fSn<YHjWDO^6vUtUyW9*x`;MQiFUC-We-}Q+-)#foj=|l_9#HJ<2p64zY
zuq#U_tE=0G)Chcxo1FUeq#76R%ko`0xBV6#pFWk<NnpX>LsbvkEaf#bW~JWQaEBvs
z!4r>94>oOkx8kLMTj!^p(vqFB)!~=#Z{FYZz9#umgl>q5xWL2P=Q~dDBsN5JL~JTI
z;PA@l+hZ7H@g*Z9T4t)y-t#ZIAF3bu%Y1M@XQ{lv-7L<0v0m2K7OB-oZV1LQo&2mm
zQ&5>tRiVjQ-@5&y?(c}K@;cRPiF>aYs?=xg*faA=(M>mnH$I=wbG7soSgd~){cX$j
zwRMvJPUdGnc)iB;k*PQLPUV!+1B@x>XDaWByxkhRw$EtwJo{<$d#!?FC7zvWPuh~u
zut3OB<w1$^uW#$4TIJG<o0{(3^*>pEqx|@`!fg4QCyiO!o=$A|S?4}s>y}k5e|8sd
zpYuzmG5$sTe+HJxe;0n0KCSw}Z+)@g_DOfn7Cuu9+})Za!Q>El@{ZH*XZuetKDb}d
z{$W5(_`eI2oWkzCi_n|u_n+bJ&n052Zk$2pJf+8Fvwv^@&(M_lr)b}YLofE3UU;Wm
zI*nE9tomt{V1@8woUC5Y87ANO7*pfzRFds1n5|Y-QE_Rt<io`(U;fme`FD(Wc4pP;
zn>S5zc~(Dj7O4o_QS_uVKtiA{^rWToJnhfS|F~;ET+;8E|G{^?Shm@R#dj*qvUBsy
zxX#>*-QBt)^uW0&^~A}aeoeemx2nSI-{GTn%$N3fFFO)u%+xCMpJ9#fo}%iK=eF5T
z{crDgtIhu=@nid<1DE-?R-^|$Z1xDKOzm3HuM^(f#K<65v3|*eGc_M7w@C|&Z+WOc
z^|HO)`GSc@6J9-hvfa<VDs%qRuZ3K<?|So@{mcoMYml0DB5!Vh4Dadd3r=&rGTmJ(
z9}wOB*Z!<$<eoETT)ByJ3Xe-3-yijSOG0z-_IqxZb*kHw%$wui+Dc7dw&dbJuSW?}
z?gZbQH`92<l$m^$miB&I+f|ka?e$QSu4aBeZ@**k{d46u8s;YR^<|5ylh#K>I;X9<
zRIL11_k}g%8*Pg>6`Q6zpRu#K_n+aA?uYCn)5BDbL>*ml&+hX{OF=!)cisi|T7TSj
z7Uad}C%M+`s=FC=<8mG6-p+G>oddVF@ENc~FSGp5u+RR)`V(R~HILW%v+eJ<sXepQ
z=9Wm68)wb!{IBlc_FufO8}cb@>aTP8?>zNCs~ij4?OiY6TKrJ-!`WNAPiB{-Z!7#B
zsv6_fKJN*WfraJCw=qe7@02Y}$>@7x@m=&s)~YR&U(|hnQZ@f@eRI9YKI3fr5B+}(
zFX)%<Uf6p&TQJq<xm?N|B|eKghi{wyI{%^iAIHLvr;ijkuKW{qWx<Ch!H-XF-|D|D
z)~3hp$cq)+!UwpXZ!60FYW$DG{6mvJ&%aZ3YCo2*%?<zPx8q~f%IAOOeLEA%URY+H
z?kO@@yf6DZ_u*N0*EN3RcfIm#=GsMVkCZMQ-(Hec7j$}u0LRy3g|q%hch`6vJ1%LX
zC%WR8-t|}Y4j<y%c3AC*Nc!k`@?_lgO`mT6Ise4`+xx$B{xdvSIRArJue0}strlC?
zbN+}v^35glyGq1K-pB3|;#!-WHp{HC+Sqx@YNZO(s-yKB-G&Js=NRN2*jVe=<^K`q
z{+4*jK0E%0N_nsE+*z-xt~Y<V`Z29r!S_=4Ttl0alWg}qdUX42<DtJ#inRYsG>!IH
zV`};4?ff&noHx}BB>A-tzcO&GYds`+W~0HBLaDRSaWDTf`20EERrDfw(pt}=qubVA
zG`;=g;#`5dYKA|;7gvObbh};Ici)1aOE0CrAXx2QLyF+ZR|eS)o86{846L+#w42x7
zRs6b8l$Xa5p94L~1(LD__FR8gs~kAAOz>Qx9lv;I$=xe!>e}iLn!h==@bP`|ir)V7
zd^1@b>sx+)m(1I7{MSB9*{bjt(~su5Ma#10E#i@kd7%7OfvNcQ<@=ZRiGl7Ih?KV2
zQ(na8r8ZMgxkvUoPx0-`w*Th-JNRSj3X^X<soK{WdOmO*RKEP{`tjtIMd4H8i?1vV
zpT!k>-u#DlIqUHrr5*h`jFFtd7xEs@`}utT+FIw|m4D<v#2?kxXL&8BzG?5SDKEEA
z^ERC`QCp$$@sy{kESAp|bQ(ACUC4gq-?B+>_M;z{$_~4$9p3W1Ro&)EVUvB-U+=#Q
zzHr-%*RX!r-?_wa|2Mrg>lXH1S9>Pj!gAn5&IBVqr^!8E?BgH4^(r{GV%5f=?%c?q
z%k~F9sdyRE7aUcx<gv>7(tW-5KkAh~2uJ=<e=Og!Ywo_y4}IM{O_t1+vp&f`(Qe+8
zx1ZzJzdQE$*;^j7lnJLN#(eKA=@#8+r+D$`Cb!L7m;T+mIB$E?lP5<_cOI}$-V<=1
zt-_sGKqV*eSNb~NMYr$V?fzzV?ZCfR-e<eFOfY_yu6^=^?8m-8;m7X_{b65}AvGmx
z+N56g_CM~sj+F#O+}1s;cWCLZpW<rP9Wo7J>Z#1y=ikJs{wQ@4kyGc`^Y-@FjX$=x
z%PBw7zWQsQ^`n2O-}cP+{#Rf7FY=1A_l#+FjULbC=C2L8<dR=Bt*1w_G3fpg2gwI@
zF=eX_RnG|Ro4Znfa&g{!o>TsJW|?U!^#{mCRCk>W>pwG5uy8~5TZxyqKYU;RY+tt8
zZutv(muim17@AFd6n(_w<1-`KQ#YlnHZvb{dwBBYym?!HcmC%56TJI_-~7b2QQBL?
z#J8Jm_GMWn-P-g><DL72{|tI3!?RiI9m4lL{IR%lpY(SHhRYm><_Mo>pL~3$(*EH3
z#Qh@b?eF#T)GsGpefu`|ZGK+v%)XCLd<xhMw{CmtSIKqr`BHviR+U$)m#w*eA~ez5
z_tV}r=WpmszGC+Nc>dekcQcM1KfKxLeZK0c={qV_s#~%<6Mwc`H)@-d7U1zju4!NH
z$7|b5AL|QbNqyTdHT!H@r0NdA6@r?Rxt}hnoubc>@}%^+<*O}~`d|5ZU;aul>n&V%
z<7A;qSgTLsJkQR_)eM^??LysDp5z=#R=24C(3`#8e5LBu6@5nk8BDy&63mLk3oVW(
z6&1gZzw*a;R_cu`!<AMW{jTkvbh~bS+1L8gyZz7lluvKw@lEFlnjHQweBa&O8T)F_
zzf%4d@zM2o?|+80_skXZKJGa^d#=!tJAeMAse6cNy8Y|@e5}Zw<+<n=E1}g}WV(Lr
z{>D7b(>^tqi8Dd$(XIC(Tly5dbGq*RN)%A}<l!ds{q-BWYdzZf%%*=zkCm?UHaX(e
zvtC?1ZL5Fqul=nHO{WKh2K&0k{eF8T&+{Pjtj(Oo4T~1s-SN=fbam1Ug~sdsYirgU
zrC)HB3OI67UVUwi<nM}qm#6<{V5?!)KYYJkoTcLW5dqPzh*R$_>pVTR^(MQ5*8`Dl
zEb_CB1VRm}`ES*KJMv-vfz_ISG#|#RM}C~V?&_9vKXg1Lh3-vNX5kBCaNaMyO)Y9a
zx9NO=*Y`9&%AW7BiM5%vZDGCPyjR(6xtBc(CmrQbU@%xU+i3;YZU=_4r!#&$+$gYK
zL-W(_n{WQs?CG~RX<qFXlB_QMvUJxMyZR6B56g?jpOx*Mb>#Aij|X#exc7WMsm#(V
z(zo=^s;9G8o?QPr{#(fp^QHgJ?`QoY-?ELxTW==Y>zh}S&+nV@b9&Inzb`$RFFMGs
z{<QfY=hF|HJ|DX;viwKmiWO4sty5J(9Jg7Payp8=s^637ds+78VTtome-C)f-&@-*
z{$u9M^eK<sMN?VcXROZ7&R%Vo-)bSuJk|5s;kzeS$L^co@Z#h-*UI?g{ax4Yv+NVf
zwiiqbt)A`C5@u+4e0H_r&Aj;z_pRklExEqVUEuxv;`sjf4*~t17k{jO#5?~`t?l>7
ziqx9dYu6sm66ZX%&1y!1qWhjc>+pkzcYX_fp0TYi@jpZAjg#f7Z;yDIo;}mA^J!P_
zrL)@Nlia?hm+9SGGV5yF`9dbs;}$RbKmQ1i&gBVM7~=ZJE!$Dfi0Op!*SE1VdM*n_
z|Ja;=bz99>8&i#XKFuoSd7CdYolu(>;BcII&Og%&?wOhLcPziX^)a})Q7>6iSw=`p
zwa+AI<<#Rl*U6>j7W<}zJoUT3)MwN4kKfk>YA?4ucRy;a*`{qW9t$_$ke~g5ZGx<o
z=Q;m}VUK5qe7?MY|I?V9swd^_0?x|9uPpxjuGI=GUE%Sx@5aR{zAub(*WMTXvG(EX
zi~}4ddz0#a2uwPpP_M4Ed!~M}%)1Bk_GTY4wRm3N6BU#7(=fxTS$OjCnbm2A{~7wi
z%f9g&7{%Jmu61+xYH4E2@H%bp7M99M8sAQwP0p%%d^6%s%*%;u&mMACJ}maY<~UcG
zT6JCy&$o4HmNuq2Z=O}$XgqO$l0D<eKdZifTe^M<>zblH3H3bb^0SjBryeeT6Myq`
z;D_Uf&vSY{Qd}OHHS6ge7FnlX5_(Ug+Zd*KtP}EB`>=nizzY9J$@%MN*TjF6Z!SGA
za=7?`HFvgxqSDv3OiP5$MO#l)W-`?>k~w}@$nu2c&qLlvrWI>!ayq`+(Bb*=Am*?h
ztKQ!QQuhA4&J=z<)n^_4XpZ>9Fm0W4T4_J_99vuVb5hUjKrjDQyZ!F!Ox-QNxo~}#
zgwJ`Mw&<4AFE4J_eX=$0^x{pMYD?48^i=&SSib#duvjVgD0cVBmoI-_7kTu~J@&d#
zx=kzB{ArBJpO@PR7|3OB>9Y3JHvD!%<v)Yg-{rTIKdw(JF|TUY5~*(Kzw<!w*MA1D
zlTw{-axqOWCVyv0s<%o0`d4d5wYEi>yspaai4&XZ1++HlUOlGXB6h2APD+vS4MFcY
zOMPXzvOd32&5={$m&-oZ@T(*(uR7J$QEly-lb_tSeS72Q@bjrkvi%#L&zHZh;}8E>
z*Z=T#dcE+gvRx@Ea(T<U6sI2iXU4){t9@ka`CIEB$h95V-?jF=s=c1ci>LdP*I9OY
z{bzW5x87=3$*c1bu78gn6O5i8cu@7QzjT&W_i@I8H6PqM81fi?HXB+VuUcQvqFtac
zDRX)7gnc#ZoEiJf+8E}!6<Mxt_~ZY(_K$Apr!BI|Ay=3+LT3fCu5r&ecp{Vg<CU6u
zI~Bfuj1B+CRl6Yab=i5l{w4PgXWd@DX@1Dg*5`qrHW=S_iDGg*_u_Hc<DQgRZ`%C3
zXYJ}dZxhS$?);Mdxf*NOo3_N-NhG<}CRiqP&DYp6fBuvrM&<o#`&>TM&0WMAx^qig
z?8+@{ogDZ7KK}GzPTjKI`@8Bt1jx76Z{2_Rul>X84f}*%+Oh8c@NB`Xsn@oru7CAw
z@6j_x2TindlCI<~a&>y6lJ2g<lUUZ^TPP>r`(%4r%e#bwHy$@cq)YxWj%&%dveegU
zS<ecKQ*rN(iTBnRK1|spocS&6+uLb(lzUQlyg$Fb{?L9e`v(){x5~fOerVrkrT*sj
z!XM8=FYjS^^zP#x`|NMo+0HhTRQi=Yd3VL0cyna(vlxqm2c#XCKl>jk_WF27EB$Hz
zh1^%!uh#!ieSiC{eGWhW{W}feC+0e}v38u&)UoQ@Q}u22_II-<uA5$FFIAJOH(&qg
zd8wm?Dh_wDt8T6KitO6|ZSHBki+B6;b7p<atuoubr|X|9n|MIw*OQNz+xvvC`f=_3
zZ}Z3MUCA3ywSMH=5O^?%tJm#C?ybrfc5|-!i)T~?y^0PlF$-E0b8Lc#TE(QmxwG%&
z>h;*wJ5;DVw)bpZd1CRii4Pu$zU!UO`l{?d!%cIkycIRGqn`+zR~E3D+asrW{BL1_
zOwZrDhuN1_)wk}``;q=IZ&kjXVw|kiYwsD3CRxXgRvb);(ViA5&=$O%mBaR!UC4)j
z%S$s{+)~SUybP_kGk))y_sXwu-jX`eH(~P>E^OUvC#!#SUe(?ucD`%>F6_8-`{;yw
z-fJElwc#ok@wBTrnJCRrcKy{I`D0&;{+N6)%DR1Y@6_+Hwqg5?Kg;Po$g=Fscr>dj
zdZzBXU2A`3e5uyf`_Hg^AN!B1ANn8HAC5Fx?R~<v<)i7EuE@2^?nLt(ikzM-GjU@F
zqXTn()Z_l{ee5+%SJSV(-`ef@ResY+!3~>BcJ1Ba6tdb%LGaMojgHgYJdRn(Tz`K0
zhu5>1WBUbECmn2e7TFe*W4mX^+nEgqEpOcUw$AZQjrPO!Mwbs=;(Qk{{kO{lj*GV^
zDjj?CUT5_meKXMtB_r3`vvsD2E-tyfV*ax2U&70NZhm4A!yL9Wzb)+LVo!auEBP-L
z<<(uVm$WJTn14if^^cYN&ZTs?^Ua$1Y0GPyH4_hTYoyI8J93@xfcTNbsSct3A{W0r
zzw%W&R_~%;{Iep7npGTkj@uMoT9q9v@x1!<Nt^3;PYZb_6i-uMS*AXzc+T}r|IW|n
zu~V!G{&;QThvyI9F1k}O|Je2q8MkzbM10PdJQSQczaZkE^qmI}1!rd`Xa0${JZrZx
zC}QTzUzPG(pGw%Lo^ETp@uGC<hV5G}Z>^4goqcuEwP(-YeE2#4#k$Sj`7%YuTAI@Z
zH`l${5#Tg=x0X%Q(RWFgpU+aajNRSulfKW^z^YF4m*{^6R>9^2_oV->+NbbG>qpq+
z!w=`Ts~tXIWiZdtWPj3!H=5~cKd10slHOQ$?ncZL1~%=_uWbHK@@ahfVf6$@33b-Z
zujf3!wa11x+#+`I%e#8<B~O#KY~5I?zwXc^k7HGR#?zFqBsaz-KjIC1XYzWj>vy&U
z-N$z4Zd%yQcGKSb(WXyIR?GGG5l^*e*4rjHyggTV*`{7kIBx4^<Cnh}awpD|%Cxju
z^<hEZk-oXds>0WMR_|NRTN!&(O3)@w_Ct~FO2N}rv%?qY?%+Lp<FB^0^W~t^-k!@J
zg<J1@x&6=A6-z$v30${R|98hems4}Q*yS}ItJ`1s75X;spN5LBm5^Dh)(vKsl;W3P
z*ZrN^qpCgCwAV8^UQ0;j-)9+v$C3xXoe#XX<FHPb*P=Om?3X{Uo&CGJG9^0nSVioE
zFXzLKSu&J8>VK2ncV<adbK{>?KNs!dI{yE{KV|ig`}^v|fBbvy^I>_<x(P4Mi=0^>
zoz`{<Q=X#eQCDQ(c8Iy;#IyZj_33y0A1!~&_|e>Z+a<jRAMLyCwEUO9_#X80z4a^c
ziHFK<fA3zW+@w-IG4jUSAYt7WJK-gDC*wEw_wDgq^P}49qt7hSce91NTc%Yk_jtxV
zY5lX*>(AKVy_-0@fNRJ4t@Y{l4F7J%Zxlc7-&QYJ$5pZDb=-#QUo77&ywcWfddAGm
z@9~*d<ymgMHAi}*EWfLt;?iX8$Tymo>{gI9ZSwZe<W~!u*Geu8j`;ihi|WVp!|{Ck
z({s%a*>C#K&}?d9vR$CLq(ALf3D0|FU)@`qr?<U)K1EQeAu{>&hqC8iUw_N_`1R?u
zrdx80)IKt7xG*`aP<FzOJD>EYe+vkl(^lA|tXy_^((wiVc<nRve`x!6*k|P5T2L|j
z+w_a;9$xrz*5;+yw`;Gyy=VFME>PVg%qhV9<C@&-b7aEb`~MM^|HpOzgBZW)!G~+T
zPA;4G%egRrRi%8Yz<H@%D&^dTI$0+cnrW}|lG(gnX&=Ar<fLR%%cHwrFZ}wW=2Xwi
zU4>;EztngCld5s~@&4i3=p$xQTp8E*u{Xah$}~8TSh3}G=ZTq@*yJ(=CQp)n#!##M
z*f!`()a$hKeo2dN=WuTM<RM#R_1tFO*T04}B0qLM{Lk=1qrJs+^?wG&8{QB1OJ!_a
zv+*_WQ<Eacg0jDps%NylTsSkdSutpFhPtY2y?wp-e};5>fj^QzcCW6`KWg+ds&8ts
zf`PVX1E*(2SFX(ZX%F=M3@30Lt#_!XKK3Qi^<m-p$<wp{#a}P}c+UD^)Z~?4dyMwX
z`_Hi0UeP{(*|j~DkM6hcXUWy$pIvf2YVYN|^OL3iJu=IglN+(`qQZH}z@EwR>*YUq
z{S12iE$OP>maT@F^&ckQx&3lu&EnLpTLPUdm@U(I-tJZ}mb)SP^YL$&8i|k3yZ*S=
zuKrPURCRvH7H`3N8Kp?wHH(hr_FaB9->`f8DYKplm9Kxz|IJb%_4?uRH?@m?L_ILr
zU47Rpy6K|{?>_HkuQo9}VL8CE;>0lq(XaE2KZ-G}=Q!3UwIo$t<HfA}w`TY6O#Jju
z>Z!zzLiR1|*(Nn#U2nSZE8EhdMTg2-Z-(%^WA(Tt%{y=J=HtO#Piu7Ur7eEMkvB6^
zd3Vby!OwaxL^qsrbMuSfo3YmVXVP!?$yV$EOLCPPkA*bU>-=YkiWR$=Yx4T7^XZ$a
zhc(k|HgfG?R-eTF;mODN!=2mCznUv#Ge2O<tcd$HYnV5S#U4qYGq0#F@a660rYByl
z_;_sN9Z$_kZY+iY3s$}`+m)w$oq?yY&#kuYOM+z0A&&DOMNimT1fKWX@%Y-F;uw#c
z<;hxm8kSyu*Yl3GQr)JZcutYSx>W&JPVSy(z1H$f;fZ~Ly;B_%-u4@I%{|rV5I1{M
zfymc$h0izb*|?*LVd0EjQ<IxExq0WZavKX-tv`3;XQS!eY|nhVYXTmHpDWu;!Vb^L
zO*+3Lq2yFgb6?@C&!=CnjQeD%yIAn(7B?^bGvSjALK_t39TBj!&AzdeTbEC(_r9}V
zY*xwkPZPb4ZnucH5b!)HonmWzKjT+WMcXIo*`>O9o4ifdta)QLlUYH5x68Tr#<Ak<
zv(9!08vaZRjd-fPv1UWd#($r79btdq|DPdl-jZj}&RK7sxo7#^!%92(k4tYWoOu2e
z<MEu3^E~Sddfhi(dSSSAVV9@$sY#)+n-+U{eKOl-&XUu-<?qwuajvzCf2(Fo)h<7>
z*V=WL*n5@6MXmbwm7Qgi<#;x$Njem)nZ5W$1k+-BLD!6L8<%d~;XYj}cCKC08ir$a
zH9e&VB$by3RrAUpiE3}nPoD2SE5aqm>@cI@x(C)AHzS0W^z?cB^v_B4-KsEaSH|De
z{|rsDe=J?MPp%^0@rurZ_7J{Q-_1u0J{}XjtSh1yCtk2X=tNS&ewEe@{GaE3l)GZH
zaGnv@<3jaf!xJoXzB7M(d2Qd1A2UCieSV}Owzf8(aoRaWX?Gc47Qxj5kzop_x87;G
zWVKEuL7K5S{OCWEMz6n17H!Ndh?buIK_&gxzUAEM((_Vk?-$CSlt1Pzzu`~pN7o&`
zt7fge$Hw(Qa%RJ=(87kQgzzsP|1+>e{a9k!-&|HDdiBPv$1Xc(-EvK0)=_xZ>hb>f
zCc}9*ju*$DJ^t2uQGG()1v&l8vfmq5o>ov`JhD5LnSrnIL;bP+E}(Pz<;A8SikE-C
zPd3gc%wF(TTZ=J6TXm49%#(K+w|f`cYd$Gmzw^<b-M61|W!7jKKefmfe`Bm|w|4R0
zi2aH2^8C^@(oLs6|IOWKIQ30IR}ue;bNuSFzVY||6W@5Pj;G?X<0MOo_>8I+*P^2G
z==}_uam6p(ukF{ie=t*C<k{Bi{Vn;CE<(<lz2+0QOGoxyKA2R%_~nJg`djBkU!Gr6
zksWkd;rZKbliij-d-ZYCSDC)Ot3R)qS9hr;<$JTOp5n3>$*QNfY_&h}>*3RO|4G+;
zj&HO0{#-(LW4XResru5?7Z>Z7{(NIF?SWbCFP`i5AKSh9ojxwT-m2^Oc=?^PEG_BN
z``kKul2^SwR(SF}(++Rx^qspaLgs6F+&|Br@A&ij@8W4m%Hh0Ht5@y(=UONx{p!c5
zEBRYy{qgJf>F_N5_HvWcob|T;#Xm~c%`TrkZ>Q<}yd4tE%nN>ny_=o!`Q+YnS0$fc
z`4xI)R@6LJ4X-G9_J8-PI=6o~-&W##*xcMaT-80sUFrz`b9K?5b-x`%e~JHRU}e6#
z`SE@J7wy@#lf5%{#1s}9C(rxO@M`tvbH2OVEY?4mFIKqkzTFZ3MVYlH_0P(`FmL|B
z+V=2`iPe_dKTqyIIgL4e!Jm~OlV0t3r^S2Y(V8fmq)%#-TY0$U9q0K!ji0+xRjh8Z
zMD>Y(5BEQq@I7n(2fz6Cvii~|^P{IUU;UmnT_V4xan|qa;a9dCn{}&Fg5!B`+uNSU
zpU;c_oc`PN$5s3E`!~5Cu-xi-%{y=5;z(z0Gd7j0H%yYH{X8;5YJF>2AKAJ+t&`g9
ztG)7qsilw;r}UIZq3ZkW5+~kC+dpCRzRbt3uEeJNXE6Sq-KKGDUc8g;TZw<}U(J7O
z{>k{TzJGsOZ2X~nraStce#s7R4s4jSam!SnTm^||W<Adp3QxS!{?oocJHGuE`=R}}
zypP-S*l63|+VY;aqB-o6?$Q&AZ@;|$-R)f#WYw>x@_fJT>%a2$59aL`w=q>eTF)PE
z&336y@#XX=>D~uR%2f<QYElxcraoWhmi_1H{+#-j`NIF${#}YQ`H}vy-FN4uKkkdO
z%`e2?zH{v2u9K=~HoL1yPnP*;b(Xv7q)MJ-WSei@;)lzOiq@-|uh-r8{GYFU&yUqp
zFE5(&GFNTs_to}C?f3jV?-_r;!1zM?g~_p@f8J+GZL;8PvaXvywRo1%oaup+BnqtN
zXH5^@72WGQ%^}X>+@0FX^B(W7KevBP(XG?`4ee$1)=8SxUjID)2L5Mg%6`RE%YFP?
zP|vRVw7cmxo8HYbetE#+<?DFgAIDzY-+Z%jcTBoMQH9KW|IhtZKaBrzK7S;(;m7jT
zKg#aRczkt>cf+YOmerZb6FFX<VBPz1PWX*^)>rC|uJA8g!tiH%VRK_o>FZy0r5|=q
ziNBW8pVxDJv&T~#`()Go9l80b*0Og4JI-CY$tqDIq26SCV*NGlxt^u`H;bdAXFN)6
z&0TlOyJ`RKsou{mS#r<EUHuuHYW2$OpHGUl;N`yNg~zXp{>ptA8Gn5K=Hs1Tc6|DD
zKcl=bmm$Tbu=IEmzv<lx*S}e|a`k(A+0U{$^PTtY2ho+~-SLe-uReM!^q(Q-;}JQD
zkKAj@9(WcfT~O2zPG;bmbmmOYV&+ZnZZ{Z4+6(Rzt+Z!a|Aj;M#N4$hQ)iso^rl!i
z?{<Uj$%E(W70ZwAy7Eo`;d)VH!OC<QyF&SUVUdh?=OjyCw|^_Q^{d`r{m`rRo1aY5
zd^}@|n$f||yAzo8V+68)$L;0MZ=b6*YuT(n{Ew<Eb_T5WTOzyW^6!~H${%+htbY{p
zk?R3(*16MRT1y_rJ!6e@t97|}!e90^lPiN{XU;kXh6(#x9+W=XyfwRNpUj8V9ygPh
zpJtvj=k4~rbA#vIF=Q6q&g5DulBrfCp3jhOx4*yYpTe2UQ^Hx*`>zN8_UBc3FzIII
z_sm~1>pPZ5-nzu5>S?(1aqlUw{|w4!>(>4|6g742`d;2SPgAz<+pw$aS!n&PuBV%~
z6opHkx3t}>{i!%C-a4pByZlH`3zPo|j>OL?&-edlShqjaJ~`Gem;3lN-gJTF>|85@
z0?C+}g3)zWJ;L*vFH5eU`N(A7vT94Gy=DEkQZD7$SX_F!D|Zh^(%xN7*SJjz=EdZ>
zg?PMs@K(VvN61ropYHwWTLy;CIZ`h^1o^B8lMyH=GW%6mYJPZSiN{xul9}bEv(J6I
zUUW=w>YQA`o#_=<T9Z7(Q{&nfO^mHQHvi%3?yHw{T(=aw&$#ugyl9e^Ayd%dO2%DN
zdp+`)KE|`Vt-bg@bji+jwKsq3{<~z){g36}`Kr?OM^3NqP~3C9v|{0ot=p?xScOiN
z@vQJ}{5OFkHB7d+?>|G}t$%mtZ?d`e=t0G&L!!#oX<e_(|Aa1N+pk)u`Xko#{mtKp
z%cNpfb+UJrb~^8xAnDsSZzuPho~aLH<fDH6JN&Rod8Xd_JCB!7;rd-KRwdUGUNtE*
z=2%5vc=ET+$K*c*_20}sbS=MlaeP*s(o8ooZEi_rzS?EGKPewyoznPq{nYjLx#w@y
ze_MD(&qn;WU54`ET^X^P?<~FIU9{pS!|8fMmlnY}-6cll{PE(B57u&@5%SL!nZ&@5
z#yVr-yCZ)qO+U<kEBx>^cYSYo_@j!)W>uk+oVm?sOsZV3WYOy;T)?~Y1iP|~OyN>V
z$NkmG_PLfXH~wDx;rBnz-;eDjc1%7Jr+s;?_}Rq5zms`xo#|GqE4akIt-DhFS+cUs
zr{Y<^(hvP-_~2>z^@PpUAFaF_W16l<`OIeX44f9d&yq!``s3Mp9VxxdYhGMi_+@T<
z;N>O;r^vXN+YAl|6cr|l2;O+yclEOQ+rr<W6?TuT&$IsV{wOx@rAp2u(^GeiraUZ~
z-dWIlJoeRrzYfavt1nKzJ6B-w@;w*-UaJxQJ6ZJy>xX5>58RWy@@9`?!CKX;SGIMl
z6y5PRE_%($Q`XAWvHK*~f^^dhS`s&w99YfVBq87^BjET>`{%;HE%pzV$ZubMyf@Fk
z?Y@AWM%J%sv(vw2EIkvp!CRv&_nD{ef{s6@3~Dwk;7Lf^clyW8-&ubuKC~aPEq{2t
zO~2%~go*b_oy9xEnzCn#85k;`EO^H~p~&yx+2YWaq&K~?ez7X&uhjR{i`!U#a6TYD
z&-x>`X2rq2V>jl{d-taK>7nNR_9pF%7U&elpQ~HGGRx}P^5V6xg-y@CeRC-$#_Rs4
zOOX+KdVg#dVoyAtwf%8^XPwQDg{%7oDt?FTxc2U%*OJZK!c5<7T)-`peOXZ?<?Gp^
zZnMSTA9u)n?D<_MI(@4}_SNExQiq(ZJ_mTOaAo}am@!19Kd`9gllb2`59U<yc^>uU
z>sOhXDP?l5_|rSfKNWv8E$7@jvsS<J4g0%?d~aW|iNBuwXI04FE9(~NGp&e!FMRnw
z!`i^Zi(VSp&$d55?aBJn$JeoDESvc7>V&kLGV3f$@3~n$komTvbkc>aiBmS;P8Tod
z`fIeXt@0botUW7p4wz2ez3W%Ui6_<jw64!hW<D`Nqx1!Xw8h&AjLdzDXHB~HQoW~P
zjYRK)<qYz#J+DYDOPB6`aYyU6(X`__2kImO3WIlCxoB?lVIA8eCNYIt&wo=-{y6@q
zzoCX#^6H+#N4CZ;T{>pJPwz-{aNoTBr|HN1BkO-?On<ZU!C$3!pS?eZ?%TfND9a~j
zzWE~8?Q%}c?BzZ-FG$-=ym*7e`K7sTQ=|GWb{ai(zZxdEZ|~!?@sXZO3}1H4((+pW
zw0&yyTk#0aV^=0F?pJuS%feQBi&c=vYGZz5ONpsH?R`(I&Erp8f08!&KLe}f-+BL}
zD&p=RoW<I<|B>fgrTePyC+DYa7Y~}Od*qCss!-mvv`T5ttE*4$@%_)h+Wpb>kj01g
zMx9)<2BGNRFPAAK|Cl7PC??(h_~pG-C7Wzg!`~g8vB%fsZSi+I?X>3a7qqnWV;3mM
z{<U1OaQ76Cw<2jZ^D0#SGbqQO74P2vV8writzr8)ea*uzZHfE6<*l8e`VQWb>lWvo
z3UBvE{oH&se(UqMoR769t9RLyuZz);*K)7a-BrZq=pD=?SMj7S^hNMP9`9>mE;cn*
z+Vihn+xTd%wp-`>8u!xd<wv)d{hqnFIpY|I>dmUE>)o&ZGi)<|b9#}=#?y~=t-fW{
zg?Ia;?Vngs*cP2qll)=*lcx8_#kYsI2kz{%KHc-~^STM%nwIB$`XbL+@y~u8C0;LD
zlUT}r^IAxk?hdX66O0cktM99RwpXe~{LdxBil3%S>OTL<{;2*(B>lm;*-E!wNTqFE
zz543}N6|T%eQ&?b6!Trap2L4@1%J2wgQd5QF!XXeTq@b3aWwtP`dPvMzEA7s$g^gD
zzAXFa(_J6gcCQf1*IPQ-Cb{syV;PMHVG0gx1@>CsG(JodGrRPt;^gLU)ko%k2)f^K
z{iB7y=<VAZSz0cBS?a@lyY|Emg~s~@?~m4Oe{}wK_apw!?%w3sYhPW0YPQaL`=IBS
zSf3<Q`VIGA;RhFN=@RX$+qu$gj*!*$TAQ|>=q-WWN6x36FWCR%=_AW`Pxo!yy1DC7
z@@JomKPPQa*>KuW@}TYSU*V=JY9fEMuRNr*<LbM>$huUw8@3y_&%3vOY2^%tlb02w
zDj7Dtvl0I1TQ%Wua4cVB_Tsdw&(>Dg&)*i~UDSOdGImLjd;M(t=eJfLuhmIUVNW<H
zam<K6@UON7UxAgpv)2uI^~;jS^WzWgN?tf;(Y&7D+rL@a)!h1fnn7t|ZsNK64$c{c
zZ|CiO{UzRU@3!qp-hcM+eEu|VPWtUz`z`8|z0Vpxxb`J&a_Wr=y>Fj5JDC*|s%q98
zR<^WUe_=(Q$&5#dwr3o8YL*`O_I3Ta%}0O#RK9ue_%uyr@uS}Zna(qB>DIJh_&8Pa
zPf@+puk-&n>uo;&yZWp2oH<KN)4kTG4)*J`AM1<UIan?+-Mcj7ep!IPQ9lOu+x_SE
zE&b2XR9<oUP(0WEjEFtuAN798iaT!FGA;AHUeShQ6E~El)yOW;_*EE}>;8NBowxl*
z&L6k$*yONZ+$K6%r7_O7Iy}Lvsp3i=zf*y8a=yj!sEgaK?Yq0wJ^7i={nVLDwzDkg
z4f9KJ4g73u&9kkDja_b^=*Q$^x7a)Cw0}%KDkn8FPbYtCuhXkrxocV<&ihsQD0iI^
zv$EzbH@8ZLYiaF|jgu>6=PW3mcK6(!uL%|pKF_I}`sK?8y^uxMzS%@gjydx+w@y~V
zZMv0aO2((-3Oor3J$y6lmy1qc{`yhTg;)*#JsP$}hI8ioRh9nH`fz2f>F$j6Uw$Tg
zet2?Jp1bw@-E&1ueV+D)DoHy|uYA<@xcY(h6HyzPUv)KMS8i`z(j%k0@#Tfr#z#6P
z+<D8vKW(<-f#3W7q$|%lwRitzrPd|W!qQ{~IaKC5UP!*ae`%4}uDM+fYExDCm1dm$
zSvavr=1F>gvR~I{|4pHLGeS=kpMIBMRlL2S>f@Ky->W%&w`IJXC$aCN=<E1bfj_NE
z(wQeLJ;D4mhG$;YyaT_ke|7!O!1n#@Z=pXtKjyCZcj-TatesJX^Wiv+48O*Q_xWE{
zZ4nDEJ6UK{yXjx*j+>onpC0vH6uhxU@y=(xtN#+-l-h<L5p#+aVtVj##<8aX%Por*
zb8mV4)I#!j)cp_pW*4e#ayR`I<DDh<>d`&PYq1ko>b%#|)M=hL?Ev#a)049v)@|f-
z*Or^c_{npJ)4%jxbr<g`Z~oYRtiJP}>g9LIdwiph-ukzY_XzJk%WJh+-y)v6%NU*L
zTeJ3r)`33WnseJXMBcJFQt4(tw~g_nOv(G#v9VvzToZImRlAhhJ7w9!X$o!9wFlVu
zR`z%5OP;7;e|NVovG2j-W%g@xrysf);GU=Wx?1Muj^DYDW6!)v;S13`AI8!+r{sNH
z;-jClc(cTVFA4U@J?*Rf^?mK_wbjAt+1@EC&l7bH7rZh2@$v23n7@~@4DQ{E&vHIn
zqUzKmrv6^fLAJO0%gP<EDuX6v2e00B<xP$5qN9mID$^&q@9a1!Z@>OO!}_(wVp2Ze
z%U!o>+U(@u;j27m-0y$j>hsGtuYS!fJ$zdEt)S*thR@r-EQ-vN@;5stk*g%Hp|aVk
z`Lg9P-(2zB?I|9+P0FO=Zpvq${Jx#fUm;!ci@e|0o?DB>R1+o6OG?`JoBW;~z5Q0o
zt`4o|jGnwrwbqkgcrL4)cDU_a^(Re%`u`XIdHrWd{?Bl;{h#par9bw6G)$Uz$a3b|
zH~LdH#d%*pGiS4=K%2^^x-w?<JjZ{t?S$*D+v)%9uVeag`Eh$&DL?;dlQ3r2Jr~y{
zM9d4>?r@QTnf22hk3(i|<qR7W3KrJu>=V!S=W7?({V7jWcGlDFMyEM#n1UJ2-X3Re
zoYOctF8br?=pXMN>$i7**#9u(+h^CBJh`&SNs2NaJ0_(~+%{E}k7+x@q{DN<p9>%L
z7VYd=m0N${uh%>-i5h#A(Ekj<kJk6pe+ZZ_{3q$k9`AJ(&4;&@{c78)mmCqZb&i&3
zQs^gHyM&1fAwL_`pDAxmtUIx>;(f?Rz23ry-rQ@wJhn<#EX+>neUg3PUrE`;Wj}7Y
z&uG}0C%&2Mv%TQIWA<CvTTSABc<61Zc$eFfuWh>ajId}(K&9`iBM+WvwW%*Nj$bPO
z!Mp#K{kPD+Q}(GuSDZc)CUtM?BU!h5+Rlk0JeO|WYpYqiroeE=)Myn;&fS|@CD-ri
zjS~6rX_{=Y-HD$%^4m%;tzW*b{g-6@LH&QSFYKBAGo<Y`d;Ht)$o-f@-{&cQiu5~q
zE_PqSJ16Bl$B7pTPn!PR|DS<1{>R1N#y|2O#kbYzWk<c3b^OS#V6lDMBI9oIZfVb-
z^J<O2D#LT%B;K*H7X4?C2i=$`pAo-#dvi&3KL7r<{|paJGIC3u3(FaIZr-fBNg};s
zNzTk04NvB*zjIJs`K5l-H2F>8$LHTTXWu%lDtzkWz1rs{g<SUO`E(~r=(~|J(*vE2
zO({O2caK?xA518?l>OQ$_wMFbANTYYmD)>f(eMAyu-Uy^ch>I%c50X2N30AuX)$Ha
z=T8l1j9+*C`u?qS1NU#cm$&j}m&^WVm{?u4uV|a&eap%FJQU0=|5&V_W2abm;y=R&
zfBEiP)294W*mp5^t8QIp?w1o=yQ3@CEuW{<<nhRpb<10&>AnYwxcMyCFSAd5e{=U?
z`Az>BT523WJU)0`vv^tTtNL498~5DbHFcrK+_F<=E;cC#i5SXE?kkEbcx<JoT|8U6
zd3o5I_X(GtRzB`CIvW1|N&3{6&G+YD+Md5|(WXmBqMN2A?aZ5Ttaji0OY5?Wm$q<h
zd$YQ*=$?;izjTL6y88C#F>d=;xF>2wG+mNth<RXU@%zpO)y^;Sy)`v2j%obr&puOp
z>)hgPMmH_&4{ld@-gsTsKd+walfIDOp^HnVupZ!O+}2}wSjbUXg|Bcz;bqf1uQV=2
z?~eC)IHR>su_^Yqpj7X@<(4n6JlgX-q(X0s!^+;5pHn?_cQ^5Iu&dvZk-HM)_gyW>
zW_SF)zDP;gyJ=h@Q&}7876@+F-od};#(A0R+@;B8$&)f}p0~K=5PDp-E#kT5i33l{
zzkZ1qyc4sq+|x|&($bRw9>I;1oNMnrzN|j^dP~~Wce1JlXN>M_`h4*DGcL}ruMFeP
zio7lE-RrYloMSg*X%IWto+*~cJXjcN8|)4g$DG?;T*>8HwBU)=<7)jghZ~s0SnImy
z9!S5nD|^Mlond`f9d*jnGwKRI%kIdN_;T>^^;ysVxG(FzZ5o;4)?-i-)N^~sE6)Ij
zUw`(^?Y!&uOSsmr+s9a%lcQy^Qu7AA$2(*`O#E}h*08VkW7JCC!#7WV`%rM>M4p9h
z$lv=h%*U_qEt*w&bn<bTtV_x(IQ|tL%2V#~I3oN*hHtSfdob^jjmzh?{7lJXnRJJF
za$D??Nk(jpf3i6)ZoY8zbnJ;e{>j<Wj^Es-mz+r!Y<#xFVS<~$TP_LxGbhg6JgBzk
z`%$SBo)&|jr&pdldH3a<=l0L-re42)p7-dPB<@aiuKh-CYtFpfVlMb_+a!L+>z2=L
zBCbqSX<d*On({zQGJ%i(?zyKHk9nKp?g`#vmkoa}f6D!ji16Y5hyNLFtv`|_xb5!R
zwHI_ac%L~e*z|;_DWs?0ZztQH=5M7RzaBr7-#bt2M@wv?uX6DAX<^Fm4xLk;@lSBK
z)NlTOTwC)J{w{m_F#h3%9J`zZvy>f{49Sg`Kde9N9T63#Ip<wifb9(d?e8|rS-;NN
zWSI56cfa%JoYMT%?kU&Z>X)m(Nq&4gSNRcJ@2aC^3R`y1VyonOr(~|ZW4*F<cS7Us
zm+@D>br#K<HfIytJqd%m2OfN9Dg4m|x)(Z;zbo@me`6f?$8GbLxlQ)noUePE=hBRe
z+cv5+Zt1_=ANB9{KlX|y+v<a1yY>j5RCqW~bK<0mo(2!0&^+hFMjlSS9SI($f8I~M
zI8RzQsArd1|HU0$OAIBlN*A2}%>H-n9_`A9@wcjv%ZX1t<e$C%Rl#P<u-n}`XR9<h
zT1Uv&{JK6h@^C)a-$}Qn8P8RmJYW2E{cZan8rNI*SSS82tMQe}-DBjm>+9kCjDyxs
zLMqv!Ee{*U{4RX^@rl7fITk|=%NL^VPaCv<KUe=160mss#l>GeEj5<>eX@1aez$s|
zkL(wBEmJpI+flJp;*{^wQ}=pbY<E8{l{dArR%?maC98RLAxVZkUztVkIzHT+`<Nlp
zPh67ybWXDD4$-e`H)=K6Br{9AuvZK_+{9ToW1UX?rNx5gzt>2`ZO;GCkn1)hezBj_
ztnVLvf4S;koqx9f?WfDfKYrbE`-tJm%w>`88+t_VtXEgQUso^nqw&O@%JrM<^LIb2
z{~ht;l<$!>=7A2)7n8QN<o@ByejHPE{i)@&Vw>8?WG!vW?P}A#chBFM^3%pZBCEnG
zcPq=(d%w6mUSFCwiDiPJbbH~ACQHfJXWe!@37Wg_Pxx%Bt}|aI{#CA#{PAi3w&QP#
zAFgky%G=6gFJi;+ZPC3$K2G1a-SSy!JLkfpNhx7{DqWBB&#dFlJt+E1|HJujeLs9Z
z?)Lc@-c}>LO7+;LP3-$FscMV<UGi=B!W}{f{2s0N9dcs#ggJ>F>mR*#_$apfVQv_2
z@!{!{Z`{3gLbWTqQchCvxSM<L)T`~QCKOJbm%Z~x?#IQC{14@Ke2W*Y5np*af9*}b
z>)ZwZ8TRU2O7T+RpKqAT<I>oFe$M3GEOoInKk#UMwhG$zw$gn6iNEP;ADz~691=~e
zjx@ikyRUxc--LgM=1cuk{iFNgea|25MG|jooIlJy`tlLCMBd|MsoPoe_bIkHO!Rqa
z_B1R`qNi`md+tA)oBlI2ovAx_>s{|}?<_Mb^CRauUQ5lJ``|x=>}hFNmO|S*m(^O=
zt(rdZOR@6QtvgswF54I;z4)`}e%1PP{~wx9`_?{w8+Q6z|79JWlJf#LPs(0fz2GI6
zsc@mR@@>vJXWpys`1|0~m72bXQ)(Z_?~C7@fB1b{mH3;J)$&cIJN`H?s#q7jHu<;P
z4GEWJzv3t9Fg=lI&PmM?a!%2A{8X`KyI{lm^QLKUE=R|&{5oTu`oU)sejZ!CZk_jS
z@A=2|kFFoA@37yz|HyiQ8pR(=mzzyq|0C^Nwye|HCtb<BXC&^*&t<j=TE{hYl9|S<
zgHs+ns5G0(bx%?%e&*->ww15r?tXlHq{_eZpL)gaBUL<t(J!Zqf7ebF(cWgVrO#jK
zZU7&Hz_A&}MIZbM_Q<<_nsxSu<5B;1pPn<7OK|0WrTwezXKg&Cw>I7LWqJO@FYRy6
zKhpo<xX<cGeAJYUUC{^AekASmK9XTjc*A(*w*#iX)IS<NpZ2Ue;`pEHjgg!xsgAbR
z^PeBB^Jm|8@m=ColkG>3PF{Oxn&ja_hg>a=+Z%QL_5IPj!tqh}laFTYR^7RN5_uOx
z5{zQp<a_s4s>nZ&3#)D~TrIh7S!A55pLovaT(hrl(z@OzCvB|#yCCJs=Pi>@tiP6j
zGe0zA?X$~zD!0=sHM@BX3=8G><LeAx$4|Ety0~tuyV$mm{krEO_SMDIKCqIJ`n~x<
z*tQbyhYxH0jPjQDcxJs?&KA*`>Qwbyrt5?D)$E9ORd=>`+gqDT$IIRGuYRz?`(8|B
zY^AXFu6LX)Yq>Va@NDpDY@EMx{la}BnY-RiTz7g^R(ZMMPeYZ<b#I@@WqBNPRMhg4
z*fzn<;h);6u1kLx|FK+MVg1-_d+EZv?jo~#k4SBa>^HP=t+{c{$wP<btpTII%oi1@
z$9ud#mP$WR@A>1MwKjLvX{L;o8SAHc?>_jHU8ZrmkcTs$m%=#?h5EP;?}e|eo_bue
zr(L^n|KzP-V`smqSNmwsf9c=lY3xjwV@}$=Jazin^wQ7vMmFBxva5e{>)Q5QE4$#W
z!gqLjSM}-Xz5f{=1is0szBYBj-6V+z8Z2$kC-6)BD?R;V)yLo?mm_ZPFuc*RM!6;>
zXS1WYOz~&7b?-eUajsdrHuuW3TWk!kBEG%7-uUbKr*-A#Z&lUT?X~HDS;Jy`WadQM
zxmORlX7x@KmJDU%VD0MZVLqKJQ}SrP%l?!O`G6md`PtfUGuGt!yz?{s&gLm`^5^m8
z8`rm&+?T9~fB0_E<%;$G=EX6`SiCOkbPH<>#jKwxd6I=yVcz`tH{v&*KO)caWAfwH
z?cXGrICAvTclJfxvuT}lJ45H_l$Dl0i;4=ruAg}Bsb%8aYaQQ<j%J;@>wmYOgJt8T
zBfZ5c7nH>{rT?ttckbj!(PIm-x0YY<nEmRP+1b|WlPYrKG;UjbR?#asGQnJU@^Q%n
zc6+Y=XK0LaZ#6y7@A`PZXx8;vHHAkK+)9sZiqp2~a#^)*;glR}vpnlI2j=-<AMD%y
zm{u?Lee_=Rp7dOIUB$KsM$W>2A9-nh&Re3=Kc%vO=jr{vdh<R_?fJeo*7u%UKGHX{
zZ?luUoL140{Wj~xgf%Pp|9CHu*H?KflRjt8gQOiCx~^N)syoFDFXSC+e%<r=_@!O;
zo#o%!11@bjYrBj)Q}(gdDYxQM9i7%DEu~4iKSEB#J()b~`Gc-&28T+lw>>p$usk0;
z&*Sy`AK@X|FAA<ME?+3K-N50WkM1PHX#sw=^(WS!+kcxo>_c1sqqmB0Qo^qH?lhk$
zs=ev5O0;pp1c~i4MAEIxQ}~R3$(L*P*?258Y&<TLKBsTlezW~qV!i*2wHsTlVrN?_
zq%fp0&-eLqwCusFdtsAAG;hw=nJ@V&V0Cxq!cL>;IfBi{Yd*%@Tl{GE>dqrZcbv^@
z^c7^jJm`-Pj%!{S;jC!RHIb*dX~E=QGHE;h`rW!Ja+oKuc}ri2T-6sDdB5x%i%;Ea
zJ@@?0{69jw|8d^_9bb2Gp31f#3zr{X`N#T4*%6yxe^#o_xz*`>q^hQfHNB(p_vy_o
z+>M+Qc4qvW^keD+e}O-?KPIoM5I=fd?0eO`nPnei&gYunN}lH2{#mR{Wk+ekO`E2I
z;|kZGmH!dmfBe_C<sY}2%ooevwfB#(<EDGpeh2Q^y|w=|OUL7;XO+qwjNijlLKzqv
z7><L^W0Cp0CvP9)zia#Sek3le@GRx-c3gg^cG;^xw{LHXjX10{)nm~#KMB#p39?I?
zV~S5}hpl+bUjALlP;{}x@8h?>^K5##TjuRVKYr#3c5`3P=zGngH20Lp%ah9c<+lF$
zRk8UWSNw0kY{C8CEH9c&E$3Kt-f!BokgsR98;jb<Ys+2zJiq%tLzez6>7x@QY+^qO
zhku&W@bPG=+`N{*I+yM|zA;DMIrhtsXrV8YZ7S2I1aGom!J8ei>2h-Q*|>@|2{C`Z
z7aiwdC{a0ait+p3?C0_#bvNTTJ#T$`k2m}HFOy47M<jHfn_r$DXV$ScEKGOa;aUF@
zO8Z4B)FRKVT>VP$wYV$8ggdu=%Z&v*kIyf-_k4oaV+oru+y4y5Bp!z~du^|uBD>~{
zfKcU0#|wN7bz5IO+~M_~L8NE-4DUBb{&m^7|7T#;{lUJ>vj5Pm`VJdMjgx<mHr;e%
zvwFX8lJND5p5NB9d@TPXnt!w`asNZ!54uw#{qLS$l_l(P_~xQ*jmhV%E04d9ZwszT
z_$b}xv8YA6{=7qqtt}@*t%K;<`#=6O9KAImW!IjB9*!Fw9R_avu3!FS-&lNTN5;GL
zpN%V4z0c*p_+GyLpm%+CZq<#W%U+vV@mNZ?O<jIe*t{lxclNSB9k!OtO8ZPdE`KZk
zarg0{v-aIJnQP)JkI#6zZ*KDOEdiTc>{-^&donFEx@1lK-A?tdOIV&~KDfT#Tl?@~
zkAo81&DSi+l0K3AOlj%C6REw<>DLRT_Z!b@%Jq9!dh1ODe|**wkJrBMcYL+EzM5Bb
zjZEkJmB#+oGR<!%`lip^_gna@P2eO4_N_K<PYVAtTwm>{l&i$hG*8$x!OiPe@~1y9
z!)`sC(HhtOGPGi$RZBD<gNW5UHmlOruT!n`Vv_f76kRPg<<pTKk*4E)Red*p{SNWl
z<>t5QMe%L(o<7@+{(=+d)QMhpUwo>*<UfP9xkJSRzQ?mJw;w7OH|#75e|pFGMdkC$
zA6NW(V%2@i?zrl=B!k!eIrU#(x^A}Pv*+6%^(EtvvFgg30-w1x*p(%|K9}3?94+`m
zudKM^ip<2%#n(5y$)5YnFnXhg=bK9L$=kKB^!q)za@c=YQegNp&hyN-XMNYsZ{Hrg
zPPt|7ab-*O`HBDPw%&~TqrZP=DCd;aLlZ*#9@Mf~sQ2A?{`t_lT%U`HPp|x3#mo2O
zn98S49pm#X&tL!i9HiG+sns-5&U*fZ+U(cW{>{^8-@MT@+wLXHw#V-$US{u`x~NXB
zqS*6_(xvzB*Dl;=nbNw<bz+<Ge9d!@4?Jf6876dg*W#!Ou1(jDhyGUkp?B3rarNty
z65jtAwo8Z2Sbz4(62lXM)d{<W3h&EJ{c8Gc@(SnFXQz~t3b@|be!RMqS=Kl8kI9GJ
z^G$m!Rk!|Kdbj`9I=Ry56>1G0TuSZz=Unc~OWd0oRAjtE>PxKC$z|Kad+VO7F!%I)
zJ^u62K6m-fZ&T;2s}?bMt8Lfbe=p<K79TSc=dw!1ja`3B|1&hXI{%i6_~Uft%lrO1
z;g9nDe}dOU#J-GA{jBrm3wNyDkJ*)>DW7kB^PZV(IVqSU;`)=0HY4M@xVv{*wpZLO
zc-&L<SNqNSA8Kzt-uQQsOXc_d^i0P83`MRM>bB>XR{mK2ds|<RQQf6$_5%Mj|1fUZ
z{$uf@dfp#K=Q2vp8pmBN`5mH{a+`JT*Q0x!D+6L%3Ri8Gi)cEMGUw-={Y=Vj?|6+q
z{gc*SJ$JR}p6h~ZHW|yV-pVK2J&z&u$p`JfN_#B-Gq5!LXK1QEyfW_fto4Vb^9Ao_
zeK*c3=UsRAURK8ESo`_P?&-zK2WDo<HZ94%^6}QbXFsBUtJg^VNL}E%_>b6+!sQit
z((0k@zwO<&Y<qpOw4~RIvBC3Q-IT@0_yhu%&CYoD@4)gkOTOEm@qZZqN4Wmm<{yj8
zHvTdGFuilDy236A6YGz{xytYE+;L@H`Fw)S9l4zcOn+&9xc`rX|33q(!pEhPPCxSJ
zz5T*h@%1BKXa7xU=jxJjRj<S|eDa?@=YimP`4`7?KdgSF^6_~7w~(f*<;=2IFWfTz
zUbZTwRb~=j@e6Iye}deSlOBhC<eQ(_CVjnN;?x4i5PNN&=GRTu;j(r5N6y|=$@f=1
zy!NYor+$0=hwT3hN4Xd0{%7D;eiYW6v^;;NXzSL0OVvVpPi$Vf(V_4_dUu|m*Mo$A
zeKqF)8JctcGbGMuePx$_q+a;P`lFMaR$aVZxy>phuaak@XKv1QFXP@ddB)rCum5s-
z*$?lBI|6y`DeT`<T5h?ib(g_`JApA1Y>j_iU-YB;U>)z)&7ZcMHGB8t;f|e=;+8Kz
z&FwO(p68zRS?eR4UVZjE>$-(bRvQ1<AE_Ve|DlrpN4WW6%*s`n`#Hbt%}bq_*5ohn
z$~@}zQ7gtR$7c1c+c@_??bRoJY}wE5|Ij^tl%JvQ{QeLAwZRY68`tK1$xVK=_KH;O
z-g)!Wc~|Y5n`vV%wR>utVrz!eZ6-cvFGl4R{}yiH=W|Y!|E1TMxO^U)N6>NRd9yn$
zpR3RMk^YaX^*6_l?f<xxe;Y;Do&P8EQLpzQ_if#@+u`kjdoHW)=g@sTK|<hoVZMr7
zwb7cs*2exKBZK6aA3ix#Q?2@*ZCdDeQZ@O{4jX?3@o?^MrMo7%-F_ixJh@G#`TebZ
z^&jQtR|=XJ9y|SXU#y?U&B<+HG4rfS{_Xtx=<l-q4_fbk2>#D-^ReHaYkxvNtb2U4
z$|rEo`ISG+p4pa3T=dk5vzW&Hrf)~I+hdt;@*Poc67_thefsIMakWO!8b<A7*IE87
z^;cK_y#DH^IWby#8OBdPUQyZlqSE@6@>`zG=PtUj+3aY^`MvqLx`f@5zU52P?G~@}
zTyeB;`TR}CIkY5arX)nK7Q9^er?5{u>(jOB&Zu&^q?E)q<JR|0_C}s-R`1RYv);e?
zw&LU`>KqN}HeY2v{|LXVvFy!xu7E<<9Z8pNio6n^<aOtXIET61<Gkv!)#g&i+H?P{
zoqEUoF2lrwUlY%-Eu7@MV)jz4H4FFORA7AX`7QFvPLKOq66+$`j>iYFs*7$t={tAs
z-fQ!Va}C@D^NMb0`MJlH^I2Wqb0hreXNKcBCCh!w7r&ep`CG=z^A=-(pLwau*B91Z
zPx`i3wWkzr3_M`X?|*8M!IZ5&t8LH!zx2;|kKk{&AD16Io0-43qT97Oc*@SHDLdy^
zrplMd?ryw2kJIKm`>e%}_TLtM6yNcsx>ww1%jGX2b5H*ET~buL`n2xcUXw`%$JqD;
z(&w>D{7m=Vc+JLnrTg-i7rm>C6*wj?(0jtzz#wVC{DEoj`U7&dAO15O+)=;%%WD7a
zKlYhVQu&?ZsXBF%;P$E`9+`O|%}w`r`+QL;KKggQlkPbK-+4=nx!&3I<+}Xs{ySky
zf1et!+2=>!)|k$Jt8J1U%{hsab&BOrwcS&W@LiWN(w@$>K<G$|T)W-&-&X(5$r)Vv
z`k#Tvu5oF_I%}itMbWp{&(9Y=QGQY)Q}+AmgP%o|H56pRAN^-Ie82CX-ADT#zt+e1
zrC&wKO<a42Q~zDgDP>Mkvt#%54s>uZyg9Vu=eFmwew{mgNPa_oYmO<e_t84tJs*S5
zIBn9s@~padjdy-@(d_9qPy2J8l>hwW7I`{!SMTdf8ozS%k|mF7W#?^5e=E28KLe`(
z=zNBZ_cy<Ne=v3Fxdr<L-v-^feR#TffGbO$!aUmpCoZwvd*R_`eP_;-lt=rQ*#A&F
z|K|Jeh(CHiT9^EZx?;ku|7P|VXO&`az87D9?>LZgsLy4=({p}R%Q$T6jOq_+KKeVy
z##8IZHGlS~SK?BgkqK$rCvJ7iwViP&{j*@riU5|9lUjQ=ztfH1Ghg<f;lHc<8ESkV
z?(eFT-WT~td4)TVxtQ=0qoesn&y8GU6*^C3Y)GEiXWo-M>*LbC@CqBPt?&0e->oHc
zGGykb^tT^Bv`74%S)VcghsPh=hqq(P4~LhF|2lhT@~H`@m*0#v-LtGZVxIZu)UDY`
zHd{5EiX;S9Rn)i6ikrLOPt=b_*@+YHAMstD9lT|dakKHQzy05<`$V}S*If<ldGb|l
zU;E#6|CF-lZ)ZPvI$!ea^79Wo{)l`pyS2XKqwLk$H}30CE##SGz%8^#cZcVW%3@ZP
zM6dbEm-cV|dN%3%vHd*jxBLyem1}kC-kr$1t_5=5n$K%{E>1g;@${C&JpRDr#v1-N
zcbv^CIQ!|WiRWXDyu5X5*XCTQ{NORk?Wt!%<qQ4*KepP}-5Yjq{CM@$D>H2^lS?M`
z=`*=3CK-NSwazYquP*n9OkvFWV{`eB@7mtBJ!5-$l}Y)gqXIT27q@)U(ny$>C>L#@
zbMa|t(UAu!^@8)aPCxG78)y1=(N^2!z-y%}J3qWzT$q`x5*{wNML$_*LS;vggYtx_
zNm2&OS@@&wxBbxDmucxFv~~C7Ssz7hbcEBtJzSq@Zl<@ZWHFmf)4Bx@YTXQv@3(x?
z_b+#aOK!TLo}lE6{2Z+b;>v|KjPv;1!kdrQE7kMtf3PNgd-!3IjT^d;hg)53ovFCy
z>kZwn8czdH@O@fzM@FvrdGnm&qqWHo*Z<IWe{0XY>c{TGaS~SrQ&?~6zRQ)p&^*EG
zv>9L7gu@#S2G8mDTi-f!iR`7IxaGEXhKEj8Uw421rSXYt*Ev<zopMe~CLSv=3jJMV
zk*c(FuiMqP-#jaKylI)#+q6ljh*|i&O!E$g;_H&fpZ;fP{m<}V$9|Tt(Hil`@AG}N
zwfi6zS-)w0uAb5@&RgMc?bC{G9Iy<$@{6hV{Neo{LjN<|us%91w|eEB*S}=;H1j^2
zc3sEF&0*5Xr#*c)&udv6tt{P<Y_M?2OIyBKmG8vzJ>>&Wm$D>zvgkb7Kb7N5b<^Xg
zIr38-lrx#P*KKJ!SKS$QV&=qjm4z*f4Pw%HVz0B?Ycgx!F3<Y0J@h|A)8e|rhM8-N
zm&d%m?8$ri_L{<%eJLpp9y{D79;uFgH?=HM+-5yX->TpLxD<aYR3sfc9DY6D^sVYv
z3EsO~j5CFwd2H@Im83HxsWRw6Pw$NrE2sH(H$9tbrkS>*?C;I_E;lp6XK5xKIVAG_
z_r#6L_9dIl?xZi8S8c#P>)O^y+19ncXHIx4ZxY1DzVc_w&8L2qK8)x1Eq+Fw23f}(
zf9E)loc?6LiJQ#sWr~MgoW!Ve%(bCOrm)TOoaLJ8_dhh%-x#JQTo?PNw(p8O!;A$N
z^I6(u8fPZ=vTr}zc&-1<8RuKGe|JtxcdkpRo$xIn?#@h=O2>{|*NGcq<XTQ|UHrU&
zbw<sB$Lor(9)H-eUNQ5?stpg=bXFzZaq~~!EqP3&f&XcIr@eUngDp}zRcs5F{$c*G
z_3g67Mf-gBEnIz`TZhZzuKLa7&)kNA4ZRA1bLKo2{h9t~{q6Q|3qIx_VfoQp{%H4U
z?-y6YOg87M-DT=w+V;FAdSm~bl}QXIAMKm3{g5X#^u4y6pSJyC@ny@e-2V_>Yo#53
zEAQ01YpJs&w`fNki2s@P!Pm;8g|A&jrtEB8Qs%)+?<6C5*yH@Klzv++b#MRLAKRmM
zf7I{PTe^4e-g(}g&!%p-nRM#t-IHI_EG?Knto7%OJZgJ$)@wVT^qLl?vPDf16ZU*y
z%l^fzc<SHUmR8B^l)CEK$s$j+=AM6*{*UwOZ>P8#%fIus=xY03etbnwcg<5*<9E_g
zSLcb|?s+2Ed%CY$>TlDB`ah!a-{yVbKfE{m;k7B#Hpbp@<z2gPS>(M(w=_0zwH7$@
z>&&<yv{q8O+1&A`>Vy27$zeZOf7|`h+4#|T>$aWiGp<V=TP%3kL^vjPrr4bc6`vND
z1ivVbeRiE$@0q*J=E*13SDOCF7fwCZmK-&^cfRqT()eb(Zk4m?!JM3$vGtQxKk6-C
zSFt`~$4CCo_32kkxwjkn78WaeoAlkUoO|QxjPJ=;uGyGPJa)9*v{q#PvFX{GkJs<5
zEX>U4n`ym!W2o7K;<NtQOJ3c2x0r9@;wL6umpl%cO>N2SJ*pHuy?6&}{A!t2g`LT&
z<sq4?{xc+<nze9;m{Ihm6Pu=Kg--bp(mdy{cC+Q-M_LcHf)1UZwAj}zZ0~&c<n5YA
z9=>?=^6F9Nd7R50SI3swPhEfOQlR=<&BsgnD)Yo-%YHGc>@K&z`P5*VwVTzk!oC~p
z=Wf2WztGOM?qEHyopQzGz>muh|7Q@2eYvY`p~>~)!z+&Dt({kS<HS?7pvek)-m;H;
zQobEnf4*O|?r{AU^LD+Nx+X1G7liVtUw)T3lixx)drMGCsr~MkKd#?>D)GXd+pjnB
z_eD?hyGwUIde$3q<jP9VDBW$-Q|{eYexl^?<ojx~&P>x=u9b>yY8K_8_d=@Po;ZJ5
zX|MXD^9TMjbkAq{`sKs%WBj~X^Q87qvNzTJ>TUVvNyc~4drc{hO6iM_Me?UvuGc!j
zt~~48&P9(G+uSz%^H+n}CWzfu)A0$HkB^g)#rl<Y{B<|&x7Z&5-FkDM*G{gY$=g;u
z>a=gpiA`EQZuhN(?i^L)SM`&4uxXNUyj}|5SJhSTcQ{n#iI!}b@=>@~s_T2kuF|Le
z_nJ4}j6cUVAyE41t%;3q_WxUT=(3*JwNIAwE!ZbnJ=$XWc-uXR<E%3_KEB*gFLf;N
zQ`6R8_tegdy*yf@DW@hit7Pu4`+xeQuO*4yT7FA+hUu20v5}QA6U-Us$Z@RS{g3Np
z`lIzsFRstpQt8d1eko-~_^pjw7r);YDe|!B!pR9odLDd?=Y5%*xjN&6qoVbc#14i8
zxf#sNuiWFlOuUg5w&qt((T=7s>a$iWuPN&Iy#0(r*|u|KPh`@&)|}V=bw*iYw@J-6
zeuG|3FX5NJ<O5#)XV}6w{b6px?P!n9XEP1BwylcS{F69aAy56%zAb;}*aUv8{x<DL
zXZFMV=37FJ<;#@gPOpsFEwZi2;^x(7|3vSd3T0HiGlxaNTK!piV+||Y-bcUr`HzJ$
z))vaB<#`>EJv3dRlzU#o*JIhguK(?{VSezRp|zf`B%kkx(=F|Yyg-%Rh5bg49)6aY
zbmsB2;sY!nRxzz(I9feN_2FNh(2~_T{qkKF&nmL?Z{%J4vD@ap;6Ak)M}Ns0msw%6
zqMeh!1q-cO5;#xSr8;s^?YWdwbze76xN%_plzkQzhYw7PGunCKkJ-et`47D_RMYfs
zOb_yuOzud2FVQnY$E|1`AA{wu_uo$aU9eTY<)6{jf80Ox&R#xx;mohvI~UoQZnkl)
z$#W3)ySQmX;U||h94FVG>@9kB+<#;Lp>13}rxj*>dg*CbGvf)9o0nd}%qI`_TmSqe
zFYu#pu8vO8A1$wIw^Q@lPkzwndz6(Fm)@VdZOi_7pXzl*|N51kRM|1l;_hkVxoeJF
zs>n>Udot&5_O%-Gyvdc*h57F;V5~~EIMi2f_33qXiNog=w|9t2o@XeY^Ka_wIO$H4
zzZTr@r=JckG<d<1eZla%WKwnb=X++03)A05WSf^%svqMGxcg(0tcju0p<5c33SSr+
z=O^|rtquRr!1AQ$&Y%2!+k!vK%2kH+@160i`KjC)&hzX`YlK(5Dwo=}*lcO>_vb}N
zs?rzyVHf3XTUfvJp6klYNqdA3mAk9toOtD4nyS$Jj<-^x!)i*Z*YA1z<m%3O#rD73
z|A6<{YW-&2(zjt3a~JJ**%|SCn_#7(N)C%xN=(PhhMeZ<>N+<Ltm{9zU%ZavkKxAb
z^_}xfE^c{mG1L5Re6-V&0*+pZw&dOH7GD_3*FRhw|6}Jz<D*qBRqUOmZ@vDVQeZk*
zTwQGAz&E4MGm`ysZo#r|Ne{1RiM|LF<+ppqTC-PA;MuicThC|vPxZh0{>c50$l`B4
zm;QvWIB(vSb~Q?1BlFUm{>9R*F@Gk%^@yHS$=@@HQ*B?u$M`>D_7C}Hrm;8t5nXlv
z<kVaF@7}&SDEYj6LSAge^M%j*tNxYUy_K%7sXBY5x>^eZpKtY)ifq2MXICDy3Ay=O
z{L%d%I`PMRodV^XO?c&9+MlW3%`@fXmdRB(sk*Dl@*ne@FS5Vm+wP0)sr>l-P}zN<
ze+qYXpRFv^x%TjJr-Dn{-BZW9CiXCx3!hY<eBSGi-GlJg^WU@=1V321YLlDe?%jdU
z)_t5-w;+Z0uuO`ezv<}}7nbdvl9S!KQqw!E)`Y3)jk7s(q58J$Go{_nci0v22t@Cf
zt}1>VYjb_GKSNJKVna?j^D_U>>&&Bg)F!k9ZYh<U`+3&K4BNaa;c&Zkf16Ez_ga5z
z-slo=%tynLg>m<4O=U}#KFjrU_CMHteb>77-!-ppO`BTqf!EpbLb`SJvwI=$&r54x
z|Id(A{eE-ZMXQt@_qetlU}MPX;XglT;)U?3{}~R}t+{KTGuQ6rxyQv1dD()Buk+T-
zKbw8^<g5MbRPQ`Gvrx|4_#@lvBUW!8Rfd;OKCxuZ%Ch5j2O1-uuqEAizTf`Z5)OZ#
zD@|gzd*rM>#xGE*$nwnSU|^W|+W+Uax3*a++sj!VFL<=B*Y4pI<Hd}9);w1yYjvCn
zyy>bLz<$dAX{_$H)?)3Rm6Bg&`0EP))lFT^-=3B~F__(kuioa1>6~Yi4NI>Fw?)ip
zoY;52SEKPpEA!f_IdOt}rrEqv@H~H^F7#sbAM07(Ww%5(g*Ki%uH4tWd|hFLw>az4
zQ=#!8740`u*q_PIuiDNx@AIDpMTR|m{#$GLm;EuE^-MLH`S_lv9*lmqj(Pjr_m=%~
zKjgi-^P0p$q3w=aCSP8W!;?Pe+qX68Gn}ksMPB$-%~xO6ZQQdfhsQ$Qrnqn3zN;JA
z+h#fLlKFh%9RJg=>({CO@LclJ>~!^NPtlG$Y<bHf9Fzap?@{1imVIjv|8K*J=f|3E
z<#SY2hh1-3Q}8QncJ+#tFX!xCVzff`u;ndl!C6mM&vi0<W~KSGRQ<#1`SYjU6P<ch
zK(FHVc9w~gZ~tdlKRNo^J)SFRQzI8K+5BgakhNQI{q6CF{|pZ%-`{q>+f-0&=7-JE
zTbf+M#icqnZEWFrF#Wg7YpuqUs*7bgo_vf?{lWi_!|-?bYeUcf44kFMTW#!xHh#MC
zO8EZSo(6B{?2PWI{}j}Y`$&CS{n1ZK>(VUihljtWuGjo?_27qJzq8(K=X{pXre*nj
znZM)9OS`1?+rkfqMJ&F*<?$2k`78d-ef^vDNA!ONwjV!|133RPaIQacQh%A?=3N!V
zUR^gkSqf+Wo_%=&ALFObyV+$P)OG!_`OnbARClT>(i_y*ub6){cmc=z6<Ow<jE6Pv
zByKY+Fg&2n>h-yCf^S7cpTVLnUHKQ~TJ2<>#(kM&-*EItcJ3mFysw|OO=uE1TXaa}
zN$c<TTjVN!U9VmEM>*E%p7n00O-GH^PdZWVsx+@Pg`w@sgZWGAm)al7|Do!Cu)ekY
zc<_(>59x>EWOfNvHoeqclRRUCdPb$B-qO^A2jeW%=Ul%%&3?1oo@p*wRp+KIzx{?o
z%;L#JMTg?8#!nRv{B%@i-e&zV<k8O450`)6y!f|J)4lrZkLstlH`FKZ@0J%_|M>DA
z;RkE$ql&+$Y`U1A*1-2FFNlBh$_IbeDp)?2+n@Kx?mt75;lDd}CR>HqHwYir`Oolb
z|3k$qTVCrPm)^MTR`f~t)3;BuHy^EED0=;1f7>h`@vy4@41GQm?ay31a8W_x_Yt*}
zCo2vr7GHU8y71wD2BsRpZQDI;j1z0?pZ2X3z5HCJh@;n^eVO6g82-*e-QO#f7fthS
z@7m=%|LA&9nz^6fZEkLM@}u!1^|n2>YF8@PuE}{<8g4zg&?9}4ubu5Fe$_?FSF6Ks
z&13w}(8OMMDk}F=OvT~jcA6h`YS^}KiM97@Z49!gSTHTXT$Hco?O}Bm0fv7|-mNS7
z&%k@4dvS$Y84uUrg~{8sTD=|^bf2AA#8(vFz*imieR}HJ1Cw4!)wM0X%$IVe&(`ri
z*W{Nc<-H!RoRhTl+kb}jyT4i|wl8K~QosJlACn)I{~1{P|F)U*>IxlxsJp*Q&aV8&
ztY`1TVxP!NH80+z$h^a`=Rx?3^M~Kx_<TT~yX3@|{|s$)!XNgxyiNKUq#f<;(WKSb
z;<~*vg3s`Z8N>VdK;I9_hi1*06c_K#(dT-w@0O0%lTvrxsn6%l`4}~AKXVNykCW!3
zc~6UX=v+5qRr#)HQ1SM>?CQRv)xnY5{-sTtQYC-t`XBN1Zy|pdn$GW%<N2}q!F~RF
zKb9ZfRwp;vZ};wtxhcDT^SrFM^kyDM&*X-e3aL}vpHAqJSb3~|_RKuixxXXNz06ff
z(d-I-dU}G9vvR9;e_gG^`mf3#?l<nyUG%E({L%==T*cC0CH6FXbEk+WpR)hl_|NcQ
zxnSn5<8Oa{oc8RIYEez{s(F4K+J;W`st5mQzbJY&X-=+Q`_%45vv=7=Uf0cCuiNZk
zw(05Bwt~9$wYByC8CYIkG`*Yut+VU!;WBfpska@joz6{XnQknZQj!uDF?CxWyTZN;
z?v}?*KRlcIaJRLZ(Cw2dT#t1GPaKf>&oD3huh{+veY@NiKlsn^Lv8zEYws-?>z23u
z%9P;oIBEK3z1%nE;+hs7x#m8G#Rf;VW+*1CP_62XJAOy(mj988H%dMCUhaxMHqq&*
z?wJ`Wp}{9_pL65mV|*Fly|iM}Gq;V`^>4jAp|j}H6NmTPn_DN@?w|PU*Y%Z#6Pkr@
zTj&%x%6xw1@TcnXlC9HRLqGjEp<=X>Wq#h@o$FbHdbeBeUG1NIM)>ePv2ELwqc&cN
z>7QM5a9yYNi;KpSkLU2`gsxEjU^n^GEz`BTg}i=tDNmL-Z<i7F=k=xJjGNQWd6!Oj
zAmG5*`2G3%he!QQj3hSZr)}Qu8lDs`H@o1f-n3ofT)kf{EArMaYw*tA`}p>!DfW8y
ze1<;1eJ{01^IJS`K7XNjV)%L+`-i`mRcu{rc1fgPf8sXrz`qYpZ)~ed|GG{+bpMaU
z#k;mh{XM%<i=#_2>Wx8>)6||NZw}iUPCUL<s9m$L=C<;xzU(Wxmwpu<v;5VU^>X*s
zl;CG>D{dYOpJ!YDxAfWfIFpNe4440B$U0lBdxUpVzwIvPXF^LGgH(GAkE`V9pEI15
zV=uUMYM<oS-PW~Q_nZp9b;jnY1|86ByQA#&Q@v-^I;(jVC)X{zvnlGvL;D>4p6~NF
ze}7Z>G5hh-KWFBD=&G=eypo*C{x`?0|0zR-rCx}>ZT6o!oA{;CFD~|Ks-)$b-I9(}
zxfNnQrIDY#uX}#|sr?tj|M6M;U9-paf&2}(`w#MZcU|)D-qn<ON#~-g%%qoM)_U)|
z-FLZr+-(UvbGy%HK}}0@{B!A#`Z1NIo@=kRd5cY0Y4hHu-}#vB&$sc*Kk)Hx)#^{H
z$rnDkR9g4EO7-m-snar+*gRqQH}gSN`mL4qhg^&Lj;s%CGAgLss(NNconzx>g<rqZ
zHr&rV=Ww=erIyCeRi)B*UcIdemk~c*S}1MAxSf5$`32{rZcjc|m9try;p3{$CsdlM
zK3E+8yxt_`RY=LQRZrg7E!wH|V4-HQ^vV}i9UqS{Nt$_`idNteK34thN!gm?A6-vx
zthe*?tE&IHdg{ilpH)L|&b?E7`Sbd`jX$E--MQ&pFfGHSV-2U<$rI;oLjF1l-Z{3+
z_UMiOm;cGsiU0AuT*I%EZ@OmH!Gn`B3?e80UGuo1^0;&C{bT<bgzL`7Szfw)M2@lP
zwa;}&wnt|D-^E$?eLV3nMt;UNyS$e4SwF8;+a@0_I#?+^#avLQ<3xql<K;f`g_rhS
z{yYEc$$yG>OwV^N-nf6qWv5Pon{M0r`9C~MYzSa*yD(EmzWDj$kWBNA>&|x%dPQ_6
zF8R;E|3l+v{^9=&9RJjREYr-}WBTx~(<coP<CC&mT15m8>bSAX{rmbw{E&R(eW^e4
zAB|nEZe7n2b2q9j@*a1yNa1O5`=ct|g1>hjo>O?@W&F}Oix0<-_-4Dz5Bw3j_HIP>
zH?B`drI=n9G36SV1U==HWoa$fPhvb;!~d}V_Wj4#o4>kWv{P)omism>_L_NsE93Tx
zZnn^nUccf7m)RS89;=%^OWa)bV~6*Rr7zc>_lpeWQH?mYW&V2SUtT}B>mT|WhhJX*
zb+4PYwYmGwo&_`eZ{?XCTWQ?FxjSF0E3&Yu!0JCk;Qh^OkGJj9{3E>UhxVh|$ggLG
zKAluH+T*dk&|&$L9iJl?_qa=csrdQt#q0Qk(+}MLp()<GC%Zm5@qvEp^;!Rx=a%NH
zTym~D&AKA(=03M3rdK_T4BPH5R!EukxAX5b8`u8~to}ciek_V-{*m`ho;fq@nz&S9
zrs~EkCchoamF`5IGEmubQ;JzKSW<TqheO4WTR%-JLV_m;X79G!H_d8lMijsE*WyD_
z^+(U&bU#|B`FEOWrmp>_J+aae_gqytzHOhjUGKu$JC=41I}|@X@@a73DeU><`sn-*
zGy6y3t<Rd?KbU`<<IQ{JkiN9*YeJt$IPsnC)wy|!udH!ePS2cQ{|^2;vHyc#_iBHU
z_=?}()_)YaFSsu6?YW~{x9r}uouAJm#Pj(i_kM*py)K0-kF!jSpL_p9g#HhW?Z^3V
zJ`cOJ-ah5N^yvrkY!<Ob+0ILEul>4j!AzZH*}JQkhNK+3a3J*u&l#udmmY51A2DB7
zJAQpy#f>>OQ}4dn&-~c7{2!<Ge+Jf*KQvS(KQ!B!`gpdr$9Lt-IF-+OsmHB_F2`(7
zaZ_*g-}3gj>T!j7?f(qhzBl|+tC9b^;7{<w_?}<9=Ncc~&JDaDeL3&X)Oq(_RV><>
znzpS{!TQK*14CmqnS`&*U#uT3|06p2TlbIlW&Y_O`5*mf=-FB<)o|!?&=s9d^>uXz
zziIq@<q%+an_cwh)ZdPOTrTfZ+Bf@=#k1Yha^3C=`_^jT@mJ~kZSL{OrtipGna#p|
z`=<Vy-@c>r(4L*sUi^9AqpMXoW$xF1yX6(KrX}V-$?yxjU14|j{C|dZtCr}B*MG{+
zdUh$|RPTWaJAR6+czmVsZ2C!Q#pla^zKvh&%`<Jq&sn8Er>;x$Xmu+-8aBCHCVke0
z`En6*b6-tl+_3e@qs&*AtTTPS>)%}M_~CiSKEuqY^zLL&lTWId6VF{Om^f+GjaS^s
z$_pjgo8wo-OYKp9u)k|Qzg~%K47=Ey-rPb4*0n13N;@Q;88@t%lNayYWUuy5;MJ}C
zrmyRN_?C9^gnfH;QBPoJ`h;Xgcl&Zng^zQtzi>a)-&H5|@k`Xa*$=%pn;yEoa+-KY
z`=`hcPuOKX_e}l0Q>IV*vz%_IVn^>b@6Wb98xNJoD}P#k^q=5I{=@$n1n*SjA2FDr
zmwQ_>=54Bd>4lF|5>L%P@Ogsej}D8kvf5w$zb*KnHuG^jOI-E|*{!|`+>ItjrdNp6
zeH52FUdAu4zqT&i#xA6lf4#)IIsNkrLd6btFFk1&bmyYhiqxM|8qX`UUshrK87yjX
zKJnI8o!rN}woWtCn9cV0jgf<Fy8_Sr_^fjr$&*hfPv8%{e@E(fjw$O~;cd@nJio9r
zfAXgi_Mg|^PX8mg{aeM4;E%zN&i-fU|EJ-ZUoGEmvwYL#wASZ+(TmDEmr3&^Cf(W>
z_UvTsk#!8FKgB=nyZrF%^R9=@kEVWoH-GWlw91?W?@nhuv))MpyZtRK?7jX?{Lhg5
zvp!YUJ?Qe<I>A5H7frHPS03SAnk`lT%{W#$QL)cb^~SopGwYI~rM;e{e~FpT$$7GP
zt>DK!p<OGb{N|c`eKq;=^W5_{_;1^LR=-t0B&W6AvZr>}`EAE6y8^;xi<>ImScM-v
zvu3}Z<*)Ep;>YwkGrrAdRQmAt>wkuC6E|OZyR_xF;*p$>yLN=hb_rF@(|+i^pGD-Z
z-gJfO`F0_D%r6)`czlO{Z5`vIyBrtKYngtV68|v&!moJ#LcYon<v(lJAN$X+@+l|J
z^JgI{Qca(IuCJ5Po2_EVWNEb6@LX*NL(=ZwbLIY>*VPd^#=dHjz3HRPGn7+!%-9t@
z{(Ov|wQ6twmdx)Kk~Qj&W-qx}ypH2<7)RG*yN8W`Gq=_AnUw4lms)yfSIeA)GiTU~
zFRR;kuKU4pnl(Ib$1CH1wV9iv7W`CAD12xA*Oza<TgoXjJCP4h`_GE@aI5=1GQDH@
zdQRxfFTFyKT(|6LjWbicV$`&x-=`;Z#Z!ac-P@Tjv)fON>I<7`v%6!q<OvPV;|pa<
z*D9-D*sXj1sQeGDxwBu}3+%DlSG;5E1+(?D-Yeezwk)74vhS+2+f^C92ChHL_Fs%Y
z+jZ~JRTqCAUugr$RPDnljMvvk{Z07K&@@A`|7bn`EwA}1yNsqO6dyhPSn`i+U2S|t
z7I$Wn;8~ToDuRYxZcZ!C%skGl+}H3q{?Z-gmgPE|+O77@Uu|!2zSuJ8=#}383~TvC
zCm)(n$*{-TJTKv~vVu%P*#Wz&=RF^;VRFowH{;-oTJ8I9*IcsBSg<o@<=w`f^uD_v
zSc|{!D$&$CQ5Vx^d|P?F?CKjwo>WAx&0K%t^M*gJq1I*<i(c>@7xX;tR5t(P>Thv!
zyP6(ZFM9R*q(ZuKpApBpXWXp0XA9WgImq_!|N1scAk$xKmBN#Uj<&`>uiHttZOF<h
z=$&=Ftg5v5<&w+k(_Smou5nov8p>uh=lS07jS*)KX^LyzNxrwQ|D$-DiEgp;w!NF=
zqFO#p-SwvQl|=Q#^9x_Te^T~OaCf+oH7f@*QxP+Na^K&6=jhZKvn*DgS`xSNO;zww
zt&l5OnF}xf$oJc^`Qq8nOv(2GCb_fv`^P-^m9+bGuASvWW1*NiZ<S@Zc0Zgebn5e=
z&(Yoj!uGSb1^EYVmf<V=@>ryzPIJrUzw_%FQ~5kjN~FAPei`>wb+z}x4>MctEP1tj
z<>CjP)7?Lo&8^qY)l@St4|3!x{HnBn?fzzEDZ9xgo?A|e_%}E(E@AAK`1jF5^iS{Y
z!<)XI`ocO#Zmy;Lh48PUzh(dUUb3lvSj$y5g|+AQp|_d`6sHyx|GksKJa6yocNR{&
zdb3OIj5`)Q_n&o3`Sb68+_evSwGZ3reQ577xvO+d);YTE*R}VduBp2xZn@5+!OhO0
zJW2D;{*!z6Y?a>DBY&W}P`POd!vdkB{T4D`zpj7j{g3-(?K1z&504#$kLC3~TU)6R
zcE=^jV!;Vpv$lzDmFu5-9rn+@-S}kDjDUwHe=p#3wCUSZ_;vjW8=s|8me-VK-Fo@w
zPH=tauX+~0Qlni$RlDsEZt2|eSNUytVv6LJ9`;J{cbodk`im;Qy$-7JxVrSBiTb5j
zo7H<mIwew8t0+8|kUw;XM{du@Sk7IS-{z*ydX*@<cS~A=S7}kv?P{KlKiSp$Z1)v^
z)Z1VF$T#$>_C7|&WS>cb;_p_RUmpC*)AsdetIboECcoDV>PcSM+V^F~$rH<S4?LU4
zP~3Q}Tg=6HURF%{`l`8#d5d3$37xBqU<vZHe{Oo!N!-P%V`-c0uM5SKXI+og`?|qN
z_<UlNK}FTy+pK)-ar~c-+qafft4v#SE;R7;+qaYBSN><%RJS^NWsP#b*XEhL*Jf86
z?&!8C@x0+FoonmNa6s^m;Fa*_y~~@|>218i{Jn$av26Ai>2C!ewr=bGa4vhd%BOel
z^Oi@qTPB_4&h4!0;<R`<se0BY<DZU~?gwvXG<%*>%davmcduMZP|@;d44?~UBc$4=
zya^Kz+HsCkw(!=JANe8E48K*M2zkyJW%gYDEmPrnTkVNgw!{l&e%I->QMEQ;5o0Ot
zkIR0tGJmn{vh&q{=hVb5{bTfFW8!0bVP)Okby3bTb%}uo9=Zpgcr5Fl_Ybt(xA(`|
zMK#5L*9yh+y}Z@h{zutP{?ZreEmsx@cwH}$?mn($d*;+?(L2e{4vU?aI9B)cKSNW=
zkLwTQoA&9xoGvf;hjaCh+eg<IC~uhbJ7CMU3px7=H+igm-1{zV$Gem{20c%lx2w*6
zW&cAv{>|2p#ot!^UGYcvaeT{v2Hw2&>)-FO$la>{!+p!mcR`*y@0xCJy?UWP`IKT=
zz^7Av!3<2Rr(S37?X?LiHSu11yz`*dlu1oj{&}t4BUu$vdBH;AJF~j-*JIjsmk;ck
zdPY~nsnMKA!1HI-$A4~CY5N!OGyi8e$X}m-UgU`WvmcfGtt~mso{xNkj{Cdzws~u8
zpY-$gWj2FaTkZGyZT27Xt{>OU@{aD8`EmPjmG!BKKd<d7o%(KFUD~VZ)^C!JS+X2I
zr+st%(H|N1UH{s7?POQ$cSigR*z&&3Tu9rM>w(zsB{H9z=jZ$?UH97Whx_Uit6A4>
zIXHi_<}EkldF`KGzm30Be%SwqIse15*~R96RIT>+*!Z*T*Pkj=Ru$v&T<77#?U}o3
z77L{_2pruUUs_}TpP@;x?!-LtjeU3j2`*bRzxF@FL#-=%rj9#G_`mJEWqjiNX-SF4
z3|${L+9Z4ZdzABT`C;u!U*$h9`wwf|T0PQ^^~$dH?&N>>c$$l+ih7UIW~SpR3=Hq%
z9e(hCv;495BYR-G_lNN2(zjWjZ7<@Ed+eK~F8TcXY4!;muTRhEnUg&0KZDQw_WukU
z<{w<&bnVj7hrZ&6<oH_V9@8~C#Bn!z+V4}18=Gp+R=qvm@K55V*7?;x)~Q7}v262r
z@?^y;=97}T=PF;=?pSZMT;l5Xo&0;}ZaAr-vEuIj>3^92ytk9BKPb6B?>~dM`h5Mv
z(!Fx5410cEeKtR3c5y?2Uh0fGL;jlZ>-PlyGc+;RRL(nU|IqSde@l&O$=Xd3$8Vc9
z6<!TkbVJkL&ARgO&VN@Ieb|4v!?d|_(cSxTODe3DFDoaAvnz<D=S(VRIxZi4wrX1E
z>iA0g^oupJSs#w=k)9p#$U=FNw}oX+%Aduu+NahY*|E}ADz1GY&%CDa9{wk<AMXDn
zee|L99e$A?uOqL>+H5PiXtFyxRD06h{N9rRZsx2iZ<TpC)?ZlPy8nZt{LS>k=Vk96
zZ`8L5)>-J%exz#7<pZZYe}7ACVOD;h>p1W3>+k#cMgREzp5@oL;O5Ut&Yj&GA8!b3
zJ%0VuYPJ6ikL@;hJh{I1%NKT)=;#$H%%_^pR9Dr79*s6V;_n$!Kk=ep>$WcUWA>c(
z52oGcsuOXUSRsC3pTLJD%+GEoF1@WO`AW=LK+(;rYV!H@moEN07bkaN?KFPDigou+
z>24DDXmXKNIp*A+(8ItiuW)=nOX>AEhUzW6k81P2{d8wIU277(y~v`&%{ol}kLG#q
zgXL-qmmaN^>6?A$cu{I^U;XpmQ)k5tuX7pyxUMrrZr#&Q=Wd;T7ym4AdCUGZdw!pY
ztjk%#mCf4uI+N$#%*hpar@oT?nfjGETrW-j#y<?}JDvZapXuH!U4}y^zC9F3n0(mh
zxTMOw8P8|k-E>)R%gra=+1=$aHQnWD&GPR~<|V1<*Q~Vp7$$sl^X+rFd25tsPH5hB
zEv0Z0yT>w)!*d!x7rzeK88=OM@w2ni`7$-387%w6KJ1&jboJkhrRG}vMbjR9ejR+T
z{?M)KI-S?nzg@GW@X{ep89uADqQ%PdJpO1)oqsfU!+!?99noj)EEv<w#oh`rzJ8``
zCHnO+f7RuUKbEII3KPnVYMpzK`B{XD&<@E1sv(<G{#uCU)uja<UUBN9i?jRgof8-C
z-m$0jj)eLQ<-ku5R&ZFd&*Q7x!*z1+2l2-B@4WA28W@{#-ji~ic;RiD_WU@@b&KBJ
zf2-ws(SrHi<MsRaIFB!nS}NOp>kh};K;}7?s$TDsuPe-}+qt^iHz((2xYxF3zvArt
z<p;BQa#&oI9F_=PNpuXJ<RE|Hy1VS|W89U?;tZUZy>l;Ml$lkx=+@TOZnM)FPU~t;
zUN|oK_3x8*=8tOoqCW0_+xXkCg6-p4JLQ^?58I{|%rRYYHDQ)(;>0tB?`s}!e;8}n
z8kxzl{gdTV4gJpfA!|1nHtV!!$X@wiYg_o^>g?*@Op@l&C!fj~O=DSC*x+bCwa%yF
z@IP+j-<*G}CPlodabNYLE0u-g%U!M1NWKCm-!k1t2j7$@bp42bWdBFT`Jr`orTxS3
z8of!+8_Zu_zvpnSaH8yzU?!`==X`&z*U4)g4cWe{=)AO>m0ACbRiB+d>^iBvbpFkh
zv^!^+O*bZ0-jOoe$-eWr-B&4#iRBr;_Pz<4`02R%^dh?%lgx5TUmV)s?=SbC;b6so
zh8%tI*qJu+`3rxfm!xUzJDsU=Zk0!#+`C69>5mzEB;}n!PBQ-^y8PRlk6QO{WZf4t
zm5$&^O^b*+cFxt)E`H|QwF@TM^zXWTb@O+Rb@#v43+|caR(SmKw24>#g07^T^Pk~h
zk)8R!1Mypu|DCU6`rzMI<ElEXe_7V1EUUG5&rWIbb+}Xa=C-rU?l60Wnx}1_o-pjL
z{Ach_<B!Y7<;VUrblp?`vHy|hrRQNE<JMQNzB^-E$Di9L@1=FAp1;#y(93u_CveB+
zlzDyM57b%yxcW#_@7nRGk7_Hc9zNOG#oc{#?wqO4DsP|5o~a8pGK-dAd9-iB2k}2b
z%-=5kXk6u-z2t}1`@;ph)~qaF9~=F0!i-PMM#ptlD{Aq*?OC~lXQkTSsFIZzyY}@w
zUwPJ6$maI9@V|3Z|1SNf6kB0_Bwk>T@rP6AE?w12y;>7$?99B{OIaZL_&$BB2MxzF
zCOT={xsxFOKKfh6--Y$5_nZDRaMoCVu*>hBCvau9)3%%YE{ATLlsRQ*TE^P7PiBQH
zmodD58-HeA|9=LyC;u)QRrFmyeEmOzRE@<opPA-HFQOJ{6q#!|?|bBt>gn$3d&JQ{
zG;iv6@i*K5GqAXPsBb7;{McTu#(VzJa4Bzh-F;IR-Qbq!YU5Uz6>Z(?6j^5RFu-Yd
z{WZ4rv(984TeI_VdGh6hhYY)e%Ip^xeyrnuy)b!MX4IMso^74WvMaco%$X*hxAMAE
z{AoSIKhc?mAMKB{aYlP@+0><x5^-==^ztXqGwwch70Ba!=DR0h$BFfdzh$aITPJKa
zY-suUmghBFio@!y*EAp3o@;J1w6r*QaQTh9FF9A3?wxc}ckPQ$dybz!HA!Z5erGPn
zts`uqQ)kGThxdBT4KH36y7IpBwKX=ek0o^#uIs07p2KwD=yDxlo8BhBhtGDaS)A;P
zlo0;zTiLeuac8OZwo8A!SKW8j$$DY(Lw~8~$$~vzsxApTEqSKhl%0{Z?r7rj*cajR
z<oEZc&ASw=KdHW6X^MhJdr9~)rMeHH(<^NctSF6KaOLfrXB)fTJ^Sv%E$yaSHp$|~
zGo!$DsS#5ew``7{u9Du9v`h2Cob74#k=`j0yQF%zWPUsOWZM=aoou-o>rLLVG_08R
z%k9v%3a#r}_AlpWofk8!DqRv)bYNHbnRVNyIoyliwQHyPS;HBRpL_^XY^uM;w^eNA
znv8#v*MejIo!fFbX@8K9k+<lQb@ESU=y>TYllE6~*SUM8NL%cDXgp`;_B!e4o9UO=
z6>X5tSe`K1xbDr8S-pEM?wD+mDV4B_;X%r*l?f`}((cEHZFbK(ot?g7ZrCg3rLk<x
zZyC0}TXR6-I={u_oC<ku<r5X>Pj>C(F^;Tg)6F{h^pal6#A4~R{|o`UjEpCR-Dgt?
zw@{qKqR{jH;Ch?Od-BsunOzfW_?8PMwB6W!*CN3D_|wR<MVmbMJkB_leU0JzF#opv
zw@V-9zj6F+^kezA>DMkryffKdw)t|&%;c`CTX~ZzZoe^mU=px1J^$WWC707YUZ3o)
zI=Ngv{c5MiLT_o2dYSnj;{P+;y6p3Jk$vv({|xQ-1g1U9Wquf=|8RxsuDR<}cU<Y|
zG+VDeBle%mEQ{PwbMxt{dsZ3F;eXbCeEOuAimuux#?#U)e($bt|FS;!+Mn{3+2!GO
zs#o93eGa>lHtE@?ulv4SHy4sj+o{mE+2g!&;lboM*2he$24~(#elvR`c+Rih>tEBu
zH~U{*QTDrQYOjCZaNcd<yzb<V%DVWwbFMJ2^RWB7vbEFl@%pTZ9&-EJtA6<<&viT8
zc;LXn^IM~~ZOP=YKje3z_*^Z&*E+#(V#=>C|9P}G-0{PV`9W>gYuCz1RNe}^DYVYq
zEP}}+l(k>tfTcpPpJtqYves6!u2;31zh(ZNk{7JcTHjkI@k9K>5#`tORQ7p?PCaBJ
zRycQm=AIoa4I6H{+^d=05yqu_?x%qKms>vy|1+>0|Ig4A`h)x7v*rhxHq5JD`!0HU
zZ5w;QymMcl?l!xyCa$JuL0e_n`y>mMSwE8haTxz+V0m-FKE?j#WS_qa_c%ZNUAa%A
z#`W@|J=0zXNV9b=KD({jTS7O$W?xPBw(LzJGgY+ZK22P-{+;Ua?l1jY>}Ni{-n(69
z(e2hy%NL>@3G4|D$~)E{u2|gp`pS{5t~Zt67tL8US1az@oBvn-Y5r4pR_`vUE&6rq
zrr8UrH5YVFZ#Cxnv%BoCgRKF(pPTl%e;hRq{~20yAK$Lcd)jsD4DX&F>K!-wXFOgJ
z#CW_Wy!yighyC0(@%06w)2=3`N&ftok{YAGtm16VJ>9!&ZWY*HH3+kmc)omp+*eZ#
z%|jtiH`_{HpQ6fj@y@@leKJ2Ddwwi!UAHiQ<?Zt<n-(9}(I_|RDSLZw{~>nO>RCTN
zfBXG+#-q!+vmb{ymYhsZ*36BvnEGwigfn_xJMI`c+;Ly`__*mu{)6@0HKrfm?x_;*
zu<^JjbWLIUnYLGvWzinZ&(hP1R!!145o7iI&h^{o@|*OJuNQZ?C-LF?k%OyW3Ol_z
zmc4sflWUG4uSmWo!#cZv#V^<lKZ+O_9!Q$<ckS-G)~2s&OFkAIPy8vP|KeKzvl`Y9
z<&V<4{|Wq<Ta)}?Z(S~b!1j1EO9f}W=RQ;1dJp#Qd?LxnRmrTjKe#?+{tpfQw=+Mg
zKR#n8I{VSl@2x2xo&L^x`R4Jat)EZCuIPRib#~Xo8@-Jo!sjk=t~+%7o50^m|2Y0=
zeYpGlt>Yup%~$sX^50sp_jk_4TgMVLpG8mI*0^nRp0&;UIV*Jx#C!ZDD`x-WjQy~R
z|A+5C-pIJuby}B~_-~9jTDwv@+3Z2h%{&!(oq`@i!*-oJ`U;O<Y_x2X7n{Fn+3hOz
z?0I?e-0{45l}o0rjSv2v_ILJwhOGN-^Ec@qsP1(>GEZ&amB*L%%*d7d_qO%j${O+9
zLyKbf#D%mKe`XJm5O6#w`s45Kq#CE@Z`c1$+NWO8{V4V9yw1wf{KD0e@7&+%>gRq`
zNi+LY=jy{CA(o>4)biPWW*hmB>mT{Q6<l*W`p5pL?boI`mtBnB6d!eX+XEhrEkPfR
zHZ2xZ{CT5)cID~toj<l8m@hW{o6E=Tt#(q;=QnAqUMbahtDHIcx45S4)x*<`RLt&$
z*_8^uee&)cYx0yQfd^f$%>F*}dhhY`qN*IqAH+k1rMG!F_GimXQP5w&(06!imFl<F
za=GS*C+7T|cs^%S6GMT`%ZLenRn1pQ*<Z(2*KmCdo|e7yaXatcrnd5L>=H4J*V#p{
z-+5tFQS5q2$JEp2gi`luA%k0|l`Jio3%LyYisP3T$VL?%-LZV_{1<hV$3$K^b*<X{
zujiw^M3l7kwe1P3Lc2Z~PB36R{`Gx~?14iaZI!QIzKyk8U3Pu4yUfEs2lwvFncOLD
z$$t6L&e@ZjM0eU<{WWJxm|Zj@+oHuvlUJ|5^P=*}ud7VG&)>*gn~`+JxuE*_Hm##e
zC*6y67jgCJJGE+t%4XpMviqZ+PGwcA+PM1E++#o5vX@>id8_6B)vMRwd!|Is?*}|w
zzvREUewg}g@#F6GlFo%H0xu@?emul&vbJPhR}166^;~D}$T{_t%W*#5ox1g7?7ewC
zk~;TKu#_BPoM&Bg^YPZ&`M*WgZ+`I?ie(ZxS(q{NUD=uz{`f~~`=uUn-TC^;(^fx!
z$2X&h>J7P-e}B#U`N-R|wdbR6y^(9dT4DC0kkvghO%)9CpO4lBW$jAY6}PZ>;l26y
zZh5?%V4><~#Q!~_$e!zO*GHz?e)Cf%=oMZlJ!kR!!+!>;Kkxr8u`yPg`RGJVXr|Z=
zQ;q{=uYdpe7k0<;*wbUS1=+is3$<^ZYQE)Om+$$~dcJ+;QiZ*p%ZjDg7;n0H1Qi@-
z?_=}LdHsv?Qr_*8p04{mdQP!DW8Q!I(}PcL)^(=sGRrISW<0*POM3TS?}*EbneK>e
zcGzUaBgTEeNbXPVy@ulW6^Ht@eRFEAdY+yc@ve^h$K;3ltu|q$^4<3&cYSo5{`Bo{
z-DS&u#dO_nKd0uAs(bu{z=Hn_72)su-(-Kx|HklfdROir=@0P-to)m5oa<b?SNz!Z
z{C8B+Ij+{e%A03WHZb~ByLmjG6aKkm!utXv+ui>}zsDb%e?$G-wjYxpO8a-(bJghF
zQ@ohB%~SN*{K{k{<}0gJCNEj>%1tuLz)|#lf|grvs3~9CpLOTiZ5K*SdGo4hf3*IY
ze{1U>ER8exvHHXIZ}M06_<uNe__uN7hokRiR(y6^_DVQQMeMrpN}n{7NM=J7hM6io
zGWEKJ^#>#O=VWVoOb^?b7UU?Dc~K_0i9`3#>t9`eyZ=c3_V{7{@bCFU`M1ozoe#hG
zb$8_2#LMsOYd*S`^sJYjb|OV_L-+*ivh@#7Khke0^=GWO9{j;?>z2DO#e;A71SERj
zJaz3&;k#tDed<ShRtX&mI=17F*R8d4>K~r5u{*BnRT1*;(fj4|{}|gl-~Y$;@pnSc
zjIX@9#s`m0=lA#Dmp%82{ev~}+iKtL*xnw$aXXg*PnB<<oBjRX*PojuUf-M0^{4;U
zl=UCh@AxZx%kKI8wf`Ad9sh27;;^~m%KYyocQvc3lFoN6HUA@W_}i&DN&ZrI`|j)R
zn>YU#?~L`$zdpF?F^6^ah~E^w`K|Z;9}(woNA^qP%e^`||D6d(y-8#C)ct>V)Mxj4
zdij48jti*xsUKy3IwAgLy!HeuE_<J=ZgavNV}7%{eB9pqPbuTtuJ=cD(|*V7ofh3O
z?Qy`)Y0pCYY}*qmBfD1Ucmy~+`FJ+w>e~E=d$;eHb^gSCkzDC%Dqf2WPq56h`tqVW
z@WZl$`8Ldpws<gecYjSk@U^GsKf`>l*ES9>E+75ZZM$bRPxX>%4i`_kWSJkCY3(du
zczJ2PL&5KDTwVWO*~^~|H`7{Od;eLH@uE2AjXRX}>=}ye&)0-&uTWrkckJ%Y19n$$
zcpFT3vf@8Og>duNHGji67O}A2xXHp-WxoCLtZ)5tQ{J58<2ZU!UNg?Pd1BA?;)lLs
z_uf4|x3_kJ-b>le+gp``JkM1;m-+VnWz5qx`sIaBU9T`t{8xPa>w5pIC9`|A4-`A5
zGVa{F*JV>D1H(zx!;D*tFK4h!@?W{8Ft~7`rQVq@qH$Rl+RJ+W2Hmw$nQYs`7A-9F
zz*>w~ug=e}?z_88vgG^Yf=jaGls|^Pz1p{6fA)^f!=4vBn4iD<o*MQzJ;BW?Ja=8@
z*(JAc{m8jfyZN_y*-OjNNkMhV+b`O^ntW2``+CET8+UB|=p2_iHJ&HVpt$$G*(Jl~
zAJ->OeDa#z{r-=6&o}p-Q|x}$@3O_#{P48txALYvy)wnz$n9pFqXlC*f8o7dYFoDM
z?TL<M+)-j9yJVh!{L{EIE0@0f$JOn#&#?O^)850ZhbPZH!!5x0TvF23I4-@gdg*PS
z9ovmk(s!J<H7`B>=~wvX_Sut)Hh$hQy==C{vMmvj4KIxQU!JXN{&#S{(2@_K&pQ*Y
zJ(-nlku&X)wyUzfmLccUcefaGCKNe6NO_QQ{X~>ozkJ8t+_kztia#f$H0+sF_2ui=
zwfg<#x5N*=XH-8Nof)Suko{Kl=o<&wZMTYroV*UCpV^h?Q-7Fi?%`(vUO%s2dGK2I
zVnxoXi0N;3|7Qp{t<O7ui`o0{qJ4UfD_@jnn{_UV;<dUJX32NEXS>m|!YM{AE_uCA
z-%0Xt{^arvx^eVdhQsz&bD<@y4`eo5sxLe)zqay>`StSecCp*?^dvrP)SvP53zu>1
zytyA%KdSHU`p<A=+av8X$-4^2YR@~*k9oj<XutZI&74WAy#*uh1(m12+*!vNxLnHQ
z>Y}OrmLK)@{d#)-=367(3r~LSX6!wFTSmjyUe5AF&ho^mlE+2A#<$w1y^W5!GT(js
zl(>7xc1}8XHtN;Gh%ZbM%%?nM*)GpJwBKc)Q2jxb`t191w{B(4<N1;JNc*(+hS_@S
z7PR}dI-ZPu960Nmli}okonK!?pFAq&G1W~stq*>YnOf1gzRc{az4+QamX!soH<srg
zcp%tRE%m14KSTSht&ek~%eW8Rapaz#R5<@|*S|S+(*GF_GS+A3=85h7sADJb;qJ`h
z&a^8__wI;euzzu_?2U9^{q>UbO8cJwsQu5t_U6{oh4R97N_URko}B(ouT6If^My`R
z&Ajl**T2`SeB+^f@MvL~6xYY{`pWx!l54*`{adI0acAO(MPIfQc{MsnXrJ@Uf5gJv
ze`qhi-w*w=6YEuHvrhTXux5hLg8ID&m>K4Io;Uq_wZixxhwX2{iXz*2rh7iJcfL~!
zJ$)zZZKCuv2H~d}k8V8J@IXdx@v`D?{-EWev+F<j>$hL;USE;_aC`gNzZ=ir$}0&h
zw@Z?++_`7se3hc*%$C2d_eb{z*S(3nv!h7t`_dos&#NEixA;Gb-kkW*cGi&(JzMup
zk@{9@d0ZfR&AQ6RjGpI3zy4=9y#9yU^tZ_$MZ;bnoX_(ovR0a}e`!pFqV~M<__dop
zRi{+Vvt0ir_`)9LhwFJVCmw&8D|G6>x@-O_Yqvxcx8Bk{v|5J2LjB{q_ih)rzAe~$
z#OUC+@}kX0MY7I3wwbeO?!A^LU+nf&np*7IyZ6TW*Y9k(Dot6w+PCtv)gNTtpYJac
zt+rIW)#R>$q3YvnrZW;Oj@$3v)b(Q$$CDKPwUza6Ie*Jk{Qjo)(XRhP@gv`V^D9@x
zyga#9cv<Dzyv}ly6-vAYVH2kuDLTMvDZ|9E{)<k0`>!c06{}w_cROe1tz_unwC+NC
zp2In}OTP8W_8;Qrb2vYEe_P*qTdSmUKKsihngJY%#Z^}PyN}rg_6Sa%l$mHe$F=fP
zXcgbSXg9&4rmOPp<>rjSQ*K_KJU_o~-k+`~e;iA>O%f6sPv$(IXYptC(yPz5+?JR8
zxpCf;vIoCrJ>4p67rnD*qucFJM{9Q(nbLn#UoX$~*PM6%w}ChNAHBP5-jQ4y6K6bE
ze%B+)!uQv$R{Qszzs-w3$amK9$MZ{N$){FF-`BHn-jQ~nYtz)w1nD_Fxyg+$;}68Y
zxhpdN!_JaYl|?f<Z5r4Z)fGx?!oRowXJC2z(f)>=;Op~JOy?_ePAf1MHH#U~^N=ZH
zpY_prf90~O2+`s<cm0E|{*hdHkiX%N<?`3l)Rdq3%N{Y?9`G))Eu)mXEK=Nh_S2~x
z$INEEvPt|X{8;*UwtDl!4O_h{4xJV$d#$~>ad+C)bk{Hm38%`Z{>yD^AI-L0H|yU!
z%TNc!f}83Esu6sK*Cm*3-J_nb|Kqv-@U!^%7}NPPCQhAPX_-*a==|>X^$8(!${vKD
zJ-K({t51hFzMUs|^`H7{vjacckA+QhdfI(BKWEu3*YJP5+YNuVvs*kZyxqt4=030M
zmxPM`qf$Mm4iu;|M)W^ARyL`6-q%n67FMROUKRD~o==n8oiiNw=hWPs>0$ByF!R5+
zNtq}1$u;KIXjc}dx$NM~E%HjYse8FE^bW@Zvq$b#nd_Eq$kcX?eo{Mm`5((4u}KR&
zO+Fhbve)d4ZND0xH1T|#YpGOy`#-st3MZGl3YJRVQ|7ttUc^_ww5B@yQGVxl4!u40
zy8D*OeeF5EVvFI4**g-}b*=Mwx%Eof^Sz}TYaFhg`nhY`jQ57OiW8O0t|o;)_mq^3
zNS^wnPUdQ4{9RX*-}8g*wl8#+jOgBWge6DTt@u#?E5mnM9A9f$FQ3`&vzeh_)u|(o
zm**8<pQnB3e22+Ijw@e1Q#ZHH)=BG}oOW><%d)4k#=BJu&lN^Tg>B7VAHnN?xN7d+
zw=G?gYTKu(h4Y_K=vi;uVe`$j=DN84%$L`r?(jK&QoeIT-aLSvecr!0r6TqnYCF;e
z7Dnug>DMWm>%fw{eECni=+zbN9+#3!u5Y#W&eze@F4r;qYWsb1Lv`Wx#+YmSKh{4y
z*R*h*zEtfBZqM9&<5llu<PDQGw{Oh7!Orm5<T1PMMB%J&woUJYx+0ILv=xN*Bu_h5
zw0s$#?SBTZGt&e1_Rb3P{PyJGVHqadjmNJqkNWxOKf|}S%agsEqb``(x(98aDpirb
zEhHn(=D`ND`x#}i2l^*UJYQB&*j@PBp<-2RVU29&vWTNLmsYtyy{~fJQ@VIpc4XY$
zZxc^OeBU9-AocRsmK#$;rY*lToypcs-{>LF5yQy2DS>S^49WSkKfS&Z)*W#m_i^@8
z35SSXM^1RD2Y5VZURU@sUh=iP$UnuHSJUkzKe8=NUo0J6`QGMXuHJl254P~rv3~ZO
ztQrq{=owi2ER3_vU-9GmajDRM3m@r5{XQ~H$vSl_r}Ekp6K`zk%ll)kdSIFjgZQZ~
zF~9P6!QnE(ue^^s{FS~Ed^q6L_U)ge9ZpHCHaWF;{;u2m!eaQ!o`lcJt{3|!bgTXH
zv4zXCcC`rp+<5z}>6YRc%dlG$e;zH|vF=VETkYycj}tRjRs`L8eMI2a-MhMPE=B9U
zDciNA^AM|{?;6i!rB=&3Op=Y~B0HmA)i^)smyN7oIwozsU|QKXLC&sMJRdi68t;F@
zpIk0>$WQ$IuFnM)b<ANO4<5``OSJLMIw>#m@4|nE?Z^L!us_t<Zf?bYVETu7^OA(5
zzg6GOQgd;7y61JU?1q$>N#bSf>^5CL*pKhu{{D~X`Qy7(s@f*))82SFPmxpd!}>N=
z!7~zUES{N}rFP$f=TCCAuw)4TqMiI<`|<QgJasx3O%~gD8hc&3aa=|E&y5pdX}ho7
z)r<5z`P+5Ts(B$PT)y%Lew~pzwt8{Jv3H7<E2DDVXMH^TPO0{l?3ZX?JI|{UPZwu8
zt<3+r*wXHqyy0SRSKs>h%BP`=E#;5-?XCaq_b2D7+syU1D$XB?ntNuFo6gtl+_+cC
zDk_ozj%D+b_9Qeb<?u8#9bhufcK+M{pCS8iec-<%m;TAT&Tv-Rbmym3PS%mf68q=f
zDDeOA{IaBi{F}Pd2dwsWF7cP|dU9p??&wK}-xfxl%t@YT_&Fwf*|*gG1}Ei7{Bmg(
zGJacE+<iHZf2(=7?6mp0SxINgs}>*mc)(Bk<R(v@NjCCRcI3=|^u~7m*NI0>ITlZT
z#r@W--qeo!KSPsu-OXE1FFUS%`76HVR@nr1zO|Jm!d^+SM|!7Cj+%PQDCRCteYp+)
za?qT!$l{N3J-3$k|5LTSKUqazb$k1kr}MuXrA8+0+&Vkd*rUfN{>`cda=|j!-}y-W
zXJ~o5Co@(1)c&m9dmB2Hw`^!!`g!7>tv{bkd*9%8*~)&?lP2@rq^|Q3*VL~o2}_^0
zRH)RS_d4TKgr{Kn)SQWnW9GO&&xu>iwsT%>$E=IDp9r3Qxz_*8T<(9ImcONbD7!Qt
z;a-?sr?J<4$Cjz4xt=Ml&$}f~xfU-z)!Y1Cp>a<7b0>HE!V2w&;cwo4*i<Wgc$av?
z7g=-fZ5gWD8xH0wM{hmA*dQ)dQY~FQ=h*bO*6GsTGU3Z!PJU^pe!-OEP1Cuc3d3)r
z-p4bR1gty7lyy5P$Us=p__*ZRq}Pv~w|!VQ_es2CI*YgNoPzkXHasl+tuC$lIf8-_
z$)}^kEFMc2$CW9qdA45d=B1S@b}L`nzoorpt$vMdk+kcU2(^}D$E>|0dQ_|)#>M(w
z)1Us7Cosk0(8A|3e3MHHSO185?)0N}Wpu2s==*s>qO(3!2J?Bws%48Nq{zQc>q+?H
z#2S3%i>|ZBzRNb53vV6g-7+cq?%C4pd=^FXhRJCeZ_2gWPCoj2gK=t*pVncYZ*q!q
z+#i=MoBpe8>GP;}`|3?*GJIa7|Lyi#$B>ldl8x@o2i($_cBTsZ_URw3Q~5Y==3>Wn
z70upFxjqgT@7%l{`?Bo&<kJ~P)=!jMn#+6TTnO)(%f}~wH!|?wa@%A2th3uY*RESX
z>(qz5srqa5*C|E3n=BVG=~t$1?9^`!oid*DJQNrz{5c{H=U1<-2tToPb9$fkj>nx#
zwr5^5N}i*C^FPBT?wp_H(;^neo<6;;VB0+T56?Sl6!LhNwrt;3eKPe)tI)K@{+XPS
zakn02mNl^{OiT_wJ|{xh*RkF3-i_E7*R0n3lfK-d_V|=xNAjd=*PKmvo=DHtK3jTc
zIg=rS>aOP!BJcD~cE_qcyXR{;DO;0ycg&KWldKo>YEECj^k<11OS<&Q=g(dhl=h2e
ziN{H8_%U%=r?JrbxjBcPPE6gNyIp{Hx|*p4PtEEK70aLA%x6o=rLH&I7(dFce7n5$
z%j}kbJi*8PC&azDj5!qhla+IM%um~~UA5H74)wV_e`Ca}s-s7u(snL;vv-=!99Ids
zXeU1hfk?lNtCurH>RoyKZX-+B+<z+{{%7Eii@M{lyJwf)l2xyT-6pMQd+=w{vF+y5
zgDl<bU(4Na>z>@hXSn98*!0LfAC5l!9du{SWaqsRth<}1XYzdV6R~lYet!Ci)}kuM
zWm*1@WX*oNx7~`~sT+KzkHcnmzuCRy&nrDHKAW7<^5nFX*2;j@N4=Ib`k%OaQTKiF
z)pc7=n{^o$EPcRpT~RKDU0dp?*i@O{mlyB_7Vem2xne=H!~RQp>*iUP@7bKVb!o&b
z&jpj8-a4N%{j$kKGlxD&H*x8XvkCD(wnzE%ukYG=Q`~b;@3nJJVtr*-dz(mPmrY&w
zE+;DY6r-j{HHWI%#98}SyuS51CbHtW*XGY9KNsa&%uLx@*5$x@Xv1%gE{=mg8-8br
zaTydk_xAkEE17OCzN<y^k*Aow(WPRZi<5OGbUHO|Z9RL%qbWq8<8gZ#pY&}|m#Mj>
zK07<U>;BdUf9Kc;&#veEqq5yhpRr3iWP0S4gsx}59vo(f_{h8aU?#VS&`NWy$f=F?
zH@A1y#3p|5cKN8@_osxXimiP~T$cZer3*{MzD;{uHtEQxyRQn4nCo4i7Lm*#x5M;b
z%s#sx&5!nX$EofA_`Y|YRBZl{@XfEo*Bnrme804M=j5aYrq!oHLl~GE3>X+{-MJo4
zjd3@b*73PG>f9XNJ0D~d-R7@8on3HylJf2{<6{=b<L-PsS|lDE?X_;&Vb10)!apDX
z(cbg%;?~MN&r-unxcqZ?9{;S1T(4T0RQCID#)IncHzN0qe16o0J$V;6)l2AgPsyK5
z<-j>#&ijO{e|lnn_44I)b6=Tue$NTwd{ND{d95w?#iQJYo}1?}SROOJasA!)KZ2A0
zasFKS@812bW|I>idk32z{?EXzaCMJwTc62}wu{Y&mnxsRc<9sp9Y-cg3Us^9+|G0&
z`(yjV^uzHT_Tqnvm;SN+k-s?Z^{->AEw*poczMC3N6#Lmv9<&p>pD8OY2J-c)*G#1
ziT~!ufAHRaW4q(u_Wukiy37y0x2100|M5yteQw3hEfX&L7S`IC?e@AptLAiK#)7D0
zla8DT<mcTzfAXU_uWtl>GrZ?s7ugu9rL{Rq|IA;hD>l(9P8W-JZi!awi#8XGkq!x%
zsh|;En9h4GaPrgS=X3YWJuJGIzi*G#g~i^+w>C1&i2C&LOuEd%{Ox*PU(Q{eQzEN9
zu|H(zp56UNZ;7s$6SHyazJ@8AieBBAb&cU$foPN4!QQhs<c~;vUH7tN$Du~{Zj;*{
z{~6ji^S-iGw5O!S#<NaesNCc(`ct^^Ync82tN%p*iD%d;eXQGXPxz9G;LW=t)4uFf
zGL&K2@tHqy9{WoB>9%5xD=Vf)Tw!l}VB{#%s~D<~>w7$(rTOv#hFO1YfB3GekUla?
zZ{fl}=9l-(mQ_sL)_axt=erj%8*_vwU)*k5)BAX?-tUL&yK~o+tXI2sKH|!r8~;wN
zI@8gptg)bp;q)B7$9vPg1<#s`t*I_PJta}nGFDz=Prl4CvscU6<*xp&{>@vX^P_V4
z52?$K`6lLl3m1ymBVKO)vom=||KF5}C;l_+{xqj(iM&JQqy6&x)NYzC?^}Pl?C+WN
z^NflX+mt<#)1DVE^rQW^L`C)6>+*><f9ITfCLi;&^5zx(hp&GXrTr|~7&6u3^z=Wi
z)03z1?OAg5{GIsQ)4#p=!TQnuTj}L}EERgE;)PzDeR8$g_2l{K&6}n$?cC;Sm$P}|
z)U=6V3Ul=QMSt}3evZo7y~SdthxXO3$2-rn&pW=gO8u~Wd!5~n)@7%&AL<%C4(z%Y
zS{WwNE717&<&#v0!#4WrH%iwReVG3y^<#X@mH2?`*YtTJ9G*OTI4$y<==qZ(t_NTD
z>|Vd#^i}GPED0&Ob5j4(BHpCN_=cMAzVNt4__ss$KCW{!m)vr%uC!g*b*W;>MAy}4
zcNe?!@#MYW{Pev^U~<>Ld;b|8wEk*8_`dl+19SRCo8YA<%PSw>cHMTh_t?uMGoRT(
z=gbPvBp4fSPOjc)ae$#->Qjx}<vPjTH#0X>u07SgO<_;V7fTt9Z;$rZ**}<6{~^Gi
zr^dQE|K{$;x^w50nHPy}*jKY^^W-B&9zQueez$xm?AvkvP@!MGjjNqkmD}@|f0QR$
z@t)eYDf^vW`G1C{p1MPVbw}*CEWLl|JokCi{|wDvxl^zH(Jy*x?z!yDQP<tpGMjJO
zzw@-2Vz^l>EjfOIymVg5<s-8S*gTRmu9>R3rKalqX}poNf6e<J`gL>b|1)syf3W=M
zZtIL^oBD&U{IT2Y(K<^*FF}0u=ao;k-}H#9RFM%fj6e3D;fQZ?)b&4}rKL)h(;kIq
z{Cq5ZYK2Vc?VjhNzxrFQ*lwy=zANnKoj-?<imVKa$jG^S^J($!*%=<E+GAGa&uFMn
zkbC@j)jYo!+voW&joq=`qaoqO1h$|V%B=oACBgS53GUGno_Id%@5<F{`OjLuS=U$C
z5_sygg8KfrtuO1jb9D1-!gF{O_iVqrXB)#UBmW0h*O`m64t?g~yOZ9(TxoCp0Wp5j
zx#yM_xagbinQ&Y4L2Cl@2@6|x=IiQPiyo!FS?RU-#mwtLSv4E>eT%PrwohT_1--A?
zYu(>g->Q5%o2%zwxnY9w0o(dx`+ofGsc|-I{qX*%v+wpTGve+Z7wIp|*<{gwf}P{+
z+!o<^Y{l`a`&*TNJDq;An6Kc)fd}cf)$&P(x95c4*uPn1R)5nT=~Z`MZe*=oAE8q0
zvPoHevVgrd6NkkyciRHD><>P%;TGF|&0iF7_|ull)@Rc`)!xtBW<4vQ-GW)-!2|xf
z8!zMJKN@>%yk=u=VzrWA=A%vP^k(UWI`YkbY!AMUTe$YsyqXDTKK{(w!MB08yLpnq
z&WFXfmv61uwtdCleNS_?iZb1JFXVLhY9r5*UlU(c{K+_ND0ga2R#|G&hdUo8xgS0z
zuX@JeN#B2lhp~K(mAQGJqVGFDKWfw<k}&tNg>r$ih58)1g6iNJ&qdqXSI6AgE&OC>
zsP2_@b-{B!PrSGJ%{w!{$x81tB4c>cEfgNhe(ni>|I%$q&Ne$X-<d%(bJs-~PSH3n
zTk+);<N6i#Y3pz0KZ<|z@sY~a8um3YHyum0O#iO&3$t$NnZL&>o%bMXv;vdIqdoP<
zXQj>9e(`SRMb#Zs9w_C6-eP*t5|+fq@np`%lSeDROqiYdXPUxP`$H9L3rb^hEjDQf
zFYj3P=-2#P(+}<yKWL}DXVc$hHvAvuUcI^<)aVmcw@{@>$B22yn;dQ9)u|rmeXf6c
z_@9AQ^@HEc2lBU*ADJ~S&HI#kO=Z7>U%{@P!uy5)PFCKR|C{yu`ajOb-wuCduCFsW
zf3y4XziF4%zb%gcQ6ARVWxDmros+pmjSZ6|Zx-!j=PT@avtI2#L(|?LY=OVCvo60Z
zT6?G5%5Sp4rwh{p5+^CFV^lHtRQY(JOz=m=;I&gOt=p0n^)uG`pZlqTX;Kw6mnt%2
z?^$JDG|fNrr%~on58s{Z_3DkL0{0@qPCiIUR=>>7lKk=OYQYMoe`$g%v~H+;wY4gF
zKJUJBe6xmj-1Ar2ymrTDr(d5Hlal^neMa-c)+e9V6za_Gv(WCl(^MVqnEj#Z?@j0R
z{(F1O_!Aql9!lk}%xk%H<>!;bY6W6boZdJbSKqLHrEVSDD}RMdWkrAA8-dq9|N74`
zrzGq?qbZwQ(4i;u96~LbW!snUv|JUm{NjX_zF$oK@zm_+Su5qLaJ;ry-saOm>E(9K
zYfJB`UR?iHal&1{&yHHki{|v}di76`YprEpTVf~mqjcpD^MgT0E_eujWhph%yZUpX
z;<kB(r}(z)`V#d<s$kb{p)E!WGMcyKEYEo2-WQVc#pXM^=<j;It3d}Z)rI};KV^K!
zdU@wc>C*l8S3Y^kwZ@vwF7EjIl<zOke_C@k<g^KE@{vBjqKac|hWBr6y?3`@Im5ii
zJJv*Bv=KC3XC&J3y!rb4z<5`=<7d?_yGMUGe|Y2F+T~&U<h2a?^jgFvb?!ajVSMLX
zEqZ5{-uz^lr7qLM&Yb5ioN;<(><ycAmcPbF(<;ht9e4ZibnDd9KZ7?(#xK0pSA2V!
z`{S6ab0Xa<IgEVXYP#CIwcxTX+*0-?JLK5iCpVw{S`zNysrWE<Q>DzD=l$zHuUmg;
z*M#k}<b|_7{%2Tx?8d!4%v&B9a!+uY$8g|IZDGKVez%=Fn*WO3KhtLy>5%7O!_)Wn
z_A+);wY54`y?X=>XXP%GU=@GLI(@lJ&FYI4zkVmi)tsL?J7Dpt^~%yA*DnWORiAff
z`;-*bU>*nAK7W>9zpr~fcq<(C(e(TDbZJrRf+G)v{Os)=L;sjR6uX+|Kl4c8oP8D2
z?s0zX*Y>aP|DiJfk8t?G{|vl;%(H*H)Lq!Nl5cydz~sZfLhod6J7Z_Fd*|bV`}?QJ
z99y&C$d2Up<o;=o=4maSmiY7D`bF<*{dqqe`S`W;l6F~L`M>k?KX}i-6&>)wc7IQe
z@uJLc)2~0MESGwE*kQsE2gOSq3+H8W@JMGye4kUa`s8<e*8dC#cYUg8kDGi{Uh+?V
zdU@gMck?`xH_dwY@V>oC>$_*43XU@{@=M6%GVs6Leq{PDu~zF_G48ULPRNRMst28U
z!g^OARO{_`w}+ouPdr+(>3ZV6Gg2|!Jk`lJF0^J&slC9slU3Lz#g4n@p>Mrax=nWf
zu~VO>PEV=3JFVcEFsEEp;m^J2kIZNI&u~z1e~LX{wC?hbQrY5|8ukp<BUUMnB0P+0
zGg*X0b?TpQ=i2eSwD#_U^*_{(zcGI}Q>U%}!*cIESJoa(*>NSI`s~{+Tk7}j&)joh
z&Ya@r%PZG!yOis=Hst<2j*^>Y<}O7un6s7?{!Hx55%92P&k22-end{(SBv}iTbKCT
z?lKck^y}rj{9$)#x}#-r;FzT{%aaM(PhUM=efrVtdgD9Gy|`0~>?A+LH}8>L=Dzet
zwCmPOYjtmKJD4oHb&sbU`+GZwM!z?Gj<1^>*4?;qv@+TB#ueQMv)qhK%sy<n<Pq|;
zJo)K4OM6YZIdWBVxnv92wqN>UZJ9JfTW6g>s>nRqcjnebj>nkg>f)NVn{rFA$lv(&
z`B=)Hf|a=$$I1&9<mTUP@V7iA%D}*IjIZWp=w{RH&Rv(j{LOt6^*#8C@7|pgj$G38
zcyxPOdL&oEyWj&10!9q7tG8YFqx^8UG{4!$_oXY<IwMot!fr8tZm?OjB-QVcapN&7
zuA7%^bnRAFf6M2oNDkUJd&c*BZc07t7*sepxwkidcRc3sc>S7w#viBdT@(+Pbi-<5
zw|AtnP5M;U*-sCgSG4+eHrucK$~mvwb9m|)vbPt0Q`_pIptYrIl?YD?$7BiRg*nL^
z)Ky+a|A_XRATjaY!*A0J4*tFx(>Q->&9PTiP3+E%;W{;}k2+>O`|f)!(a7)M0;v_^
zhgg0#I&4_u#h@UwX<sD|$I;Mv`F+>I&YM1)nr(Fc^O|YqUR~!FF#cY&L4<FIy<*|S
zzO1Ju@3`ZZ*Dn3R9lEWF-K^lYW=!SeH$?^(3{3C%S!yrT9$eSBW#^iX@>$h8&V{&a
zSmRv(z5B$u0`}a7UnS3vUq629>AqR1A6?hJYb-c&TIKq;eL2pj51jI7S!@^(&C^v|
z=yPG8)(`C?QcI>6zUHh}>^UmJk$W{#oWW>iNNSNMquYaehODXEg}dFionHM)EbF@1
zw3q4mO4GQ-7$hX@tsn3dpE!87uB`6%{11Nl4ffk^T;3D@(aAU3<D=f(>~9)hYo#)L
zPe+|N`j}VtNV(W&mfSNvFL#!kNwYM6y|?`l%Or~@8-${`C*1Z~wbV0k`<gu($Be&w
zD0e+rn{ZV$WfuEH<+5a@7y)MunKe4=c5j>9bVK)?QDKyu-@kWHPMWU#S37@u|H0ky
zH@UxU|G50k&Ba;M<CHdjSo=mG>XmsXOSrh;og24fr%g=oc*H7I*8jv+BA|fN^wW%w
zD#p1&hn43CoRa=<LTSJAe})I^tNt~v`Ok3B>7UB^#c_@+j>=x`(Kp?_rc15gcbjLx
zrjL6ia%+T}4E!Fr)@8q3om#HYC*(PCW6vc2I`;iF;Wra6KZ&_LPfd4Swd#$(&Hovi
z-0M!w=iHxtzVFuc_I)b%v;N6%`S7i;G-Ju-bxEzyX86n4MW4E8cSY-Oz-qArCyv|S
zoPOv(LvuafK9LHu+XwAfw@>$JQ@g9Y_i)TzuQCRy>`uwk_KsUV*tc-~EC0{%py?mO
zr4ni1>SLFqe825YyX8_jvFK!eu7P032TrXeTY7uuOmb%k{}TCk<I0zp&&sWMnYnz%
z&8L%GCkq_i-l;l8kBMo?wnueyuAh2VG3C|P;`>WIKP?rif2+28n}_d&{Q?^fYJT4M
zT+8mG|1J;ab%uS9UdQ&@eScG^e4ABz+tho~bLJk9y%BrhX~cxX5;o1#Zk^dRcX7-Q
z$2DJ9C%szurDfZd)DSI>V%a70vfn=En~^xLePWE><~0@{OYG#XtT*|gGEcQQzh3uP
zXWj1p6UlwA?&TX=sBGG`A%E}NXQx(KDYwo&pLb!8W7f6HamRC$%ly8nJ=2tN@#NYW
zan&xJakg!>3}5!Sui1MIvI<|WxYn<8W|fH3n@E4f#R2CoPDx-cy?eao(blW;yLC)z
zqeJ)BhRNzh%vlu^sk3p%e}-_m+k3U1ztwAhuU)C+VD-u3iAv?yw_K-PHte1sI5FjO
zPr+T+x_vQO4*GoiWw-R~?s#UV$H&PcrPtSyXgzoD^R5RQuPbc6`u4Wxo}EF-)hj05
z5Up8v)mV(D{O_F<2F}MSVYbVruJc}eKWk-iadKuN&!m}p=B9lg{LgHkcJtJ<cc*Sw
zzP)z8{j1}{dJ$RYkS#kd=4`of@k#o&t0g-Qbo%t9%;Mym_HmMD8Z+~R!(GQNo4Q{8
zqgwb#*Cy)T-(Alnp6|GPblFOc(<bZAnsxjtd2GY*GhM!7<;j)L(_J!Lr7|DNmT`0Y
zCVN~-pO(qFy<)*6>o1d310rXiob5l=!GiJ7$?Gi1OV`>ToR!x6QPRfh*2FHAzPszz
zJe!%o<7Bda8~1Hbju^8GLSMrb+LYI3R&@Dt{bx8f%e?g~_l|Yz9&PjV5#KK8srI_l
zs>3wf`=+Qz;OFBdOZYe*NZrm&4!&ISpF#LX_qm;$+8hl!CRVaIE-w^uF^b75bM<&$
zbTj9;PV>}dOK;qssMkI_szN*LQjPHH*HZD{)-Jm1FBG+=@8f}$I;}kuH=kbTu%q8H
zwxiEMUeC>F%^u#hM|Ae+K76*Ndi%t6dCVuK{mZ#LhvB%#p3O5QRy9Sw@%z_UHS6s>
zp<i;d)!Qd&uN2Bmo4aL3;@qpEE?MVph1`;PST4lyDJA$$x%ir`Yn8))9G0E>_SN~K
z)gofw%8i}BO*^_nao_osH)@v(%zL@QO2CNElRc`U^LSdKj*aR^<&M35-^?Q3oA}y!
z*V>7;MbGpxd!%O6s;{zZ>(;%;PaT>2(m+M_)b5?OZ>~@N(S2O(`n|yHl%13Ot<taL
z=c+`6Kg&?fv^#V!&WNYZxo+pvw<iA?ge&YHKE1d2k;l^uie1qq$Cj#|YZcIW>Jb^0
zn{~F`l9|c)vi6+b)oYD|KAJ9TxRtx<&LPFwrFZAeDqYd{(?L4lWcF$`pB2x~Y}2Y`
zW2;&`<7{4HxXzO6yUzS)V0C_28<v|Le9>*%hUnW?C+#NlF81=-q@mlZ`*d=JEVrB5
zbFC-OHkID4XTS6E*V4&;yVh)ojXt)odducxuNqcuscMckobY*bwRJ*GpH<k~ZEKU)
zR-8U^Ev#yeRL_RB=W-OU=#)x|9GMZCYxeBcy}w@D?L2oLurF=2l(bXXc6E>OhflYz
zAB#FNO+8?5o7%tYeX&9;fx?y^O4seT>Yj@&-dvSFcOA#`s>(_ALYC^&OxB8JzP@Jl
zpP~6nui5W_9XmEyr-d1F=7z>J9k2ARbxaQ0%Y8!l_uA&J=ce@n*}KZtCO@+0-(%Hc
zeDk*1kF>78|IW>M>bv(#xQc+^p=qDgs*|6t*?qokpTeHYCHwg+;!b_aczEB&d{*t*
zuWhsLXWjW3y;rUB?Zv5m(Py@4+;!r)KJCXWi+@Uc+onFuPWvc(ZFXip>z8k4Qfix@
z`ZBLbHg4N`wP(eHKOb78H$1ZQx}K_&%K2WoYa7=V(~PgY&PP7Ks<YkvVcW*q+~VBY
zYMp>i)mhRT&I)_%Pyd{oTXS9F+zq|kS<Q1A3b#L$m-!R1b=ThRfNNjnH#w*4tTJ8J
znkeMvlxse#X4azC6dMO6VZ+0W2Sq17(wC2X882P(mi>3uqhp_g_6ppIdL=$<L8WA}
zV$JSYFX7}8X&Luy6+R=6Bu94s191``Q|=3`FO}6l%)flkue!x~-w)k7bSN$Mz=KzI
z(zBdpQko7~>h@kv5t$h2VS6z!>p9Pz$!|*S#C}X)S#jL``r2oGw*#h~dUiFv-C<8=
zoLPy^(p%4BC2r?QCT(sw`+drWN1MOS^*`KxaGKck!pg|%+d;P`?VmOAo$7X#ZC0z_
zsxRp+Qmk9`yCD0_7wyyeA`w5j4;9&eJ2Nfp+H}pV>+-k7HCDXqInCewaNDH25g(t$
z?AdtA{X|G#>>}r-KeP{Cuc|(<i*?PcRVSu(+?v<4>XOpLefIn(3v=yjKOOzoyZcE>
z5MN1;(srfqw$(@FG_%htyM1(TTbuv2LhjPF7iUEe*%)!0IN6(cRa8BU*>d~kyBvQC
zt6m@3$9KU_^X283n=@{G4m3Ndx<ysM^pQxwc7x1WHEwQ23s%K>{Istqa-WoCmHNH=
zkL2>K<^J)4kuk?h^S)mztMc10No2yRXU|^TxO?LC<<te9BI_jHGtB#b?4Rj}A0Otf
zo37%iwz;-&`Pr1~yY4Mqvc{}q)pXxt-Y>zo_!tFm+MiW6yFSVI_t9gexvNAcn{Aov
zeeip|KxseMYa!=y)4OvfoO~X0yi}#!Y*MPyBul-m2c<V8Z?VeDDHP`ow-H_u>z(?@
zpYd?+is&<woL3%eRofEQIAzIVzF+*OIAnGmTOvQzLvmey$cNmw?MI}|_O^XGb?VZ`
zS$8kHZ`#^%TuVehzkIpR^#X;vTc7QAkKL25!&`8Vd*g>`D<4~K+3o#TJYd?x<wDUX
z*ZMzV=MiaT_rErib29t8MO(7MpEGc6kC<_MmDOIqi0KC&-9EZ)nptpUtY;?6_p`a;
zGeu@r%(HA=w@^7(w;?E{zo)Y0$<-UB>qUQbADk7pcbR|XO4c^ZS=o-Il_@HlljQ7;
zw0A1l7qkgPSwDDt?#*N6!%}?PAFLHVs&q;7OUaeD*M44mnDQaYW}{*Mxmn*`BNIw)
zIZfT}s4j1{X+jpaulzsZ_3g%Y@4gVbr!v`ppOCZZ)-7_{H`ID0>rR^FFTdj?&N5Rq
zbZ)=$8Bx7Axwbb~KjN1(oBdJi=<U!AebwDFQu_UkUv50BV%)I2bp7Oft3~N5o4pkd
z{w!~d-uBCGrF`eRlIou-TWe$XPMM#wb@!&|>HRemdw=z)NjKHySjVt9cnVG`vWOSB
z7aLcjae2W<y+t{?iz-WA&-RTD?Dp-*RbBX>!TEY_>ZEt6K|3S$82-Ik!<O}JbtX$@
z^5bah$Ok*8ap<dX^6eCs%)MbK)wX!KZ|!n-?uK&LCpOjoJnp8ut|!iwYvjH4qN-!d
zrtaV^jbaZ|tJj;E7EYZi6)XFG&$Zu6lOqIp<fP}sTzbCg${s_}tt~?53zwQttKVF1
zdg|8s-KTYxV=~TXbsU{2e)8VY;?FX(HvebfIJ&vUx%+5TwU_Vd)y}G0_jO(R&yaps
zX}X8Bf3>e0$2qsuLOX}wJCEJjt;>8^D!t>~9>YhPx$6?=F53|CUT^(Y|NCZAoQs=d
zJExV0{}ga7x;XbZ_hrdbQ8znod{o=NICH~GIlWzbx=y{)WT{WzSFLTkecFsW-#)}f
zEqV9G{^{zt1-Vb!a+<27&$@eCEvlGz|E<;X_N}V-bvDgS4%jHR`Dv=r)?4wBr!Lxg
z^qIHW^m+4y$xY6F<j-|8E~6l$d{&T%x#9HuHxfrCXz*R~Umg<|t>UEQ(W}(6xin1S
z?U4<3(jV`)-P|KJ?VjS5lFXiK@AEePnB>u1zqXGt?N`mmEjdQ#UQgFOZ7E|KbcWyK
za>@B0?t2m|AIkIJs!zLh*Zqlg<kq!QUMv0iuzT&)v!|kuh)g)TX2P5mDqq&jXS)}>
zWqKW_o&T-!txsni)6<u(^W52X$-;i)^76u&JnJPT)t}`xpRaM(@5<X_oNxQ}iIk0$
zViV`(*h$yjc%HDexz~D~dsLaqKJn=}``yolv{zjF6a2_F-1Tye_bTbn)g|jyE*@pu
zyw*jfho|y<s_EI@EyaxUr&%((J)U#v*(>#B%awn}dp_*v`FA8<w5If<zDLt{mk-BV
zO)suG&azFssXBDigc<MTzM1bb*Eu7&C~^}gbM@q|{|s7xt0KS5-d(NzGIV+0J%vk8
zCVf)U+R5_ybW`P%U*W%W|1%s+6N=^k$C>#t`pAC<zQ=9X?uT7?6BMbCYjsc3WOuLA
zE$gpM96jOrn`~dLRmpRFB|bU+x%jGA%hEhdg{KsysPx|7b5bRJdt7tZ?|012dBxT8
zmPbtGb;4&GZrvK|I%WTfR~$P266#wk|8$(VukfO9PW`;CSK?!$9p$GnPO+=_^6mNk
zi7^inp775s{Cml&eEp>dThh;6NG*DxC&A!WR2UUD-E5J^qr>7!;u_567u~;a{&7_(
zWZjLv2kwRUFaKv)AD>ot^gqMqzTLk=|6TmY`*&WAZKd37{T@?~Efw#5mrUAXS7Kx{
z`AvuMzgH?{JUb5_Ha{h`^J7GRI=l6ol0)-trdZFvT>eKo`nS+o_KvOgKQ!8ptmfV;
z?egJF{LOp(yZ3)m@chcX;biHG1KU@0+8DUF?g@4@Vx1Owy-@V;%(E+8Hs7w8?XYFX
z72Wq!mrml04w$CodANI;|J&?@b@deuN*WKI_gR7tq%FGsa9ZcX{k%1*+kCy9KKz@{
zH(g@mmXJOP-A5kFTa(-VnO1jvdm@;0z{6kW(%r0E<?UNVFYNIvxtLk;y5RQu#eEON
z&rdEc5VAEr?9%YQ=d^ONLhZ%*M~iJrK8nVA8o&9l!{bs@i!Zmvm-oCLIe+Z`GbpSL
zHA=gD?VNV^jKi|K?KkJ?>M3(7i{AZ~mXpWQw>9ax<B!?d#i}bNo!qlcdvftwLko+O
z_K7ur%gt*2qb_W3iu_Xl!`)Q5LhPAqcCA~s=Ca18IhCH=uLR<cZScL@dgA$<-ka;v
zyl3dBWJ|8!vLj9?IpcIDSHOB!52+@`z8PHm9WU*9Zk?C6sQ&-8f1&lsKlYvdFmdf$
z(VOp0IrCIbO5B!OlNf$=hQ9Ohs*m!wx@xr^KbqJ0@UPwj+p|0Si;f-Om=)>B@X-Ct
z0k+r23r`%+Us{v6;Ya$1{=@fq_6c=twU@{$U{>7P<8f`WhjXq@Iop&;j)4ab-fisp
z^YLT;A^s1=$D>sDcPzJBwvofvIk4zlm{aPV&YkDpybW6NPifB^6IHEAEA_4A9XpR6
zO?>QU^|tUogV-PQ1@~X_KR#iqF7$JMYTLC0?p;TYM(#QDw6CbD$ZqN@dCq<EKkN=4
zyk+10RaYi9ChMZt!u1Rl%{oh&l{|L)-+kDS_h=9IBir{~d#V%av|c^3DEXN;>)54x
z#uFt1V%AwFlqMA&zrpoe{9$bC<v)5Cl{oe1%C377e$H(7X679qRuxY@9*}+Ykn62W
z<rape%0cUm!gjv#{uq2bAfngk(68&hO;=VeF`G8gZMGHf;%vru{`IFemfVd#c5B~a
z*8UE4sh-PThfn=>>DevY8Fct*z+vS@f-i4v>YJ~9X4A2Sg%h7O?=Jk$P%qmre`#;|
zgY>qNzrl}=wjNtFdzQc_-U9+YS?=5J^c5A)Uz<7ek+NUUE7MKsWua}Q8x5B1+LBnY
z{6L(})tq-GJ4|NJp1F4Jgp^}vB%`gpjTdUUYk6AA`d0XN*l0e^H4H74m5cU_Sf@Po
z!fvyQ15Q6rm;7wc`s>?%R7$<wPVsMl{E@KfFBCuX-|2JkaJu=zsBrg+^EM&>83b%N
z^mSFHiS#|rWKm@1W3vl;(6oGqjbMEHe}=rcvPpOTbuXTvDynfhr0!0I`M2sH+ka>L
zXE-QR`k$fkpGK4BpWLOH8(&-LPc2a6T=DXiT9?`+VHM3iddFQR`AIY%t>?OwZT)Dv
z&z_E>QbLmcr(P_cu)as&<e$hV29{64e`(YoRI<<Q)))N|clm&w-Zb?qUtUbRmvZQ+
z6pKXg(}^9IWv6KTXQ<jg=|95{ef>A<7ydgj|3g5(i0{Mf@~t1<_XXC3E;`BM;wZ5<
zNnhcKfs*yobOpvns~*1P-_CRFXfk<jBQt-uZut5?@)!QNAMI%>RoEEzeev>D{~6l<
zoIjeIo9MmF;QaF@hC3Cih4TupRDWM(7F;{4G$;Q~rEG`D?YU96zKKlpWIiodys@lD
z_<(54D<%uhKK(hZ?3OACpZo65_xjfq6w7~Tv0KfawbI&R^YV@!JvA+GlDNg)#slZ~
zSAE&vIzRiP*zWrE-dvMeceIJ>ZgH2I5H0z*_4xBRi(6eQ`E4qXfB5w~eNOeq_$Bol
z`y0~sZ@Id4t+RimlE>Ob(ub1IPT8_%M;$lI4UbpG=d(U-{<-3z+Wq`9Z%@7SzJ2V~
ze}=2)b=p0ylx}?Ta+-fx!GRe`nZc5ei&xy@UtV7vcm9Ddci@NPZG3ZUvvp^mELQG#
z!Wx}-m7!;ngN22C)bAvDmSanfCnrB?w^R(ztLAe&_-FO;e}+-FE2{2Ea~zp}i!rQt
zPkN4zSI;EIpMBNyci-;$r`p~1bmuQq{Z8fQ*$*?W-A_x`y3NVsXu)n_`Tom#nJW)=
zZ{M1><)MnQwVRQ<pI`P3)5?@duivV%XzL`1-f@>u?$bVLI{T}D#T=zM6Z{?>w(0pI
z)Af0!`GvQW-8moevhE3dc&%l^_b`o`tqLgzZmPV0Y!}Jp_GX@kO!%n+4?Y%m-YXN2
zU)pzg`|itM{_0hV9-Mw+s?tI3nQ}%ecK6F{JP@~h!P%PGY*RJ1OpEY8XEulNf^d`N
zJMC}t1dg7nsJ7o!qgL!E^4h%iO~mCbtJl`u%619*9If{>=g2B?o4iWN0(J}TNfi>0
zc3zKsn{K$_=adJ1R==cP|4}b1`CDXRWPho?<mT=BQ-8lY#rME)s;PMAme<v>Q67mZ
z?++);3)yb*V*d(xukTa2eOJ%X+Pn1BH@l|4J#`9y^nc|3cB@D~c3<pGUcO1Sbeqxf
ztTQTiRs5x_DpNeXjPq{IEbgDKlJKvoCiL%&ExFc@M4v5xsOykjCx3ma>0I&P>gIy)
zVdBk(lBpBkS1KzUIyz&g;A-J%7C)1}abEpX{BV9}vGW7}w!%MN=7y%rRwnDX?!S=d
zc2hYs;%9+Q7a#Xjox^Phl=g2se<S%H=l$R8KQ4c(`|!Q1PUZ9?ey*6v&XWHOKU_^^
zz0Pr(Je28qE#%Eoblzy&pH7}N5tC1@pZAe3W@k#)mGGz2US_RZn|?X|@UyaltE<wC
zdSchh&W^ery>!?8XY(iinVea_xoma0)Qn4#0X?5YXESfRWL;esx<2=})g99Vn<^d~
zZ9L>C^?vH6`d0Bm%P-8f?Oy->{E_@ER)5fZkHwA;#}8Nh@z+WDT*>=w&CTGppYQHC
z&-r%ZSJJ+@AD;hFn9sNHlb!e<i%lP%WH?B>w#^7hwpqK&SHrI1!Sk*^T#;Xtmn76p
z|2u2<{DbU=?*C9d|JL`TZrI}k^Lc7~S1KDY&i6G7oKXGq`y!4L-+AiS)-_dV|KolB
zccbZJhL3EMAHL_my@BOFL&ocgKf5em%dQb;E~{#|_u%^1&&40@!}jdzx|Ds}JET<S
z=)S8fco=s)oaJ3{;Jd9`t@b(7e6flq-7?;=^GCj4+h~$2elywIy4o^w_7j~b%M*D9
zTql+^_f?1<xB0gFqDps!l=bb;_MCOH{}~Q$oz*Z=ucr8;xZ9@A%8Zh|dXK(2-fTK;
za&d9`J>wtWekUKi{~`bVo92fs(dVTr79Y8_>G9O^%UgDMyu4<?Gylhb2GQ>;uGi$Q
zGwdq8nl7a5wsZgdX-^WJd{$JlJm2*3O7YR`IGGP`r+&Y!zh`##Lc=?kJSOiGvyu3|
z&!^_o8BdiS`MRi?y_L0#9y@8L)S3ThI2ik%;lUjHjn5ChzhNBq@&23p%WmGPXg)M+
z-|X6An_X+Rf1fT@Kl{mDmt~$QL1C6Q2O2}>?g{^R^wH*G)uqd3==yj~OtU<wE7RC!
zA-heEKkMJW`Ui{l316|v|IJbp_F-S&Cs(Z>#Q}SwL)`>U=^i@IZ4zVPs(o5Redp_0
z|M+X_b<fV7B6OI;tm&$pWO?)cX?K>C2JK%jbN$^vk>vDXR;}XltoUY+Kg*BA7=<ba
z>PG#U|3~=Q-KcBcwXSa;+9fsiwW~9)|IZM$SwBZ&rCaQY!z_>Ilz&y)vUPT4+EvL*
z$xkQG5k4+|_o&se>XZhZ_vhX)RsXa9TlKfo_)})^ZmW~QZ|BMGyuRKp(?Np$>5;<5
z9S@Ri<mOF1^HQpB;ToGsj&jc${mhsf*k$HTeff|5vaadI+J}D~YfhwZn|Q1;p=Q&5
z{p-pvyN-QGTfcC7>%<&I1H)qm`!y0Q@6PkH(tmzmH16KX8@o(QpH1Xl-krSn!>8NP
z?oUrWU9{s|-G^5WHf@Q=Wf&(;@^wsI9`{;YGdW%E?~?-K2KF5<YFEemU07!t8FuQH
zy|D$ed`11&*S{kEGc-B;XE-Qp<NopM+B)k$!IxCz*tSm3-9NYG-_;!*52y0;ev3FS
zw5xwkZ&%&7y5x@HUy`+)VXOYd-uya~&ox*!)KS-J^BMaGQ|^E8`>XWr(dEbIk1?k`
zy5=(7_2T-}KC_*Z-!FZ0Qtv{7)9!^%^;NGp6<F1ON$>yIwnkTNd*7#9pWb;CY<qQD
z=hLZ8ifX*gt&%L7aZmCJjN=#Hy8fnfS@y2dZPOp|+8^3(6}!6KJA1AA`G}eJS9h`B
z|Lo?FYQZ9SZTEWq8u1VAE$@VKy^rYqu!tym9q}fFZ%25K_5;D!^JBXHMV{aM$1OSb
z+N!<cDRp0`KD|*RtLioTqWp|o=Qci4+fy5K-gU=r_tvP&H4ig#7Pls=9?p+BYP^pj
z=^*2|XHMB0KkQw$zIyq_E??`zYfCo8Ox+W@XGiC^Rd4GzZ@I81vFK31!%j<^>o1oW
z{n5SrZfSPm%J@?YjvadU&U0JJCxiI?HD$-DgLB^5NaouA3H~Q_c~O9$_W{pacQ%|(
zXZRJ~`$pTd%=+(E>lZUWesBFJ`=b2f;nmsV;=g`J-ma`mo0+_kpM_m-y-L?P>A7##
z9MOC(xjyt_opeQ?rfzQ1Wt06pH;xJlo-8++UVf%=dqG{9yrIfFb(Qa?mtV<q{86v1
z`n9cl>Dh;?w{icQxcK~&bs~xNWsB1;&g<a~*!v^)W869Azx|Ig-gQkY72n|2Aa`^o
zvzTpB$g<)aSJv1}{(fBR;)~wK53dhJrM}rN^=;|OEO*TvZZ3ibzjr%5)>*8woweb3
z@bzH-eILwP4K9_~Dhj3?bS|9Ex1y?bVwfF=`~l<Jdn;|M_8&RV=UZVD{II!Rbb?*T
zH(|At$}I8|{pWn#oNkd8z~^Z3Y_qBUE#`+`7Z_!I7s}Yc>anc)N8iz++fFkl_=-JC
zZsIOI$k3OmrI~ec_U!ci^Cj=SDw?gbv&(|ZrjyGl*+xKQQEO;{k!Rw;xAUgXS6iK1
zn73Z{;m_EvbrGTpQx&Fi9m)GAQ*iferH|B^s%`PUJK7#;if-@rWId=XGvUS0;O(0k
zd#<crb?e?i(bb-XJXxnAcJEGayvkO)$%wy>-E>v=i<IXV-o7{8Yjw?R%jKKvB<Id9
zNqC<mt|MAD$t%6@_|~ASHUSgvtZ5SESP^M%t@gm6sQ6FHynqLC3;LRSc5L5$<w<WY
z>y@0=O&8CcmOIMQ+^SglT+&iv{j566e;4Z+>)3Dm${#&18=2AjeNX=uchd(aECP8q
z8W$CAdHd^u)U~;iCqErEbFy1qFX+E=nttIH@2Ole9_!9tDPrSzVb1ei^mw*aee?P?
zlBT?Rs?&@%=`6deo^)qY$jXzlMN6;mX9$1H-fRD0qdnsuOZnUXL@VNt$Z77}alkmv
zJ%7pVxho1)PkVeiaU-X(qx;Jpc8eeR$L@a!zklod(Zb0OxOwFdiKTWkXEMLqtY;xH
zt4QfV$=?&q^Y-r5NC|zqYx@dsQPHL6UyAOrGr7%qbnm0+BbO>WzOBeLQ;@u=_A=Dt
z@zbKhK1-YHpEmwyV4eMUd5!$z^|zQEFWGQE&aiP^l(9=;%dGQWS9q^(?frgB#hkln
z+q;X>og&AIp59P;{Dh_L$Nfk9-}3)<_*0x&qx#YKk=W|>{*_y!T_y);i*ze$ZQM3H
zgQY0XGSpd`=LyfO7dFbjMe8ow3vIPkKJ5N**<P;u$5Prp$8We|5-r+Od*)8eQ4Yr)
z$;p%aC4y&tdGU1Op?y`8uh=emrMB|u{P~}<<Cy22O%#k~X@BDJXR&}oaRbBc#<vH4
zJ=%NyTg}J%H_tzOKfe0W`|f+pn|?GW3Qf#idVb~Ih+A9UIDF2tnS1PEpqrTR?@edC
z+ivan+xSECKLZQXkJFEHQ`|r9dUx7sgL_Y9oy<JlI?r>?^7l-S&fI=u|GjNf`-&Kj
z+vonU{>S0}TjWRm;qt2Xp1iGR(<)?7-8sMZ)jrX@RBaw@-Y1^P`zN$a&;8F(kudAD
z;Ji!W-PfPE%1q1r?78^RKe76Q`8DhhGS}AdKIm_WVsGocAh^Ic_U+?{&<2(D6Q3LL
zwP<U7;;RmSWq;`YZRz9oTSB|Cey!ai$9?(Hl%t7KvwH<rfB5XNenri9B^L&r$qH?*
z3deVwzO3h{Px{Yr^YR1s!>|2$|HytY-8PqPeT|;Y`8SK#OR8;?s9d`Ll24wVv;yan
z*%m>TZ@<XRUY_~wo^|(OJLzk(|ITlTTT}Jhy3?#}rr*q!s%Iuljora*l=s5l>*pLl
z>$w(}o5DZY-m(ytHZQwATjO<9+15udO^(bvm+L3-xbnc>ON*{130ZROi#@w#+P>%<
zNsHJe=925`58G*9`P%IpP~jakQ%G5Ta^~V!CvI>4y+z&gs$yvC56RYL3=@yXsb5RK
zY*Jz4{88xHsY}=6B9{D?nYC@ESr6}#<tMj^OHEy}-D^RC&5;g6h6Lt|zw-a+-WREn
z-*9p3X|`+c-iJnIuf0&w?w7XRcS)uAXLl`^OLG=K*?IeO!u7c)bI*Nc+%9JSq3=dy
zl>73VFOBYbZSruNTfD$0N`6<}<%PEQ-!so?DU;q;c<1qI#Xa7ST`z2n-rfD%I<!wS
zcj?|srQNwFxKDqIXTRz)!@_XtNrvQn(?c)+GklnHtHyuRhrG4RZ@;`|6}!k)r%LzR
z!ev_~C7id*nYw1J*@S}SM!5%BZ|&meJFz+XNBbkT?aQ*Fvi;;l`U5v_xRw;Q(>nRN
zXXpDR&DnXUeU9)v`QUNO^IcHa)*fB?h>Iop9Ixi-8agjFJ=n*xQy^=fXsUTp;x@B&
z>RUTMFdRA}vR#tl+VqYuv)_wXL_11No%HJCaoeLO<_BI(_?W`vz~XV}vG*s|-K{$8
zCqx@9^Z2TxWtn`{4^OjlZ{dpaFE*d6l_}1h^qR$Ck@l^MmVGZy3o)%)XK{=@HaGiF
znN<G~X<7TY&D)JLw|!W8_T0jyuLLY^)x0cTabrtVWq@r+YvJTM4+M4#dp+09U0Z)B
z`w{;S$2aSh=9;v2St?yLZBDk@W3aN~>7|;(Ha<I#Pg&Y1aq=KTrRnu%T^qxP(sSeP
zefUxIDKnvyOZ9o<I=RY}bI*3}s!S+%<^9C5XS*d!!pARCCs$?v;_v+9aNWGBcg@CA
z-CTC_A9<(#4isGe&Sb@<zYA}bC!CVu`Ftngj$`UWeg2nH`R!l1Yt^cEccxV=xZ>Ao
zGVxH85%2O&u{USB&KL<O#&P5w_gL$yepRlt_F=!+riv`>YnQ*?=2$o_;_<Ez-@pB~
znRLq7{@c@yJ0j+DmFIURE3<FY%IEx3{?YV&_nw4b$68lPSF`Spj<B&^ZQiLkGbvC)
z*}If8&t2iL(y_+I<M&Q}+xYP2<j1C4&uv}qYJ5C9OYGC<!`IK9*tl}y!E0+`b!0_5
zl?_(9ojiD6X6>>iHl+{sg<eJV-ig|Odu<$x@V%&tV;937<u2gn7TvyknvML|oZs7?
zR!iBsR^0jYR{U5T--qpod+of1#aq*M?hWe`-@5xl?E#O)>T1>^dt*Ksi>zAl=K*75
z+{elXUq6-~Su0d8nCToWHm&Sn{`)PjZKD%s_VjN0nYT7y`GH=|=^}of1rr<|evMqS
zhyQ^s_u;Zly{h@ocI^mWzV&|dv|_0>(RC-QrfVu#?|aj;mzkkJd;9E%Y3ucmY0C>{
zREci?WfRu%YjsB0tlkTT$EV+1eLFt-{GaH$>eyH1A}R)lE^fRsY1=M=j9<(Ds9lpY
zxV-Put|J16%l6;g_N()1`Oi%fSEUYzZQ1M~ZSiT=>jZnPZTDyGoa_BN{^9iolgeDx
z?!zswj8?mBy7MC=C!(NeTIU)^&2tu0798`M;K1H?u}1&#e)%8PN6M<EAF)0!vDq!q
z<YQ^>3MIpxKbbS9heZV$_7?1mJ@fgA{@G{dXR7#x+#m6`{bTv?t-E$<<~7&%Y16`Y
z?b-Wb@t=)v)i}Pmeu|iT_<OKt+Z#@%W#ZZQT>ZTCef?U$+|>{K@o-tzb}7$mDf3SI
zmtSd}JN4=Tp~?oW_@kBC)f+v3MtLhwJe2ZoO}FFYdVwF}NB&7)Z<%~Jn`f<z)YT`u
zI_fw3m91=#-FR6c_Mn@T_q3QVMGND0f4iFZ)xNtbrT9hEmJJ6p6DG!+&0qYgjJ5Au
zz23KHj;q>S8TNhb5jFgC`{UFH`^7Wn>2La2yR31w>WPT_q>9|Fx^CqX6IT3ZaQw)V
z?BDV31lPI5JOiKfu0W5I+i#rNaq&<1;vdZJJFYFW5;pzwv14uGo-GY)CO-A%WqTaD
z%|~X=`6=qlF85r!WXJS_-}}e)<v&gzyeH#wMef*LJyTvSUNP0wIf4dL=iJIVe1`dZ
zd*=N=Dh8$(?!0{cu)cj)?vZV47a3eR`18?h$EOPu4!*O|%3JvT@243zJ|4W4y>8Ft
zwO{KytwjIq%GfV(BT96S*)6xVQoV0DyidQ(-I{8*<jCO(;m^+Ituk3JJgqRl_}Cun
z52wB6@eALK{W)v<jY;oMZ@ltO|9#^mO;6`<^};S2epW~@+>_uutju~iEb>Qf@rU;h
z_ntj-?XhF@TQ^}5t7zYa!V2BI&pa2MULCEpsmVg%nE(A(oZsgv2h93@G*0Kkxw+Lv
z+}vM0#DlM@7yX&I>2OTL%M->20yUdAJv8nM)7JQ-`Qf9f;__apjQmGw`obB#zi-?S
zy7VJ(-F~r&Jnk$130W!ku9&;7_&g_P?2dWH_J?Qe34Ew6x!z<qZ+^(uJ+tC}%*fm}
z>+Acer6-i%T)t(Z!G22ZQ_C55#r`uzHqP}cU+$B=@TI%t%9f`)w`6-x+<M~67olSX
zLb}#r?!P0|8S5^*I#T#P-uKl7-uffA_;xRgT(;-pO&67lw_o<gpD3BQ>-=iZ%vG8R
z#k-UB*xaPo%o2V2^!O3o;zOTLwLY0v6B%>=Rkqp7<hxsSwrZ$e_Oq6Fnqhq4z=?J9
z-^!L*s!l!nYUZc&y?;!XXYSM4{?YiQRNUNh+o@}>Oc&0KTH1Smrr7n{<?ABP>Tddb
zd4^<^;dj4)>$$x5yVmW~?B29%+0JE03%M)BCuLe)$>w?RDS^$_>5}c*-6cL1&$Bg;
zmX+<}xSsGM=hmCfl|K@<ENMCPT`p|SN|{MDKmRkd<Yn(JlQ&nnHRHHCqr1dCiyx7t
zAHyztT>CQDtJd#P#*_9lm*1MqO*-Sx$(l0zZRgS~pThqPcApv>?&!JZ%N&|*nLgb&
zr+6Oc)_neolYeX%p3h$FZgO2L(0%do`iD<GtMGhWBk+nX+Ir>50CU$34c_bALS7$E
zd^}&!api5_<#+BnT|0XA+>)HH8s86iCq>T{S@KDMJJ&t5;K<vAs+Se}4_V!B-=}_a
ziB`&v9b(&sv|s;f?Y(+fc(TCd`~^EME$O}KwW05krKq2|c4Dt?wdeGQ`A4nu1rIKc
zch1f<JDIli!^O=WLN#l;`4%oZsrG2Wgs697vNx|hxbCBU@Xa~T3-d!N-#3}Yi~ZQ`
zz3;<+hL%4Llf9Rp6uq(i!{?=EUpSrV<-b|u;2q^s*2J0o%*^3dIQ!lmAMXBJ{BS3K
zzuM0FH*Xz01+MA6-(zq==k=#GzDbX6MH+D$v48SZE^w1ME_?Ov@gwtpxICCxI$QGT
zyi@N^eLf<U-qE^Yr`uHZ{cR5%S035P7$lK0)3b0d$IrI<LqAnMl=r55uo1SMdThJs
z)g`)%U;dik_AV+rC?$0BrmHRAc+B#QVvcLv5n<|C{`8*SZOPqh&(^v>ocK|{IY-aN
zvi9%#Olj|Y!z){~{Y5?JymPi&xXfoeW7!-{r}JCb5~MB5yYjxe?YxwH@#|T)SFgTZ
zGf&xcEy?WmTiKwD+%I#(ZkY;B;@V;Cs?|K_-QkdX!k0?tOTN5yw!hEhbf?lJ`R%TH
z+j5rmY0oaZtvKuTq3MjvXRN#1apAa9>w|3ux)olZ?4^HH2YrZ}Ycp%@)p@6HXGe#$
zhwPbj_k?G_?H`jQ)+IDbFu1I_snRk<eu~u0Uo+*@KAiYb_>t-IaXaA+7xtLyT-U5x
z#A_aQsiXIwcXRa$r|V+oMq1XJ+zTb$3hYWB9$y$!VSMCTys+Z_tJfnwhW7q4;jLWp
zpCKh~_079X7uU~Rt|K*f4P)1CHX*f(pX)0eZGKH}uMxR+aN)(JAO1Y$+%rGm!_+Nh
z;WDe7Wf$MO9cwhF?M9SAl}<XtgL~&6`V0LCI`!|EcWu~*%~3Jl>C10rPv@1X)GoBW
zyXRZ+D&bZp*-7i%l4UL&o^s>E{vK(skL-W6EA&fZRXrx1OuAHe;gYL{^n!?zyJ^Ba
z?-iw8CR&$15j=7Fa*biF=(3d${e?5XM;YJI+`rBH$2uDm)t&9!I@`-{iEN5Cw#q#a
zDAMZqGez>&e+KD4PW$$K_%^$=);eOQLxX$y+T&^6y4&t9leG`n{^@)A)VoHfdju7g
zl}ave>6Jb*@yC9r4=LMTS|2RAZnhySaKYUEGuz9{Hr>5-YUa}^hfcVEOn%0?i_h!$
z!}LGm^51@ckUzNp#-aF|^@mn2ujoHAU+mHTw(4tpwtN&RixOJU^vOeCrS0A)>we2i
z+KE<@qBozaUNd6<`SbprGuyulymDZ=WO;~Taar+HnFq|5Z(rM=QvYDfe}=7BK}U2~
z*Es%|xFpVQ;ewZ!`*~hWGU$GG`AgU&**6zdvi_xBnI5z_Ax*8{Qd#}u?4Vs4f4<CC
zKVxzC`aZ{3wX46`@tqEpvA3DF$<Eq*{rTX@8@r2+*B#A0VI`CN@wlnShJOkSGAZSY
zobH#Nf28R&>A*Gz+rpRk*Vd*yo7O&WVwQ&Fd`T`&?j0Z4DxQ44w0~3o57Yi{aX&m)
z{#bo%|JLw6leO_jq|P@_<JESXcS%^cw`bNCKGoUZtMe6iMKpCh?`iR_oFlt0vG`Br
z3%w6n6MgsS1j?KF-ZgXoY<S@Jab|^b8=mK){}$GN@au27Tz97agFk;;J?o$9r7xuP
zySK>d#J%z{xnX*G=6X}jS<k9d|DD^}_xx?x??b1~mFFG1Uc01!;$xYtrEO34t@*Y|
zORu<S>zmq_>nip?{Q7Qf;luTUKNkC(*|bDwSJV0OCnvYO`6L_}*0E)sOND3OI|EPA
z+b{P?f6QIF`bXWl`yrQg1Lt{HESe^(CU4njBzf!R`U#4GpH}v=6`6g~o@HmbbKi#-
zS4tn(OTT<G(OG1Zw6~_BjLJN>)gm8fGWBe*Joxxb^4W@i+gH?B@4WK1RAb9pGv1ii
z=<eGdJ>{40EIX;JTbkk|e6YO3!$O&bZ~vs~@LIvIfBHARl`1{fz5b-7_gbyz;SH?9
zjykiJKG|q!xvl?AQ0C{=E^H5?WF9n6a;?&_GyZsXiFbDH0-KFTn3T^i%bJ(1^?_&h
znmg~6r=8w-KFl`z`P<-Q`_w<yZhE~dZ0EX@<$OQiuGLd(Ox!h(CHG~{b=G_0%=%BZ
zbnYzvoMU0H>-{0^a=_H}{}~?Ym3%%qIcIydiuBIIOD402Nj@>);b)(9Xldkqk3N&?
z&Hu0ei}_N2^O}6qKbCmO8r$vh0zW2snmHC$T{z04Fp2rN+}o4eSMyA|)6-D#BiiYM
z*zU*cJ9e%8&v2xB@3m{<ZMuGMJlKBTJ;m`*rReCtSFHz_C1jX?bF*&#(GmTkD#yRD
zxY(rZ+fpWe%egyw=OjGtNnftxAo`*I*k56v%|9+bJm0uaASEp}{B70x$x2q<1)uYE
zQk;sCT??-__Dnvwe%`5%pXZx?{cLyM`1H%eQ@_Mo&uM=v|KYOtg*}{!l@DLf-+1HY
zx^0jB4Y$RGC#}^!;c=3S;rG5BM{5s%xcuPT*2m}D<U~IDT(7F_@?CU8A!A{_X-nW+
zeuW_Ws{2RPitfICe*V@yUTfDMnZ+`x%y;e{T7B;Er+shoUL9wce70^%4fn2#U(Pqg
zakK|^J!6UGI>7w&q>AG_!)Zo~-W+^C$?S{i`zKd-K0I??+ic0=jxFNOXWs5lljS^8
zbU*8Q&qD``h>6C3T#eQoko$SIioMN_ze4{&`Q!LYXFkQdtrLq}mr~p&p?q4RfByHn
z8S57%ZMmc;8Ki#qz_E*0<h{z4FMm-GVPm!Ab-qYf=)BA$iH>pnXB=MN+Fke~KijRK
zHdrn+DrBR;s$V8G+#gSe1lr6#8G5t9&)v2``QxALWq;?_*?O*8Rb%<_PV?KcgJIll
z3hX>(%Rc!Pxl6t&d>tqIG5@HX$>qfA=x*!SDBi_967LJ=u$_4De8um>Kd*1A*!++4
z_HXwe>ffS1e1Cg=MMZJ=_7BTDg?;+&J<E8za8svgTBw^)<$0TfPc$}KIjx>1c|fKA
z;LE2%YdKAG`CoedT%&PLu=?c9s&94||4y$dTwkN~cf}U%xrR1Bwo12do~EYis8`e%
zQNUq$<X3V0qW=sZ3icn&6@L7m;SJ}*`?vhPCaHcDKlJ;{)+>dAdbi@%D&0Ogaqmp!
zwtBUsXv>=?Vm|(u{^37E^v8SK7s_`?O?jq0*Q%`Vo_2_%p}_;4ev=l~=Mt$5kMHgG
zsL$EoabLj3|33pu_($<0@*;lQ!|fDvtqwi&;MPfgD}Le7(J7PGDa-zv{`~0++j;Cq
zuP*IhF7e&2ynn-nl?_v#Z=L^h{;?~wN*A4YSzgLyBqOkV;a8UAPm4HjopVy0C*9z8
zx4+4+;=$KHS)O%grrSAo$iCyA!!xf+Fm_sRV!qvm{X04H<<C4*Wt=HKjpgeLKHG}7
z@i&Ewz25w@TOAoc@pZlPYx|q+-vYM$xVrvy`Qyqb7r#_nxSqLuWaB$a#W2%JL4uN>
zJXEC{3K*a5ueTGbVcr>Qboe0XAb!aeuWrRI=j5B3US1Sm_+;x5Loe^0KW8}|nLH``
z7wB4Q??2o>B!6rFJ2Ibd?UwWHyYhBEwypPWkGWoY^FdqXlfC;p{9C6*baz*m90}CS
zJuQ=vus!}#{f~_Nu3dMg%gJAeJMR{B;qR>M3JLd(4LUYALmzpXO$amZR!N>X&tCNW
zjz^`db`?gcFaJ4z(bGGYTmhT!?>+x)^TYjrgqgps`7t}`+Ase@-FJo3&fWf7AKdM?
zon@Y(u-oU2@?THS56J$c|BuV_w=Mro{ckOMe@K4px)T3m(siecUo+D#>7Urzb??WW
zW77_w-5NG2;M$ur{~5I2CNP}ytuL>N@2%6kdqQWA^CMlSk5lYtBz{_aFJ$5l(<z26
zj8j&A<~&!xx&D#xKkjm|&dmP|tQ;R(_xKh~Ji0JLEFn+mtxH>^xXu~LIg;_Vec|)A
zJ`6nf>iWvlD*K+4o>ps7c&q;X)PIKB{|w5XIrwjGjx3LLy8K9V&kyPP%}YPLxgf{x
zSTgZUxaI2;417CHAK6)aSbiYFWUhPQhkL6ZrOp&MnV!Eo;>Pq@4`;M{F5NJ9aht+^
zgW5HoKMP-8_2r$rMLw(T>70D!Os5`3*$*D)SBO5Fr^lGHG2PJc`HbHTfBmm7e|WU2
z;8^tCr|#@mCY67i^!q=<xo7<c-^*sp^M0*f`XP2*zs|2a^*4jguY4I0cgK<UUebif
zlXi8dRXU!=g*ZLQJt$rIGx||}Yk!k>=JiT@{popo#I)wHtCUI{SAL&v`gRvXWR2_6
z#?x!B=y0f)g<fr6zs%xA_PW1YYxoP7)p%{bZpy^ld#*Rp#)s|F+nGX+Zw@w`zrywV
z9Q(1j&5Q5H@A!F6W1)Q6_O!a1rQ2^jjDFdda_os*i%ie;^tCT%rOjM@JFCudo+Oul
zF~gJzMYm7A5Akih++eAFUVXcLfz3&t%T1zwPR$2o_ts0@x>~w=t^eU^W^Q+HCa~I^
z{TaJ)9)s`VOi7t{mS5Ii&c3{5u}VLmX{xUO)&9o#Z9$oFYL{xXKbRjX%<$M2EUB}$
zNn>89wlag`nb}iP#2FjU)@R#q)bA?M7x*K(bGF0OdDXLTEH6z9HVE%DS}C2fLE<E%
z#0Q6y7VAHs{X2d6N3q_=y7u87%s2EF=jriTOs;cUIC)i1k#)N0-{=1s4(ix=W<J)H
z5B#uqmuua1vp_GglrZT91?7*mPdyRd()=>=<6g<6AK8Me-*i<!Wq+~BX$m;>e9Mwu
zcjNwE{1v(+yK0Hl*(0}H&z?G2Cz?`PFzw=U=WVH>22+(4{T>ycYA}qN_N#35Biq=w
zxye?09v)t@@F|P4LQ3wrAX5p8wBzy9^S7^y{Golcs-{qHetG(`pUpxiS(kmE@Wsuk
zTtsUJ_u;}hlaJX-yZ&%}bhlvk?7Pk(``onLc{(b%oOus&*j6x0u7BKdVe*T5ms3l`
z-u%ozA}4S)KS%9iX|%|ebWMp_pImzt89gVgpTT9ACd2!~zIvVGg-iS7J(v5d{M!3=
zvOx4q$tRvOE6<!32s}~ygC!?5CZ#Yw%JYNuA+c5U4>fmhbts-X@8#SLj4V^TRp!V&
zzqKpY-s6Yq!yU;@M_C_)9-p3_yV1a^SaIz%uIQOIKDrA(&biNH60Iw8`)G;XWzEmL
zXV>nI$(_OEcYNZ62aTWEYPQQvd-DGN5B~$(W+_~;iA^r~s3hro{^sH>fpf%ElbkFM
z=p32$Smpcrjl#!f$@WXBb!})ok@@6=`roU^e3S3g1bnnTQSs&GG}innx|{g!%z1bI
zMdljecWE2r+)v*Zv}25`asOex-tmDf)8(M%$ctM=CcRyEEnfSr*t(r=_ZyBF{&YC-
zW&LO4Ye5=ca)q8h;n$na_Dxvm=v7C%l$4rgl~&~yCzO@;Up0&8j`(r**8A|SldL-z
zRh&IKXVa}a0<Vf^>fV&yYnNxcG5+c0kLmt9ntpwDonx?l)0MB*7ALrzOt;=X#+WCO
z8vO2)#p8wN-_(h0_X}P4;y;7&=X<tUB@3SJz5n&6yvmP>dXIM*iz?kcX;ZLZ+KXDx
zw|!I38yo!G;CKGv@wl(|@30&02^V62zC7kh-@Li?e@p$ewM$P6cybxPs61QuQu0Ne
ze%$Px_iMymCm-FmeY$!!tKrmxHYY!=|GM_KKG(6-f5$hpC$w-J>iJ-mQgVK$>|cIS
z{X@4i&Ufjg1Q@7y<i73c&$~10-$whS`X8$6-#C6;eQ1|^&sXd9f|+*OO<`8kCaWG@
z^D%4HgznDuU4N&j%{$|FU+<FdQjg-_*R1P`J1p8HBtD-ttF`BS5_HUb?V6g&{~1`O
z{AXwi{?BmO^+%I^m%X@@ul~b#(|*oN4Vs))q<(M9mXqxH64P=Xx}Vx_`Llj|u668(
z`)wxP`aBg;SKpMZHDcMib@O&d83AXZR*%OK$Cy_2zm7M5DHS*Q!Fj%j3j0G=1(&~^
z)w`RUo3O<?Oe2|rg?+)}$#*{aug#0jDi52u*_~x!^@IEqZ;EW)cbNWpdPMT6&!OF`
zgY&vK{;rFhe)(`v$b<b4<{j7X%h8)}*!ftxAhd8^Z6*8dKCN9pW*uZcw8-Z{-KV(T
zc@`(_AICY>BtG0-8Jf55?b|152~Cm7VLx|<-ij_%e>vZ)JL1R02eE9|c!Q&MeOkLt
zcCn{T=R8i?aMduUMkD+CuaB$ktIAZq{;fRjm95j`;O&#eUNiJIeK^RkZqs|apmtMM
z>J`(_j+6O%d<MpSj9*?~fB7SPM*X3ad%U}?W3?Tw<O_YWy>KUbiO@Pfvv$E#mySi$
z94<+I`kZNx^5gX5@qJb1?O!GTGo;6JyqGUg+H1mZbRg?}uF;evwYxkUoMM(sJMD{k
z!oaS!Q02{R-Nfa!{cG0cmxfHJ+@!_w^qx^mLt)R#xAU)Wb<i`ty|CNU`#bCPGs?D}
zHyn>|-|?K8{pb20?Y|5DGaQUt_b2F@K!ut=$L&)yx<o!qy~eC@QvR0t=hMvQ%bAxu
zAFXMBe7<x3htPPb*n2lC*1dn!dU?}gPu?E!Ln8cbuAEC9^JXMo6g+u6Ap3e-z|z$#
z<@Y>Wd2arpe~*9tyJq^={!qZa)sJf34tqBV9ohT$NZ4*i$#ZF?$8$btKjiPI{}96e
zL%p=8eA=%0{a@-O?q;63xV5d7IlDYAY3^EyjENKZ9Ho0Y7JOg-tljB9LsMzpjd+Qg
z^HMM8ad&-=&V6%s?Y-z5ucIft&As?4?{eGm%9#=CeR{$#fM!N>|E^5?5EG~Uae9|Y
zJpZB@lVZ&yw(QxNSoEjTvo__@(Vgz4trH%<?|RwB&FCAqHTqZmft>+M<KlU8YKuQU
z|HpOqx1r+_mHUh~jB8!j8uThnkJ_{SlFsAa_-EFkrjj=gSOy50s`ozH=k~GwkLdAl
zC$5!rXVe(3i1?9z+Uaua%Wq8|m+=^QPWyYujgK!hAbI0~qqVjV?SCkRx4zw@nfz$J
z>>tOEu4|9%^Y|^_u6S8Lp)ASSrfieb^lm|ghS<~dPM&kWHH-a^aQZj>4|1y)y$q~K
z_q}S9qSE*L&8}^0SG)|rusZ!zrS9CV9P1?SdVYGs7*g0*7_eDqUsv2YoBP*iE;_y1
z`%#(woZRYfGyg8J&*B$2zC6p${`#Nlnw$O`Grxb{)2IBP_41b;j~b?&yZn0}`#rVY
z{O$WU^1s#n$Q-)!;un1;--UOCcqYC6mcP(Zal*G9(}XU0Sj}zhSGG7?pWytkuXE9l
zrMba}H)h^SYtNoN`*g3g-<}>Nek1p;calO+j!)j`K7r$yQ_r<|jgKYPt=(!b`*O`^
ziH@#or=73m$r(K1xcd0=SH<kSg~HEL7}mWHsywt@#Pg*Wr~c~;FZzOIpS-I#m*=T}
z(6L{(CbPIw|Hxf;{|`I2xtC1$GyKuowBTg=r+me!P7~ax%jCVC*dx>UH5_yr^u+kh
z?QJ&ff0uvskH2E$zWQ94bo#8!J!Y3qcoa>%mG!YDcVhF-D5nRt*PNT|<7|8%^Ygse
zRlB||Uu8qQVAj!;Y1&6(<$gYL+Fi4IuAU2D&Ar%~YwQv)vbXNZmpQ)b=z_iTRxXXm
z46IzI-e#M0EXcl6=d^XF+Jn@X%7;4+t#_)anz>DB*}D3&_J!{3UR<x#Pv7!C@K^ic
z^L87{2lqLDn0wbNaJPBy=ljo);j%H|C}-cVdzNpn-rzmbX`U?I`N}rl@#D1K;>Xe_
z6h4)_HFoQqdanNwXYlz?jK+Bz8h&c)&*JL+VR3w+=#|W><cdkZLqC3-TFQT`E`O8n
z!|eN;?)od&Y-ni@?&1h@b=-06(j10x9jmjC@;PJnx9Yt4lbP~s?Y$MRZd^C{y=`K0
zLt9vMukc&J!^$3xl7$nNGjKhaGrN4|mYm9*ddYo~jw@qher)=6?R?y|=h503TVH!?
zSGP@iVk}~AWtn|6wL{eXRS}<m)Ys_Q@<O*?MuoSOSVkSpoBcLV`Ksdn^q3hB`n-K>
ze!f~Vr)jRo+hd9Te9;xh<F@=LO;($^D&hvadDz9fw_XLUJ&^EeN88t1U*#0crqnb!
z9J@U0X!n6Qi4QHm<{$CYRs67b?~+W`_HWZ>moD5s<7R~5^T@o%Jklz=q8N%Vd=Aub
zF9|o=JMo6+gIN8*kNYP-UcE!oM7vPtdT-*&jGWFqo131ydRr&!J@WG4yLhg=tlRU$
z8LR&cty|BFERJ~{xM}a2xXdjdQv&y%=2<^AWuxD#j*9zc50;yDr>pn=v3)S(U5)X|
z_&DFyr`|-J4&1swBKPX|Nr%I;U2m$)p8jN8O=Iivz{{_v#c5nI)wMtHt4D0J*}T;@
zpI=#}E#y<(;ixQFoGH6@Mo9d`zV89<>ZZD7rq8wqtG|izZ`yKJ``|p;otrPNf4@X{
z@7%3t{)z9<SaOu(x5>+@ROio$p79^P@J1h8yZXm9?(;&Ku5V2^7^2U{yKLWkYeTb6
zzuc0^YZglG_|Fi$LvWtf`j$PFD}T&C7M%4@;>z;97fW7D3u*Scx@N0Hl*WZMsX322
zms_9uwCq98_qQ=}&5!K4es~}L)wXpFueI-0)8}R%JxzP>x4cWAc>B!U)&tqgh4}YQ
zSQxqc^F(o{DO+|~t>=Ahwe@?;*15&ryJvlS^rT~=NpI>`Rp*kQ$+GKqZ2PuqVUbUy
zg=DBK<HFT1Z@D!;oGX6#(^1xzT`iMipLs{mHHx3oF-7N}44X{Pw!rz%Wd1X79(%TZ
zNyXwL^F%KF(YhsjY$fZRMV~y^wf1-BmRsEDI`%6&@^PuWg{Gv$%acddCZ;dRva^vB
z+<r|b)FdUlZ2RTBuf9?R8<@_?o#fbbCq<oqcits7kJVw@mRQ~nD*v!{f7d^?%v;Ld
zx=*J~NNVy3tCbFH{IjFmfa!zhDwp50pR;x*uo+Ie`uvyazqt>+&kI!S`W|SNdiDNn
z(K+QGv*qNsMR!lvmg+Q(%*$zRJt3X&=}F>*1vOhQ?wj(>PT+b?`bVW>Z}X%~J5E2c
z=CymwmUi%d;eyKP(GC_y?;bE5Y2aMjk+{>J@#U@Zrur>jS?0bvmomyX+%@Pjxn*<X
zkB_%ajz62q9Rm&vOQQ>#@y>ImdtcYzBQovQ+TM4YW&d6}FM4$D@>|Kh3nZA|&XfJE
zvN11b?pa~Q=aVml&iWml-zk-Uc&&ZpmTj9aKHT2-*tb1!^X^@qs((LkzWGWlJp9$|
z$g+Qb#8@V=v+b4_e0fXteE*iS{4v#;>%RPsNKRgP<CWQUg)>KQi(BQLwR5OA!OT(j
z@gURol6rxdJK4MLcPs3^u6Frt*rSx~onLyRF0A5hT+nth<;vZNo}cdebJnvnNGtvh
zFRNtjTezU2Jo=;ik$QocxQrFbyC>cLC&X=iR!HGVrPrZ{`l<~KO9YJ~o5Y`K??`y_
z@><~Q`<z0uJdTg5qfg&Ro|t<^&UC9?fKHUl#GJGP35E(f4<2^dZdmgscaQ9cC#QL4
zh0QfvSj@ty+8tZrm!6^){;6%tWyQqpb{;_-cZ{!Xu_=78q9$|ckD$Xx3{S6iSonVG
zyDyP7?m~vS6Sq{g&D32Iu<g*{XKq1DzR7e~clrG~F+XVchxZM8au;WoiGSNCxBrUC
zkE2J|R9(H_+P!?1OSMVmv`-g5l{YI{dGNCrSjtv>xHsp%xM{!G{`PBU?b0R(&pv!{
zri#G9Eoc93PA}aTs#sChT=h85fVDU(Z@<od>G;EPavy!SuA945VvYUA92?hMK|3$D
zgkQF2dnP&SMXU@g-8!9RLWRuMbsG~uJo_E?WA@`%W%mzHqK<4jniKEsEA@Bzt`oiK
zSJr;Do*{VSLFF^mlZSKFyK3&9eDbP$pUn06NAic}`g>enuk<m;h&$9f^h)B#COZ`t
z{!LkhH^dLH?#r|}!?RL{E$_#&mv-_$+z;)lTX5~3sIY(0D!#?l54L661#Z>N4f}Sl
z_P`UBO>7dZMMoY_y>3%pyS_#{nqTy#)V$T1m6a?j%@*g&_kQ{OE$yD8RQ}B;@&-Ru
z?nqeh_HnG6^&oTCx|NG+OfQ$tmG<1e-9vBIZRe|tFXqX4x8GyAWwwy@p3@sPO_qIW
zZ*Sak^R-kv_WO(V#0N+B{J5F^sM?n)d+Ic4<-f~HV$J@TDKjgFMt7|D-#JO<$)A~$
z>rE~%`H<gPvR?9s)_;c3%^yvVEtq~`Utj6V(%(&Mo^V%u*;^!$a3|70ab{0#fTgSG
zCOg^8S<{c?W*@Z|)a`xxckP~!2UotTVm&v#Y}$v#KO?U%m~rGG<C$WPPdo20n5wm}
zzwzVsgR_5fRqS;5ziEn>eE9KG&f<x*N7GeZJ(W-kC7<cRpC2nUo9$~V-nKfqX}<4=
z<<0x#A}ZqjyFMQ(?_BwJ(KYLq`3F9pQ0Q56vGdDB6`}q)@_GTG?b>r2`XjFY;r(cT
z<e%b)yKldBGUnP{(%5&ud}(yWB+by1rITbspLBgPlga<Atnl}#%H)vJ^J4cZ^bgfZ
zZoTMxuIsu{%!=)o*De0A_(TXBmrm(K^;>Ml2PTNhe19AtIPG-!kHg82q~B^8m#gmW
z)6?5yyvo1i36Hkf=0wd+1ub7P4t7to3==I#DL%V-$_Mohwd*#Ok80VxSLCIi{e3$3
z;d?><Ri0DX4CGz*bwnS!%j{Il_x_vbdHd?Z50?+xbLr*Rgy)JkuhZ4bRqZV;k>g3x
zd1!E5ie=KaXD7lKef;i--i%xQ@N9bI71R5InN@qf-`YFHdxiEPQ(g18Z4c}Mb>2Si
z4^FVE<SSo)NAkgS^@rNAPKO^{z44)id%1_&)=sy{yw_Wo{l0N)+CSyU2mcw;PbT(1
zI9HG*QYEaJeWs-RmW`b4<vqradgXn$e`ILXQx*@~aHC?18?&~a-d6w3aeSW7jKY<l
z$!hQ2dv)oD^GAP}{0)z6I&uGauEwUF*G;*@a$jy(mD$g7&HnHu&4%+jj8Fbt{h0jF
zuYFa<J<%(5DjDBqwH`6P=gG6{+hn`d#XRe`<n{e_Qo47Yd#d828;`l?^wlce_xpHm
z_D8OJ{`^_9Zr_^i?WCJq8m)49lHu-bS*!A<kJ6hbPMwe-dWVD8e6!3;?YmO*<UhDB
zZ{BiWRCQZlNyn{w&rk2{_UU#G{}i!l=ans%&t^LF?|R8~g3Vj)&C1i&Gxw?eF=~5u
zN!nhdcG5pK?S1@`EMabUTd#!s&E(^F%J;!q$YV`EZ<e{8=#RyZxc5fgK76`T_w0%E
z4Hws&aDV^I?zVqN$@aNBpOsAKJA5UfGQF$L<mD~%gS%(j-_k#HPvf%k)V0a}Z@V>Z
z%5z2b6$qYx8mVlvaphr?ZcU9HWm;@*6MAlMa<|zT9De1O^s#$7dq3o!Z=D}=RpG<e
zIn#O>+G_K@A6BXK;|#qlWW8InF39TCI`&gWR`C~WlyljSt__a6^rhd(HezS2*LjES
zUE$FkZSlX8{dY#5<NVJMt)i`0RQcd~*AL@IvG<ScZxxHv{yW`NR{Thm*xX9nIoJ0|
zU$cKG*JnNB*v$o#E<Ju5D4A5J(iSP?apM!?ns||0ua|DA@0L?;)925=q;=c-+kS4(
z)%VyM=eX-$eK+mpQ?;VgTBk0~d6L)}^}0_i_f_$EasQ0D>22#x>Lq^U{bz7v_WQ`T
zdhvuqDpwwV41FSW+cHSGJ-F>$peC2I_{8{qj|wvHCtP0pZu*fr(YE*>o+-N`^>y;}
z-<xFWh49R|ajH~8)iQudpu5Q<fwj2m?fq_>@+F!3%(rj9`X|uz?w*Nes~?^hKAxKY
z{K(OW+YxupZ8+V=V|L<_)%>Z)stV%;_jrEzedv~G-@->}7rs2(-I=oU^4I%(Tdvn<
zbc$!+du4Xc?yT9vX*pKSr=BGAt+FVWy?HWPV%~|@Cbwt4{ipOY>fPkUCm-(3e3lWX
zeV$Ku-g}cbsoSsXL`i3E|IffUQ(pH9bL`dL-t)c7_Fn!Iz2^1ltViCJOa5KDZ2DvE
zmB~9(Y9D=)*>LN`?&~b884vSihr|p0*r-#dQlahoQRmvN)}C<hRWGHkZav$3AcZgN
z+M!=5eHHWbm|b?JTC$j?SG+rS*yGCLkM~w*KC}+sJ?&DqclKMO{|x?Dl6Tl!^sZOn
z)%!T--$xlf=bqx&Q(lJO`z?>pa+}_2Bl=LDFT34y!<Asy?K^uPY@h78W#`4^(@F}&
zPi@(0bW2i2VX{ujem{;pJ@tmSPiMWleQbHaH0>>s3+z<e?l?`l&2;qn-ixQE1zAKq
z)wtcL<yT-?FHqz1;ckELvde#r^>(k!-PdtWE_LsAF2NX9&+RM>6V`FBnJC7`C~Ns+
zYuV*J$vU?dRfHcd-=8gBb~0P`?6QR>MGsc_r>7Q4J?yJXHVIlSKRdVhZ<gkF-NYr|
zFMO?U-}UO=i}G9gZCfj9Hl3{$xhJ!`KQc2)hi!Y8Y+_KxVutigotf%9TR+zS5z&79
zC4Q6m8`h8NkDeHv%zYFqbs@4Mjr+9sU9JpM-_o;7awWHwZrxeBv)H6bER;iHN8o4q
z%K68m{%tHSTzvk~^egX{WX2snv9;w~@;OzHBP%}V#O`*Q5!%T+>HgtAi~lnmJTAXw
z@%`8FeE%6zZCOs_nCM#kSRNF~tkPRprLy(%;|V!^2125{C$u=Xr>Zu}{Hk=-OfnQ)
zo_n)R@5+KFH~(zOHdy61jZ@iUp_uHErlS?ovzJ9qDe^C>Sg&>M-Qsz_Li=07EKVGJ
z-2XB*Zt+Ubr;;Imo~y{m`}~vXdXRq1o58{I+xq(}ma-;)?zmd2^6b=d%Wv<rDtsEZ
zt+e^rQ$O#kWLWU$9>IU2>z78E-o5lw;Yk^T%;fJ5k}~t|eR=Y0bLMX4FOUCm`u|pV
zEx%3w?ZgNF8Co`4-FjK*bL-sZvWe{3vHD)xg*Ho4E6WX|kH1uT@gvoZ{jWs$Bbhq&
zYkGfdm)yVWU7vC)Wy8e<4fjlpCO+AEIofBb#Ck#N1$RVtvmLwjN9I36bMb$Mr1d<1
z)c($0zdu*MQ)-Uc_IXBA!&v8d=WW}?HnZU4(!+ND8MNZxa$i(d5puSeCGn{A)6c5E
zJ3q1?pWkftZsLl}?cM4ff4)xAP`ws(I$~ds$Ek%%Tc?ID-JHPu=5yqKhE|3gM$opj
z=lp_Q0e&C*pMAIcu5w_PNpSV%rjI$h@|(VX`*8K$^i>(xU#C7l`JaK4<zmF`JJBbe
zCKnccQr+{W|0Lths~wqF!~&z@l<Y<JC@*<=>)7sx(vi8QTPotiyTd!*hIxkyEt#(D
z-?_9a{OQDPyF7mC-0tGqxb{!(#brOz?VI*+K3ZL?mZ7rcvXk!Kqu2Ubmb{HN-M-nX
z_Ue+)Ul~p+1R2ixP_;M9z9U|!#QJ<km3+&4wd-3v;;y}V?7Mwp@2bTd_bgOAbxl>+
z*&LtWzPrlok<p&(?V4rj3pLgEwa@?K@G<@^WA?+_=Ou6d$Ua>D&A@b$*SC9`d(Fk!
zGN<T#a4@-DY^>(I*;Vs}_sZ0O4F8Y(kK7ho-@jW?{qWDEbI07Xd))(s#gZqb@ITyE
z@Z|5?Bio86`KJF^cKhf(h7a67)?K@FKH~EFL$U9+R{Mqtq))6lnXj9hJn80kpW7{)
z*677gDB=)SKL|SBtC4N5eYcAHKKYE)uFtXC9a4UFL^wZEm3+v~W$`v(@im_;|CDw0
z|1bQh{X2i3T@B9<(ejlw4%hP1XCDijCAL_sH)DgRirXiT+22?1&vBhSrOl~exoY2?
zu0LLXr<9!aJ`yjKzbC)2CimFPyvzR9iFfA}H$`lGbtCEQIZwN--_`c7t+Dta{9)aH
zh6B^0_FT8x6DL2-a;x?Z^NEVODrSWzcJ}y09^jmIYq?Gp^UsYRrazqCS5vkrQ!L1A
z?&7<fOwS(VSrp>au)2Sr)dTq{a-QqOxm%X|_56%oe|5fp_i?|a8JX23w$C3wKT^%#
zS7&f(AO8;~=E4k9jzj)AOZWVqy=ViY6yxNra~LO2OKz~f{!9Ol=6{AJ<+|f>TtD&`
zWX{^&vB$SOJu@>uDe1Gq<!fwQf)lS<#3d?im-c>lKHvZI$-n*oq-*Sc^!~1`G5Qhz
z;P=X7Q)*n7+&Wt}!Mo`59&x5enPS#CyI0R>N;MEIR_9uB{Z~?4g}3wGk9-S@D-r^2
z9-O%se@k_mi}qnj5s$M|wRdbbP_{8RTm0BiXyIwU?rrU^^7qUw-`BsCl2ZR8JpCVM
z>WAIFecWrA?gx3Cklxyx_B&YT{RuT?YbO5%K75Bo-`(fiWBi-zk6x)fm!0g3X`h|m
ztkE&?P@Y^Rvq9+Ys!tvVtT*^O#|dUHSl_Nc%~vln?0{Zs-=}~}3Ywodmerh=;Ga;u
zqrO~p^P*S#O1f9S)D^vDmz%dXDs}QntwKd14YuI@lcagrl`rk7eDvy6_>`HKwX$x>
zA7=j}lKwFFdP9Ade#boVw$mpv{sh(*Gx;1aioWlcpCldfxY6zo|CD6z1ERln{`UD3
z_wm<%hJ!omSxRifl65D~=e-pjbyUV<vb6Ty6Dkwl6>m&ZNzTyidCn3(`#;0MsQR?}
zp8ewWdE0(ee+WN(eb%-8kE(fXcHh2z$8_o58{wT#ckR%6$y2aM`P3!P3C+sI0$X3t
z{}2_=mieDybNU<U56<75f7C_2yLIZ{5tmDAysjH$ZWEqwWv{OnaF>Dm^Nu+}<&1H%
z9HwtAxB1RrnY8-Ynhm`*zAI}_hkyUK{E_&ZpR0Z(KX&hWyHB=a-o0oEg|uBeHctvj
zo_gZgagY9UjQ_-bR>@uc{{HxX2BH03`yaH)3+3wG{>$z3aoW_}oZV&`jiwpGPu{)U
z^SI3HNrG_K&*MIO{crYvtDAka{Mw`Q$Kv!mOa7YaTW~7(Ihb3wo^&vZ?5lgR{`~ol
z_^sy~_Nf1s|FQU6;E&wpcdUM_KN?nb_S({tQ}2s&munfF-63>i-ZT5Viig%X7yRrk
zE3gX=7wm6&;hxs<k=?XaXIIH9+xV})=FggN?0nN3Z{cIrldpWdzqi)=w_c6R)%_X%
zJ^SQ-m@iti_I{VCcdVT4f)rk-(8eb$^M9uGT&fl6(|(#Qo>KCuAxzfx*T?x)|EASH
zxXs^CC;nsp?~3R@t{;zN>P`Ic+jaM~edVP`pDfJPIiUHOr*b<>Ly-sb0@J_2M=Z{-
zPFx;Y;{IuxXY;okCyu_|`S<9{I)M-0oA#*e6TO_zI&bd68^@PNo@DTzz&j<$^j61$
z9jXoq-c0`)^d(eYy_jaTck8bI3~8CSraqf@YLd4?=e5ea*E0_=hL$lbSZ7pty)kYw
zfA^xx>=Pf{Ra0$ca+Bgn;onka({bQIfzjdDQQVLCMPD<C8!quW{EW}rgJ1Fl_dkgj
z+COJc^Szr@ckEWzl_yIt)`S)_&boK$S9Ghw(QhY(?k=1#!C7FPgs5y0-@6^J=RYj}
z$E~@{Gy8X4jmxEX&xHOnq{(U>T_P?1H*P-50;N@}-pb_}_w77+w!Z4J_mi{F?keAH
zS7_BcwaWeU#GY-1$JsxwKQ4d!^FNNQ5A|=)KK6aTw4KC{);+wBdA%eqeO<Ta-hT$~
zy%mAUeU*zN73NviEQvVnt{KFj${F?kP~a4;;uB}D^-S*lZr^5hdF|56XEvO$C}j}5
zzV4lG<@V0Ci={V3mK!|osadS@&BFAn``gqH!AIpc_P>>W^#11LN32)Z?Ot7>^iJD)
z^<NE}u*)ZHm+pO#v3SnU299?E0%r;i?o?*^vwr1ktGL}Ng~yhO^Oy@Zg-r1GdHnIO
z_MO%(HY+cOZ#Js26u<E&bg948<J7y`&mSvD4Y>EXsW={ViihJK!NST9*$3(@b|~h)
zU9#h{Y5-&IB{!9h4+V~bGR60|Wk0!V?SJ{&`?nL%oAl=N+TB=u=aWQZ!75H>J%>2|
zsDDfM=k)(jS+?_G{STGnJ^L&wnjeKu@5}q6ot*us+QP<unS1W?B?cU~Qf5`=<)ux$
zr1W5lA#;!DvEsKWmR$?`mc76J`NHSTIV-Oo_Bwz0s{G-rZw!TQ7c}r5bzkwq_|~rV
z+y}E){-_SPED>}1GkZv%!^A(Q|7{95!^pW=dF9Cmp|bhj27WJk=WEW4_%*Mn_|K|(
zuDdV8zF!xcwX^-rcY&s3^~R_9h1r}A+0W?n_dk-fe}VQ^tt$DMiO=gxE`Ct&UiYOp
z;$=f4>*=G<@*ceFZB}IIUC<nVhyRbD{-fMwQy-sY4%pMAnY5!VI;qV`aL<(+oT-xR
z7Uzu5)^i5ljr3jRaZ&c>lnD;E_#fWdzgqr>^7JFMey8HOV`5LJO!nU2Fg1p8d(j4+
z{qJPtw!TeB*eFqT!?SkB*6*w3<WlzbDNR$<w%Bt1-8Xx=9}S-0Y^AQ<_nWxmHjmb&
zzQa5}E!UiU{&C&T0=v7WcYaTwR<6Lew@*a)cGs(SHNh;wZ#H+IW7cVL5oN0?+H3sv
zkJjQJr(?S8zZM+5Gf~1q_S5l+FXNB-&DZPs*Bay-D=Bu5?<32Je%{3b<pR;qUSIfU
zd#rA1O@-1Y6ZP<!x-k>j9vS!-iLZYiY5q@d;?1P1`A7FXllZ*U#mPN2OtF)B4$nW)
zQ$PBT?i2cOa_jWS8HeQ-NS~Nwp+3Rm^!E)Xme$R*`F4(1ZSBs2o~N5^bzbZf+mv%B
z{%4zVdqlGCmj4Wj^N-E{yZFKHfV$)9s)yGzoI1i&HNjH!>8<M>dS8}p*>?F$^jqKc
zq8$}H{7>dEv8+f74?6I%;rP0@d(vn0ADK11!^UBs+y|atcAE<&O7=Cxo|znVR`Ot2
z|H*=~&--;|DEHnx>%3y(5`)cEH-0glKPG&%RAyq7ilCdb5PQy_<91*FW$xd0{jlUe
zp_<|!n?KwSnD}tVhwnXGlOFI-S+}t4SBvC#v+EP5CLZIIt*T%6=bpmZJJ+R_EiZjI
z*Y13YxzOt{&rFd?(>dC-J5?FjY}~KxbA0eI{`mPn;`I-%tzK4lwf@7_l+AsYy?#u7
zxI?{h;U4pgp4AI|a@Rfk?RGTile_8icfT5zvpm}O{_vfuHq%S{CdGICXJ{;bR&iW!
zrH=5V=&X9<=>av%YW|$N$uRH6qh(uN=a|&SG}!($b^DjSLe3+P?WVGY?cdjW$3A_3
zYZoJ-<M`y8#FKxbe+4;S)N!iS>VNQe-F3AlJvTX1ex`y>kl|@hwM(L*)sy@mRIdM`
z^`D_Br$+0;`L;UQySKBKeY<^h;)_GvYr`(7?7X}-XYHQ(M*K6Up1JNP$`Rn*`m=yJ
z{l~-q3{B}3*6tU+#LN6izrKjKc6ny^@|TuRAI=X*%u{2|{QEjTr02oJX$PL|U-tfn
z@jouz59yw}cY+pB{t3ML<>nvl6}PjmRf$;nTw3$(#Tlh7(KAB!bbnj0*~GBn?2*bF
zk^Dz~Or5U3!fDO+ee-7hXPEeXo?O!Mud}8ktY5Zom%Z^9ze~T52}E-H)(396`Zaq=
z#Mz~5RxiAJD8A_D+WbnDO>Airy?oXackqPDMjt9?P5cnIx4KNdW#(4RufMftCbe><
z3%m;3pR&!>@ysT%RQCQUebw*fDpuWh`6%tZ;<Z)T)<?BY+Uc|IM{dtnWSL(0bJJm#
zZPPY+KRfnL{B+t~0edrPmV@H$>-T8n{!xCoy0+N;g!`4R8gaJKei`4kefeyvnYKgF
zeL~C<uQL_WyTU)qJk_{obmw2gQi&ZamlP~MJnh%I{^Hc7hgHwFm0a(OUOl^X<45~j
zPg$eP1>Q`0siOW);Y4p;@@~ncTRzUXkbl0T^abyf#G1AGUYoAune1Gr)cMboZ*r~f
z7RHcmvIp$4nJgtl_borX&vb8Q$?Ixcf9DIyeC^)5_FgXK-Zqi#$tRJ>TQ-}l9<WVW
z)c@|Y-xV9*RX1<MR2)AdbobBYN~^f}k9f`0w*_u5pSIm9$J|)UZB>ZP+<573xt+#k
zbI;X158rTU{j%=ZE!*V`uXc5+T-$PZY3!09HmB3|OP&5R>{I?REq-G4deIwqqRy_q
zQGaNE#rt<#sx#`YuDHKuTAcdE>8E24pKg0q`To=~HxV7{ndcmA!nN}s{$~)lQK4wc
z&zCvf@b2rPNsryHEZ$k6IAOZ=f@?PuQ>M0E>J}*A=VCW))^D`YF4o<DxK`-jdH*YW
z9{ifLb?>vzGBvHW65e|i*FLOx98@m2%gFzpw8xq`Yj^yNb}wA|qwAD+@*@@9#HEp%
zO^5xr?A!O@&-9kW3$^Wmzg1UGmNz*ras2e0gwWl$U(b~~xF_(@e+Hw+N1~qOZ2KIa
zxn`2;4r`l(D>DMlY&^Mf+u`2_99VivW%^b=^mR4m%*{)?nrmbF@X4&~wjEMsyIBt$
zbNTpAd{;;Lv8(agW%oFejKltzKblx+dcJR~u9SG+!82vwZn1uSyJULcv7hawORr2T
zNDbWXbygy7u}x#J^roMFpT2Q!wdSZ3zZrk;OxmX<`-*M1?aj0-aEcbWBA30C!{9%|
zE4N3*le-RGda!Tjk52h!8#R;NzS6Gx!pr8aekEmlTZz@kQ+G<)#hbggEM8Hx+k^W~
zsQ(Y|8uO)D=2GvrmSz_|`s*T`&bD*eLDnOMVu5?tmsF@v<Z!z!nLLm2`?^!L#*y1E
z=>C&Fn7b-V{+6c1u36#zN1`fwCh;y=z3R;5mB%Dcc3()DQ0QsWYW61Goo#`Qcl}5E
zM<HgvqN1PY9`7*O9q>WuXo6#P`j&_McdTzTIGdlH)qQ9edw;GCXW{yrv9I(@Reqbq
z-!Nal{@B`cFQcqKitO{+#(r8M`M}p@Kk91rqduz0@%+fG&(2=<((&I_v;NxBMd!}&
z>G9mEy44}kv@l66e}>%6XS&gW+js1m|0w;aui4$)EjRwG)vXC$=9=?y%Myv)C0BKy
z?a5v9z}S9D<&&=MBChBB&OdzLX2Y1d{73Ym;+M1JJJv1fdsH3mdHL}4Ztmx&oU<<8
zJ6@oYP`=vYZS%ygw|{&;d^_-C*QxtQ!ooI2yeKf4oK>~1TibUUllS!gu&q1V4EY%1
zXDJx%X)=teGVj_`%-{0lquX?|jW)OD^ljUpI_1Y=|LrI5ytyc{W%_BGV>@y*Y~-{j
zU%q_Ej!E!`_JQ=nzuY_W%Ffo!a{ct9?3?V3NhaBv)7}@Ehw*L^>|Zf$?aIt;CHn+_
zw61!ky`ti|V}Hn`Lq}A~u2sn`%wHF^*vO#EWqZbgM5z`0N;4bp9#?s`QRwsGf3kh|
zJug4HnDEiOqgeIO8uK{mD=oZgQ6BdWma^UZ^jX13&-k;<yz-jt)h~B_nf5EbGim3Z
zOMk2$RX)G^MSHF%&)SB|x9{EZ6)0@eSelf?=4Uu3Fmv73D|Y&qx9p5Mn<942s&4km
zTYgJ}8?~HQ+`et4AsrRs`N{LZ9fy_6m8PyQ-nz41Aj?jn`Jm?CmF4M4yWgcu+_Jaq
zl4tm{i5KpkRDHE2S))+sH_zt?sqn5Z5nFZLAL(4W8Ff2BcZ!kO+K1oE6E|H`kN)0u
zQbqQo<oTtQy4MeL^K-l~{E@3KedyP<y~^GNire>Zja*Q!(lYPp`kuV^y$Ad_V;(a+
z+iUdvz&~@Vr}G<XbXR5tzTCK@`sCtChr_ncy~}lKcK-9~D-j#`4aM(Xc>6OuN!EIM
za_+hs$I1sYd#`Mt^`+|aPo1=FTR)0!pEBR1+x}bBEdlv=ZASLC*@C9g+`dVtAFglA
zFF9@fL;B3_O<S+7tFf%u?8kOATWLC5=%){knT+SXp6l3e-nw2=HnxP<?6J?qhkg9p
z_sr^>UgMJA?y39C+qz8Wc}a31%SML6^YP1ToUeX)9h-eLPGiSM(LH?XV%_VaBI93P
z^i<U9TDx@ltvHE;>@&S{UKO91c8S&J_MR=Z{zuB?3_fn1dv1R2LS>PiAK5z7OJxil
z45wVF%e<w@@tN`1$9ZM*wDk`g-p%?axc}q&wg*<*7F)AK)~K&OTld=LjnCwx`KvnC
zI)tij6L64W@L<~XNAI5W_8+D8f3$bJUAvY0=Ox*HLOXr6o=H5gUNTiUYI3sLg9QtM
z4DMRZdbOuIUv9a2yN%$Z8RwQ4ZJfQS#(iOI)&ra8DQUXy-k)-nCyE#(o<H^A3IE>n
zww|7SA5)+8%#*)VWB+)`7W1f<^F_IPJhQF^PvkfxvGkJQ;&8s=tuv-c9xV}{Wwx{Q
zk+1pTIH~PdbGF>JSls4*DX(PZm&ew!pHlU^?`yBHurAyo$5y#2O7!j3`$srS)(ZW~
zuI4p2(2)|`n_rx-Qnujze}>NdX`fYge_GSH`GT0OcK4?K!%?B@JOAnb*rv^)Cnu>Q
z9(Ao<zg5-PzauHK)cxM8QwH;L3g5{Ho?}%N`z8~%T`y9-xzu0o)qa7m`foyJ``t_4
zx%+Z{$?gLigeJPHKK*HSlfR*Fl{ouT>B`kFSO3^{|KZa++ts5cSzn6|nC?=s@2<<v
z%xTfN_GK@+QW@*m9?s$8&9y&LHRV3nl77cY|9-!nZr~Jl=tspZMW%&GsotCA-`(k5
z(h%{%^SodD(OLf)T1`E^<TKvzTwI?MAwKQVwd&vdIq$DN!*on}+vNjop&2Jn?OEu~
zGUvJ2<D@CkcSZlWKeFen;C8)eBfR+h!}I)SS8R@(ot+!!&l=C$;x4B1xXn|w=V|kj
zX7;BKzR0ydvgP~FaKz4L<A-aTm*4Z{o6F;*Svr?bHtFuo>1Q$%uBsWHoV;UkQ_G*l
z41Alr^QB~Sx7z0M3src#U(#(X+tco`e?#du-rrYdaL>N{>`BVBa~CYa)a@!C?&nkQ
z$t~UA@hf&&_al1&yDR4Nc&6pr2WCD!RQdAnV*8s@FB#75iC%WEf=wuS)4sOrhu3%6
ziGI}YFO7cBmHn-%d-bW4`AdFG`;_Dv<}tD4^wMbSa%;oQ6+H$v&((JB&C2*A{Gj^j
z_1wC%rRz3Dt@(AgMM`Q<WAmA~--mZU^)yRq=V3PB+B2)X|BrEU^#kj8&YGyXd3@`u
zpY5IBw?_Gjkn6SpH?@m@RxFqrvsy7Ne?|&ZfqS%m>mTojf4L9u6Z(-cYi{e@7P*4?
zhkq?yyLI!=C;HP1^XnCNCahu%OL${^@LZ-^bW^@lcV@gm%7<zF58s+ezs^Wk`xbpx
z?9utCt<&q@U9$Yo@KA}jWC7zI8!!H(`j#bO^JK37Gd=n6ZP|O5eY-F3*&Xs}>Hf>6
z4jYcCaD6zkI^~>fXQW8W!N;?rSN_p|^q-+G<@Gfw)4#{sR_1J%THl_3InZ_M&n3rJ
zYrAHvRClJNsye4j_Z4nUUSDxJX!l3nKhxz@F28Br`sUhq&e~<K%QPg+r|Ot(SbfLf
z#YySB<9DBYExQnNccPm_>HZ&1HO|!^wQ56kgD$0=@6k2+x%RP;?83UsOT>3%9Q(Wb
zusHXX$&*8CbQc|)&poqFl6&=n?;EuKGaS-hp|}3&&qy5?JLN$BDeOGLdLoZ(<g(}d
zC`^2~R`}tzwdD^iOm67iT)S2*o;S+A<$Yv#v!e5=`RbJk5yu>2p1P~|p6{%a-TqO%
z<qONl{$IXN%rE=$?9;jweI(_`#<zd3+|qWLwywNp-P0X+7JBA1X&qE~pOoKa^fD}{
zBJB3Da51r{nQdi`j~L6B+{-Nw{Jpb8L3j4MhmURRV&r)9U*G3>XXE`b?%Ml+jn~sJ
zDSNwmCbm0YDcN*t`I*#NPyJR)C$vs3e8RYS=Sux|U*q|*s&uC}f0cE)eSG-=^=_9d
zTYhUR`1F4N^42x#neE{p6F<41{@xncS)yzGt>KF4+pN>hm!D7i=&@t=;ak0}pM`~z
z&s^n}wr+c#b#8`(p`6i@tG9kBTb#PJx#NTFzTWyrcZ-8RxUJ1GwU(});vFmZI&kAN
zONkZLydl!8Q#Ws2a)PIzoP}BX*S^({R@=9mPpa|TzI)5&o%62xM19@6clFArvvZ%f
zt51BKdx~S?zL?($Vfk(U%rf?w#6~~Z|3@V(f2~RJ?MkV=f0ylfsnh$t?tEr-zD-BN
z+vC$O_k3L!?09YcKFL?p_VefcQLKKL(fh~kcKC%{Y2VBFvZ7O#9@sWN!0@2rt2`IQ
zB1_qofs@NTp0Dg`yOh54u<7&88tp~5D(VAfal}3=mff?h>PfLBbDM7=>w#Nr&c{wq
zzOF2K;kDVsjQfHMuFGXdM<}-)@z>7UwQi!?!$~_gZ{uC=Jz=@D$4O~_iS;v0=6A@M
z{+Ru!!bZB-{_uYWxtp20rd*75{<dV-)h$~J{AX;8jXpK$gapSu6@#aqS`{~HF1>nv
zY?gd)$$tjEid**b8QY@ft-28P(&}mN+-Ln|OdcnKJ{_}ko5>k^CfD>#q+;@o$c?cf
z8+>1?6?+@>-tO^Vxwg*m2ebQ+nQQlc{j=Thr0o&Ivucx<drJy4i3SH>R{ebF6T|0i
zXYV$ep00?0WdCj2wEqk|rLk6@eI|#5^j$6Oo*Ny#ZR$enjWShVmlW>W)OKgJwLuVP
zLV^1kd%i#N4|%H}vCi)(S<T-b^<|gtpAEg<hdMUie|bzbm0PEp|CTC$>lDf9lcLj%
zw%&bl@=?W~{6+QY^@j?VMN6-qI^XxB-R-qnKWnxh$et2r)_Ls5w;0w33Ne$~m%lRH
zwp{zz?iaPPk9?(%{5m&3d(n@uZ?_MNU5l$$+xg(G!>uTlHv6BITeeN|nS1zY>*FcL
zJ$XT{#d0E2_D3p@x9&+^ooQ!t<?&^i$UD-?ODiTmZGV>A92lA6a#*Y~aPsLSJD(yO
z`vY}qvC+rB)tP<Z{89Z#TRZ!AclGP}EWS@)nK23+J88S?=c2a<tqYBhgzig?JrG`=
z{OI-0KgkdOGqC>X_W$^>J$%o+YsXF>4dmXfd3fQCll2S}ZfP4@*Il*H?QJR2UL>%5
zW2@(t+`IGId8+zW=dOGyFI4jS#@n>ZHy8CEdv-bI(u3cIr>#Ago>~@`df-!fLWD+&
zB#*Cti@Wc&J=W_Y|7c!&vt`HooJkeWf7BLjw4B5gQdw2ERO)z!M^4_YS3enlv8}iN
zQOVy@(l7IO_QR?lT!$X}&-2bc`r+=)dDRs+3wOOcdS&&gzS-fYr&w)Ne>aW&VvW7o
z&eeasHprRn`RKPPwNiJgjq?K4o^ZygGnKdO-{vS2IALd^^1}niPhBm`PoDSst<0Qw
z?myO#&kDz1-e>Zo+~=y~+XwsS?o)iZ?b}7S2Q$vRUy*rYL#(mVGMf#Xj`sOoGMxRu
zzcuQQo!H(F>ks{B=(yF^yYzHPDYxVv-F32M>XmIbbszk@>Z!WDxgktacCnK~$Ev2S
zuj2W(TI)0ZSaJKswOMJCm+y{oRm!wenI3a_?F>!p<(HSApQ@n6)FCpp_;X^ByY$0&
zffrKyk8&zr-{Wq3_U_-U=cat-=l6Yh*DciE>L}|Q=ads(ZOR!5ZeJC;Qf`)LX3yub
zvtQoywf~3z+drz0YlBYxiH-1mES-MQMJ%UdcU*Sq&aJ=09vpq%o?&^|ZAtOk1wTH=
zeK>z;+n%d$Y9b%*D2bjH8qc+Ldq?6d&0^&}K_*3~O(z*@DQA3FcL^}-dS_$!P~(r?
z{hRj`KfJxVZl;Vl!@i~U`H#3&OAkvf@th|;<IdEdemuF8q$e$j{J;~(w*RWW;-%90
ze8*R2UCZa$9w)y|if`>E{kcNk8E1Cf^3+u<NjX>8bG4ZB?z@^Vv$h|6-!)IzH^%+p
zevzzOzHg>&H+ucH_F?Cn)|-)vEw>paMc)xoXx`{N&mpEUZh3O$${*>6%c2;re(jaJ
zcSPFrO-^F}kxg;Yii~;cJLXDNcYL_bJpX>KMXE}Z)s`RX4|Rhc)fzu?o47hFvp7@5
zNncdQ>guE%hEBP6N>M%uk2F;zpC`!7dS)m0L;hjw+`g?3*SBroW>$Fjh-%`4vz~8N
zgbsgNb#&RCpWRuJo~N~^<Ub1X`(U<4uI*pv<Jpy8PRBYQz7;mt<l1HFTrZEOJ3f5b
zmvE3%cJVuxnMqm^9)2DyGRYEF&$ceQ9sTmx``+784v`N9?j4vlSzU)QbB%II#8ZjW
zOt;(ln<qvW{;<<cy7I&L*tPOmSAuW9+uD9yDt7w>xjU1UZLe-}<ypO@iQzQgs)%&%
z2ib3>y)JCE6+RR$wu{B+&CK<GL|2(D5L_hj+a|2s<DR#L#HYn_!7>lty?V?tGcUjR
zxcx&}scp^jJtfUcv-ZhcN}rdxPUx#n&3^sjxFhB!Wsf`_-HA9Uc_L|PNa=qDll`}?
zzje?5Ht+B9n$+J8Gj3_ei@ee;Tz=%##J&4wbZmHe(du~1y=fDVq}~v%xi+Cya{YVm
zf83$JQ!26_$o~<pKPD%8rPO)NkL{0ARzIxgU$=Vc-}bN##%})^ZcSf0G1+|*w`tO(
zV*+c|t?(8LjDN2AC^u29Qmr${j^Wl0#*oRaGNsQyt>5=xk8n|G)F-=ayCbH2&b`;)
z-IDCxkYJbdL~f_dx4+plpKdsiAoF0>#_B@RGrtc_SlnQIdus^SDdv^uzpTGJt>b5w
z!ImJE$6Ac<dmi_sU)#6f@5KKM>HEe1U70Umqx^yWz|8K5kMmaNF1~r<zLvZ0mDxT|
zChZWr$f+lhl78wI-y`GCp;O%4LhmfCD!x%a@4nZ+o%IiH-@nm)RO)`m*ZH@%$9`CQ
zyrU$ZYtKKqi;uT+oGZ2NSe$)&?fNZS%D(mKUR`Xx=jQU5nkC`AM<o6;tWHd|pZGHM
zMrqil?i>FOKl?k&#{W0>tFY_x%zI=rAN#k5S*cEKyx6+^w*HpRlHIA>+N!gIKcCGu
z(l*v%T-N8N8hWwsoWj4`MSqemZLR12A^%VC^<Dk^o9P!>_imfNO7|GEj(2{^CzW;5
zQ-dz-GV1A>*f;<1evv(;AAX;0cls#(Vp8<UXS(yYKD+7gQRq(efoK2BZx#0IpFZ&W
ziPZkbx&9CPkHz|^AJ1oe5of%sN#ohpt0fzBOJg?~H7HCv<(YS(_okLt0#jAVAEik(
zXHUMXYkIV$sQ1>t{cHVuP1cq__HVPvU+!dD`RK|SAx@VMZ9Dt8TTeDUI~<hpWRhmh
zCi{zevF1IR#|p1kls)=%{D`@o?8b|4X2<Mg|0{LrUgf=8Eb^~;=k7VVDvC2nLdnob
zd;KZ1IrBYde=GZ;yvCES`9Z!&#pA=;29ftYuPAT%XgX!$nwCXd%(=cFEZ2K_Tgl*<
zV{k0%_Cxn&Gqwk1)XDv5eP|o!J>5uc?%L?ADx>sE7SGIsk1+Ez@*Yx}$8<e;)wIV`
zJ?wv^)qLh}D{bA^e_T%Jci2+V-J7D$E<bZUSL^{#@#*3e-LD#gZBHj@zjlvloTea@
zHQS#d{rQiEchy@azW8MMJw3ZME%|O&lfMez)ED#Ae^h>)9=I<%U*N@uiuQmu*Ga{T
zvcK&*7@?Bf+GXjxY;j&Q%kfQ_OoFE-9*x<0`9DKur0(KL*B`QXsdY{fnQ(H6SER?o
zo=JzF*|}TKe`Xs!=Sppw>M`+G_5Uya%dgMMXQ<Kpk(rtOAkxM%b7AH`=G`Gz>rM)K
zuXW2#cr5&2OR@IpjbXm0Pace6a+Pn3YQ5g^hcoe!_3x66|1R~PO^w%K6c)>voFSp5
zd_1r6R8#hu{|pb-?0WmD?)HBMfqlXidB*vP$&aFEToSp*ed5i!6{r3@mGbL}o;>$>
z*H_8h;D_rE7Uq}zD|#taKK<E&x|k&{8(nQ$*>^s-l<C`V9P54Kkg0k4ol8?qqiS~R
z{`FsA|Da(%-}-;L^#`L%>cwA_U7K{P!spej%kC=YGsG+&Wm~wYnOaWioZ&9X=zk`n
zN!<QLG*i~~;Mm9?mC;@m%aThDny)?(BB=0b{<DdW3>(xJs>n_KWBZ@s;Idz(Z99Lb
zRb0sWob$Ox<5Io>=ckuN+<A96V%|Odp{&dz9DncK!UyMDZoN7x`)qCX%D<BwO$war
z%Z1vyr`&zA%b3+hYnsC36Y8^$n@;}rR&Scof<=pFN5879ZQK0lwk{L%`k349g&dzk
z&2%zV))b{1c}+UiusSi+cJsWg7qa&A?eSj~e|lAP<he_lpWJ6YImRTynqp+pDbH?Q
z_OQXG?TLKw)~lsc3-(E0eA1!7vFZF_5m{qxw&E*abNYU)Sp4Drk$S;sk6Hhge>3>R
zqr0XjR`_yJL-G7?9luJ}+XffC$XGUQ#pjiFlCLhs-M;&J))qtC#%+_12HjN6m{~5p
zOuyrb$-}08{j3Fn4USs%)6W0U3-9~F_IH_$>WA5fc4gPjez>mbR?ojY<v#Dffio9H
zO!PakXU9U-2FYZtIe)hPZMyx(?stH<Z`iA6Z`nkiISVK+JQ*a>Q~G@W(|>jHAHp;1
zGx^)>#qBg}B7aPLSnGA#XYa=)yJXjGEaYiA=jpobcXqX;ih^JAh7QAwW_LOHYEH)B
z^IfO4!wU{y?7cI~{mO?veO|9EA1!7sStzT2_uKoW=a1~~lb0~{7y9vYkLO3L(A~}c
zDgAFW%+yYtOw4JRd}J}Vy3fj-uj{+^WIxUqsB!wJxA3vNphti0N}u!@#})>99td%~
z7%0FJ`ev2&vt=Kr?W|lkC3;)hZJk!epipO-Is5F=o==|hSGy(sSYiCdJ*tPMe7Y5X
zKRftSoZh3IX;XJDULt(4Zn^8C6VE<+o?4aK8Mos<1J}Qw`yX7*Z~kV*|K{UI@5gHE
zm$mJ_X6kG0vZaXqe13Y4-jc&b74x1Re8FZ_Zhug}<;~-LSA4W0PW%oO(W}%EN%{6V
z{^jof3~c}Y$bVFC-v3~Roy^sD0=M>el%CBG=-9|$x+!+++Re``5<VPSXSem_@gM7a
zlzP8s|2c2nrg?A6?HBzwzh=+yyOjIo@1ExU#Z30Q7F!;#vsiVj_wU|kDp$5juYML+
z=cBa!QNfL)-tw(_;&L@Nlk5ssMa(I+IBq}J!z4O7a-(dwm&d7@6}<1yGvAQQ{umzk
zuJ%eoPsbjgYrebPH}r@}g#Vnm_ne1)zt8WhU;i_-Z2QlUGWmp}OwAc5ng0w2J~*Cd
z+BP|Gnx>FSVUA?e+|D`0e;+r_KN9|N=YIxP_Wuk`r|NE&*USBJf9T(6XH?Hv5q{{`
z)@%JNQXyi&S>i^KXD)c^e)%2{Yb;)IV@;t>w$KBi=PIFE>w>oUCbtLOT~ZhQpW$HI
z<9YQzG|wN8Hx@c)<DJ)6QNMFh=HAb@d;W?3Oi1eEWN2p*JbCQ$tndE4aw;FEAA8@i
z>-^F4(m!VT#vhrdu-iOp>f7JPWv&PP%;cY`(5cjKt<+nvanVBurmgj9_BZx_oAP(n
zKh^Dr=QsZH-L|q|V&!-9;Mk?x=BM)csqNmCS}3)VH96FMlH0?8hBx!hC@tpox7%H`
zGGp_V{Ym;aKh#}{7tghkF6BEb#((eCcgGDUbJ#BPWM4U5IJe9FZtVFvE7<=E*IE5L
zSI=*!^GD*Nd1KUV_9Id}+x#|8i@33OMz82J^&X1{yzBP}UiGchs5@}~gO|1c&1{d#
zeJVfBo%;2y%rj4UYr#b}?(fN=KR0kH<V~3Mch<-G{r}`^EH6zC-S<&--{icH3p&MK
z`X2f1R_C#}=;3^c7dzBNAB7!_TQtdisZ_X^mite`AG;6zTHk8=x}W>?li9C1Q@8G7
zxBMNtdUoaXIr3j8ZaDe+WnA&M)XAaU?|%9!unKI_<oz^p>hpz9zOKJs|3jzz&Fd94
zY=3v!q~=R-F8i@zd6&uaK4l@3s)_nKSxYwP%RJok#_;DILxq!#Ke-;xdLW|MtdV%W
zp!nYYRYo;Ag%ugs`)|2F+S$wQEFQ$YSbAlK@e8Y$Z4qY*P8>XbQmcXU?Xy+88DBY^
zkDL0t{XYZC+8<ks7gV(A>PM>HT%Y`@<7B`hgB=GH^8U?u+4U#oW8F5>m221MBuuh!
zl0EmYc-?cG6_a8nUvA(CyujG?YyCH^AG6CJ@^_bMbV*6hel9p^%^@Sh^EP^(2hUZN
zudi2Le^TS@m-NYVgGv+M%fI~oaKHGgsQ(Oy=2{>5d?#z3)Rt}Aw`cddowL?;l5`AU
z%RM;jWw{WuMvu{B%iFUq?!Ef{k7w3}tZSUBGj^3MipX1||L$$6cbnkneHU4G92RnV
zddA0~s_TROP4h?m4SW1QR3DyoXV$;P3tzEaUC_pGY2RFvk437JG#2Seyo)!eoH&!=
z&?GkZE5{F;Z?D?h-}R^X;a>ftx1QdybN{w&es*@E>5hOX+qKokz75_Yg1djlJPH3)
zF8(mJ{mknNTPIEay?*(Fy5EPdJ`88}T6OJXeC<|)bz7}<9Yg;(mZv54M)_(VzNfNv
z`&O+N3q5{2cXzhi7{4(p?h%aT{r&o%#LnL-8?%0;tzEe?J7lx?u6t8+POVz7Mf=H7
zsXnfwpEM<v+4j6Tek4k5&i#ZB&%55OjXL<mHz;59*4<bwrSx~P{@)@VGxVvQY4T}U
z(mZS90`EuKVpmMpv)nwDt5Z2U^wRptfs>wk+&e8cS8-yHrzJN>LV@wDpPA;x_nux(
zUURubTl2l1;s>9oxb^E_)g|B0j+2{r*>6`<fWrin>UA<ZpLo1E<9=7!=IXPVHQDLv
zE&FbNJFAlX_VAHkwNJ!#ZHkzhq}zU*<S@n@TQxJuoXPRA-Q%DOrT-atPA>Z~Nn*>1
zclDRVymzL2xVO6O!nV&FoD|YRRYMO>P}KeWL~7c*$b}bm9({b#?e*czBjfyKuf+mi
z>+Af`S(mq9#|{?39z#FFPcpN%9MWHS;r@wPs!dtDre6Ke&{kv0)REliJNN6-BTG-P
zY&u?8wB|@+x6!J`8=va=?H}y3=QORC|9AYJ?B69q+OG2tS-su5e(tir3yyuWTC{im
zd&SuukHr1CH?Mkks`pGt+WtJ9HKyJEn}4+BZ+GGFczoGLx5{<VI?hPBb8iz;<nKj%
zIOCziAN8mCKSR^Kir<Ih`RWt>B~O<8ire|vUM&7ao%BBQu+`Zsq9R_IcTC!+RDPyO
z_K+G2hj)IQ+pTXq>b5NGTdI+NX1^@IwdtazZ7VtL`ajt>+sj6*TUu$hIBPe{Z%>Zm
z=7u8M%E$Jt5g*nyF1_hw>Kn3Zv71_rOlwcg;bNKO<+iOsSM?sZ{cPb->T)aI8tK(D
zsbHy}f&bFl?Z1U;ivCWllX|sw`M=Ba`KBKc`nxoB!}ZQdkGz?$I^Eo8sM*_)I#Y1Y
z<hENP!hf451@>l5Y<V)N_WV<uv%6x>y6!H!^QFJh&h#T&f8v4~rE4~})!EByJU*KB
zUE6+XWuw%6x9M+Po%UT%ombjwRJK^zm`#D_-|~NF<39wR-hZR|9~bi@UGYcyo%2o~
z_$Rl2(}vlu8=5YzE45s@xi7SL`R>nwha{&n>FfFMygwGTyT8Yt!-n^F;1B5o^^*HI
zDrVh2GXFzQ#ca1L)1t-Mp1-*m=lpz4SG3l}1-x31->psv*Zm#z@0gs}kEtKi1AZKQ
zII(cik9po7)z+p?<gscxb})3QXUI?UObNM=J33vWsi)qQ{5&tQ(neLQWZAo=n?HHp
z|CoNW!Z*xf*5s9<*=kGXz1+6nrQYK|!{+O6?SE(0-QO?x{!i(Lez%Jy^)22k-|BpC
z$#03i|1QmY$9m<Y?UTO<N40dBhFQ+9klxk#Px|<S+e<%`w||kf-Q!qpz4Y$&c75dw
z>(<6b#<)KDd3mQ!(Yf*meOwQo?J@qx`Sm{otNM@n58Y0e>eKT(Ugj@)aVsV1-hrRm
znYO#8os6DcKgG^d{d{-P#^;4H*I%d~dp*BxR(oGgol1@JmJi=HS3Y`iGky1@`puq3
z(aWc$wms9X>@E!{yVH=%V5r>xjOVrf7SWV<b?>J?S}L`!XK}`D{~zk-%L9MpA949(
zvwt^lVrIdoczN;6;8?{Sz1x1SuB=$e7&FIt%eF^FbF))(+9sR)GupN3>K0#imm>xT
z7sm6t`xmY6xDpZJlJc{geG01t%e0rXPF;WaarWKQ3tw(>Uz}0+ZgP0`UPV)F$;Yno
zbJM52J?Zj<`H8mWlVuL;)UF@d&$lPA{@Kag^z21H>d*Gw{A0cTJj?YA(b$uhbM4N`
zOy@cLPJdQlVVmUbc(Vn+Hop)Jz49Vg>fEjLA5$NB*Yju3Q{0<kV7S$vH_OTNlyr;v
zr<2+pZK7;XZ&k?|#!CNZ$p29%`lD8C^{QnXSGbGcO1S<;@9S&Tt&@xX&VTFqBwDP%
zal%ZA)`!RVvX&n2PM94s`N*tu%TrhE$w<9eQZM|{*)^?aj$3!FP0^WT=d0J0A~)`k
zdA24ZvSR(As<rQ@FMIvVZtpss$p_0bi)$bGn%#U}Kl{my?h=cq$w#s}>S7pJqnp^{
zbk=7+aGUn;@PU7<m)_=@oOarLCu^VZ)d!baj^sspN8HjD>r*_WnSSz#f!eCtZjT>}
z*Ep_v{prRlDZU1?8#jNfc9?eRi=}kU`nR$^{rAot5PHp4ctwWU_rtmV<VUjE0Y6F~
zX0PYX7CNtBUOrEHPb_ml(<4r9Uy+RwI-4f+7(F@Lrm%XM)r+icVqMd3<#&9oejU$|
znRV$rf3L~f58^#<?y4;=*FU3@#3U%4!>)X3PU1?ft=}|!Yf8Ai*LU30XpgzLd{=UQ
zGTZ#p(nqmY*B&gpdpb8^XV*R3#ZS)^PJ7&R=RroD$d1h)zT9eWQNCPSTOL36?2}to
z^LeuhB?aD3P(2*y``qJ(wYS>=nRjo>|1d7O?fY$i=dH4akI~L5fk!hR)E2!D+Z?&A
zB`jL3?b7X2z2U{J{xf&2RC#`M(f%LnAJ%s|JwEnbj%(+xYin->nr&il|N5=NqW5au
zX`ac-C$FZme$x_>(2?+Uxx7jAvaNQ+NAr$9uFL8VF>LoPmEAMRZg=jZ-;(d9f9Kxm
zb@y(iSgXJaty2#p=B#9OHFo@1W46m>bGDS*#)rK8j>3kM4}b5wc&}aY;=beAJQsd$
z&Q(yHuf=xZ`2LOl56??iL_0ShxD~p*Lpj&Y;$HUF2^D<@+&JY^%dRdH;yv&_O>n)$
zlR4Lww*3?Nc)nxJKJf~n_b&UJ-ODFE^ED2<Qlfq1-C~{XOy0F-77H?_`kC$7p*wl|
z!c|Ypjq;tR?7mhbzcOn7k@Fq5=5?-ql`}v2Vta>9d;7YSyp)K4*Dm?Jxu_Q1;ePhq
z)sv=IPcNzH_WYo_Cp&kwPw5f^ccs6}kA)@OmbWS9JmbAB@Iac~PFw9DS!KUHSM&Zj
zKkhY;`0%fJ;R<Qf-ML!-R3m1e4)b1}sh5B1oZp|_d5k-6pIBFa_*U7})!vmKx5?UF
zkK5O~c>6Xfzr{tHJd$!(UA+BTKbL6@$H5N%&k3wL6<UF18y>%k5{r|)RH|$JFuz&t
zqQaFuM|SMle#zAN;a(@rREOl=HMxstoM6fE3@>0*ZvNgL_~@*?_thGYZFQD?872CB
zizW5`crRG{L~u!R&35k9F<x%RU+&OPe0ePBNB@z1To)hbOT99`E;VhtNO#7puU&T+
zIrXr#KEJpy<M0ma0F$4}i{{AqE`I5JFivdSrVnaUZOqM6Rd(ca-*fX3P&af{iJEfA
z)&03*fB~~ih{lbp)^GBDFdv!zPj&azeJT~HORwnU6kUw^5gtE1ym6+T2UF%JcNVTP
zhVxQ8B-!7~Wlz3lTF+mh>{u^av2c(5ve)|*XRf*ATXwNVb44uE&YhF2XUA{#Nx$W0
z_wu}D5aU{VvCR1&W<_MyNp9bBxyDyTsPej5)%97^KgNjMm=_#5!)!y4b6aooG!{`A
z>9DA)SFd-i{bR^-PxC`+UysnywdvbBUIynR`JVFD5f*-y-V>89BN}#ct;|>9w(aUy
zx7dbVKNuD#x_Q&}^}?ar#f2K5{)8_(D{!JqeRAkjS%(voixxcLnS4(&&xUtxjmKp>
zu^)A{O0JheZk_x)du@Ei^}usCvX{*F-PoHu^8n+N%};pxr^sdeD7)|cae9a8`mS61
z+imPupUvl-YwFLPC6p!AdZwUhTaNBDj)T)>1$Hykh3ZE6KeF|^en7mcziaEU>uNg<
zUvB%h&$9iW;MN_Lj-MUpSr`1vpCT=-@Z^Kp--n{Ar3(x1&p7&VYI~cFcm0Z2^Tj4T
zI_!K&^11wn2`{d3=VtQmWHA5Mw0lR-Tb7fj|J=0cQ~Hpdy<y{zr4Mi9m7Z7|rxA7i
z;IF^Omgc;3a4k+>VY+wKlI+g{Jra*C(jI)3D((DH`{Caud$yaeXW716ZZL7#1=r(U
z3L(u5j>@s`6(u&>Yb`wRuvNWp?ShX!x55v9n8n|fr~6dsuG-=irx#^S+rDYhPbX_@
zi%#psNq*1c{1_CTZM^jK^u|N4Zq4tg(SP_PUp#A<<L-|}G10bd`+4N#cg+(0eV+H&
zoXH!ftMJ7uq%^JVDGB%y9{l0%v+3y%Bmaaizjc-+C`Q))^!1Y6^NlCSJrBx!$Jo8%
zK!4j4^Spbx)=~a)?ho(t-v2TGuvFPhsi?iHUQYC1DzCBmq)qvz#V5?g5`Iqa-J`V4
z^RbCO=gk_&AB$I3eE-dV*lOw2`S0JZFOkj4p6m3D<AQ{gw?n7U35i_Br3w6Z^D2VE
zZ>%^O^`t83kM57z9~azyak;`cX2)g!o3p&FZ$7+wC`u?&Phopt{$AC4ZqE*=voOzk
zTXJ6X$83+<>ZAV|1WNOTUs%QNI;-XSsG?-0$?me^tpfYztu06jatyjOxo=I>&S-f7
z)#)v!XVZ`WT6?nhvA~h}0y+;bB?-rD)^fQn_Tl(mbAuki>5{LWTsMC>pFJy%@kgQE
z@(;VN{r34C`-XAp2hrcz4N6QmrkX~4`ze1YOjU<b;+QAj-=itldhUGCZ{KpmPCl#Z
zKf~c(sY9QtcPeiew`17z+x8H9!e@WZEB7oM9B!ZLz4?UU?a_=Hhpvk@%1birh4dHi
z-nnmg^-_P?DBYJS4LR{zxf-rKMtKP*yp07XZdX_4e>A-#=h-D2)1?)EUd(E}qFr1r
z5~uIJ@oMO4mPp;C?vu<<Rb#_hn8a;+=S%$wo`2w<-laFX!AI+4FFe@3wOh<M)7fj1
zS?sgawx_B4d>bB4Va-Wqn3wHw?3vJ0|9j~Rk1nk7+U{%b{o(G^yRBQyUO&B4QT2=C
z%lFUH1wuFPTJ0z>ys*vjfTc}Q*sS`tt@C@oi`Oad{_t;YZEn$q&ip;rw%eA=6sWl*
z{p{?VDy^z2$!zhYDZA}roqi4fkJgWM&yUQL+jQxV_qr`@5zjVWUZ=Y?f0L8=Y2%;w
zV&?CDp4~Ci;n>~1+Wu}o7Jtll`8cOe>e`pT;oh5eM#iRJ{i^L7bjrXn%{`=#dqIJR
zOTnKB3pY;EeW(?k%-+*<bKca2(Lav+_D6m!TgkUKHAh!3Pf0kwU*LA?LCdCNyq8Y3
z$ex;8_(|i1_Bj*jdM?)w-$OOi7kL&ICHC0OWZB0)$wi3iXc|xY3Ffj3?#g+U79ZBC
zJ-dEb&a&D6NACKU9}m~sv_1B@{Kv*b`sdmU`S!_^#9MasOgM9%r;DwqxH)`_KF_Oy
zAKNZHK2pc^pP?no^8J%3S(@v*JMJ!aOZ|6gyJu3l5QEvXi&rd}3z*ecSr)|$Tc*!i
z*YVZY{}KP;7bY5Y@@EUnm%pyh<@+{k342^ulE@+#y;89b>kZZo+o#U%<78>xx$4zF
zgTB}PTQ_f>?sfTsPGI~k|8E?DX_m$@nU6wCT#s?O&d#t@W|?@RqWGBDt^S@jfAkkt
z+<W%!-ZLkaOY6Q&-#p1-_Kdkk4jXtc&XL)>=WtqG;uUM358t*wJl`=PF8+sFF5@~=
z_KL4_jUzhW&R6_-C3n%z)+dqfr$X1N{5+x3z|Gh3P+^x$@bN2CZy9dgn;vmxPvP=g
zS^M-hO#8cB;BdZu`&E58gWr2rTfd&_R(4~_!XpR!q?eXRO>a)`KGqzz?V>5Kkfr|P
zOjGZ<$=`FEBKF>$yr*DB+PRx$PH$gSU+0-GUTPgL7yZNP`Xke;&u5n<O!wJ!$#>^O
zrPCZGuV>t1Na>e!x^TXMPa?h4-gnQ(w$?`-igui_3UOJF%Jw!#cDU|nI&HQ%_j&Z@
zBL^N{iS}*F`*Al`u<5tD&MVJ%=Vr%VS+~da@$6Xj@Q=&e_Bc$N{^4})lJiUc&U-3i
z7Lqw#%_V%2P0j2i%XbH^82>T9W@G)4iMQI}L+{^(SMqz#npnM`pRXl2>H4kGBfIzP
zk+Gl5sl_0@t?T)kI>qc+-}}NHH+;PNY=PR9qkCrQ-kY|oWI9)ok5%d6Zf9+cXO=dd
zjRB4}@1!qO#2=kzFR*6o+3bhQrYDP@y*}mE<gEV;IfVlDCetsNT(DXxac{Nkp}yT7
zlB`RdveVpGzM3a>-A*;*R^86EKkCExZ@Y5g#!df4f7=6^5_WT3&ga(hHqz8uH(~DS
z-MSG*71~GT_<yWSEnk><&-lZ;nSYm@Et)p#NY%B8D>(%xpSq%}r&_72sPiv>X1+*@
z5vx(Is`S47KQ2GW-1_mMZ2qzDzSi+e3SJhy?9R^HBxx|=hRMbQsg)dZ(W|^XUe0;8
z(>E^KpEKJzcHfV>lCM@hIltzv+x4>G_s+`oCjS|%t}bn4yseWh^R~I6T~b`++S8rd
z)yrqS+^6*;cio?qEtmHAKC<VkXpX#G>i<PM<>GwLYdSL@SJXd>FF5CW<sfIzjK={d
zcdI;U-oB{D^uizQ$JM+M74^qviQh7{ee~#YjMTm9MQJ={cU3lTJ-R3I@Slxt8#i!8
zOS1XaKYH-dynD@>E$?N#S8$d_2;KMEeaS~Gr**1NRq2zpd2iM3v`kE%@$P`a=eWko
z5BK7^U&r6RC->p@i%WZd?8v?yTjZ$x%y;*?H#NU2mh|Tvt4~!tR`%{_NKX1H3vPeG
zO!0pv8=D><xhHx}_42zDT^c46mt={pK4Y{-XwN23oyBDbTeu#~b5ORH;%_Y7Eiby{
znv{OG31fPp=7g+SJyE@Vi})TWP1C${THqufi>ELX15bd_yvIlCg-oRF#bSQMAF(ss
zxU*0D$=oe}-90B+Tyjl(+8ur2+sECFXHuO0Gng?ZM@4Nt@^+1VhmG|^-vW+zi+AnZ
z(;Vd5=OCla-D~Elq#9APDW`Xa=I_TFt}RS%Y(D(Y;3Ip_m)+;ZU(2yyUwYvyztO1+
zFQ1(cy<D@&vm)ip!l#{%%5o8POB>eOhP(CsKCZpOyZ+H$u1Gy5om*=@y^`{M7h^xI
z%(XZ_Tco*RrHPMu2@7LbP3q&>(f-1EbM>}9v{?H#-FwBB*Q>Rgb$BK3t!G=ntuWO<
zk|Abt<BoLG%Rg3Ry-Y6#oo^>+xTnq4_;h`KRVTMrLuCEtC!g=L@b4C>d=<_%b>72j
zx!MFfwU_q{FMo{}`eA%%p2GG`djqb=NmtDJ&*0P9sjVI5Eji(5^0d(D#l<Z@cf9)=
zFIQ3TvZu*kN?tPhMO~G%$gN4!FFpCpCnDBz(sZMG$C+~r3O{{tjr-{Pb;lKDt63Fx
z+P5PnW!oBkirqD(`ooEnCCPI-&5QPHy;IJXDboFM$oyLV^J{OFKF+=H>B`B<Y^n3f
zlHB{BZJy)zZk1c1Oak+%Uo(8~EM0l*r9p+h`$y}zjH<d`-n(lL%==h!`{$zFxBfHe
zy`Js3kFz1{&P&aMHmlwpE!%axL!muhD0`pQb$#8)t1acf++I8LEI*yr_UV#A!hsWE
zWxD4iJxraCe7CAwoHom#`%rn=_H8ds=T2L#=<69cUFFbG^^9|#3Y(6dI?m%7x^34-
zzsA-5;*nWW*H*8nosqL?(xFG69V7i1jddsgU1FrQ>0NK2#I|SQq8V*@FXypd_@lmV
z_I#d9`<uL}rO$TVcx^Oorib!hZQmW!G$hM5s+tMkEh>z;-(wT5-f9!d`)u=L?&{UC
zb_r+nzoc*O(^!%_nL9VgcH?S}+Y%WYD)}5<Ui}lZ^KzZa(Pgh@={Nk56ut8;@zIVw
zJF9j592lA3_-)kI)>o`KBqP5^`Ix_K^~X3*#SI&;|8ZUWqFm_a&+;h0*~`>6rnMP~
zmp<Ium!5P}-e}Wm#>vgIc53Ii-o7ifYhG*Z1KlWp;fnY}zs^Wy#VBu#jec8rNBz!`
zU%BUQ)@(cX{!4+MT~gtk(*^16k5YttlMnW<T6*bZrpUD3WpT$v9vpdg??=<*$&v};
z2|N{Paf|ix`F{vMs_R`^arv-ST<c>^uG!IZ{mzH%z4ZLIi%#;C$VI#xtqc^Wd0xHP
z#;K6D=l-`_e;4n`{>@i+EKcw5l9IV`v0VA=FWD{~cH7^^>+mXS?m68rKbG%qT%x#i
zM+vX7_sMes^VVs-Rq^!|{m-!e%0IFF5BAk>6J7sS`FHh??nC?duDmzpXR9%v_4sg=
z`K@*H-dG>jkXm~s=W%0Uwfq#3)KJ|C3$<>nKTw<Y@X3yeOVW<C>~KE*^!C!K^S$d!
zdE+DJM_+w+>)o?=o_TtDbCS<bbIVMf+Ey2=(sRk+<<1RkhH<j1?rga{VR42`a^K9y
zv;Lk|J+Q`><Dl|`jaTPJeJa1O;?>Td{XX^c|1-pD^j9eQFS8CgX8g3Xc#hoO9V-)p
zF7>R)k=gKk;+?{{BkwOf53=3-p#Gq}cun%hXZ;_(A2jn{`8w+D8>zh6xlEg9zSr}J
znApVh%v8PRs9Tt7+S~Y77k}&hJ9&@i@5DNm3hM`;D|WfmFK+RcsJVUY%F`{maUYY}
zp8czkUA%SIv`4vbp0-;`9AK6|zW$H2@^7WnAI-mYT>H<EbvEyIM8C%m+hy)*vwqod
zt6t9jwSP7Xo1(#|l<a8vE#4|Q@=A}yG$+jb_w38;xzfj?)D|y}jy}5Xb=Zv^_8(?v
zu3x?<>`WzZ$781=&d&-yGEdum{>2}?**rHt`J#O2q{KU!pHHuhK3Z-kd1=kr^_`~H
zY1{TVYGqEJ6?sK>G5>!CoqH8>B4M(YX_m)z4_bcy;eTkJ!KI-0hvEdR_Dy;fC+qCL
zyXjW#fj6bcau*~{+}d>F_LRh(Csxmsy}BoGNyhhG`QMhr$y|P`)>oZ=F;6`D^Ua+Z
z3E3^5%`}g{o6C4m+Ac6Sv#PzdPL;F9_EGfdeDU~$GTX(r%{n^!#rKI18|HaRF5+#~
z*-;V7B`0m`e$?7i?(3|Z^RgeuDj&4t+j!Z%(<ZU<;qUC$v}XTZXaBC<bGzA7_T*iG
zmTiw3c~A51<UVlnq3$2fk6!P6_S6dH8XvipY*4H^dF$ROh3i=6{QGn*EOymGsro6;
zn~q$+u#2txQLME8{Db@Cx7mrwCC;-AT=$=0+eI_hur9HkpVPv$PxMaFS6R&*8Tc|z
z{$tx*z2--~(cT}U?g-oV?%k5^xPQ{;x##$2oKq=0Ka=m+36&<z6I;z{-miM`i|f|D
zxrGm>Z|bOD%Gu<UyKsWOri_@s_RfN$RVSZ*h@4$`H1+nY`K-$t)pl;(+~pn+$u_y<
zU__rolB0!9O5?0wlMmVRzyA_G+dEq~|4{h!`L=W4ZTL1%Vfz-t<2#mw8=W;hwEFWW
z&)&1&%bv40?D;WUcki7IF*T7N@@Mp&x|iPi{`(Ud+1sV8G0)dANWNfA)Y#XyZhi9q
zOaHv<^X=QK{15E^p>e#sMsi(NXEk5{dbjV_&xAcbJImwIuANhR9NN`9{S4SFSeTaW
z$$wmbL|^((+J~dpJKrph_UFnp&t$Pn<kmgXJB7btu|<%%zUzrsRkhK-WB;B0Wj6nJ
z&L4*l;hpP+uF3PiDvo#+ZfNAr{mRI5!bLTsi6{4@M)Sq%PTp<$dH-AIhkvVGJ{+66
z^p;7$i>Tz|InzF_bh<RfevgGkLfOY-4~jh3m8|^jv3#|6@e4zfRr;B=qBnov|IffS
z`{l|NbvLYjd6s`GHfyaj7jX|tGCQ+4xyO*_PRVhb>)+2-F8x#V;kU{^>B)z89Z2U@
z^3&V$JXPgsOXs&E_j_0+LSJ71&v>)-{5w(gzO%GntnNB{!G;fuy%!x>+IGA9uG2lv
z8;n<U%${<pGi;vNKVALzvVKRM-+AhNOopG{vF<&_?o(&_`Nx*Il^*Y&Z&BLQ&r{#I
zPw&I){|rZcAH+s^hw{{2U$({kW6i!5lQ=)z?dbSC!Qpj?^tY{l=Y2W(Xv;_Y&P5;2
zd@?&Iww>o!+T}S6DLXrrSo`mu{&RP8+|T0thri1?%@)<XJ<KI*@OYWooF`?b*>3`m
zGgn#_xh!}Zl@hdM{=1*c^Xs2S-11KIH;H?3y!+HOU8(QxleAyV^bBwEH%Y!C`rvQ&
z&+z{Y&D+*~?fB1-tlx6+M2bPb*sDnm5p9u57xE(uto}1pe0ltF{hj@{*uPEu+g78!
z@@VPD#gEMTALb@|-OZcmxKiuhx@*=GbJxtA^X>_cMuNTn6X}0^(to$wG5ou<_@R1p
z9aF{r$d4g%lDSczo_^KV?#@n$Oz=+q6j##c-KoM;F2r}0U3VJ8UwzJpT33!c`wH*<
z%WrNrC$W9X%s(}+xBq9zHk@#N_i6TLcla$7HxwAvx)wKVuGz!bSMl<FtbETj)%~8j
z7e#HBa0Gr|8Ru|Zl7a8|tj8CZ9{kx`_it<O`NqSSzVj#ji2E*;x8c^>h3<P>B_a+T
zE|~Rn!-fSfuQ@HAd~g4?;)nc4>Teo<<NZ7BpG@7^eO5oZAD$Jh5q-GV+>^6#<-u>A
zDouBJdY>HK=XB<G=b_K>PZoaot2Ft@G+njS_${{<^t#`#RC7IM`Gm>O`uf{zJ3mf7
zaF6rKY@e%nYqxl}pESE{yLZh2x%s;%K4iD;O#X5GxlMIrujl1GyK-vHc|C8H#rnV9
z{iy$s*y?X;AIfL*x0~8l9}PEqI>mKK=CZq<j~V={u3em9d?h9Px&M*%KlG1Iit?`g
z@cm)8r;Jy*=eq1;HVl=S%A2>(tdM!&{iExT*pI^BdUZGEZ|RDynEW8W!F0dK4Tq=8
z`tCit#JgJR$>f;}GuimOj(rk4#x(7~`sH=v^#`T*=jcm27C+|i`BgXbgWWmKB+iu;
z+a#8@_Uu>M>9IZ~mFLVVoA<h#9Jr6x<=e=K&HDcI$NY5G;OdO3^~dXf==Z;Me7skt
zBKyIQOEv7qE6={`=9$&|E&AQhp!>(Q)b1_+E8BUlTtntRgVlT?^&eLsy%&xDaXsXk
z`gPOVv}e(~cP@90-kG+e=#sAnBir|+$gUN)=P}5Hf1UcF`XBFyYkQn?&3o<aetf%p
z)J*K9nr;nq$t7PkMkS4B2D-bg`5%5d%%=Rkq4d}JhyH&Ah5vDW{jmFp|Jond1Frmu
zRK0c9wy*J{+<pHoTRE0`^teAc@?9=aYpwE3t0zppMefp0lk?a%AKsa9^N)UowbPIL
zkIsfYKKxJo!dH30S7ICA&AaZgW!Kfz9`n1IkGJ$Ci#<LxEtI#(@m%4XI_@9Bzbky#
zIxhUdeqf)?rT5S7t(vyY>fDq$EAOPvD@@NbTk&w|#KMbyj~M?mxbidAaQ$Ha5bwUR
z-SbC%>Vpnb`@4tcab@q`Z6K1)Gfk`@r@2r`=N-cbv#$G-W43>YTVi9pH2c~-)oVTz
zI!kKZGPayv@nDK<U(%<P`Nb(5S1*=-@=jlG8}sqiVxj*Go3CE({F7Uw@t>h7rv6~s
zA7|Ue75x!c|ClEmExB}f)sJ~$vri>%vHIKp_T-M`XT;wYPW}_^skXn!KJ`DtjcnH+
z)(O-8*?(L%{n2|l1-^}5dMt5?sRzu8?@2yoe|B3bM$bz2u<5VUkNDfA=C^NkYd;((
zam8eAe&9sCr+YRzufBOy?a!|LbCq2BZu~qxNksER&X?<ZF4zP=uC?Olu1F8Q@FzUC
zlBGFlYFf3pYwqIj@(G?(jyK&tS(;F|r7_O8#x-j9i>g4sYxYy;|FF=1=rUixhV!9)
z=VH&_Y8xNMI@RiZ`*`_Hr;SuoUZ2F<C(}H;{w`DDR@W%}WG2!4r_iTc_S(xSY(1Y0
zw>01R&oKYm{>$6Hz5YAnOZ+YVZ>ArQA6U;RFHn&l(Ck0&k!7jKjLh%h*O<?2J2R{6
z<cwP>VI8+mOxiAQZXy3{=VNY*b&tA_2`ry1w_vr(ii%Iq3a2|CI0#x6wK;xYMfA*5
z73%Giuj%`{uYX?rsm|*3-?<gn`ftTgoNc#y*}Wf8mkvF==C3NHu`n}Q_v!vWpSZWH
zR_*gHd9?4=59x=0?R|EB$Unl*|0C|%qg!rMQ}=DzKFu}a&{XY$WT&pf8}pWwo>+hW
zt$F;e?HAu~kx)(bJru9=GchLF=AB|^m?Wd0|HAdPKNx>U)I|K9Un)`mko`)^WZ%ip
za_z$Ia<i-KKV@Ka^U0jYmu2Ly8GW1bGv&+94>PA~o)T|=zVq+L`h!Mwmal&;KX9YQ
z{^8leE!?knXQy4h^y-}V?#lURK0OKF9^MwL5qir|NmNCM&oF-Zt?)x<g%6uux0CI6
z++OSSVbAoaZ4ECMpXzxN=deaCyEUP*GW5niuQ{LRA9(*mnf+~g{m1#flaJI%T-N>a
zd-nF(o;$Yg*^$!n^QhN+Q^sSDEES8-S(yGlxuC-S;M*1Ijdf!FYkvrRI~2^ev^aaY
zx9FThs)~z+vnHNccE#RskKXPXd>#+}Nk8_BdztoHP`+(R@b9VfpVX~>*rpkBI+lIO
zLbdtN_C?K|-)7^T`FPEb`Ul^;zWhyg_-!rgkhSgeE91@DtUT$Nk6mMA7ilUcMeDwf
zuv)kMp|*C1>G{rUR{Ia1RXaHAnz7u%?EKt9?d>cFm!CE$*1OX_QDo5*AuGA=V^#9q
zdptH})(d{ImMuOcC!e~fKOp+_?!95bJe8Ser>^m+yErY?BdP4fF-r^KAEEkxoQw6=
ze)!K2bJgUpkVs(mlDN#*N#?nCk|WnG5_j;pbK+?1ggIX%)}J_kQG8-;+V!vTJg$#x
z-Tg1w6lcmT$t>G8&ETfj1>*#dv@7f4Y+PpOod`K|U@G&1XL>cx5ASol3ck6&OZCI`
zK2!cLt8>-E_T)xsB+vb@B=V?E_SO%lMGDWjR7gBv3^hGzGFR?D!#}a<$M*B{@(1tx
zl+YHdRqGt)Y?8RGvOBLywUa@?Q$;c2f#J!6d-ETy@7$%{HvQNvzjZams&DoM-Mr_?
z)~DPvNiMnf_tM8toi<K8SMg}dl1r*NdG{;)kN%Up?jl$bX}UK%C|Kv$vl%&S;_hxx
zzP0Gt!*?zR?GlyVaUYOS+L!WoWu171^|xz3IM>ykl1lHs9MbhHB2R7B%l%u{>AWvF
zdF_$7l4q`Xj`8u|hh%25g_N!P?ebB*wZ=5L@F73TS^cIxxz;Y1qD<CT9Mha#bX?*}
zUem5qjM9sk^Bo-5JAJg9{&D(|I{6(xYCp1jHivWt3s#=CnY3lq!8WC~XSWQWPLMV{
z^CO{nPN37~ma87trYn0RmaWz8{~Y~yTYc($sk)Q<WlQ%r-WQfSbv}Iar>z`Gu}&7c
z_fCC$Ua_>biOscQ@n<fv^q!|NbJ%mvntwC;yTB&;;ftE!2j|;=^?vQ#9`-x?4tGZ6
zzSyHt@1ET+xaE0@X-Q*q+{gb6towfSKGc5yL-RjF=a&Brtgoj1+S=Zxba9LS_Ndib
zo~m1SW=~qJGHK3%?`mqSx1TxBd+^KufPIIZ$;a*eN!ONsytezJ^0DdjWX(Uni1OVf
z%k3G`va>y)tg`OJ1c^IFhlTE#?6}h^!S#2)&Z9fQOF2Vc?KyvDV~wqo=~IdC_L=)1
zbk5(f{pfzS*t>s%J|<_*6Y6@UtD$`FZtc#ehhsfuv~;CjibbX{nS@S1o0=XwN3VXt
z{BC>JKf)j5f*-H%oaOq&YTa&*?A+`_lkU9=d!;PD+b($Zu?+@4L!(3wvKIAdf3p9_
zQU8cvtS0L3{5tg?{*U#WYg|+HJ5@K&x|bX7zr9UY>Yc);NdJ7^jeVutw^lNDH??Iv
zz4J~qgz>lHhxbRzuFdB*<rn^O?cJ~IF`GZ?Ok=a=&R)G>`}Qy=_gUE%6Pb0+iq8qX
zpgw!|)VuMT$7Y_b$x&M6{b29D{NPtcGK;3k1<f^m?{)q67CVmX_KEf#x0bD#Ck<K~
z#+&uIX~FH7*pr#X+#Bu)MF)%gn4rnp^y~Ty^|lgg(9S`#!w+hYcbJO$n%!Jm8d*A*
zbKRE8N1FQ_HlKVNy>=6mL&BSN7KsxZcf4P}ckS9c+sx#2uY7e2N$2EmfB!aF<McDp
z%(%2kJ`WU26lzXYaV=e$?R@xR)E}b{^A@gnS#`O)V%@{5Uta&MJG%D9)ZbQjPAWO>
zmN2q9b+qnHv&{8p_wM<78ox>A)#;5@KWLToN|>Mbg~6?tyDEP>znUj?_35_i1<9=U
zqP1n$yg4E$V>u;VnnPW5VgCB4ALqk&%=*s|xM|lV-B7vXejoKZb*COEbKa&{T=!ae
z_XgGZC+;j>=X5oDK6lLDZKn_Ya_j!rpS|tj)_U$Nv0F~QW|1mJx1A2o)414n)h=t}
z^R|O4)~H;l)BZ7`qU><QrLS+fj%P~ccbG&^yP}+3rWBUleNxnXxA2Cak_Q>YqfXyi
z*Ibwq=2v2!{-gEr>D+K%^CFe9m+2<I?#<ZT@lF31@A|n?4!euouJp`d-rAQv@4_C@
z^%cP`_2NIWf1CY|y<+E@t8XVW?V4qI{?2Ic+ub|%T+d_470D`!kh6THaHZt0!uiMV
z<uZRgZz$=t3=(V7^^(jHaC@2*vTd`l)=ciyQ$G{>;w2snyYAfjan1L5Nons7*N>dO
zZGZQcUFY)Kx9?ANs#$6-eqC4o-PFzfCQOdpJrDR+ti98JB&xsji>;M@dz{+TueIrs
zjVf0ZuAA(BsbJu7W~GePwEnyaoy;2PLEicd4IEkbCQ08_kGuRw@L|N)e!iQx*k?WZ
z?6&9f`<(TB2h_^CzTAy_+rYF+G_;f5^2Bld+{Yy!TqZ|m#c5u#QGOKbTk~7mUnWlX
z?aHwFnN3lrX766LV$ReP7RTed?jP7Sy=~31cE1lP;=(_g)F<T&RH){fq;)PyI9hXZ
zS=Zw;Mc!Mw_XvKPGx@}`ZwZg$wqLWc{Fr`3dv)}GhU8bb<oYEd;$HDO`(EL)2>57h
z?aV$~d%gAstvRV~+Ts6%SNHR=eZ1e3e*KHCiIsc)GLLOhYnK>_a7u74KWKXDfZ5YK
zr&}#gGi0CMI-mPxoY}Rv`vfxonQq!Y>r&3Wm;02XSKoEauM1M$zN_uo?bCv*jh<+;
zStcA_xK{mOe#b8P{wG^M*uL+uv0Qp<P2)Pf^o>`(>~!cczQZx^^>5emgl6%35<d&)
zTz>u{s?0i8%2)mHE}MVGZL&hO$<e~@xn`{z7xlk;9zA=7IdVruH`9Ts%uPk*<?(`d
zejGpikG=Vj)zWiISDJS^uYLYURm$a_@|J05`1RkMxn;COU?z9lU4?=N0_>79{LM9m
zAGsg7-Vw8!^&|V}t+Z(!0Z~iBg&V|q9Io85blJ?48qpqn@NVzbdztlO`($tZ*p)B%
z<L}q`?U$nU&!(?<r6z0JyMt>r>&)`7pdC6J*4s>zeRbs*_teEnmk(HdZ`tB&e&{~W
z7Y&mgizY7HHT%%5soN&+N(&Iw%gIxmFqPwuX6~!PgJ-Re-EwPuyk6#IJ-@!*n)P~H
zRDY{%{4xJ<(Y=_;OS$E<ZU^4a<#3Y-Gi>jfcwIT;`iI(O6Ccg|s^7Cd@nO7FRseJN
ze*TEV*(+kL{xht0G=1{4d{OeWIeZq%t;^(P|1%ug_TluadAc7%?@hK_aW-{XRK=%P
z>`i6L#VgG+cRVy&Y_z#r@anx6(>=E**L^?qJ*eXP`5l)__p*CkUhv88^0L<+vud_o
zyS+qMnqzK9+MT<~_j@!|7-QbIre4^m`(xkxM>>T+!jC=o@0@r4%`A`R5W(Z~m2R%n
zmu;GGC$%S8WsYiSvv2=_IL2*u+#j|cn^Ssu%DxXgWtUuYSyYVj`o1!xOzCY<;W4~h
zVY>OTyx6U5snq3%wf}}YeN<a&+4ef%vW<8B-?=LtWZJfAiniDol&aLM{+ygGBX#!t
z!kD$MCU(r4`n~Ck^nKYMw_?*BD#cH3`OnaDC|Y{8b@l8;VHR`W8vTo!Kef>CXMxDP
zt@(#;v8~L1uyX5KE$g|y`6-_iXCM9^^s3Npr}ga<SGsx^G%)mTXDF~r+a((ubY+k1
zBVPLh|D>lM*~RQCAubqk!)*C7Z<RY6vv;p}Izi%NUz`o!stVJYtG3t+)|5;Sm&%*C
z?q;-blHQlIVWE38TEx|)i@KtVHfm42%%1Oc^7sa`@9FA~BL6Tar|jeUShse0<lR?x
zv8P{7510SY`^tCYe}-}`&%EDHe*R}@jrsh2r^Wh^t2U}@qN8tAm>-^g>Bg<-WiQ|A
zm#lv~W62~Z`J&huFKMkkGEd46tdTW7TGjf#Gyb32b+cVnr<^ixUF%8|_^Bm+TD&NC
zLR$de8}m46iQ^OXkFIb3C;IX2jgNb#Td}RxIph<OZT{V=<g;OD_eo<3ox__M)(Z7J
z*K!tPxs&1L?c%dhAYRzE@sF<V`y-Wpa~J-dck8H-_^yjK&L-L>fysrly&D%f>J=Y5
zcHqGdnUGy>`~U8JJlFe3aQ3w8+a~Bt(p|Q6(bC={)@)Zh*FQ5n;r1uDcFE^E;S+u|
z2mUzx@aC*v&)xfvOe+`I<y*{SR;9K<{pA$7D$dz?d^I<|m)y!$di~gRdt>g}5`W1b
zi|%P_zi^JZRna6pd#Uw-PuDz`&AIIs@Vvz9jHkW90k-WCnz!8&Z4S+{KF{dA>WA~e
zU;i08_BbxdjuS8KNh-O*-ua-(dy#qV%v`zXrpA*+=ef-IEn*&9$9>%1zQ^#xqt8(v
zUGGg_l{r0}>DH_2$kY!<&u}a1r1BOTOfI&NS-p(UBe5rB*SbabG%kKQ%Xa->dDyn?
z+54qbE=NYcKj3h2)7Cv}chp{L;CZaH>PF_QbDgZqrYAoVy;#a=envjV^~zSZ&ih$M
z)qW;SWvRF!A@rZ&-knP8`t-F=&XvzHyVYfqTc;Se{_uM12dA>EX8S76eEV)$b6nrc
zvNwWjuY7M5mgMpKu;4@Soa-}w+&^acWAY)-wH5!g*SF7VZx5Ujch)*eNqY07mu$1k
zRp(v^*m3L3Z~verpI?2>*c2BL6Y)Aq`$y|KwelTSKFhAGnaI#tkP_BZ^pxT5=M*`+
zoRm)+@4GJek;ZFx`$%9#b<qAvVcVu330(U0&WZ(`x=!Azdu{|6?qHk1S8nE-&10kV
zZRdF#m;2E&$D6+17yWVDW!}Bd#}*%}iV1kLrQO$M`+tTok4f4qMeg;s*%*|5x+7Gi
zZGL!{*u;n2-Lsc}xbb1lv~54@x7^*gIAiyWH#?g&?tPO?)t$dvK%st3|HR%ETW-Jp
zEB5o*WwnobOIMtK5_7wv<fmKG#5a8pZ-q5ED#+BV-&<htwlOBY?aN>8gH^ugmM_Q_
z{E_$S--p|7_q6ZpTsWIE!|Y@9oh`vu(}G@|RXll;CwzHUZ=a<t-{M2puGLw5wAk5v
zboo)k8&UpQ%TArsu6+A+#<~|OQ^isRPAu24={V<bXNT$51r>7o{8>dSKg|D@yLId8
zv)^W}ue+ObadOkWkTloN0u2YlL`zxbButFlK8wHmtF7Jd(2t+(yW|5Sl9in%MDM-2
z>CcHvl3Zuyj_Zhug+HEf;{@-8E!O!gH)68II{ry@R0=xn)7UZVrOwj?Ps8p_`_gCd
z$+m1#bKtmnE<1K+*NvSI`$b;;Q`@)I?PKYGhAy4li#Kj&ntgOin7}0Hex|D{ylC!)
znj6oRyXO10AB^(vj1RbG!<_l>Xvoy1`_p;U1B{y9Svzbryi+tUbzgP!wOzJawa)SL
zo`-#uTeMFpyCY0HeUtn4>=QF4tLT1P;IwLrwArcTyxab<LJ1${F8#N2g`|yTa&}I)
z#r0JET*k?)sp0cWeC{N;sim-dSXGeesbFMd`RM*z+p5!^n?Jt2`*sV@C0V;$8W)vM
zP3X;4VKV*n=|=6hqa6xt>}#goW4`kEWA3`;;w>d-t%6OCMIXH~FLh>|k;k6x&P-39
zKXuz&W5?%cy=v{Th3m3^DgBsz*lOR*N2z^m0_&!xKNXMMIOE8pq*W4$o%grzyJzt+
zo<H*L%UwtRt!8hPK9HX%GdatsV%o!ZI<qv--FT;5F)unj_mt#Bl{+GTew+|lV{$(8
z!@lJyr7LP|S5(}~^;1dPG1)g;Y|FH}Nk3~&$LrkA<35mHZOLZeVaT>2-t)t?>5sVM
z1>7G@On(-$?{&AVgWKj+%%5X#t#<m<#$L>+^Ms*~^TCuK`5(29m_IxEwKnhgv0a&M
z58pih@ODeD<Xp!<rrR-|wwpQyHf`zn`!AJw;?*DS9v|jz@A!AV@ZsF>LjuQ_#dvMV
z3f}r``tQB-_k@`9=W@Gv9LYLSmZvSqtaVx3u<_yDiu0?FF3hyEuNUwx2z&6-$XQrI
z<P(?bf~_-UMQU&6rrhqIk-pw;KkvGd_zrU`x9tzpK6LJz{8l||>mK2k>t0B9d&|x}
z!lN?b<F-df+x#vc)4q{-^^3jKvbie{ue<SMAIHUel52vvQ$3#eF0%F%O79H|{<Q6B
zP}QXDQ(LU%`6{xHnz7wKbWiQW>N}DT1@7Lp{Wj&T)OK^Dt!J)HY?ah(Xr0lxwV&0x
z&nVVQPU^?jhn_W=sSk3sk6)}<XOWUR-KFos&3n676h+-|EX;qNt3CH@!u{RBZRbtT
z-ufYR-uvUzX`AMABz@TPU8*7d%A2i$wwq^)?yp^WW6!kr8U;7c-*|G%&sq4y{?w0I
zzmMG0x@_{+_>p`2pUB)~>pdS|hUrb8Horz=>%=Gzml?NZ8n1f(oH2>RYxB|?n-BL|
zA7#f2n>W@(KRoOCesS3Ty;qj)zVuG^{@SZO!8S^2yq`Bm9}`KKCb8^(iFmZqw&@=y
z9}KARYCjY{UvSIKcWV11;+^+guIXgtF<aVtem2WmwKutmET@jk2%nAlsNY=Un7`^w
z@B!hBk8$xXkAt^eef&EuDCXzo+ukNZ9J8045{o^3ASjDp;K%YuBLDRNGqmJ~{+Ru6
zZoE_96KA_--dV2I8I27>$Ccxb3TCJTto+x%^F|XVck`Jan-BhqUEeK#G*0M8@uQA+
zkB;;|;+9Q)5Xm*c{7yvFo!gzi{$ATQyUcFN;)L4%(2wfJrES>*uiBVCs+Wq+5Kaw#
z^PeFp*4(Rz@4~*?2Yu@I|9Hyuel9uq^74=EuD?T{ep{LT;9%B!4&$uyU(3IxzH>^E
zIJ((crl(3HvpjiK-@o9G&c}b9o!+T@@vDC4KmJRJ9t%n@<mc4fj#P;eJu)%omY7@N
z?umNWUKz*A?S6P-Ph`<NoeOr-@f8c7cLqI<y!2J$&63YfZ>_oR+!X8OV@dIPf1dle
z=^5`X_l4R2^see0x^<&sx6dWrv@IQ;%cC+jXPHUd{?DNMwBxAKj{gkP8kgpj1s_~J
zPxZsr^SyaFU-ue2eN^xKb6ex$*IwnYe`lxJE}kg5=hAJJjZEBX-zQr>SCM-9e(T<9
zpNn5Cb8Jfa55M($#S*e{Pm}cQ(+y^eE6@0d>sx(%Hg#tiyF$<8*-~eZO;vBrN&c8N
zedV8kt5f!vANSW6*!En_yV`xGK8v40q0FUy)q>5gTXw98xn2`qzpSF%r|CaK<i$Oz
zqF;EWUDrgcTUuUl<M^*g-c6Dff1khi+G(%xLR;PWqt8Cgjh9Ph_0Gq9oO=J}wR^!2
zPe$E4CMf@FOZzkCMER0joyAX;CC=)z{AdooSi|wDLOFE9rCZV4+K$x=-}1V2=+x7B
zmonA~>Zz2R2&vbN(U8=$wAZaa=vHT2<M%`TH&ey?W4Fu}vvoguk=`b&R?8OFC;Gdj
zQ})<`rOMlVUrT#-EN$GZA*qsEwX2}0EV}p9@!Pldws+R}E{nM7%HH-s#bdL2_r$#X
z@9ox$r`^z+G1u^_LZSj=<JZO65BG-MJ}4D)>)6)H<<U1!UAuNoPGn+>(+#0=9rM8D
zC;Mlg{%vf<qcw>y`^T~$=D%a_x<AaWReJO;;@+)5wPh-0cWuuc>_}D<eIgOl6uI5Z
zKOp<d@(26>h&B8FP|Z|t&6mq{I}{muQ)!0o6(5F}TjzDkxh!PdP9&@UUas<M>n5*>
z{?m&Ow$=OJDms~Y=il7YT)qDcN9T!8_PeU9{P9TPshGHmX%}<9xt!jo(f&@kH`1D4
z|Jf_A@6U45x(~$hOuMP#&lGX%E|c#{f8ClhmMOoreI_}b@i=XgYS=%u>W};f^M72X
zzqRTvihbWUPw^w)=Bl$9la42^&+Jc@5_&SRyqf#ojcpH`Bv~vNCh=ALn*Kok==p~I
zV(C|x{m@;N8E`a-cgp4Z>|Sr*w$fWaoK;VAEa5m6ETFaHgsk@QIa<!1%C~wWywfr(
znh(!s*=O+L^4Z7Sv;8}`S?=ean_l?MS?CzI$z{o>6&D{{p5C%ti(grV|7rg}KA(^4
zW`Br2@SlP2KST0-hL~)#U4DBj%O7X|wGQ7=J#&HBs%c^Z&c?oaFSzgc76};krnbhq
zy>oxH{*OrgKd#J2{x{Sg+4X<8{g|(rzr%+0BeVaNl9_+}mqh2x<>+$d+V<+fo^7fV
zpKqP082PZ!boTC_6PABe{m;Pa_IGE={M+r{TDJYz{%|kb=fh!P`(!VEG1<I#zg5f4
z%Zq26x|im)=(OpPo{8E!Tta_tI@9@8Mt^F^>Nr!~ck{w>`=2a%bZ;;J`M)9ED?F6>
zcWXGF3lW~=?^E@cbG_b7|5?Z9Jb5hpq44~*T}!XpoIN;&NAFJa1io7PrA41C^c&~x
zJGMX7>(uchfm7DK(_vsuo-@xb?&`PlH_^Y9Ycl_Cu(Pd*evp62nv-w&BkLatk@M6I
zZb#1)h`HyxrD@x?i`!=#KMj9(Ou|!%`Qy=9lJAvWnBOxM8SOZ6F667+qWu?^|Kol6
zcjlWq;ksj*ztexnAGx;6ysu9CY;F3t-e52Bs@iQ67sua;c1_wWcEl}n;yXRNgo8a9
z2RItmvv(Nxuez9<_szCuJ=dzM*BAb_{>@x>B%WvggSqoLb?ejTx6Z#|ryU)sDyR5S
zb;+iiufwO8>!?htUXdJ`^!L^(6@#BMyHs3b7`uL@J$vuH?W)Sgy}LiEew&#0_IY%+
z*vZnY6Yd{k4l|YnAGBVgEMp+~SpAsQ^CPnUKE6r!AAWDMN#1qOUhBQz4&LITH!~+3
zxO7`3`PtpAE~g5tx|XJX+*dF9^4rFWw&xKa=AKEbj(n@9;1c1Za!krKbe;f*q`OhW
zVaeC=J=LCGenEGBhq8-IGJE(V@jnAc*`9sMm;NX&cqtxWbXw+?@1dxe9TTP|>TcN`
z<RsF+=g7xT#a)XZMZVeMTbpY-Un=|hT9sqZPwd(tZWdu9D09(mncAn5$DSqajpVc3
zy6{Jky->!t>l0qy%I|xZpug)`N<@UlfgbhA&owlx+NT-#EB8&;>F=@8Uot!MYvv!7
zStV-%a{InT_RN(H6WdYlI7duqv7TKLE1%BZjxX<7GPZ3`j{4BwG>O|Gd1u>ezy026
zJGnn6RisqtrUzBAsR&+SvPkdQ6Yz^~Ip4-L6}zH6B4#FT-*fp=wspYc89f(Gyd?wY
zK0cq^c)hPUFZIHo%v>dpoISN`jyI;t&T03Xa(v<rF{9X6ms5YEix!@@_E&eiSZ8>{
zRd4bV)%y*mLYMBSK3i;3b)+(s;h1Wr-qNWNMJs=AV-VU~=y~~Ki?8&FE%${CKbkk~
zvC-f1`u>bpvr6wsRti6@pH`{7wS-;KW9E#K<D$F8yS`i&nrXlFK@wYXVTL6Ccfae2
z6E8fRQ6+qBUy-*w*N>m;O6GUYQ`_{TdFtofH6<%%drW`pFj;>t>yb|z?(bwe&9%5q
zWy5hl%RP#Z=N^A^pYcyb^7&Kl-TH>xx7lAlo}c(-DR=GaKfR&9Hvhl;{6E8kxBAWh
zq(6wRKcwHaPk8&5t&{#UMC@#P5#^;g$u;m>^K+*qKW8rwa5*j=*~Aw;|LOg2^DdgK
z4S#U=+|EqlE!Vae#4s!|au@!yq{;aB8O!tQMgPXuAIwSzU1?SQKyT*9q~C`xznI52
zRj;I<Cnm4!RoRX$#VXg0->B#m8S&08{KQnw;9IYDUu;iu`osA*pO(Z68TqbyWx#9q
z=$`T^pRTeK_d3kp#l6|__Grb-P{~y$ySDE99y#UKl=nCO&8mOUYX2d4enb4m_CLbM
z^qDi`I6kuNev})1<ks4Ai$2Cj-@dUskLhmvT<cxA+XavPi(!}+RF{16FXPAlKjOC^
z$9(YSZ`ddGqu4#cSoZ9<#nmge)XiQPksEma?-u!of9BR7l-MU#lm2&|>3o5@Q}JvH
zm)F}kiWpUN`!$E|GZTBuqGqvv`dc}lA1U{RS8<$sd!~Y6;$O*(`VX%Cx2jH6Tl06%
z7qFA7(93>s&uOmL^WaHNGwvz(=Dszba^mjRV@6hKdn*$Q3d>i0{rZ<*s^`@e@2PUB
zkNbaUzyBk`eB9jW)$?QD?#XjREdM6go0=D1?x3=x>s<^_;pgY~_Q`x~KPum`U+~%N
zppWajww@P=^H!YLx4gEzY}FZWv4~|;r`qKetXeF?z*@KKRs08!_pSHY{uD3&QT}b_
zkH$x{ea*66cKv5)neDalVo5x&x6ab(Z`RhXj=k$KnPK;aP;(|GW3!ODwm(e&8JdFr
zGaNMg`d8}ok^c<r>)+U^pRTgGzU!mNrB}a7uD#+5ldk4`t2_0eve48bcZq`%=OX9v
z%|Ec8d2Q;~ThAt6_-CJ=_r=#bs^8mtNq5K<$ungWW&DdynOl0No|z<IX&o}bcJ*Wa
z+ugqVF0c8ctG6<JMdtLIyEMfXCl@EHZ2K&7X2o{HV`n8Z{zZz2B=KFdx&Eu*kJS&=
z58V&b=GQ)mZ@bU+wuU)d*#1`OdH#dROP^VM_|K5h7ah5Dw`-34)PF^cd<K>O8LZd;
zu*{FydUgMUrN5pnUr@26Vzsjsdwbh#``f;EHb&3T<DaZ8z-4tRrC6G$b)uhL*7qI$
zw!J=CURIIw>;+P%9rjeK<E!}k(6_)*?owiJ=#InblGeMLDqmTA5k0E3@wA-v)!RFJ
zK6iebvq8Rop2bVAb*l}NEMy-4shj%iul43fFXIFP?QZ^OXsWBxyI7}Pck@1{oz#zZ
zpB>jq?#3V86`WOOcI{KF&9;C$x<`*BNo-V})}$Fa)vs)lyVCwE@dxC&>(kG3W*TMA
zXDqoL&rp$d#9-TpH&L>4GEL6K&Po>9HtF8`$rckkZ7n3v)pzXwVY>WV?g##3_P00v
zXL!`!SL4bzxAK8MzyHe2veX6U=Hc7>azY<=l}s?$+J4T+Aoi4cPZOi%zfXTWAKuli
z(avA`C;da;T>bX9>ln8;yKUcjW#;pr)3n>WtSx34_r=BU+NmIy{b8Q{nN*va1@k6e
z_-oy2&}9){UG}a*_2iyi9~Q?~JU?`6S?AK1uIp4MAD(pQcBHFGblGNC>sx-|^Cldg
zJZBqgRzyw2kM#>8PCt5KVtrophlhB0vril6)9qT#nMSeR-)3Hz5EZYgryBE+xj_5&
zm$TYOt@x%EKhkf%HDyAC%OP)lzSt#Z0&Jn7hMapEOSw+f6@Aj)=3m&8_+xwEhq$GW
zrG3L6m$jPBf5e>K&9V00uTREOI~8N!9=iSExsv&vw^w@i*4t0L`PFc#bkuR)hx0q+
zIrb?Z7e8{=b*rr0vv(?6%x>{*Uv*Z>TWI>HcO^fPw|j>%o|MmQvXpNq?z0uk=lL;9
zSLyuGIMptBd7Vl1i!!Hw+ZL5`@!0XF6K_?X+U#c7AS(GoMflqE&Of}5D^)Ii?H9=V
z_-vK4D`#It3HNFi!?~MOwq2_1JN)jaw~|)Rq$NG!@(+834~y;7+;zc5b**&1jOl6a
znd#eRy?Vvn;B5HYW!<#Tc@n(F$1gnb@HiV(7Uq^WDQa0sK>eZhmuy0d(=&@q^rh}v
zo%$7j>z#h`)=H+IK04Q)zu9lV@U}y%Z*Os2=h~wmnLQ?c(HG1#uGp6AC+?}g<=NKD
zmo9o}oZ#H`+iN%TL?s!035BcKy}`$~eY*R{`eWGS6|X18MNivxRc*(%O)inlIuo^)
zo+wyQq|$p@<^!Adv=6T5TeePZ_y0SiCVBZ9&iUK_F4CSGdTPO;71N@(RG67ny}LVc
z;?a<x4Oe$fsIlGl;qSw(TmR0s30&@XRQ|WaE92N~p*KB@9qV`x-h8^P{9Ty-aiw(?
zZMs^vX1>NpX6628Xj-eI$GGPs>z-*=p<ABFHU;ar`Cd2^!P4cpTP5#s*zvAXTfO%_
zJ2(B9o4MjemEKgX^Tm%uuOw~URw(~xyMA`X<~2FdOq${H_t@9QUtDyxG+TPwkLooq
zrOvl1wtC%O<6m8={8(?<tLSEyvzqc6r2%tN9?zPd@O=0FuixjCNTn@anX#+4xBZ)a
zkBwlu`i$J(#aUG?Pc+JVelECuy5P8)?QW-(#OnE<ZT>SfHUClD@<Z`=@}J-z@@BJ(
zm%Q{{cPBpc+VlxOgB`Q$>aMfD`(V~_&r>;o;b#Ef)qm5z&r|-9S^X$m^y8gd*AL&G
z`F6(b%yMzFZvl6X^_k~xZ#gY8Ni)ZI<(-OGhVjSJ|H!=jz<ul<$KRDTvLAmRNjenm
zFPov8Eb=QQ_^?2(np=g-X=St2>gqOimJ~NnS;O!5<dWyw)NkH5$^XNZpK@jko;OXI
zbj@o1>Gw@_vi2SS6kq=1+`rpfV*R_t8z;STyDc<xc9yjP%bPn67Jq&{{=)rj(SL@f
zv_Iv4dri&?KQ?cBr}(kGH8kka<B&_qiGSys<nCOwr~AwfLp96D?^|5b%cuW|pEK+1
zk?ny$dCFQ?geMh${U$%P_WOtUZ~qzoF8j}rZp)-$CzmyC<IDcelnuMKZ!<e{Aa}yC
zi7it$H-0u*^Yh(u)4$xUM-JaoH@m*PZhCC^*{b>7tFC4RZ_)XEfBpI3?~DI&W`5M-
zjsI4Db&s>o#9q(ku^y-M4y<E-=upa#%Js?JdN<d<H8rN|DxN<IZ(m!(z3kS@IO7lR
zmM^<~=N0d&lizMPtL%R*6dm#ANSsfK+MNy7oi<<BKj!|&`TjoxtK!vt)<2qqKhz)7
zl|Fn+#4%~|?_mG!(H2iKRZ>1Zbt)4($8qrBNej^{b=UthY|($qy5^7bbvv1gS-+3m
zlmGB;enHc{Q-=ekY8M@p>eoxlj!e!B3jEw~`?!S`$K$gf)AbhioHqEp+`h^v>)VTK
z`)1wvy2pBbFn9l2ufk1Pzwd8ddw=EM`qy?kAJlpmoP1=wGX9Uuhw1GKlXAVj{kz92
z>>99cMatZFZ_Tze^lqFo)oA(0^|Nk&yZg7ZPUq$He@Z_leq?^QzGsj9hd<uhzKgRa
zW=EaqJsB}eJ8YYf&gWH+{8i__+rYXp{%GC8_1>#)pI;jBT0O9pYlrvg?$y^ni!U~x
zsjO`9Jh>ozqs;Z`6>Sws+oSu19Zjd0J+7Ek`DjZB^Q7BTI~n*qWghRXx2s>h;dhXI
z(zK#q%D=5X{Ac(h`urc~<J3pBVZ8j0*!E^-=k%M+UsloYuy@17ClyUvQAf*kdY;+*
zIXyM^uysUZ<I}43f5i5G6aR2!*ZTf7d(79z{pfp~eb~HJ_en|S#WK!~E4<V5_Zpa0
zPI#-r`(yn9elAe!<3GcLMf)^A9Gn06wts6>Po3oc&OBZHJgGy4HY$&+*5CFy!SU4R
zqT+G89e>$BeE%aD{&4EC#S8CLY=87bO7z(pxks-ZuI1_6dgmg|{!aD6Q;$o63Kg>y
z6?Z(bI@elI@zEki)_%)vtIX?bRo`pJe7i4PfAH8o-HU%Lb(bI7&v-X$SGU>C)Q@lf
zuA8+;cggN0R@yO5XXknENht1-`eF8;;UD+?-)`q0OkVg$>cSqw51(GSf4UxbA@BXy
zN2hj9T(CVh<a8!y?tU|tvs(nWl*(_9Q~%G<RQ{jgpvnH!{oFSzx*u<E+GD)-XQ8Ct
z*3@fklX*LOotI1xd^Kz5&RK5kh8v7bs>=&J&d>T&{hy)feEmVof5LyvXCJ8N{F7b(
z$a}5VCGW}y{Vsd2oBVh<&Aj6%??<x<+C|)+!lxTJ6rSz0T>0K>c9~VU-t_wGkAKQP
zKlyR~qw?N=CV!l+|I?`PxU%%>ALq6A@4O1%ex0@Eb@%F-+$Xi)ga$-B=2{raz|plr
z)cxguhBpfzS?hOH>2*Gk%@6q~vaL+&NYJf{-~)Qwtgh{v)zhtV`OZC0wX2OO6Bnj4
zim3+0Hh%i}Jbp|1o79CByN>C1-rux!%Js6#2fuai6}uK(b&@0g$FIvVsq1nr7#BNT
za-U$Pe`h`G-|pqtp8q(S_~DhuyLUnUTO3Q5N5&mq9((_$K<ci`N;_uCI2IcANNifE
z_cSHEWwKITBaf@rj*^$VqZfV@&Ga&zJ@N0tAI9Ho{w}K%`El&`w^cv#m*1>#_TJI?
z<jVU$*^lq)ep$=z&bYY$e4EC)$C+U&7S36#cWl&)*&Y67{+r@OCqJ71<2;-B=)5G$
zN4MoGvy^^h*{M#^dZoR{q->k{#a)IIb<Z8SZL~PGC^R%yq|UbPkiA@;^bhrKW&3{Q
zf3SX#e|Ud)oXv%=x1}p=)F1llschIh=>f;XX`h33^!<AEIiOX{GtYl|uI$dc+$ThR
z&i`)xaQR#2e}<+7f5Lb6KVm=nUaZ3U;TLmmZTl7-lk8f*W2qCGgahtQPv<_&vZv(k
zi8zM!@<w|jOhu|cte0@~+_L7^&ysEHFTSaay?>~BKkJRt9~l?U_Pe%z>AmUOKAQI=
zHy)BX<??OY^@)cX7$v(3w{Clo%M$vYv&P}a)rA#x_q{)aEwafhS*D%&E`LdB#GM71
ztk>r1m~D1R4>H?yzTotPNDs^PX&>1SM%r=KIBor~Zs()Vyw4U2?zz0>b;nz=YmYoG
zR8G9*_3f>Z!}@8Hl-_G;N_)m|Jz4x=(t%Gk(La_y(3N^0Y^|7mpU+WmcU8<BNoL!g
zppFD}dyU+NlDF}5uLSkXN!?{PZO&thm9BS<#Six`%{W%yb}PMA{eygGYQ@cWdz8~f
zcTGv&eL8GM<HW_m|90}^82_AiEPJj0aUuT?o9@Sd_|I^pmg{NgJEd#-0(aRvPZoTL
zy5%XXk{UW;zV6hv0uIpw>P>G|KWx6~|7hpey<QKavUSyuhkd&yxW&iG=FH0FDsL7>
zv?R1Y=bm6SOX@$vq4R=2;tx%`Wn%E^TJY<h^8z341ZUl<@oM#mRGoB>dxcN$XZ<N3
z*Ig(+W-R9HySCr+V#!<e!%<)UGkj>jThaXRTYu6f?t{85%05S2o;`mX-l=xsb%TW0
zDq%@i(@WmV?^N7Aa;akRkz01H>oR9~{q(M1l4YJ>_wBj9NZLJ)huvo;{!}=1dh&!D
zFQ3YZU#*E;mihSM_x3;W3mnT?{<*E>Tktu{+{o{gl!e^2XHR`sFMBiN&(Dx2>1?~s
zdWUY__fc-{hfm)fuB=hrxI@T!b>{aC83uPxoeImp!@c5O#>7oFn>J}O7%?BzI$X5v
zx#N-_AGcKR{CfMnXx6QiB9GI_OMgteb?w-hJ4XNB-SE1=-R{DD<-{8i88Hh{z4qnD
zS%hl5KC-tguv)h0XzTZub$X^|za6DhcHYzpP`ug0#_?nuV~~;Nuk>D%`yF-4{fGWD
zaQ%s1aQ~%%+lRU8!5gbrpEnaPHt8++&fR+?fxUBMPn+e@61QvD13vN|@32XJ__zMh
zh0G5ppWlnf7C5@>?=+q5v#wp+o^!_I<mu?eJ#TFoox+myotfP}cE7Z8iDFy%=;YU*
zrqXUDTR$3X+>n{uf8wTxQj=>^U0AXt^MvquI(iNF`L<ZtSU)%`9QI+!_m7=V_J64H
zUJ<P#XppkKxR#}(@c{1@CnLj+M`JJ6lrR19JZ{I;;~jsrAI(*|*>Y`KeFAsIgtv@}
z=F`Rfg)NWY7d$@kWZ=nl&WHXph}p0&du27f^XqJWk&NpFY`bP%@_v#3pmM7FY0<57
zt_x0O;Bn{VD*UwWQSnx*+%JZ!Lv^FA_Dj8rYVX++9naEf5-)eln15ST_H^&umE0Fj
zTwHbAF?VxKR&n!FqwPM;v!-cl*QR;PGo4=WD#~{5x}aF)fQw6aU3xlWg53qZCO?4{
z5<D_IrEy=M+w=dkt&l(VYtN+38M}^myw$yMkHe(=vZ=(ZghQ5d^`xR(+z#G4u58PB
zOlx_YP3XtuL$@YpUfXWYzeL_p?3HhnZ(w48<>!U_BGP*1btPqfuUcWcrl4r@w&S)w
zC1NXH=h^X9q(6%9)b($DcIiLErbkNIl_k1G4sSa4?^Qb!<;`?*p1He9^)cphQMdbX
zKl*bLFDrlKeKt8arAeaXZLnvy`W$UT!8My}7e?MlW|dhU<izJbKXdXQs~<Zby$nA%
zPwR5d*6sbpFE-tdI<B=!#_LjqH}Bp%)g6|Jnn6XCY+Gx>ANnf&XNYR{_~_r1Tl&`M
zR!ZBwSGTgOPbNhc_)I#ee^Ygf;dAS^HfI<o_k=qgTr%}c>ddpYg17G1IDV*G{g^vn
z^vCzZ<z>519TwcM_e$yxgC4<Wk&*R_Crh$eznj2!?!cpU8TOL-dotJfKRVAIv%TX%
z<PwjBeV26?bXhV!)67fCOzA%LFv5t_xM#iTlic+`;@-#gAB^YwlPlM`>Lus5z@;-T
zJ<BvR=T|zHw5O<o_3@l0OP0yAc0NAO8yA0KL&f%k-~Z`EaO}=pG*KvI&is3xqDwyA
zzQbg}_0eBtw)=|bRTWm*!Sj|`6<v65;xAJ%-)Yws(_)DWcW1sUTl)9fZobsJdlxvR
zmXsv<o!`8uRXO1nZ}F|P{pF8ieX^p|*6VGX_F>1)J`LU6<y{X%GraxtHttb)&?XdZ
zJn_`;$I)g}7oFJ0@!>y1m&tzy{y1mt)3VDJ$p>9Y(_>Z;yyKyIYkrByl-#Gq6I{!t
zZ!@2#c=5!?X;Uj7S?Z~9R&3+@T`2kYHlxXD?I$vC!_xh_s;^z_>N|DZW|dd;9Ja|1
zYxV9QyY%YT_qMfv3@iD5?|eV)?egur9CoXOXQ+fuoKf>u<l4f1m2{cRAJXxAuf5OB
z*~9+$;UimC?xkmY%r@v;e9N9w_){Xte5$mb?j~`|q~l6|r?-81&zGUC)>yv$MS94L
z*%mcEajzapT-JCo?Yl4UrDgw$ybaW!sz_bkyYZvx)uq>VugP@!9eih7P)tR{rWpT}
zf@7YNdsa_nc%GB_Oy)^b*6dfVH>a+uF!tN<qh)&3{<czo{#VBHjd(Nj^_0A)xqg;R
z&#rXQ>JwSn_l(b-<H*|;Z}vDo@)z{B{BXU)#`ck{R%XrWxmwm~6BoAZfA26$^16z?
z$FuflD!i{akL_>WBe~FV>HYf^!QodFJs<s+F`K8iW0#?0S^Jrv%Dc?A`<>yqFIXN^
zdne`Evf2E-xm&x><{$r%F+JQYY^{oT6bsk)&1?496uR34oN7t8_&mSd^_*tW%aWin
z3x45<wf`A9Mc4f?e&nkXdscMoysep~Dgj=Vf|V<|w*)Tg-~FxQrd#2zUDmy6g1S%J
z+e+{Ap8aOA?d;OqD|gK9pZfjO?55|Fyw{zXyYr>{;pHFh9`Dl2t+8EI(fe#`WAC}i
zYmb_F?X(N&(OdjGe40$UpwC6a6AVeqKe8=f;q)QvKZC#@`-QLKZ-%qII``f`Y}O~v
z<R|7go^FrsI4`etywGU-g4e-Z<xW%HWXGK``7!UY&xVg?8?%{a{JXgP_%ny4QytVe
zrrr#d+&DQebmQCuVNZ6Ye@j~|-dYnW-o9qpq??fou1aa|-g%*CrPz^O$M>XYR&=m0
zTrcure}|3b$NAB-@;QH8j@z?uQ=#s;DQ6~a@l@x1cKeRf`MiZ~7eB9vV_@m4)r+<J
z^y=Py_m8H_+Do~ax9X`|&D`{<*&<o=OrS{(!-Au`Cs{n071Um0`Ydo)_rY2IZMka%
zUI)CKRpYv3%LTj3dDCW}7L)VcF-cRjA}^uhp!$N9U!r#`-PG>>Vd>JPe{PGp=L={|
zKksIJ`HXi8H|Na@(oXzAY}xIX|0(?lKN6?Y?)ss=Z|m+_r^u#lt)g25I-Rz?^j#zT
z)BG@(M1J@bJ;&QUU7H`zZ<CsOyo>jbJhzEkSGvc-Ys>b8Udx@bY5knvx2{zjYLY!8
z>{IbjS~@$_b?XW*U+Z~&CA)=_`C3K$7N^Rb%UkNt5gk)IiF3PQzTun4{$HDUer`)V
zabn%H-|ipfT2r%EWZs(FI{jPQ_xK+kx>IdlMCUPh>}d-!a7^1)d)#`8V4Uw`{@(4o
z^t;@fq8~*{JyMofqnq=%?dIL!cgH^O-F>dUV}^X;3*!T_`bRkP|M)HuUh%{2dEkba
zDU+io%<h>QHpP+m-USY3?M)6hpRg%h4tdiVSlea3sUjmYC?f0Py?dUug_`rOAJST>
z_Tyk&)Wuvq*~r2z+)1{@*XA!dT)nu$=ykvc*;n3$HfwUDkF4EgxP>)4T_M_M)8gmP
zDxPS#@xAFOGXJ%`ZSjUJm**dw|DoL^Ah%D~>YnxFHt9fBU8(7o=e3L0zrGOsWq0)6
z;KQ3=Y`^7GFX-4`eZ1<Kb-uZTururZncQvhJ7uPKy>c^uYZ);`@13b~^*_PgciDaS
zU;k6M#5Zw8e9RVO_Xi6L<i3db_^54<wzN64U-Pc8=N9H2O{~ckT!+JUUfz0oef#!u
zsm+oLy`%FbZ=aNYDfC9gU3*5(^9f!C_4Uu}+<A(--fqzicK<NFQTg)M%7s62Wxj9L
zJ1HvmNOF;K6-S!6fsUWyR@Y+}3^z^@jGooI^mykV``V=yo3!;ircJh}u2z`m6ze7;
zB6QefdcaAg9XYx4Ol$;1J_nz>Fl%4WhqL;J<{9=!e$?CfQQrA-39svxCr!ET2ZL0f
z{{6daqozR0_6>X7eBK58OAI=myggX_Q1x2A&&R~Y{xM(sTALJ|t*mpazH8xcoozXr
zM7>XjMOSNIXPC4!%5!RCj0Yd%mwxt_bz(nCAI2t!ZrZZ<M|QeE*S(6Z)^iv8PnU4p
z^xOHq1IwJ%9np!WnjD$MzSx%jab6JTyS`%D`D4Fgk8X@MX}fY*d7oQQ_C(VwLhcGb
zBi00dvJ9N3X|9x;-1}jA%Rb$>AHS}Le-xeG{3ZKj(k{ofFWfZOi>gQ(*w4&o`Mo^!
zq;|op9>(Nj+5P!!8Ftbi?@e43ku5d*)%8h!NtbIpHvf!TDLDN$>z%^W)>A@Nx5avK
z72WnwsoLIXC;g-PaJXmjLw?574|i{G%MjA$?nu3SGO1YmmTRGjzS6|0Y8NGBm=Buj
zPFr58^R4GUgFwEiHAfo9kIPg1CC&#aXDo2yKNb4+%EWn|kG4ed?k%zT_uKKu&dhZY
z_p)x8w{7X>Q2)GO=LWM&@i)xMY8Na%Y<u`^Snj=;hqG0310#OjeScV=_tojOS+}Nl
z<*sKvWiqR8;XZH9gOjH+9{uGsiBF_*g59;BWfKZt&ayxBp1Gntbo)pC!|xg6lHR?s
ziQ46>6SiIWo&CqJvOTA{JNbFG2P&D_CGlx*y;f8H_-Ed_l34k`4{x@ec%<E{c45j6
zHx{N%wp+?IyqKbs7a1Jq;Wrg3y34wC<DrUnuaEs5>(*`gYj^pO_^!eoy!q*?j(q#R
zvGvw%u}Goc)y<z5etP`I&FUKe(c1Edb&ZcscfaqDy0?4r{qxe@y<ukabfrSLKW&`!
zN_w}(nS?(NFVq~Ed@TF)KgAlsAI#~6D=W^)vLE?nw&uyHeYzjk-`ca2BX(cP+qBC+
zyXLS(uV|7<sIS`lK4|mbmCvr!Z`tx*rXua$p^89VlkC&>n>rs>{1Wea`;5u?Gt<XJ
z&);i%Lb9$Nj5JO@QYZ7{@WZv?zVSR2#*QD^+RL-LYx#1IZSh{l?Qngq?vz)rn>QZa
zAv4Lab)Em?^v-<@73PQS<gV;f$eyS1AzF21-^Kc3+qKg!F|@s7@t!MZ+x$d&+q#P#
zCz+Ke{pd_y_)6@SRgM1#^N!M9-$b{0-(7ahJT}|-af!gb**4+lB~+$PvbY;rS;GEQ
z*1hE`zj#JGuSupI&yPNR{+DM}rrj&=Tsw1}-W3mTouy~@e*0?KKjmIU(sD`V?y5Um
zuJ+t`{PBA4KjF+-{~6j$-t+(Q-&&~}y>k8Xwo|7nl9E=d7#hV!tdwDMDBSCL;t5||
zy=dk>`5%gZw>~=gRliv(t#w6=gU;fnbEVsTZ%;ikk^8p(rZW*IrJFx}DHJnX@BZjC
zuioRsN|ztA&0Uox)l<G?>++Voyrj?jd-IfLbZ1`J^yj=x=6+l5=cc!63_s3M_qx6%
zp0(GD^UadTg_DnUE8ofd=(R9VQvczmX%RD4o9n8yJo(vDv*=bvcy0LCzm;<34?Xql
z^lFrMUfrWzy{x9V=~q!s^1Y3bTX+`MU#i)uw|375=fq~GbxZVaeDM4r-*ca<#J_9)
zX7Ro{p;!NyuhmK3subIPtFL=ycXl^-+qTK4|1)&v9-VvkkD$QLd@apI|HLL4c&^`2
za#rl^R)67_^#Y0)P43!9wW{p6YNPR<_1lsUe-`-47~VQ7(y`=c{=PUPktf$>KTJL*
z$Fb>SQpP;#=|{znJ(5h={^5J~hv=%*c^ONmai}M(oN#l;EZaE~C(hbiqCb08`0Ky*
zhvlEo{y6#J{%$+Yir+{6GjP@fozZ{eQ<-Y*`gE7!q)RUgZyw0I5y`Uh1j~HGAGPa_
znBJDuKW$Tas&9et4H^D_Tk9kKGkge+|DpD7|D(rZv)A0Z^|DTLOH-}$;ae@K`_9{L
z7T$F((ymfU)LJO<^g_Wq8kP$G8I<o?|H%I+{!qU&`r-Sdwqm)=5!-sqZ{{(*D>)#S
zBczz|ynSM4Qd(TuBpFfp^l51yj|A`8GClZVan7WYWzS`kzS$l5G5L3N#cIC~YzsfM
zKe&B3IhBj!)}Qy`JEneqwxokCN$|s(JJTg^gg;IEpntT#D^Ba<-OIP`>wK@1{haJw
zviInn&&PQ(R<mep<SXf(h|uxs+Ii~1lQ}!{-fda!zH39zX(hK<Wp?QkF|9A}e4JnP
zt2^q$^}{UJE+100@mIYQ5albjcKN~Fm4|}fUE*#oS8a-3d;MmTvFHS6%gISX5*xW{
zR~0tJoQ?VU!)wv>U2keme{_G$`n`Xjd`#wl2H8K(kM@>_UrK2CQJGiTJ^QWQp<+#Q
zZJVgpBj>kyuuqq|-D=&a<DtOc{Z;-;?{)*tTQ7HfRgf!e{<40@*SB2n5ByV_?6JGc
zI(v8Oq||xG@{PDx<gdLc^p3NzbM3o?iSsPkjQCwkQ{$z79DEq<`oXXFqqwhk#JoqI
zTjqL1y2@^GdUiF)BgNqOrzMkbZ~MvBAUU~!%k%u&sgE9duFB4=V|SkF`6qhuGpA?f
zPl~V4Yu|4wZ9eCK+w$v|`#&sCf2yEaSJnSKU{A-5@H-q5=eIwMch$OP(q;N)%gy}v
zikmy8WVd--`6Z@MB60rt+4>dje+0A-+u8hZ{LjEL{e!~ClH-TguD$bWo@!h5j6<7W
zR^9!wInrZ^&LWpt44ZnFa^*8_$o>)jpP@<j-{G+O?c3jOepuhOtM%%P3tPhNR6eqZ
zPdurx`{I`B*=~C_wW%ndnf5U~!r)wo(j>REpHBOKmHqHOVpTVHJ;#^5(nq6GJC81%
zyKK2|+zq|A-4dRO;SrMrw<!HxqQKDhfXUwMvCYwtNekuLFFx5(HhH#rVmxofdcPf)
z#eV!a<{jN=+x2p@ZMU-Mts8|pZRW4aH3QsZq%Ll1eq`FZWuM%|{|wvy*j;Wm34Z-z
z)|#-1huEHYPpd4~{`%?e_a{&JSy(QtvkA|96fF9?B0FN&7NZ08o1dGRUvyTpdHVN~
z-@-PdfOE_r=SX!uyYBU2+PY7f1r_`KyKa?K+`D>iIkQ5-(V7X@gWUFrs<z}9l})_1
zPwM%FPwSR*FN$$|wDY}5Z1_<-xsS0syW+R}XGorz^WNnm<0kX%l~2MYc+7>Tsy8@V
zT>J2Bdi}yv)2r%w*S@@$7~%Bl-1lu+9ET=-JmsbJO_^)w&wqhod+Jxe{55Z3^7`z{
zKb#)1m+aio9M*EMQd&8`&vg!Wcf*Ttt$RMz(LM8)AK0h&?}|LDjm+Y(`Jo?KqIxg=
z{GPoui>caWLZXNLEvCZlJIuayaJ;e(+j6-|X{yK3tXj=v{XX5V{~6wR&lh^J{W}*A
zyI;v~>os|d+VT?u<k;#yYZp$ww*_>0qU%++nGbr|o|$Qj&otfo`Dkv#!x_@9X<Wuf
zn#(-SX@6vX9REk`{-JxKAMVa?t&y)>b|yzTx^mXP>u*1c>-cfp=5lX5FR-ck07F9f
z<L}4qf9NhhHeV$AZ?|)2uI`%)D!RN!u3dXAc%I4d$udj%DmyDa?d|;2uB~`4nmn)K
zRCZZ?lAXnmh2=|L8NRYp`RLcZD7x*w=-#KRytt44XRtZ7|5j)tGta9v)@gf!9)DZ^
zcTQfO-1CrY2X{{F_6f4yyD!l)cmEzg<2f~}zsPF;`MXd5Kf^)iI^93cVH>X3q*oTL
zb2KXx{JG}lV}2E`-Hr?iyZh$))~wV&_FiDgn(p+~6F4P}80rP`8rfgRb}LSgl-YkP
zFk1QlmEV*9afyE1XWx^2*q&{l<c-*h?1TUKyCO<9O`LH#Y}W0+G7>Et|GhHlw~Mej
z!Fi5B^3UNPPyaKpwESJSKW~4F9P7vFtu`8JTR-?*|8BVUP;};|S7O)C>7{gW%KZDg
z=f$IvOwSmmu2*Xu|4sPMkj>v?|G_W6PhP-A`eA=Zy{L_4#ytM3tk)K8xTD>9E#*H$
zzvYpP(~^~f#=F@w6y%Oy{4)QC=JYo&AD-|3TqCt(&*lp?qKV7<-<%E7SXy1(Jx%b$
z#N#d2BFD}saqxLq9vA)iWwX_WrJ_z!YyB^4Kh!)O>HhxTcKfr<-_$SKXZSbRe+blg
z|4;7tii-M(AGw7qUTrtK?Yi~u)~%EO{gX_XSoG4cpjTKkQg9QWXhi+e^=~HrPILbq
zS0nbHq4oQN>bL4gtXK-P?^mi``gW=`C{Ll*Od?PAM)G$z%ZO9_r&bltKl%QL?y>E^
zWor_Cgyw&o{!sL6>;2x~vzJVDgAN^iv`Z|UbLx&s;eD#Jyd#~qcs<>b&H<{V^!IQ0
z&+xYQx5K}K^TpTf)BdBscgOxq>rT`bdri^0ktKHK#*M_@nxm!m#c7AuxtXV|{Q6Pk
z-)_%vuQLx0U2L_iw)lGc*Ps3`{vWnC*GN8^tE>A*@R4oFi%m;bmnW}xwtc(zOi|<S
zWz7-&XF`MLPb{iDTq1h#wLJen;TpRS3?Ghn?~%`axSk^_<|vom^a9llQ&jf9IA`)Y
zl$(!_Q)A<r^wk2a>WA;k|8V}+cF{y$zNX+u=;|N!(euu#UtVkKt5>;fd)MRaO|=V^
zwE4VNOWd8(!*sao+iZK@ivJ7;Ki)KN{W`NIUeBwxKXli&O&)7+M)dZlrrpa{ytObw
z<MyP8iOrvleC>iazF+-suV1;_B~x!(F@K>N&8vU*^SRA_cxl0wh@MM}o-`Jhyw;lO
z!4=uOs?0+4kJx{PgNMrYbK7au-LSLy(O>-V$hN&(y8X897V?oxxuUR{+u-xtIcrvg
zxLGEdYsv_o{~rA~HvhqYhPL3N@`C#mBfS^@nC!G^(zEZuZRb8kEc|UFJ@N6pM}pY}
z0lA?`TzNnJ3S8^wZGS8Kz`oml>+!epAD#Gx4%Z#Z-}K7q*+aQ|*J6Xd&Rt%)uIz0}
zpPFQ!(VY*Ad&1XFe8$Zm=I3|v=&QoV8}?n(j9&F`&-r8ToBuQLY?<HlP3%_P^ri9l
z?;aOs7F~16<D!zs!Sanv8rNmHr+zzI>%6@Fpq=i!C4KqAS-Q)QHt+~~=`9asx40*o
z7<{A6DE!s+mVIoIHM&2F`J4Z6icid68tu}pvRW$ou17SV@qEKH-RV5HcYTVskchwe
z{rfWM(3`m`mn*%$Ef-`f4SKVp!21D{-<=PZ$FyGmXzjTsQJ%Vf_MNAT5B;cEs@3)W
zgZ2F%s`uY0ez+a}ccYygKl_iW_knWaS0+bY$x~pezMPuU6Eo=zpHwoJpn!~_#Eq!^
zJO3K_i`|$V8-8Hd`#-AY#iy0_wyiH|e)Ia=gZ1fIKc^X)O*pV3pf0EDpT>WN2Xp3c
zZEvV!th;iH|5&`htKQ6qxmLPv+-nops?IyRsA866q!80*t7AWsPA$k~ZF6}1TkfKb
z|A+KP?(K;m(+|7uyl9dear^G=AKTsAPF*|qPu#loOjW1QVbd*3kDoZDl6;u=4!^cw
z|LV@n>yvZk-f{)B<Z|4UzRvx?H~Pq~*5=IVQu;khZp+*{J8z1YtJ+mf6Z7j~ZJbSd
z>@(G#vLx_yz0IwEnDrw($eW*ki=9^2BlGON&H=llJs0Lo5LIZpeYzy|WV)Wb4eQag
z?0xdr|F|wa`;b>DSN&+5#3ZKa&%^t?JC_!DDz@%PVs~1Q+p}uUljoP`eAw6dptjs)
z%ZKNOFRrVxZeojEQnKaW8FM2o`MXwkZ=aaN=gA>5vFF`^HGR{*d@`_+PX4f|c9#4B
zS%(Viz!vM+lYDcZE}7WBpE3F>lgYiJg<P8res#V1>ipPV;Ktn_(#NeBui990Kg#~k
zuubRCGn3mI6W2bvspPTLGh*>OHcqwerDxTTeE+5TzI{*Ol9%(eKJ@tRF+DgtVE^t2
zhcf<@Y4buhuWkxdF0v9}6!ktlPwK<B-DT-N@@rRCc)M&3=v}h5C8|cqW67j{p?4?j
z5He7(3_H|dz+Nc4IBHIQn~f!Vr;p(u+3Q>Vc{74sHu)zPFE`0FD=MG1m#I)Qh%qdA
z3r{Y)$$RNr@vnaAgxwc?t7o#F|Hb!JCs$@hZ9R2T;pgJM^k_$!rMJt^i!>aYd9E%X
zd*ij|-N6^vY}N1oC$w2?!x^zFH-7$lKHa7(#AwEv#gkMLI5J}xI1j##-c{HBs5;xS
z#`8gMQTpWzCbRNd%SHE2-Soli@Ut~)k1Qe^Rc}iER98uwdhCluJrloVMY+TL$Pa7(
z>@&RdXh;6$%-=!R!us5vs_fb^Wu{B^xkrpO3G*rrUA1xju+YZ0a7D#xJBg2W3v;ET
z4yexx<(ANvS<53_JMpH+L#}rT26qHw+dGv%@a$9D_EG-0teC8E%#Q7!*7}H>n<rjU
z`@QZ1$0Nnae=aqfQ$F@wPtf_N{v+Od!<F21Pd^^{T$%Z;vhMT}kBuAb_vr8DReI>q
z|3t#_K~JEhlI67LX1}H%>t}uWAuh}NKLh8{ySLXRZ~tVntj~6K%Td)GDHA&nz2Vz&
z(&Dk`kI?@NtcU+j+9Uqkv+l^PZxcV9I~}<9$MOf+4<AYU^4-dQ>-40_{9d%9u(w6p
ztb6VUw(~H{@cg~?cjlH4{Vjhii_4c(*nN9{@SmP>_Zq?KHAltgem=2L=hEL9Gef54
ztF~S8kT(tg(fKj|a2?m)_6OIG+!w4U53Cn-xVHB1%5^s~g-<_QD0E<2zGV%|Y2n>v
zMb_bI%)(lxi^FDJHRcJ)ys}g)_|^XP%73Pq$g}-;el$*L(tX#9dh4d$y=N&q;Yins
z+a75XG=i451%K98Sm(xmdq3-chUB~UQ6HwQe>A_VJp9+$uY2DZ^7H=4x*1iOv_q>?
zXV#okA6*4%I+eTBXEPUVco|>%?_v~tlZkw<o$iPFLuZ|ChkiIWbCs{$%<3%mi7H$-
z|K670GjU_Zo<kl5vkxjX$6NiVe(ZmgpYxCN_7CshT;KC!(lhbx+1nV7tSH-<X5{uN
zu&jA!c;9i``hvAb@&bC6FDZXh=h=2rS!z<NXxSF~#p{2lU4Jw4KLg9w=HJqX=gZj%
zS0wohy%IZJSh_SjxA+nF>Gb@Gg3GQfNeNBjWXydWw?wZfd*6SCrYHXy4qDpif4J;?
zaewytn@6Hv%oE<az2E1$$&a<OPjBpy|B`)T+lh^91e-4IdK0j)Iq%S;{o4N-QtMmm
zx3aDM7<|NDq)xly_~G#DQB%q`+kW}g^ztRkwI%)9ypno9Y#!+EyVLcz^GEUT<ho1$
z7%x2dA^*YpaQHsu_DAuzOS9Rhxqnodc>CpBk@9@jHT!B3Y}QGiP_m!8o&7QMM?bBP
z%7Q%A6`65;^WIL|_W9qMy19q{D0&9<EZbl4zIyNU_}%pr|18h?o^5BpHK|g0OR~&%
z!#nN*ckgQpzhh^&(4H8OA*ZnS!@Y%a%OB_q>b5Oh?xnY2*4?nk2UG1*3O;W>CL?%o
zBF9&@{fp1vdjBo?%KisS=L_WSN&oQbc+8L5kLwP5h)usI`cbX<@BHNT(KmLR&t7)d
zMM-Qs^V$5nceU5d<dUghv;N@uw))ND$K<=^#g_aKT$Y)+^hevVw{N~meDzG*WLD&M
zN;P`vrlw~l8Hd~KcPXsnd%MK)*PQ+?gB`Ert{Hi*y`J1`cv3rYRgvk!*Y+%+RY!4l
zKT1EIw9k0o`73Yp$Mj><43EprUiqW>$gQb!dwW)_={4MP`D14BCj-ITk2sw3lG~HA
zdwwkZ&%o;apP{L>Ci>&l^BsD1nlUfGPZFEh)|<QRWs|}2;@oQQvK@gpB-f?X?v0q|
z|3&(@RsF%;{~1`f{FREAtjYa2_x+KD8@FZD$(l>CZrPk%wCa^m%<Mxy7;BDYEX*@k
zIH&z8zis~qPyHWi>kq7rJN`)g2!H!Mg{GfR<&*p+v*T}xr9G@Gy`PzHo%#H<vho?f
zh{E%x&mJ4csH8oWxbtec)4p@=A95dCca-*v{%1Ip{4wa$y;`rIXHRF%T7B&M^`HcX
zPxs@`>YjPRBk=Q_fqAmXZChiv>oxC1+@42m-s%?J-IBRJp+$kEeU9Pwjuna<JRUrk
zef`(?pTNJf@!WQTKk|b<x;N~TsgRD$^^4R?_2>Ul?SJu|-qSMaXS2L#w|CA+S1@#V
zQsA(zi#wn32XD&O&Ub&9S7)Vp&(1Xto^ki(#M6o=C)~INI$C*+!cT6kl$0L6?3slk
zxp~g@E0*ehu|FsL;CO$H_lM}C-|Q?t{5|tcENr{B&4rj;vr7x5Qzjg0k$I!8(_+nF
zQKL2g-g+MI-|BT&cCl{n-{b!9KLd9~+wZ4LUk+#1D@{49?OrOhWU-F%XO;qYEspiK
z{k!Bpc=+FFek9v*Wl#EtbjK^DzDZB+#JrxznrUOcV#&IHDU-cY_NtXm+?3*Q=E#Jy
zjZf-=Ycl>bG*|9V=NGEzddA-zFR_(ZI6}o+Zu+Cy!gUE@`4g3PUz&9+Gx_$!y|?^l
z<R<xLtIoPK?c7m!p0#OJ^@rak+AtTcP(N%N9&j=B>bI@0Z=S6b_TT8F_mfk{A%H=8
zS5?<9{)hYDR)3U#uy4t%t<QF^dTkcHS$EH^y?+8H@H=<<?_;~?pY`X<h5Zk1*Y{PG
zZT#E%(fBcY*S^z6$94DKZ+brYjZcs9wu-O5p6hI`e(h6gkP)63n}3-9hk5_E`fWdU
z7nVO-e@j2&qu=CZ=Qm_*cY5x-*DgZa=>8qodbz8f##<LebOvzhaH?KCv-EVu`49Ea
zd<-s5nKdPR{g?h%_7D5tDt`F>?feggx0MSrr+<&iJ-U1Ex}{t(iyn4O3oPE{Z?G;@
zMMGTueX{AZ>D%jMFTQ>Haem)=)Awz=N_QRQ*t&bR-(`~-GiT=rFbdA}-o5X#(x&OQ
zzqo!jKg@sgpWy@dx9knw56TbCXULkx-k!L(J4EVQ`y)-ISf{sZFR}04H|15@H+REE
z$;h6rP|;mqUYXk8VvDx#$o_Espw-rYb7eZjj{AHRZ-1Z1x8T6WNzt)>(eu@uLOD}&
zZ*b3J%RVwk+b`zR>!-=fgcf^R9Diqf>u~tTw#`e-d%ymuG5u)#+q(SbgNtt-iW~R-
zVA6cQJUb;}M$&2}HsveV`O7OG+Vkt4+qoud*ZRZz1+#<w?Iw$Nl{!}@={4NBq&s6*
zhD+hJ7^le!#|0mYKHD#$Yp3?(dDzB}?yV)gdX^=peLT72Uzzb2w*BlWiu6?7weVP>
z>1G3kKX+F%AHQdGNvFnMzNOAM?sY(BcxK*zhU_ibKi(wIDVkWHbxca*NRENvp~Z&3
zm&^%Wqq24<zqIs={)O-U_&)m2z+X|MFH|w<xZB4q-(MZdKF{x-oAL2>OU=2|-Micp
zdz!?29|*Y>#-%@;-*r#?qkYrT{AQ^)+sZFJx|zId^6xr}=|vMI+uyERBf+$UP1@bb
zPut2@{SkYkje36S!<)HV=lWURt4RH5vXU(!fu~UQY!5@epNCO&&FO<GP1(~v<{yu5
zk>lRF{aSs7tjZ7jkSlMVZJ8goDf52rzK0WT9i3vW)L*owVOqaTO8<=T_^ZmYUoGX#
zg33B?-~I9XQRuO$wI9Ae5^sP1RaZN#BIoS0F1yo$ksK$gLw5_i?Cy)~P~a=)%RaBz
zeC%HB*Y$6{KK^o9&t%zeyQRxG>$j|(mvM80-ZEj`J4QTjPx%EDPfcUE9{iBod-h#D
zf2ltv*Vp|?Of60q*=6<G+~8zF>x@5-gElp)%u<g@R&ui6Q@Q5GpZLYc6Ycx|nZ5WX
z#rvP3ZHcGYCw}eV9+TaT*`8}3nJ0!%Emk_-;P>>n=^9N(>l=q(3s1T@bx+~nnN{0<
z=^y21xmPjonD2CP@k>gt#FQSaS}nR&$o5k5q7x0<ERWl~&Xg1Vu&i_0`X)PxAN~Fp
z)+Nk{v2hI#o|-&=qR650%xg-Py+JOwZ!;t<|B-CpRujL9U#LdsW9jwIEhi;rCP(VN
zU&}Jv(^2+P+B4bZENzn<#1%9iZRDG5-~Gq)n|=2@_RDYWPVago>vgQU`i8<JB^i}m
zDd%dDHEfS~cRE!+w|o&e^^3vYbE}USXK%0L@Ami@+j_iPb<gMAt<t$#Cf@ZbmWC_5
zJEbxmeT>(nKefC)hdIPXHhIa5Uoo@P4_kMB>F&)^w40y1D#o`^i{+=!w5Z%KO;7p!
zWQ1E4%hsFxRSx{m(6ax?rtEmWIwjLfl_&DPtiBzge?+<boRIE@*aHy-^U|KO)E?q3
ziCUfY&*<ZX5B^8)v#Tv#VwfoUdhhHb65nU|KRwU9{$9Ld%FC&iOmh}}cU`HvSnuSD
zibvd>?`=|ZN?*Q}xaG{(%RT#eUkbO%?EEu9x6Q5NB%Vyz&RXPmYvG4gmk+ib`W*J*
z*wR%mt{q&m&CKf0_O~+S$1`0GvbaT7-7au)RiEOhB9v{%TkP?XWtx@#q5E>TBVS3$
zsNMYXVwSGg)mz4&ww@99<-ILbwd)MOtbf!ioAj0Uvv-xve|Wb3;D(CBe%TdgkDt#<
z5=v}YD>uLFV?)c6rs@1@76)IY9{no3Vw-7v*hkd~X8##P-;~rw*(!9d)iZf<EArnB
zj@wUe#xyBS(AQQeS9Q0Kdj3aRz1j4=h{%V%{~0>g=n0rUTf8jGw`jvj*#im8wfodR
zElRVoU9-@Ufv54zwDSK9yfw^u`}uNe0{=5`Y<*b2ecfc~wO0=<IglH#^v5gAR946`
zMDwB7b^gceJFovrZ+{-E?zHpcj47TX*CtKQ>X}os=vL*j#u@WgsWSJm`DU#wu2DJV
z@m_h$b<>rPK72oNSNX72TWeuUA<IgYX%87QZe>TGcq-g<H?=MH_P<XWFK1U)KCG90
zo%G!GYK`-v*G6?O70NPlm-h)bEV}lMy>T-4j;))u1wR*F+sBoEi#zJWe}<{cUhb2=
zWF!9V$fvc}B4hIeAKPpR6Yo~tSX8hsRM=7?C*jIB`z`Em?H9fLUQ{v7`#*z-qhQ#U
ztry-d>U)%MD)8dkw6azQiIYL0?J_c9{~1E2uHQIm?WN-{*R9Te%=|3#R(*R(_gkr?
zF0srdJN8I#+G!A{eBfZ8@y5w7eACt~{P65pb$zp#)!+9m>)yt`efuW&bB6lVh#g`t
zS2*Q9b7g6oXnvt@>d(s`UVq!L<6=toeC8UvT25WbweORzN<BN9G_x_|iJ4Hx+q=`}
zDYAOL3Sar8Ci-{izZ+3~%XVqKl5#yZ+wA4kH@dwmJFmQRoph~aVqH$ko?^iX7GDAn
z`MFwk>7Dr-ef5w2>UC2^+dIEp|7hg6HMK8w>#Y;TGwse?ZtSUj8g!(Tp}A|O$yxq~
z*JkD?E_zkv-mJJwEn{&?b$6xXfz*g4Q{zn8<yC}M1lhe;kv}Y}eb`>Y&ah%>UTMEb
z);;-;Je$_^W<Ncjr{;1nNq3#|VWs4@NjE+iw?%z9>;CZlQU12RPe0lNw(Y<Cv{3HE
zdz+nI+j*Zy`$`{I(mX9BBV?slb!F4n>}{qUo2um3-qXMSNBvPgoAZPFLNBk^nN%)G
z-MQsbYKef3yQWTE%Exnydv7Nc-CtI?CReBAKSR53`9pij{|tu|?Ut6+Z=QX0>H74Z
zV`Z}|7Va~=FZ$qX(Q(W0C&?c+ADh4Bd1Hya$ms`5uWwygE%npjX2eXPGu!NZJMB(q
zN=%+0@_fO1M?1^Ei|RKnxKv~L;Sq0<=7ZEdaw>DYWE-SsY4fh?lSp~<nf<zg)b&>}
ztG*kDMrS*J?GO9U(6Z~d&$aX)^ArCwaN0hdt-Ezkl!W}tZM#FBIj#_yWa@tIg-ff4
zB<~5veGL15WIud%UH#(vygzCik8Jy1Hcz4Jm8{*dFvV*bi}xisJZ5n=>}+Qi{qdjS
zk!<m|HJ57C6CY^oNnG+nB#Uv$mTg;mGAH$$Za2yK9xi<B1gHIO7QxAVRyDIf27j~v
zyKn1i^J}KIPVbL=do7tMCVi1<i%X)R?3wv#6Qkz{Hy(30-6pRaRQKgg@zo=damT-K
zFZ*}1PU^#dhEDd@e_AyjAM{p=uBu&jJ8;7^mzgoCHcL0pO%<H(W>N7@zT9bn)W`ko
z|1Ry{^ls}%t*d)vQy<Na4Rf!ane+bH-tCu5B^KY2Y1wHMIq|cm8fU=#=?Z^u{Sp4)
z|EBZdd+s0U|AhK`UY9;7+3VwJGCzgYK}ES=<uu3L^S=&p9<*SV{I&j}+RESNfAlV|
zGszc?^M2f`5zYVR{-&3gqlDGo&xna}H<^~#XZZQ3kYLZYcMSKIMSEtl-4@kJdA`fO
zaR0+%dEvXaDw1m558c||zI3kguFDH`Wo}g+yFJZ8R8M!EN>9&!hBb|!_&2P!)4y&f
z>bou`%Y55BgQjl}i{+MG&I<cBS;VnPFmdPR$xlx@8nG!a5AHwS-!3m(!~0;q)a{D>
z57!^cRX-?r<H)DlB{9CLYfilqJTvjOS5PEh@y<nemZS){*3N#wf6M*YJ&TW`)4TR4
zKi;-)Yv#t<-0Ym~YBni9%RV1|vT1{abXuFA#mUz(q6TZNl{Xo?zj(G<y-#Ps@AAXd
z@!ZkTt{g&{-}PRWsvKx4k9XOwwJ-1Ckqzr(QocQ?)2jH-@bG+_>$d*2F%|QEzEkYe
zRJ*AAY!bI=>WvR4byxYUSmno-bh~kqTVcHY>;DWKbp|z|AAQX03_eV~I{#bCN|~rP
z!rBR&6S+_9Po2f!R{nFslqWUMcAOXgcXGbq*Ryr+{XVQeZu`B^OEH)2R=%2b<&;mo
z#ml#Dy^^9IZ{Yp8?767Of^9j=Rr;4Fe@tE8x<`3=b{zL)@7uP!J+@2TJ?UI4C>^@E
zkM+~RREdOZyFDdu_sses{mA`o;3IvuiZWm0L%aVN=T}#xOuFpwSvPiRk@xQUv{uJw
zWyz9Z$Iob=w==CfQZ@JN*)vva?3Ayq$-O%B>)FfMLI=c~B-hS<JMqEiNlWC{i+;Y>
z{hxv5>yMksYhT`KZ>@<<&1RX<xzPK@@?Cr885J#Pnfz8GqF(Io=|A4{=7zku9ChdE
zoaYyQEq_?vWvBJy*tOR&7v4YrsQY_^UEIoA6+xE{Zi#nM_ausboV)va@*kJ4_H`A?
zk9Ci?Zt)Fz|Csk(@59BJJcjq&mu?ZC92d>tV0L!NhFudEsjN#2EjX?sdOG~XFaLw{
zTX(Uy=!QRDV%4_dvfrUc*L`;ExN?b6Uh76#+v_>0p~^;@Dv29+{FZOxKXB#4z2&JN
zgngr5E}n2(_u4kOchzD6k`Ej!l&2YQc_+AK_9i#!jOUV{w!O(^U$pc2tnF`Ce(-j`
z_HL_x%dca*A6qQyi?}7pyQkQ-;KyO#!t8Btl^?U0)FtFUR!Q2Ie98X7l6d(&p&z@h
z2i3RTlAEZ)6tVD{H}~zieLD=#TTa!RU-hY5#do``<I!5zNAEeZ>#U{+b|0_fzWBcT
zhQ#7sm!{5p_n!S}Pv_kzGyf@*)&=zMZqk18p0)0r)%M<h3P&IOXJGcNTz0QxS@NR$
zXNzZ+ExR_uxniQ{CdDS7a#aJr2ia96D=mKC{@Lnjy2|d+kL2Ip8S;XEd^0xxaoV}#
zO7dK}_r5zKR1(<=6&g<IzE4(ZV9uH8{yqC%P4$YG-=lo)DSc!=^h5t`qM_-sl`JPp
zQ-X?RCb_HM%x8G4v%%zq!_USi^8H`*Z@NEzet7m<W#=F3AH^!!s-1hNr!?Pl9>=>i
zjwe2!-E+a?c!s*2@3T*iGR)zozVYAceiT2FUh5rl{ZD*y-DH;BxMz>w+=@9mv*^O?
z7kX>1rW|1D4B7tS!RNTzi1nM^WwYFT9WQR5q2EzlvEYTB<d5dRy{pcuosPBobnot#
z8phU)TZPG%nMTnm!5hyREGhZ2_@R8K)V0>^`n7*7H~;A1a=RX$Z^E!<uk@RjWf!#7
zj5mv0Pf5_U<=<X$?D6BCDsJ<``Yb;Rb<|o^kIj9=-lyG}tgyP{>GZdOCzg8Ln(QuN
z`E*L@<C^%DKa9OU^tUVj*u3&bzst713*6SZV%Op~zs%}lzqx$g^>Z6;%e!VOW*q9D
z@|fkpUdEENwuO&s?GMQbUdSo+7mcg2+<sHX;N_-+GMi3pH2iz?wGY=*cg<ZtjW}LU
z?A+=reYnox!^z8kf)_b|6#MkZZOUQhB>{U}Y9>_{dzSgM)T{}6o@c?cXxl&GyZRk9
zBKmcFw)4BBEa!0l4bS=LDQV-r>15bFrPZG{&*0QPz0OTL-{-^C`)wt@d9gv){XQ(6
z9CNg?TCCrOKVRqUlyuiie`Xr3?tSy|=*99vziW5Gx3yb7oNM&>u$;`bFaH^MUS6tE
z-5%QY=wGaZ$7;3<p>gLj@4ZuM4dE2hJ;5ijYNO@yg*TUN`gHJdzxeUTv0Bd<KObf3
zICbD%M0(n+44dVFpL09;-Uu<MZK}~<USoePecu%u)m2&h^q9=t`|c**l|A^g$vV>b
z&LY+m3Ab<XJXYIvR@v{zW$|8}wQ3*MPH$eQU6AwDTdXM}dE#Z=Z<95>pOj19;@z%$
z%*{3Y>)$-n>>Ecvtli#HqqsKu^*zZCGV}Pem(IEw_%3zVWp$w>M+L#tYIB9x-IJYW
z9^}=N@_cW9*pJTjnH$#FSvN;-6LNhPc|0x6KtaKJ<@Wy!?x&a=*3Hb}pS^ND%eD)4
za@qUTCx>tPvAO)w$+znAx2%F~w;ptH<2KPypJn|*+NOP?N>4(~-q$zuwyYO^xvhLd
zMf}4x_is!v^2}e6>Gys5yP14Z5zDeGFH4;4W1Sn_ctR!2FYCI@qRRgaU3FZ4G(O7S
zndP?hq4rF@g%j?mEzQ*Vc*pIihp=?5iISN8muu!h9Q>{8Po2ND{hQ5&(z#~*E&my|
z{AXy_dH-M+uifn8o#A|rOwpAKi|yu@iEaupn&)S}&bRJuR=v>H)zQD}xqqxb7AE$q
z_3FlX=e>$$KIdw;6z6Wcd8P3nQ}C7#j5a*KFE6P0>@Fwvaej;LpSTz;-~1J8^o37}
zH}kG;W#tdmE$HERdCbRaa@?2LnI#)_^&(d<{=xot;eUn)6ZcEnNUuD<s)qf_;*Y7F
zs*f+5iuWB4>q!upc&ae9dh&!Nrn?y%oP~UA5+6j=#6Mgwc&mc{$i=LGLLWu9b=Byu
zxn*>Ac~;o2BCoScUzMHwbXsHc3?+Y^)G12FPZz7K|HW71{de*n%eA)8Hhwr(VJGdF
zbvn0j@sAlRF3SbX?qlgyz2mQ-&@AoCXZPy4%D>9G3-KG>JO7j})o=T!TVv9G^jGdm
z;pjUriw>`JWzNl=E|$Mf`gNs9dbab%3(w{L9p(A7NBMMMY^7Y9vdZDBHCN_qzd8T-
z#bNQ|fA#7ae$0t_F<;;dbHRpp`C8na6K}42C=nXJ`Lsc%h2*xmJr~=y&I|2-dR8yv
zjd;|L;EzG)o?SZhr#sh8%}MXe@6$n1+%5g;`od;%ivPBm|BP%q`=4R=e0lo^lf>+W
z{)ARPp5L&~boYhQM;A|;O@7p|j%B5d;IU~x_PBKYy1C8GzOs<_@Rx++bMMc&zeWGR
z{NDRqYn8jdo&VsrcGD?i*7ZGqEH2zRbYbPOo9_apZh0KA<gS#_m(+jKDk=K%p|O>z
zNzeW>A3jFfR_V_QwAZM~{Gk8Hyjk!1n`=c`vvMAoZd<%u`OYoBmI+)oS+^qun`LIl
z`m>bV+O__+u5sRVLHg)EYl9!r-ucrszb2{}-7#Q!bnk}dEdR1wtJp0~zsUY)=(dyn
z;q3W4{ZMW6(T}gh!vm(wdQ`3LZJC@<zEezZ@@c~WF+H>A>k72bm#)=+l(u(y?2q$D
zrrqj26}A4oeyLl<_0#8^nk!za9PMXRx?_AJ{A%FwN0vd)Y^tsXRVn}S{m;;xXruqY
zpZ!n#$7Ac0^K&2N3v6qcbZ1rTHeY?et`Dp``d%fhNuQK<??R85$2W#EE#Y5Zehh#7
z{E$EAEA#NE^SxhZS9cbj)jcERxnzU(gyy#etC$;`gffm5@1Ar0!{Yx8EIWT3d?0`G
z@I(EsefqA+tL*l#yXU+>XIJi#4Zi<6rQ?kAIs_*C`zyMsN1|cvIqf(8V)X|d?QDK@
zozvK(y4rE+vO|}4pZh*tSmr^^D<zJ@6AqtDe0yzQwd}OeBVomV{1+d1T&by-{448Y
z{@bk|KKozN*&3b8e|XozjQYw#o!yD|>^{4wgtx4g|CMvlpS4f>v-V^0KVrKq7VfxM
zqp$jH(lzZT($&RJ53Ol$@+mY4YP=X>An|15>-dI$`XBv|@OPB^)C8(6uhmiW>@o0G
z;NJ00#WhcG=j*oq*VnfE6Zj+Y@%Zuif}RiNx0-ve%1$$S>_5%5>t%QY|Af%=Psc6G
z0vOm;!oCz)1?*X6cv@U@x1+p!P1=8krWF;FkADx&ytQm?&U>9ok2}YUEu9;Vs3_i<
zdwl&qTizPaNB<f6=2?H-<xyjuUtIKNiNVBKXG(4#(DGE5x95I8Ieu9@=YNI=Q|Akn
z=66_?x73;3>@|H~b3A&kP{vo5UL~ia>mGV6oGW|crUcI`PwB38h2PJ&?td`5e&hBQ
z)6@K{75_e;+BGY@OY~#v*?n`qi*uO&ESnZ|EU+PnYm1SwTrF?(vBZ^27Hu_Y6I=7o
z_-FR^OLn?{oc5WCiJSetxs9XbQGQ-${NC+VlP6woWw&*$o__fJ54HJkLqFa>5_aiF
z`os2~b#LbdOnP;zbyjVY(Vm?K_wGgK23T#<l(Z3!zcszJ{=uAiq91BocCBxpmCJSd
zbcoR%?t0aS>~_I>zl2-5<s>G~6FR(1`&wJ?qxY?|Y-YXdOiayA&zcuy)?2UEpCv5A
zshgTxbo^}D6CvFj{}}{CpFb-8`b~M|O?UmS@|}Oa{4x5^&|I;{aoy{x+^73Hx6IsH
z9UZ^Ldy&7*n^!+Aj9e3IR&3mHsOhyPOY=O#xakkq|4{FLGqL*NS-a1V#1F2Q%DDCC
z+C{tN%a7(38%4z#F&8qO>NxdUWcCEBjXZ3Q3eWa0^Jn{^ez?wj=f00Q^#Y5wTrc6S
zSpUA%pEDvV`c<4u=d+G=>!NNI*0n0#xOkjPu&?VV!;kj(zYFYB*E+}T-M{niygj0&
zD&K`XKF4K#_bya67K%%?lPFS2KHYS-?Y#Qhimk>u&QmY{?(4C&3fNT;^!q=<1Nr|~
z|9to{@nigh@2&3_{g}M!$A1Rz4OdJxrrq<1i%2yuoD$+z5ijJ?J8_!N)F%&`d~0(*
zJgYT7BG0paZNAA`pNJ?)smtNH?17UGG3Fgu)4k&Fgu@I;KRTDBy#Dl#A^gkd5B1+9
z|1&g|)tFy>XVTw%pXZP4gZUECe$&2--7;MgpV1ZJwW(7rKuvE+8;`^ao9CA6*C~C}
z@AxNsPra?i_ff3%k+3tzIKKR@T(oT`*H8O>pYtOn_(WKH#B5tDrW#wnnAUzTXwj6M
zd&@ta{c!%9)!(K688X&$-2D;%(7%~EDr;Jk{@cH?YZER%nwoNl=Uz7FEG7OEN^PDD
z=g*!H{a*jZ^*;m4jK6d2)A(iFKgvJSUEi7T@lfm@v0rlzN$Yamd*E^QS(KyB_N0eT
zWES6HyS4w-<BoTtzqUSJ-#35L_J*y|xBoMA)C-y9xBpY{u)I{NTV@^cIMwN*>D490
zxuKSK3PNvI&71lnO8%&>dF-aG8$SMLxKZOR^5IxmJ>SjP`!|w2u0_Nyout;I({X!p
z-UBN!wjCcOUTun5?UKv#=-ssEuC>J<lYRE=vq~wmQ~vNIFn`*o%%{_XCpO8O8M27&
zbJ@MQH8gQvZ*$DI_79s6{&TSkKlq<vTa86Fr~J9L)81RQh;wgeGwXYH&EX=GGc#x4
zZh1qQaNf0lLVt)p%ol$pC-<TMXsl?BzfPy@{O0#x=h~gRtJk%_J6})RQ!n>$=?&&>
z{(jk4{y4L@mgb9PUbC025$3sd#=vA&&9q;o*VgiQDmQ#w`zey+k<Ka3?gABtBgt%g
zUOL_n{2ZB8Gyiw_kLE|=ZS_g>JAT=BzuEF_!xiOzpDp|PelD3+SY9e)XngzcG*wTw
zq7!RE1P{w?{j;Frc<6Q0=#on%Csk_KZa&R(oaJL{d{C|Z)OyGLAHwZ>=1KkV{=n@1
zBfR!;>qnMf{~0<Hg<f{ds=AXoZQDxIN0lejgj{-Mm0P_Rs4JL7oBrTmWV*idy}pg(
zVvo&f?_6B_C681D9O!?PJo$W*_LI+Dr*E%NU$y<`yklJA3*YK4&i~Wr9q_?tLR8ev
zA2U=>8>qOPl4U;TtdyJ6^Q7RfbCGrUp?%sv;y>yi36E;;*yFb7S@qXF8$adFFgcm<
zpP@FnrnQZsfoWy?B;U2l1*~-wVl#iuy|+^4*DTNc{Je*^JU=bHQG2D=Uw86pGXsVP
zlPaE;if$4QiitXAv)m%#@zXM!qP-mFE#6gK3(?-O<)&%!vi4{4hxfP4vTsV+^ijTf
z+Ve9P^B(Qk(hzgjY`*9bK9!J)#53irv4tw!JEf=8ajt)1{mtp`#`M1vZS>clPkyj_
zzRVxNAG253UYq^kFVj8WsLzMxjAl;r-p_Yh^wRDnQ5|=y(@jo_?&NV()-ta%`SIC(
zQ}fZ!>)Nx;R;z4WBKB={&N1$^@O+b1b2qs3Pn^8PIN37wfZYAx`ah08`u=9+W6PS#
z2claq=e~ckb$;-rh4WARuD_8k9(McIO)ggzqjf))FwQcHU<kcqe(AKJ*knshz3652
zc^7`9yI(8i&^PgQ4*tM&Fjq2{h1*)=#zx(l3BOHdCe)XGa{FBuqiC^aZq@go{|qhV
ze*NDjd{{TLa{0_l)+rZr^Zqyl)$4BadHHwNGKp`^GiSO7EO@&5)A7gW|A;ex)BBNe
zt8C+AdycI6LZx^8&g%Qr$zPhJ@n-6cNB6Slrrg$?8f`sEETMUF@9FvSAD;h_vHYzS
z`NQGIN|Sn7vz<F{+SsmkU+$sOTh8jSmD}d_u^$Y}Z>5CDmv&gJ+hrl+^JpoD*`A61
z!Xj^O{$8E@;BG)fY{mJ5RZAb;Zq;A*qw1T5j>(sa!Wj;(jk~sYIiKEm@6X)D?4s?D
z!awAEmr8wp{67O*gx->Q<=+x6zgbt>((*Ja_PXFr&Fy?;4<lAi=y~w=@z3@9|1&hV
z+p)#}=#Tqo`~1yM+qSK>Qrxz2+OMnUI=^M)$u_-E?VJ~-8gWXra&wPhgYjqeuKf@8
z{b%?PSet$%dqo9%_=j_oljgt5Rl9UJR%Y4xFWZfcP91;GEK=|`r{F-scW1RD+tZ~b
zLyleQ-ktu<J$Y%3^M`d)_9=b%w!HLFiqO057uQRj_UY4@yGiNZwvW5kXw;WWHymfM
z{;GatpZ*`mzccN)<6p^({AbAQb$0rZ`-uC+<Ef>#ZlRxz`_<Gxcm6iHtjXZcf94KP
zj{yIN#E<FUw*0vH@$-@LeTqL;KjICz7klo!iIjKjtq5c5)Fsss-=enkRA$QA9{DbM
zAnTvj$HQ^Tul6Zl+1i$RQ{q~w_v)sd|3uu47!0iRjK8egRbzGg`_ms1^_jt2FWGO5
z@38+6{r=|q2j#7cukMqtm>=@v=DPcS*Y5d*tz4kG!!=1Sb=pHEPa(H}Rf&-j?|4>j
zSE=*J-v1#szI&RL-Ddtn=bQh@{iuATeY<U<>FVsa?$HsUPxv*my=O;zC#%f)^RFOO
zz3kYFdfvD1woL6!{H=T|w*8s6wZFc~$A23yv-)43b!FbAcf1#ly)4_T$+P|PB#u|^
zQ#L;6|2*qUX37=COV63lsP6i=-}&v`{C`~K{~1^{u5Qgfxo)53kEV>Rs)}zW#oC=y
z>D~N$$D^$qg|z-05bFz>%>4fA`2)YwTWVCRSL;YE>*y?89jA2vPVG$gTi!eFT;6(U
z+LVn+5gT=mJo)77q5I`pms!TFOCh;EIk`O=<@J?Moae7Fy_m7#Ugoa7TjGl19Q2YW
z=iHp<!yY4G!SMMQn{jOMVh*R6?uAnfg^GPQ*>~UP{*(WpzuVn6W2<fO;a{s(N2s>$
znRHa7v*E+3M7PkB&%d{5zP+?>?+@J%Zu|_H=U2ZjRC@KR&F0~p8H;!)N*r^0*ZT2T
z-PA8(8&~{Te(>64ch>c{b7bD1QCZVqZqs`5z&j56cz+}R4y)2Ltx9bVJ^u+MTNl5d
zQ1A6;y7ZBVt}j#7FPGo>wW@-{DdwX4sx4yEvt@R*6fT`()H_Gw`WgEp$82|Z+Q{BK
zU-eh+Z-0IE>-9HxACB7Jw&mMzwFT$aFY|g48{zYNd6#!H&;0amd-Kyx?#vUkKWz{F
zxNh!>%ndKYHrfOnY>IL+dM@!qpCNsoU)|IfcH;YX?)Y$Y_t}%v%kIpX)bOFUFkaol
z($+sxW$Kdt*L;`1-TuM((fM$c!H@3r%HqPB&6RSlQ!X$5nWF8rVPBq*(*3fa0O6+P
zOTAb9J5$BpvCsTwP4?u2x6Ed)&X}P8&A$8X)|1E9m*$*2Bi<0%^zEn3n(x8_Zf+bB
z|MKj(D!xZu*r%FV75}Yw?b2Bby4<hm&U+`)@+myU=%C_>6D%Ga=kJOB-uvMF4~_kA
z)_<@+DE3Qk`I_Ur%jQe8NtC>`Ikv8fwe6badcFC7U#f7htIRqjvO0LasrLPyEy*0K
zUF*v17G3|N^=s*sI)fjlA4=<%y}DVmJ93Nqt}E;I%#@Hl(aEFYB>k**&A*$bY1jUJ
zcA59=-|-{gC*F<eRNH*v>y_=7lQs6ZwYF~9Ep~B^o<kY)y2sZaz5LJcV4MBsbBl|v
zMXB~JdZHnCy7pf?_jVgr*I5CJuTIt8_(S<W11sBy=WnGSUHR~5+P7Vk+#b4Q^As(b
zd^7HWnf<*q`PN#K;;b(7Iew~bv%e=*>n&VTQSY?N&gMtsgZ>}0UiI<J>TCaYHn)3K
zp~||AP7g(RCvH3B#`Hl;?c>$|3@tSh_tY=jxE8M#aQYdwcJr-m6|C!6=T4cNcXN`&
zu^-1`7^CVX>$oed1FkK)y2XEc=6S6L_38HvqSKE%N_8p}6dyX#%J{PDQ`iU4^#@<2
z+b^5yYQ?Mk47?pXZS$U1u0LnLwfuJSRD1KSyKmor2LI`9)0C!f>9(1Z8hL5H%6F@L
zrXSBAZtp6YY2&!?<+f|rFV9rTe#`bGR>#Q9+b42ivyidOyNX@&XN1|e)hX9xZ`^Aq
z_c38tuKDxel|Q$IE1CMd{ruQNcV?7ddy;3Hg~adUr}m^jj&J{UZ0COluEX(HzH*p~
z?b6P=_UOI$tn60bgKyqlvsk<*sG({8-r&Yhk4={sKfEvhBluucYI}2(zHrtyp_3}d
zk6hB5S**iz^V7BH?C|YjJ`IwOV{e>HRhj(iIJckPOSziWzVF@?PrmuXIQYtvt95Lz
z!{Vf_e0g4PWNT*OW3>CvnawvRKUY+@(7HHp`J8LhJGa^kWQVc4e%#)sXA}N#b;s1a
zd#c-amQCqh*PmQbY@*WF<eu{-&Nw>ieb*k#hZSqLp6?M;_Q?%m-|YP}d6N6K#yMse
zSKO}5WVATdwxeeqGxNzKx6Im?M&6FkwqyF}w{%7HUDj&lwTX*67N@Mg^)R^L#p$W6
zJ?$1+2jogae(Q2Pdv}iC???558r$moOf^DRb@$jUi#>Gmo^^AsM8_iO>gel+$7Ub6
zE4ojhsA|@iv*IxyWy}JiD!R*7SLGT1XAt_C95KswN#%KwGdB-fn;q-%t2oCSRDELU
zmeP;c8a78Ae0ol;{mj)zK}+T=jBvRixP|RZhSLN`n^{*b?ccb^bH(}&8{YbrZzpWN
zyTmnbt=Y#pQRjDM#PErRUg+Zp+G3g;IIHUSF}MB?^AF$B+cHn(N3~6rpus8SHlvgL
zvwrBrot>p>ten#L^l6cQP0-=YN0n!<&3rUB>w0j9>u$}QZ$fw8YTcGpoe{mw|MchF
z7aS){x39c^|MX&6`(swRXOD=pKJa+Z{&qrcPOFhi__;`{=cmK0H*hDbt+ww-+qiMd
z<r?<&?n{01-YH&QpZjoHWrHNwhf@>px{37f*`#pHfxS7>&G%(-*wmjhpF}-B^uGQ3
zJ=^~bEq6;+?-h?$vhF^;;=SIRJzp{npWdnT+qU@_hn9!__C-_Kc6Zb`KVHjyB<#|i
z>?+%P(<_U&RZNpCd7Q~{M?x}mdEfJif8xT|RbOBD(ro)K)%$-`{;6DkKPTq)iR*bY
zW-&0H%y@G{@>$OutsEiIyG_fdt+&6D@WXR?=6l_DD^rtgZ+I@rR($Fw*e!9QFLfI4
z^Rnx=Wg?HCDd*``y0c}Y@g)D?vwz|r+PBzgfApQ+z9%^Kk+0Hgp>>nXGb;--^QZD1
zIjq`qp5=Cf`spbT-b(s3&YrdZh}Z|S$;<CoSjS#qxi)c$x7g+q*1NYAPg`f19V_j<
zS)t?|yUNe=1^bMO>j$Ouc9!#=Z~v2Bx#nqyN6*JduZeQ8ee!SKx!n_-XVd(B^@I7H
z@(lk(GuMARFMR($!y%*3yAR8JFAw|X^JdB43riPGc|0d~qQ{f;wPlwMsV`2qd42oL
zU+0f?J3sgbf4F+4+}zxJSK8uD|DxA2&bxP0uWW);^=Y=gq?4!KS6uWspY<^D$Kr?c
z+i&Guo5kNzbCc!ZTfMFS8Sb4)EMTAf%<-vb1N*7BJZs8p9(Jrhe)@jPetv~LB^!S%
zU47^DlSdLcc`BFvUYuaG`N8G%s_>v9yU+Ipb!X>E?!S_Dee0F0VPBg}CdJ$_y5rIE
z=aTe{_|t_wDKj~rq?F5EIQ>{wFH!5$w$;vGp9lS2m#a8+>)(_JZyk?opYPptyS|!7
z|FE`S(7lSqImLT4g4j2%yL@23<R8v;5yw}(OnPLkEVY5@mG^J=yC)}f&heH|e%CVd
zfGy)O?N8GW*YiC45c=wVMcl8${${Tv<w~c-tSOSw{2i3)SA482&qnNh%<-Nr{p|5E
z(YOEjUVFb@v0ppebpOmJ4Rs%*yUR-N9Qm-R==cvm?TClU7y8%4ulyZp|5o|KyvJwi
z#qVZ(?&UbHy7x$sbGelPtMfq-kMA50i`FbCXPLL8Vp{KS*FVhhLPv`q#CM3_db`N)
zS+3U0ODT7rScL32eoHCij*#fp4MsZ-Nc@?5MfX2L`g_(JxBYoOa_TY`mHtzn*m!En
zRIVAbWrT8Pl&gd*uBxfqer>Jq_CtTIu9$4nzol|{>7=)dV{iByMVodW`p#ZpTh)-Y
zf78S4sWR~{b^n$h7ksqieCr?QhiBz3yIeWxzva}$lSwTM0lV(0&sfrUSb@2~lDRpq
z@T2~*{|tP4!gbHSYkYiT&DI$+lP8^Ho#bsS^ruJa-Xo7~!cELaw{Nt3v|rOs@`wGg
zs6#Oo-R>VnFaJD}%eTI0;u{qMBdt!JoZ_oba=uzhtgpXdCmnU~waz`GeSOb-b*1Xf
z&b^a-!sHMzJ7>*xEf0AMf%P^;uIVx&N#EIHzv$H@ecaZ#Joe75{mqIW)tWe+-afs<
z=fH9@Q}6KBbAB&w#e6-nZt{Wsk~OLiZwo(otA0evzp1xtzScP-z4A8csVUnOmxRPT
zEIY-)euL|y^Ka`vW*?Vc_RoC8`SrHzYu10S+vUyd(u=s}d~kL#n|F8h37g8_`ak0R
zKm6Fa@AC4CN_wGbyYsCs9y}pYaq0~_v-H*M#WxN`&$+ZVZ~4o<jUT05Ki0S8ZqXO<
z<?mRhesB83mrGR|6kh)8w^<a)tid=%OyPM?c=yX+{)hLs?=ro&|H0ZYUn%Ry+l*JL
ztmR!ZQAjd*+ukW6w&hx)GKGEGpF8b1EAAb8W^4ZN-x`HhgQF%7J}sCa)6-Fx#`5*=
zd*!X=)9g2HKkn-my7x!>y4$WPXLltRmJ3UC8>s)4dY7ph;Ld(Je!b7NeqP=?``1r2
zIC6Hi%df`$nY>IV1%50)Y9@8{+l+qMDYsIJ^8%jaN4$L!9?_|go^rgrh+)0mhv~=c
zn`ec0%7=frB6Ta~PX4q<*P^!>c==0uXS%EuV0oe>`p41q!mWR&?{D^RGp*QSFZ|;g
zx37DZyU?Ae81Gcenp}@Oj;^aG?GKCe9C?zgv~Tf8|2GepRAe9c@baF}htj@<WtS{x
zZq>e7@;a!?fQPG7dH3XVCuK$bEN!#R7EGIe{Z7u_<@ajdCx1M3A<OK;ABW3-?7mI%
z-sV=xy4h7;Jv;h@YFHjy%}&d64if8gFVtuDGsai+?tjQNKe{_?uG3M~4NPbE#T4hS
zSbbdS+ZnIr`yTn$+<h$1^uzk#KfcYoKB_L6Cp0-CnW1qVV@gS$$IdfdjSVLX3O_UM
zR%i0&Z;lsuXOi6;?f2Wi<Iyaho1IJCg0<%F&`Z)Xo2pe5-Xqs?@r|Z$>_n~2eJ6g+
zKX!k6c}vi{e9o8Gs`M779CDd=`|ZZqcxSV_o6_zst`IHfYu$XC;rhw_Qu{Od1u~`7
zCNKY?f5=X`-T!j#G;Pa2cCRy2Gg>~a&3<}roq$Yhbz0ybi#79kYGkf%<t>S;czo#f
z!{2`erM|@6ahKV)X5*h0_d;f-a2{_q1=f>lJALh4KZ;&kGV6GIP1&!hYbHI5&d&H@
zXv}+vInVKD_|y{?-<SLK2=90rxR!rqjrybcoflqw`{lNwMAkd9PkmO!*KKLlGa~=F
z-OZKgvt9k^XVcxQGtx8G&H5hvw>SC2>!Xi#&2;5M_v|!^bzU;_&$X#Vi;@d-CNy3U
zI8wwX>G+_g@o_Exp<P$+Y^qp&Fsg6Gr`+wn1;>?RH+@)mWW$af4f>A9xo_}X`+h{9
z>BldQw_9}CLpEMow`Ogq&^hPlrxoP2j87c#unRn`H9yYJ*WByfb>nZHx@&5UAKJPf
z*tK@;+4~Kq`9Hkm(wI)gdg?|#`X?+i>Bf=PDTSYHq7Rp<&-%6b0e{=t<6Zft@lp{{
zKZ1VyY}P52@LhA#Bv^iC(vIy%4>vgIOmdgw<9Jf|qno|?PvnDV+xC3y+q~kg(37*d
zOLvy=7>Ue%D#Nsgcc=QxqqQ?Xgh%bYl050N!=Cy#zayJWk1cqcrJN$6bLQ0K!rhk2
zeU+x?I}h&bd3pGe^2T59AH=F3`t)N;mKFPv%9`lKTlzNLc*ULbT~KIwl5>@8T5og0
z)VZlA&THRJ54*I^^lWL#d6^pX`7;;(JAd`=+V^6*Ya}Dr2`=2d&2W-=&Yc<T&r;dt
z#ctHNZ@IKpJFWfrE}{EJb3U%Uy09yAapSK;*BL5rcRp=4Gd#}_zP2Lypw!myoo~Oc
zjeaD0_6zUto4H>l9?fZG)>7O(^W@2MZ;W;xE9=WXzSb=&=H2oj{aD`f{kQHP<NllW
z-s^+^5sNpbFJ?w$mX|fXI;|_ms4G6PQk-42+l$fimYeo7|BiZwe;PHud$#Srwq^I<
zS|Mhe?^V^^r*A8S^PS}J<-MXHGbO`YuE;I>UA@4M>xZST%~YHE=syGR?N?!It(NY6
z#ayFY^QXn6F64rBse;<Y6DLI*Kk^@$FIW@3-hXLD{;~N<847Y~9UV<378cgIDSeOi
zCvg8<E|X;U^zxjwsXM%EXa3w-{99SQZ4d9_is^12&mQYe(mm~3`Y2N`FJ&ULOyz2u
zm365S%0>cz5}r%0pKlZTvET8-vWYr!HoT8Aa^CHkuk2}b|F{NYq*~~X&J>3w6E}!y
z9cKKoetn&J4d0c2N;fjT)eG*CRqt8ydEbR&k6h;_PQ5O@D3bqHkv~@mr?p^2oWS2%
zcD5DC2g5xdWb3LQ+Le9B?DW~pxlem~gt^x(5=xYsBe3GYe}<Bzy`o`eTh8eGzH{X7
zto<4D+oPV}TJ%A8+QM%;9tLdN^(yAP?3A^WHgRVkmYLYeE^YI6P9n#%eJ?)5zh!^a
z>z5tR`{O@D%*7tV%14%4Uhm!HFfa0!-GLA*Pc^Tm?LwLox@Rl@GqlyGu9v<4B7B>@
z<a%AbKPN6;$n?8(u%xfyZNxeu4si>KV8x!v-`lHZsUP-lF1xjMed8bNhimJu{ZuN<
zU6OS#cTMmjrZe9jxtgt+IM3VBSb^p1x~x8-OZTszS#jv~j8}WK7uKCFs#tV9;)Ceh
zbFC}(ys|s@^bO0K!X36t7H6w05apY1uG@A}ZEyea{NEurUtE4Yk7L7!b=x2A*k4xS
zdE{2edTHT*>(4|k*m>}PWT$@^%NKiwn)naqZ?`|(T5JE1cW=wClI>i^i7L}BMK=@~
zcP!sF<@lV$H0L=5yfw|)AC(_{Z~T*5xuWjkuGV|AS2)gzU9<T{ySjAjI-cN&lRX70
zPVQSxo2Tx4bb6}G)LA=!XFlG2zDex+v|01JbZdOo)+mHZEt{vmHt3=(TjGv+S9>&+
z5<gAzVc>g{()DdE)A`4Gt3O<K{@8y|*V*Z#?3xLZZ`W<zJu|U-OPWs4uHH$N313++
z-JLLj&tm<FEB_gqCjD6daN5Ge^oRF3)Nft7X=r<N%k^SkW&K}IcQ;0;Jt$}VmbB-I
zflPS$`ns$8Woq&tuGK$s&+hX2FA>~3TMjEPXxujc-j-=eYApf<?+-lZZN6^aGH;#7
z^|>bfm+q#0UAs>{=Joz9OQPC(nd4519^E$C^xR_QeRh!#cU*QU;^;VeS4DLSQ%Yc*
z=ZD*m+7ImJb&s0-Fuf!E=qIOzYr{jQNl)1{*`ng9nW4KOpMP{m?3KO;AAjCoY5&&z
zW4y<-#}B`E1c&w&_2+$`es<N;9T6W^N!<-uVSo79#@ah#Z{z3H3;gl_ol+zDG3dwg
zW9HL;y_x>e=w$Z7TdqZqEKdGs=<lA|b2j(nPtS>SJ*`7ZtuG(6%&e_@%y~6d@UP<!
z^?)DEkK*OiAE~$He$nopYxRtIZKk<c@FB&YDZlk+XX(D5u>I6YnGIiK-t#cpl`p+r
z!@uw29I5#Bnp(9jB`>G0|5EGvaEG>#kbSx7VZDXSo9l(W4XhnF&t?B?{o(qbfz|Vx
zoy3m?C)d6(uR6G8MrX<Izp3ktg%<{`Ew>SjKd6u-p*7ttuqoV9?()arf83=Xiyyho
z&0h4w{b78QZtA6HeUEPadd2zmu9sTtk%=dIi*o<06j-%s+fRc70(_eP8B(t8-_<Vl
zA$l+W3+G4A7Ov}V-Sx5j;0YV|MYm#)7H6)0x#4z}RqOVfw@bo>oGY$vzkPUx^;({{
z^L%q^0<P-j?}_KUQl}})AHRE>xM60Yjrg=rybIXP%<p+Wo<GN3>(Bio{{Bz2AJ_j8
zS^Vw8kHe4MKHBa5$Q<<HjJVlr!OJF7wr|{0d?K^VV#getnLj_<Sx7s5@^6U!cWwSw
zgWbOF@jtp(zY0`VG<c;i`gP96<2_5J?drO7=;N-2H47cN4^60CyYfk>)c09Co6cxz
z=GEs-ynoOAVXU_IrG0V-Kg#`7Vh#-0s8qRR?&s(mvDQu-EmgmnoC*JZwjq1@rS~>&
zcH(!`=C9yyz9rUO@Um!DkLD83oKKIOLgL&Db4`5WpJdEfR<!U+)7C$A+y978|8{5N
z4{!N{_3i%*<{z^1pK;lx#(K%EXd7?knX*bdcJyT|Ztb*i`8h>KS%ZOJ=fZ!6{Pnlz
zdtSbye`Ic4$rO+EVhc88DK>vQddXYN<L&J^VL~Tg-Fy>$)OD@o->I2$h8O<GfBTz!
z<epLg@q+HsX@{PBZU1*}(#r`?j@w>6@;Tb>=`CeLk>GQoZrW${|1)I1uIH&ZbS|F%
zht+?EL*Z2&zh#1aGkUYF=bZ4|<vQz}<rU^mzGIJBHY&(J?LHL$AxOS6jwRMU@Wb~u
zleOkYwuKelj>|HecInpI53?Dc&pUL=b<^i_7i>NX?RcUYs>9z{@%-EVzsu^hvV`Uf
z{5Tx2V{^{C&W((BjB2);9gWX8&w6D}vdYBBpwn9SJ{hm>=nA{@_vhb@_SyZ+cU)$j
z@7@!<?A1PnErlER9NBjzsk_`jWg|zJ$L00YO%zg|Sbbg3@x$=9<B#;mp-Va+aIbi?
zRcOaN&6t%pcRw?V+K^h<SF|SNclhV-b??M4z1nqeo>JzW-LbcrX5V@K{*<gr+4Ff;
zpJU{fugm%-btO*igV@IE{M9!!4Q&ectlhng=hK#4vHI@hsmiM+U(dR!YkBOq#~QOt
z4ZE<tmw##e*#Dn_<=Efpb-J-<A1goHX`}v#yZ61??g!lym)!CB^t@)$t;DxW(sex5
zl#2Xq=KKrz<Nu$bN%Li3MdMdp>qpC0om$vswsUd!?uO+*l;>H`aGGR)<M{UV#vj)I
z<BI(4R>Ak~o_yB?*=nC&v)OY^FTXwI$XIhiMO&oNtz6*MaU0E}<#y)(8JhM~xYb%E
zo6TM`x#+BnQ(<P(f{9HB-=(|!N|<EbxAmmcKCAAh&DN_E3rcH$Du1s&DF4BizcFh5
zAHh|(ADn-4e(lNs44kghdrIzBhkuOQot7)~>{r4x@kh59wN8t6-B#G%&lk~h@2tw~
zIX~17pZ}r!ZtlYyOaC*pwQSsY?MrdiCdbtomt%AG%#7IR()CZ{o<c)jq)?>exjTBy
z^DoE$P<3xfySP6kp1a2L?~<jBCG{O<%E7xn%<o7^-*xG2vBKt*KGs>1i+4)vaoy>7
z)~UjEN<u`|{7C$*$NxD0elQQ19=Y}6R(n3r#W8QQtE;C^_Sz9MHQ03O(xXQgx}8WB
ziav7lptZ-*suJU<Z{PBZn+2UFPn&h)&*dMP{~34$f1CYiGnzi@TF)!qB~tdC*B-q(
z`F_2un54qwV9&{CgFhYF;1lv*F*%RxU(b(f|BtEvX68Tcm#nBiyiaA5+nkrDb64={
z2e)y=pT5t#XMgVY!nyZS(%#)KyQ4LsFn-E^2HE-t%l<L_=zWyy@zPGV|7e-N#-vl1
z12-B*A61f{c=(`6$3geIx><XRB*G8WY5ZNgPdiIaB{%xeF1e`>tzVXHKD(@T5%=^I
zNrz9jZIpulXsPtM9%GD2+dfThYiL>V?}(#6=U++hF^#_&{6KGWasILzkB`e6w{owj
zyHl$A+vOJ1O6w~pO0}!s+FGwxm@1?BV!7zuKdygQ{Ly@5&)jLloBQGYv3WvQ6{loz
zu83W_ch1HKYZfls(f91)r=m4$-kwx=%d~%5K700mh7UpadnR|(NuPaWy;AT@ug#fl
z98JOB_g(nUkbZzAnR7zrp;_;@-2b7L|3`%T(eGEykFL$HXI-LvZr*d>S>7+!$+=li
z7j(~g`mG_lBq+~@_xYq%PkZ(2;;%2f>Mp!_+y3ik{?7by`#%G#`rirqTQc^9f6PBN
zYkyPeTn^7<x!H@d1bquG9^QVsB5~uiN5>v%iqt)^-7={)#z_6{`g8HJ{}~P*2>U1d
zVcPD8{Y_E4-+R}qTbKMzKbpBLvtM@iqBddIq#kd@(`(kIN^i8540T98Tm!l%LGC}p
zq54YxwypU+*X)F@yn7tT*I%2ia3w`0J<GXjTCkb)dx^z$JI+<EzhvL|pW%bU`$l`N
zl7of69cnD?MfAIl?Z3qwRk65IWUAgQzqL<}3LLlSDo^Ztdo-KJOo;1i?4h8^RrT?e
zf8NzN|7U1gT7S@`K7021H<G2+Zxa`6&o*s7RAo7J?Y@`nZ?6^F-Vx$SG&?I`^ORFk
zUVT^Hy}YMScl|geF=xW3A14fKKOcO4ZU2ShL-!f&)AMhh6hA1>T@$+Ehn1jEYg^iH
zw<&Kd967Em*wL}+t0wOe9X3C!@T=GMng8&bwsFA~<vFa(XJVaV*B`$pzeh%H(WYsI
zZOeWpdPdkz^~|gPf9=o1kKu1^e@E8@U&{O9-(@efCws-=>KV(7UWb<n>}tMP(><eG
zyWD}pmgBhSqp14k#h15c=9^gR+<M`@E8foY*^WFbgWi3KFL!@knKu8;whxg%Hr+b@
zX7+aZZ86-->UO3EiU-f*Ozii%bSc<(N8j5$vPIV}=CZiw^B5lA(Z^6MuDo7hPWZAZ
zO6x^x&97w_-8?ztS6cI;Jxlj*&eL6&HgV~!2pt#0ney+=XPVXJJv}UDdh5*eDvijs
zrrN!ZZ!b0-ws~?~=o|M_{s~o2{VHF^?7g;gwsy3=P-ekwjjB8GUXxgl-_!my|Ji;=
z&-B%|JWIaSab6L-r`9_^cj^{Zh6l-KINbN~6~AumIuv?+h1FE)y{G3%edL+PbtShZ
z{6WG#sp|<lD&M}}k}dqq*`(op$;`KZ_8Yv*J>PKO(30iJU&a-6*FcM4Zl(OPTl}&3
zSk=-gC%7H%Del-BZu8-wDxcvC4)z^3;iu+le&p}E?&NFrae3Q4N%N#f6-R`O3nCxg
zb3bFfO7r`A^DVPIcg~A{Gjs9QIqT1Sn`nBB(Pr+OqM6F`XIwXp+EDfBRcY{Q>#TFr
zoj#T~mvH~ytL`^XWdD`)?Cu#CW~xs7Zfw1I+hvs{8`D*$sXUqFmwnAf`(tw02i+&r
zXZiFNW>0(`)x33v;lTuc>yLj{KbxEEzx&@=G4pSqVvkAd+q@M?XL(+r%&vW#+4l3i
zEPnoM-vwC$FK^lYxcYWMXnNBpf1`{8)^0bCMcWiU%RBkXJ?hWxjvZM`qs|MvzP|Ch
zX0?6$hF|*>Gw=MhySz{N=8xt6vCe+GGR>2VH=Ne1Jn;6of7bTpuP)q;vpM%K*~w;u
z_^KxRmg=u6wb~E7{e>o0n*L{KcsI>anYl1kBc=2>`_sqlwh}3Fd#*2x{8Mnn<i%of
zDerdYNn#GtH@^JbRerQ)@=7cJX-oWO&5SqS>v~r{<1XvY^tKAG)dG>yWfEm9DScMg
z_0>B|?uy1luPIcTB%PG2EHi&L%g48IjQnr8v%Y1QKRwm(d5&P?{pLBv_tj@TDP7-p
zPf91fPx7gX@CM!kb5iE-V)HFa{P-c~!OAIN+Yi<HKdA1%`T6nmzAxw7;$=(E1|N>%
zTVFJ7{o07A?vpvHGkzA_$xWH)w4}#;vZQNJl>Y=nd5*ek`#0<N)+gV;<$Y9s)Ayq%
z7XG{U;mt>Hv6V|BC+Dun{GOGvabL@>lN;501Wuft@zhiK&O_(@*X%c?O<hrU(O&+K
z?Sq?N=I+Y5?(se0T;MI1gm-Lr8;cA$S$@lDzpVeEH~oNq-+a;i50(VHs^{IqyY|Pn
z>qqR^KHMqXHaoerIFset<oE-Mlb$MNXUt%h7F1cq_V$chaeU;Vm|*$!Htc47=3h2G
zORq8SXp>Bex_kTluRDLNcXWpf+Z3D3nxk6rd1;>v^OanW>+5V^%lrR3+4uVFg|w}k
zcQUm13Y_`3gC}Ip<jcyrb;~Nk|8dOz&%mm(|Kk0ladIE>rY}D<TRB6|v|6!PQvIo#
z#GX$ptah?&TCcUHV*Pp>*8dD_-~L^@r*&cWKXL!wJ+=>iE+|&oyC^O@bxM!kNd>E<
zR`wMM4(l&!r%BX553>uK$F=;Hy+GoQE4jIMVs7i+`l?@Sl$&_vk%@!*1LH4i&zkA;
zZTX<yc2zg;spN!+Lp?_9*4>I0a!am%DgSW#AMcG1{Vng^)_y$xSnBn+ZI{>#UX;lv
zS91PitDfC`lY!yko()S%+4lYXk^P^6Wz&C#rqn;Wd+iiIrXRlfCzI>xp1nntrP&OO
zKfR;(DaJHTe5NMSGx^@0T{E|;et1>t%=MpP#y<<a)cMYrm*++%&Eq(EU-#-ErVyS_
z-4Zf#hhN7YKlq=4sbc!K&TEMu&cC_4Fe^^;%3Y67HipY*Up(++Pe+?YyW_q{LAOdv
z)4#WWlz%J#+rLM9Rd4=-{zL0oZ=4kISox%)?68_~o8aFyj%pVVFh9M;Zu#K)l3TBL
zv3Kgu_xdsO;adB{xk)xBl4jiuyUQ|DI$`&gjKveo?igyV+3|C#<MT<&3chUNYxkPF
zYyazwe_H?8{%2^itv~2#lb^3}ZJ$g(UuL$}&&@v;{bDJYd!}q#)3?gV;<>A(dQzVE
z)%)9lZb;g{pKA+m)a@hx8Mde&byO*n-y>z;s`L1A;;xiCr#9V*=Txl`{JzMeTcG&3
z=<nU@U(9;9{b6>su9WNcE|xR-T%8Y6A7`6ng`bUMKedU;UF+uS{#6wdDs<I%`I-kB
zoRw_N*ZH7e<h9%Bq=@HpEir}n38C!w60iKcy76o3yEj2AMXqc8+gENsrC;{Wk7|#P
z+cq!CnAN-cR%CpPbKbE>n$oA-wdEoN&)rFRkn(I_&By$%5?lGBa%r1#pY}fD>Q(Gn
zVCz?S;7|6m_@3`(;q@YWoK272{m*b~`_q#zBJP}=zmDHIPPcSbrkSwBwG@kE4;D<a
zcs-}&ZG6vZLA~^px=oujK7F>7Pe1*U`Qc$NJ(g>Qf`7D(Y^xIbw6Bz$@BC%9u4Z@j
z>XJ%>i91tW1N$HHHqQ62`g3&Gb=@UXbd(i$)pM%LZjKdi`f@k^SmEv;S(ly%_1i`N
zovN}sW^&`iJeAWz25jbXhdQpVyfHJS<oh$b?;rPkeigrS=Wpxd@_)8eCfg+cUh?r@
z#k!)`$LEP$S{rqY?YH+Ec^w6obCxG9SbjIg96$X2ruw%zAD=!cvlIVO_~`b@`PRu&
zVvBQBxUc72FNi+c=WhM+W&8qr?)nFl_HX0wNbU~!nBQJ<p5;Ab$49x<xuWNeS=^P~
zyK-0hFJtw>IUi#~?kUy1QTX@l%+qNPGwbD+?wRfVkN-hkzU|+C3x2N=eDv9{fiunG
zopIx@@IC*|$mxA#Z?e<4ee<l@%2hV|_xc+9epcTxv5i4V;^2h!I~d(-uD|1N_|NcQ
z%6z6e+1m%#|Ed3&w)T;#$M@5Jdo!+CS;_RC)P0t=^VHvKii>2P_dKXu^hfiD{fFrf
zj<=^@tP^^{{ouFvgB6>7nzB7r<0g5SN1s*R@nF6|^Kq8zOWPh+U48U#qqg4u565}y
zbPgqMIdpvH`bmFE?J|E9{&tS9nC-OVN8rcJ2hF8;=iZ;5Gi}%6<Em%REY4>6wDwl+
zOli-1rw%Lk?fA~C{;+p?YmIg3vLBYYf3#Ql8g=N^II7IrBj~K~Q!zp=;#rq*Pt&;{
z-`AawYWrGaUQtucHn(=kt*LXkr6uzp??^Cy&K=@fGSOe&>|0F1v3(Vn>m+LwKd$e2
z`%k?_ZgR+$D@i3*En?fv?Qc%s^Tf4!`El*s0={zX;|hn`SnGnnMY@H$v-{sjyf$z7
zk!LfP`lN<Ot$(`k#jSZ;ALldu$hsZ<ao$$5B^&OT_~$>A)+~(>XYO3O-J|(HOG?T?
zMZcmaMHaElJ|D`v^>zQ0f4Fq*>l$^>N3*oKZ%<x+!dcWVck983D{C6WB5q1s2KTw9
z{PFzppF#c2;}!LX!asJ$T=*mVP&1AD?@B2SrR{eo31u#tI5%SM?wT8y=Rf{>dBey0
zgXeGQ2REO(nEuiBi4bSWPxb7ECnvaPcT4Xz-LTQ_{ywz=$HR{;*2j99FMB>~!KK~q
zsmn6{Gsu`MpL8~_#QL|fNZ)rc!LvL^rxbHuPW#Nflf8F4-*OfKi#4Zn!w<=s>~6Z7
zV|rqb>vGqp&+grOb?Ai>@5c9=Cg}KeRT(?Ia5E^3JGPJSqtNk;S-wyA&C5+bx#e2)
zTe;+(P5oPr9g8@T#P(8Yc7svz<iLu@M{m`)ZTb4)`_Z$0fypb}I#pUc_2zj#KPj%l
z(I!2QCx_4aL074KFuybN(cVY1qYwNtJvKY(>;|>@^%~o*EdE(kwz2YIj?A2ioXmZD
zE35B!{1d!f<C*_(ea9x-tKa87Up}wyxU`+kR<Z4Yp5n72c=WCnEnbzv^)}^4<+9_8
z@47zF)e$Qcc9z@lIW|IT<;jBBBZsx>0#s62nB3RKs>gneYhD=lI$lui(w1m#ch<>1
zw^tl`<rfy(Ct~zevQpT6tEWoIS+(DNdcWD0<xKXR{7-PM(pCMQvpU|ZY|l*0vH6)6
zl5}TVU9q&rE63Ln*Z(t!*pxmz&li;yr+4Me7LFOG`SO(e-d(eiZLGU4)Y9WQ|L)Vr
zY3$4s3No(6bJf(Y)$gg{U;irSyU~*A%6=0((~DMkzsXMf?4tA2-o%&l_3mZbWk+hf
zH(tN(vh%~#t?Op4@lxvhbnmOmJdFas{0BQjYUJ+4&tfYQ-{HG{%f65Ioeys9Z<Euw
zB2v+Q(CY5hTQSE@%c!OA+aAeyCNCxTvs=6Rzo`A&y?(wwZqHh$_<Gv(usVDGrK+2_
zZ?1p)yzA8sEwj4||5ZARsmyrNT4X%&SoXWK-hLm<I~MjIjAQ?3dam2NeVS{=md?b+
z+<Rfxe_neAI2y^!-_NNqDe%fw>-{`GF1uXNd6#-I>7(_bhM0S|@3<!$B;0i7U8tmf
zr+tDtPxS5OAzHV?k{*`t{Biiv`<w5>t}jep^y5`-*sUU)6K@ah3YuZPts_#|_w<AX
zD-Qk=j4OOF|Hi+or3=$c-sXpH+c$IVnU}wR>uj|6yfBExg^ycAYw?dwm46pq&D|$;
zRQ}tt<+)<h*S<FU(Gzo2blE~FZP^<Fy}uh7>Q6hrt6a}?ttN3rjopqNXaBxioGrup
zpvk*r`%a_O4f``$)VQAHrG!hKRBy1Z+ia;9G1E&kFZcuho9YkK9b0QGAG|(cve(^b
z>X~WVF1prE+HbsO!p8egpL}vY7QS3o`{JI^hq=~H7fW7jiD$c$eSLc2$#2^(t~qr~
zM9$n<`@~U?#~Hfk>hh+3{I~jd%8!R1v+nb~ecUH0lrlNs>}g|%qD?x@r+bW^H}&=;
zJoy~8OaE>5$L@e>&m*pEUA`sz<>Q-~GFdNqybtTJU9&i$AXKPrppvqE$*ESi^@Y{0
zo2~4H|DB0i-leN@&4xQ&zJ34JMX7z#8$Q%*+{r9fED(5c^XJMej+Ya!KbkL6f6%PX
z;Hc@>%ico1MwM;3M)$HKms_6TmHXRwx8PvIacTFczZxIK-}--8ck7ld`=fa?3)kIh
zs9C+&!%g|#ot>@Dl_&e(%kDhRE?WAZA-A8sBHeNOhwq1fF4;KkipR&Tr@X7CC+<t_
zIa{n`ck!Z=*AoVI$FA%ARv&)^&h<~byQD6<#_~TyQ;2=f*Nyz$s`F~2IQCt(5x(i4
zTaui{Fl}1U?kP+nQ&fuQSN#?KQT?BR<yHH`$gO)Xn*0^gt~1}VB+75;#<s})RVoU?
zSA&-^KJQ<$<^FB4dYO#)o9h0XuD(kNntW^TK@Wqfb#K?rRBqbjwRld-H5q%^1wV3`
zUkiC>KlrWvWSZ)hT@#($g5Uq0!uc#@qPyaR2}TvN+Er6mpLSQaSfN_6xb5TfH=iHO
z@c*M^r_RrEFaMq1vfr*ta+RmvO5822X!&c~qXNhGAMYR8-!M=3!}QLubDxh!`AE&(
zm^Mked&72xITQGAF8(aIq3-vJy9ZvMty<q_Q~Ic0Bt}x_Pxi{!)2?$wX;<%fyla9X
z!!fapriR6H=kL1P=c&HFy(0a=_apN=;#8&Ldre;7K3E_XVjj@BP};3r_d-xW<GE|v
zcNqM=TPjN@E9KrgvAc9l{P|>-ThXs}J$-U;;m)SxC!;$aJ6H<K>!qDfS{L2tS{b(R
zL%;j=1$Ihe+x6Qj0>AFmQ=KQd<Ahw*nwBQ^Q_*rgu60c>;u+K~vqU{_-{ZI}`p64W
zlb4gvY@U0l&-aYQH1qS4XBJfPZG9&%^kyGN<}K5GQy=%U$NgAz;CAi8_d)lf&)VHe
zi=P?c`fpO-j{gkN8#DsHw>qzxEVbb2qC0=YKI%>W=zn<oS{bXxK7pILy{4-SB#!@@
zD!sWUS9i;|*CBhPAMx5BzNgcao9sPH^PRc-rb-FNlCzT>ZcLiD!?xVuvFLAp{ljyG
z>{+J%$YjdAHeG1Rwe8z4pDoRsaDu_`&~_D{joTQdJ#L<4__}`f`+rg~D&N0b&A#ES
zyCCwhRLrE<^LFKWPr5?++Ix7H?k(<m8Cuzs>g9P)UH8H7_r25EE+5|2wmf;sOYxl0
zX{=o;9gI7@Z=c`0asJ~lRZmG~b=m1%{7rk3A6ZYbiC+7k;ZW$_q|ds~qBEXoeqxvw
z&i&-n-1cb;3@x9l?OA<D>=#Sam--LuOMYLrU0r#7o6{$Yl#G)KKet_WIqEIfztgX3
zetf{*YxNnOrMsi^`CiVlid=gn=s0uq@xnq$-l=7iD%sC9JlATLP+^Yn6TkDa`}g^z
zD_`TgrF;U9Kgef2T)b>a#$@-B3*0l!nbrwOdiGwI-7fZgg2j^Az8AjO^JVVi{iwH@
z|M0h~Pja2Ob?rEE)bHH5W42MF@|oj-wDWOOPRBAwU9E{%oBb$X%53(!-FctX3uTv_
zTOgp^RkYEJJuvT1=>gl?-?1OUyL1;?rOkhEI$t>R`h{j=W7l$J19pYmcO<UoS(y~I
z*-j~cmc26b*2#JC3v0CZZU69Wd2Y3doyA^@-z>QtTlsk!*do<bA4%Fg|FJ{jRrdT3
z%MbappMGS0Um&ZFXZ}H}XPwMTFK3C>Cx`SUwkvt;FE&bL)Z0^Hy}_;4Jn*8aMveZm
z3iX3kf7dsyd7L)y-mP;Cs`XpyJ{<aX-RJC9bD?A(1C@8{jQ%qmjhf&7$Fef_qZH?#
z$dw2FdEL%DX%IcTMr+|T>E&D=2UYz-7|d2KTk>7s+xV289sld=;ip$*?$g?E-Q?#I
z)-xA7xZPeI{%&;WtaQTT2IHQObHXQ8G(R+NUH`{J_n%&5e3b6d6HT_xZ}bag{;X2V
z6P@S6@>sf^d2-`X=ZE)2qq6Ur?Yr_%w4&_%;Y$v3x2i2?Mb|EK@JMRd<Es|3;Ydn@
z*%Q9KRT=V9?@Dj9ZGF_CUo!K~)+=R2-pfyNO(^J=yAo;m>9Oj;la`M~muN@374OP>
z|4-ul$NO)JANaScmZp5Po0zENR(3mE`7N);ImgdRipPDl6%W|odmV3D<NcqZ#qK|Y
zL$}YyE63K?7rfa%&1}1GIiumm*k||tE*8?(yRe+~<J>(w^Fx1ZeCW?=x8m$0Q>nRM
zdY0Vtwzhf4)wJNA=N6-NcNmNoPnB5TsQ4q|dXe4or5T$&D~c}OiD}>0qAk;}vmrEi
zPQsMLzUOO8gR)}%tTq;2l-MPEZR*2%k+b>v4<BZi=g(N&C-JoV#NA77+bz5NjEp1&
zzN>J3jjr$5FZI?`TH3=VxA2J}L)2}D<mv){>D&i8>--AaY8cO!?GmYKZ-1EU|0s8r
zg+=SUulGW38GcqNd*hV6QOoe&-pLLh>l#-@ZJ8&yb$-wW=`f93(iM+Bv*#NZOiy@G
zuI3)I-Sm1;_D_%Hnx*N{5B7KM)BpJ9<inMwGvi)enQZ*3{>9%SwiAog6WQ%+-DR5Z
z?R)Ye|FFI^x5v{xoBrLu{ID;qTyXF2gHOME1cn7fugMkO%{b|xALE}3&By=ge+XO3
zxAM_>&NT(M&rP~%wd$UVkLQb{Q!j{~I3|99Ikw>MZX5ZB(YsGxKf3wlbq|Y;zr}Aa
zR1n<BBk<GM^|+6h)5nR&vd^q+oBSj2Wx$$g?eE1Vf0%vD%D#2W*<}BZ4?k?kF4QqT
za`BGM&fndIxmJ>W#Z5vfg%{>r`4*>f*@U0}?D86i&G8-PCoQJFc@)~G+4dlDdfGzm
zMx`Q&%AG0=4JGSO+DiZ9n*C7v(RMlU4`1Ky6!ALPVV{y<aff$hMpP(!1M^0kgre-1
z_O1UJwyxXzD4*AHS%ubL6K+|*u=#n5g=RJxznf+vY`BYk+u=Ry*w_r?Qa)@I&Wn=W
zI4kRX@az8!tTiqh*pE#9qxa#=Ki(@(E0T6^*?m{Us-|^@%7$C9VokPZC#z3jI^h<>
zXS^W)pH^hHLFAvnkNc*tdGTKO{mv~-)zve)crQvO>8kFTJ>#vhvYTj?;xYc&FXME7
z<lItQTK>5EMCsS<4*eow_p<Lk^n1!#y|Ge4I)$;wYSwcb!S#O_rXLH_{c!lOxs~n5
z&ZlDHx}_{e>n`2yn``h}c#8x3eU8TxDo?HnHs{CMuQxoY>!%+3W8rVJisZ1a!!8#}
z-!cbQ|1R@<d*)l2_$KWYu67~$DJP50ZaDtwtkygamE`Rouik&_x;{(1sG`{E!rL$1
zTQy3ofAY4xeL9K%mv6@|9`hc4GZsq;_2&6r(+}56mF)e#>)67FzkhSj6uo!p$-Y@1
zowZX_IGO!<mf01wpGq<?o*YwuWcGiCoArn5^mkm@<6pk+_PvhyyuC}ezMGje+aSdB
zOk4@i0`t3ba+&X&u2ET=qM28D^m~JyXa%>+#*gcd_A-ZG`ntT!{{G9tn2wx78ak8j
z-|SS1F)KK;P=;qt&*N)0vgwc33;wb4-rp#`?VmwJ-tzdj)z8|V*=~|Obmvagnt;^{
zt(_~QzX_!9d6-^*8NbE6r{p}xORMV#Z}-}VbiPdvzqYmX^s6=d6{hMhiq|tsJ{H8*
zGx<>8)KAxs=HK%6yJ{o9CZfh8@Zs;!eep)Ta<9)#d*mr1zvZaetczZ!jz3BI*rr+(
zp22b_WVWiG%(m+P4DrVP$D`KGOwM0xe*9##>+Clhw_bU<GHOQNQ}(O_y$Kud8Xu{D
zzQn7bptaNV=i^8Ax2JzA`mnu2*!4%`s*1@+7HQn^&a|H}K~teMBV~qr$<pZe+SZd8
zSad6vAJ@Odf1rF)T;?tJ-hDSkwk@+*ykGFN>6Qfy5~h0$V+0lyZF+amQf1!$Ss${0
zsdcZKTkf;@-~Ii4g$8@wGLw7ee13Xb>cPentW{+;*LOD^h`(3=q~MWZ;MV@Dy52|a
zOnw}T+<Kom<GYmV@hSJS`c9pC_hy}^p5J1bAQ|RsN;jUb7kw@-WXJaJ_<TO)Y3GmZ
zQ@gxiuk*9hNz)d+yE(B#cboj370Qb3lN=?V2wwj@KlbDGBj?3q=UTphcHvr4k-|=E
zS;L;%nfF2iUnz6&7gSx>xySZ#-;U1Y#k1E21(f|~SQ++ncVcSsoc|1)+-kLVS!k+$
zlrcKux;o;!{w=oe-&C)g?6y^Z$kx3+`tCvFlZDku7oy#*S`?K__ZS~jOw0Yxup?xG
zD8oK;=8wM5CO?$^eQokVtJpjByYD#uXYkZ{+@^DhrOj}j!P4-ap6i$IiT>@fQ?0mn
zDSL&EOMuH;VbeeFvnD)rHvgq|AcFB^jX>q$vh}Q!o%VmYv)wALAxG-=8AC}0H4D|0
zQ}1pG>;F6PU|w~&uU6saz;eS?YjgSHe9eP)Zi~==w8cgFZ!~+^p-+sVc5&7p9&N0D
zH0yG%@7Xt>G{Sj)Z+G9kA$G$YQQHE~wa>R)5;&T<X3v>>No}`hJG>Hq*A)Fs<=bNg
zxyn`7woUsU9&Mv?X5*=&+ZIh&YIyH)_KG}<lfSM_T9hiDR$N#yjj>q&o83*_k4H8+
zU1&`{am>%(^5=%Ssb{jxuYbR;m6y^gZK1?C?dAFR#+T>x@LaDfUgmCk#5h}<g<JE^
zr_ItUxBcGY#q{=_<u9)1dt4u`=Xja5YwNnjJpU@~qP)zlC)EXP=v^+~xS}Md<WPC_
zyvo`_=KD6{+l+0G)biY3nj_be&%^Zia`U^2bzQpR$Ly3R^7WRBoI9Y=p^zSy-0JFZ
zdeU8yCwxCdi(XwnrX&=7+S{FB?wJ)kP8{HFdj9ubz0_L0xeH_N%v2X@2~~1$;CO8L
z#<}P78^gY>-3zv-ZTAkV)qkje^Yu65OEx;D_iyPxI<{VHZ@%KW{skFrVu7EYNiV;W
zd|$hbU7xWv)RSRy+xi7I>c7)p$g`GopXd2^qMqMIeqqen?dPx0b~2l_WThmNvGu*P
zHJi<hyme2q%-?0i@FV`<Exx6XvbSE|Bfm5z>yz--g$<HRB%X-$ZlA}-%^G~4dE>7x
z`<u-U+phF=uF2ZI%k=L7k4NVItn;2vUf{BiF-74M+ZVeV>%!eMe;?a8d%Nb7S<8>S
z7p<5dIz9B`_m1Ghg7<t?KHZOq@?3Jb*w7+T_v-wK>02vRPD{R=bfhW!J?LoA4<7e#
zbw6frH@V*{&u^;Fbw9IejnZr1{a5ps%+fw_M}D64Zq=Q|(lY#J7LwtA7Zup`?)mZX
zx7)wd@qAx;^&g}k{>#Me*8S$!(sv6>HcEFoga%7CnfHZFe=n$eXyQ$;XM2K=+HaSC
z8~>60pt+pPbrbb%Ter;dl$|?k-CP;HqM93eC7BAP0YBeWp5$)wd{R95pVY>^R~E0f
z^{W4&y8MVP_rpg&mOl>Ndw1IowF<r5lH}r52W7lG`YNKXajai1#AEEHdtt$e(=zEZ
ze+2&KtI@c=CtIxf!}Z6qYv1?i>Za_k<@$7T;oj}rx*4BM_q$RvdrO<{!Pq4S!Yovz
z-t14;W&ZY`;m7Sn%@60hOU?$}dn%|?vifXI*5m`BCz;HDTgPa7_+5*fmSn*7dCuR=
zhy6Df|KkcR`FQV7^@ncnWe)E)#J!mHbju-z@NA)3YsAbQ&EByls4LW7D$usLwwmqd
zEG>~m@3wvU&(QoY{enH`mb2my{!Qnb``f+7<w9F~<<woXp1m@4a6I(vT*l|E+Zt?U
zO0#F1ODeyyXa9H8exrQ*`lPKN)*p%f?y)p2TD$w9++3s9!%DiBPTY>@S=i;0eB*KR
zPu7p_|2PkRnC$qG_v!kEJ-+MJyV4qBPJIi1_3hFV-roNV!soXdFO>BOSfKD+;jx_Z
z!}~YdAN_saqx0;_mTt?nxfgpjyu9pY%Gr6#SaFtVXLIuJi;WW&JlZ)|<7E7dt0&ba
z{&jnCe~WqRKMftRC>N``)k~d?_81yzwQ{z1%#>B{FPh4;DX&{4MWE`<k9GeU9@cI?
z`uMMZ$o@;EYV%Le(zUDH%I+38X}hMdZ_cV}kB_Y{Cr|GB^WjJQZ<!j!3x6c$DSfnC
zzplpM->I2l-mhO@%+}q~C%9)xSK6!-x2GTQZE=baW%+ZU`uO4h3|(?|AJ(_7FWt{~
z|3~?8>5F}n<@T;{To`}sqP1pq=a(O)(v~i-m=)dJ9D7f2Dpsib?oIm75L~YD<v)Y+
zi@VZCJRjAw$r?ZSwl@7yZd_*3`Bf%PVWE;CM|<jmta_S`iSbz6KCp^+aZP%fuKMBK
zM#m>_i?z<Heq1(BT5cx8ug`IL^S7Gxn@qoF@_}#T!;VrBZ}qENu57xZbK|7i(agLz
z_I2AnPTsj>V)$u!!yB$Ka?(Gf4TRPE*Gt%+k+gANHC5qz@Z^avin3>I(R=^vKf?jj
z*8OYiga2RuQ`9Cea3eBGy?tHOx1;WVs&C&`F>1U%*=FzW9{$(<J9b|D+A{0?QA53{
zPkC2eisL=dcy)1GOk(}L=a)9-o5cEE5A1vFG<R9Wu}|B}gBmQ4mASP>l)VfMKWgS7
z`NvtN=$>_M_@*uCrB4`)UQYgM@o4vxH|uISx2Kq{mAZ7!SLhMvn+WmvjS+ihH$I<x
zX&<M`C)TvAU2St8Y341vGVR^b$3Z;(MF~NLCvS>0G*~~Ed@geOu5sA3Z_;nYGT*1B
z+N(_NaC%ZN5~%e~L9TcHvdT4)HJ%Tn&$?7Z2bfKIy=mj8wQF?uymh>h@<=;i(|O~9
z0zuBaLpzpy-EE~PzRQ){<(kQ9>&TqE#gh&s&P?1s>FE>a^Q?0o7yQ$o{nD>G*ZfFl
zrRf{-T}3$$m&`ulRCto3cc;Vq@6O>HU;by<y#1~7sw}hh5A)mZ3v5->_?<la(66;q
zavLXkOgg4}Sk`>Qx3jgkKV1LEvHEw(pV|*^>`X3{tZy%SUn($*BkxZj&#tETv8OiQ
zj=mY|Dzo!vq|cF+59V1MTC!-@Ts@(%U0Z*@sPnj6Q66$}jqbh^A5Nz&R&nH+?(=ct
z<R-s+6;Iy%3a!wM4-ywL*uAZloqua?_w)6q4xf==o+t7v{Eb@ge+CxN@|Et)dny|@
zf3$Bu)-5=38l&CPC9Wdt7CaTw$h+k!E^o$WUGjGQBl{nU>3>Anr0+V%e3Wms(a%q2
zP}N)i^|y!W4)zIQoQq22W>h-7^H|xFthdBc_4-G90aIPRTi)8)nJUg1d}4tnpJF!1
zmU&BrhkZ$S{xUqMUihxZ`$eyURSa3q-_GTE*q+-XCC<Jv{q7gj-%}s_XZWG~y{ATZ
z*^P?r-*)}j{cwMql<Jpbx6T~oiJH4+{f@UT*AjPot4zFF|M<@F{bf$mnN8nc{?BmG
ztp35odiJ%CuG?q)XSh}N=#%!t-?Jl2=SusfsXXCG+SK_jX1lAy(TxXBs_ihW@G*7$
zePl^V;PG>_YbIr1dj2_kZC1U=gKZIC=30C1>J^bUdK9_#`{(AV9#3D?{#>uQZ|C0y
zd8Mjt8DDtK?ysMrJ}t24^EP{3*^ZYt_@DpP`s4g#_kRW!;U9^MJr`CuKa{<HboT4a
z9{;~Hm(Ml+o{-=9^onVB2kXgue7yT-Zuz{mIDW3ZsGWV?fp~#EzKMko^=~fv>~Qhz
zXW1ua|E#W>{9Nj$T=X*_;*Nt#04LuhzKXj|zNzl*AB?V<?EBB~qd4m3J;VPDr;qJ>
zy!3Bt$^4reUM;9e`?2sN)Ajh~<ZgY2A2!~qR}^|btSqjtapqY$%Vax;j6f0N`ZwMW
z;*Y-<`f=ZT^Tj=^3-4uCsZMcJxNQ2`F?mIF^gbWE)ICKf!pkmC*1UIyGe_!Q*gl#6
z3<pC>`ENcu@gw^i&yT=|_n9(XLo7ZTnXO%Y$Fs-ybaieq|137q2^;UZ-)DFd$}d=d
zu(<xg!tz^-`a3pP@P}PYnP4+3^m+U9i0FI<-BYieQc77Syei-iH9c-89(Vax;Iip=
zi(aP}&oz}iyMOL~2L2!FU++HF+>=~eF5mgbws3jo^|Fs1P4^<zwuq}Qc9lJ2EOCKv
z$24)S!V~A*@;mp$<}S{fl{&q9{nAZ)cV}EOQGL37N11e!d#U+5wR7)xEuZJ{+~S{3
z{{9Cm?6<4;)I{01F8C90)kNAY$9YL)bYy+Xp&7@gHD##HZL2H$oL-hxyrYlp+FsCV
z>HiE(OJ11;W>&c$?S9L2qA20=n-bS;6B|#RIBD8@^0NhdLE<?MhU+;-TC20=a(z;A
zOWxI|%nCpJ*XrE6_fZ#a{W{^XZe{MO7?WL5UO&#vo-=ciiY9~Go8^|;4ZK+q73%{p
z)L5>pSbVfU`Qcr0&qD5)oA(c{j96J?F>zUk@uJ4VCNKG}JzlQ<=Xag@AFq$okL^Ca
zHu>@Vj<33P-vf(vuk2d-_Si!1-L=oet_STg;QyxR+EW%&7#H|Zau4f*wTJ!~U3shA
z9dLH<qm1nrBVCIYt0wR1x)(9+p`*IsxlIh7T8yUqzv=9sbwtPaSIob=b=v<K4tm-@
zm@}V$d3XH&ANRA(HZErizr4p<`*qK4d7ksjB6S)B?i8%PBYbb4Klr|q&wnTV5j0u;
zAiizud-=Z$Z~Qzfd#q!^!;svWrXEUjXLhRS82SnvlWeUwxHfH`;`Ig7e*0ZmUux~5
z%JR#%_3cZ&J)&pV2q|jz7_dyd@_k)mjp6F-&Z1vTad&hVCfa1?ow~pxZ$8V(*uDRe
zQLfw$)2sd(%jPaQRQmOjmHdw2`hy4SrAq!rdB^kCNL(n9HGO70L*e>!o@fcyN3rIo
z6h6cTtn+tcpY@aZ(fvPSi~n(De#}$bdbv(9@`uuu-8zL8@gCc@PrP{WOmR$H?LPNI
z6U-UK3g<8s#<Tu#KX6}gPkC<Pe+G{J_OJ4Shm&T`xOMw%l_Ep^X}9f>Twh*fJDq>H
zzh~?0AGs#)c`D{uYld~*Km2R%p)CzPDsI|2#`5oawpkuC?p1GCEWSu2RlR!g^Y;QZ
z4u4ms?wB2ze(|fb$y(*Rugs3BO!Ji4vhJCrC})~#XT*Ug5BR1&k$T@-pB267t?0dp
z%T_8s-_lsY@?b)$Q1Yj<wGSW7Z@n+HPb#ig|JXmtYg;(yUQ&&X_uad}$mYh4iEEGU
zNlLT4wa{GlzJ7qigFlfAV*c3dja5G$CAaut_w22ey5ZrM-hJ6VC-;tz(m#osr-5y0
z9UGWg9timJe=`%)pBWVX#aeylqa|yetA9?n{cZH`y8YJsZ|>yhzWZbQ&|mK5ua<qK
zN91%rJe{|t$Ek&5I@g6*M~Pc&w`q#7u{PZCtFQiJ_@9AYsp9>iI+1RV5AP3h$4Y&>
zek!EzaIE{5X)4Dad^fsTyGhb`?(W3-+agjX{;*GfxYs>s>-H-qr+=h`Gra9=-to$~
z@6VI^{)}~d^aacQU2Jom$$sXy6GP$kr0?hBqg1B_?VIRvHtF_{+xBZ;$N#YC{-%57
zkNq-vncFoEk@*W<ujvN+n{V4T*^1xD;L;hXXSzpLWM}k$Kf!SQMf#ickB7en{9U$3
zePzY@Z(dh#Jra6$G52evp4x1mc`B?EGJegzeaA^w#^8pJi@+)N`Ujjg+BTcsPSNnJ
zbaPR2w|Kp!|GL`ldj3BaSM&d*FOT`5?R#b2o{&D))?<@d4u|&nb>*gPV|!%Ay6f0s
zNtHQiJGGwfSzT>h5%TPN*zsTXH&1?K_P&(2c8^2y?#qk0R@*MgVZ6onSa*k!Rq`^U
zn_rYR<!)KeTQTcxjVn*#i8q|lr&DI<d{SpIN&M!~eX;Q{-+{8v_iui>{%yjQI_V#N
z^4+)6=IeLnZK<x*fA{6*(cQYY+!lE}-MVYSt`p0DZ$7=F`NVqf>o$UHi&sS7_|f(1
z-RTf#?L&_qygbm{HnHn=dtd6CBddiccs@6M=IUu|7n@r&cgj4aOEtdVtYbw}TOTEh
zew{MGrjT)x%S&a|Bk3C$Josh0o;<tyNB;52NA)}vbKgAOHuskM<<xDGQy$mP=2^9R
zuP1}JgPY;C-Q4{=_c9-GYsYVRHCZoo-lx#6m^m}<R5~pC!{-pnyx%9RWV@7D?;~m6
z=%f70Ze#^9@@_qP#+zl5(4J${y-pi5*#)e6(C6{R^sIDjv;V?s@2fS{qI&`|#kNbW
ziJq&M#%5i6^W3%HHm^4N%&<53?C0;Iy!>3$`!_2;X!+Jhemwei?(?S7yT#nL@7n9t
zChDx;ocP(~cf^xTJ5M!8rZ-N%(#KodUB33#*2yljM7M}9+&=T|I<;Az63zQeCxw=~
zD14sRY$Nq}kNKm$Zoj@gcDiPxUA@fv>6W)VuVs(+eAFvAX_3reJ6%<N-2=lYFRNEE
z>Zui*pXBq^sQg{Fk2mZ4_xmgf8-Gk+QmOqdo7X=!*Eq1p@PK`CiovNB?5D(DDg5AC
zv3322_21ThxZkmr`#%H2ABXAwAMCqKPA8lGn_MaKtMp&&EZdDYVqNr}_iKOh=9r}Z
zq?1qk4Zq%}XCGoRuYbI8P$qS8(>;mh!gl4YnQR6Ncw~04_Y}tDAF;mAT(SRP?gRP0
zdlH*Irni5!I2Gquxy*INOADQ{&MB3Xjy-2={8>1`@r%mcH5wYbm+gE1>ih=_-@5yU
z;%xW$3%rQB`m}A!<Yj4_bj5rei>8~EtA#w^GZdOrI7iMZU-;zXTDGrSW0emTW_?@n
zN@?nIfqV6v%3{_8$OvCkdwEh)^uUkcZ-JL<1oHNTf8c*4w*FzSdC)eGN#|av?zpVH
zEoRfwy*F;IToB|x?QF5#!9&Z=PusDcyJGjF_lJM$RtNn!x#0Ca)y)@Fn0TG8S*+91
zpT631id)`f?%vyPLp~V!3Qm5PcBRbkKSSet^Ih%jlcLu%RjiH_n|?iKdU)9^pSD|H
zpWSZD{m?OS<AuCCYb=yDY^fEimG+x=-_LW8cUj(lhKp@WKHfT|`|(VEIny4$hX-#-
zpE~idLuO8{|6})q=cO{;ejkfUoi=^xOoa-)_p<qG(p6`l{;hgw+p(I}%rc28Jx%Aj
zKRw@asZJ|1+)lAJ`Qd+tE<F#uRl0g_73UqEBX;X~%0=@9r}<_on=bZUz4W`Vrt0!%
zcJ(4R?^fDr{^(w?thIc}ok{`U)!ap=HG?-<#H#3&GdBdevGmPYuXSzxAIGH?ZTBNC
z{&6q5a8CNI*(N7_9?SD)pC3lD=j`%qJnr>%XPx06*N^u*-_`Iw)^ESAcI@Fh)_H65
zuFaY^@4~7lKhH`npY%!1T=`f*k&(mM3caNd^V{!PUw*dnN8)4cUgncCPVl$qt$psO
z&*k#L?#B~`-bDtdR-a_Hx%Oq{*Z9UMk1lWjBT}>WqyA&}zO_-g!qJzctThim@{R1h
zx>8cbd|LPu36{sq>|cJ?dw*QtQByAy<=?P1<CcfxnX(C$g&M(g%;%g{W`1SBU^DBl
z=105kM`yJU-}0#n?fGZ5w~76C>DBcUm&bI9?h9+Wm6~z4&v=WMxbnhv^AGLg`H{@J
zw7<_ZR>_v>ajbir@*1aYQ7d`pemuqz6wCE4ChswC-_)C28@DdrIcH&NS^wF;{s;HV
zJl-(j<*uOY0HaUSwkzgw#zk;EVdRowU@M-#HsSSsCUL*3Y9IXj_jt?AUKM|P&83&`
z3#Lsn+R18v^}+Vv3sQGI=-a<!mwkJU@q_zf9H##A_p_yxoRv-6)-Lb2vpjGnT7Th<
zwE~v^86pLeKTVs!c)q>j@-eIY&RhI!6}Jz5(wfs<y0cU7ZK_Xk_m1t&4R#+>?GL|<
zJ}hkZrua0!T>HVO^KXtn&}UOQWE&^z^)6wOO1Z<y?{1P(<wC-*_A4-ao*22|hq3p?
zvuCRMW~<H47Kn_B)C<Zk3+{jD{M6!o?}BgVvR~$l{s{d#NzbGs-gE1g*4&Fa3gTt2
zpMDWikSi8qGg>>9S=zmRdQJ4ASF=p#On&)c-}03wV$)oDZi&_{@qE7SO%W%<9J$9!
zOON^P-d1>yf8m+?HNHQp^6z`+CcRQ<n8~A+)>-(O=a!dKtMdA3r)qnv?b~h2KOEKZ
z`NzDW|H!T?{(BxhEG>r5&ut78X5wcMy2H2ib9vhz>5t0CKOHWud~mxmF=m7Lx@V8f
zk{nqdXEG*U(Yv&mS@h+${|p<~_tp5Wh`N2UvNk<aJ8|L8v`^C~9^zdgJ#XQR+VHid
zXB}16|C;gXO1>|D(ueEE{<2vIKdk5ekr&U?wj*=eqhlP4=d80!`)zyb)RFWbPRl$_
zWPLx+TNC_IDl>R)aL~MWVH3q}NlP227F$^y7E+twKGpJ$VB5O`&qW{Xllo!5?uYl0
zpc>te6=J*I2>mRK%39i-!h3VuPWOVk_?c0b{>%y!<DKr_|1taUB3bjp*94DTJE5%h
zO>CdJ9>dSYv&_?+=ggm_Ja0+g9nnSeHd?*hsh%nRhgZL~#(&-Hx8`13FMf?RE4Z%U
zXku>M9>hLBYhz`Q%)7$|30!}*cU;N0v$<C>i(6JdX0uiD8Ah@EzY|Tj<Q%MXusJ$)
z+jFgh6_P5#T_>*8lxB;!3fXtI>DnC+4(sx;%U+@&)3b$3$fog+&*C}hYcpQhbFPiD
ze;dyc_lnt9VEfItYWpH{Lq9C_+V|)|a!=|3c7+t?n3c+_7U#y!vG4t3{@`r((SnNd
z$N4>Z7uU>l*}ms$>ybc>2~77>_ubfN@Yp&m$jGWN?kxYCyDKv0$(Y~gHx;>}x7bqL
z>aarR#Xcv=<deM}2l+St;_0h+Tx0o=zo%--e})g;S=ZPuNiIr{{BrZ{R$aSb3HIc}
z1?HU|zZ;Humzkb^{hxvF-9NqiC&G_@U%mSF+m74EHMh@GoV&n#=_!VoiQlK0e0?st
zR%ywX9do|z|HFK>RG#Vhf(o(6NA63!dsosLX?NVfdv^ARN3QZFMmL(34itad+^WTH
zUHv1xwPbzcJgIBS*K8zLXKfG5otj-SPkMEE(GDT)4Z^&Ow|!!;H?ZN_{FuL4UaE#O
zGk<MG)hXX3iNzt)jsN!j@-$+$F|-uiweg?qsU!9LjuB$trF`4EIe#=)%;VqrQ9zn!
zk*;-cd54fgg2<MxJ?26w$rD3Qi<X>8nfKy_X}#<puN@ct+qUX+XI{6`TjeD>=V*D}
zpSjC2^8V}$`N9<@+}H3}^gz~s2GM_@ZW+tAU+Eon=S!C^x^<SVzf`hKU~%iTlgB4T
z)C*ciOFRi*@IyQF!XMt%S&NVUQ@&CYnljC!q&xG=vh7!F{=SKndnfMkR7f+_y-;f1
zrHDBnKZ_r!@4dzPpP~1S$$tikKN_+8vF*8cr`|m@e~U(MOS5^wj4RFCC%ik*+&t&O
zRjcr_ZA(qAz4>A<Tygr*z3GcOOaC+Q$NX4!K`;GN?xU#&J6Lb&SnoV1oh8%wCsr$#
z`RG60>wB!zSKPRD>*kBeOxr%3($ihsJ*mu{W%e9V#fIPuC8r)-KU}{>{;l)ltMguY
z`%Cfa-r)#47~*$Prl{sAw?*Nka^dq5%o6tVqmCcl-}!4_duIOX*X!56EbzEoJNHTT
z>x$S;zJuzipS&5{K243jw_Edp%%dk?ET4Bgz3{JL&DXz)V%BG!{kLr1(dN!yaUh0y
z>$c-h^%&(fe}4Zwk5Sb5sJ+l0`3KpIt4`Y9zwy@X+4iQ2uv<=!KSQNFm-X}rx2E24
zW7Gbu{ZPKK&gf6bhc~~jAC5@a+Vs;f+xF>~>17vZ91OoH&3k}}LxYd;Vdv3|h=1qg
zx2Rs*S!jN2_Uhf0COdd0zS>p#c6Zbst)dev4p}#Z*5$UD$xcXb_Gb6BJ+ri9_NC*O
z@2URX{6|%M&OY%EYv(QGIXm}c&Wj(<^JmK~Qf56bU$Uvxa=pmM_ivXz+#B~dJbv5$
z3+W*dlXR_~%FfXEXI-zkw#fhYav3&-@Ch&OZ{B`re#i7<vi!$3#oRq0nxCt;R4A*k
z)6!9Q%Z1x94zK4iD?dr-`}*DfQ2mYmhkxI<s{M{{d$P}vjsM#eW6fK2K^yb=I3G9c
zl(cD#s+JPCB9(j3{ZR0~oB2zQoL-bEoVER3h4{H?i}NK|b)7X+znp5S{8bg-Xp{Tf
z`;XhkD|zos?rI+l6J`~@Z@Q=KQbF_SMC<9jCt2Pm?YkrOoBjCw4c9vM$+v#-KJwwn
zMBa`Ix7elI%2prkRDCS#toVKX)TNj9RDTdTT3!1n|E(!slsC6zkl9pDX{M$B?*5Qu
z^|lOt?Yqmj?rrw7RPK9czRczS$NBPO^3hvOKbAkT@1A^QSLzYf2fxE-%DiEe<}u=|
zS;ObfwWjzApY{bC``@yE)U3|#>;Gtc@YlJC#k#i+^IR{REbX}@O)h@=ifGS5{&R(`
zlU%+B#>5}m|3lOM(Ej#&ieh!LA5yPPUvpRQFi%|4JH4OPZM_$wRaRB<Z4`3Up0Ky>
z`o_OI*GsPbT3dYdmQC2Mj=;j~N1n>tcX!I$TdA(BNYg6(G?71Ma?I9wiqYP(8v<_5
zO|jop-uB0Kjprj-wcl>rTIHW@zN$Mppik}b)5rx%9ugBL-JHNs5$CYp<73^#5C2|!
zZ|DyG(0N^7rE}KDlGXX!52rjxXKpNc&=<P6!|=G))=&G7#ov<umeTamG+!`dyFgZv
zMe+K~eQ9&Hvu8+O`*wD!YV309_zK(OOnVN;{AXxt`H?4`?fN5h_1?K>TX!kn>9t+|
z=j`J28JBNQ)Y?~>e&f`U$)B3Lo<3P^y2vWj<7@hjdqO|7ANb2vgk{=EX1&eXc;?x|
zr)9g^E@d2=oOdDC$XAf7SVi^9N=pXesBhEWfB5(N%|GLhZgY|^Uq82X-mzB+XSF8q
zxSfmNA;A=~<dfp>B`MGLtJ!4!j;ksCIAO=dvv=E;%N#b+z4GXbhvBD*d1j|~`r9P7
zWj~GeKC<c6<X-cm;n%;dV!X@j^YNHl-J8JJpObi!74mK|d|UhSf!f!+W5P#Pzo<L&
z<NddzKO7%OywlG$`RjH#U}yRS(`zNi>J6T&ikWr(usnCq+N|o&?RE7BUAF$MkDBJ+
zF18^vXXTUW6=^$+*d%kme^}YdX1Fz_r}@O)dD@Tcc`E9@2lT~SA3S9JEMw0>=G~l<
zMVxjq_jlxcJyTuRw(Igk+o-3xi+?m{i>~otT70@t#YpL^bkg?7z>W8-n*3QBV+{^C
zS(&fw*%-91O})=P)4n&(WJ9+0!R7mAXZ&Z-G4R&5iF{n+bagR@=uYb?>lfTTTk&*#
zi%sN5tM_lC+`rvh<iK@^v*)9>+>-sLF6y}}%(Kw#`py3ENImzK>gAlt<?G^BYUk;#
z`Lnxj=4lg8vpWwy1r)IRZT+J3??Tl37KL4xb?ao0bHyy$ve^6f#-%;7n|`j{qR23D
zXVXJ}pKI&y{!soUb1w7Lr}XDeH9SAoOXpqt(!KlHXY(~H_U9<~O|oe}8&EB9)IB(6
z?)QWL8ARQc_ikN!cFkQb<-dy@V&?8%q_QHW`A@R^+PWE0byqLM+){q^$va(Ul4f;j
z#e22eJ&(_B=juLr;@;7{=c7LLciL}pnWwUOvd5)8HnZ05>EQOSRhau}Pw%!<E?re}
zD)9?V_uBYIXA5ht_+oGP$1(ZuOpWe{;F^c~D;Zr{83TLwMNjg#xFh(zIy9nAEqj);
z-u#ErGfi%{{FAOu)ag3BEiZJc$8nh^i)VYgk8ax@r?RvBx83#MYYS7kI`}yLGt6H&
zq3Z8Vi{~rW+5KmD_-`#o#<OX+Ua>07zbAQfZ`lDhH_H?EviIL|UGk*IFaAiqc%4nf
z_Cw)y+#mI}+Mb(OD`8&XtM}RNlEGv*mpS^et4{5C@GHDy^-HslI>x7Ur|i_Z7ihNe
z#ExV9Gk3DfUTJ>W_4WLwAD(54WAEHP)pabT%`uBZr7wB1-r{YcQ{+!=EXn3xx_#bt
z=WXWSP8@R7I+0R#;*DPH)Q02MDUUDDx@72?(KTiEozHWP9ysgYtT9WR8I!9sd#O$F
z_ow%zi|-h`urA44n!eJvYP+1`<TvY#UaePp%#!d>K;o0*33kc#4wdgzukx;Wv8(pp
z1OM3t^YS>(pXORKQK;gC-qx&7=fgc7{jT{OH?7oVo5wVU-#4^YJW5Yba^R9J7jBh#
zH228FC*iYFq(T>5&3~_!;*i3WDRfF{@tmI>5pzmUD$81|T|J+#;!<h$?z;>xC!7~L
zz31S!NcHZt&`BSr-do34B%QA?r~EJb-#Pn}*LTQS|LE3Rx%P*dFQ>`vj>q$2^TaRq
z=x*^?*Ik;cInluJ?;U+<!L5Bo+P@@z82(m$HMwFI>yOhbZ&l28nUX8yyv#ehZgPT=
zLRs(HB|Sa=J|_0dB>Gi+`dB$d;U~XSpIF(If6;aP70d_A%_mk&J}NeA-TLMC4kcCF
z+MSD@EPBqd=kKcXCAnhE+DtEsZt6BRe@j0+zagI8rf>z@kDVXhhg|&fJ5<FpdHLx|
zDQz=zpKAtNFKIjwo7~E7-EmU>(*2hDH2<6Chwqtez2@GWzejjQWDNJzX;0s+)y*@j
zS^I4=v)ybXqsgCqjL$o`%SZiK{6M}p=;~L0p4h0nFLe$@Y}q~0ZeD|ofbx#*nIU}-
zwr;oW5PfvzjQ%QXQC0Cw`4&0GAIcxhAIcxD_@`LI^P_oX1($Bnz3A>(xzB#FuFbV)
zuZxvmyd8JUT$9aW9m`(306*>L^SkRm1WC`_qq3iOpXiS=`ObS9O`_YbuJdiVb}MIc
z<I~eBVd7~)8?BpyY`hNoaSNaP8}@hQKIVU?&CRaa>HOIH;To@BqRhMRVc+yuO6RUy
z{rT?ABcG3X#=ca$ddvO8)*9L6KQ2Fb-&C^J+5PWa{kKaS(jEzYQrlUa^Kqq`rt0o=
zf!h<>i@caM?ruq$^}IFv)mK@s>_zqxN*|sd+usqz`fcW;j)y;LGZW2kOZ#oOlxH$y
zarI1THiI__$@BLGXQ#Z=TJZU+{hQyv+5TO6`$(fEuzXc)+>5n>Q|F19UEaXhlj5JR
zz3ftjLW9SXgzGQ!51;>`kyFoq@4m;6=4BaH^V^?poA`9k1>Ju)D|s*6O74obPMc!1
zPhM~4rxQOXtM`k2Wd9@D|DdN%zwh_M_`}lm+^@Pz*6r$Bud>V8FCc~U(dAE@7P7yK
zb-z7vg7(@ZE$_QcY9^+;-EaM8;ItEXUB&xu>Z9|W_I&To{%2@k(pN2;WX)0fQmM|N
zVym{>q<1{!X{~;oZ+Go`klz-yy~Wg+`Hy4Ur7vugv}NloN|*PhsJ2~L%X&-EzGTfi
zh6j9x@%?ogKUV)|V0Hd+y)b)i1^-d8DAi?)7FAa}=IUHD5nA`-o@B1mot#vK)hCu1
z*c4>%_|X35Kf~|v*HWR|wtl>1y<UWK#?qtfCyL$)J7oUwQNV_KiN}mvcxFB*-1Fg7
zv)}WOp!$s8(cd~g>Zl(Qcv=2WZrjJ$Kc^<1mljD8Qj5IBt$kVS#oa!)h<*1sO@GvX
zO!xY`WRJJ;58(%C3m@q->2}6m`xJe8$s(0EWpk%bu(sWq({Sz0i3J4?2iD*7Z@I_n
zvSI&+{6lkNZfD)<mY&`m^gHzG)fqi{U!#2^|6QAQ*PP*B)JAoMd6oOSqRNl|XK3$E
zf7mZ~_F?v4p-8ism`I;*;Tv5ZtKRmXn%-0@%aio7sJbfO@zY)bi`NVP{Q6P<P4GWM
zQ{!uM`CHd--M;^F-BH(%SJbzc=j4S3UG{#~_T<yV73aOa`g7GC{`G9)N`ApVS=aV>
zFFu>|@$aHseJ}F~4u@52&%T>>J!?Ww&9P@9+}D@+rvAII&*DnL$KG>OA6Dwws7%-~
zv9z`CyI=3OKJ%EHDpiGUDjy4^ZL4~&-<rR<y?OtGMf3DN{GGS=fp78QPZd!?s?o(Z
zAEJHd^c$91sFsEvQ21GB&3ur3LiO^fnmK2=OzwV7pIx#2o7LaVlU~V2KYV{I^L@$h
zgU=$Pe8Qd{-Eu;uchSF7Vn>d-tDHLf>gLgk#dXK!KZLE6*m3dCgF8Q){_)SYKl(X(
zbMf^_{wqy?Pk!j%Adq!S^?TR;toK~b#xHvoU9**#TbJD(In~)WwNxZ9=D6IS)ypSL
z%46+RX5037``^AlThG2fqMh9Md-}CK$-?gc4)*`x`l5Y%Y2|5A-dXN0srs+(KkNU0
z;ZraFKMu|R46LqO_LpD&Be~$k#>&KX`bqoS{vN5VFIlOy_wf2a&J5?0&y1Gqx0Le#
zP}G0(^uvFKhZjCBe;fEa@Rc2(hiKHN>c9Ga7uIkdixt(s7d`ctWW>iS-~aIbIQcuX
z?#BHsI-fy@hIYp(?dy7b%W?VbSK?w)brK)Bq9RQ9#Ci2Gd2Qldkf-vgE_wTh{|q<Z
z+i!W7kf|rlx>RHBJj2!^BasGn9_uQu+pl(X-umSI>$Bb5<dsKb?RVDC{m-EMEAoTe
z#QzLz5C5Is-gNlLt#i#E@7(d-rW+l6@#}fPQ(d8spKe`}EIILr#VkssNB)uOl*wPd
zcl>8~u+IL2NB+&r9`%g>&fMooueCen@owRje=@rJCU=UfD9-ZKN$1&Vmy=#n^H}$s
z{ltzh(Y`LyYm<bZ?__CDdR6$wQ@f|QYtyZ=<!LT&lD2H0@=+nou;q)<1oq2Hn<H(a
z_dGfCbcUtw?4SP`rcV6pUw_13>e^J>y~`Wz1hdPdd}g<v&W`$$z0!q4QA(_j`*vDg
zyO8hp{afpb{<!{UXnOsh;h=X-@LFH<<~_~}Dzd#N&P;Y(=xF+V`i{58clMkW*(_?2
z=3Oyi;)EHG_N)D2eb_Ho6Z(n$FfV)TM<1gT%HH$&GsSQ9r1J!{%{!-=B$2pfT7t-j
z%Jmyd<bSAsfBSUpT}6BDbv5?O-bXySZWCT8Hhsx~HwVkkTAO@6aOcU!ZMO=W4qWxt
zKYY1-`lIx>YS$*Z+3o+&z-s=Vp{eur_wrlyJ#}WU&98<3Zn;%6Eh?}}rQl99#~YSw
zYZwnq;tcXhes20PZtJo;H4f9V`#YWoebh5F+TQVA@2l%ccJ{J`x`*``U+p!j^{x9-
zWB;F_xz0YrUgU88%8J*I#hbqzHi_($=YP5VpHk0>15>%n)GseCc~PXq(oo<Y__h6z
z{tt!pL-s7M!nW<-vZqex$MWRTtxtD;*tSxyS#-(lrjxt<BX51m=qvxT-G5_|XpvFz
z%I-s#e%Ld#XqoQ(voiBrSe?{m`^{f0a!s-gH7BResf+Q8NiOU)<a@wo{^rhMhB=H8
zRsNlI66aUU6?Uk2enq$Z=f_M|o=awxLXLbf8}j#ldTvu4{yj1AKLbnOe}*QPio<Sp
zav#zUpH7XnOY!c$`PF;I*HFW4H8b;hAMWFltjjo^`0>R0eRb0RPTdpy!JViwpJlCR
z$!+e4q{}7RH*=FcwmmWE`g82Nk)p(b8IyO^uQ~2lnYJZ-uSoWrxmzcHu|Ic<zx_Xh
zknY!NTfOUtZarOkZSBU~g;z{&pXTno+2_!uy(6(wgvl<|LS~YK<ob*9ZS@~K?0;xH
zKl)bfcHo6S@=IQRyRP!&^{=aIcm(FjiXAN#-oRI>b^7m}C;V?OyMLS`US)Kz;@GKt
z-mHn|a_-5-w3H?7-WI)kOLw8P=BX)Z!ROo_ION_xJfHvdO0l_1Jgb+ub8#$`3SPM}
z_K2bJ%M)T^>gu{%WEVHjk$S#*j`y2ID=&AIXaD-c|77{Y<9`IWzx7|S@%uJke(PTS
z!~f*nr`la#63bhBHsaXRVv&^@7gyIDW;0JH`?EyI{Z>5aYOdz_8}qg%T|WFV`{+Lv
zmKlF`<bKJu)Q!$pIIP>T!})U2$&-(}{`LKFez=~m!vDAJmW*|3+vfgR-M&4{qxk_t
zP45cjn6HOrG*2^Gu9v?0Pv(!&wXfOtJL;tN#o9+-(K$C?Z~a2eX)hM!wLS{(oXMfE
zx#qESIoI>P<T!sf%c8iK5q~-^*gt5j-?*&vLG@auTlT^g-=n5%-g|HJTHi$y3nnCR
zTbjJC$Z2`u<~UPel3U6FiLdtU^&i~wf2gZBeUbPQFZjo9U-aEL@znmKQty_Q*9*q1
z%=lQ6<Tx+%p`!o2AlKTb5BT{jejo0wTu>8pZQY-UO`f9b=G$(a6?NBZ@v}*pij}HG
zq8q2hp1;z-F8ZSWLw7cRO37b!$L4@bPju9)J5R<gd3Z8iF*&DjLUSIQ@rgC6y=%+Q
zD$P~7Z)|7&L-{`g%lyC1`&jSZj;k^L(A#?C;?Cc}KiX73DhnKWn!NK0&-Ah*2~$JL
zdP)uFT)%Ywfq(0?OLMu8&*v#Qt9R*<B*QdYqhpVKW^sJ-sGjQTVqM_nvvD*3E@|F=
z_p5dC6>aY$F1t7Fam~(_DO_TIv%GLg*UH}A(>^hn3oKShnWjAXyy%zp9R)wk!=@kH
zpS$0xb8^kZJ4*~)wTzm4;*#duGUORf;%C3Mp)_4@*`1ZId>2#{AN(hA;r8MAJh_WL
zR88~jeqrFq;+}DPa>nA*8V7o&aGkwg_-v2;aeKy+^&Ru%Yt<k1n8ypfomX63rTcu6
z#NtjFs{`N67Ku;0QJ~WEb6$dK%&y7vi#B{X-!An!^h%B8Lf41ct50m_Ua71mdaPz!
zADdm!Mw^pcD__oQ+qAB9zTA&uuie+}w6=&HI@*%-+;^6<>=nh3*^5>zUHHmeIkk;F
zFwn24JJ*`?<;J-S|0w=QTzD||kv!KA_rtqH?^Nrh&%1ZD<o47^%O1g$x=RbEq=p6T
zv<;XyS9a@`YqQ>-Tk=o)>Q`@x#KdphcUFFG{Le5g{E1pPyZpWYHv{R(J^O`U{%7F)
zr+F)~Vs_Z}+^CO7d~;W2ewJ9@q}&#;`8Myl*#}i+CZ1$TxNQ1+e&;vyX>T9S*3jE>
zb2-<?+vgOn<SN}^n6YHdz8vpKaR$yM2@*1aR+rxStE9AN+G*_CAGyW<hx__1ulLSN
zy&|X7l)Zz;vFmBtgsq#~k`MOYU~p6x?SJIY8I>KSy1do2H|V_k_6v*EZk>xz+;dr?
z$I4{drbCfllL`{2R-9v(DU<rQa>0*#(f=8kE4EG#XvuBLHG9T;;jWg3T{8D1(Vr*T
z>{?1C)>R+A&t>wS<>tM}A57J)(JL=5zPwd($rYWo6ZGE;2}GHN7WTAHJtQ~R(Chsp
zZSSm_yC2IR@V{w&JjMHb?|%la5_z$xySJ9?>f4#U_*PtGW!Dmqw29vLv=;R+U2G63
zD2^BY@%$gh+24FW?!9{+dnwoSKL5=apXmYa%U>z#h^dDj5pXT(J1NaS<86VPABU`c
zSjpS!m=9C*SN(BntkLJ)b5_8>TR8g8yWc&N-1tveoT%4no=|*k&+FrM!XKu0E%?vS
zGVSAYsn!4fyqe|m@t{qsNAND8ILj$|7ld3b;~1GIUiB6Xw3R)$RWx<shj0D=8CW*_
zXJ{(@V`t8DpYv^LNA3d8$FrUXT{YEIOG|v_qWdmSBBl0`a<b$T28Q*k{_)pH{q6rJ
z=x?)s^Y+7ctq+@Da+`Qstutd*?U~%(Q%fKCo0%$h-g=&C^Z9I2#o<ThJto{UOLN)%
zn}av1D)l`Olj=$Jke(-=+Ih9?<5MB_n3V9dQTN}*f2{Vq@-Fvne&sENX*S~1vz~MA
z($}AQr)=JW=kvA(mu9WrURZqFd;W^))2f=IY8S~XT@5qUDOK#8+gDdQQFeP#C7a2~
zCvsQIBkK7wepQHP=uV61ntk$-UcA=M+MBnQ9z684F|K{$`G@O3#mIX9YiIkGnX0$<
zww{<;bNtwwEm@Zu9FAEP&bgktsP5W*!5YH?ljvw^w{2I%vz?!t{Hw69GHVLgIV1l5
zPXj}x#iO0C6V$%z%~RucsXH0{^1G0~-qMG2L-U0=4!dXCv`)RF&|6>Csl7nrXTRmS
z2%fYZtNR6Sy*7;hk^We}RekeT0h7zRU(B}eigvTw?6>6j_Jyb4B;L(_oX`L7qMh#b
zFHifPy{ctY?x=h0+pE6)kVcG+zf2K>o5-f~{fV)!|72g<;;V4*k#+X^%`t9D;=-+B
zMussDrQ{6++`>;yY_2T~+wkpjvgNgM+oa!dmvVJ<Z$Hf2D%PFP!=znZ%oQ7P^8D!;
zw{wm&w;G-)V88n^On*;-^5t2vah9eQW^Uhommf&m7GC7Y&n3U5<Ji6OV{RVj93MZI
zEqA<}n=tG5LBZQE#ETyMU3WpV#X|nmCC&2H^B?MTN$?rZ`uXeA=i_EC3+=m1BbWCn
ziO%+$`mVgE=#gl!N`$Q&N8kz5B?jkWJ-#h}F|VVJxx(uHKOtSMf5%<3Pe=<oTI)FM
z=A9%hTD#`(oCM9c6GL<UGi2y9{wR_@YaViK|CYI-8*-RluGgL?n0xI}qD)KA<elvo
zu0Nf&kp1v^iQTVfm7a<@)n2i?&)s|Dmc*b;PaSs#*3`%H^EubQu+z9wbK;MwO!4g<
zJV`Y(i$YS`?j)x@-gmiAyMBf1*Z&O4=CP-pU-x&#Z(Dx&=Q=4_^~1BK&0ZVP`f16$
zr_-Jq*!kaeIV~BMS5V%=(|l{svDe?u{#~%A(q`Izp66G#u%_HpcG<8bnDP7Vw*rgq
zY8I6noQ(6ov@dSc2f3{)vra$E^-ZdLqG5NsRHL_}aDphKP5rJ4({JpD|1;eD{;0iW
zjqAJl)~*u1C-Xl2dte^3+<L>2(vxyc+kWk}sL?ojB|lQ|NA|%>cd`O+|B1h%CuY5=
z@m>BS&7@Dh-?!a)laikE_?f2SvEulW+jS?Up3QzR<IDWkUuUEkwomd@+R<mav&&gs
z#ZOhWYyFaH&l9#A<9r|dzTX{{y7uk%o`?S#TFP!o9GQIQjKZW#PJUOkmGi=MZ&<Le
zH@%*<=CXuM@P7twwp_V?F-kGF&j0H*$ysK*mf3!S*^`t7K}E(fQ<ZLA{$O?G($;g^
z{xdjT|0n*(zB}f}L783WmWy7#Re4Wp+dSV1HAhot3WmA*?tD;C5n~>Fu0r}?{O0;D
z(^&gQ=bN|G+Wq@?bxCL5mkHn2ya~?co)YG9_ln%4bx&2~_;_>T{}j!4-oACiW#Qjx
z+97hKM~qhAGh<Mlb^nQVk)O@B361?z1Y`93>WpecukSJbJNwbibtYf-%uJu4dvZh3
z?}D`*GgXu4Kb$C8WK=1tWwifmq1Lppt$X=iAGVYE(U|_|c6RpMWXF$kjVsRi9*SH1
z^82;GNf8o%_M6=*Si|(ZNG4rn9v^?dP2>mWWB1haTj$wbUN}Ff^PaS{Z<eI)w9JUl
z-z?Q{>&)J@+N~~$k>UEp4138h`J5TETH?g7zpF{DxZJk6J!q14(Z*b^kF$Fx<ttAz
zU$t5OG1Fe-L-t#G->qts7tAPp`62V%<QZEzgfbE*$gEy+x$eCTUvR#<eW2d_8D3e}
z|MbpY-!f0((jM`|hx%=rxr=S5eA;ZbU1!!JPl=?{(snPNb&AZ<l>WfR#_(*3lv73h
z!QhJhkHTi=FXVVHb?NbMCF$Nk?sfOSG+bC%$SG-;tiau4EEBBvPrJtKa!sImua2F<
z-Hh_>;cU^fS#Pg>8Qgp@e)ApkcTDSDn-Ui8<h=34&hYQ9Kl~5-g?(34*n9TJTz-3q
z|E;v;qDd7K9&4-iB=`%QcmB+L<?*%)z3v|-JeR)xPv+?#(ccDtWIujeocXxF^@F?Z
z65+g^yDz?9*u~k*Gj$egvb0P!o2}usrMv!4`;)u)$2?iL$37Rgo|Ss^P$~3t-N6-6
zIz3F*&Nj;|uQL9esT!8RcjKgly=leue_YNFw>5`f{A0hUSC2RLTK4L@wu>(6_jEXf
z3+tcrm#!<xJ$+DpX~nj=ze5ifmRFm|sa`RSF6Kzxy0^*Vz3i_Uf4)~N*kO|xn=H3u
z-BQ1G-~Rf{ZhloaB|DzWK2<mT$l4FfkCjg_+nW-zbdslO&#5Q%YqpntI@2PP`Z!It
z^Vx0*8_w#7@$Eqs#SeYYM19*Vds6#9183;DrxCFg9Vhd}93_5AUg#@2x-ovn>EA^^
zl8@TS^*=n`Sz|8xM)KaYS$E=Z*+uJ_ZSh(mCRbn=CTm-{dcNTP%=)f-x_ff756S5^
zADZSV6HuS}ic@xP&m@h5@|nH7C-m-?_wX@IY@X38)m+s3^^gBW$wzxWtZ!BSn15`y
zhK+poVk^m|SM+rE9cui~aCLU()h5w2i(^-dj!PHEYh+o4ANpM{;QGkF{nodo>7qvt
zJ$s~~F8<BDGUxQa{xX+lh36$kd>)VX`Fw0Y-p~KXY**X&qfu*bY~RzVvS;7rgy{j7
zFZN68sh*#3(^B5bfLZdO>9LpcTh1Spwg2t8PcYN)cFgO5Rl4`)ME+SRZol7KGy2W$
zO=pi?m0K`D+avMGSEC}&n7=GruI~xXF0?-SuzPQ|N2d6x-4|y@c|1xxU~a}Y?emJ~
z^Yza;_HA7%-)tvy`my$W-i&=p?T3Cn3Hmu*Dn&SI@sdf5zprm(*yZuMdE(REOq}P6
z<7cx!Hh-&F7bfc+u<5Evif2mn^0sK{r<y(5Hx^FPWR!fS{8_F$-t@=zZ`(eU_iTAt
z65q+0`iT2>>}l3*JF`uD|E_%eeL~E(+c%`=Pn~)^u$5`Ia?9+FsTp_vwVBLb{hlLp
zdsz8|h#$uTE2rGpdiDN|L_<D?2^>r6O$+=jgD-Zxs>)~k@jLX#?8hs0x9(>;{_t+_
zAw%6KylZYKyJpF3Nz3+iES6rZ_Q546FC-~O&#iuLJk!4`_FL?aaC6&AKbW^P`{Bbh
zQ7P%w#TDuys-b<09(gKTJA~;9s$1&M%YLg_pW*+**-p}Z&A)5qt5cU{J<B!wBt3I>
zbYmyGw*Aek52MTb)r~r?^N8+TS9xLXoBs@FvKHMe{kP5DxhC-8eA&qCPZiG}o<G{H
zy|J=H?z#8XHTGNH97%0R-Mn*~z-jKcCjt&$5S&ys`BD8=`M1I!%pZQ-`QiN$d*&=V
zl@D8{o!%e4|MJ;q-8*-!-l8~9wjuq@RAq+0*DTcbd4Etp5`Uxn!Tg>#`>bn>=RG=g
zDBtk;<t=yftyHfR9SQN+m27hD!iM5KCRxpuFHf$YZ&Uc6fwknvPrKDCj(>Rd-0@lo
zqcL}d$qGH4cghWu#4Lrrc&HsXklxv}@g!qaXwadMT&3k5tzWNyNWW3V-e%+RpMib8
z*WbAbm;V?q%@$Hynz+i-=GPQ$kyq<%b}XH;qxA~Y!ia|DPXl;s*76_z&u~lq{B?ah
zv$$x-<R!QBx9`5NWK#O>z};sAZ_L?sa*JkYpIEtWU*Y5r$B&%9oqgP1Vr#F_^+%KZ
zm;Yx-S#~>OjcIhZ_3D}j&&(UvuwIv8?>%Q1bUQoU_wSCpf1(u?d-mslOj|1R;HG)U
zv+dhE6)YsuyU%1w8WadR=DjhF>(x;W-DIgAC1ka}W&g(G2mUkM+JE%Y%^K5>Yg^Z?
z&2hOt%SmVB>sM>rbxYGrHhRl3o@N$!J?HbRU)MhW<NW>G{SWJ`&qw|<@Y`@_KK`p`
zaq_qAv~}BNon$DD&^uDLX%aj4a|KzB_wgdp{}~QO{4;%3XK=BmWS4on+s>tHrd<;c
z%Frx2#Chy`r(RtA7LL0P{4<?C*hRfwZ=d5^_dam?vGDnlUpe&Ot$Q@<yZi1<^N)n-
zwYeI*=c_JKx#r{c)TvmcrlwuO>RfNx&iV&a^;65P-}%pQHsWv6kIoO?-zq-LZ?Dn)
z@cVK95#<N7`-P2OS-H*9e|TZt^PQ=um(S$s+H7Pz^~UeTY3v!MUYEbgeca#lM}0M~
z_)+IaZp*^YTzG5R-Lclo;Lb70_qoYaxi%{9xw<WB$AP%7pTdvi|IlPV+{>D`M|trN
z!+#1H)5A_}KE2v)fAZ|ArxV}gg)S?Nd7JdndGegXlRqw9{>K&j=swdQ^VtvHzxnvk
z+P^I-{MM44ef~V|pCe7yKJ(-;j9+_p(c+Cin{ra02ImJJ{wnpU?$ux3<c?*F_CNg3
zAbauG`48V8ge`siUhZX7`my<~x8Aq?abM)|eV5zv6}NA^`c;<LqkCkU)!hDB2`XME
zlxG~&UiQY#A*W{bZ<ov}{<g2H|HdDfFR#>>Z~C9%QGETk+Nfi^z3sipTQkyndPII7
z&pfE*H0Pi5kK>Q$zvchPAG+<z*Z7XACD&E*KQGz8XUj~luVH;RryAWokg%lSCcEfi
z|Lk?IrU##Y>|)h>^q676NB6Af77AN7Xg#0D_GX@?>5HJ#s<P3RS&tt56RCavD8IW-
zfAe0$8q1HiUw^I1IG2;!FO;sZ{N|0$CC6=krhK`T{cOE}pJ{c+*Ygr5dG1@k<=b@Z
zKST9`t~3<`h38LCd|4CA|1fWP&1&7X7hJ*v<-UbWe?FF?W!6yrj-lN4^^5gfHM|#e
z61$Ju3$06T({2)f%UQ^?i8G+6nEh6YhLxnmisvlXLu3@o3a@NgQyIFx`^~(w3oquV
zOcQ10+LzeDJi*~7V_t=Y#PO&;UGszD*Ct0FeRzKJxgI{9D;+hP52~v2o+~^xaq@Z5
zZ{h8G41Zfx)SuUXbZpYEXGSZ9)6+iP^xbUY!}ljQN#ub{Lt)pK{|s%{<9Xh^nI5wH
zLrc_?)e61ubWPKD8j4v2ee_!KV(&RdnUXc?9iA^N0(0f%EBGIr?^$QI|FDJ4(uwsI
zYE7|kuQaUP;X40xf7CDM!}gn|AIW@^o3p31G&_@T!H+iXj+SsEL(3H3Ns6bQTS#yI
zb^V3^;ko&T1>-%JypR%^E@ag19kB7dh;N^>N}{Sp_2m6>Q@_sZd~B=l{NW8Rd&5@U
zw9h<g8#Zm}U3AjkX#c#BoCgg7CBF}t7K9u-A1!<3!)fQw-w*8n;5(mf>BgIhg{8vs
zCc3Y44jwN*EqdVC-HXp(WxtaL9S~}>`0CqS-L3K5HZT6TT-TT`Heb*0#XIpQ0Sy0a
zTP8N_Jh1M%(~rL&S9!ck{!#y7Ysu@}HBRmZ;$m->Kh+jl;KpWoOVT;H$z#31kN%IF
zzx~=AaBJ$<rAtyz-qbnEGI5z_{1l<SiYK4@s~&yZny&lrTZyTJZvV<s`5XEV>sz)Q
zF1K5|_@>p${EhdR%jMiE?#fTqdcH&Pz?VmRo<9<A2VKv`7-j!QX&3(=l?4h$TX%LG
z7YvaMWZqM3C|k5qz<NUV=ln<VZ&^PsQlIfBc9!<cJOQ`7oHzH*-VpLXTenO#$?)8l
z<X71TqmN(Pb!;<lU)TBcRehW9Gq0F*Q$k_=nI+$pjO?{8nPjV$eKA}aCG;a~`DLm1
z$Ir9gi#xyYNAcm@6sKu!EoUY-d9vEfOv>Rio_=fJyse+h`}9nA&))5JagTfYvhzm!
zgoAffN4}l%$yju^$D};vrbw$VZ@ug8Z>e2-<|6lw_iw*VwvIV1vaO}QWJ#f9!*N!Z
zgg(pnF}9a$jCOJ_J$KzKyzFS$&n+H@Zwu7rXx)7}g`xiGthsv{&->j92*3Z;BHQzJ
zu<(&-8(f!2@0VJ$Ywel7mEYFuL{vIo%~MF5c({bgd49atXOsU7EkVzoF8WcFw0UQN
z_&KxpwPxQebiUu;Q_5raGQq$)d}BqxjgzZme$+o)dOJ?}`MH)D+as@q3#V<_c~jCB
zR8SS|TGHa2nY;dFxtLDGsyjA|jx74mz^x*AK%p$-nE%$YgEJ3mXH~r0ys%=^w|fz$
zD;DnEzEy{N&;DEbN-0I#UU0gecQTuN<+11)Z}H~0_fPeG3g6NzU_aGxbMx6(2QN8m
z9}(%vHDW#<^({92V7mX#Pr0S1I};pOQUh~mFfD8}=YFQ=R^+wfc@J}_DR-`S(AKv5
zM{fB<&2rqCuy59l*xiQ5IZMh@9&bDx*5})@F!@O8W~&*!HrBGsR_62USLmGf@shiW
zR<owM`a%tl_Y;i!$^$+;+r09XQE$MV%*)yWuM4$eG_5@tqTkgnsNZz*$Mr4QVZWx{
z?OD4-n05d3&nmAb|7<gRFjdk}<N2KR7p`Bc-~9fK>!bOdv%D(yKQ>!k{@^_85oYI=
z%Vw!<-Qgp|6~i{eq05ikYnAkNpAc_BsjN2z3pK5kKPMml&%nK>{G;-bZTC1YESMiO
z>#c~1RPG`JuJ-l`K9^2zoh{w<!Pd3jv3|q%H`2c~{^**?+3w%B<C;xnqKaMWvBl{U
zn=UOsnBK)L>t#Qg;qlod6^1{34c9NsXRm)SbCzHKhkYFXWGa6DuJ^p^d{1p<wd#uM
zC1r<NCY=;h?=!I3@t>g}V#Q&@oQ+RP?SH8Hws(Aaz5j>D*1xriZRw})-H~oRG<lPE
z=B%*Pj>(@E{j7GEi&$?g-1~f&--$0PF7%Y!NAHndQxP3@C2x=UW5I`O(@w69-Sb!T
z{`skmOdiiR%<z=3u&FE;dS}BTc{ct>srs9Xiz+6T>~G`!+g!7$y;dXU{L;?wiCedv
zUfRo{zV1Zh`(67bY%KpXu<ZD8dFiXL?fV#hOfKb{;FR0+DPrA)Z+E2^xHHS%ozJ|s
zw)esL#{Ue`f3zP4FRqEYyj5QC_RDoV#xHr<){5wI=k+~s)CmO5aW)H`IPhtW)qJsn
z@{4!g&5A!$*Hbb3SiM+{*5xdz)OoXO(-mtcIF|mMTP3(NguCQ@zVZC`l^dB~Xdl_9
zT@(Cw+8)h(_P%|V6>a|9_s_E=F5A9q9`}lK3=zxc-3!iJv*hj1O)Y(#GS^#v+<)LZ
zIcr+g+UG}fvkz_G?y>prEX~C;Q+O66u37h)NoIolsl#j!CKP3#+NW?*|M2{__p4u7
zsl=II>pikiy+hWFbM1{uyVtH$n;Ls)j%C@WCpHTL4@~#XEw)P)E#7hcKSQ>ElT>=U
z%7uTDS?eFwriJNdSFY-KH*;~}goSUCOB3e2O>HlHccka~k$S;}KkPsDA35&zcYzI`
z+VrsAx9?0>tZ%)$g;(mGW6_43{oTvoU3~i?qJeAU$v<^JK0m(SmwvQrU+;tSOfUDb
z`j#o^9lyEnoO+kQxt`6pZOZJ`^%$L-JZ~LosJEzpsP%E{ycMrYSMNPjxI##}?Y9e~
zcRfqsn*!TYb&~6&+G3ur{m&3QE24Fi``hQ;b-Mo!)ialR?$P|v{D^N&{@WCz(+h7o
z@~xLEmpu{n!Lyigf@bL1GhY0Po@_hUOV!=pCvr7!{X3KR)+axTZWrwKbqr&dzQMc6
z^w4QJXN}nVnLKCzXkXgraiu<c|IK5yeENK^|1<Efv58{fdmgmOd%M$ug#Im71`2;p
zT|8p=`e?D#`M2I5)Wh0+FPrSuiq*UC7ShFS#$DmWrn7PB+&jjaJwk<B7XD|*Z(w`P
zZk;t#Z%u6fmHMXr^7~WXcT}aW@7@~u)t)UnGc}>_t^T{5FxCl7HJu4lCkpy&1%<?X
zv)vzSCtP=-s=wjO?ziCwe!c$VxTWIEt(sq3CMzHKsnr&}q%UH*sz2+~6SC53`<3cb
z<!`$`Sl;?J_t}r>dQ<JXOSAX5=Po**STQ-VW=BfvwO3ak9n3v1$-A3Dk5hT=)&C3+
zR@iUwZ`hNXTlvtxC48UIm7I5C^=~!as%`IjINdtReRDF)igLr77A*2J7CqYY>WXT$
z%DGiBYa{<N%=~q9{lA;_5)UuFDc#?-k7;kVL`p>8!X@WyX0$wU<L10%s@eRxGT8I@
zhk07l)-L>a<d)y6YqO>wDO{BGy?W1TU;Uu4pcKgi-Var0PoDF@ZMnpG_W3<~cz?&c
z{&vdteU#t!Pp#?JJtvWMYg6>sCIp{!nRH?8ovb^&XHs6zN!mAmi$7z<{sXi3)Iazg
z8yvD@;-!c!>C@h9dVj=-A-Ty}?vAmWlYx5PGiK9si#2{myz<P<<zMkdR_fNZ(|+52
zc;_#Vy`OW_WLFboaj^meC(pHy-ZGIgb2sL&GbDs<sz{FdXu9Q=c~6bTKjA*v?Z;l+
zQxWUk{<r$juauSg^NL~?bDR(UT%>*ApHPj!huYqC3m@jUiHG0g%q=R-o~^OSES%G#
zM`PM8=_^wuyPgQyTsdL$eSPZ2ACA8rY7F;u{f^w<eO#(0P09TBe}*IXL{+E!tn=LN
zCSBloqu}teI}>Nm-aF&Tq)SiVbI1I#xvI8((}(u{^?O1^XaD=p;AKAToW$Hyd-mOa
z(N`O}J@@6Es2v|$rwH#6yqU3T#Zjk?JIWYj61H3SuY7-P@+18t{w?$5uc&<3e{_BO
z_m`>4t8TrHx;J0-=;UqY^=n)+A5Ao#dqCsC)EcJjr#tsQSigUReY<KtKmRTMhkti$
zP`iIh_()l0yxRR)PIWQKlYEn<_a-?tS1bR&_~STeHG_WLeX*jL`+wp-xc||P<+~&r
zJ-0Y)lJtwkWr}Wzm-O_Om$3AnxfjGE6vH^{ui+2R{|sy|Us^41SKR-j|Kp)&?;aIx
zc2sXG@lf1a6x>pFW!WC1qkaC<xAq5i{hMkd`8YcJgsv&Skj|~N?JJ@x-!8x7v*B)=
z+u`ZWdSweAY<d^(rqFYI-48C`q;J=c$O&E7-($M!_93M<Ycunzl8sL$sb0R3<0sK?
zq%?`IF7eWymCs9O*)4x{<=vz(d(nN8^#^zTXV?@rbxHUB-g^ok-TO>A&(D5xGoF{p
z;zM16;%37$7Z{4qocZxe`wc(qe};n^{}~?4_@!bPUs3*0ytP#0t)95}^?>uM?rfP@
z65ZWio}Q}wR9EeSgRN`r`SSG@v+f_ueV8v&QS^yhx`B7yqDiV(x15@pAX&cnz;l+j
zleH>-em+_?t$*=raqcJQ#b!TwW2k@g;m?UrPO_L}iTTKRSV}%$xK3;4(#qAvQbk3(
z@0~yKd9Sp`mJd@`zldYJq93c=XR_tOdsS}_hqx$<b&s9O-u~WrqP+0?#wf9<ryH)^
zkDTs1-|Nb{xo_ubU+FVXXpmjS)3dq9oL92+_BrFDsTIc`<+Xo^_r0{{pZVS+Ne^q5
zUDMThr*!$AD;KxlIXP~pCl7->xxPyON?(1YbglRiDa*_EE?th=Sn8?JR<v2<fyk%1
zY|4pOL>}MXTXb~$s&ci!Z7)9mtv-A`%64zx+=pk2^toeRp15>8JwIpC%gM*yojdgG
z!WtK|XDXh|%hlf*{LI{E@bSclBTbKgYyA%1zROj+o_)IP#sZ^P%L_6p9}9~}9zPpn
zwt2yifA0gj4j;JH+I?fk@f&&EuJt)03Hxt}&hcVb=do)kS<iD-{^9qwt;=(r<M#e8
z&hze0o0cfOlF_pwFM=(|ugEd%t=}B|B}}=x=Zmh?sr`|WQ|><cPieY;-?w{e4KYhP
zN-eHVXJwiAKC<ljlAZ^G$1T<y=lAULiK>0Ka$(l=c@|v;Vj6FCA8)=gmGjv3&vF(^
zLM2c3vpf)JxqdES{XtpdkUh-@!_0o^Ew%~bj%YT1$zM44;1dtF*OfB8OIE$LJgMU#
zdOq`>#kLPucSYZSF|AG}qVV^7Td@mgiXs=6MVxx_pJC(VA0PK*-d;NYf%D|O*H-+R
z?)7)YnwsK8^=ZBj<F{n`Pn~o>uqk^9n^9n6SH5PDgX8la!K1}e*N^cF>dj1FTx0T)
zb$a{bEv)kHSDx7?&yD=&Dqc8k*S5*o2`2MODj0H@S!zB%_TJC_<C1mo<I^|2Z*Q1%
zt=clZcX7J3XJ?4khQ||6JXYJ2|46L$0k8gH?X`FAd9S~5^Vt2IY=6zXDKayq-<;iE
zc<|@O&vIqWm$vuGn(dPKop1cMUgF=4dX9erS^5vxOJz^GT`=+Xmd}-Cn?9IJ<UP$)
zNu0N!_qe>)#2DG>Zx?@<_U+U6kPm(H%d=PAbJpFlcU$K3&3Aqr`7Tu~UGZFD#leIg
zMtgI0`{|k=>%WEk$gky=4K!8plnTH6r1Rz@`^qpAkCW^y2C8lxl4=`F`)}`maJ2W$
zwRrxm+Ow^-?;fkJ4HEeF(tt(N)9tfd@!WMzRV+5)B?Up#I?bP@>$oIu{B`!>`&;iH
z_4dtH{^OEsrJ;DrvwE?~>iiPUTRdff$4x#O{ywwJ{f6=9Iccl1<hS)Vtoia|Yj1t%
z{J`JbV%w&_Rl0oA^5=xgzI#dXkGet%{6DlElyCfJ`ggnX#r*KV?VZ!y?P7{=%(wNs
z`ex#$W#{II9ABxnFMs~Gb~(kp6Ygb95B4m$ow|4G<36WX7R7?O%axa(o?xL<*!6bl
zWUuJ8eE#cI-qm{s{%1HCV8?gk<@~hGTej@ZD7bvS(puS5Gs&2DA4@7*@kGM|&zX0x
z{m<}Vtyr9oaqV)~wnOF`6VEtmz6yL8KFN&PLd(Hc`{&}z=a2G>`kT&g*Gt^d8?Lu<
z!#NIlgH){r2@@|Q%gnPd{bT(wyZiR<X|-XW?tP5WJ(wN2l*eCM#idt-@w|?Q?2eb4
zPb|DT<+Hx>FV=nk8Jaf!JO6&|+P`hvSKXSlG-a#VrN8qsrz>!*%WJmDJ|{83xm4oW
zp8A;o3{5-#IA6AL(cLHiBgo_7E@`EGzn$+LReIj^v?ZgVoYlj2^{0F156%<3__lZN
z`I~RIO4j9WJ}Lb!vGHls({JyN-<3G{XnVd5|Kobzn}1ga%+yIZ)vtT=ol??&hEmU;
zNi1KiJ^#E|KIKBw=G$k2j(fhUo0Cz$J#Ox!)781kkN9@xKUm$iv${2wHz|BtIZtZk
zo3)|S68!HS=Bwp5{o)Q93VnUh`Ovj}Dwj>I`(@YooUHw3adfl83Xkwvm(tC5M-=Vf
zT~IjZvE-kSOZ()1#K&CIb-mkrZ|aHz51VhVnI1O#&Zd8VT&HihynFrWu_AZ2UBMr!
zkJ@owue-k_CUVJyV^P+txo5IZyOB6|!RD1({$Y~LYh6Cwvj6n<#?%?!Z?ozh?4<tg
zDXEuUy5!fq{%qUcDV?S1whwMU^_j1st+HmeN`Sw$r%V&S^Umzw(LeM~2lu@W_|c!E
z^X^IhoopucX=W!+-HyAhWA-U!s%vD3+|0b4|El%=DZKoZbKL(&>&nBACD%H6w0Yb*
z_v(H_;dA$0ZZZEEstlrcz7P3#d{Oo;rL29@(~kWPRXu&<uDj0WW1EB=dVJL`G2G(j
zIQNOI>~qZKlaJ>9XHfdL@8(~Q*Yex%%}$Z_-*zECcb!Cn?isI*=Vm<Zy7_aXm*MgI
z7Vodmx4!((?&j-h*Q3IwX4L59#hi;fs(Vds?vKw>7dt1GGgyT6Pw<cWqjB+1?c=*#
z%(*LX%~;esJ$2bKo7G`?MZUZCWM3$3mHA}*x6Hqz%5GtDe(B%!YOU5Q%(>IneLEuH
zckP^t&%B-!r~951hX(6Btv$|@*Z%U_>W@bMKKo31AG34Em9>g|KHpX(HAWf~tIxXR
zx8%v=Ct8*Vzy2(LB!5hnKV<WK_se>@*FsJmx7oJVWW!3veUYhCgboz3o!$AQr!Zcr
zV)D^A^-H3r8TR$et)KGVF3ViXRT<l6wD|RvgvYY4Ic*Xj)k~iK78~ulbDm_M%C1kB
zt|hE0n-uDB|D1tG%zp;XwJQ@%c8h!rzwvJQ^+(rAb}Za-^}W76lLvQJk7CaTdySNy
z<9v_jPe0|uz@eqR_;Q^_^pCP&ww;-*M=z~ZKGi6sv*PCzkK@WV51Ke_E!P{{vzOZ1
zy^HmdOx@jLKl@3mra=tvncJUYzQ|gI{;rp}^HO70#)kQUX*yC@*3aL}o^fY)z_J2^
zkoB@3!@p*n_SnqnyEd=ZapAu!6QW$7zKrs{yIY)9Wyg_Mt2awnZ`;gdaWbjWwlMbY
z@wdJoV;A?lxNtI```>2+9k1Q}%2k{8JwEQlFTea~**)D2S1!F`<bEOCsw-oz)zA0w
zQ-h0SD)XIm_G^o-eCZdBynXc1?6+ajQ#<V<*DSiVV)2i_4W2UP&t+XhHW=R6zjnUI
zkLi!*Ev&cBo~K#)_T9VA&ri0Le|mEF`d`^6Hx@6n3p>B?Y<fh+#jkspyG?(~#?z{G
z#KY`UQ8S<AJ5Kqx;pZk*ta~2Nq;8e|ZP}yHB{8ctRD}Gzjvd)v+*HN&GUx5GJv)Mz
zta4R;cc<r&(#{7;?m`=N=lSu=p7YD}<`!8qVej7Wb{9YVz2B~{U@oUO|MaX>=V#kb
z8mLch*IF|180X!W&G+x@5&fwDu)pomjtx7n%?`=e@yyLOVd8EtoYSnSE&28&hyQ-Z
z4|ekx{<t5!W7^>(j9zvE)0{<G3!920b{>~xDe{kckyFR?>U-INo6%>B*0gT-IpVon
zu0^NTTI})bn7m29eeU1(x~0p%p{DeAXho2B;IdcqM7PiIU`yP+{qxk=DpsyLa~`us
z%YHD7QGNb)>iVorOJ@1JUFa@V$#gNmGwszX#-J9RR~2vG|0r2MH~){Yc~eAm)^yE$
zg?2laPq|J@z6h@SJU=Gk`#J5NU6=nDT|0j6O3n13nA#~~f%6O2RDD$ue(QATa^4ef
zVbu%2*}i{k`Z!}(tefO5mjaucYmXi6XXe^@cn)9Hid+19i-rGqUU|PX`z_xgi(C17
zK0GM$zn{XO_ObD#<NT<f*8Uf_N=t8E^-{dIY`&IT(%czsIq!5t1S*c7-dfn?$6D(4
zJz&Sg98>L;X>-)iKlMnKc3|y4!8M2Z%KB}NYvbgkCu)6qQ}y-bNA)hf3GuIz0uI#l
zDm!_`NpzeKzAj-i@6b-`*>Bk%%=Y%~c&Dd3`?Qj$v4Sj@khjH?au&XMS0DdVxxQtu
z)bY2|t_OSU-qw*a<5=kQIXU{5|1L1Hx;`uVPvXbgxo0L$>C8Po?eKRdSB4&;a}PE!
zuMhAqjul*V>%#e4uZv$++W7vRX?1d8)bXrWvu~W)muENWsTt#SX%D+Yd+rB)Tz=F$
zx-+Rg&^hHsB#)k+kkes>U5^uOPcSni6y84n_~Y4q3#<RGuC}s0a`<$crP8E_95xN}
z0?KZAsLUz+5&GBr(ciwwQqfzCPH&!iLsUu6ufTYk=E+-p#xI=?zh0$zH9xKRdYs<X
zueS?!P2IGH>pz3(5p5N%8$UfudmCz=7X)!J6*u3WWAJj>)rBAS=%wgzhH1(?E$&MT
z5^P`b)8e>H(#jvxAF*v+;gM)%VsFX&EZSM+l5+Zl7oJXqcLe*~wA-((ukrpnXOrZ@
ziuU)x=XGTo8W?|y8F?zCH!-|ETIS3*>B7vb`<|W7x~C~V@m6-2*tBog{<L;H%js*d
zU^4r9;{3He=cD$2C|kcmR_<}gu06YEIsa=fwJ@A?<ljp{hA{49=9c+c2ljrn-TNg?
zx9-iIThq==d$TaPOy&Wr%J00#^1X$VD<<9co|I`)tzG#jaMFg=t+98v9WpSSx4ZMa
z>6Q$OnU>qW*iN$Vt{3^k%6WN@k^Y*uKDoJ@(gkmCNomWtI{&$b0iQ6d$AJWQ8Rj3e
z&u-DK*SRHn_zd&OwD&5hRZnfsE|!0v$MEFI_s?hD>P2*4Y`F53yVlM$VX1QKyKha#
z6IGTv$QFsD-?^6G@uo&;T4#2-`RtMt9I5v{%FHX|5|d24vh7W{OQzaa<y$9Z%Nid?
zujhP~e&kop<~Z)MLgm}%QtsIA);d;Zkn{IiO!0yB_1k`|Eqt_B>$<B{>bFkWZq8}G
zRxe9_Pp!23yd`io=Q)1Q2@KYKTR*o=UG-zP|EBD}*3R3T?j}aEOx#njCTo7_lituJ
zug@`Uv_0@LHmx&xVa37!4BPbInY`4G)_$I8mtrh-Lizgwro#ENOKP6aTHe~TT{krB
z#xMQA9~(b1dt97#+5OsA+q$P|A=?@sv>nUW-1+xQo4b2Ll|g|20?{)+l5F!Iu`M`!
zEbx?m$@j>V%Uh+*<{q>1l-Z>D_j=4!>w4$7`XxWKUeyaZ*ci&rTWw?{sk>GCn34V2
zX}8s+RL}bu@ys)4JX`B;wr&=C%cAy2bKIRSZ&m%RGR<o0lR9Vl$DLy4b7S2T8rCmg
zny4~)6USb@T)onK9@}fH7gel#?Uu<uE9d<s+hE`6b9eShG@WIXFUi$uUdOrSy>#6r
ztNU%TOFmqAyV6s|E9%+FNfwUIb9>fA<xhEBv?pUpnX;+b<i&O8?+IL4F#qtcX{$w>
z7teg7`@HGV#h%4^LfTtCiyS=|*0JilM)vdQyK<MFA2pX#n(Wl|aiPw|*qgC?Z@bDB
z%uCVRV3ICh+fwa$ep^wm_PeH1vF8)A{xgW_mfrRH#Cq9ecJ^71*=@0M2N&&3cVa$u
zdiQBQZ{GJ?Me<~ggI;d4`f@5SX@9Fw&LsWM&(vjGTpRO~3bN~ueY~;yaQ2#?x>E0N
zO*$cXXyZZa5TTpLIF)6>ZPw>*KYi)_vxXI18{hUi%hbL%Se+yJc;jQ+k8v$Z+q(>k
z^21VeZ>P>bvQD*!X^C`6pYc3K8$<if<2Kh)e$}_EdzX9NdwT>=h4dMxPd8_L-g#s}
ztL#2E2CmE7W=C9JR9!vMz%$Z|Svs~oXVU8a*~~i+z0EUzf9Y1H{u=*h70WokTsqEF
za$}X_%Z}n_h5t@9Y)yD{hS&dh)+^0554+BJByyQKJuP4FfA`?r9kL&)O4xRkT`oCY
zxp{T_rjmmNkqh`{zHl?Bossfwef8yiqOq@T=jkk)9wB&qU!ss_j-YMy(@Higp@r^y
zYxzIie>nfhe+Jp(Ec>J`<*wIFIup30K~l`)<4(c-m1cirgq#y*9jZ80SoO+2(K@Fl
z@F73r%kQ&h?)osx{MPL1+C_!RW`-xDw;xU^d41wRvgkF(2j^vPM;}jI=hn%+GGFgm
z`s}A^me$EhjCo7mv9<>vty>!T@5DZ%OK%rkTl@5iiRG*m{p=OdCkq8wCY5dQeP+YA
zG<;6@g3}M@@;}_SJG=PNU!~u{m*#qHeH^hm^QOwmu#6*{8Tfrq?D+M`a$dq3Q`c=Z
z;t%X^${&dr+OxyPRQC5tC9SPX`(6s(Y;*QH$k}Ur;OF)AD&aTgGwy#d`@Trt9`F1Q
zzmJDWU2mBk7(T)J=GwQjJ1*>#d+K{>^)@3Bxw@AMv;H>yP=6?9&&xOWgXtR+%TmtP
zC+5?>y)VsCp75^p)AOmFX^Bk-g!bQ+&3={NdMo{SwY@;hi+a&_I*MDGuC81AHP$-d
z<})MtnZ8TbO5dIuykk=Dfdi7y_N@9j)zey+-$_Jaaqaoj67~-!7XH|F%GccCTJn|r
z+`Er==!<v@iT=LmGtqa4;Bi(q_Q2S_&i@Q7moMyN%P6aww)~;z)|K}}f7iZmQ|S7X
z!KEj8&r;RXugJsWaRR$ff%dI^3O_D?%bOm$=gK|_rKs!+)7b+rzE8inUS(>hn!k$E
z2EUf4eJ}py2W6k!Qx4kj^W$iG$~@s8h4qUol7m0nOfFw_+w@7^e}+OIBV}i%eeR4`
zeqZz38mTQ>mAUw(KF5ECgO>jp((F5}WRKo&e!9Ck(4%$BrubWDS?})Iv|yUiui7IX
zqT38gPfa-GcyitChvIMgAKN$Fy1KmO>q{HeNB;b=ULQSIwEjDD_3iXb&3)o(+C4i$
z)1<wc=g1`Om$vc#o%o;Opo`x7t@C+*%s+CgZTYhMmD$BY$5S&iUZ2pqd^`H~sg7`F
zZoN-?1l-x@fB4VvR()MX+PQnzovy#Pv94BG%X&oYwB7n;y*E$(yeeDQefdh)`qkH8
z{CiN*@jBQ4_WaH&`!~9Uk0kfVf7Cl>s~ohgtWke)-+NzOquwJ2>z^KHIZ`68$u1+L
zeX35i{-D!7wm+(uw$wBIvHTdiZEg87{hNCC1I^8gd=%vsD|3QOBc)gGZa-ZjadQ31
z)BhQ|{xis%_FIQs+~aHCm9xaHt-3PLeagotr5jQ>8Uz?DKeIdBnf3F#%g24qx=WAE
zFI?i(tan~*lGM#JJ#~qnC-vOkd@$wq?O6c_tgFvG+2gl*s{CsC4|nHFJ@bAYQL;K^
z^G>;v;7lW7nT^{j=BmDU{`&^YH_7#FbqfEk=s#Y`Rq-@+<E`g4W~@ug!zBMcI=?-e
zxw-ZAb%{rN);oSE>)WS2@Au(*>RSZ-b0&Lj@;F($=kJY~21mOZua}>mSM_XN^dHY{
zANF3{{xQDo_L1-jcUDK8T<Iw#v90z{o65u`cdz6X6druX_NqmB)BXo1N@w5smd|6?
zmm<~Pnz#14-|m(ZpW@?Ae_P(^e=d3B1Xr0Jeu>yK{-@8Ty%IOu)l(St(n@dn@=URt
zy<4THZ@cj4Ql;JmufGg0cRI`GT%TIed`xQk(YOA;gT1e$UVb;rwDZ9{i>2*PRo-^J
zGMr+m&M;M$&9>$mXpCHU>yGKpGZU`r=H6Lgwdd7E-jydh_Whhbx%cJC<EJ<*#ifF>
zgKZ^Wmdz9Y(EGjT+4U{+WsXd`wMZxJhJ<>h@%Orm+DkXyVY5_`DY6cCU-#<Qmy1!+
z755Jbz1nyzcHtG%r0u~cCI3Cy=G8d0-NKTkEKmEuvRcKp_y5X0;`R*SRBr9LAhhS{
zOs5#5<tjCM`Z&M7_@n#yzEqU{jXj)YyXKvA`a9c4@UDiUyO6uS2E)G(557yR6?)gR
zT6LGL(=Cb8)uor;=?A-S>M>Sbz3Onz8pBVl-KQozk$Kuy``Nci`Y)S6(w^*YC!cwt
zi<X}8Sx~bxvwQNylLuJjt3I!lKV~&`%Y~?{>Gn4--8GpsQTp$qQmq@jDrxpQ@0k^J
z+Mi0;%;B4qxs}&XJ5%-gyl=VB&$#%%`EtPKf$(&@mhH^Tv#Q@EXN%<7#6Bo#{_VQu
zx3u+S1<vO)^*C=H6T5jsYw|0RFE&+QtBfnwyga$~N6|I!iyBj>>OS>m@_w+=;OutI
zgU7BM&%Js&+fMt!m+Wh0mrlp-JAdCXOX}&Bvd@ck$~L|z+W9`xAk+NU*RA)~3jRC2
zztX64#k!YfV$ajg{;oL5-1hZ&y1mll(8Vv_H`sI6iT?5an2>)<{^%|9rY}3xd>@$n
zXUN}?@bgnbuQF58;iqZL48lE+_AgxjBQu`IzJ+)CoBI#`MhAWP&(QvsMKfP)=8Bhk
zujNlAH!k1m?HSCxWO7q2Z@uoWvh|PVbKN?>Dr@`YYyp;(NoL;Vn`5@~bU!^^EHjhg
zosized2_SZb$>hZWAdV#&JTI*kJ>3-a$0|;<n;7?WjaNTk9R~y3d^vDNxXjH&Zo?;
z)p<MlLa)d1;&1Lp?d9tXYTQ4pxfkA~vxoWNU%e+D!4X&UORP_tJw3eo=HH1zN|k9w
zR`1Rw=WV@R!Ts(2hx-j{r-yyaKT>NP)Vt=p*;KXVyniNmaol|J%3$fvS-Lw9Oj9^A
z!CUZXz2!gUkM(_fJmtR~z5DSa??csDuY=|#>Nv<~R;24IZMSwfep&SBt%@c0<7y|p
z%J4m)v-|Cg=xxs>R3yzcA1g1gT(fxkYL(vSo!wy@e=~oq|HsY!vF&)M{)2d~Oe_0a
z@n*C7mMspP_~`DZJq3rKxUIUO>h}Hlijzkxc;EjKef@39$GRmY=LKWWuTebyu4Hw@
zmldHMl7F9kI<`cEW#Z1wbBg1qR;}+a(dUTo-*7g&us||Ad*`GNt&gP-lu6kBV7|8M
z$NS?^Vk?t{U+>bH7^ltpyY%hx37szj7wJ6>scKc-e9mIstIArHt?t@KtY6f7#Piu_
zoo^0)G2QC;k?h~v>ix|;Qg^Io6mFTUeB@N8(C6NTo%bhR2%lJ!|KsO}*@w-{ceywG
zNq@MX@oaToU;UP^0c|3^GM$P|j{-KXX5##G(|Ll`1nm#b5g*R?mCk3`djH#(OVO;q
zH$3xra^RfZ#m!Ycf>T*N-}h~O@Zy)%&sp{DCATx)O>^5Z>)x5w2I=ScB(}^EZZbZ<
zbLrnXbJiE07pT3w;*Zpi{>OiH|0J*flYD7U;9|9#4egP>##t-vEyLnxXB<>~%HFfC
zNc&lR=RUE&^Y=(rmM1RC-t^<pqY^E>oTfd2lN?XXQ*Q3tZ*#8l2~)*~==1#9k1D?M
zi@&@!El~5G>Yj?DCjyLjsm2>@XG!$x_qpb~ba}h!?wLuE%O^dIn8Nq$l3LJViQ7Bo
zJ1oy+UY31zd3$#GcbQQ2@&$MGJ|8s5n!j($6eqqPkLM-4J|3zfaW10pT!DYpFaE>z
zqBW+gGB3U4{P65lbX~;a)6aghrKZI0t`>;Cw#TSqPjPOc=&qO7zI`&5xShMNVDY>8
z7G}?MtYmu1UkAO2T9xrn$9s14OV<ne${JFSlr9yptl7b}^PkdB`GDfkyst{S>MP&K
zNnL-VR~jNGxW}J&(*||FwpX4-huP&q&!1S~@N>`B*XQ0`&wSL+TXE*@^6o#Ww%gV&
zTX{d9_3rD)-n$-+(S}|>9){=@9;;lj^z!<z(#<PtoG$0hcMF%8?z6qG;xS{>^huuf
zHJ0k{`l_2O*6z*nZ;X@aG=1L|r?vmGX@&6jg6L?yB@y;^u}6##+za!N{CTzEg~Ph)
zwS6bN{F4`N{PCE*<;#iu`pt5ZqAmq%4}5yuUtyv2>Q-usZIRnGiRTmJ3u~-FM-9|n
zz9+I}%k@2)nM<<7$_jo4IaU|iZO%(&t=YNn;_sEyGg!;EY~r8&o;iO0xA_A5EPqUP
z&3OAqJ?WFuq|d%04O5;=Y>$kMmUR?j;O9NKUh~8Kwm-Tn<Gk&Aze;YI{qn=Qw(D;U
zSH9w$!!SFdz%l0+-`AcOE2TBPH2(U2EdL|+`P+x~*ncN>U-|N$=QKC(wq3GwmmU!i
z@MF?>lo|4|iLLn8^)vNC`yVW>-)4V2*Zbu5kJr{dd{%JYbYFMLFWoISEk4IxlZ-sm
zW0Ay@Rn-za=g)kVee6G?D?a|v4!%^nQeukOMVIU5h9?*gd`?tZUSs^>_{*5<U8QS_
zkFtvYmO7-yy*G8IUCr*32XBhqxXo;7Sx~FdC&azb_{h2MomYRHx_*3~VWNHC*16tC
zxVhgYRu|ixT5dgc=JLuJyXHBb`gmFN=-&D5fv0LGvhi7||7Q@7y2tw?ckQ3xX}R17
z-j+Yg{vGgEcWtxzq!#|!HTnu#t8Am^&8=AP;eTWQw^bZ0_1w=(kMrcNy)yAt=(=W}
zUjiKOv_oBO8<XU3mD&Hl^lzJu?~)4kV~aTcDMT(k(iL*BknKg<mQo8(#nO61``ZVl
zH#Sc^T5M3U{n$S7O;_^&1QuuiZB7;1V)b_Ql<vF_>n0y^G&nskwCLjo)^7gY@jMmr
z-}ZixZ!@(GdwsypI$!j~NuKY_F1uUvOgqx=ad>CXSrl`GQGxxiCbN!PcI$`Ze?-*}
z%v0O)@8-ql_e&xtWxEO0E;XF`>DhL!veddyMiZ)qEZ5KcW^_;E*RwC1tK?VgN?ZG|
zUh>7on^_M{=W4xlKCX~p-gZvKbMtQY<tGg47A=^SFYv?Jx9#$wl`AUNUAq=m-r}+G
z{u%}z6Q9SqH-ZcpOKbP7vHWxRVts~pZu#Nwiy!FCUtVDyv~NfBCcUH`xpvRlb0#jS
zo|r4=I4!-$sQGh_%I8=AB!BFGv^3jR`;nN5Y<+0>CzBiN7U^q8KQEbZZk?2i_GjJ&
zX7?i9I3#xEZoi=a+5J}kM|r=G>Fvw6UdheVD_Q*{W!kxC4BcAxr%rwQ&OLccQ=bI$
z%j5AA>I`da|1MhaQLXo}|IO7$GV_<an(p0uzU7ajgq7#U7M&tlz3LRt-1H8C7n3EE
zlg#EWXp4{Darw)C2AO-y|EOMPlfG?nAu_9M(xxnd9o9WXC+F*B{0(z(lzdewEBkEw
z%8aNs(;IsETQv8qP}+Y<O!EAU8@}5o=+xyX%-{8Jmhs87sIq^FPGvtzzuL)Mu`~D)
zeQdw@`+Ypw=G*7Ve00%$c02M_fwXq#H8aaeH<)K`a!yzl>2R8XL+yC~KUwvT$6fOB
zufvUEqS*v1vv@iuHo2d8Zei=m8(&><`p|s#KLNV^J!|9x%q~mjE}s;zUF^AZ^r_j3
zQ~N(EvU;4bTz`IT`9t>(JI248E+06(^7Sp&yL-Rh2{>MM`KP&E`mC-;mGATx_GhNb
zr+Fr`OZ2H8Sa(!4zv6k(whb44o)76desDsPq@L;RYK_k_pHE!8lg`Zjbmy^0?)Rh_
z9``NVC;nsN?~0f|wpXRywq05uofhP+>Furb{8|3QtJ|I{<jHH-ZT%MBZKwLfJZ#&n
z&w&^768AUjD$YFe?cE*TZ=YB1vN(A#jpOvirVUE_c&^uYFQ~YG<ohfcE7xw9hJU~A
zJu!Wu-h1SbbRqk)hsT-MR^5ooTpN1vc+l#-zve6bSpTi-N9!YRPsI;c`xZaAd+DU+
zq`UJh=El$6F+pB^&K%cIPv!_-+Gq07uJNPVx36E%R)<|#r+oi8d*wTQL#26=jA|CQ
z_pkW6{^H#D1E0*M>TOJ3b@y%*Czr&d(54*2Ti$IvZ|*us8x(lFj^Ug6;d0=m<m$bw
zYT0gK`PN2LQ`z55?47+k&#%@$>-&b!%URzkpIUkD?#+*9r)^*Vy6nS`;;^03UlraM
zdvsc;q*zY);Ad?p^Tl+D9sjz$lCuwH8pjGuuATO^=*;eIGr3Q<9>|aR7#|(|Vpd|C
zrj2My&brtJv5uyQsG!0LF9e&-C3T$oo`jocKCtiLUZ*zy@t%zCf|PvSvaLt@_B^aB
zcUW$DB9A?9>rJW7Y+0VKuPWKwx18LgTvhVc?bEeuzYJ<#Ygef3=$N<UF;~Oq3C_9S
zO<y=4jOQ<X>n=4}we@!Hjg2Rt9@pM(Z_+S#-kjul=7n8vzUs?X_<PN?(R{RHQbeNT
z=gmJS&to{P^tkBjsfOrVTi@3tKU(dpXMLVW#oQ{p_&<Z(>Aa2|2UN?B{@O14TJxOe
zT?OMW=i9BGH*FQ0cG{!woGatPJ$(0)7OHfLJ-pfHU))z~7`Mzcm#?08Q;o;G^WnOm
zm2Y;s-q1akQZV7@{GfuW()IS2_Y|+p+I~3umTJ$-=}n$$vy8-lG;7>hy77;Z=y8Vd
z<r!i1oL_JM?zMNB7d?Atg!RkKkM0=sFw~v54AbFM5Y<`UH&b$5rTLzQXW|d9H80H&
z+o$khjqt0JGONCeU5Z&4ubqEaNz`{~@#JYb_EHx<%s={{LCBT;#vl7dv(L&fO?vs!
z>ATq3`$i@QH+Zs_Nt7IvExsC+{r<sQKbK22#%eP)^|}@AJ+No(mW)uD$-wg@d7Xc?
z_SzdiZgJ|>Bqy0%V>XP-+$4T4LX`2%?2-f~x0gy&`3qkJm50q+xZHW^j=lST?AZA7
zVtha6nODo-m|y44O}pI@pp>0Z_dZ~g(i7pXho=4f70Vy$?fG!na?_0ie%D-s%y`WD
z4Ng8&X?XnfOtSj>+*MWU8}r}1zaJ&A^^PX9YoTsWoJW}QvwQ1OXGUx7H{Qg<e5$$Y
zosDk!>X*Ah!alrk`|Ufs`0wN}#)Ui)Y$=&uyl33PPo+yfUu#<W;Z?%{PaEmSueVsU
zoPB1jdv=enQhpA5rczk!k++8v3hZ92yZle|dPj+M+Lh(~{=a4NcUhnCKCvo(pK`yU
z-0?Do7nSQKeT!udo5t;}J)_37+-7&m_8mtyte3Fg7wS<^zz}q>@%NqLnDSnec*zRC
zN4F!czTfJ|;=SqKBhE#AS5lfcwpgEF`SMw&?d6HrhEu;VUHucs<+S0)x_{cwdjwTF
z)u%Ddk7Ul%vQBS~s48#SC-rKcQgl4)nps<3h_vrayCcGr6ILc@c&uy%OTXXO#p(6Q
ztKMIE|An*rglKfY*3I5!y_To#X9UVis%y6?o3h+v+j;eEY>oEnm%o;_F1YjgHs?CM
zkk<SO2V?`oEv#qmd^wLVcKWRg{C?*D#6PeI+<Gnc>1Ft3A=U6o$!)u97DXuC6$oH_
zea_P2nD&lKHsv3@uKkmK{qtSUUB~{~8J`nul9LywEKpw&rowmiGuzZh(fS-tyTaC%
zsx4CGO5Sia`5xQjp5rpE&m8z2CgrO4l&|+{cmGhg+`^7;LoI)b&eN^dZe8cx<SQyC
z2^;)zGrYrf^3YM&8()3Hk3IVC+V`K~@HeqrQ}icnFEiR0w95a?$8#$_vL4s+ka;pE
ze46{Z8prEfJs*7(`8NHR;{>;jE&?a!>z}!owNIWwz(BIF=kZ$KNBp8$QDO5ECq27%
zW(sR>OMFh^c9t#1yIiFn@EC-rF*nb8w&i|Tlz%s0o=NxY<DvJyi@la9Ix*M2@~OPG
z`h^GcTDr~#Rxin0x^Q{%hsTE|N7~GjX{zu&)Vu9FA4^S<S<QXTyxHX%c3-Q#KA3m@
zQC;O-xctVQo9?As<SpD~9JbjxNbavb@Jf8%%yp}Mwth@opI=mCbm0!mt+%{~eij{D
zWfxXIyW-ZK4{zF6uI*Ki-IFoxkoNCfzZ-eRtDQF8Zac<q^kmZB4(99oG`$u_89en4
z?*3@}GJM+U@<%)NH0|Hh`}PTo_VEL^W!fA2-)%Urz_s+@Un_30+~mUs>y~a1ww&fH
z>^dppKf~e`tVTr+cl`HPy)<3V{v-WJ(b`?z-rjfrGicp;Z}wcKp~qP?p-No3nkQWK
z(Qki=ig5qx)i=~HD{alGoNjzHpPgYskaNdU_VuSE9xqs{@UG?YxBkeB^%?rI83D8Z
zGl)3nOzRWVc(hMjW;f@9BQK%~4?fN^PH*BhdjHsM`lGjHvGyKU(l=yWjZ-VKuX<w{
zb9(C({ST8w<`pgI`cWSCWA{VZpz_Og3f`$E6E^s7&%AglHSorXnk@~j2M!*vNw>K^
z<;U^k@%&qQXZ5$}zN-n|!}NLP&DqNDD<{e}Xgp?QmSbdFWg)6tmU39&{O%gpkMYN?
zY(Cw1J-ysBd#Br7hqY(Q86NXY;Bh}@p*ZFH*#hx-`dhD=B<-3K{IX%Q`K^UV3bx1O
zyIW64|Gl)m>SwUe--R{awRvk7WUfxm6}xdn$V@?@M|NK(gZXdIAH|bHRX?8Fxw`Vy
zKiAgN`qR!leWzTocFt;#@XXhJ9+K}YYy}Qxt`uH-=KLzXlxtsR&JMg>%CfbosB6<L
zum22txGc)#wU*0P8#4D5$E;iXvF=)Q%IuimwwKyiJU;)O_F9EcRyi~@k5lnnRq^EG
zlQYeCotg0S`^J0jdHah}3%`|HDzq3pm^_bbPT$oV`fb<4cROZg<i3l}nV;QvN4dGl
z+;C#qhV#qqey$Et{C4!*sq>FtbHARsRhCI(-I9z*u2TzkZ^&86Z<ut>GQd3d+ZtQz
zBbQ!FJ&rn`zA1W<!KM?blP@Su+-mV;&YY_7?Jwk+{`iabp4+|hR&SC=+0V@7w|4I2
z`di4(Z1?b2%A<V~e}sPse#qXRbLz(u550%S=ch|?<gLByXW+H#tmHXPmHwRTrd}KR
zI_@Suxq4paLwrNrb+7r+Td(?*OE~F1PiCp^bL3UYR_U^Q(E8ZsW8CG37Bz~?y-k;Q
z?@=sW9&>P;`^4o|y)7FTvPishu1ud$QR;l<Ez{opfj=Z_Ox~~jp%rWOR;lCt)@w=?
zSAVjw><d%1keL>Iz4_Xn<j3+y=5tmQ-S*pXO-I+pym0N!W{q8QVqQK<C=(Iqo|;s=
zgNMo8QdYbBw%NH>w-e86imN|_anCIM&%l!%zRUDVV*qz_$2;XIrAMZ1s@%x){g&f#
z8>ye>kNSHqrEO1|6mwu=!*{7Fcfm-G=YM5y-k<-?QMPhj{1JQhI{7%0>G2;X-njYm
z%$ab%))vLx$I4Iq{JDFb;Twzf)*se4ZrLmL&vN-?-9Ij(|1#IUyZN-&@t|Eu3*(lr
zTK<>z%GgS4?>(nAEyeuS{Z{?lGi4jrEtvSp`M`S%`*+*59G~#;RUS>vyydreMQ7Nx
zN8TZ`d#7*gj4dkuw8iT;*Vohf+p;%)6x;Y9`t`zPcVD)Nw{AF<?~^N^;6BBBQvEJB
z_s<ubk4>A!)~wpz@@`$4(9YD)ks=S8ce31zHk1$iaeblNY-5|NYjkt+UHf+1o;q}-
z=AT2Kk;j1}>mnUrUeB%$+xxv~?E{ZF9<gpBS_|%;|9*{?VdCFU#&;US9{$*$zwD&R
zW#@v)E0`RMSQe}I@kN<G-VpQa(azWJWh+)k?)@D)VfSU-B^s%jDuPE9)bm(3s<z7-
zZV|pd>&4c4EBGECx^`_>+N8X-OZS*(yj#n-<+p(YpOH$sw!(46$z{bS;-*etogF78
zURV3AIbHkBY0r(5Vi+&Z5*El?GN(;$=X%pUzIi8G5AL6GSUGRv+T2T)!Rj`PjUP;X
z{FGgJ{eHt$KdKK#^=&R(yXSKJX|v;oCX;Nm!r7~C^C;~+Zj-$7fXcJfr#n5>_qBV<
zEv~s}A}7B;StMb~_FG1lPc$2At(e%VXFV4`VyAE+W!fdrWm|gNQu=Hp&MRB?)|VZ5
zJjqdcPPn6e%bw6e*<Cko`t$al%JZHU7ICri4%56HwhRYOzCJFY>~(36{UdqhBUOEi
zt&U&u-Ee!#$^Q(~k_(SnzH)du>!jY1I}3}~yo~a>pSyWa)3xw}&Jr^AVTscDC;u?W
zO*IkQXL3E+`>d&Sn7isEPc;D%+1o;*2jm(UUlfMv1s{r<d+$EW?JeOwXFtFEmgK0s
zzr27`eVw_P)r0WL<$vsc9JD&LZQHd^$5!or*127)aSnUO+{Y3>H}LW21O_g7yWx@r
zFVnrtM}9rJRk7{eaU;>*2|sUdXYAQ}IoHYXm9)j9efuufC*1BWyYIK}!<uPTpJJz#
zZ@r=~#nF`aGfY`(O=`PJr_tHhjm;-2>K{H`+R|VDm^<Yo%VRaoh}y}S!MhdKsahU)
zOJlyY@8yL*nX9~4-OiZDab36M*$pMv%d&Z1r#Gv_#A=;b`ZvU?@xX&;d+x+$>bJb?
z*Shg5`9b&_>krRPA1MFyC+0)Weg3z9ERCb@`r6${oXWNO?;`GPDcj9134ao^-r#X-
zdE@(8;(vtMzh&o^9Y1!D>!a+uxoMl7Z6^MlkaexxbFXLkomD4#FF%>M`})y+JRket
zx-ULnoVzyGyL|DJwTI3=y??ZX@tE(ro1xcbT9u!kXWtw8!Thc2hv|pq1=glqwh>(w
zbzh}T`szhhZ|O*$291;rbDyLn9aqWst9$h1(Vnh}Yc*r7f5}dH%Cc_z@AKEz#vf3B
zaKGc-bl(py|CBz|&U)kPe%Rd5aC=zbWWCv3ho2t5{*>p3%;uB_)pmP7eE(MeWA2AT
zH`gtg>~^VCwC(G%EkZBF6&rrq{0uoJ^6`|%`8hnzU4LG+KU)8m@o~kvt?OHEUH_Kl
z(DU(NYR2hWIpeKMCe@sre7Wd>eBQmuOMi$T+o!at+4t|#J>jKmj!oQpL@a!_>!D7D
zu#CkCpZJPDvnEuRpXc8^b={MF)w54|-Zb8O$tLo{_J{lS{c>CXF^sp~WtN)3!BvNR
zkMIjK?cCM!Q)n@t*=DWhlE?V!a(`_6?f&CH<o#?rnGgRNrUk~xZ;^O%XNLNjLV*yK
zIWjtZ3#z)l@8y25{=j{{&g=fWt&aYgxN=KVbO?`(=1-nW^YzSB<Y!K-lwiJo)TZ{a
z`H#wFr`5Z@XwSB7Had|Uy`oc{dwbDT>&{yR3muQI&G%KiRNvWiZMM9r{#*Z#(#PYZ
zxBMviCHt&5XOht8imJ#QF;m+(kBd_bo;+lp`pWC-$uIIfN&n10tnX6Z-F@=@x9*M4
z;@X`IpSUc}He{b9AvdRdopa2Orw{K7+;vs&Uz57gd&V`9DW|4ASk$9;+pKu*-eNw^
zH~dWds+$kY6Zp7qXSsaKpLEsF&W739tmSPlCKw%%ZgrDTc$^k3dYj8TQZ@BOv6tUB
z+wXBdnjb|=d#>42Ewby*Ox<sDi%gp`rdrzhO#3m>y-4=9tiyWM`N!?~_7tx>yzu4m
z-%9^n?{2!pwxe0%;gTKld-~NUc{jf9o7%bdkH<&#7Tw@OaTXV!?ArLupw#%=WW~G<
zoq~IgNjykk`(}C}(<;BECZA_*HS6;xIg!u8ZwqYqPHAnlzFZJ?fXkUJj^XvSZ7r3d
z_wOZK&YiRK!}p`LT>rA?+IhTP6ucvT?}MGK$I2#MIF^!k<4Biull$qWa?^bNAJs>0
zg>JFa5w2aO&Tso~QkcB)?*ogc{q%V9tCS&pc4m}+Z~a51{nHO$7u!{SBlfX*S;uuw
zEj>%!XD+SPkCT6;+k`JTocQp5$K@NbKPJ87&^I}7aqWR^1=EErZ=HK&DW==q^Y)2Q
z6@y{a?t9-&daAa#F0OEQ+Ir=k+7I_a&VAec?@P?sw@}Kgtkc}kB1cAsapHkT8`kVo
zte76$6Z!g<QTDdhjWSV<(P;s8AGtR!nb@ABc+Oq@^2YxREn)tAhe7FK`nAAQ$;KH^
z&U0@To>IE~FjIYpx!l*AH!6z#KC0d+`=@hh&6XD`De+sQ&-1QZU{n{N^EN6_(Y~Co
zv+wP!qgP%XmyPWgzfxmq-m!4!&L5`P)h5{z`I|kzmF(309-+Cjd`F7xHirT?=VYc8
zw<@Mp{JG10boSHB!ZUTBtG}Inh4IMs=!<p<-uxQ;KH=;787lO{(*K>ju9yFA<_y=I
zmvYlyOU<(@H`=|A;hDMr@?~M0ALmO{xK&%nmb-UpUf2@$=+)Krs`ZcTLJym45<BkZ
zcH+y?OtvS-?oOOu_|TraV)@~F?(NUb%r?HY^Zhlu<ng4M8`s}_DkxYWqT^?HZ~NN$
zN9s5>v>lGw(Zuc2;m*5e+JA-|>Bz#C8I|6gS_Pr$$E>9mi~h=*pPespo0sX`Go_3B
zHguQu?_NHoao=_6?>tH`JXrd)=C-%}iG6r`_gZ(SEALD*@4C+vn>YLIR6lNZaekfF
z9k-0Ra^?N9qN+Fj+m~Wh_2OJ@-ag4YlKK0Nm#3Y1;xgT+d$%da^0F_^JWJ9iPA^#8
zR~4qW_kp}v#mdK5w&*Gy4%!+PvVG?zm$FB)4}_K;pK2f<X4mrT?e-oUX}RUa_T4u2
ziMbW$7OHGd?|Wv(F5$7%GdcN~N5qB6&6BL$*JV`A@BDIkZDx3Jyz>r~<S6~+XQiKW
zB~Lu*7J81;$=2}J?E1^9m$z-#JihE!=Jd_c*|U0kw?3OIS+StW+3>TGoztb1_Sc`*
z?B4wL`Xo7-4{NUo-HVIn3{{!hGHK8B?9WV&9)4$ACY9$#S|#7xZM`=<^26Uh+K;~c
zyMOu7XVJ&Idv6)sc*%QZ@tN;Dl3ouIl0|#h{J4K`miAE&c9;D+D)(0={Z5widXyyV
zoUV1MrLnm$D<tKMzvHr{tGW3Fv%>^j7yiiDw^V%EeciREbObeG9+gg5KV?A)kNsV_
zt+}QrYn)k+w=dt)?Xz1l_FMG3)MFMCFS$7O6t~=+cut%7$c8@-&7rYbKT~(kvvBD9
z6j`&a&4!KjT8Vq;F-Zm|t~o1gKmBoh^q+y}$F5tIrjKUrJ=~i7%|gyHfI+;wv&Y?r
zN7Qka?d%ufo5Od`uUYwUt<$})TO-%2I<0Db*SaCea0|!uEDQO&Pc}SwwE1g)r*`hQ
z-I;Go)r)6J+=|u_s9fiEH8XOtD@!_yn6j<q*~)usAL=r@?aj@0>DAeH&MtMo>$GyC
zp1jPvpXb##Tc|Hhj;%O;tZ3$z`)@W@Oi-FB_3oq4RgvFz&*e^Sob#*eZg8yUtY=oe
z&cVBOU9Ne{_R!?z=Fi<T{#_AyGV$rp9MRbpuL>;Hmlg#5=z4VYOq|K&z$=L*0>`cg
zs!!fn^=I2D!=4AmOqC~-udU3SrL$|=jPtU8X4U@rlplK8<I~~}{+-(%SEoF;Zt5vv
z+S$FH*K<L|Jn7q~y?g!2EV?{P*{2omsM(!3ahlBse=cp8Nz$J0viEoVvD*~G&vIU6
z)5haBx4bqk<a>C5lYy&!j?nq*mTQ+^-IG@Ge%`4&b#M8eyUla*v~<onDj;~@$l!~}
z-!fmJM;v*2I`8&fR9eSjpI$L%{w}{iJaT?)ywMlG=*vXE{BYafTKDX+r@`h^Et%)8
zog%$cre_j+@jMOVO&*hdHhh@2a;bmzx>#S`Gri9}Sx?PoO%i`M<MF5D`X7SDeM=sM
z&wlwi;(W%plf_SNH#zBqJ#b-{Jbip~;c=Pg%#%FV$6b2!l~>I<^Reij4B4qRCqsOt
z87DaeEbK3CaZ{+eKH<l%dxvaO?o>qGd-aJuHFToLEv3eTY?e-witi|#)&8P)cJ*eX
z^IkifGN*BF%+&iZaTRC48_R>9&AI3O#O?mRZo6Lko?mU*cd53?nYk+3TQvEW%wv1n
z&1ht;%)2LS-pXZn?!`^tvp-`Y^Yb>2LmvK?Y+)xHFFejrzY=b_^3|rp3l2=%(5bL#
z!tT>$y*2mZec0-!db}x5HoeJlKYYbffA0zR@4S{%-kN=6R?;bt=C>NUj{_E$T}eGs
zz44FbIjdQduF3jE$gX?FD{%YwG)@cWD-*S*+~WAE+qZZ1?GpW_@Oic$OzJE?rY%o=
zcvtw0F8BR?+_Ja*UTpvOeu1TqaUU~JxcurGqaT$IxAeU~v`=r#)pZf}^Z(9^43In7
z8D`+jBlG9UR|(Nc>v@xsCCoRzyU$xE@BMM|;j(49k)`b0_49H{#djKfC~Qb(Q*2<A
z?A%=(zpPI5KSNXb?H}(CpSq{rW@~kIk*DG`?edC`JuIJZg}mZ8a8vSJb@<c&3~z2e
z+N*c^=;?*$pT1mMa&f_qdx|@Bcb`sY?d<GgI}x;8i$6~LYq;Bw=^wWroLryw!~UpL
zc-NW-9lN5kj(KbLmj%}5O>!`>WVp>=9H*wY<nk8(Ai*$$Kfb?Neq260VatA&J=H60
zIJs3ezVghj%;m`W&#<C|?P<AQ-Jb>PEKZ1il<(f3{<i*L)$j8kjh;t*RB{nH_HBA)
z61R{;!?6yLGOpUH$?+@gMeH;4`6{fcqvJcwwi}pUacsRm)jE2m`n%a30ZJ2ZPw;%j
zaI|LQqx~ILv1cw<>^@kh^5N+n1E)#Cg*L6z3l$W0@NSIQW|?4AHSf`iu-O;8z2}>$
zxBL@0Y-3zu?DmmIYTDdw;awU}HVg8-JNB?gkFB6COlJPl+T;(PA3bm1ClPs6zgv0t
z?hO;m|IXBzbSrboF@f2uO|?FL)$N$rAK<Wl4*%Qsg+CTamU#E-yxOdI<F|cf*1z4V
z$EStcI@<izKJj(F%<EsLJ+qCYe$*<RY}3_ycz1#jCr=OW%9GEZcH6%VPuH2(?~tXL
zRV)2C|MvEn>M7el)HmyzJiGMn)~j=$K3%g^?JD3?<;}BsaClvugPXssYt7Qq-@X;+
zem(QPeYW1u*yre-*+E5TiYk*lpYK%pHS745t&Ph(c1=CwRz9J!SM}~;CyD<Im0_kg
z7?tPD5x&wGCj2<}phL|J;r`uE9BzC&KmVL<R;m-{tB&6A3;!?wIlTG9{3G6njStM4
zers(CkJ3~X?N5DD_Nopi-h}rV&ieK{`aeUTfyBC{AC9e-`J}Y-T3GRNPfmu!S(>RC
z&m`nar-(6M+xPOv;@@t6EUzz|et6T5B3rj(;gw1!rrGPWvn<&yy7-oxv!=SO_EUa|
zn)s`a+H}ni@tb@*<9XL+@mme!387|>QiCV%V5lw1-evc1a_4m&=XlQ3>)&SncCE3~
zUzQdA>=7%wzKZM21BnM^)UQwO+xq5L{U4G3N4IXAURW{f*yW>Asi!!eZoRTm#d(5b
zXUNLV#)CYI3zU`bKe=gopR;!F`}O(j*3X@BF0t!g=JyAs`7@K>H(4lrUB$aj_uF=s
zT|D{AJmu|T4;_A5<gS{mvhujfG^M#dqL!;o_$BSyU-`G~&-WLKx%u*19OF&ZrHf|F
zce`5iq;LcOk8k^C&Q#;6;5ya&j^X)jll?z5`MMt#t>#;sxhVFAfq9}TZ%Nu?Lt&wP
zM*{oze%ih~`N!VEWhUPZj<3tg)_Rw8Bi=HC{rrj84M(aNjNe90$f{$wwC+sNE9PJ!
z@&1%)Pi2+QhgC4kn3u48KEAhb&9b>)qC~&Gj1K;KD*pE4hvycqb6;6ecRlFx`?Sh=
zWtWrL&OPi<Ia$nj!oAFT&+7!~-v?G6t-O2x?ZuDmQQD^GW?fwEb1%4d?M(NC!<>S*
z-0ct5x>x;qy{+5ln#s@QAEwTVy}MrUZKiHZ){=MnGCK}^J$}l6X?|38(48fLx7W_y
zdqrVpqj8MRs<VyT%s)L2K4zg~{BqWc1kK|f3(rg4dwxlLzGRL3x*tuC9v?9@zomLO
z=GMWyv$@3zHqt9p0$F;z`sXVJusN5n*~|9&f!OAizK{HQUVeBfr`TV7c<E`?BVuoF
zpXr^gb+GZAvVPBl#)EQ}>$kV(zg4*S^oqFOZb@GDTSvFgxbd^iY4b5F0g;|s&741m
z4;5Fq%)c=&_oMua@50A*4=FM$Y`wBCsj2YOyy#_YY}pGF7hiTu*~oWm-p%}v{~5wQ
zsLW6P@SmYYH|6T-)jm0oW@yAMFz$0yDGmMg@!GrPAOACWeau~zdC&avbf*k8UD=~^
z4@o@!Y?t;~;pd%sMTPC^TPyn7*Z*kySFe3^!tCt8IZ>z8@*I6?PE8aIjgjjM-SMP2
z=s&|D?g#NA-j%Cf?D}RZ{j&0Mp3DK3-5wGF+#Y_?e9M`)`&?aPs`B^gXQj~o*vU~%
z(#GXWC$4gwdp~<ylX;ih-R~ar3t6k?EO=77-f;hqPLtJU(|Pn)-#Bl6R_24J{gehd
zWsU{P={p`P@2z|`Kl8CXYy8>dg)cuv-E~y(OzSTBV8B>m<Ub|P;`LPfspW$4S$68#
zvvWgul>;KYOg^6QadlK#t!FT=oxSJUsVRX|W>@uWxxA!v=9kxj%kLa1P~Lq+wRz&4
zRZZ1j6F6VSX|BuswXJtu{``<#o&oPY7I*n}F$*8QYsj-Fx%C*olg0Y-oj<fQ%elNC
z?G4I~xYL|-Ezm7-2TQtUNo?bRf5M*&FUWAc+@jA|qd&{KmOpyh=h*Fcr``EvKh3K4
zOSpaP4TcX6Oxs&scHNoRe!42ZZ=YCvTz&eFSI*1*CvU1aZ6zMWVB{=z$njNS<J-84
z`QPSq-%|ZDt*T~L-g%RIi(T`xRea~JpHsPUpZguHJM)&Wt=;@#_k;6?ZKb38^x3kl
z%oa<yO}TMrPe7KyrU$(*xvb9Z*E3tCoxZ}<x~A+$YI=R~(%UDW#zq|~ch{XhK}P=+
zbLD;em_O$l7|;7@cP&$mzuS3XWw}lI!C!jIS7(ZC_^~>_!{qdnI~(lOBOa+YOnxGw
z{YPO%o{_`3>`m>yALcbod|A(<6#29={;gEm*2<^eO3z!jR2VFs{=?;l%43zJt$fQr
z{5~=<R=+vn(wE!6H_A*p&o%Rb<imN@5i=F}91hNO{OQJF@kr8+^=B35b<^_8xm#XW
z9QLixHuz*d$!v3Li<RE_hlk~!Jm7j>8urQbZp7Km*W?fS+pRR4b<6ik-!bp*lSy5X
zOdrJT4Kyc9NN<y5=Gk5o#<%vP@Zo)CZriSZS@F(P(n#vlfsU971xqKM$#}xY=p?<&
zK>NztKY}0b$x2DAU%&RNwY+-Kp);4=USF{Z*H;UfSLqVq&QN%sv-H9I)?I%m-TJ{+
z9bw8TIW>3vx_RL<IT*t<T{=WJA24#eQ&p7lZQ`q*Q1grP0!tqp-Fbh-52F`9x{f;6
zF8+S6Sa}}9tb1&29y?D>c-r{x*y@+}tUo^MT@vM=nzc_Z!)M~{H7i9I={?@wI$6!%
zm~q4IUHr#aUonw?^LzS*tr~n&i}M>6pO3ifH22Jop7)7&ChkdRk-B+tt3TshC*SyE
z-!I+qc(Jj2uc=RwOL4zZqLRjBW=Tbfz6B|>-uU~5p7~k2Su0EGddr@A_CLOPk1m<A
zP58Oa`E=GMxfxS0@;zgis_L}zvE2@--X(SN+V$DRdTUMhPZ5jG6mnXwpgChnS7;T_
z3Wfg+72)-(4nFYCwYl@+^8QYp+ii1Wm(SQF$MR8qO31gT9(IfNqz8O-?Y;VO_ThVC
z*{|J#CA+-c`qZ^NQ~8dDZ2G-3@TDK;TiKS!x#wf{|2Y3B`dYm$bL7k@!%`NfTjik)
zn^qs4H@hu##$W%a<5x^{{bH3K#p-4Ezgg>LV}5Jx!bv&J|2E3bKI_2e_V%FhN%o$C
zUuQm7wEJwGb=rH!#gv$LJx+RyQ&pO`zj?}>Zm*!TcFxyz><|Alv~SIquV}R~e8^iJ
zcxfw3<;MI~I={TPPcwRUPgBt5zyaajx2>lQ9?eOZbnoz!>ctmyQZ8??oWfbAvQ9Mg
zX?6RAjX%p3PdxwIdTY_%+g?9niyv)^esffEvb5CS7EN{E)4~%Lx>Ydlu+3JE`a7jg
z`^PGdqz})#<NdEB1*z=VvXNJ%QE;aCnNFV8A`8y%GkPXY_PJ!o_$T#8{=@3?0)L$J
zS9XMkS?`X{zI}UHN7K1aQTj8D4D1iBabuTI7wrw(?sLiH%g)zQVN*Xmei+_a@}Ggb
z;@>w}@sOQzrHfB|Hb_gJki0uh?Dywm=PhSvNCYq(zg%45{qWrSYV{7&9oMSQF1__o
zwM5vuPb$=5rDBp1=RuVegV*t#8RGY(w_jY+?)q_R+wR3NGO?MP4^4_}Q<yvH)|t0T
z2Fm|tZmW8>GuQw4bmNH3c``rpA8FL+ip}MAmhFlV+c29Y!Sq0IAv5y?v(p>+j>~*3
zGJ99LTy*LA+P345wso$T_6<7hf2}0@WQ_aD4A&ghZO%JdcW#+`+TwO=dRMq=-y;Um
zPxp`Li~nFhy6w81@Rq9zS9IULlRvXD`sy5QAwJdLPmF%G-LcKwr~2deBYxhBEY5!l
zvA17NzkVk4nfd;V-cuhto^`RGcwCS_b>l&X=Kk4#3fKIx|2X${_B`EcU$^g1ro`M9
z+qygABx7;G8t44SihnDQmR(rzJ<T*_?%RbA?pc3OZ(q~%@kesN;dK#CpMP$cBa{1C
zT8N21AaY}0*80XjijQ6-O%B{~@!y#XPxe02($SOdQN1kCwW>n#j?A}bdxc%+JNOHE
zuKZ(nspLO{(5Z%Jw;r)c&EdWxx?@si@_crS+fRS7T0Vbm&-3qsy=eMgd4AnDYZ50U
znD(rdpSj7wa?%x@B`f9iH7EC^Twk_aW3_Vcyx@oLZ@hnW|EM+F^{u6sxBQ6E==v1h
zta>oWkEuK1#Z87eHZAp9w|4*Ssi}V0>&E?`;jQRL-#I#KO_wfxarvDi`;x*K&CU}q
zw=Ru6tXj?Wy`oOu`C;|*Yc|%)Z~usTJGJN9H}Rn3%dPjT-aGT&rJz#Hw%tbbyz;39
zTRxu3es=%3+2<^?>&3bKL6<o8HhO>P`nd1)jOtG(!vAiJ`LtI3!;83Xm+JS2PwtaH
zytw1f?AP|XOPe0?2HG9dT^b~~_|ucy(r+!*9Go^B)>NML^@L67Z_5g~XWD1wqbB?8
zGPhp(TXpySmv1V<g^p`-tZ|oqI6-FO6|SG$As?<E=FQ>e7manU+we(g-##Nx>2&r4
zw@EGvd|ndgB_4~OwQsLcT@rDA*&n+r&-SO*Uc0va(uS>02iih*dMusjZaw8h%e=SE
zF~JL#YM-2?d9!-?{Wz<?yX>TXcs+gap>)dhZzq`6eDIWduVwjJF?O>apWEXJg|mKM
z5B|^4)K#(hh_SDDbB$G;=VOD;r9JM7J`XC(J=Q8su{S^Sw<>90!KE+1HA>qqnx18g
zH4mC}_xAaTw_aItO;~a9)Y7RJ@)$G@zC2oXeIECZ+>)+)hI_M(GX>-`()(mLi5)i-
zvy?5I%5LkX^{{Q(KGniiZ*$UK?&?4OUg*xrReF01bNT)=+|xbNl)31zki?md+dh9z
zes;^hKzr}S5^vkQ$NvQTJO7#O-LPv??y_U=ZfM17-kvP%cb4aj<MY$!E}pw{{mieo
z*XGO4xwebHBkYf>CS&eIoA14C4?ayhaq{;<C;7mhM>~Gh>11tqap^{M*7xaRpSGRM
zEoJxgwko+Ty)a@1U$0c#c_;1FH#6V;bG4d&asJ|2@8A4q_`qguxbz2i<hDzu5*^l0
zI%1cxm5YUGxBh1+oxYyE>q+{D?+sget-kI_O<b5I7{QuYzU+?ar77natCQL?{3;bz
zClv89ntmwVH~aB@@!QHjimb0}&EqNhxjK8d^!{rGTowl{*{}S%_ICf_`yFB76Yaac
za_q59E4X;~XHe{+#s7BoZe+9haOANquZzard*6)my=C*eO!}LDUA>(peD6lb1+m^Q
z?@gag=v!d+U_s*niN~MU&o6yzen@wPR_4UB)r_(Ce4i|pkgJTi+LGINCHLg{;CP4E
z^SS;BWGwRiHD%V;t4EUDcH6~d96fl)kRvqlJj48T)jvxTAMePuKO7Vle|yD|`^o-F
z8OO@jR9m<mkWewJ&AzbY(xqqV_G$Z+FKy(Tzc|KKSjfI=<87BCeU6zCDP=!H_iC^C
z;C`^a<DaVMbg%7gH&t_-CZ5V$?8ZLlsc`1O6WkN5KStjZ_$W4i<?F&9(GgoWxlV0y
z)Qh=ug3m%<XpX+5jK{vMzZU;Ct<nFGQzd)Gj%8MasiniG;E+j?Ic=B9Yc@_U6*_q{
z^bT{AaTC9py7=j}-AlPo9e>*W@BDtDJ&L7l3qLZuUtP30hJV{z<J(O|4)$rG8rDx1
zO2}4U-xdGwoV<wo#cB5sE7caJ^lYk6jrQRTKE*acOW$wzZT1VZ{{Hw8oL|5E$8z5f
z{~3DhBz%+W&1aonb>pty^2H}MHhGG#{{3SH>r?ecX?5=1EZ6fN@4xx^L404S>qoyG
zn{WPTX%)z-lh{4!(o-Sba~<ieAB~npJWJ8Kdpzs&(^;OYBfi)z7kP93>G#;bv;H$=
z-skuc^*QvTOHk%DBahaHvmP2fHJ3PiRC<k(RdMf~zQQ=mWxQ63vi+Srn|crA?TS|^
zIe5GE=5d>M%2%$xKmOM6VQ;3Lz`1SfOCR}WT{4e+m$GT=wkyy3)srL>{WW&@Brr;C
zJS@BOY#nRAP(}ISUAJFGZTW7t*|YHXi}!)I0?L!wj8fRyo1gXw&-${#^zV{*!=pj-
zwJ-c?KJ-ue!}IQzvU0&Yr&(O*nfGhUD`;|je3Po)Q~Py&;Km=qD}Oq@J|uN!pV#(j
z+n#?9cUW;UQgsT)l}UbP&z0GgcGtJen%my-<;J{R<Dktgi*tA1n#j1lamKPl&Eqm!
zE8b~eeN$sxT`s(@yC{F&?PnQp?aLk-e-<-ZEp+3UgWujC>&>>hEnU{gaX+j=^!pzb
zIXUlI?qmDpwp>{|Ep%#dSh30^4g1=qJuMaoZ%<9NTef$%&!!K{Hb2bno;k~(KPGw+
zceSpY!n8>`XFpf^t54@z)XH9VRb5%SW8Hhdk2crjLQmbcx)<Yd@n~vU*ryLO4)A?2
zT9I*>`H$hM<^w0$W<KU`tCPK!lk$;u+x-6w9B;m7DHX3gwNmEBK_2Iy(;3!(n7hN)
zLpGZ;r2En}vt={Oc-g}~=*`Ss=M!bgQkVCa%}~dknK3H(_cWUaPb`l+dM^3#`Qi5d
z(%-hh$E0|-Ocz+Dw7V<tdEdi(VqATp)1UsFo_XT9>0$3B6}KPiERWsfz1HiT{XPG}
zWSz`qDMh|VGB$gJ^gS~<@w`B3%OCxZ$=>^}tozEbB`~?Z=J5G_7ao3AcRkK5w5COo
zA@Amv?>5giPm!H7ZSn3Pd#8WWf0#dBy|+5WM0)+(yK>($E}YuT9r^Z{x!&u-r(%c8
zV<!3Y_suPT%l~opH`5=w+!^&-gtF|^u0=|5JiM&CblOvu?aYRAoeU-%H%OD$xvnlZ
zN9xatkNIsj(QD#fZa=w7Uienb&gjAwrU&PVKRmSQL%{lbryeg?-diFrXZ_K<G3H10
zBesp-UYEr7XV$YUV@mnyV0`M}4W5Ti+tpWH*FOBVym(<)EPoN`5}XNtOs5}Q`=FmW
z^Vavayt_{YU)5<$x*Rag;^t{3uWS4}-m+)06-xCzpY_xJ5#R3LUYWo4L_M4T==Sd4
z(%<wmN|tswti6)IHQ?ihytg|))P1v9X=D80KLgtq^J(`K%(k5^w6^k_IJHS6C&8dn
zB}sJm<i@{um}AR3zQ}h;1zytoBRKoTfsD7MvKFh49A5od?uz4q(;IJJk$2t{*z#`r
z{gqQ*ea<To|EIO@s>$KpkLS)^i&&JzdUm6Hz7T_XP3Nb)gi7fN-<3s=R^&f?-(Hiv
zY;t~KV)ZIxPpKO*XLQpi-Ix^Kan0WFz!QbpEPWp5vM+9x)cGoF6lrH39Tj8tcVFIg
zqmy-MHcTH6@4BsQamP#Wg51?-Vf*?1Xc|OY%f`R`^rU|Aef67>&cdy7aUT^A9At`l
zJa@6hx*g|ESKA*r<sChH`aP{HHnQt(ypU7axPRKalPS>=rWT@!i5FH$F#D@??Rb7(
zv4UaV*1fBKq#xR+VN|jCXxQRIn@>vH&n?%>eWtVHsY-IW)aSdBg?FwS+xOV1{wOM3
z8W-iaK40ucf{?pTY7w`Nw6O(C0^5V;IbV*NyKTK>%6+=m|47z6sY$U5d=7YhI(^QY
zRW6S`_RNxbZW$rB!d>($UuE5{v67SA+<(-HZLNNXcw*2mt%ItY%<i6+pKENrdfrUK
z^n8V~HS2%)Ep_+4xn;I?<eXxWrOT&Qm(E~3S9zx5ykpe$IQ}bNmT$fO$G%i=Nn}{z
zH*>KQp^Z-r&-B%PSn%a-RAEiZwWJ-pHtyTfa>vGdX7X0Uc!9+o7q6JKH$^M(%$f6j
z(fQibzWOC|<_l+Eds&@YTAI%}S<v?N)+s)V7i;r&Z>d@(Q?lsa`Pkik5qm<*lUHa@
zcbl1*sK%WBWLH>=-~mgmpN~z?)Tg?xjPhNZDdeAOdQQya>p`Vy;m@o5Ei27F6)_x;
z-MLz7-OM!=iIXf@wlB{R(%tF0Eou3J%I)S_m0B~tD6QOUBJKCw&~$p^m)q+%-o2%_
z?A6<6c1sHmT{87+aO;)vWB)$KlKs{${vV!O*Q(}j<>$Du_hjuohs|4h*P12sgg!2o
zNq8*X$7eW6TT5Q}hts)omrIv@=Y?g8J(X3NW+v-ZyEN8W?zTYK*{|O_^|tKR|KX~W
zGU=k=zN<CgS*6N@j#%rQ+81z;agxHTBY6xZi=v_)2l+hFoqafb`{w%<vps#4Dif59
zS(={f6d9{{a5Y{Q;w<N1uFiG(aMjBl+pd3E8)>TE{x|Bj=im97I(A7bCBqNRv%fay
zt7+EnBVp60wcS1v_P)3(VAb9wY4;+oZ<v&6#>Vhf&YMk^W4-qE1s_^A+>UWi<ayV!
z*leTyjI)jNr|UjZU{~jq_-=ZUWtLL$w)TzuUH8l{uUnEYvf0;UcJ4jZtrhQP$vLFV
z)4#VumfNJI<Xly_a`mbg({Je>=6rtf-7~Fa(vP;Ua4S;PWi)!~R<OS3D@*v?*KxL2
z7GM5%c6IHBp9`6y)~MVzakjVEnHF8j{FIUNPLan6wjJ5MMW22NbtpGkOlVM=s#nBr
zc_M(#I$^_6i^OZsgs0wo_4!BJZO;nbEjRV@-abC|Qph4{OZs!Z3;nhyZ2f1PzI|!O
z-T32j;@tt0yd@uR-^cseJI&_gQ<VpXKV{FKZe=hyz`)$VTFL!N@1k^V;nv6ntvlzL
z+!x9C&u~v*%0J~l>5`8dkEY#!J*)OXw8gS1XE;-%HOfvOXYmkpQ0O~X@p{(HpsqVH
zJzse1k4jyAGHLH_?wgXQ)=b}*Bb4LZa75nlgTnz9%{LBAJ6@VzzcNqa>+dOZAMkEt
zSfsSD&1lo4%ejw#-)}WKcRFf*N?m5Vt=&}#i<lyBH;2c4`{%lgEw7hh-MX5sInV9)
z?9$Sl$)^lYt@!uyxbi$-pII+BtzQ_Q-m-C~-j->7cfU=jIr!X=onh`fpYC}_>b6#@
z&-1oiwri8{nuLeWYc3hSY*<=(-u{U8#E<43e^j%xXIJ-czN?iOcIn2so(H8VahwO9
zybF9Awe9$^U48vLyL`evw6ku%vwCLJ+jC(o|31F_%u_D1CSPLjP0_XY+e)*iH@jEp
zK5uxd73gx9dE&+cDcWxw<>p*m($D?kvfb1L_go8C?BrE3c)EPT<VmrMB?8YEvFALS
zz4U0d{ap4gQ%U`}kM)%@A6$8|YJ;=bWPhfoJ^!>V{P3+1x9f+tpXOc>;+^f$dfexM
zL9aB+^OcErX1U5vpQ)2+Hou%FN%i=Q&6c5-lE*Iay_>hgZfm;xr7xB57&q}|y)g<q
z7v8YqxDC^hzMltduEp+s-j{S~>F%v<2Wz(6RXP3K>wuvJ+g%ZvkN+8LInHO5^_ums
z&oP&3nDnePRZCG!SEjjXwK&WAnokn*wg{ij?LBF-*Zk1;%oSOMH%{vOa1|HU2^UKF
zGv8$P+=CBf>eyD)c(waqQQNjt?BXqn={fr{Lt=6d+}^UYX5Jj0#!1Doq3>E(yzp4R
zWRFt$!(3JO&+8m5m_*vlCTuU_E`PLd!iW2BUVgNGB;G#v*@fpHzP{qO(v-DxmtZfu
zqtpHAKLew5r@dZPSn+C!cV`!S?#`&I$c~fyki#aCw`AY09JWc(G0xIF^6!leg7`T2
zC%^7mUM#|yx&Ptkn>QOcTv~GGo?zINJHN2(n8nHUD{B%z@SQvCH|?_1?wwck1wU&a
zR9d`e$#Xj|1un)n!F5($KhuNS<T*Wl<u)H(a@Q~+F5<MOBs<H@+XZ1KUKD;2HCVND
z!>Xf;o3G^9#6Eg7IeS;dJc+U+s#lt$H$85je6~!hwN}*fZP#l1raH0cxZ`Z=*W9^t
zB)nov@Gi9}P0P(K3^fiMVC4R;F0r;Y*yrP)mrw8AiSf@1J`<^0T$uN82alY)0^jeD
zo-&D}G21WK*e*GB-F!RG^=6Lee(@99e;+T|?P&ilb@QcND^I>DJ~sDD#`*=XzsHGP
zeXx7;g@v>Ix*R^K7|p(>$RNS@`je2QV#t@rreC)A*|<Mk&y&6X)_;c0{~3B~JXgL7
z-qkxlt@6zx8}?7@)-{B2IRtE2e)^9~c%!Rb`{J0{_xXN?hvyx<x_siL2YMU_g%Z81
znJ>@!{#HNYgMN>V`SNXR)7RXsSa-=#e)=+(N3L8<t2>`g%$=~~+`GEOW7<-iuZNTb
zFV8*q_*k6f-z_!156iv3dz2g&ocjFomqp)$wVP&tELL8m&E#0>Biytk+4S)}!4LKa
zVxzrw?ECm^r|Gt(+`P>pTl*}%Hz;m9^Egra-CoX@@qvFVe$@Uhe*H^0wjw7>N{3B$
zg6XTM^QAHhOk$iW+HDfj+m%;H9Jg36vgJeF+=u)!F`mEuqJAvZ(@*)iF2&>h+jV}A
zpNVH|+jlj7rb}|2mA=<=Ki!P83%TW-Y;toyd=4@CWAu^Zqe<armyfpHyA*2pr=@;6
zp)SFY(lduA)L%ARUhv(Th4UjW>h7^mKmGILL6b?MC(i6Fk>K7v=gBw8b-$0z`hIw>
zb@2AxKXf0(24qh&+H`DMK_h2pxb{BD30Ct8n<q9m&(oT=`0@PyU+0>0vscDBr=43D
z7rnb^d(D%cx#xQ4%#q<Uu;RLBlpihO?dvmF?D50+Z%(hQ+B?_QxE8EBC9v;?z&6iB
zmW58cdDwm$*zQ~>yHEFzRcB9q?hfDO(t(M$3~v?`Hr^Hu(r5colzF3KRsGgDJHeJ~
z2ZLqiXeW9w?_i%-*mXnu;SB#Nvs62|4=9|yP#bN!YPtAs<y)rPmjA!<=faQH#Xq(m
z_%)?Uz4t52u1y|GG&7ejj^OYssxMdhY#4Zexj@TW=DJ||BYQTLHh=CPMY&OrgqUME
zo)#?W3qLb=YLS2GgMX#(>r8(<f8Z@$sr<pc@y~XJ4QI+W{yBehmj8_BKQ<YESwC}r
z(6zj+k?WUi^fmKzJGAXPzeSSe&qkNHIfavKvtMK$-tp9W`@(xK?<wrwy|a3DweUjY
zrl%*}drv(`a&g>X_{Q_Rgs6zr-oHm)XRgZ<);jad;Ny~jg}mp=C%o;up~G9bhT~W3
zr<*@I-?`83sqERdVfwKL<qGQC>e5cWj6J%pF*RBF=F6(stB<_8?i{wc-7eEM{ps`V
z7GGYvELikK?Roj~iunhu%KG)1&utgCUVBw#|I?icTe3op?`-A?_g->#)vK_evk#X{
zlhoa2bvvdxe`EZ@Tg|M6$12q&*3|0Ri<-8aTyo&r?Ev+g?<RU{<or4Pbh;4ZmOqQ1
zN!VI0`%!&ZPUWNMmCo!ns-2s)b=ps4EbY%f#o*~Psd&!%lTW{YTbHh4lKbKp{}J81
zuS+hLaz{trJ@m6I;Ad;BpJ$<hTzuXh!Pl2|SLW83P1riW?~n5`*LnuMb1D^!D}#Te
zwTU_XtqgF;TUvP3b=}P$Nxm{as*gln3E$PVFp@?3>6~}J7o}_saqi<daqD<by6Egh
zui^!2Bp0u_E+x8W+O;Pe_D1;473Oo=(ws2SZ1NvV9yi`Z%~=*|>-yeARyZHBV$L@B
zQ6~LtqO)gd#<vgAdwg#4<)t6HB7fJq^X<IbVshFa)n|XJSNFL5wm?>{`uQ}U?fyDz
z3N@09?_AejT;csVy>sp2k9>>Qy$riHz32459^PALIL`FEI;OxNfA{1aev8)=AN^-w
z_)&Ip?b_*aTj$PcZ@X~nTj8m?cj756Pdg6;9cN!*`DoJRdt!I}mPhRUaBj2xP5rI6
zJ5-O)n3i#Iajd|7gXm>p_th){k5x~+w(zpvmR!!KTQ8SHubzFTfg$a)0`J^4mrl0a
zS-e5H@NJ))c)N|_!?!}OH1+rBU5q^;=`r&m>y4s)A?r2I*R5gvb$!>%U3!bxZz;R=
zv_;t`JlxQ~Ozffi8ecBY&zkn-73X~(Z3**s@~!8J`*HY~mHW5yBi`&{(+(`%dgrNF
zQiUZihsJ|GPFuqhHc~Iw*73Qs2*0+^-Enn|de5E>H@4Jgy4oKKfA*Q-ebe&gr(a%;
ztI@iW#;H5?>baG9uf)8w)w?8_m_M!P{k~=2Te-^zA1m#7Fx#Ii%70}=u={V-2a`f(
z6&rV6&g9-!K4X>Ae+GeI1s0wSqG#@Z;`qFlDPP1f-S&Eu(ry9o)?Az0CLg_a@2fra
z!>9Npi|pa`$s6@nC)QS5epKE!z54s3_Tc(2VZVOnoac~9NoOcomml}z^n<shb!Q*f
zI!T-eIC$-C`W_)=RyTnKC9Vojv=ghFv`_vC{OEn)p7ckFCR@K}U)=k@yslV#?=r)j
z^{38HJI2kXeSXEd6-W0qN3EW>ef1A5S*41Uj|+DwMWkj&>Z*9?Jek`UdZa6T!W5aB
zR=YUP_t91HJ<G+W-6~tWJo?8b30aTN#>E9o9`I|qxThudu$C&wR24q1lmEN+5A(xK
zzf|t!ZB4H^cu#5lCc$%J7K;PS`8>6o_`{T!FL3?s>6lq-GM_Jf+B2i)rSo<iy5|=2
zL2;VEeXaU3kJAY}a$BBz`9^toxks*edFxNPKz5aITxEH&;lJ}&LiZfyJislJy>W`&
z<yIfzV|<<~xA^zk3z|ssEq?f3=<lQ_{Ij&9E7mF}wRDP3=%45FAhFH!mBso=d%{0%
zepI$k>Q?p5FCur&=d+XvABtz5EPD0SsuPAMwD`9#t=zW!W3i9Nt;5H|SC^d-wY&1s
zRrIt#mDj@XGq>lgC}rMnx%OdGZkF8j*z*^7^B>QfY8A7+qiyEHyK%1fwhP=o@bTP{
zCzTi5xFk1ER$9;A!}rgA-5;NiPAa#iceG4jB9L5dnJjkOeaY;{PWC*{H?E)jcK&gx
zZL{=DxZSSi`t)?F1pJ-M+t;^7=>YSzV{ab!%+sE=arW`5y;ElSZrHx5&5g-*dwK2M
z8Ri__O_jfo&$+hoz#*$6s!`9c`+t0Ybka-v8&$jhZubwj4)dO=wxi|oe685sQyy=7
zw0~`7duL5>rpbj@VlQo98?Ux8Iyb?OA^t%~YWVkChb4dSG<`Px7u&?ew@+sMOI>@I
zVb%F!EvF~)vrA4q3T0j=x`Fda(uObE-rl^vYxPQA@XTZj&PblKCilvk-P_))ub*+^
zNW#RfYbHwjgeuQ3{UiOj`k~oxU(GGs8n=0xa9vw>a8roQJ7;6IgUXYtnfS7=)IZev
zpnLUC)w|6rUzyF?^~kl<f7{KU?OTsdX+EjtudCuWY2v+o-cn|3SDk&DRaG(R)}0hd
z)j$(1Pc3J@aOMs9mv&j}x6j(QoM-=s-aGz9w@*nYYq@;lsafiAcSqv|rj}oyXPsKg
z^4;Wl`itVat5y0frW~cZY-zi;^ggQ0+w#?O>RrdrO26&TsxZsst8A2HSZ5qJd&z%>
zgT5tqO|Lz6{V=EMP1zeSosG;=$xrX8P7rLqUXXb3z_b0<b+UEm^&jm%b}dCX^Sj}+
zu9A|Szk>`E68Bt9SKOi5+$N#r@cO%YdwpU&f5kbLUHhzNRy1#pThQ}XbArpZH)T)K
z8(uAu({9?UWwyE8bm`f`S?X`kKB|q5pZ5BY@T&_qUj@tlD!n;9ID*aF^PBd@nF4wF
z(<CLYhU79ZXixcQfBb!Co#C~%>C5BdUu;+AX4#%G&2j$v6Q}n!TClJx%xkUc`u+L9
ze}>Iwtq<(Eqg+=mJ-0PGZ&CE>UZH!IJQgo^9gT{dA~^qR;dbT8$Fg6n)^Cd6{JndR
zz3P^2{~2zZnKd-!CG~|SE!otN93Xml{*3uE{n;fLD*xS^6Tho(*T(7_e}q0hoBHVF
zlU*PAJJv6p^>yu)m@N79o;#_0@x?Z&(U~tIE#Jml->)cttUIM#{5;FA)}EzH`ksAF
z@0E41H&QPAlHwzLx$EzXAM+os_HQ>ly}m;2pLQnaq|gmlpESQ|*0L{`UJ<!S>kiw`
zjgzM)xY_CanEUb2C27$e*WUe^-KmgpIy>ijmOI~xv>u)K3jP_BFHd4z_r|pP_eFQz
zsPZy<O{J?}f0kU^)*LqF*5lLF(h=UPwdXmnZrt(p#qQ(5F}u_cKaJmf{~+tuS5ME+
zmX2|f?01&1WcjVh@RcEaf5okAdBO8yYyZwuaqHnXN^j!~m7Y`gI3quJ(ve@+r<u2G
z`7~YVN9LnFy%DFM9u{cn;XA{@KX3LXi{qkiE*ECUo->=3Uc0O&`r04ijPB(xuI+Pb
z?0kDiCugxlSkMmk>x;vq)!(u{%omD`KKi(xKPu~9aFWJi9kqsJyOeOApoo(ehc#6M
zI7B}?v>y?>-geGn?V2OX#cSSAdr~B4%C%tPAJ@LB>g$33890tj6<u_4)r_}y?EW*@
zDJAxHzSzyv^6`4}{6ot^Cf||SHShh3x(i0PBcmcK!tPnuPV6qYHKkYQ(p2Ut6T24g
zPkyH6`7V3%jvxCU?a*H`?YZ~v$UFh{*)nf)jx-)*v`G8Lu+FM6&U&%$vW(B?|Mn(|
zUU_j}_vntyrq6w5Pn#3|GYHESpIFzq?CRHSL(zM)bJ?c^NT%%wzVoCqFz;aDag~Jc
zB2y(4i#O)2E%g_Pk2$~ohGX_~!;&4_6D4^#RZcmr@&EMq+3h)xCkIM<pH*Bi@5pJB
z6vMLYPVb!xxrtI!<E&DdQ%Xfsw}iC4|1DRUUw2zTTDi3`jQ567{uGUuO~qeCJ#*fh
zNMFwTR;}lq8!|Wkyid<l^VOD?%B`<M#YHz3`d|5?{Fq<RbMejSOruxgOs1N;s~mO2
zzWuINIlD=cyJ!B?#u$MEa@rGiZ@VnHI3;ECGy~4w<j-M72j=9d7QDWrEl_-YZ*_e8
z{`B+x@?tt`->umr|A;;OKSOZ6Mz%_Db8pkbsdGIQ1Vnm1WnWJJ+xwp(^DVdMzY8Bl
z=igS)5-Yv@xOLq&2BU?`Zwha)Eo(jTGSc#L-*(fGrx$*Fd+yV^F3>c4_V%p`0>A%k
zO|w7TA-+QL;eDpP{fGZ4eaO929DUqy&kpv}N>@|(7-aNkOPreEAgN<%*R<E%;Ya8L
zUax15eJ_6HzIye|)ZVjO4^*sM8(J50mi5pAm$VZ)jKPf?CS^B&R6lGl`1;nIGC84b
zSM%4^?A>r!bfdvk-qQ-!j=vTpR6e&9HCnO6%kNvprENbt*G1ep{w+2tIis9mlS#gk
z2xHm57ylW`nI|mW>#_P;yu{U{>0Vd$o^RheqhqeBOW)mt51twBnRi6yL3Q}VADbVR
zAMxirD3#Tzx`fG4>9h>LQj7AWOBx(I-%hGL@vF2>`UBg1y_Q{ze{{r|++IA%Qc$JC
z&9981F?_rAu?JQ`g?%qOUf6i9_@N%O@!#POe^xJ#JvzyE)3I0Fr4w8~Z|eEndhprC
zdFSIcUXFY9GU(NX6{VBR*_GG77i^qZc%^2^V|%Zq%a%1<Pdk2a^O6l7kx{A*vqK(B
zd{$yk7CwLPv3<#N(^qExiAx+aX0@)}!doO>vgD+R^Y$}O+`2DwoqJ_3x9Q7`^vN%^
zQy<&<pSjAr<pXDU`82OnPM<txzpuSl_ddSrugj0<kK*AM_82EF{G+$~QqJ;?{ii3{
zR!OQw&wtp{ebu6~@v%|#gzD|<8!Lhj{%7FbYOfuB<?Wj}N2h;&JTdTQVgKEq5=M+W
zgx2riyJ2cw5q~5qZK2xY2i>!Mqwcf+<&3y_@7R)eX`XX$X-Z2-*hMqG%5E2%GV!A0
z&G~ER@%&w|bv{=`p^f`T*C!ubI*o4ayrRD-x{|wb!=Vo+wq05?^P$yq<%IQ`KYAa>
zHyn%HdY|=1{L5b(5_gAuc+hvm;)G60vtiU7p2p8gl`|w%8sq1yJwJR;{#w|n7g4fF
z?+o?7<(_>$LA7IE=)>OFn+y+5-LQO;@S%#IyT<H;+Jw|SmrO%0c<b4n&$?{7@b1MH
zo_BuyPP41NoGthp_3p)+Z+qGQ6#v-#_&<YK*5~M#-?oR}lB=(OdM9^Rk^B9O3rc_A
zz0~Qc`ps|jq5Pn&+Pgd10WY`b3N0+_7UEs^{2A+Q#@aJI-03}E)^Dv*{qUdR;4a@O
zv-)Q9ws(Bx7Cmgbq-Be*)YCI7H9jXDeBG*Az?MB%Ug)37$=S7fmx7m>bbR7I8Mw$T
zxiz76R{YHVQ{fC%Uqts>z0<m2nVJ@GQR#zGM)CTt((p^E8bbHHRkFW5d944m^~UL!
z&&;Y4q+Z%MKG>cAX2-ifyv6$6xeV#O4|jB`2<I|(N4qIc^>bsWWV`(1IbXCs`;UFk
zuKRD<(d~Ujs*+_}TWG6V%7dSI;fmb_yRXPCwtcnrTK9hjuAeH`(%deTT4zKYw{cuL
z)v3YUU1xdPbsNJ_8@?iKz1oud8{A#&U49(@Xnn-!^orU(&6Mp8k*8GK-}Fm3Zk=%V
zn2^WKN|k8|hb`IHrp9OPW4}_G@%HHTZ*`lxW!xl|Y~R&5=kr#*?`w*R>WbEQeKMRi
z+xO%0_I;{1dyS9A$?v?%Qk3`a@+F-o4D;SwPWd~{_s+XQCE=djFYA*Z%>HOT^TYdy
z%gS9hkGvLOdiRd?!~wH5LrE?M_F}8_>ms_QH_FWCz5D*~vdy;(_x>*R2;VjJ=oa5e
zkxe>2zYn}v=4Up^!(^W1kH!blztb+*_%1&3J=}U0_gu4tO%4)&dbV9`?LQO5SLgfV
zpyk=bjH-LvA8y;*A1c1Rs-%Ci*_sKaGuZ8m?p;k0(6@c^xTmnoBwjpY*4EQMvJaQV
z-_$vAvC|}Wedg9(h76oL|1)F=@D;hHYOJn4{VZ&K@tTkFhj^o7#lB1NZTvRn=gjLt
zb0<9#Je+cTn)N2*PYsUW)@b}GUsYqn|Il9GWbq^2iyIBH0+;SFeD|Q^U0&?-Ji9#O
z`wZcn`iJ{PqT~HdcirSJDOS0j6LEK=R(+e$<w<TvhRr=6L)Ct4FJD$s_4q(kxA!9t
zrZp8;l{~JB^grN{%bAm4ylFz=$(K=Dx$B}oE7}|H+Wyi0kn~w2{Wphm7rgRI&fj+L
z*!Q)P_6KDqP3u!V`QQyp;bnE3ZTt4iY*}07DVF{Eb!D?ncvx}Uwu}%S!<nC%R-D(o
z|2nv$qC);?@lo-XchQG-EnyMNuIVn6Idhz)^6m68l^%x2jo+(-OV2aZB!5U-ZF*-`
zcBI?t&2Q6cC-^-*7=G_udGfkTJ7pOTtZH3!>(7~Iw=c@rK0o5J_tTd1(yn~VcBHyp
z<}lWl5qJ}wlESxNzi!Ug+1?vIm@U&?Q=?dxpVxTbblvJbCn6^9I4+R!@LYX|&fE^u
z%de*26TNQob4z_k*@xJ8<vjCQDZ0$JS1Q-^U3z56AoGF4;)LV_cm0+>ij~U_CVqJI
z?$E2^CgF(2c`tujgx+(Bw0Qj8$ErBWE%4>?C!8m3-F+YXcg&O9mn-$@QuOYQ>rXdF
zocuJsEI57Qgg|!*9bQ|7OL<!|kACrAc*m{rvApgHp0_<S9-Ud`uFgC0LUUlIoY9ZT
zDf%_WD{kF;6>c!!EOcjM)Fm6n8B1o~vtT%`u<(QhgW#<7t6%+-y`tlKZEdA^yD9(A
zlneP+bT5iDy}Rdes9e6{@%3DLmGtn%vii+iUo7iB@=I;et@}5xD4ow%zbVR7qc}~2
zp~&L3qPoqTtKRmV=JDA(`olME+OhA>h7-D?4|aZ<Zj<Qj*_!jXJZ4gM(S5(mUpf|l
zw3}^vy>s4OpR(&pKmI+jx1J{95X1Ilp~}Rb4eRWKejF58t2cGcqt9n|9Qk-NYTE3q
zugY(Jdy5`CP;}tSiDQ`uE%R5FmWI2YP4?Pu;JrF?v+Lr!=U#W$`n^oPCoh@AJV`X9
zEM|T}Hd}P9^TA)M<FclUhj+xLc~`U)-14|z-E>;pD)~Lz?TH6up6$#RIs135Nd1SN
zyUxq*`n=wDKQy?_@%x-NWe1O!*}s{<Z~82E{VO@1owrxqJ8z^t;i1jyYH|K^VX8uw
zl8>KH;P=a}ICkn-Ub*eG{|t}Jn^-n^ZMu~i6tl5x=eEX)eVjinc@=qk_wPPtyK^1a
z=g^O;PY-;|o3ei8Y2AY-W}e;BIiYa=7KUd!kKZvLe35<reVyWupj!#wpUG<da{lbQ
zeA!6}gF8EXcF!|n<B<D$Dr@_#sY_SCvMT+!XSO=mG4JYy&GTnQh$~N?yYswP+{t%c
z;oi<$c6=1uE4NYm$F*nHk&L0gO_#8^f7U<ad_tJ}g&?25<?}w{BXSCxE|$EQ?bfAj
zDIp-|<7u2MQ8p{!{D~)`ip95f-rVExYk^qRoO@MzVHVGwS_%&`1w481puzCxbzR-1
zeKX71exC?>b3#QaNM)Muf(MN41&b|jEzWq|bM=tyiKzV*FU5}=-o0})No88~>l49-
zuJZ3@=y_(Q)K85Nycja=m4UVuuWsHo&%DNsli~_99JJ4$dlOqW$%ya50=bz>W(QoC
zI$XPNmb%ciGU-1%4oz@B*SCAR{aw!aOS4~0zqM>7`{WgSr%YU9AsDS)xuW=<vs&St
z#!s_u&)>N8Qd#Hmm_OEgKKFh)UAoqFe@V`DHt|n89<H69ll%F5P*uU!G;J6A>`j|5
zt-JS-t0|$!@#$_k(Wg^Zy|Z}yY`xEviqw*crt_vL?(1yyp7~5@(R%Caxd(nm%dCtM
zJkP#1@lLk*tglVCXIE~m_W9YM#hG~G$)*#(1IvCrS6=ITXWpW@-_zJ;F8MJt_et<7
z(_K8dkrVZ09VHWYMw#;XJ9+bGor-w7HgD0tJKe$a^NLkANd~sB?33N7AUE58rONea
zvBvtMXWr2lmm0ruabx=E$F7|8Ho)Ca=AY@g^AETDyVO^k<{R`jdFqTan>Tha9+TqO
zvy?^7@}%X_=uJs2Ta~Vu-fw>??VN7X_A;V%`{k)iN^A1|KJjAeJ@Bi^!B%_o<&yaw
z|CG0G+i-cU?wVz(9?JY|dGac6lST9ndHNN8o_fxpD&^9StA8Ym^JaxEpR2RsM5@>|
zfelmVvxrY%T3GS!Z-w;E_0b>B%}>lu=b5#=W8Yz6J>K3wg{Mnaoj!J1*zTT(in-&&
z#)E6JeDm@}m$kQL+41c5Zrk|r>bK=NPoB>Dbn$J%_5u$@FQ#URlS!VEx944b8T3cf
z(%aTNwn8OE$fa9hcGX6ipBY^#!4sQ|YR{H@`f=&|Av?{!Z{LHjtSf0b_}j^0H8XQV
zk!R5=euiy#K2MB$oBnuzyTOmb(k6uqxr=^2x?-}sW$OgvjSNrLtk&~XPgdi6rL9+f
zW2<Pf^@HheR{wUb=nkEBJM{8fwn?k^X-`V&3*&AoWC+%iG(ISK_qeS8m3bUL*njIs
z-F1JszF$u1(%Y{)Rc`amtz14=>UB=hQ*Z7g`kL%Kn~rP7IX<5CGwVOYxA{MM<>oCu
z`0Gxb#^pPDC-rlmZrtfm@pDPP!Pz^LI`+shzObwLsDEsIN1gKZ+#2<d(MOG5ngv^J
z%KQ|iv1y8#)5CYk6aVGN&&c6Dzj2-BZ_oUNTcWm3vaj7^ytwYve+J$?zM1tOejnMG
zv1{)MgN*`FucqDp6e&5$MO=4JU(L#cujhQo{v!XdbbXKMUb%nIk9>;?`6w|dBHyIg
zdh3Cpa`A1GOlGN_cvxumv3JSD_;c3}%D3BZ{(k7kqmOlyA1Ob~_4O#OPRU8%K0}X#
zpZ7>nnjKq^rE>D$2Y%UKraxT%_Up>XR|OFj>w`a>+navMvv%p0UpY_Gwcck|?kub4
zG>kbF^04Xg^2r@7m%sa7_S3pG@9szKL;o2z#~;19WXlz`OUth4vd>gqY<h0~%3C{v
zc=}~li(c9p^Z1D?3zKozpP0WZ{^{57U;LVOY3q?D@4uG&&h!?iZ2xEzs1b4Mkj+Zv
zn%d``ku#n=-4%ZC{uceWKYz<ryiNI#->0*7>sL>nT;8K|w$J8x!jYGEM5E=)T_N+|
zSAVYlc=!?fn~Me4>@<JmKm2Lpe(7<>l6lW0o=tK*bZoc!#HY2Z?1F_?vdn4XTy=2e
zwskZ0w2Pm;@A&0@RKH8$W=xINhgtV6`ZOloI`AUG^4P<@iw-dVh<Nw5DJ#Bh|HkyU
zq93gT=6hXJxb$XugUAl&VyS!4LY77@^Y{3a>nyFXNRFHT;QsCUN6(u~<lpS)j=XUv
zYR|zlmuD(WUSV+RrNOb_6<l0R2Ib*PU+mw;-}}$_wb?(BADdaCW_K!^{c~~6U-Kl$
z>rPaBZc|2N$UMOrxhh&8&#zh@BzU1+<nGP>2l7AE?0fRImRz<m_!ZvuWUIo~y-zMh
zo-{mhezIckqoe|-$}W+~Cy&;x{-gJIs-2{M+rl5=A7?-Kdw1!p=%3%YS7wH77w}?c
zJt7_!6dN_&sfe-Swq))CeVOYA^Ly-=f4D!$?w)-%D0*+$leWnL*Y~`BZ+M-1Uq+Ct
zYS-U4Mm?WIzO0|SPwhX$!I09o{GoP|mlssNS=@hSN@lTe#tCmdvAc`gJT{-y`uLss
z*)e}n&#=|nVozDN*iGH_gXy1ecI)5yU*85F3Uh4ybZoKQ(u|Zip4{BRZ!;eC^ey8|
zDyV$kQ&;jQ`-lIk(~oYSzTY=7YoF@oCKs`{%VS+$=B;s@vUfwugoXtyTxSlXJZEQr
zHuF#Y<NaOn0#C2kr_JZh+9$qmXVB+v=_MPJ`dce`_gE+2a=82Z#*Zh@d)jLJKfHg-
zn3CRpeAd0?t8Q;@*}r-7ERj-&!-W%$Esea|X53Sv@@UtFAC~H6XI6!}dp>&jK}w@_
zS>x(B)mu)f5mQsTUMX4h?6P7z_`WG@UtRqV&#i?fQpMgXsS+mNul)|4A;fTxBTe3K
zuJO@w!R&hO9FvYemZ@@!muz5sQtNv!l2KWOvoYhq>&r6948?KDW?NUi-h6b)558yr
z-W@F3ICu9#*SwSy)1N-v;3;w9c-5Cn8_%n3bF*FAv&d!tN8Tq(4fibJ=$0!e>MJ@^
z_@ANXmv9v4(jR%DLcMk;+9dxoM2gq{&e7aHkN+c&UE)XHze@t&1wV~)JFhdlw#aFP
ztOxt#%Y9mnm%dE>8TIPN#A7~%=^sxC|D2`g9De8j)jz%QE%TJOZOg3=ZqoKKyYOx8
z-X+?Tw_a%dBQ5hg^gcsI9Pj0=?ahy-f9st#t5~J3dei!|C;2w!hMbR?`triFjeA@_
z>c{Le7s%fJwqUL11S8LmQ_1$Vq2==|)#rRWTA6a|e8;rscGB@*%7auJRyg)mCf(*|
z_$t4?esN2x>as>%bGrv0rmg?5?AFVY^Bnd!-Y!q_nbg*$<XymWx$euxw_D7=tPlI3
zy1wa;`6J`fhx<j`iyl}`_Px@$TV>9KZ<`BFPd;``L2zR0`g76T@xpgsu9j;o$=#Ob
zu`uU^U?<C)1c$@(=6t-~b?w3*(X|z)BWg8HuK2s?hVq@`oS!6>rfx{J_A3)U_B3zr
z=Q)}eyUTaHIe+2w{#&aLUpMevYWw$EYaw^rvs<@hciRQdWIC^A_C)V`==XJ=^%?v(
zyM5c<oeg{R>)q356SCND+>2F?k$tl6#oY+y65d1WT`ks&c0UO3Ha+c8GCR8dZF2sU
z-nA^Z)|_BG=Dq0T^_@laTz9wromFT4BiU!?_52!J>s#(}&nwN9-2@(g-*$Re==m6y
zm)CaQwa8Ud6~FL)%lljQ$K%94Jbk-ox%btQ$}sy)uk8H4g<e{;&L{Xl*TIeFxHQz)
zv6lT4`f>3i|Ix6pTl@M~-juHVE+nS5Gc?pXf_=(cW!rF;u8-RM%~stn9>-p(abK=F
z^;FOC<qj%|J%74&o~*FmVXyI6xk-D{l^Wp>N9_M7|8l*tYj@I`3xCdSI(_`C?v@Dm
zBsNCoo|2<J3uPyozpK99Z7ScseQibhG+FaN{+)}P9vo!(WWc@8W8p*zLs_psJI=XA
zUQD`N!;r*&_}h77g^H97zx8jboH#LcT};z~z9Z9qHOC33F7<wR*Z7T9ZjUa@)4r!E
ztsxd)RsCv1o^-u4;pfQS-Xv@8@mqFEt^{{pTx6r}$$EXmW$)_p{QR`tS##NDzP#|q
z=USf0d;P$Tm-WAF%e~~TmS?`$%)>MIl;Fhg_1&2=a@uFU_V-4`wey~?vA>+BI_>G6
zEt_}FbKTA&zxUbVW2x`VrUf`YxW4(t{>>LYrp@MU*{<>Fn1pKg-K|S_98U%+H8@YI
zdo85>QosE_17n?V6sJ!8Lk{og-$fH+OmAr>q;PrVmsi{{db0AfLDg4@HL+QR_k*TH
z-}rNX<B!&l_m3A#_jBAjx%_O-QO`}=y6&Giz_RMR+Oy#MMJLY}$A&HcZU67`e3^G9
zH}*s(<lnn$G3(zi%{(UK1gm2W{f?6-Rc#hNT6aG4p2+2kPq$q8VlA)cds_5Jr}(Y4
z4L=(?SZZW<FnR{|xn)iL-kw_{|Ipgj`H(?O#iC1=dN$9ub{&!plGvAf(!^)+TWKQ)
zE#_pFCzG<W(#$RyZp>;g{&+p+Z@ZmQ<RS4R)6bc_kp8}Q>58cjPaM?g=v8Ev;FVM<
zRS5T9TzBl2QO3u^>Fe)hUHiU~d3MUAhw_;Z3{U?|wyiH)Q{DA@pM38;rk(nwi={jB
zAI!YCXji4^LJhaKA2;WPGkjVt!0`R+r+&#F*N@1Vc3G@>aAnKtt4SN~zWmRS>7CGf
zGP|SibY<l+&!Fl&$+gNeu5MkzH$C~ln*R)`x$KVD^zzpwU1^`TLL~m!#%P;%MyDmI
zsVdJKH!#?JG<{HKcyY^qzKXMZjCpTf%u`b}*PZZbY3NBN>CPL9%FApvetj9Y^&@l8
zkEsu;OLu%MI=jumIV&J)&xD_q|4iAlnAnO$8;<MF`ox>{_{jCBob7@YeYYO_?+J>s
zd}I`9WyklFx0Uz82j;3L;h|b*XIyD^)eZLi@TTms=e4c%+c-{^bp3iF$e~d4agA5U
z(ofE;lFB`^o~<!iEzL6Hhd^YEN}%@E-BGm@AF>n#cC9*9&fMhic<1Y|xZ}s~DNfC)
z(dRug?Zb-mH`e}H?YM!VzCwgm^7*u!dF@+EqQqOa-gS@ecD}08rRx{5XaDANs_B*o
znF|FM%M|zCJf3xV{%Xa`WjoJAR5Ty`b@WlB+T!$VOY3DqZ0fQ-9k;{#W^eAR`c%AB
z^zF8l%ASv;GuFlxDNp)!rnbNQL%%gk)8ch++KzkudVffM)AeqfxaWZ%<$Ax}xaj1r
z^|Ne}ated<JHAy#4zm0)QeW5de^dQ<Z~h9;N51^do3H2Gc$c9f_@5!uNkqscu6j?g
zOzr)7#y_qJA9vEfrzfJS8~Ahj@*fVatG$(P-^?~^Y`gi!b9ypEL9FaOpC^pFi}lxO
zB`(YUc(Y?mx5fITJBu9kRJJ)@Y}QF~@ce$<&vyTUUj1*CAO16Rlv=Mf_G`QIYFD7!
z-mTf)5wlE=g`DQQHr1R>{?kdnYPqe4D^7oN`XGAd{;m3?X3r~qD$}Y3k}GZYyftb&
zQY7HcutH%@-xp_t?&P`B*2W(;y+8OVHh;sV$Foj(%#2;M^|V7z5u5kw8IH#+PJCgS
zcItK9hd*odO|JHa_T4>}X>K5YSmEB1d8Y*Zx7Ip-oP0n$j{RDx^nIyYvrpXIb0SY^
z>N8Je$NvnvYtK(R5m2x^c`@VMJ0BnVK7JjmchkMiWaiTrrgc3{*VONx=Q~ofr0~;9
zb=$(&u9#CVxxU$6K3KoSzkA>L+z0O^UtWyM=sJ_?eQcVfTk-D`%R2vE6ke&EeXKd-
zn1R21{vVsa%l}9}%+_qKm>hKF0mr6g6IZM$^pcp{HSv|Xw$!<WZsHY2^VU2!{c*7B
z`+tU8LS8Fw#k`sAQaEjQj}YVChQN@*o|F}~uRCU0Yvjen3-4Q4vZ-OC_!N!;%iM<?
z(*CKu2Vc**ZX3gDnZ4PpPwn^@f%*qa?{Qtsm-gAYZNA66+m_xFj`{u(oUc2{oMrN7
zwf70dak(Fv|8X(aK2F)bX>;2rmDXFXJ1(hCJE3j#pwso(iM;K?r%nnt_N+X?v|sLR
zjn}Ojv0dryYTmCa735zf&s^ek##?>HDcO|wJ0(`U@jP2nRodV4v~0THG@}M>!MdB1
z6}~IR%;7tdersc7tjVd0W3}@i>vzU!T#tJmIX~2D>fW81E@jhH&MiImyv(h(@ss7`
zYNj)O7kDd*Yho{+y%T<2^<8dAZd#?Fe4)w|Zkf!U(!;`UCmyY2DL7hLwDHdCJiSDf
z*%fc=&YXylJtOzLLZPgbIj?{<>Z5Rl(G8PdC$?|h;h^l@IahUV=i{RH66*6F_ub82
zCgHJ`XSvzmXQkaAnGemHHfvX1YrgH&Geu9lc?!?1kx1!`Q%&RUGkaS2<BFWthxbR0
zUuN4{yj=dx?b;=A(}I~+*Isa9SJ3y_cW<w6(X^=N9lW!h#pc|a)%M7{R6y<Cza#_Z
z1+SK0S9rE6bJD%|d(x}JHo7>ioZ%c}HSt1f*|MuL>FQtBbp&}Q%jI&s-|{l(o`h+o
za6r%esV+I?$vu^4-s-tk95arvYMCe19Br7}6xs32`sAE*>o151Z*=lJpr9eUW4*)G
zuku{CV@;Q>&w1UN`Z+mM?&=-JPMaOyro{*De#IMdX=}>`DfSO*=a?Ja+4*VGIhHf6
zp6n9w2Dvt$3ivHoZ{4nT*YEYi{|v3A_Cn`MZme0SFwLDusw6s<fq!=1vw(xO4i=)n
zxF6{MQ2*BZXlBAk_Re)|vn6xST+6$(Gf8yHE{Q`4>4lOfU-0?Xm_C%3sCf0NVvp^L
zifsR@xw2P0c1_kfv-8!Vh&?BjC)NgDo?zS){;K}X-G})y#~0qozR$0xc6Cke(#+f~
zx6e9G;PmI&_I*32O%K!LPx}fy0v@_n%=i=Xc$M{rDeu1A`CcphP33}({7Th-s~>v5
z7yY5C`_c42L;L%v=o>2MF01ScDRkHASYnvwxva>|OwQx4+Yj5{8h<$cGqj}pee^$c
zmg&q(^9esEZohfM<Y4=WH+{=oC-iyEZ80l8FZ%R9!)E;>l7IYHnYTv!UEL$O{t)kx
zUu7%vg6j3HBOmTcRuNWE5xC${IB||}*I&+$^ADV7{^NUb%kTLe{VOtWt($WEP1M!a
zFW<^1<i9!?u_kx&RY{dF8NojOGgptEUu_%bv3y<osbBZs^e>El75G}7O)vbg@XUq2
zt})whs<}?C+4xhk;;=_U>kO8O(mdXL+S7kb+0Xw+_L22j`^VenuK7`Zc*Dxn>q;K+
zKGX9IpWSu1ZWP@(@$B)b2hSN~zsZ$8T&MFR`T?)k=_AIcKRS75pZ#X|^1{LFx^K6`
z)hg2FaaS(&nR{N4aXMr2-GdMI82<LJNIu>kdU>BbcdprEe`&ohJ0E@eDiOLb;PMTx
zWG(I#!%uS<Pg+{6i(liNv3X(ev+rw5`Zf0do%D~rV*BBVSy8@|V~!T*#o0Q)WqqEp
z>@a)V%NZw5oo<q|Gj6h2KhZS*=J|jhlB-{q1y}sK9RFdH*O6O4)`se@ZT`6Hcwnng
z_^rZEv3YmrNeG@_Qg?aQ`>wBd^;9o>UA>?8-i>7^^h!=f=0+*(yji?lG&@}8v4wj~
z!QrKKqJIiM{%1Jux%TPhJ@J+K1-UUx!o`@9j+s9{lfjtAQ_0gfh3D@h?MsJ_6<6(6
zp0(ym=yto;Ki+@*{BT-xrFrYxhqL{5bVw}vUAyvAx`q6nwoh+;@|x#NiTi7P{h9lb
z{vY91lVV?+Pcw-0wG0)X*pWPOLy-&{FHfJ9Ub1?=*UyXlG_t0JEk7I<)&FgdQSYV0
z6->9*-FeF-vzv|GR<ig`$UNDtKUyFEUR1*HE9p>Zgx<ICoCG;@|J^bS(it)n;~m=%
zTNUo<*IPP!OW^dPc{+RcbEd9Zw=_|bE6z#xDa$;M){T<v%+DMzZ!OvOpF!}C;NoM`
zqTXDN*`<F@sdvsY`wp+OObdhO<Oc2AQy3qp|7QQ<9|?}?9ipYyncFts_vkN3D*Ne^
z@$$2P;UtInGWM>wU*dUc)IXGW3q5=7zU5lf&5hHyi#-fkez$k#jMY4k=k&kl%l5q9
zx}Mj`<kpp+)`w^P2?JeFz!5g<^YIlPsjcs7cB*vFC=Kz~yW1&YaVTN_p6Xx!85(T_
zKYAZC^th+c*}BT^c;<~mYx^9z4(EA3&T+kd-_~xYReH;xP-gW*w>xz7osDg`Eo7YK
zd*g)1%^B+s82?)?Q+Ujv(jwo^#C4V5G=sCrxoOYXPIKsP^7l6?SheCnkJj_`#a)j|
zZ~N-n`sQrkD7vh7aRzrL-~L6)sxt%L9Qc{g6kSj$Bl}Zk#wUh1e%V3)86N&;XsHQG
zxstZ)@|W1GkB1H}kCAjN{w$JO{^{YYFlK85KI_TO70<n{uX*>!{IRFP<#ktmf}~B0
zxi)PGW3haA<-vsZNgNi-=C{>J?!LJ1<^#vvN1Dmjw|{%3x7Znf)-n4T`1YCD*YjD=
zujVgYTr2o=p4#Rg?H`^;UtYI0JG^tz$%f^E@6@$ymIg?6SZ~~T-0_6ywfaNR<&T%e
zazEPF6sx!4;@w7>;CZXOU6mCJ3@3yJ{0e=`{b>CWUGcztPUq}ziv_Zim#v9R;k|rX
zW0TKbx4Sb>ybrH&UtZxJw5j5cSO4Ny{4Je%b2i>H5_s=$X%Ul0=|raQHeYte`=x%D
zbc*GxJO9wEzeGCx!`Cm<?>Sp^U6pV-oNqBJ>~jZC)zps1w$<03O?}+0-+n79vZ6WX
zR?UvjYrm$<dZwt<(>vkxvsH@>WEOVL;CaKmj`K(T+81GBw~lT(9x?g-o^3%Y0xM3i
z3pJ{&aeUWUome$%edb50=q+9Ek4`f)Uv|nf;gd?_w2Tc4YtC;yJ#p{3ii}STk~SAr
zp69KoyF4}G%jw_$8MtfmF5M2irn_Y0j&P$bv!Cv~Ea~*&#Ab;<lkYaQGp`pt8TBJS
z{^AzJ(nYVt&Mv<_S$5S+*VIhr<chLW$Hkd{pNU?^n)UM5f{$kHHdO*fcNT3)@XT{g
z3)mT`t>MY6)xaggGpXvj(y#iy67BatJZxMwE=wG36q_%7Z*Ic`^M)|i^EK0CPgty3
zTs!@ac-hWr^F^P1mOeb|X#2Odn>JL|Z<WwFE9ZW)!)b*>wb`G>6HBMPcl|hRq3ZsY
z^?nm8ZIbjAS`1s9{FHmyj;hPnxoN+$SU216BY#s(@Cs-7&MzmD!u~S^>r7$|FFtIu
z;mAUd<9>ekmQ>|OSC~6r+oJ32_2JC2-{<;-nWif$avhm-T!{B=Ps_<ubDnG~(DOPU
znry1Kyyqb3Xv?5Swsp}nO}eWc&z@cI_sQuUPmYT)xu>Wz%;aFUDU99wZu|1rQW|@%
zf7!h@P21C4_oH^Iy|T7YtLjd6i8O|Jdp<`uyM3JBocvoTChBFk8b@EkC6gI46B&Zs
zcQr{owh4_F-GBJymao^g%Jce{8yV?rjyf$nr^tHpj!niUx7|1;RFYSUE-J5j74Nik
z?!Jj-7rj5+4vls*+8C|Gy7k`M9l4u$POCY-i>!Fiw`lFMm5=y&Zd6{5I-jcfQ>xZ4
z&106U#R<OWXH~x3k@)o~J0QdO)(i3J_oQ|=c}przxqW<zN}x^Fjl}2E_?2`2=`Jl=
z-oRVA^w{#p(X!XKcMH9Iz#hCJw@;OQ&Wee9E^)jH5e)j87VP&+ZoAGrnU5w#{}~QN
ztrb0`)xYJ%$A?{fUPcDD4tzPap4sAP!fQFX%Ud4l*U2BvtxCQTvr*`kV8e1Xi+6UR
ziC0W2^4J~YoL9Z7lfJrq+rG^E=S$CgxUv1+jK>P?Gx9>2SAP0*C%Nm{d((>#f7Wj`
ziRMhpE{d~mEi^tpp<HlJ&64k_0k$hY*)_FHJM(2_o%tV!`M$Z5Z}Llb2WqmK+9h|S
zFhpgBI+@2F5WoH7x^i*t!`h$+S-C6J`fENJ-O;gs*|F+ycB4XQsH&T|y`IO}0`dP0
z;-<Z2cU5+_emxy=s8M=FN$h^ZBX3r3p679=xQFrH&VGTjA0E6Ylj`eVci(+gob;4^
zmnLb<yLVT)#_8j|6D)a`dNy+P1@!J@NqOz3o0<Dt++tnNJH3*R4_CTve7IY<w!q<2
zzUt1(vN?a2pWgoI(F^;h3nx@1@0YLqm=!en<*f&i?^uqXZ8|HO$Ej>zCx3UN<?(a%
zUY}&ekB7_2Uy=P|t21q_od0aqBip5Cmq|>xoy5?5!HwbV*|cms>&vCq_bq#`eD7L*
zQcO^2xlVQO#&ny>2i|3G4J^MNlx~{s^3{6xTDx4C<4dzV^DD}C-HJUDyU>PrRZ_jS
z?Z@4d=RDeZS3dfR(v?Zq{=JJ-pTUvb^*DdpnF{7p{~1EqEdtI|uCseku`0v&i21fv
zJ9um!q|S{gl@8ptk)>RD-o6h}TbFGtWZky7()P3Q)QWdCTY9In7p+OqtCBPRr+R8?
zPvDiTdx{^5V@<-XnxgKlX1kdx&#U-ymxMFhIevS+$_GjF@@=BkW{O-3+cxPy=&5^N
z{X7Snck_$iFMGMA@c8qX$)_L6^S+v}t+h5Yu`vJh+P;H&?_Sj`4NJdc)mP7#ooU)H
zadesL7cr;j6`y%}p50~Ies*8P&6*4RAKsj>wGO?#aLLl86E`k;b-FTZ+dt)9QeAo<
zayj}qwwr%!ICV+L`r)r{XXCEDsWE-9^X#$C^326sww*|0NSt`CsLiwN%=rrwdQQ)q
z`?_UY)9+*3bqiN*-FtjW&#`-#E@*1a_1-;w;s*YEkD1qJy(-<`{%d-}p_ro?yJY@(
z?6_OBdgtS*<=V5SrCTJPu#|Y;e6i?D&Y82@uKn@al_f1}S}HNO_q6}ih)v<FH<!v~
z)$HAH^GSb|RKT|D>Cty9bNNKH9g`+$uPZziW2~;c>CG|sy=lukw%(qZv}^OmT35BZ
zGR3z}trgB;`19#Rc*cK*>b{$5+e~7uojz{)IA7|1R7A(IfQZWJ=F*#cBpE#}d_5_>
zw^e4Pu6NL-qtf@=Zu#WtuYK@4>d@0^vCiN7o2uTcEJ>MoBJj_vr^nV8uQL0&Wo1h1
zgx23SaVa{=(lOJVx7MD1`&@GU%3K@P4_X<z(uZFruk)H=991#z+oQX8dU8L_<M?;B
zZ~yCtpBpD>-+lOZjeYujh8KZ9#N$3NY}o5@#_5*D!d+cymRh23{~XPI(C7JFZtL{z
zv0VkzWBt#`T04Bqy>s#23j=QNh}$J?k-R6lDx{m5HcqH~c&;jWYw4}9{^I3X#d@og
z^|msc6#Ch#c6c7wfhPTBeziyQD)t|l<=$CpZ+~!}WIgxIv*vT2-FoK1(pur9oAf#P
z)RPDMIG$8p=PZ7>UMTk6;k(&tJ`1`srwOrdauGkHP^xoyp1a9X?O8XKU))tcER}ym
z+f%pq@j;$*8+WO_xUVp8H$%>P=1i8txVI1TZ?Z1f5&fTmKkI?Sw(V2bMW?a%7bGRl
zj8$RXRPa`M#dGa>^Ce&07fksOx+lzRyZJux1FX4o@7caN&?%=oN9fN4#yf?t<GLSq
z*i^4O#NNEdbY_Uhx=pbb-aZ!AGhJ_YIy~;3uU9;8YpYk$U1N{a8^0_+vR)vwo;zjN
z#jhQCVh1eQJ{>!!sdHoEB&nxyo(Cij{=Jg$XrJT9W!pc@kC^3Kbne}~i^~~Km*zh`
zbmH!bbe6e?uNEEuxW0PwVS9<SUp7~-%v`Cu>Vem<oa~~q$ycW^E81>aad_u?#(fv}
z$eb=MUh1Bw=TIW9F>%d?9V(L|uN!XqJmH4&>&Q!5ZtiV+ct0i|tGv2Lyqs@)!Wqfb
z{oz}kr8Za!>tyuYuHR+gpBT4x9e>9zA@kNh@qgz&T+Jesw`b?}NzvsePPp%@IHh^u
zK|;^R$#MG2|HOT)Z<(iI5-)iB$0Y6K4aZH4JWlV{@!4Le=@2l7DPm4SuIaTb`z^<h
ztW=J!7nxlv>{H+-$F}ctyYr-16E&VIY{;`(D=ISk#%xJ5dEPxnzmiWbxF2!jTz&Q5
zh3wNVe*Ubf<>AV{;6U)KX3rm+SN^b%{LR+CI^&;FsL#>DB$d_)&zH|h`ZVLWrseUt
ztM`8xKTJQ^-w~E=qpkAEYvGY^b}_ws$};|i9ILz)tbA?P?eqNE_ZgRWefFPzI8I?>
z*(;};S*r>pY*v{o%DfHQQ`mOAGUV;j-o>iba=EK(d_IVGZMDvR-~Dl2_a@nE-vnKC
z&%W7Md-syJmJUO@GJ_er?B>|jKia>!UiwnK@{4tJzgdcryPDm#k0%eN^;tJuTrOi~
z#(bmeS)JLx3sv)v%4*#{-1*>kYm>>X>s5Qt=n74f*S~qotWrc<eiv8s<f*pV&ufhj
z*-4ufyRNd_y}Ob7#J4lKkCK}Vn0ht~H&~Uu41J@&S}i(z;mz0gbU)nh-1?EdJ*VWX
zn}V@yN9)?9Gri`|d@#*Z%*i~Zb+&Ya@}(_X?7QYEU(oHbGrGJ+$7D-F;+9?8dpeVu
zdALrT*UT%5(h;cd2%qdJw|%+$H-Fwkx=AxDejB}=d`5OQ%WeUyIX$z^Zu_vm-zI&f
z)3>_Z2fhc7EWNv3k-4?N;e5>m{+w@j1N_X=^lEjgpZES}$e7RiBR^_y`vEhfbE-Ec
z#yXbTtdv?c_nyZNwui~5r`qrF5h&|noIkD9HaPZrso|=qdq<69%x83RrdBlP9*{12
zd*OlcB+ozEw-tWKuD#PKAM2Tu-pF%IRQ?c$eD%BM_J<_?g)XZTt=Q~$`Pk|Qf7z^W
zdnZkry=KjJ!^RUuI~?WwnV;G%o~L<es_BP!e7tj#Uw`|jv}Jq$;d{bYt{?5ze^;t4
znV0h~kL|o>z`HV*FR6)>7~aN5{mA|n_jk+tJsP{(d-dOKVJ)kebgg=}rQQ=;r`FFZ
zi90J#_gR&)aM-a`<a_;?`tWR!zm#<Ljy0*CD%q>2_r1D)Civ;ff)x)ovM9K!JotKC
ztmJn6En&B7c{Y|GK4kZ2<{$9&sa<wAIj3OL8L^0iT$RZ^MeHKJTiyz->kB@7pL37l
z1717Bk50#9w_jh%EAzf2=+TKM+a8JCuDo@6`%DoA&nG48t*^g5@?HNw1IOR1N1u2t
zGn#hB>`ly+*sii)3|y1%?X`~m=(qi0yzuQiHHllVE#DfT?D<eS`Hn-4LQw31;0Ypj
z?m40FrE9W&L~B>piS3T&U^pzqBD~Em_cuc%<J(VPZCBNPd!KmYL+XeB3`cU~{i9b$
zXS@xZa;)wq_i>|Sd!sk^);PXlVE?^r)8#{U)*KA;gOAxa`%cdP!#?r&(%SY1*}LC&
zNQM0B>#f*k7gK#GOKX7@;~%4E#!YSoj!B;D%eOQis88*GYp2|0X{Prz;;Dj}C9}E(
z+s?b;wO#=`|6lv*{V@Fv`^V@bw<OxVE}2G$>i_<rb4;|XY4*Mse2?e6KX-4(`t^HM
z|1+>m|M<Q6YebFjH@A<hEvM9`JCwOzQB4ig+30Jg&^v=+aiu~^-3KA<uZ<;p!@nhd
z@Y}rZM|8kP_O2S;oC$Ys{3u)~F12^shsY~uO<v_GXgRw{7jp5Peb5;BpMn3M{`rsh
zoo65W&%pD3iFazo)kkxCgbox={~Wl@lV`{IQ^zIb%eSWgU1{lFd^<vw{meGIf**w+
zoWI3fOPPJ>mR;9Bv5#!?MZ~Sz=9hWw+}>5HWID-c)1+t~mzg)pCU7W=?tJ{8p;dm9
zNmNdnt?`?UF}J+A?;kXusA6Qvb(Uw6z^m%j>&`ruHH^Fc_&wu~+mF`uuBb?Re$+U#
z>hYl<-FW{#|E(%o{?nRLT5o>%amT^7xbfP)m@R*2{4@R`e<1w2{nk&nVl&0$y#F)g
z)?BPza^i`w)+(>i3Avv+Ir=<oinM1Y&E5M_YLDsF2j@k)zb&|I$9TiOW$8z``H#J2
z#qR1pxYA(oy85E~J3Yk>Esn*lhpmq(J%4|^f6fn;`CI*u_V-+OI{onM(j#f^hiwYo
zTJmgd_Rm>&k5lKS?1A;ybIrdQeOP`}pEa{;-TK<aSyrk`7j&I)Qm$Cs@$f^>sWnUf
zGl*O7V73X1+y7hdhx{R{*k>C*e3OpW&HAMAXnNR|ZH-TFa-QhD^ekSl;08m}i!<#{
zCK!lbl*#JaedXy~4%_ecX6x#c^d<iIUiCfRyEWUpdaoO!&US&L!qX>uoY>`YqvrMQ
zPP3+Pi}l_=N`JFu%wxDX?fYZROD4TSM{l^VtX*VXoyl_e=}m2oq<4?A-3=6r%;tUl
zy1vcM%)aT%^?e_wO<$h*KHch2dN^mMwGY$6igz{L-IX`pc#M^%<}{p}9lJAM_}|U*
z4^M98uFlp-zcX{^_Jqw&7oXIAnS6S?q^#p}SxtAz(DfzfUww!dvXowbBmJOI=IJHf
z)zShYvASnEj?R@~yW^2@@oGrZ8ky&|pSwQxI)9VCTypZ><A>*#CRVTN^vM?a<SjdS
zg8kFk4&`ot_k9ewd52Tx#rC(%4_<EJ-15HZSM0Rb)xPTUvzNWn)x0!yr!jZD#?)<@
zjEocN-pCm6o~_jV{x<R>b9AK1>b+L4o%VL9gojOcO=wd3sjXt{w7_GHQQ(mya^{Su
zu7~Pp>wYm<>1TLVcFRA8%O)1@a<|s=oP1b*`Ih}wy_K5xVy`shE_ZqqG3V3rio>N0
z*IQrzXOLR=c1!X@d%>4s|8y@-ji`)jJ+<29MOk}O{;ZPe>`gb>WpdZgtJAN^-1Jeb
zUH|aknCRD43X<OJeU?d)ft^N`6aReN_n%>=*MrHQ!%tmbsrq)~{!97m@*Yic)n>Wz
zSt*nu*K@w&RR0fC?-=)7PnFR(KUTDBTDixs>ybasKjxmTx!y*4Wo)dwplh`C?AB?&
zERLVBIhn4i!rZV#GtVNqv0wl4K3o6dmFpIoe0Pr6s?fS)QgP9m-cM7xoSrb>EeJ`L
zx!(0+*U`R(CGC-!PyT*W@m?vB=>A(h?UGgBjpw)a{&v`Z!NxhSq_+Ot_6-kR|EMNR
zf2zRa^}~&|h-;(e@x7(LB@Qn=D%HE&c*mxzHJ%@P&$rjO?dlQ#zDZ}|-OPz=jJ7PD
zdCkqp;GO}~ru8g!p<nK|*D(Heu26sYb$>^VXL@<<GFQ7}J1>_!pI5K?>ttb`%m(>;
z)^m8CXuLH)aMt^fJ+}$3`;lArU2koYm*4p5n!Dw6;@<@#{4-(>t!+9{7yIg7B>R;0
zoBqkxA9UEq`LcY%-AwUC_cE1ACN3%1F8EeuO^#t>({YV62Fshz%Y`Xz-u=XVv4oqa
zrmXmzpTBu4%pbe8vLCsteC%V^wW5hKA8(&h>{!*4Qz)g~)UG(O@2O>s)R*@H^#_f<
z{54YTe^9o6*$b&tGh@6>C*O<w`G&Fg-W{#>4)gnLE-EtGY(H0@Gm*bN{XyBz#QKN%
zJaH!<_-2Rgi~d<!&wI<^yzP+${n_>Dg)-ewb_7haQH|X9%~5gn(&_)WG#~4?|C9Ul
zPd%&3bNd~ItykB)Q=RO;myh3LZsgl1EQyQK3aky++rKuwzkB1wH;TLo=TolQa8`au
zKd?=F{}#8Yi(eL>wvLi@I{bFJ*(CA&X--1-TwN2J*6MVG%$+y$X-)iZ^%{;Jw;ycj
zKC-K|`QVC$yZU_XB>p`7^k=Dhy@__?VL8XgtxEgi{xh^sdU@TvNLD{$d#=I$iRD~}
zpB>b?!#wH2J*&#*@_UL_#doBBp1S<_{9z9LbzkyXe#-IJ1_w_1^iR4Xb;tHQAK$9o
zm3yYhbW*9`G&z)EV`|T&BX^Qx?JN0gIx`pkGUh+L!$web+S~`R{?1q4lx*p(-@Nt4
z)89FtG#ykuXPgp!+#|ek;^WDZfs(H;%)b?UK<Yn3+n4)7j-q{Y^S^b^Fh6ziNZhl#
zw=`Y%XbGPUIQ@NMOzr`7)1Rtq{#_L>j_9@*%&eL=cjayE&bLpS%x){#Yim0n`8ctu
zU2)et$p<yZALY88e^j>8^lk6fYcs1$wI-Km?@gQJ!qs?B$EL{a0^6S@3oGt7u$H*9
z2kzdMsI}_X{Ppo7^;!3u<WzP>mcF*%cK78<^_%%?mTRs!<j=TZSMS7zx@Bso9@HF`
zSl_u%_un<EXREnh&XbzCb+6^))VZy{qhG~kFtbGnhN`eS>OS2T@%J7d`}1q-m;9-@
zR4QR(TAR2!F52y%@19>?#zz#(b!P@>6soIyxnbO_TD|_j`<p`b-Pb3*wsKihzgfk=
z_ZidVTjz{^q|AQiY4!Plg~c81UDM<QuKAqG-7B=qCjE%LxQ+grJN|0TGHZSqp5&do
zdCTejb55LE6EgAdH}-ki=bm2tT3a6LJy+d%zWe7Bx;FjX;x?@5E!I!cCGT$OkK6IL
zd)t48rks1(zeJc`{rl{<r+vySmC1!F^7DLFIo&+*vo0Zf<$s1Yo9+ki8^eQtObh#T
zPrE^R=cSxwJ4+iHl6UUd;^Wb`T(KqZa2`iY3g6P1m-{*nCZ?P}QXBs8KSTGrb!YBb
z?cA|-i^FNzvs(h+JfFK>{k{CFvK23zqrdIrx%kKU;f}Ay^|FV~tZTD$J||Jn$FieE
zJLT`W+ST9gABx}XelTCGV~^*e*ZFHQedJ5ewoke6AVqZYsWT1lSp=dBo;P+q|5|^u
z{?LST@ej{T$PnMSdzIz(zF()@Wb|i??3i0%zf<Y)`l!IOLerMk`p)kYtFqg?+Gu-Q
zSmi|iv$-a5F$|9vOcc*}<5px{7;ai}UH7ZW#Zu0<Iq4I(Yvf+?*crRV(LqGG@9eC<
zX4gdbiM^QQ{W0#?ardrk@p{&aZS?aCcHE0%E8JT(vE9j$rR3oH2{qLpiw}use>2|_
z8>gl<FQ)8})2pJ}Ethg{?Xa|Fe>m&auk+@IioK?5Z?@qM{%}M}=b>rG{IIPO(UofU
z>682SZwxkSJRw<Td5k^I^4o=_m)9-b^`S)2J+F7_r^V6-Z8?qFiue_NT~983sA1Z#
z_xx~}(5XJZ+u1Mgwq)4lHf~~M5psJor?Bhm`&KK~X<L_`UK+dhjPCLio?EBJc1+yl
zw0L!5xU$0Yz8Oou?h6Umn{F2-zR%oTK5f^gX`Y*eOD;<!hCSxp%yWia;!xS^m)DLz
z*e~Q;ap}h<<;0@ESg9*BQW(CJ3JJsro;a2Jcx`Rq${*#2b&C=|+P0lYbJI22`P;#<
z!Rw@0d9HHraf?^gVN*_i_;%d2@AaXN_kQ%fV!yfRqmcB{j-mx8l{~&%7nMyo-TG+u
z(d`%F&Yk$N@BPElyRGkUFW9i-%9<lPDz|U>>9>3XSLOLrEmdJ(TdI0{GBY3g@@21J
zI^lhgWwPSkD>IFy@+DvI@AupKa(lew;!FCi$7bfsO|RshK4C+~o(XQ^`kFG6?^ZDP
zTxWlz-@8xk<Lu7TXl9eer~BW2SlF=P*u`fvmqg58A5(nYwzoRcbd{phkto$`YqLvv
z?`^8zxU})GwZp4_iNO;tt(q+He!}v3Gev*dKj6Q0==#GM|87qA*m+g=QGv?twuecd
z4)yeI+jgR_y^LSa;rzXWmVb6%eP8;1v&;0VB|%XI|8loDJ#ykyX0h}*)OUuPIrjeH
z`1bk2{}d{kZijy;pTEL-Qg^Y<#*XP3FFv|$T***1P5t^MLyL&Bk-KF>v@~{a{-yFm
z`#%G#_vVjRe^<nNG<koYA`!;S*w67J$mP|u<m=OVr%rE@xPJRSZ%uOb!k_#P_+@3q
zBvak?et6&UUOdF1=XrJ1{gb=iiP;9`nIE6Hok8~S&rcuf-{gOEK4KN)lv{N8@V%fd
z-{WF>^SP{gHcVj;G&pZFvCkp#+P-H$ygzLA{BXTRVc*C7U0e3XiI=L?^HolYwmVSp
z*6`EC$PNXz1pW`3pY014ZC^Hb^2XPf*Js=>{^tKk{%zog{D*xTe)%7Hk#CZyt+4${
zDTfrV*^`Y2#IAd(bj}c-V6f&t!y!J-HFxtLy>GJ#U&UMPw|UD|eW7a)mG^duiyIy~
zv+CmElH@YgQwtBUat0KXJ=<@k_T#`mmJdEv=}lieO6OW7y*FLAc-QlSI~9{|F8(zA
ziom(z+e|xT^B?DT+bL%T{-}1}z2`&82ba`XvunblGkK&8&uB~AtCwBX2zlJJ^|*|6
zypZ&YU9!`Udh_>IiC#YaaBu3KaM9-{O77M;^R1Tg^Q&p!?$-5iLV})xr-5b7^{4X3
z?sL~TU;5+oZP${;hrfMd6<l@LcuGv}p-r0>om*wR;q&~pW%pEmL_U5i^zKn?R9VH_
z$K7wG`W86pOiGyhZIhz#GLgm!vD=w!SJxk&FDhHo`N#UB*tdG|%<J(=dk=Zcwpque
za;asK&&mT~J=-eJS+37&)$>jG*>AQsuCmOo<^y{}9nY=%uB&Qdeci)@_<pYr7W-OM
zAeHerehwd}<lXC*FYKmV*&~%}W6QVp!>;Jse7Dcdr}Hy59iB2dYmMHt-O*X|XG^$C
zSSDGl+GZ#4BlFQ+p<DLt(k3fKR#t3X@$X`hq@$uzW#ogN-oyG*+fNzxeEBTv?DwO8
zVa35W54}IHxHWZZ-C2_v6~Ee*Y&R}RZHy6E<yK^Qw8ZlB{<5&znY~YC%dMkxvya5{
zzgu)^Yi`ta-_H^!a`RZG`@Nhv>D$HW+`Fxvr};GqU$^DiXYwQbF|X6vtxtAd(i39{
zu)Co+yO_^tnP+&We6hvxkA*(}8CqMHzbde6{a6xl$6X^Nw8LHZ#bnDH-#+B~ah^yx
z*=No(YvYm{-4FK`FN=A-Pw>jQ{rjKnaGU3?@qsh7E491icv{`#ZFjob9$kI5=1;Gp
z$w?dMhx3IiM2~l`(ObLt(glIdw+>71*RxA5II@Fz8S}%=!weQ{=UP9~KWeKMsrO#3
zJ?z4KvzLWykACwM6L56z%e=G2hl9~4x;>PgZPOn0^*@>)Zd)w6<#cYc$h9J$k`u}k
zlZ`zhlZ{VLx|g+y?bvtT-8$7A_d_n#scez|uw{$kGH<Q9yIOiSy!}~FpmJNyjZ-ds
z#{RWl^Nqew{c~it-_zbC|CW6^*OdD12jnWfSY7#=L(Zk|x%Re)?Nel)O!8peWOa3}
zyMO;d@%y*MW~JR%$!&X9|K(&?D}&jeHGyqORc?mIO&gcgs5d)Ze!ulRXWZdO9M6MR
zeUl5h&NaKyI(2^5f!}puH+r6W#uZ1*lJBp7$aPue(!Mj(!mg*z3#`<R>Dbm3tLDkH
zB9rmllTZnX=Su5zx4zrG?x=b3p38NL6^o<iywuJvUDdAGQ&uQCRit?T*`DNr99Ese
z_t&NN8Gkr7`BC+0&o9zHOm6;}$n)*<rlVTS(+>ZvZr*ubW%BMTX`4&Vi@&^Q&+OyB
zEz;wlPti?n+dYL1W_i7w9MblcP4oD?deWAye;_Xs{XDGo;r2~iKHHq`E}itwd+m|h
zA4x@v6HYJ}&08|bVa1mG(#5QLq1iHf*KM!;@a$#6tYbg@XH9rNanY9TGxTFbjg5Jj
zZb!4rP0ih>QDb~Hf6sgI%xk9$D>%fr&B$CFV75Ya#?FKV2}g?i3ZtUb`;>Coa(Q#!
znI4(C<lw%FOQxYJMu#R&n_4`7%4t2vW9$+uw=_RkJ)gJN`Ox)=KfD8H`ETY(O|9H>
zUN<^n#(e8!;q65a#2#mweA_+g%5=7K?LHr#ZCw;$xBS7(W!H608N77w-TgS{iMTkM
zrDTYZIgiCTKG#BlS8^(swsNd_w14w<L6-2%+gs=CkjdBAI}&Dlv&iE2-j~~di67PH
zKX1Bia<<N9FTwO(4r*aqx3A3J*(BhuptWh^IY|$tRpv+TI_joh+>>6ISpVexoo=1_
zOs>`K+<H&kCYLi-Dm>x);-=^KI^ecjW|sQHbIVu8?Ax00!IRtOfn8c-5{p<tmqYyQ
z_e?VLc09OLG1=*3-}Gfm?}V%UV^lWDUw+0X)-K}Dj`OFAn>=iuOFKN<8M5Qzo@AEX
zhqbOtc5Ih(TDOU(&EUv}hzTMspD#21l(alrAa%dLPO&05UaV?&Y~>Pm%{(#HiH)}#
zMK>uKFgM*U?nzr^?suYdY4+mVHoA}Bi@Y?u_~O@=3p*+~#kO~(&-rthwal_+Lcz{o
zNt^ZruB;F~Qq{6C&b8q4oBO<5uRP6t6e5w_lJtQ2s^jD9TPt(!3vam__snvSd)hUv
z$mebyj3z#O%1ov_pXByT=)KRjBi8qwsj$sAtJU$dH#9!zopiUWufD30r}s9CQRDlY
ztFpdl%+SoMid+1s^~0R^MLB&FRDIhXds_r}JxHC?X{r8WzI<<*=cE4&f<L<Sts^)1
zI^A_Q7k5pZzuY4Au<*nSiYK0%K4w1l`0%!WDdK^V2iy8Gp2eF+thBT!3MoFo%zkNS
z_IlZ<tdA=$-7CqQ&y=tGcw10~?k*oD<LlBLN6V~q-*lHMuRXtTYc;ppWtDu6dmah~
zD}I}tmff=S`2C+ZV+;-+NHD6^KAF46eZ{Ri=hJ#hel}?8Pu-b%!!D<?ry!(6fq`HB
z-kzxMK_7L@mZe|uS;-dqbW^ax&)MvSg&Wx{AJ+ajn;GT3=FUygEq%6e_uQ=a-PXS)
zJC$95oofNV<D9<?tH1HuzDw5Bevw(xeN;-m>q56h>~kUcdFO;peES&h*q2_ZdLVpl
zz3Ye7k6gY9ysDC&eoJ6MMM}5P9RoLoM=a+V8`)P^X-b$L%aSvg5U1N>t|@xu2xD%W
z=7BdGSKj`av|Zt2fA=5twe^Qwvw7R5mOP!h?)-Gc2`5$=t(2)e!DZlfhi~TF<=W9)
z-|zg+ez5(G>4)c!9CF=be$3j{*=8F3+e3HX(Qj_kSIn~BJ6X}~MAFIo&2f((`~Of+
zKYYJ^!?KMJ?hD@bSKaxap+7dt;@uk6(1h~kQ#R}pd%(Q+<0PjE+K*=Y-;xfQ|J&;G
zk!u%zGzV<;n0Gs17h`&dyV`@@56kBEh0l04S;A%=AHVfS_Q%JM*o&O`)iUc;=C%1&
z+!+#4$9A_{&yhFnkV)<LYufqLYxAA^ccbp?|0sV%@P+W!9;?#cmQ(xur}d~c2rOam
z7F^PQu5bd!V_V1dbJxCkZ(3IQwfo4viN`KWADgfu=0AgA=)Gu}^n%w>x7PHlsNBlj
zE-rkE*`&>*bvOUFrA3TiSyH|{+OXv=bNJOKbLYM_xgFxam*<kd#@$nooETI-&t1$N
zTj;CnSDyXCr)01BA&u)*Cf}rDynM<9PrMYIc<PB>^!J{l?&}_3TQd3Bt<|^GHuEk$
zww$w5nKed-ld1Nqk=K1K^%Snk7p%pXe;B+tpII;~E7s+4Q_bo2oOy2F@6O|zH-~S>
z>sXOG(~DbP+i$6z_%2Ukf<pW0bXk#~?babxLYbO(Z(QO&@xsJ^^N($k+?i&Zj_-c{
z?^Jr<!){GRm)pnKELDSTiz=V5xpJm6Z~lk28;9-gu*Z5-UdlUQ*_9M#^4%`Z^Q21J
zo<or}j*mQS7B7o_DWJ%*>BOZNkG+i?i%b+AtIzoudEK7BRM&IyzH5^n$8;I*TrjQn
z62p>$Z3je^C69%E?wJ^R<?L$d#mDnkaGd#Ny^v**YsSKhcjO8jj;mkq_qqC({g9P=
zPrm2XTk`z376$x|UA9|hQq7hYR+gSQ@0e{8uI1d?fB3JM(ZrLgQ+K`NQ0YHaIFD&+
zVDE7m9)a5I-nP=KOK0v8<y)A`Joz(c&D7cJPbAx0^Zj^vZ}Z$6>dEiUv%UP!!1d)k
zcjm;*r8fSnmrQak%wChFzjU<|=dF)c(I<H>89mn2*{GS=aQF3%l)p>tQ{T7oS3i96
zqdqs`)B4GUqHos-8A=>`sH3U0&0p))@k{&l-+g&6cratScWt%)dnS&A(4O2p`7@<q
zGu!Tbm~k{O<JR&<C66~H{%RNAo<0<@Sv+ti-*eU(!WTDR-!FPzBfdC4Ywpzkl8@)R
zY<M4Azu3y(ZYL)vb>l{4vd5c*2^&?r-NKC~SOkQGbFX+|^=DFIsinSR@tLx$Y3&*R
z{xnSDwB-^#u#W3LL*R#P(^q*`F3vLNu4PaZ_q|yv=kfZPAy<*@?H3+vnb%faI`8NG
zgVDpy*kF75l;_KmlQ$&qJZ8%p<n~r}e_KubgR^2^le^@Vf~OhAi5q!1Sg?ibc=PQo
zDvUe);r8S9!~HC;FPzP+ToHB0>xlJ@+<luTE|p-5j^2Mawd$#)L<tY)*_!VU?ce-o
z5Q^P1`PJs^B6ntg9iH9yG?JCir2S+&D4Dpkow?xW#;gBqwtqO+vvyrY@lk`9-?jWo
zem8l`e@jliXT?{ZeB;`_lb#V?Uf=8!zP!KH?6B*@^m(^L>eR00Zk)ZIH!{Xyx1U}8
z#yeK~ichmna%FGaaea0~1^c&(zw1h~XZs8Pm~`y>5nc&%F`bPsr+-`ZB=_@zsbLX^
zMHGZ~dowXwSpMLCIRDuGj(NP>W25e!x))*ADIGBL&sGQN^~LW$^@VR-zh(Nj<sama
z*>l~r?=Oi}J`%pIXl8C+&m-y6nE|O@u}st1?3i;ueVp9&>A71#-OE)^GbjE@{M%UL
z|6#FLy!;RTqh`0-=E~$GZMync`g=;Q*muF78OQU_?C|;ZY@g`vA1fc%O8ZTB+xg+t
zeU*+=Co5ijvz~uD@1>i4d*kJa@jicYe%$|<etg%NdrBXktzCBe<{_5Phn!|FI^4;y
zYnO7JTiKGjh`2qE_T^r(Gs`N9>XrRs`PH#l;r0{Ond&+7r)+$zAQb)l>ldb78K0x?
zDMe-VB_EV$S-&T+pmeWScCMZE98ZZ$v%Jf;ryVonxI05@TZQg%i?^}4`wzxT|B;>-
z-|_z8TIHj+To;s0@hpFKGRHgjvwH6>v(uB-?6x`JDEW?kVTJxf`y=@s)5~s6Z`otd
z-tM!>e5UT+Kl7?J<+b)?J<{l4R#}mz@SwRd`kvX}DSrZM(=%6PMVZ_)N}YJ1>)d~a
z^K*oZe9AttGCY_g>Qs0@=FzI+u#1x=Z@vq<wm(z9Y1jJ0r|UUi$uZ9R9Z+cO%o4V7
z^D%iIF5ljcRR`)<r|R(WEA6ZNP}cuY`n9H>jcc)byIereYVMPTipPBp&0&6ZdrIHe
zZ(^P6{+$rBlh}2k^sJsQqwa^z&TBXq?Cn|fHg#J@q>$R(2`?7>5<TZzqhI*&u5kGE
zb?HB1b4zm<AA8^VEM2qr-zL!@cAq)c{Cik6jz;8P__gYC+>d1TiEO>g9Up0Pr)H`*
zWgppeMYNGCCi2wAnIg&W*R1pNW3M{#@%h`x533%#%kf;Q(Yc?xUAZRw#2F4r7KtZM
zSY;Nke184<LDPC(>Aym@%typm)<2Dz$-8cPcFv{Ethe_*QIN?!esbsZhJ)oi*R5Co
z*ml~#jaxe6nznY4!}I{Rd8rZy7;mdGzFT1!%H{cDtNN__f;Ucov_2|zWxAAoYusnA
zi+xX9_dK6>$A$e=U|xW))YqS(T|Fgh{W&U*AKoXBQM#A&*y5Gm3iV%@%-Z{ZoLR^H
z+-B~|;~%<yo{#>h-d^Lo(tY`>w9jw39%<a-y?prXjLmyAPpIb=_RP9_@t^3AsqfFu
z&I&xAHN)2JyPxr=93$rAA13&(;}pHJ!d1WWM%?9%UsCtKwf?AoMCw1o+{c*<FP1!3
z3A;Z1JBPw2<(XYeCf&FD8CpC?pum>B_@7wbPQFd|1b%pbWDdHjvuvhvXL{y)of9gp
z%;$t2GUhz9;Ss(u>*uf6$KvF-m`kzVoqKF0Pf_cH*w#*Q6`2(dX%_D%8TZuI*1LTy
z`6tk%FaJY4bkikowWHg2ZQnjiN63QfU<`AEr#qjU+XLgkp!r(6T#HwKT71(^?c_(U
z(}$<MUKhWvll8FOYip(JDcWY-$}B+wbN<|j5#G)&dZeQGa6ISN)umfLy#4-1Md}Hk
zs;3@P^v}8|vB`!pZ&mljo^UQ@NtmSdZ2!mW$LbV5{M|cep8WPJ@72o$&dMIhR@hy6
zJL|!Y0yj^iT%|pS5B=lym;bvgU+7-u#DmgXd~=!gXUn}^^;Ycqy>{Co2lj<4_D$0?
z+O~R4#VOYO&DlNICVPBr*%3OyFlS@z#fION3`GuatU>}Ssvn)`b-biI<3W*x%<m@~
z>}QB>*|yD&wJ-UB=ff^-Q#I#;RhL9r8jhY<c>9<^=GUw<a@rriJU-v{?abmor)s`R
zvQIpwX*KD^g!rBRum5ZOC;QS)ZfBppXy!cSwolRBMGvAll3N=kc-C+8GjMpWAb4rv
z$Ndd9?DflEWq!EjYyR+i*H`Hk>(`a`Z*nhZ{e6r{>)uL_yN4Ax&h4=Hr&Id#{891p
z)gSI1cm6wNi?u%QE30aM-G5WdX9@>St1O?KabE9s8CP^3<CmWf&&3bT7cw<m7Jc&Z
zZq7aCrN$<8ZcB8798J=5x|U3M!)LUHG0F05MPbZ8pI_~I;T5~*`~C=i+}~Zp_+b8~
zf0uX{RU`+BYi1`Gvfgq}FMHG2?XdirP5P6Vi6`x*zO2eWdN=H#_fe&L?uAloE}qzz
zBXrD>Wu4P%o_YUf+TG*Tz25Rqv!e2k{o~UdU;o-Ut=RUxt7}n!U3lwb|EUd666Tb?
zj(NMjVckEW8uj1y2c)y-OS)#4s(i01J^Ju>>DJ8?_i2Y#d^Vqc?&2Q4Jwk=y*)?gL
zn%S}^Z4z>8_#d7vj{G~@WUkWns4MYr&Bes83$2})dg4r0yPzbeN)rb|pT*G{<28TE
ze>6XSt?Qa+!u_86)vT26%<4of&fF){93-{~X>fcrdwZZKdBOS%_RaIue$;<Fe(3NK
zIf={5Z=CrMQ@ib&$2!G%hW}Q%PM1tksl5<V*!LizCi3sRI>~<*<=Eu7e{`qH-Vys`
z*%6&)y+bcpOHN>^!K=F0CF=XE-g-|{2`Mj|*ZxSof6IS{u3hgIuDH9eQN^2g&jjyc
z6KlPx5i&a68;?vhu>6z~*15ytgv5{I5$z#Aj2HW^x_9ILf|)JTzUzHHyu|5&VX-mm
zG;akrk4lN#A4I%b8sqmzwI6u++a7dD*>zLf=ts+Xm)zG8^UvqV_4dE~IFx5H`}D#a
z5B6P({h?T3vED#lU?1O)^WK6#%mcU0y5=!cukK2ergCqaN>jvcnSzs_h36z(Pt|&9
z%cJgh>e?=QG1FN8<Ga?)-t4<&@1=JF$Ml$$G~z8}TfCJv8=a_oGjU_jx4Y+T&d1mb
zO!k<3_@CL;zOBo)^h}EKEl@K^ZW38}%HTM|ob(N*-`RVY{;+-E8}$C+_0~oEF6^;7
zD`huvna%3u$2a8mMMtP><Qy|9&bYWhz1Z!i!XNR+`#Xx<>sP+06NxO9NS>JN{WxoB
z*Rk3Db3UpR`YIeNS8D8^p5|IDqGg#^c{THPlC(ZM#~ZoFE<37k>PCt<d|WV>KVXlY
z1Y_@VN#(7PTR*;=p<q?tyOn!|>z<>EZbf!=<!ymmG)^8kXXIC_eR@ree*S8wc}lZG
zn;u?yF0|>`i|X8m{@Z1m`wv%n?$PA=aQcy~Tj@>*pJ2CFM~fD)rf_&azOv7?s-Sgh
zkJQe~ujY$<IsH2Q@}kT4IJ%~^J-e<{u-qcwps#G+f%$&f=f7_G(O<fJ>5o~jvOPZj
zKHjn5apNwtAU3N>i|=3Cs`4@CpWHU?{A|`Y3HjcgeAhyAa(^H7npC$$-s@{U&r5mP
z(ht+`iEY}lefwOtoAE+<VUi5i8-(W6v0E&PvTo|#W+U(SL2Ywk#;&vbJEfw3^3Q6!
zrODE{{l}4u8@LMi*dNtyDfO;3yY`>qZJqknMYXO;F+OK@p8uV*XOiQS4d=37%=P~k
z`{Vbc%GqZxEV@)G&R*iGviY;1LHSRGggLT@pFOwz6>j-3zS(S^;79Kl_QECJr)!;b
zJf+sztaO?q?pgMnq4ue=<uQlX!8$H>m#^%&Ja@~DkC~;lQMV4oZ{K?MKf?^}HA#=Z
z^RW9EPgtz}cS81>59eF{Gi1aI9B19%RN~%tt|aN>PJNM6cf>4j&H2^#U2^@>FZVfr
zc*z@N)k$stEu(WoYNcGlI}RUC>HWX9+LV4>zpRey$L5D|&E=&lYAmj;-_l(@+q~yT
z+M5|~^PcMNGtMq7Zsv?#BPm<h#CLD%@nGo_YqRH?yxbl4{OBz8H~GKaf3)2=z3@lX
zqiau_bf%p)h&au7uyezk1HahTFZjpx@A&)=Q(m2ZU@w33)hxC3**R&uHt%U^o65{;
zbWm&V=2e@up2{oCpIKxWAM+#sAD8??>xh&Ke^M9R%c$C8J>%tOk4bGY0xF#sAGZZg
zoVca*^<~k!nfBY;|LCyp{Lu1GTxxs!`-Rhl`Ddzby*}mj&Rf>Ao%%%@>PuQ>il?6Z
z{Cq}Ol}hQMx!;wW|8ahQFgNemai=S9(xyh1tx)`P_Hgg3^n&91f8!WmXup`xP<L>;
zJ<pb2ug8bq7e899-s73SxMQvFoghWKgzdA^y3d5kA9^z3E~l)?KK2^xYxNJc+Cx6{
zcdvWDN8WV)lv`!n{xjT?dOLs8sxXOCrt_w6ybdd>>MBj1aJ<3p_>cULn;-ah?r~pH
z5$-*=ZTE7wn%lC;XPf?MM)|O2XBKNM+3{Jq<j&6XPFJ5^JLdaRtkkJ(*Q<W>AJQLo
zKM3#Gs@*GhAzp9e@^{l-d+t{E-@CQWV%n|yr}d2Lexy0ilb-c`zCaD%htDrB+bqk~
zd-j9h>a~ZO^-ftn0gG1ew{c6SUOjLkxu^L{YkRMa?4!A!rn31ift8urg`)dbKh?Oh
zptq|{(C6bG$GX6sF;kNk_h}zrH2v}XhCQjd4`;{LU4CTVuD48A_2|RC>k*d|CQLKB
zdu(2a@S%oWo~|_x?7W|)p8UFUZ<1NT);s<T7yfX5+<(~WbkvVu(Xq*nUDDl+EAPxy
z*zX$VoG)`>#`QBo?)z)H1gEqf@{q5(_Tk*-B{d#W({_G%ny`EK)+t9WL<{qLn{2?f
zvXE!hW^E0IxAP2cD6}c<yZT}MG5dBqgDsQv8DIY@TW>pg58Hj;isc7+PB_2OxtMtH
z?(}1!Z43|6DkdMi$Mn&@d&_?Yxw{qhC$E?s3CLfwtj#h`e%FTGe}4w<l6aEd!#_i7
z1541V?|d#_vd;YZ`jP$3*Xp`o&(=RUE$z#Gboz?br7Mqe?A(4={MSyswGSs*ESapk
zz0UZ?cBVbtZa<tq{@mLC!==t7)2?u5=QQ15=ia`Fc2`vo-+r=nx6$Wq@dh#vQ*`53
zT;Heqv9G<{_Ibx2{d~K&PhxGay+7-zNBqmN*=D44;*s&`8B#f=8mp(tZCy|ieI%-P
z?b*9)XRU3SXi~WK+{uKAe%xy&F1U4CK{+FVLy~=RC{OTRmX*7s+&}+*y#B`X_-kSn
zHJZ!Tp545TgI7e*&RWge(2_-<tM<I<hxZ-(ljJ2U^8Wn}{_t*=$7OTnsGAm?Hl1^i
ziKQHrd@wa|k`ZgY$F2EqCVzN-xK3%?)qVWg*X20(ObVH}M%VAJS^gZ8MHbP8ja?f9
zE_!f1E#im?pI4K<^TYgx8h6qCM`Eo5E}GnsoRPixcIB+<_v{us-6o$Zs_%=P@8?<?
zbmq;QGg%KUx43`W|7fn)??XZ77r(AjnWg*1SS4qA&YPF_nd?vQc&;E*U}PL4*ZxuY
z5!+syd(u}_YlD4f7tDS;$6cn@?pq)myJDy5U->^lKZGCl3*3##dZln>-=($NyiY9J
z;VGaOax7l8JGo)`v*Ui+pUNK{f7AIf_*k9J@ASier6eC5e8!Z!$W208RDwmNzLL+c
zQuNKmV+YqoDmO)>S08w=Px@sX|Hj?ThraEz-MoF<WL>%G<%)AVpG<8k3R5`pDe3<F
z!b`h+i;vjzZOQ(a{K&g{u2F^Cck{k!GeYuYOn4rCXFK-b4Ljow(YX)hf2dzSnlGC5
z`A6}w>xG%-f(>%)tT*}^lY6^3J0z`}ACw+vwom(G@wdILd9gQpZ|O->UCr5VI-eWm
z^EGT<)v(F;>EoUUJYVekLKU|5taIP|eec(mA9$a4Z;6e&ayUP0dJxN@^E^dcy4F2W
z|K-(o<A)4;LJL!IL-sM9e^RgQG<WU3{KvHFR{M<;`Z--`ds5XW*ahu&|FC=0iuITC
zCF;&qmACFOul>)!5z<?l@Tqc<w0C>g>-^R0oV~g)ygO*SyX!~s5j*+odn6x8+xk85
zUhJ}FU+kUhPMpdz4|v}{lPR$1X?{65D(I-$d}ZUcp3Bx%s;-;3yu$5Gbk?qrPj^>q
zExPBma(lLbnUdIpcc*z)ywLt){owks_pRHCBVN=CulH+ad#`t|R_%nujySeu9+hPu
zr%p1IS}BoK#QCZ0<F&>|d&M66{^*kqj%=TD{hL_Fx*aFjoZhuL@%wK4b9{T&8<YD@
z!pGBQtv`Iac;)S5jklt&Ov`+Hr+7-(Z2@*mEw+kB8;*oN3tPQls@l}YE5DU3FRgy?
ztpDgN_8WgP6IC|MP}w|5GBHN}u5t9HbM5);S;q?89#7I<zvbid_LAt3$;W@aoi^=a
zdudyx&F>Y=vi})&<)yryyv1=#^LK{VpRXV0Z=I)oT}U?lka)OL#VJOe{HM+njz;JR
z9CL2sRIxZ9ag0N4--?gy2mP62qWx1pN<EUcZt5ur@G$EW?aBWArugJf|Cp-lb5%tb
zr^hJQ_E_vwtq^uMiawjS>Gmtbg}-a0-(1~rbffAji-2Wn%xAh>?m7NFag0xG`<gBH
zWTrhk_ABkuNrlr(8nq_eFEM+6U%BkI0#6m+*Vp&-f7man(DvI}S+cV<R`-%X{zBK^
zTviOL)^G7t2&lgq{C?I)U*Ft6_PMfOSIJ6V;Y``FrDS){RQ9L+MQe7m$FNBpcMj%s
zfAh*^_SSy3%X|DE^K+jx5x%o`>3Y3s*FULUVB-uHIK9sEp8$XH<fG9$cl@Y-ynXwm
z?}4>S5198VP3TZDn!l@8|IW|0@*IX|+u9rcXnu_P_N!jtCDWZ4_x}uvAG5Z_94ps4
zsoX65WK!_*nmN}e$v0S)?wikh#HwZ1o{i$p`Aa3DGXCsIF`ucBCTlK{JX!MhvR#Tn
z{N-tBFSo4At5|+8>UztGE4gcf9*Io<p40x;NJL%9#YpYIV+o4@ZaF^9c``qiK7Q~z
zH9zm3!sR8>v&_58I9{xK#npT~?5DeezUb+f_cTBHx2=Ev;eP8Hma=CL6AkX_Y%knd
zDjQa>p<(&6qc>c6Ud8&d%TF%WsVaW>`*iNP=GxrfOAW=dQ!I~hxwpzaY>Y|PsaQQ_
zt$b~4xuV<oyEfY+KFn{fDK-(0<8Hg`e<knfr{|a6=_NPm&MvQPSU5pQhPN@qFz@iJ
zwEYjd^V{`V|1Hg|E;aG$P@VK3>cH-Ux}Tl6r^I>Q3lT7!IEU9a`vH5`7e>>we>SMi
z<@{`S>vpV4n9U-m#=DI#uNG95tXqCyo_%+y{~JkDwSDbeHFIP4EJ<wMeX7;vlYrT$
zwMz45i28+X*WP6o`08TkqCaI<)_!@R^6^-c+V*LJ;<wf&7rc>H7WB1LoO<QY3a;OV
z?54Zd)tK!1xNJ6m$3EWf88YfqzTKKRiSwPxXY+TuWe2Yu>2X?RJ}smq`D}H1la2ZV
zU$2PAA4)&Hu<A&ZX!B8yX_Xav<vR6Hk--v0S=-kaY-E2MpDCTa*ZHVa{zR1^mGkvQ
zPu;oa8_r8pykNj%sIR`lVojWq;MB(py^L<o7w}!GfB0|Iy~jt(C%+62U^e>Ckh<iy
zv!18>j=8hcc<-3cTCCh)RT>^IZo*sk-v5eC>_dyKB@Qm(ha&Qxwss!Q>oehaTD^|V
zn%{rF>WAfrty{Ve|7u$>>rC-8lWiN_cZMAges+S#_oT$>?U$S5;@8y({HRr1TQiUM
zN^ab*w~wOd8V99rbAD34y2mjuX`9drd;M8UKiyQ^e0Z9weJA(CuXfQN&6{eXAJy~6
zcz*aC-yPF+Pu}p$i8%II4u_{C3ncLI-JKD;<DlfTof>OP&$q1E{?G7=?jCKMiJK4e
zOtwf5x#g`oceB^~J~mkgTS>R<^&i6<_o>Sk>GQ=z#xBt=yL31+K~CTVpMAONE}gn0
z{og7*O~qX=zSJ5&y8C)x<HyZjo34DBYOhi?_l*Bam))C|*l2khFiYkbDl4tO{pr|s
z-#V3QweJ@Bq80ZKHivlgcWj&0bWeN5j-6Y!<=P0jJ$!a(6Q=`1Q%K@Zb_ols0R2vd
zCV#;{YPHHifis?1l}PI|^&LMu@y-reX3?)K&qYuF*#5A-O?l7s_z!#co?E|CQ%g5L
zf8HhU7WTa7Q^n8BSX9$hB%SfJkIk;~ik(qK^TAv5zh&Kc`A;^IGkwdpE{}`bChg8k
zcT%0MlCE#a&R{gpHOR~Rdwr*u*sjUeYmJZF*<E`7&a@+aj&p(R_1~TiZJs{Ob_r9v
zpR$S0VpX>|AE#My{z#nY$JVdMrwT?cYplOya!}cAQ_9Ssi07Ru6GM2~do9%`R9&CO
z-#x3oU-ZF8zv+dmJ#%&|?!T;{-L!`7n)Wu)_(v*6eQfTgr?S4)neW@-n|vs0@04j_
z1q+4U^L%f!CU5_4C^-FiWX#iDhU=z!$ClK&oH`x6eebq?UDqs2%$kpE<2v7Y=54_Q
z{g0EGema@4tII`NeqU#H|8dNwn<p3euHcQkBCwk0^cDja2E~wgQ-+wtXl7ftBLC^;
zJ^HF2d*akLTz$XptHdm4lX91+ev^-%4|ASldagKoUo}_T>m&10m!5sM)OK5=%F??>
zx9Q&Ulu6k<LDC~{xw_@sd%KjqPTzAAmA%)#_4Ve8`k)Jaiyz#`+tPhuY45ysp=;xH
zKU-NGR(!{H@pVISoaKt8*V{@po?dw`$0XuDo8!-lo1NB$CavcfZ70-bcWm3YtD0l0
zESKh1i#+EylZ>Cf)9{+CF?CAWgEobp<mTvm(z`!;ztUQ%H}|Q?kqMiA{@}jZGh12q
zbKAKJwsi(x)?FUo?D=n0>_1lMwjuLh$;PG)u|Mll7BkzN_;=h=*(PnTz`t{LcANK^
z&ze8=QFn#Y<|V?mdtdWE_LvrM+t1JTL)ll+b3fvbMLnCi@ce%Uu3g8jU2~sWK6^@K
zqe|+`5D^K9W3qk52TYG<#Y@zw%X;2E`fKjny^9U|O9WSRi2W1j*e&pUC;K|%ON&0e
zusA5!{wSX3MIHB*W!raO&E4|)^d!|u7niV=@Yu!QRX?*>^5BGZwc4#aHvGuhuDDKj
z*}h$2Hpj$FlB$f|CNbWZxPL<CbENpK`A72QULMl!uI>#wrSmBIgI)Z$#nLu+gfH79
zZTJ!^?)c%hx7fb#AANd{PU77#Ex=%3&Ek@pQftE>*EX#9H91JkWb0Y;W3zZxn$DY<
zZ`xdQ$T}nHev$C}8QNmf8;bj?pY8n5@MgVWyszxN_GO-#&z`pAD@IH(RAIU_XTsjk
z(@gK2{h0Ua<bQ@sB^h6~*y<%FYbDzlOg(IoAEWSfjc1+Wt%{3#Ca2wc?9|N9C2&!|
zLvqK7Ade?<?U%b&?6lr3DfVT4%Xh0iL7CspIkRovEOSg@I9K`f$)SCZc1XL6D*sX6
zvvGH3$y$vp4(X?}EM2a1HqO~~%HqJkSHHt*&rN@%>lu;p-RXMW9p^IFbE3PZXc_rc
z_4EkF_O-6dn5DL2;vYxvFI|#Trk7<j1~y1pOq^bzQZM{?Ud3y}*&geHxlUd7z4GOF
zqx#Nizv~X?De)dS=gq&zu(8QX=1IxA@PH4!?{5Y9TBU94ozidQ?v`HUc}uB7=x+bn
z<9lm63)j|2T`7@&^IkejV`Kb@wbHKU6BT*q-(%~XI%CCSnWm~o8`u5O*Kgmm*Z<-9
z&bM1_)oOH)RIL;%&Uwsac}R4!#n0+V`=%^4x!Y?y+2_aoun+H6X6*i&sh9V*T)<3N
z#PatYotnn$mWlIzDs8W^Us&NCa7pjpse9K{wq)F#a))D%xVoZa?xzBS0=|1j+SmT6
zR!l!^CwFb}ho`L{vuC6#eTZHpP_A)nb-{^K$LD#a)>g`-XUZvjSe5x*%<$!h1Mjzs
zZxA#+5MX)dhW3@`%WQ3D^+yXld7Dys`j7EP*F(<hDwwW)3Ran;WTcfKXR~bL70-E$
zcSL05XJ1}?eUIjv7rptZABEmWZrX0p@P4^U*?$IOA+DdVj+{9Dx9xdjllIo_AFp@q
z;a;7$;aaYZldA7Z(FZpb!W1-wj+L!^{O+q=bJxl>|1Qo`xh7Q4_oLh`dUumc@tQS4
zX1NVhlO8Af6)?-sUY<4W$+gyH_trfB^4I)fdi%uv8}rq+hTA1`UwZV=zmjvRV^Hzj
zohQ^;u1}21+9!Ou=lehDYw1ciJ11BaO1=C2<jzWtg_i0CHsx#mg?<<xvoqW@%h&7K
ztusukf*A5*1$Tz}+eT?zk(<Ha!yv*Kv8%js%X`kOfLGyS^|`9ktSj>;=1CeK=6G6j
zOm^e<0QU<#VH^FfsRf4Jx%Z!;wKH|;?c=#QKAW~V`Lpor&)$-!rs<_6!1(6KyqoK~
zs@L;Y^hZwA|0=qF##DYq>rEaHoi{!2-*teG&&^M}>-rw|WvA}n_`a)P?<|M2x_e&L
z^v+?utFJkUQ9)n3XOeO7%?ghnvu=5NPZY_Nu}s@GvHOq_hqm&ZDZ$4)PJUUan{(!L
z)T4}j+(xg=qRx~pJXd$xSVLvv0iRO#%gxcpkJ$@u;g(o>A@|6&>mS$j8q{mCO1{)K
z;IS>>IKMYFV;}eI!{On=FReoNE#>B2R`YW*i^a)%MF;mku$lL0`}=?DKazdiE^l42
zY~m8GMZ!|2&aGkNl+-@(e8r!aw{A-xwa)6%mgl?w<9NW1Js)|d1v@Ienf#{gpToVo
z_7&}_8?S6UoltnRWS0M-ztIjm#qIfZa!oZ3=S@;FEb>>KIV<es<6Yb8t&VJJvKPL8
zxcs55-goEi1;zIBTEv)tBul<Oe@}VV!u1ux;eB`Zcb~oA@pf{~N{$H!bGUkHZWr%(
zzN~<+@R-KrvMV=t=ar;C`eKzLB<pnSo9CU5hu$TTV!@MSn4*<4WO!sgpBFtJ8}%wq
zZ-3^~4{xGUxGFQBIa*I{T7J5{_4vkf#V3y2$~8Zl-(F?A|6A<3`T5H_Ht`s}Ym{}k
zdw8Wqs-$Gt_qQ?gHrGE`S$cHOkIc$)&e?@iLnH%Lo-3*-KMOFtlK$G$?bREll3(W!
z*+$x&ej9Y{@e!q4uD7{8w@FO+d*=|hS7f{7)2iol(sz7lKW5MI!|M2N!!0YmEIk-3
z%_<;!lfQ-geE!}h!<c!yAI<Nn>YJUITVF9NwQW}K)7Z$Uj&;xYoaK#A>s+=_ZqMBz
zt2Mv%;Rm;En{V8U^<NtkTfe^RWz4A*n`wvjW4;{tHOo&cx+{3&!nHLnKWeMjxc+D0
z+IKy4%YLoKcP2>_qpg`w3p_G8an6sCU42gY;vY?)zcp<8Fzc20t-D9hPC2Zxt9D`b
zGp*ZQ`=>2V2tN0q_OR5a_aaN=g!*nreW>qTv`xVLbZWIs%^P;bvV}pGZ@2bKs%`&L
zf6M;Sx~^@XU+l^W_IR`V`S!V!#8PBq?5g?-mQ>FP%agh(>ACz_mH2`8eE-hLsa#E;
zemv^v)px6nI-hL6qNfshW96-K$r)ST?AK$T#reuV>sfuqeYOhzhf6>B^HsDxdUmhk
zV$iW?E@_H0-V0PZE15DcUcghqGH=Ts+v3Of`>K9LRlE+osM2IOeQT3SuiGCUp@vgu
zmiJG2P<p50eCVU|H=mt9&}I6b@lNLEIcf1*j=V2?Cfp!$S}~J7ezsQiqs>pR2R%32
zo_^-^;vZd~4{!S(B_y42Y5M1PDq<@-+)uY2pZP3(vEtW9%QjxhS@TwH!$;niSI?|k
zk)#zGIzymP`|0gh`{S0)estD7ZpWp?lm0U}ww1TJCD-QboQq(d%CmbWXW)TDOvdNe
z23*{dFQhwj*VUT6YS&zoR$Bf2z~?7Y<YuA6_=`EV(=PhXA-{J|rrW7}2;CC+GEP$e
z;UD#BygP)84A$>U*q3>yc<$aE=Vcyc*~x#5o4Y*k!=3djP4;Nt&Y4-LUiRcfU*UCy
z#^Y?;O`iTR&n`E5IqmZ+p#$zyE-jgO^O!W_jAKhvHFrE&X<K==B=DuZQ0`j2XA|f9
zU-r<Ll<^|bVU?#u>E8zv>IEhj*cxfAoBl^=v22N@rJmZ>8+Mv^4)R3kU28HfE_vz@
zbR)<^rEg|}z191Y{p=NH@7=avw-L@2x#Y7y^Hcs@xp>u1#wgX=3v)h%Zg8_oTN_;w
z?tESM!So|$^K&{{Ri@?}My&Jvdy)OwamCr}pVr(Jet5NU60h^aymg=MiDk;E9LeQo
zZn%B&=ZptW0}}Z7Rl<TZ*YdSWZ@#w0zEAL`P94j&Kf2kAUAgQ2c~_TAOi9>Xe(wFu
zVC#a&2IhNv;)BzFbgnw_PwK<nqZg8P=cy*G>#<a^yZgKFfaEd5bJ_Ry7(Uc*k`oJ`
ze<b*o@aw#zOLHA>D)4xQ-Pt&yMWBdV%<^^f<)$Ca#UJ*&UJ-hIIBMqheT`F-ypt|X
zSde?@jZETB>FqrqzZ_IZmtOP7==z&ESyD~i?b{!}Id56;ME?CT$>Mj#m$w#sS1yZY
z%++hISu20a>3j}@a&tpL;a7&=VQcqy?^Atc=KiKwrQw;urQ1JK+>DIMRs<E#`L0qN
z6FKcEr~5U1b3Q)Z+v^|wT(!SQ=hx={7e2*z%-_;}WW9)y-E`Bdk1c-g-*hSB(6%bc
zq=+j5R=o#)ebV0L-(9Ekqw(QtUG8tKmwEp#@sT?n9oh7{s=|rw#h;c5+nFs-B<*Ck
zJX`bhw|KVr{w@C*4qm;oW{>CJ=8we(tR}tK{(8kx(PLBB99pHeeRs8={FzDYjJI?f
zJdC%jyY)?9>{T4s<*l*K2kO*5+Mf8RH+k#2oJSio67DLke%F?LUdLZdS}w;U&@W(;
zv&MEWy_iW+i!X=HDNDcj{XfH&#vkGz-W^<a<^7-h#mA-JU0oX`F^SbuE4?$ha_U45
z-j23{N=b{CI`t2h?24P8oVz0OHFwgbB<qlkJ!cD!^t|(#reenC(BJp<=h<}?n-9<D
zc``lv!?&fiD_w3+IbK_^mP3ax{LR0ZLUWd{VYXAceq29lFRFOu9Zx*pJDn{vm4tMr
ziJ5IUu!+;}CFdlOr|10miodLV`LuIynNq}DlMDaaY_k6|u(E!5e>9%^#*6zB^3fks
zPF#w~yr;Uc<g)v$(_6d?(=7$>RLkqO*I8XZA7}cXp{Xx(AN!>*f7Or5Dg0+>S$fJ_
zD)!~J^uI<1#nPKRwH#$maj*+{@NwQ^7ya}7@T2uY_u@^bO-=u1d75=n_VSn$<^}sd
zU+AmMNx#tb<vnkO@{#cO+V{NJZ>1b|m0fA@#%80j@s{Sif*o=5D_5sZywvtd=(y)<
zle)=2+W&DCKAz9-|Lr{U4b#;&(z)y2=bPIZPr9GpD9ZOHwXsa5aNgF>{eAx#a_zh0
zCBA&i-*S9m)^wh>cfZ|xA7uB=sr%?rcDuPL$ko2x-|}*O>V1hHn-0bLAByrR|9EWn
z+~{Jj`*%Z6{A9CWpHqIcw*0r<zZ2nhW)~Ljt>=q<x#8AM&&PYWS7-JdRz2+YN_6rv
z`Jy(NmCMarmtGF=TYYu@eDir0KiUreR?BrPx8yCf-rZiiB=^3~noEi8iPslC26?td
z{m0oyyrwq(Cf7dPN<P)#s<dU&q6eEkv0aV5>-Ii*p7yu<2mdo{*nar;Be%_qkFPkk
zdgGGqoyuJPVQJ^0o13`h?w9TB`w;#{k^j(quGd!m2YZe3#j^4e=G}MSzw487n|WF0
z<F+TR#;!`jQ#%hta&T>Gl}Qb^ST=Q%o&{fSUY%m*e};|okH`zI;jGNqc0KsO=G%At
zIXpZHBG$b(U~;qjEpYa-!u6eh)c$t<aZcKP%l(Kwf834poI=}Hb2LSBcZhD>n>MxE
z>9B%H(4yx*B(JOOFScWg{2_d7p3Jmo2YeT0eG})DecO9SXZyCJ<<r{&3nv&k-c)J}
zZg6ws{1tcq&^(TOp4bZGqh-kv7xg&BHCIlpxTP+k6kNtXXG#5OBUz3&R()DCkE~r}
zmE78NajpN!c*cK6=gDsGG+A<C?YrD3w^b&_u!O2k`EoLiwc&YoaRbLO?fd_v{~f6l
z`OuXWr~V^4x2)8(^WXW0uWwJ3ZJ*~+s1jt7r*!{2N6ZJlkhFcreiVOL{;<AjtMv09
z*^j*UCLf-*&F5nVFUOvWd4{|HsebZSvI%@{*wMXr7w^9KX^Yucez^bE`@`-dQD>&v
zi81?Lty!q^%k_hYX=sqyk~WURl^b`mxSRN^<Th_T$7l0v#__<L#*0iW%fj7{-DAE~
z;@=^s`k$di{t;X2iWmFzyenn5@H(l7C`xC3TF0y-t|`Yd`$7-XP6iqI^pE0id_VLb
zjS_v{ZsWPgwLI5SC{}XLOm{}NyUV$cGvqP!-F^MqR{8j@wjI}hg?DZFJ|X7d(_8mk
zgsi(Oo=OzT9`h7RC~P~SB6KIbDJ%D5_MxgbQt8d5J4(;<dT|+C-4`3|-Fy6er%ER8
zE#Z^;N><y?^c-$HZxi$AXO7T9@m2O#TjYPJUEBEK{jsyzAAZN}yi#MxK3nIO?3=or
zhh6fTi8I+}oZvH-IGrwO@%qX6-&QqxKNhdO|3mkW<9`N@dE0Y*wp-ck3eLQ~Qt(B@
z-KNXUTi#Y&y;7pCZ2F6L<-Z&9Jfe9vR{NB!zAapG`sv-jJsnSa&r8SbR#s!<7T~iu
zmVM%%Lfxf%Odr>GZ#iL;zA&<4O2%|f-M$6W-J*ARC~)RJ{d8dp!=F<}9VL0+U*+-j
z7PK<lwtK!p#r1C{KMEga8?j8cTDNHSp3YLAO~=g+Id3{~Q7m@(L<#mCYWs@B=2`xT
z&dpx^L+Z=xUA2eYuHTaVwf5?@nMKEQPA<<XI4ZeklVe-=`R!e~JB6C6>Snz9)qXTO
z`sW^pi|dc@vq|>ec3-rnDsOEvpM${3gurQ^l(;)pJujs&h;#)N?OSLz|ADR8KiQ)H
z48N`YGn$U9UE#IKFD!8G>PhGN7Hqq`xj%4n_}A`NGpBESdO!Hn=Y#V_>WpgKud83O
zQ8tpkZNsm{9-+6O{M@x$Ham@e*qfhfV2)oFCErk!{#f&it@pQ{3va(h_w(5V-N-6W
zt>5xk&*?wI;?o;tk6WbPo#uO!MXo0Kar{yJ8~Y-3OZhuC#?QVh=N@fa@7?EZecSxF
z|F+%7pRW_2;kE1Jg@vLI?9Bf&G;NLkk@YFo`dj6t9MiR0x9+-BHI$p5`k~N0+fq!#
z`P1aN@8`%d9xGgVK2Y1`#o~-?vAQ+M-@1OJeg5OSyH8&HM`m24XpL#gHLIl)Uh#ap
zE)-*Wkh{Sv_Z+uO?XBO=hpXJ%{#fcx{j;n6=DT}r^S^&O@+p6!@h(SA?Y`!BbIc3l
zPn_?rf3WU9!`5>Xlk-<(#?|~<v&rq%x9frtncr4DXNtb=u|!kCg1sPNzhRMxa7_O3
z^SAoH&Hd5;=&bnBc)=RQ2fO)&JbCwo&oldQZGW-qBS&f3ZPUXpEZtL{vs`bX--RWc
zrs_Dhx2=>cI&*c$DVy8!SLKiVXK4G+z+|VEW%ldXLeqEskF=v(C+X(9@9aD0@uW32
zbjc%&v@oYrzZ>uD;d3pRFZiD!GdKLeuTAmG+h)go;Oz-~d-Y57;T5sbF>~(~?7Z}-
zHMLJiE6Gu3>C8<h8dCl<SpPHpG5urs;aj$A?;p*LdLPK@eY`N=elpv^GdT{E$~uhZ
zF$SM}Ec#+UzkSC1u6^?RwqDtzzSeHOmh+bLQd`gT&D58vOF7!D%w!a0(|n#GY&E-f
z#>t4K*Mom)e{er0&;R4S@7Aj}+_IN%Wo@Y37^5ZHoYLM_d$x6gKoNIdd~(!3<@Q5X
zZ?A~|Q~c;-_G{a$W!J7{+q%q*GClX=o~2lJdBUCCoeg~v`OfX~Q$B9*`e&B$vHp<Z
zs#j8Sd%1pIoPB!cyEkgnJPzdFVcMAR=XjNt$4(vIYVnpW@?B<9iu-=dmEGR{sI~62
z-QvPR?r5Q<E=8`&8zwfYYi&}tI4OGEN^`fZ<l1}BUxxhCy=*66k#*?$qpg3ZuKAo6
z((dQVm^-&g`DEu)k2yVx+}hffw;Ed`uI<yTNV@OpYpRr-TI9R;jQFHeE$k-(r3Ies
zbUYEWY7P@?P3e+~+Yk0Po(bEhd*%5@-lsRjPO=326nHRk_nXgmIXJ>fV}J0ioxqV8
zQ?~G<_`y1X3sKh(SjF~DUg2xAE<AFA-}#*<xN|moY@CxgHMHZnbU^d0xU+xPdQ6To
zsk+{6;;~?^^tYO;iQ6ydEbxdvwEe>xHq}n2CDW#NEDG*hv&s0$V^*v1bMtI}bgqod
zG(7uJa?yo{lb+s-NS%JVwB#peN8ao@50;-^Mf?ugC${eI{m&rr)#0A#{-%GQ9tC~!
z%w2Y1+QheMw_2r)7GCLjE^k)ESFzsUqwo78+%wg>k442Uxb*40>b~VAo4jT!Xhh!8
zUcgYZ%K7`x9qV3&$oOSV4!SF96ZkvfkM68P`79ONuDw4tEij!SnkB=H{k-Uv_rlNB
zn-<Qf)fNx@aqic#e%AE|vvnu0-7xjxRjIHmlZ*bePM9d&#K=`}>c)e4TZ8@oPQ832
zs`u!BhPL<5OSX4-m~<Bk?vUP>{PeuB(o}^90-Um+W7qb#ztPE0_^@nxVs83scexvD
zzgFtqdzcnbxVwl$b_V~Hg<9@K73-G1xwIv2x#_$&KgE6b|2X=Q@7pVT(L48!mWv*Y
ze7xPgKiz3zpxL5b6DLo}>3eRu>T(6srF)m&>30boEaG5^nf6J&u&H=U&6)6hB62rO
zzx-SLD8FOZx0&W`HR)-2I?GFXTNj(I{j`upT<y-fx69}2G%(HMJjQ>1pWYAI^{ytF
zOYYvj8>y40()HcYV@2_#$MSYhPuyWE{_(gxNcWcCy_T#BxycXgS?<Qi|CoKas`2Xg
zhSm8T5zjfq(>$jfW3yD;Ce!EU8`1r(=XwoyweX8?-iu<~goMAfO?vvBDb%ScNX$PV
zi9vXN)yMh5-b;Vfz00*b9J_n#>@vIK39Yh+<QOXX{;n$C+4T0{i>rC(kMlm-se3u%
zqUu$#>rag=^>vB_oIO4sTd}s)reU$<Ipf&<VL_Xxt>`QLFh8{-`rGk~`xIVsK6o#8
zuza~cCok){W(jW1!Y#)O^IDT~c=kOyyd!YOgI~*fAN^+#&)no$xa2%{=C!VM(=&x!
zwf-}R$=$8_DcK?M)Zw`G=F5-H>Obu7Gd*o-+AF1L8f$g8zC1JM)iT-BPamJ^me+XQ
zeDZkJmCOGGDxM$SuATkR*Q-`JiZ5C%CDJSR?qngozdMh4FJt;Q<8Rcgy2l%{@~%z%
z`l;?p{fDlT-{y11#horSNYl#;I;(R0ton(6$)e{iG7j1#uT8pBcPXm&?5|rtKFP|R
zd_Pey?6Y&)%!NXIVx?1RHf#K6h<sXmZm0H%PxnP@^gi16d^x!6kDpcA#yW}mWiRi)
zxGZEi?VQ=<`R{nrw`KRsGyF+h5@Y+krKEO)lVHkRMRD<sC-xsYmUO48)m43|i^k=x
z^PYK?RZ0C*xo8?&<neVq@2gKgE_?6Ukr(*y!jqm=n@(%*s(bVO!0o=N#okvHKlE+e
zE~kA(XU(3Qf<l)biv0_C#a!Ub685w1!_<O`v&B()^B+&ypJ_7tuY1rGfeU+gZA`eS
zWv&qBqJ1tP`LgJ%U;dr@Bz`pe<+49E{oA_d)f1O*PM&&w;nOm5r##R6eMG=;p2hP;
zYp>*7z1TH*@4Kpd>wmlbG5V-Bm&eZL((+yh?)+8v4vQX$w658>WkzuS&&)lHll<7S
zJ3q=zf5aQ?P@DU8##UR|e?iwS=lahm?ohfZ$L~MAr>~(oWcmaC_SuIGUdsv3vX|Ss
zCGl~W_vECm-UDX@S9_EvGoLm5^7_`EBQ>rc=S|NqUXpP+x}x;KBt_G;djyYb8*O8f
zw@sOPs&KkW0pszkXUpB>KfV6=Z(XKV?^=JK4_E#(2->I$XG!_3PhFh(Q%`Ys#U=4@
zhPmHX@11#@Ig?9b&V%dKsgKv+JRERc$MkRD@{6SzF+SU`g?);O_AC%-Sa?Hnf?QoH
zv%=iF*;6mnBrd5q?Auvq@gsHO!VaVCjz`x%o;azywdq~zgOpSbi(7_grR$kq8dOxh
z4!xKkAG3W^aecaI!{*=KyOZ;8rOYk}W#Qp%bwAs;V`<R!Enm_$mPN@uFMf1i_D8bs
zzq>zbm)>$+vO~yy#Y>&(pXM2rpEoFHkt<tOP}Mhe{saA6&X02MUcHi=S^G#<>AS8@
z)P?)Y*DTJ9@GZJ{T=1Vz$TFh><D)h03v0YS>NlDCIz2vAZDXlZzkeQQxyhz&?*bo9
z;pp?X3~>s#sGGX;(SHWH8oeLy6hHiD=t<mNy{_(fdCGQPh9b6S)w!2cB9&WzUS^)8
z>DBCgzi;lZDa&r(`E69+BhO;vyKJtp$JK`)+!o55*dCVj%X+QpooPY3y_YHzcOKN-
z8NOfQy!s<~@t5+v$@9*AKJ-ah<Zk+!I4@J}%=vBipSVADVq;+3eDL|&y82i9S@#4k
z$SVIXb@cDX%Wn^KrpFtVeJYS=x@YkA8DEe1(-%dI3RT|^EKbi(tk_kyv$8gciEZ0F
z*X`X#DQw<lch$rtbaz%BD-N_WXsNwk9C7-@cVGE$i$7*NeY1Lcwr^!>xny64xSFCw
zkeOTVJ@X#pWZlU<May=cbv`0~t4DLiALVK9J$G!A%MqKt?z7t@KAYW@e#|Q@k3F2g
zDRHzmbWz=zf**YxYyU~bMpo2^_lUEuUA+79x|BE(+aq3Yc6Z7fZM%BT>iYHl%r)X`
zGcRp#_@`ZCZ6|Zx<cCmpY+yuIRP3$YMHga{&+x22=*jkAx%I}&vqCkGzFru()VkcB
zZ|iFLj;M3n^D`g$21L~^J#~<ENs*ReQKh)>gynaWU-mG@oi%^+aqa!v$Cvy#cj(kt
z<r$tl*B^QBoE3bkW05tdig4qWc{`6s{oVbe{gM66w#Nr=wYUE>Sk}Jg<+Y23d$vza
z+7aY_Z(@+_yGfcV$rapJlJ*;}|Id(Bf3y7I@ix<Z{(tAEPv36NZG0y(GJDe<=al^l
zY!>PbzS?elkx6<D8!ZwqWcmv|T@reFrQ1ofn$3^mZ@zwXzxB)4kG#EiqUH$wIlas)
zd0Xz<Ih7elD`Xi`Sw8GkUq3yTd#}Fh)>>zm@>yRCzJ2f8rpD8=V#+pE75P0P1s1$9
zpkayZ`JHkaA9<|eyVtHYNtw|ax~cO~<J}no_tJdM?rv3_F|X=#e147UkLZW>ol!pX
z<bTZ0|Ifgw60kF=KV4_GV55civYB%1ZohZOPIWkGH}}t_mb`N%ldI-iIR7^J(S3Z|
z{Pd5h>*lL`<k7sGTv*<GUYw`k?g2iwDu%4B)BgzHezd)H?w{Z#f9&eTGtVt@6T5U$
z_v&uOy?;)mlt*?*+)-kA-moD2)$@b$t@6D4m?}R1)4VTrzI4Hz+g_71s&3!*wF&oH
zl_2)r@RZ~y<BnyClN|3^h+aPbpMllvgM6Fm(;wxJbmfo8G40Geb<A{iVQRkS?VY}R
zzVWKgIofCW`HA}6BVX1e_U3!2X$Je=oiAD=^>@lX$(r;JwO7AS{5$Vf&7))gE_s_r
z??~s8IFhqxvnG>y@Pr*tQkpLx{by2lq@Jy$GT7%wy59Q4RogDA6p73dOH1tCw(e8R
zq3CySg*vXt?<k!3z5aOpt@Z=|8ANTA>mRO{&JO2Z{3@IKY;khcujG|Z>?d_+FFAa}
zdQ1A{b@sZY?`7}(NUr*$^Ks_K)Rx@;405yX2vr_ZxZTk9<!xV`fn-F};r%gp)x+Y&
z+Dw(E)LuSVr&wb&`=HfC-@5GIt4r>!+bEdLwW;8=+TAxE=dHJCK7ScCpDS;VaB9u1
z5{_*v8$Y!ss#K_~Hkva%$d6OE!S8Wg{zv~u{M|K<t366%LrYqx?4GeEVOq@Q$={ch
z-IO?-ob^G3@tje1#;(@oZ94z%KP>$nvm*Yl)&tICDiTRm3XJ>P8H-<E+w0-vXTJAL
zs_0_71Dk%xFZj`?{?Wd9tN#!8(q+CMPv#fAWqbGRp=g|qT#N9$x)<wSM}8>1H}^sJ
zOFNDDi0tsPW<8T`_1!x@dG+>PXx@{OvW?UE!11gf0e^yjOfF4%eq_2~mY{Kq+a$N!
z0(To0v7~YtRVo=-o^!2bf4E|g`=hnOejn32Qh&?euGz>qbK0qM=8{?~jg5`veuOEj
zcRdN;xqA7+Q;zu`%6?tT-YXx?_DE#{M{2${^W5ieo`y2A6fBwcMf60>k9>zow<^x9
zHk)*0rT=CRAu*i-Zs+gO1+qKWFW39W{UbbXXY_xDj!m~>e4nXL`}S$d#JQF{ss|%u
ztsnYJoLAauFO`}3@U7GHh!0=)^%tkDSo_2;rSD}RpUlsmNIu7tDl3>3c)s5BU)b~V
zcJPUkFW0}=K4o2cbhdKd%#=^(93^#S8e{ntK5(3uUEOufPBHVt`z^sL_X^G(YD}{B
z|7f%G#JA8DruSuQ%&wZuT)%YFynA2$bZt75c7$2C{W(#**YLZ|HVONRM>}H8j~G_;
zz0H09<!H3XOr=TXX`c)3NQ$~$xXq~Y=jLNB&vhLK_ok$t&F$UsWv|iGv&W{Vip{i4
zEuC7dpwRQDDe0iQP3{SWuWQc6y*?Hvm^nM9S1(tAb@{Y=9#1*;Or0!fDPj4Xx#!WU
z=nB1O=bm}*ExPe~SD2hd?zC?aHfx@rPXBaa^MiWEq~$x;^7B?WAAZks>E?~-pSv=I
z(%d|bWE`KSsd%gM#qo)k_giJmYuxwTWWM0!qZhbi<(<6mOj4fpWXBEvk7c)ZKJ}m3
ze2npBKtI!uRj-a{3P%0RlhJKi*fS$Yx^kjO!h>8c58kuo;z2iF&zjMEI4OItYf6aW
zEw*{aH+GwG6)-;jAh&gG*{r`UhB2NiB9Al6Y?-Jy>*<W1O)RGxkIOvYv3TYi&KsZq
zGw|H_VSRXefUoSF3$ZCDHr-uqdB;<|*g)p_kEsp^&X!xv@BAnGW8PckE2_Kq?kn7V
z=5qMivf@cBeQy*G{`)-1eZ$&bF<qla&)<p*#by;-v1nI4S*2aV$$rQ2^*@`iqtE&m
zM7-Pm@3Nh2#?PRGL5zEn)9!JtWNBisby)KBDj)CXm`5e@{58S5E~U47Ow66esUjD8
z>8Q<Zv&p;E!V;b{x9V@V-FWi(e78$)^{@XE=G@AeFS45b%Ir*rqTNo7LUPqiZiW-%
z<7>=5obNRK&#?JUynFuY%mwmaZVT}pk=JJPoTX#`z1(R1!d0{0tzMXQ%l(_hj!RGb
zu3lZzCldYgaPg-tJr5m@v%3BB{I(`GJFj<6{>o4HJO3CavUsk#b0$ZzV|w^!#+I4x
z(hrND?0a`ZdUq4&*}}4GxBfnu<ZUg#^?-2JD}!Svg(op8pDg=qwBuw-n(TqIwXSP_
z=pWeiuf4SVVXoe7zg?S;JeY9L|IASbmz*`xGh`BK-&tR0UlM<p-;7`Q##xQ69GqLY
zwO867N#@--T~bBk<d?OIPkb$w%lgY)$tjuZ_AqJB)ul6g5>xyA?=_iePu?5xv-^gD
z278@V_=b#I;Z3@4r=351T~{VRp~dI2=2X55GD{jm8aypz9bWlqul?w{Z1zfp-jXR3
zSdQ*J`qDeCGo~n{*gnrL@Lh%I(+@S8%>lDi_Rh17^f-M~v!dqQ4z`RBv4uAee9sB>
zie;HHYj?6rv(JYw3u{;(>2L9Smptj@W<@S5ZBbR}azC%n(ck4Pf1FQc+3+gp)(b&n
z{(Bz1Hk;<;S_exUjDMeZ`)9cM;yZB_Mlav8O_rN0=G8IHUN<!4sY_AQtDEn)o;;rK
zx6Z%opFF4B-16nNM~*ODkl1se_=N%2_TLUqz8-a+l<wVn+K&B0+Vr(9+wJuC_zND^
zS(dvmXtj1qfuz^egHIY3ls($JJLpI4BYxi7Cm+3M&$23=yN2;bgm2#JPwMyX{5)+|
z#e3X#^?_Wa9oKnwE!{R>z4ZyR*+1Vq^YSYHGeop7gnaOOJg<6QR&HRatkkQkU*DSL
zdYLl#7hG1}l(@-E<EQlP;*`SokzTqRi*47HRJ9*_-x27mH#zg+O}+K{5!x!|yedHg
z2PQqyU}RKis9W$P+<a+;@X>vydn3R8t~I*+UT9m9k%<pq{k7>2JAOKS-0{I6d++6c
z>VFLSeRAz0k~j4-8mT-#$+LXjgS8Fydz-sH{dJH3QK)++xJE11OS?1W=hMqqPBO$5
zN$kAY*k9-8_}1^*3$xz)Khn)Es>S*{Zf=g-86Xup%~@skZl)bv4(|*cY^%b<vp=do
z{NBEH-`U5#oFx@5`P@1mY8TztDLQJF%ADS_jp0ex=kvmu{~3gXuElyi58Ku6Q_d~_
ztt4l%HDeR^L$|8uyyq;|=C@s_U{lLBF8l6Zb}#pi@W#)4R;<E#hx3#tESc}@_5FU}
zz1PkyAAO%U{YkF=Hoy6w=w2gr>1%FHcLNgG+Uw8n{=0DVa%P!JS@k?yf6ukax@U9U
zRQfl=L9w%Hx|57Q{ha?=x{O28cCYsBn&^k!*_!YE`097&mQ+`W2G-p!yVe(YtZd@;
zlL~xudY&(H<DdJV;n3mT(+{7S<u*Ng<+H$lGo@|p;!lMev#M6S@;GQy*q3$X?i!cL
zFDi3>t^cF2>T`v;M=h%=gYi3KuOBa`J#}YinfUs=(q>cHq~k~Ov#vXC<$TsCm+3U)
zuH>egJ%^R^4=CI4eDdmgmE+}I{p~-4mG{n+z<n&Cg7d0a3nDZv8RnF%Uc_OlaqHHp
z8<~?%c>SDq%+C9JqSCU<^TUqs&F9Wfp0}j*&V%D^O7&`%OG-G;PdaSL@YGRK;<$r$
z-sPj$=gDuIWV(^#-5Tk)tj8SAF=!O*IOi@~B~{m-z4lemX&s&IWgmqmnQk&Ya^ir1
zeen*th@#sYjOWcQSij)<m)(>9?$r?sJiTR8jQ*_K(JO8(X`Xx|S?=m$uPBeR);X%z
zyC3biob#VyTa0IFuH4<03GZ&6n&h20BUw^;-kz{~%>@(hnQeWbHuHUQ$Rvf-QbC!A
zH@B^m<WLYOC@`EOb!yk_Lzm8R-JZEo>P^L_jX6)|xK23zIYn-#t$)=d(<@s~e>QQt
z_UV%7soS?aCQflX=5%Z^V|(qtJJ*U9?aC+*o*iX;!^GF?Kf}>qt8Ujgew4}hSoh50
zai4k6({}DHjC$-oyBaSSyr>O6GN0oQ^8%Hs{)YE)m!53ev7@@;YD(J4bRKS&pA8bS
z2W>ycng3nBIR1t#|KWdfJFls4F;e-i)0@k|z?PD9FycYs4xV(0N87*nH~-VPT4U8)
zci4OTodwROXC~?#NqO6?c(>1Zj?&84yEaV`J+r<x;Pw3utG8=!Tq@1()=dkQ5Su8v
zb$Vm(4Iky)hYiPV|7M?=edN||!~7raU)j!EeoC_Z&v5+p?v7hEHlN>qjpvD4dgP4k
zx(4H2+NI3$nkT-h?sz$CrTWpetSTwK&I&?|V&^P=iJthAS#5W8Rr$5!|1bWL`{Df2
z{@8r3^`-AcGfv8+N9}XzXeiUV=_>JABv;w`+#NZ)s9)BBAJ-qZ@7pL*Q=DYuSawEb
z``(?Mi90%%oIkT>hZg5KgVht~ElAoo`|3Z|jIuhVEtgGJ&)9OhR#?bv*6f%wJu@<{
z-ktuv%dI?h(~&31v#$N9|5*Nz_3FFD3t#>c{kv~7i{q{9L8)6Z!t4ypw%ttn*;kf-
zx+EujrA<icn&je@!ISfzAKN~E^Yx>rwLh--@%Zp{|0SmmF4?iEbNS2y!|C_d6wZId
z@Sv1w-}Mjre}oTxdgj0FeDVs@J(1ZN&u%3Z6gW=#_sUrEyiJ>}f%c3446XAe>{Naf
z2W_0YR#EJG>pE%wCesO%>>Ok!PWkozyc27!t9|QMd6^#*?bK@|KZg91ytY0iLw}F`
zTCrW*cd=+Ha!fY-d*Sq!+?Y>`EoDSEOHB-mQqGE~cvn-s^gqKv{V)C<Qn&5aK6!cY
zKtj_iRgNRAb|D@-9jmG<d)Vr7X8kgH|IKmwx5y7=t%V=i9d}(X(Jp2Be#DGZeq#3L
z`t>{8E9b0?i*jKVmw6C=c^CWf{|qfs;vH%q)H`f~CRH?h`F<}G`_ZFTVAQYBt9nAY
z?pjVt3X^NC;)D0MrXRk?yX)Wii;BNPm!5u?q1Q6q$>IKM{u2_+x7i!tS*$k}>|d>I
zv3uTBj@7?UJhc<~!|@~g(d=k@nF`rly)Cns94Y_iD>G?_V{7WHn4Wn{da77OzliPr
zt?|eD$L@y*m;UkceyekESFU;Rrl||&u`zHw(c<WHW9I$5cyUR}y6BjX{+*`h*)yMi
zi`l#J!_=?S=c-uoOo*1XdSCpGDN%}Z(dj-jgBU|yNzs)L*UMD=XLzLAoh>h*5YO@I
zJHLtlGQXsT6W<;zw%r)p_&E7<o`c^dt0vaUODnbde#_dOo>;72F#qAX?%!55Cb7|v
z?e^VMyx4m9sNBlzM4OMbU9R#k%|ALm%Sn+G+Vqg)aBiH#>5uJig+KfgsZD<P_UgLj
z*%m!(&#qZ7vCHM$^`NC(jn`LCV3fIfd%e()?t`B#F20Yet_$)m37>a&i3X=z&x)WQ
z|GxP@JX%*?<MtzX&8rPr6Ka?)m;7houjmh(s{d|{p5UcRkrE<zg${+O&I@5zNl9m&
zFzfQo`;Ts%E!tYQeA%C<{|rt2e~dTokdyhbZC3N_naZE@YiujFiTiCZC=}Sm;-PGD
zQ(gMw?k1}m&Gj`kKQ^!Vu{!Ky^{Ydl4`qG!PhRnEitZ9!wI|zl{&qImB$1rZmN@Bm
zxd7+U%JuDatUvA_y{EhX!}*Rq=H-iDiv{LS5|3=M%voV@@~KXcruw8chJPHSez`v^
zKRCDk;hN8JuU0bl-7-+`ofSSo{6J(%piaY7dyOO6^V%)eop|{2c!aTO=$rFFKXm?C
ze=M7s`B+!)ec<&qPo~_t9TR!#81H8W=f%e=Y8P|8;b&kxTi5iW>Ug`2<D*)s=f};$
z{Oc2CR_9i0xfZMFsy)=0;NrBxQuRsC>Xbh(uKs-g(4X}W*N6H2&p-M%=;wXW{^7mm
zn%HC;tK2W247D5*TPN80y<KeiG-`$VTjs~I#z(pzSk}nrKK$#IZm?#%@!rpZa}U2s
z^SEYyXJ?Ylk~)i+PnKGjf~vDJ&ujl)^H=cdyMKl+s$N{yU#IrbZhEnjXJ+ZrMUGmB
z;^pF}GOaOJNdDd`W%<ZSa$y2@Sladvmyg&fe(Z{R876=8*X$FDeYfttUA%V+i)x7Z
zdzGnIYHsuR7+%~s=i@Ec_ir^8oenFB%uU(m-PV-2>ts^NPoLST5sT|MB$ynpOpLNq
zy}XD0(YEH84}EKM7ya0l-Z6Q3%%0xj?eDugPP@y#S|QE+R8QHVQ2CR#_9-jrW%E})
zxG!d({MY=^zol%OKL(xh_D#BTH1F0Pq1tIhfuBC^3=KNkkdR!WW%(f7l>g1whw;sq
zV}C3TzWm5eK3p|FEOcj~(3i=llRA&NJ(haM!;w&ReO-<J$GEv47Q6NPel&giZ%0pE
zg)WOX<Ae{%!h3pZJ)I}9TbO?M-nl=gU!X!fXkwlCk7U0s+iKV91pBI77k1V9^SWWx
ziikgplcqfoK6teBa`5~QUoE4zt@)MuPxob!b^Rg!VjW(d6BE6ZZa<xT>OaHklyDZ=
z!)Xurc{tBjsvnKcXRp}xv~<1fe}=Rl#nGH9VgD38-{$J)8BSWMyF)dNr@*5iM6SZZ
z^mEF7`St%9GPupQeVDhsc43^B1nA0%8OlvIOdRpbEat%z94()Vep1-@W3~MJC0Q4F
zmF_0b5>~x((B(w*^Sj4V+!E(5^-g(idYwo2`^ClcN-G1?zcu{e{n&Th?ee3KEpKi2
zEU%7@n%ZUDe*XN1Gy4+Rl_wsw`L=#)seS7`jSt?pD%xH5Zs^nQH&EHgKJO`CmDjo>
zZ5Fnoo-&X2z4^d@wEKSRt(2(TbL)QHn`v<K@4RWJRrloH|EpHUWZdV#(8DKwecwg#
zhk9E@cAY=$Ev<S@#V&K}RmR#G5BE&beLD46Wx(NEd$}T3Uhda<Tzco(6w7_$$q!?l
z56h{4e6?=!0>MJn%^GQ&jTlwdpMSr2LSOVYkH=llzRKSWf2_Oo&$LS~#MUY&)_mL3
zW^u5%fqy0Yv@d^*<1=5~7yMImYgI+ivyW@@b8jvZ+je2sF{LT&_f`v7pP9?(=XTHG
z{qp5M4nGQS;@JPO#_YNGRGXDbS5iFGPW4RVd0zDK<}uq%*&dHp>9^{7mL%Qs`EmN;
z^d_792i&_Ss(#&KmZ|LYZ6dQtnyYlgvEzMKOnV*KC&p*hur(iy%8dMDSJKU!^ei$p
zqBL~o<4M7d+f=wFDqDQ9uq~T>v{?J$e}>k7%2$FTFMhSxIu|l=-l_Z3gf{bt@;Mzd
z;ILpYzsD|m_<oj|o%mJ0sjDioPih&o2ko4AJ<l=xHrJBe<|c-Toi7|-2L`$=>vpqC
zmzDhX_x$nsx3pdN*7Ln8E6O~`nbF!A@%E14F~LO)8{<|<)bHW15B{M3mi^=FhkIMD
z?bD8U|Hp8p@y{}=m2DBzjJi1b&lDRltUSrNUH8<ZecT_WAKl;a<m4jH%D>yQ4kxW~
zjB;>1T$wBRSy^^}<-8jT#c_>=zwORHy8mNEovg{X?f1=e)=RuEvaHjSFq%`M*!7)V
z^tg>l{z=n(=d9wgXYSYS<bL#jSoA%7T0VEy%FM(nxm&RYZ(Pz@te1Eetvj)xz-Dd3
zH`(m7HiaJ_$9{Ob_T<Gs#>q>Z_1_8oii~=D><+`(seQ6X(it?BnP0|hX5R{HeYiJp
zi+o3JWo^+h6AzQ$ft}rUW;$z}jPo9IdD=&Par?XU3xB(nPvM=63$ZM_e_Or$Zobm?
z?Uumjh10~G0>3|CoE~_$T{N5X)OEELE5q_@`4`)WK9;{_9KCt>)sk)duIuE7+>*F=
z`^`oLr^Pk765A8bm}>~GPQJdh)c(U#Q;B?&+uGb$E*)EJWqWn$m4$jX2U<3{E9WJJ
zlqVeTX`J<Qd*qM5#UCee<kv}8+<JA(h5g*cRJJ>c+&x<g8rW^v@4Tv)`lRhIRTFhF
zZPKT2@6MfL-fMTcs^N^;17V>Df*adUz5Fb<Q{h2ZbN&X)mkYnw9`D>I^&>v6PqsMf
z>ek&qo&}18Z9K8^86TgX%BLF*Mn%j`Y}L;;Y_-2V`{1VRZ`1y%f4Dm5blw5S;_}jG
zar}m6?}N8EE8L!NN@h;+<XJzH57mqA34UbHclzPmV85$1)oE`o9BTF{ow8ZBCF-n3
z=hL2@Ts2z~Bpz4jc6~X|`p5dimu-c&Dzpz3`LA*>NZz&a+S1u?&AtovoaxP#bV&=a
z2vcTXaaP?){?oT7#hy7Oc6O5=^&egFZja}O^+(Lh%{n#pQ-$5rj+*_w$~EEriDMUj
z-r;kW`=`3LM*7F`N48G)k5p~)mf7d0RQbds@4^n2KWCJ3^!ToZe6xHq|5AL@EwPOs
z<?dy3B;;z{l62|XRg>tG8rapDCLN(sBgXQ{?b7nKwcV+|b^qvpJT}k&m`NA+lF(14
zUzq)OyE*TWee=L*@xx8)+y1=}wU7Gd9r)W~`^q1gsUMUd>34nc_;Ow}Iyz3}-PwE%
zqv$(Ngg<NBU9mXNP+fXrO~-$RH2&^?Y?t0{wdblxd-dKgEUofcpZDpuve%m!TV5Es
zna}t8`j_{`KFQrb{2$1M9}|8ZT=9ufTPOL@#dotxlzCOY{b$G!T(gtCm_6bg+Yz>X
zK_AuMeti(jf4E%E;z#^~qiMURU2@+a8TR_@jp$R=71vD5UF9u5%kQwXEn426@1Z^G
z%3`?{Kb}80{^s{b_G7`ByOy__-rOp|@+tZ}%SPKN2Aj-|2TC26OX-+<Zgz~~?;~>B
zZ*#-HiGIl2YqRO~GhVxYGAHxv6PCm*=3A*eNh-i1O=pJff%S7s>TfR&{xS1uhMehT
zm95?@T`%taux8TDd(H+diaR>w^->e;UQfNla6(=5OL=Qay@W*4N4=SkEVk;hNj%*-
z?dO!pS7mRv7jy6E<S8(2YWU=Ts%mP~k~!-)+N|CgRNr`u|4=@2=C1bcp#Ka<51o4<
zxqi!S*6Qwvdyd;O6Zv;%JrOJEogzQuVdktk_xVk0_2PwVjIJHqD-u1mb>YONT>-y6
zCK+#k7JStwdEzncD>dSe_L@h`v<ZHoy}MpuOQ5#xN$Yu6m~MPF-{P`C@~4vwAJ^o#
z#z*mde=OP$f48%_vZ(3&k@9PkRAx<^m@R#h#r2@juH(<$9!%J?M>)Ut#)@yB_U)Q%
zWter>|BS!vt%~N*k3Lnt@22aBU49#(_h$K2y)z3PKgZp>b82^^WD<w=yn>4L(``b3
z>;G~7?f>n4<5n}Pyz)(6OP6%Te27wIF|$0GVsT#K%ld0)1OHk6&^wkd@T1zV{aBRA
zZI!O-V43hho>gtL?k5?Y;Lg)oxnYHlXqDWm!UcZ}DoxKzyb7xd*<7=pPr1v%;b)8M
zlrwJ_&$(0_Gdx;y@#v>lGv~a}6?T8<-(DwP@!Rcs%8rfGidRIQSQ2M)Zg!EmL88!+
zbItZzf}1xoe2n+W6#u6&%k$ly;^ppZOxnClu9k#E=v}iZkd=5BllS|<%5xrZ+VAwm
zD$YMJ?|QuLqg96a_4_vp|89!)_H0ur>y2<bZzQBLvAl4@k%iqti+lR}_nFoNe7th2
z<=6DXl_uXWBuzfk_wBOqS#JI*OAno%%qG6#Q>eRS*3~3cYu97<QvA4!k8SO5jJh{>
z&GAS1tj>S8n00KA*S@p+!IxQ{{_l;iwC6nAGdtkg9>WLw1srS3*ZpTmd=<w1Z({C}
z_wy>H7qW^>RrqpycY@?QZ8v^_iuK3#srkAc4%)wSj_;E_3zsE{mq{$~d0-&x^g!R|
zW875xgSY=PNJgHOKeDxtd&)FJxfKU>ReM7O=PsPCxZ`evUxCP@U6oH|)xP}kta`K6
z=F;!S?+^cHkcc^S>pw$l)Q2@X-Q`6a&Z^|@$UVDCcrROV?~}H3;<Fz82~K>x;_~mf
z`vJ3qFRo*ZuHWo1L2ILpQ=piERj$g)#Ks98rZ2_sGjCbnDwW#awe|j6ei7X_Z#ilO
z1zl8~x24^Y%b6m*X`<ExfoO~M7xkNW)gPSSQDsve$2w2*k;BA0@B7mCH6?HxofT<5
z!?RrC5YH0<+rp_C$A6@*%3WXa=k<@|53i5TD%;4mFgx%1gr~P$*ql@Dx=GZuPTv>)
zT!n|HFmC4BKYAaYY~T3f**)R>(wtZ4zCCO)GI}u4?yG~5o8Q%wva7#{ADO>7z4?!0
z_wI`2m$ojw^{uMwj>o3OJXUKurR%=wH11QH@#O7|J6EpRaqazJet53ee}-=j^G;dk
zitai1%`^V=RP)@=WgWKyHt}f2?w(Sr@Hu8{cCq#5QeG2#GaKjMWq%xh#MbN+`ykhx
zn6A3&-@|uHr+qeDVgKraj^T`hPnh^GZw<U)pY{Is_D8c%|DF73zPaPhySzvDd^nUd
z&uIB~Z_ZGs7V|SAc?XZZ`fc_*@CWlpWtYjmm*!m#yR0@x`L;&yG=a09x|<a$``8Pd
z1+R;q%8C*{oX_`Cpa1aR+!{lZ9n;R`+MScW?NWAt$z$7|)506>9IwdRZ}8llm1W)H
z`dFu;@7p(i$UXjM`J>t@%k_IKOY;|5=9{HtNZt2K=RIh+xlt{Kxz$bC(n3=Ca*hAP
zTH^=XCNEijgnPBA_ll;NxX8@@av669>%GSf7pi>VGQ54GF>0RLkINsW58V3s;eJQ7
z@3qLKjHcNIQkKpO6(m}gB(_ViM$}$@9amfa+x5q3$1Be-KA8Vzf4bxEZ4I8n(OyUY
zEN?U1<~ZTbZgIIC>sA%bR;$|Uck7yebA6gr+w@iIb{A_YJB!TL7j2qnut0x$bMLy4
zx`=h<$2L@)KC;hm^|FfDK_7mrG=?4f6{t2>QJqz}v25bY-I9{O@4jyQ;rUqp=DvK{
z`2rQkr2lGVPsw<`b4#1Wnw!n}VTO4|%iP4j$Zh@ly5iL515tC&?fECZ;bVJqUSRU(
zYbF7kYp0g2d%hzmWuj^ri@eDSzndnZMa`azlD=$wP*vZ#Pvb|j%j|%UIm&(+G4FN?
zbytUn1&AJ*w9@92+0)J^P1^3^-QPMt?ms+Z>yAg4_XIz*URkqjd&H!FcO#2DrpC<I
zm}JD~kl6S2*X|E)`V19^J-2-nv5NVSIjd>OW!snHll*yB$T~LJetRwECwfPl@y4uU
zyZ+AEpW4s+$9c=g`a}M5{ER=ANq0!S;?;Yax_xJ73eQX1HEhoL(!D3nct|84uvjCf
zeQ&o+X4!>5E<66tw9oVxc<EjH;rd~5rgLY03fy+PJyU$r#%RfdT&w3PpL)FDz|p)K
z;~(xHy+f`|e)#^lv~T)h^Z0$!uD;JzGuVBgxoY1dpS;zVrMH*F=f7xw^!%tl`ybP5
z(y<>!+t!vov}pD$T$3T^GAo49YR`p8>(~u`Juz)x;<jG+WBKFmhwS)EiF<y8o6hfe
zt6tRf>`)|^$4$knM^+s(k1N_Fns{mJ(!R;Ny`7e~Z7H>9+T-|J{*UL!9OKM+f*-Ce
zT=o9Y?3K6Q6g2;_&?^_Ru<1#be6;6w@PCG;(m(zm>f4rlEbo4|<@L&(r=Ol&PPk&T
zsK>7O`GiFdv#kvJGnFM-y8gcZ*niNz^%ig2+K>DX!#37F;1@9Rw)?H?x$eu&Wp}5G
zhxI;pYutJ6-eU%?ALozX-=?<u0YCTc?MG#!J+Ex#JhE}=e}?u)zkO$RdVV_9)GcHf
zzxP`^gIQ=1Yo@ofWu~l8s_Saw&&v<4TwbFTJ$t{{56>+Tf|2oITRru1FD#O@xxVAZ
z6P5bP84p8>j{2K^3Gdt|nR$H|S6oHYE3<zWwtW`6#?gA_vdew5l!nC%!zB-vp0_DJ
zTQP0%@2LIXCTG?0ZxhbrYh5SdEqq+9d~x*cj)$oQb)~1Z3+FsY-m~jR@5kU{QQ?2o
z0;BI`+NY;<ztLIv<(bn=o{5{*Z20)S?UCgP)78uEw=SHrXx>J<ijV4zbqW>A-|IM<
z-oBMCQqk10xV<Iebmq578wKtk6|_DeJt4e3=8xjXd&})_?I|z$Rl~37Q^~L7ao|70
z`GnJX?UK^6-k-0O|0=5Qj2FnsT^?bh@o}-@k(+MY3g_&MbYv{N{Jn?&N|<Q-F@CWZ
zVrTA|Zt3%mUVL=#3ZX3%=9x|ZnIygQm?!fNTec|=RsP=fEcSnFx!S(*A73BG^DBRT
zubuXvAtij8r=irmc@exDxl64>i{JZCf6%tucH`9=$(mVr_s+XIO?uKvb>`N{2CYBx
zyF88;hu?pkx~_lG-OM=d4^OAgtn`_-`QE}}vBx_aSyB~hmp5LPcu^dex%!Xe$L-x}
zzx6wp@7mENaCEWOi=LS>KMPy^I8IHCv&~*TZFwxu9Fx88l3wk<earOGe}>%qjt_S{
zo}yEDyScFBdFBm9>qji#)f<2Db=~sidUQ(v?TqOGwMRPND~8RD+}|yzrN;iDCw;k1
znBUY@XV<zZU*6*Rb++?Po12FY=PW5cGdZ<CiEDAv7V(Gsx>p_Qms`8y#VYZf50N?5
zp}HqRcT8ksD?Y)zQa0N!<ZJSiTF$52Kbm!>Ja)bMc739a>YN49cJXtLtvF?T;6d{w
z*23#n{~3B7sQ;Efd~43<#kq4T<9sp-FPu~qoccXxCHuOHwUss2%YG<5xc{U7P<DMP
zcWVASRq^yZ{&QZR<&5X=sCZS7z4t#uYxBe3ugx$2iB&1Ou{$Tdvh65CK}gB3gzB(4
z+r#giGuyYE<(|})(s=WLk7e`ICaq%WT=QgVN_WAlchS;qRvOIr)<@T9?Yg8Q^{jDu
zZ$b3i%6Z|L>t@U=SFAl`xcj2NW8CJYHELFGd{_N3-MwSub|JQ#E00}>Jkxzkz4Wu=
zaY>&QU*1OFYMZ#A!l`2Ip7d4sqGQDL=HCq1Gwq>qL)4pPSG4b!8Cf3pI(Ws~<!suT
zFYbNjM>1?|ckYQ*+2x)0bJEuohe-Di8)fDcww}MV^Q`~Tuzk9BrrqP-J(oElOEuU(
zVGX1H&MRJS><ig@K6d@CJ}fTJvo)4aVvFXrfA{WobiUKGyCC}Uu%!AO=Y;uw`=&mL
zv-%Jd<$C7Uzt(kszO$<x`<{A2v5hm}jeLUqojhxv!pLK*{6mDZyq%xtdLNLww|iQ5
z+?D(-U;i_NCg*)Ts9`IyWsOTqUvnbE*JD}pTi=xAGag9XvgzNEeV$TkQ*W$U|KeEE
zk)7((p06$cevAD`_K|tNbk&agHJP5-UKAs~mBa9JTke{|tJ5d(uT6RxcF0q8-@Yqv
zYut7-nK-dVFxc>aJE^?5-s(m1F5~d6Gtd9%kN?28yvDsJZ<cRRn1kHixax_0Y=X{)
z55C9;X=(FX9~BSW^g_Is+wHeg)&!IMrxWU{R!LZ>Fqmz4ecSZKv?!PGX@ME>d@WVH
zw<ft59A>-OaL|5Fg0#drgH!(NvM21kTI2b!Q0JaflXr(|&dI_IXHBhw-P5fPo|pKW
zrT0E1@6y(3%W4X5?EQIZPyWjIJBKPVp2_(xW_{SurayJJ%&CYk>jUMaKm5I!cG30R
zoXJylmF#Ekb$DK=Ec5lm?LM~x?Z(-0*Y|klT-)|b#PF~YPt5&ONmD&+Dl_HJS*1T?
z5xl*(RLZ}(q$A)^%)(=Foa(7tD=m*bapHV3i7~Hw-qk684(YDdPo8&Wa>R%0UBR9o
zzCPWyQQAp$Vo<$R#BCL$JxazK{fySA)O<OxN~*onPC0Ay&%l_QKZ>qTNe}Vv?({Bf
z?fJ7}`HB<j`&X>@yr{Fj#<o{I;Ns)W9UFDNP2^cqw^Vf7Uru$4*Rx(Pxx7#IwUYna
zl>T6&m9ZPwsh$s2ayT(@hus>c?<+!s-6l2Xe3X@c*w<a8oG)<KY}LUdZJx?KOyU!k
ziZe?-Y5w!NbdTzz*G9Mc+w<0zF*r5_uw?B#!O&yW?{xFo-u6TCo2DP<E&KL7_`}Yw
z%U%`V9gA1qao+L4K*srMTjA#wkDuMS)Aj8?1K+=6n=54ZZ~xDbv7<El+IGf=^W7@e
z<%E8+^GxVZJ>Vl`o?BFTs`0bT@;J?yrGCCQx76%h^2hUvjp6cBvyRO#Rk^$%bbF`E
z##6#i?`)P?lx(T4@L0?E(#G2l{xckT-|2Mc=z`2&rppc`oAZ4>bAHadL!w*^mIsvW
zuKwD%;D`7Fx4Da5`CHz6u{1f<{3IihV->sG9c~`|fWykN+E42xU&V8OnH%@)^Mfn5
z-p%=VCMYmhcFi|o1qHFTdyjlCt}mS1(l_J88MhT~TEFDgV(ZRE{av<_WmjFlc$e7K
z&$e?mZ7Fx{Gdd}3kYspFWFLE|=_{j}IM4~>$qTZqbf339>G2djI%69z*M5ZuN0z(~
z{O+u@A<rtT{7Cow&RIuN*O!`ay8M2_;WyLHCKlUdo@9NJdMo7dj3)~7+SlqIj_0V+
z-M%Ao@veDKZwtjZSDH+W+1+H`l&Tgp@A<qrrR(|ww=P?L#%k)e<tyXPnr@pbx^J%F
zvA2#qJe7B39TcxO&SQM?MRe|(s2baySK_>@SD#+lQeQgph+@Oj?L7Oerrj}om3_@l
zJyVWp^VN4IGxPGKEqR}KtqGnue`be{<74iBrq83MA3AC3t7d(lKlZSS(L;e#%QV^i
zB6j9+p7_V}{L-$MA^o??EM?8+E?SqAU8nX@Zu-*3oThsxudI8`;NxuTKT}$W|H{A6
zv#yVMlY^V?ox6E%hq{_!rjFv%NJfT-Kg+(Ue0isxb=dRrKAHQno9|`)Y8HIzC_H0f
zcmX#n%iA2rIjnClo8Gwpx?Ujla^BYNvy3_=Kc}Cc_UwA<o>T3ApWDaGooQ*gZeHoP
zQbp(ZYUgRYKdhUSxMkNz)tetyJJcL&OOFiQIH#3)fyF-sN68cKU1r6%?~%^6z2EjF
zy0`3A#&+%%%X&jo><fNooZ>iX$+}(eXQ=jlwpZW93~Rgol}$c#Dmp7uB{}~$&tabB
zvJMJg)D~X+!}(F@dI0|_FO%7YJ8xcW$=zt&!#K%-Vd8naxmv<u*W#7^_Pw&2&;Q5&
z($*i-5B+Bl_SvxRvBor^q!LMmhaR^M^gJ-oDm<6<ZTk9(X}M*OJ%5C*iMyNmo#&AL
zw%cNj2P96a{Co4UXJLT*f=9c$_1TU--fML3)lKESlg|ap-npogI^#=t&s*t==gTbY
z7VTXgv*Ba<VO_4;_`|>AR<7_AKA!*0UhA00OqmrERKC3xxu8?C;Vw_h<GeSMW2S1k
z+V&><{ZcQhx&KI>|HrQD!HFN61E>3KC=WMyX<*Znbe?yPkl~zd<uZbS=IwP1$BvnN
z6g?*1_^-eG_6PY>d&Q6J7g62ey*m72zRRc83Qa%qB@>EHJ)ExU@8@Qf@MXPZw!P#+
zO}X~GkOIzK9WrH)ZNgnriv5Ci{=f9Q+UJMr!&q)ttABG>{atE$BxBwyOTi-_&oJI@
z{j_0r;jv4F7oP3ed|aNrPQ;z%Qbp6fqg$<oR5$IJbkDk9@q%2@!B{swzeC1<BG>1C
zIR0m1K4-1&e}*q!;r%rUzi+kwEu8(I!NGK@YVpN6x6+?|@2*p=SpTqEp6kaf?OZqM
zoj2E(?p5rcu9B{D)OOn8CkYR<*R10>=XAZ_^U?i|UDsz8KG-W&SYB{u_f3(BjT26J
zmY;gQ%~Gc1@$w%B|1&7ewSJL(aUcJGh7)d=|Ng9>u<mOrUrKMnyREkR2j(-{sn--q
z<<39;<7r`{l60(_dFs5obKM-K3Od{=+#y$69KY}%>xcP&v~RC`vnM>coNe~<<1D%r
z$~y#i`AAguE4fWrq|>$VoAuihY1)(6&L7_YQ}o$?hV>o$=hiBIT>Q_&yrce&l>L{Y
z>z%Q8)wWo#cz>$Aj`hQ|sg+AIcWs-Ro|$*yM8EtL+3gI>;<q;o<+CflXMTNeuk`W%
z47~efYkV)>yZq?tj9Hg1-dwAH#XEP!ZEM++DttSp**RLo2v|J{vp?AXQ`E-#KSSJx
z{|qmttoQk`@IQmX%ldo${}~*r9<AEVCz>i7`1$F#?sb1ufB0vw$hx&}<40z%t{2C)
zmjx_7oym4VdDgpIMoUi4pBCOHRCzDZ%{M*bNBhI)y(YKAKh!Pex$Jf3*(cA3vqXCo
z^Cy`^#GZOEiTmASY1iugt^1$cvvK|R=0C$P-nyWFr|mzfzStk#|5sSmRdTm+eA=v?
z-;S+)DC>QEp6u=q_dAvLT(_~VTIzbyK2`DrYw<qi?FFYAqQ4ycxbcH{?2l5(Yta$j
z?>TNQY29~a)1Ggc^XKwU>zb@?W1M*XYUAT~`rP#=`8WM%SU3N7&<_31`=9dawEi=!
zkKX@8)63Un;@mGAKijo`nD6*;S+CR&w`<pYH6tI*<nhjwR$@pNyOdj+Ge=A)eS6h+
zX@CA7$*$44<}r<;6P34feHZjEW$Z1`E4tVc!^9xTTJ`7V(UgDZ;y=0N*uUOfud?c%
z&3}eTjVtP}oBs>E9^I53JS{Y;X2oZJ@qU>f`oZF96*ZxYW8Xz*AD!8IL^YiA`E8Zz
zl!NEbII!QC9IsR3{bOsL;&kWBLYE{HCsYbPGtDR$ij-yJo_2fcy#>sdm)1`D&+tjp
z`9A~me})Uab-{l;{xeKkzPkSU)%~BQZ8<!v*lb<tEcqk+A}^<zN9lJ7yt+1Pi*%az
zeWmi7(xTk@)1q?vf2OG_XV@#=%F2F!GyTx5X<gIjF>I7te8Sv>@67j$Tbc_p78fZc
z_AzMKc9%bz|Ic~*e};GJpGAMM{<iziaN;5R-=eMm87`)6owL)lv$_1vpR*tH+iC(I
z?KL`lxF{xD&^KSBFXXcBpRK)tT{F(^2{<Z0i-Bd*l0J8z>+`bW6h1z0c_Q}D^zyr8
z2ica%o81ey8tmk8+MFO$!uz5+`~`dSe}*TEUe$jS-~FHA!mWL&e>d7cv1I>Sxa&W|
z#qL<G@TonEzNDYrexI-8#M-C6>>+!7P3KB(S@9(4S=`QvskII3ip<?&-S57QD->I%
zQ!2LMa?aGai{~d?U%E8)#LuqPMhYkXy$`-IG45~Te+K2S#s3-Nlm9cgEUn<%`JX|#
zWPbantS=dM*~<z~E%tW4QDgdX^^sk30$<Kk-yXdp)I~0Li_)zJZuK1!cXmn~%<WtI
zXVumJ3<ut-zMUWSp=0}XrQNlC)B9X5PU2&p$#in+E8~-|C&vXp_|Nd;KST4MZ|m3n
zVgJt{XFmVye+Kz~4cS&3zZHEqF<)qIdrsK<!_&P>H^*@5+&Ia9GtZPeV%a>8KL^%a
zJg$1`$VRIKg_4+c27MuuYJWR?$f+}(TJoPk_+@kGmflMq*WQI>w`-NN-4bvUmpFOs
zksq6H#k0o$3@WFC{xfWt`Oj(J&L64&8I(o$|E*sCDeC#;eak%`$65Z!{AhgGs%F=*
zc4gni8;ZYam_`58p7`nCQ|GDiPF00npZ2Oh5I-s}cJK7s%&L%W6PusuynC7w!o`?x
zcp|~^=jN9OzOKKRFHwJ@v-Uqj%sTs}W&areGfXsk{clh7e+GxBu8OwFP8&a})HCiW
zHE-23nJ*c0D{I;+$BDDVGs~Ea7$uwv4`?|zpE!A7&06(u;(IUV>i$Vwc*AV_@?$n9
zi+(?ESATjthv5Xnb3Mj)N5b!3m;a;{_n+aq|KC~r+J89yXHW`T`JW-~{%@a<Q(G2q
zHeKpxR5gF@JdwY%O!mt=L_d5TxBX_ftC57*-Gqq|g3=zljn3_P&RTf>j8XRWrGNXk
z=$iZKf3(V&rg5^%GEZJ;LE!GfGQq{o^SGWb4~}>HccT6i_s96Zt&jdQTok?W@0$E4
z)#Lx(|GRA3>f^J;X*H{4MqTCW{|pRo{}|_1uX;I8dv@HVF9(FUW367EJ>sb~t<=!C
zwY$1VVw>R{Cco^b=Y{@VtN*YpXW_*f=7oos#weC-&HnJI)vwJ}>}bHo{FzhdKa-hM
zxqfR6_kRXCIkW!^WtaamIIKT*|5pA#r(6DixBh3ikiDH{@8Ybg86lT+7r$HIKL11D
ze}=BhYp%s<Uwrdq`&{PPXC<e5@8UTaVCAZGs;`K9Qc93jLSfvl{|s9~kN1=Wulvz`
zq&cGP>S@&}J)2^VU*PHNdOy`u;q8qc1J191CVZIxYjysw2lG!{U-?7+ef)oh>&gEa
z7A}=IBcrr);ldK_lS_+V#@2sZd)-ETweHicch5~Xz3i#t?%nxto@>X`S&<u794s%|
z-PPCVTY2{VTkD7YopF|v_{CpNyDpjVpCP|D>h5+sr=Qc7<R<N4oau2|ZtA0WvHjOy
z#D9Ics@`Nh!-f4%3hNiuzc}@BVSBq)*_HONpvm1g{-(>Z{+RgiJb%AfM3mjqho=|R
z>@@jsQby%L?`f&LbM~#*C11ER?Yr}VuXpJWIqBGJM~CTbcV$k>_!gX04BTD(vq|HL
zrA1oNlIKq!GyY@#&oJ5E{_EBHFRW|lv(=wyt^fC={+Dq0{OXfOXL-AH$r*fD-c+Zb
zCGhIoh10o@BqZmS*7I-LdU2BCOx81jE(w#h%(lOmobid{LHMjc(LdHddf&2Zc2=02
z@a%vK%Rc@2o20qzXSj4l=G%l2MdALh>zw(P@LXT>@A!X)Pa-@1GpwI|{_m`v_P3P(
z`F=hoAM&5!f>yexdUDC_sQJe7J@#TX-Zt0g^X>_>I+&}`FJ`oMM(3f`E2h6WdGcqQ
zQEXLn#INsdU;i_7i?_%A*qAL-wRK0pt#$LvJnh_-9)_@%Nt~axq$(kNdfjRHPmCY+
z|F%5-&u~%j`gODUpY-qkXV_K$ML1ShWm>z{<lM#2YSRyw-RJpZZ{P7Jx0Y>lzR6md
z;Fmp@&IB1Yak&WO-K(oNY+7l-GWm==U%G#n_@>u(TpQ+jSC=FmiK*nVd)2JNv9xKU
z!kl+Jbvsx6v;EI7$yEMt`4#&wOSS92vHsqt_Mc(B$$y567q4yXy?Qh5n9ZK!mvcWj
z{8)d8GehjN@2(wlT&~YzNivO`!h5#phNO?+lm|WY3}e*~^Ed97vXOjz*8EWUw2RqN
z&MN!-b}!rg#&^M{<62CC^JVf*HQjA^wr>rn08shQ5b&R2!_w>jy88Bhez5#c$FKCi
zrIUY}R{mJ|DR!|}LCl(;^WCo0SU>!+{KC3Dj!RB#ywh;(+}jlEM?vc*9nM(5=KFB7
zNo(W7>RBJH^Lykse{cDdVUwKr@TB5L&bDX9t8SiADi<<foX4>=EMrOP$%3cHEM8?l
z=Vz@yaq-dl-@LEvPg#AEb^qt)QU69_{x8GTF=}!~em;kmW@@Wc_wD}e{_n~ylj4dt
zi`+fo3%9g|)bnlFYPQOF>aLCT_ib|6btEP@Dr}E>RO&DH+D_@i<BI7AgYO?yeZ@U}
zmZe%4x5DW>9+zs)Hy-w_W%jK98J@U()c;%YpTRTx+&+o=lT!J=SzP}!EZCZ_Rp{-K
z9=19CM4axn4^P+aHrx8h*W*U4NSJ(*(<aZ!je8T1WSnt76Y}umsR_oBaw<QzmM?iN
z7?m0JpCNbqr^z+fi%cdp8DG-)u&TQ0xw@@w<@)aZpJb>1+Yw#=A}E}7)qjQ)S?^!U
ze-eFhxoM-9@4J|f`bYkTJ$wE;EqXHlbdA<dC6&G)PS=PJ+<9^3t%>uN2*&6*=}TIl
z%}*@UUYs{6p;cgWX<BAvk$X*(t#;p!_WukDEBC)q%>U1@sJA-*aQsiP_5b!ij1BIJ
zR+fu5?!9Uw{wUfzY~Q|}E?ejMHtIe$z9TsC`<~5D8?UpM`(1r2&t_9*Bb-@W{NZ;%
zwQr{2qY0-xRU?`L7pOXG>$6*aIcoWz;R(z9_x(@fBtP8#=cTs#KSQkCvOljbS<ac0
zT5^8Xp4yL(!#~!yKDxY5_eWE;W2%aGZvOH$*S=kL`N?yhh4+b|e2|Ls9EL@ECI^4)
zKawl%(HwKJ^vCl{%hPVWx}QAN!{W{>VRea<ibjWDPkg#xvi|Y0`~P;Tf6lu4QU1>)
zTl3ed-b*F^XxzVLsWS6@J?DRhjQ7$t)>oH)WS!ojw{*`Wp-U$=t=&`f_JPyB^4ZUJ
zvOJ8lF<_Z^O#9~bZ!14MTfFN2D>?bgIeX04WW~8`uj-qd(U<<);t+Rt8k1_x=ETLJ
z>?;nM{#>vAr+H2N>lgLv>y96;|0J{TKf}6A?^jcvzBh?kwPUsNoBh%?K_8#@GRIU*
z@}8S^&2^$u#k%Lyt{N4|MRX^6s4sM2U+e$iKSSGgJB`HJRY@^MZpR`GvjoiVOmf$1
zbn|2o?wQ=T_0$jPf1Xdj|K0MR;b!)Weun=HCpE6rzuvfF^3#iornQl8=JV92`rpj<
zop$-i_FuPe#;j>LvCZi3D$b&UgSR4@669wK&NIBy_3PY!h6nH4ZH)9w<Hah1UWZ&*
z>t(ub<FYfqR&iWu;yt@EV#&7LJ##0Xl#u+nw@&SY_@BwQ<-afa=e9rFME<9_ylDOP
z$^RK%npTEpd0OAOH_7McbMFu32kr~K=w4kB^xprY?vjNf-pggb^+a3to=Ek$StQaH
z_t!yk{al;;-z*jS;aBqX?WALSnci$P<PP|JbArc-S!&jy+Y4&8sXQo-l>gv&{->GQ
ze})Z>|I+rm*{J_#klQZ*e*3>Rjk%T14^vNR#>!9q_5ICE`@_9_{K9`+E-%@~cRzj4
zt`Fa4>t5{NKHF%cno8dLO%BUfhuv@8pL)Jk&TNZs`XO_(Uzd1$WsmN?e(Rp;6VZw#
zA%-5udsu@w6rSymuqpn}ppt#G{_E5K44cEBng0>)|L1D!{coT0e}+q)+F2EydvEsK
z-(AvIeJp;%(r^2h9IxfQ`faw&I~U$^&aOkU4NdcEW=dC_)R9np5dPe~_a8@%|A(U&
zCe<4FvdpPGR@QefXa?`r6W>o*8~3?o|C;{e{C@@&x#RzK#r|h_;kI94pI!Y)vrG2(
z>i@E4J&f}T(+j!Od;Zju-5+_3az56rFD!j(<t{pP=^i)Hi0Mg-@7$TJz_njboXg?&
z;;w7E{27lIKmEb)-S4t@&W1_<v@@a#o;3d6tUhDa-jfH^x33MnUjO*f^MCv1|GFy8
z|KqR!uNT>urxz=WM{oRizx``w>PO?VYu`BC&*+qkoX|X{c80i$e8joh9cz1~ADQ<i
zcK<f_x%^~DQ^oO_e;37_(-Ca`y=hs(o=-QJZ9d1H1{FxR&HontTejzV{C|cC9se2D
zEB`r~SpDK;Ptc8%+dup<J9IhX%AMPPm+aoL@xDwD-|TV=xrE>YHR&r)oK4TN7ZE=k
zH7Pp#p4b*|n>|G_?mClBHyNy3b;^9o!$zTP|61J)s_*9ibD7WcpW*tN`@f9#m_Pdd
zr!uP6{a=&Tl6EdH-<bXENA_w7Y>v(P&+uZ>JlB&tM>jbBy<Kx~|4ruomv+_~dt4~p
zebBBovo>QA)9HF+okT|!+2yPCgH{z))n-3CFY@<v{;yy8&$Qp<^ZaKx(YX9S!*#>I
zS@RvH2wjv(+x~E+uy@2C*V^(`(QaNxS$7Dyg_KV{aoWCy&)s6(?gQKJNp`7i|L`Vz
zSzGA6E^}e^vfQ&fK3Lj&UAVUYNlg5&_v-%|<6<Ak|KvXVCI6{Q*pg%6w)%l~qWgD!
z+A3O+$EkQvQvR%t;i0!b+b?|Je9qi8&BF9ZXUSi+hf0pybFORdKE?8Rr||T=BL(bP
zkDmQ!n0WI)!|N^cf9qCFssD8O@5eu{qSzN{tp9ed)295N)wD;CIQdTGy^(y<D!lUV
z5p78Z#>sQ<7G&S~WB-x=f!*|n$>}vEXVVV7{H(k7mdSgi#?KqKv(A|x_V%mj^Ihlv
zbcoIOtpCFGBmc1dC#fy}8P->?|I4-TQn#kro4VsaLjQ2&@-6?+e&kmFp|XlSKNel(
z%9fMcF`;1R<##FGzjOL`ek%`^P-eJ(p<d)aL*}y&Y@N%p!&X<XeHqoe(>V4=8SA9G
zW^;_rs+|3{X8VVhz@C~T$?TtxAG`laD>MG<OZI;)U*B>5XHZ+4`tQyDU((n6-rb#T
zYjSz(MV&f@AE6)5ovQd_xUP2E@8CP{_LWTgUYGRb%@n(9$^GxwU2<35p#8kRv*1Vj
z!-5F$hz(Z`35lJ0p(EZR$H*)9ptdN~ec^hgzccnfSug+Vz5b`FSM}NUKebQ(XNbA{
zlk3%@wF{3u`MX^Ai}@efkGEcjZp_ZL_S!W+XlGiFbGg2B1xx<qf`_|`Za%*7`1O6J
ze`ohg*jf1e)A)G!#_gLvTr(cD`tDHRk$t%9Kf{g&u|Kar?|!)aPj6WL*Q@)#7{*^*
z{^t6B29+@R<Nq0)*7aw-3w1xe@e|wZ{|qeWF6yOpCSHI0<@HY`eSs@FPiJX13-R5w
zId8~#{N7=PYN>C3_5X1;KDZsLd;R#WkWZGO@izW{mo67O$F1$!ne<pf$ZdwoC)e7Y
z>+4TcAFlt#Z~x11^;_=xpDNe?GX(!<*c5K3E^Ki!BILf&l|S3A{AYMDeI8@CUrgkI
z4{l3SH@O&f+69QroUx#1ec+aP*-!iB>rVY=;Hu-(z4~pw@T%KK-fURieRoaaCr6c6
z@1=zsZs@S*aQ*9&|L3^fzWvksqy4vn|Jmr<zuvO{Z1yyXnJ0H|_H<QE{`sHb??Riv
z$JejStLMuIxDlQ6b6w5h(&7ydH1GUSp0kqC!lqCA89)CY*XwUg-FN?e`tQJrggNi}
zJo&Y!rt0kfAY{w2eutg@e}>~rkN>Ua|0{L%=krDNCzA4i{gOYmZ?&FR$gPaehP=nB
zjKADJASeB!_OU+OvbC#B{&8Gg?lW2RkoWRW`>nOkKb@L%SVjN(tS|CH71s}nO)JaH
zUUBwOcE&9W*)2Oowj{b8er|Javw_9$Rcsa9^R_<t)&6JFUHiW`?Wb0rKcxSY{gwRJ
z-}3+3u0Hb<&oy6UoywYg<B$L2`^{2)(~B2m-l{#j<#yNez{=zaeLaB^8gYf&S!Z9F
z_4CdT>4z!*8TMCl>VKALNuGROWrF{e2H)TxYyUGSpZ?Eq-T6PmLa9UTe}n$AmN-rF
KIO{q8|4jfOWC#BM

literal 0
HcmV?d00001

diff --git a/mmdetection_practice/demo/sample_images/zidane.jpg b/mmdetection_practice/demo/sample_images/zidane.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..92d72ea124760ce5dbf9425e3aa8f371e7481328
GIT binary patch
literal 168949
zcmex=<NpH&0WUXCHwH#V1_nk3Mh1rew;7xnn3<SBh?$w0g_)U!m4lU)g@u)iot=$?
zhl_`Yn~R&9mrqE5mrsz7n_ECkKu}mjR8*9QUtB^=L_$bJR0L!QBQpyND+?<pD=Vi6
zFE_6U$>9G120;#{3#<&xj7khlf{e_9jQ@`?$TKi7vND1J0~9baF|)9;v2$>8asNNU
zuvLJ8iIJI^iG>;DY6b?zT1F;j1{Oh9Aw@$+HsQcTcBMiQqsEB~Ih36?9uy6__(8=u
zsi=vQOH5osQc6`#T|-mL#MI2(!qUpw#nsK-!_zA`Bs45MA~GsDB{eNQBQvYGq_nKO
zqOz*FrM0cSqqA$$<SA39O`kDy)}qBrmM&YqV&$q$o40J;wtdIWU55@IIeP5)iIb-;
zUA}Vl+VvYZZ#{hU_{q~}&tJTJ_3_i^FJHfX|MBw|$X|>M%wS)E2#Ckf{3Xc1#K^?L
z!py?X%EH3H$W+e2$iytj!m4P<Cgd2%o>(ZXWYowZ;xuvL#)F*7#z7xMlZq~KiK&=8
zRQ(9@8rWyVd8~;npTRwb@YgK{9%e=cCP8LF2787de-rdxv0J{qE}F*?nUrSJ^Y-;w
zZ_(YG@;)8NyYqGRhT98&Zfx2iVf*@|`vuinuTE|uiFFtFEN!l=&WV`!^SSM+OVJx9
zb~3CFJf>CBoy_}_`#keHt<+^JE@>~E|Fm(AkjDWAzRdf{2Twgo_+*<Mxb~m~JG*?Z
znZ(WT>}CGTs<@sMm+i6=$xR8Y7P@bl=lHnrNp*0_R)vS*DqmHei!N8n3ukm!Ug~yX
zyRK4-o?WW!#|XbQ)1HTFWzG=4c1P@7@ximHdl##Dp5r)RxAk(I%j(HjCeB^9S+&7P
zaC?Jse{kfX+`O_+YCUF+o_E+dzkXfXXYM>jxj*>NswW$!-ePl9R*~v(yZI#7;>6kN
zEz-FXCpmUsSi!PUT|vIyYwGl@KReUT@!N!GacJ*WZLgZ+QugsM+e!7k)g=#ZS;}nP
zu*t(~+QZ_W!V?QSZ!MTmU_8k%DCaXr*fFb1J6J22E#F_-^)sjN<jouXiQ)E!vj3(k
zq^VclImKr6!F{dZpI64$7jj>a3URwtw%>2DXm^>r?(Myu!j|Xk-lyht&9!s;y_kJY
zZI;9ZtyO;y_$yZY$*S;}I>ngbu%*Nc>u^zDudaPhZ$vZtF(w~p7cDX=OK|sdTvhgB
ztzLnJ!nRuL&>5ee6fvIjWbe<@KC@CSCh^Wr=FJMRPu3N=S(+*fRm7NCeK!?K6)j+V
zE_vK*^X`)cq0Yhw&Q?yIwo7(m*DJrtf0i(bHn4ZCdN_OfLFWC}_j;rRJ=o0fe8D-Z
z(6A}f6*g^OVK?<`Y1yKjYtxhFC>sQD3so||50=?;+hf8?_64Hqlh*8=TJ<(6jLFF2
z^#RHEVNYwFr`_UIiIm%ud$<4Gl+=mGIBtLH4-9Ha<7?gLXBS`9R$6fLY1N;dF9X+X
z@i~=Ibm~>J0^?=%1<P!f6-hox({7DDzHq6=S*bR~_Ml}8(pUsKoA|TZCZ}b)ra2cH
z>2X-HB>cJ-`ezaoM{yIw^GoY|-aJWpQdK2&diRVca~{i=GcPR-4vUuXbE`c)fBwq9
z#u3~7&lUH46J1?AlmE<}WVOv{+FRx=`PldMg`;&w<<;1WQ*GR(KNyBO=&Kp_FI?-X
zsIzYY*Sc*_EOK{W+x6(u#$#Wl*;yLrRs9azIxk$6|CAet&8)6lx4Ep-zpOsVwVHu3
zQhalv^TfjDJG-+5+=J)5wc-D_wPYG!I74FL`BN66=Oh0#8W_Kh6`jnl&Mem~>uaj(
zyR&5D{#3<Jho&7CzP~j;GWHWEi-Cl7pT)OzQI`VTgbNrx)oO>`dKoft-YU+xtrwOS
zo6WlO^6k6o)eHyz%y{|LwCdj1ZBHJ2J-IH5`^={OP8KKL{|Mc3#f<k(YjOj_lYgRX
z&un#f)4%db*+Pc-_19&4Z!Jo<ueMa)u*R^u<#FN3gU=RC`d}}SWZbtmGpBvw)^CrL
z*_Ust4z=!nATr5Qec^GIu$b=^Q%_hp_pair=eZ($*NjtH$6eX>cgU8ROMi)eb&o8%
z-6?A}@9McTPukeuHTSQL-?__ZrSwUiJHi*L!)h;8HhieCH|lymY3CZfEoruwl(#+n
zzB}cE7RO^{ONm<*=h;n{<u*;8;AwxTIwa_J+k{Dy{bg^oWJ;_=rhe68;XBR~T3hvO
z)`#6}mb$xt)Mh0MrX5<rz&x+ep)odEyJybV*D;s6bx$li<tAcq>(1j}L2gS#t=rEO
zgznY)b|kDn>r2doc~)11jMD4w&yXq5mOLKIwlp^~Ny*K@_lD)c$ENFZJbMc#FrKUB
zO+DtR7tMN}d296c((pT+pV?(A&enXbu-<k)Xv(&X7r7^Xuep7m*>=^<=@|^q?CM@T
zx9?3pY@NgYd%=_RmETs{UGY{=sIV}75VGt}f0Xd8XLBaEDeF%NFJMVu8a(R>%Lz5p
z)bs3Jjq55cj#(a;;aYb+x?7yVAkM7MIGn4jYOc*)&a@q|ukSzo`rOp_PVe%C=M}#F
z$xN9cu<F1x8JRDpoLq04dzU0I-rCC*a_OR=W@Lotb}{w3Hy@8Wt5l}NKG^a8LfYCb
z%s+03+H%OUT4@&@e)sNqpK;tXskvKic6}9kl{&%k<cSrtZf<)lulP^Z;@K|7<;-G|
z{$~n|3TH)_B&+#Vu)q7Ze&KRny^7LR@ySfumSxL=pPgf~T+Qr%WaVzf0}78D`?Fp?
zxHK~|L{rD|ScR$P#cr!S#j<&IG4rzS1f^@u?Q@7som;8p|M!!Y{+negZ`JdC7-J7y
z{I)^X;}ydzO=;Jk-*dDKJeYPq<$jSZd3)tyvstedlo!gcwYqn9!fxx7zI#(|%F0(Q
zKiS-LzcqNWSB9L=@lPA%e#(1&UUhikb-(f}hqFrqxO(4I9<beitgXd`;nNMCWXt!_
z-OCz&$|&=++0C2E@?q}9)r#_O!-f6dY+mYlKUns$;qwgDewC}q9QQWPnGkMW+#EIe
z_GZtvCx++G9u1nN$aCXoxB1FPTl^P%zp+BVEz~)oe(!lv^=X%O8w;2-Hdt3*o@dJ1
z#lZ1CXhvO3-T{eMm8*8$d-A%-B+an(PFbJvD_3`w87xczpA6py8{AkR_VPkiC}+gP
z>oT9`eO;sU<jkElYfju*cTKh5uX%4sSW=}z@ws~iTA7{`w|#7txU*Pt)w|n{+6~JW
zir(j#6Fk}9acQHpQ%~9VCCpDw7r#7f>cNuEki0$SQiENPIP<2-_qIKKm9~7v0eSU(
zmXCWb&oB&dJie~#$|4;z;}bF;=ViJ$tE<o3A@cpsRc~(|VR_X}XZW+`DKYi*Y%6a5
z^K#>g9&w!li*r^|J2nW*MS6Tmytk$Az_T|_;?IA22Gv%qc(N_Q&B)^5d9OV>Kh)d~
z3%>RfJJ^3}_pgHNjmFc0Jx*jhH=op<XZbQjy<y8H9>G4tSn1oEx60&Kz6@EHTiDyM
zUFJd9iYJqOo~~QV(XBG~@C4W7yV2=?*Dc!hdv*e65XXs=Yi4)b?-8ww%0BaS+H%oS
z;bTVx54;cEX3Y28W`g$OeVdf*MEI_D>u&VpXTB0@yDt4nc*yN@{+HIcN}J5k@vz&n
z@dzKkO4ZdLN<Yg*Bwt?InXb!wNyws1pxz<tP2h9}InI~oG{1ew=Q{npaGusHr&UY7
z+ghwkS1CDWt`wqGz?XH$%m0k0<lA{uHXf0f`;&o>^L?0N!vmS(=KiHgPj9^F(J@gx
zm{<GR?aih+6D*Fs+A=XOc#A+mrLD17?s>-D{9dPL#)p-z_@?CW?sy)bwW-^|hGTaU
zO5gGN1^2Wn@cmq7@Azr%{&QQNyG`u98F|%TW|Ae#*Yj(YH*2yp&fqCs?$x!*>)lD4
zey_$GIxPup?`$<!#_}GWB(Bb|?SeJeBy)D=#pTadZdpCgs`0$6X3)dXPaf<REc3Q*
zx*Ah{<*IjE>j@P@Ww||}C*JX0@KpIK+BIpy)9oqGC00(WU9!^dLHg2c@m!zia?_|M
z>UR}{ihN!2PB-s(@_fRw71E2Go;)ZyXZb6{zkoT#Ao=CX@YJ0x%c6Gd;N!E9c$c+i
z`ivgF#n)EZJT7?q<BHH-{u${##f>3Tw_B!%eo@bE3Xu`w4W9O7nr)kr@trHa=B!g5
z_wfc!`^;5&^2@R_Q{FC2io9)kM?~-(Z%C!HoG0_fRi9#Zmq~nC!E@tD-P9@T`gVj~
z*>-t~CBp>k3+X3$qSprNl^5Nq3cltL|MYFlW%rF<OW#b^-7<Rz`{e5;Kjy4FXvw^A
z)$GHD$}44<gO5sYUh(C9%%?E-)qYF6y}S#KmtWuNyFv89W6@X(OSwH)TNyMJCi&-k
z9b7H9L@TC1+OYBK`Kn^${Fr}|%S5dUj$6JAVhD9ezVLb0*~Ke;bC@Tcs$%|i`Sjez
z&eQUKSLL|AyzpgtAotutWbRqpl@=Dqr2Aj{@LBhTTuGg=QhJlSg={7_<2;5p{%cLS
z+qdp(zURcK(#HN}#dfhLa(^`qJhhMixZ?6Ar?JVx=GvTXZo+GGBaL@RC>Gzi?3^GY
zBz@U5;uNEG@jK0Z6~{}@7e_5QXEk+V;ydZ)ElicBEd4uVwu>BktS-}cm2u9yV+`yo
z);^l~G<0=|pUS-@DGk*@+9_|77@w`yej~|}%eF*lCZFSzx~;q1`@=G)Jx=0K-5B;*
zfuX$c{=Lm_|0Nyx^>}SuYiPSq<E@q1I}bdIY3=;V@OWbQ+k+GP{HkT<Em{?=aCd4P
zpJmp?t?j!R8!w9}_nvzCLoqG*1lQg6s9RgRx!Ru<X-(~6f2zRT*jF8PY%WJn;*~^q
zn=h-3bFOY}Vc02g;)LAPI*D!`(Ua<yQMo<pS*$)ODb?4G2rwD!yu*0THGAiD!&x8L
zo##Ae?spE75LprPxMxDO)V^&wKf+?t_h<FKJ(1)W{-eU?(bQeD9bcvE=tS7-_)DJm
z32u?!qjPqPnepqcEs7jv%iho4Tq<%h;Si6^1S>($rP=eAsxJ(BB$6b-bhwVucJFJs
zZ+Dwz%<C3hcT`$maN~{p+N8VsQzti`v|*l?;c4q1H0!4E<oyl1j5R-t%;WqQdiGV=
zbCr}iACE`9EoC`jBY6H)t@hk~?Nu8XKAtdbxnI09Xy5Y1w-+fS9WJ<grIc;Hlq5Ir
z>J366eH^A-9t-B{G_9(dc;!DstGCR5hCR18Y-2cEc`{PY-?TfxCFIWob4l4(w?q@l
z=G|cEbAKEf=G)Hlr{#%;ti9Bx_TSIB*c`vFi|Rk|s%PChl~oHnEYvetG@sA=a<pSL
zlP62aCWFrs0^G^v%xxx@B^dVw+&_BoLAc41YtKVMzex*(8>L1(-MHaDgO!wyLC|lJ
zzYqMqM2kNQPGy+HF0oQjbjs7n+3)#mS5FGsZ1rHv&S@7q=lL!vC|FZ<)l*qtu_mRl
z=i{}l&)pbyq(~$l)0%v2l|-)0Ri{74w!4`eSS;jlJh^YGbHc<8ksIb(u01_tUrf)J
zCxW*&J=rEB!}_>CINq^sSJli@cexH3{IuS@WvcDwV5J!WGBW8aBv;%K4>JDD!)IIj
z@)gt1EH-=NS>G3&w_7vGr^bKB=ZP;oUi(a#8Q5TP^7W;q2}SMmW28FfHna3RpZGHR
zvz*VecN!fJiYMPlo6}d|pP!ZXXotiB<(_hpqdM<*Y%@F{DwMM9o35hHlTPO3g~#l<
zHuS8RZy!8o{W`5CR=YKh&u8sw-4}SQ>gzGq%CEEbJ@*m5bFm{~HRH}`_NT8e?~UoR
zxEnEX&*LVGHCL2`j!T|6a62mSjIyf*7sKtwvz4Z*YtQX)-<ir;YI!nYzu__VhhCGC
ztvL@$9DMtA1<w-R1y6Ttep%*OP;~SP&&2N)OnX-KF5YAq>n)#g{zTb>61yu6?uvY;
zqVwf7o{P%lFk7U#zyHkFe5oaAjcD;^n{W1itIpZI6uPpRCn+>WNO<Fmtk7Er4;~Zw
z{^XJyyY#mezYmz&PHp0!tS+fC=kdHLPxY0As(5al;%al8_w$8jYwV2OMa#DphdsWx
zgJ;!Z83wB>{=#gE@hV@~nMD>qd8e5Zk}6~wIA`j)YW}RYpo@KOGCc`gdjux%aZRd>
zDgD0iVGqL&OB?<uzpymDmlD$rSXg>CzGGZ-dd5cqH_5bjR<mB{B}R%roiM3FS#Ij|
za<OBoI}{jq@GaV{c`qzKxv9L|^5zAtw+A2h`38B2`FvnzZhRjt&ap1mkF73u@2bs5
z);-V@VLq|m(d@EC%FMY>#3xLg`gY5u<5|_u^Neg)$LC!;;nS2E#t`y0Vc!|6faj@s
zO;0`VobwJ?IbnBS#d#5{mfE!^6VKaRYdsQ?Q#_C3_MOno#W#K?UMa|$eEq~-m*`6I
zqIGQl=EyZ|UAshM@5VV#s={In=PsEVRMo_r5q+j+!x^LED*<!wwcg&jIoq12Z>J>7
z*Q0Tf&Th+fB6!+@d#>4NZt{J_@8@A!VKw7l>IutNg}1ks9E&|ysrRf!{HO$j!E%O4
z*1tm=S7-_B{+{spY;xscjhVFvtK{ZKCGXVnR7swvz0l)%mGt5ep5v0N73VCTO|rhI
zFUitWmueHHb(djr!NEMQ?OBtor-sUuzn*6pb>Au2<GQ&sgIx3WwPBN`J3>$Ge3EXl
zs?clwG0*d^Z-ezBgl01QlA4*LeYdw#vhkkT8*BF+Z-Z1~{VvWsWfeN5Wfzl&O5d{O
zpW07P-11@Z>(`M*cP@rxoSSxK<w=KXo~xQVcN7&1ZoayD$#nZ{g@m~~^6rG_CLBHY
z!RxsN+pMq)S<9ANT}yC#!ozsF@ZRd5{GZ-wPd<M-dUCYIy{<jYljj-PYH{lP*>Nr;
z@3^#U+M}#hkuxqSt;sxI)1<X$LLVo~ljpCa&gZS-6Q6jlR%`B|)*@!nyXOk8?OZA}
z<<v?;o~p0MZC4$Uxcg}W!<%EPL{pPEWIiyOsua9sNtkZS9~kGSG`;xZ@~~U8CY*BS
zY4EW8qvbX;bYGsiJ@c*Aw-h8<CihvI7Ahp&;bY^_y|%9?r1q_U+}!BZ8+j7U)e|g_
zn+oqMo^tXSTm8({i<JH|=uh9BareB>rEar1YRar1&sE6J_0ia>msYm&MPP5u@z5vf
z*Ox{`$H<;yGqU`;`r0??8S`YGZ+!eR?9qmhgnf}gYy0+UUtR1y_pb81rKz%KzHXJM
zy>C|4@3ot4wn|sm#gt{z3Uymo^G)OC(X-22zBlXk%dGBmj_f`1m-fCAc{6F_qwA~B
zmL)qbe;+fIC7sJ(A#}x;Wj6gY9bfI$&bxO-%Z)+f=Q(%f{-~|IZSFb(MTPHYebZda
zuNJhe&Bdzhor}Bty|1QOvZgbP-rNYec6HqhzOOg8v%I}k@h9tzRMC+xK8JG;|1(@)
zJI6=nc9qQU%q+n&CZ}!DPnS$ODEz&P@7$g8bqjND1(-Eh{_J>X9pt;rAWg=o<ja9|
znGTkHdcL|d<P6v?WsmO-n(l9C=J!0Oz<+7k^)Rmm4a>9oAH1mB+FP8tqxJlmyUcv-
z*LE!Do*S~PSU7T{Vw0$BbMoZK?Pk>y)9+3)Y(925*7VWasneDF`u~{ro1{JoiWZ#Y
z7xP?QZtK%szA;}DLuI~Pdlw<J;H`v8ao4H6&T@}dMOG+oj1~Qq=3wAfdBS$J-bYTE
zB6hE{>y~|gm&(Qwx%;t%?Z2tYb)TFM95bHmH%X}PIG5wQYN_OnsV5HHF>JoIr6;)V
z<$SYgIV)9GCI1X~F!}t~RYp&LY04Ca<#EO^c(SD1a)`3bwB^vf-M96opT?sVUv~z^
zN){PO@I1e^dh<I8dky)u{)J7P3@c;{L%ZJwm~}F~Y(BAW$=a3Yp4M_sGkQ=j$ZT<p
zmE-0C<>acaw2PA*f7&uWTk2Vtd&6c<Lh-DnE9F`)u26Xz(o^96u{P_HL!|%d!=)=0
z`3O1Os?~Pm_^#A^tXl4?@0Kp#caFTfmd6;VPhDMbyQgt?S$#{%%1bN>3pY-C-?cqI
zXO+_m6^+;LU;C`fUdvH;c7ov*Ifmt`GgB1wF1bs-bFaF(ZF8DJ^5pxM=6_>gKXbe(
ze4TcNu8*p&kEG6xxjW+AC7#b(t-3JaPt6~>`AbXUQ#l1we|r8?{PT))!LgV*RXyP$
zr57GeF1NH^&D?vw$>I0jqp5c@A7?#QsCulnTk_2{CkJ+x4;;@{_-C*^ay;(9a7?>m
zY4)6TVd>oU%b8mEc6?b^_ulV7z?lfX%JnY0E`M4ssk|<m>DTe>32tx7k9)P(PjC+}
z?(gH>Y4P#~pVreoG0)d!y}l_@RCv%<bE2D1hX+GC+n%3${Z72{&6&Y$uOZv8dc*BW
z2M^r+y6pB5+2$ff)8#xa#!ODl2U)^Zo|GSwmC|la*D2#kDGaVu=I&#(sm=OyL!(>a
zoysTitx?`45<iP<e_c0O*7xGzy`vm&xAm|dIQGc+%H`I50fxcHv#yD?G&tPukBZ;;
zGbd)wydBK;t;LpW&)v9u;b;aMr^3XyA*r47xjX~xUVdHsbCFTX+e3YeMd#b@4Ao%d
zDW3Cvq3@RH<+(lCQ<a+!#y>hAwcLRFgoN$!wOO$)P7fBmjx1hy@@HM#kzdzSEpv*`
z7EPVyJZEx4b&xpwqCV?cZAF3|Urh9hI9O)AZ{BV3<g`-qGldfeUp8K9n<0GV7uUK?
z6PEfpyzjemZ34%MdklX*M<11$JauCJTiuB#BwtmB2*>8$v3lNfHB!Zzse$8c*rYHS
zx#LT-CLYy%6_MG{&ob%oUWe~I{JA?GzYe{Zrn>Xgw^f^VrpjEKW*Kvuzx>l2p?az1
zss~doC67C4%66QPX|jA9FkS9(#`}O%eh(s6my5J^sI#w64BUClc#^~0OSAVk6ck5p
zu6S{hdxOdo{+i&6eU7qOg3}WC?Y*Y575TGo)1K$P&?{H$qUWpK4llzVSUasVDxQ02
z_2EN|C!cLm3NWbtzOHQdysKK%HySD2p8EdUvWO4dJX4vMsyJ+FD!%?QY(e*8w#S!t
z&g*-=oU4Un`Rc-B#r_c=s>GhJT%E=cBE03-@4#=Rl6i|IUq{}1?vr-ysawaBr^WLs
zR?KCP;gR>+@$rMj!^#!&)IM{k%OtgR6>Cp>veCM>Ju1<{^1R~8OAP1R9y5Pl^+~qj
ztxaF$%dp8ir>tJ0eYWWYBTx0L^~x&>WQ6;SXZ7BBAGBP3ulqB>IbS9JWY<N%Dm*QC
zp=6T4<MLBhX^W<IoV@EZDfe+E+alv!=jO@tjH8Z5Je^y;$$fSfPY=%(UAu_M{drlO
zdFH>HuSm7I->OQH`?{;GeRkM>mzd8*g*QSr?0Zus@3mn4Nrrh<QoD1^<#yPvj_o%p
zwcKX1FnCTMYsRgGLK^A{UFWv(6ux{JEp~Cz=@SR+d&S($O>_g^%CH^$tL?@T-0ytc
zCTVrFhLfiR``(<WBMX?qUj}a8Ik`McH=?F*Vck2cS@$=%C@Y%Vf8RXuXPEC22hVBD
zee<sFP1+s3ELze+G%fAk{Ct&`rkkve5)#L>lddugc(8h$F77(Hsep~MP*FMKyoB=d
zt=R`&Ey-hEE+NZny6j*!yWsl7J}0iGl>3Uu_!pX{F3nxo&3oLECA4%xicQJ{e;#+y
zD5J&Nf<_!CBwyKmT=gks?v7K9bMN;0KTChY-CukzYq!8T=Yr-rU!HBwUu0{=yRB<-
z&Et%i?cX<F+MKtTe~TtV@rAG{CqzRxo-6EHTo&neMMmcFUZ-c#^3HDNQ8UC7L#D|X
zyuGzSpH1dT`g*^s7w#S^{w!eYAiG*Rpqt_Cu}hVvE%S>nw?togsl0<{zUEUmr&(J?
zk9}8RTHM#R^Xd*RhP#ayrmmiFS1Cd4vE}PaJ4G*kTDy3u`>DzE44eJB0(QRQw3&Bf
zP0600mXB>YUKIw<UYc<`|D4AQ-oo=UGkO<mEX!JYNY881x;sql@^ej7G9F7PJnor%
zZS&$8Z?zj6iqA%PdTa8qU9yk6dN}A+n9uvgcBy3<%VeD`4zf$w@>)gi*<yX-NdnJf
zQQuT)2K8rg?hD@fccsqb`Llk<6Mmm?lUX}o9KFk}oflBJWBrP^KC@JNdhhxx%Un78
z`;d6kjbrYTzb+a0?mWTp)o$t@)8uK#axd?@#^L6!Ao}u+wpEJmq)P3^ISI^B*I9j1
z>N#Gqvu(~(W#IFBQ(Liq!QnT>o-d1L^Bdk2Ncr}7vY*Qx2Hoa94#{V;!lx<r%Nm9W
zbGSVU-OI2(%~~!ra_dfko{qypobsnu-$~#-y61qqgXP)S#4UPPZy8jck6#<SGkC{J
zW#$#KuDNF_-``73FIecvB9m;nY!b84J9cGDljR&OsSf8^zI|J@RytWhZt9$;Dftr7
zF8<u_5;z~sNeJsv(0uYFd19o;5*GGr>yI3;U=fvDK2Q6^TD=u-m&@<CyxrRA=@0qC
zUAub9YabZinK$3-eD6QU&kV))FD?6QP?@v3_<euYr&V6hmvS7{7CV1#iICM_U(4rd
zWdS1k?9ZO}gv$PB*eM;cI`4o=*{{%zhJq6~(iC{M7R5Wq#c~U7bBL4pA``OlgluE+
z+|ygCdO|Y}WLhP&_Y@TOZOv8sIkWrE9wv9M>N#&sR~Fs$?9p>PZgXWv>I4CglP|2F
zE$Ywe-R-o^@udBwWrDKzHLW{r0&f45T=Chw@U+~e({mm?)+usaz?#Z)cJlScgDcr2
zm=5PNE0iyjc)~JSBKZ4G+bo$NxosOIC&sB2EnzS|9yR+^5dW!z8!zwG+AMpZr@(@F
zvhM_&oV7ja@&=ZsnXxwxW&8TvZtJ^h#CTHXNjlr6Jo}pCPb_86J87r=^_e6o&ck@{
z*~WFE;aV0sC8jt1%%hagta$gu=%!=YftME^Evl$1I^Fg)?mt7+UOj0Q(U&KgRyPD}
zxB2p2^lo0e%1p6qdE(c3cZAF?Kf)PwdfuTqB6E@_S^d6pQGKS`wFwQjmd78u>$N)G
z707-3ETH%xdrz&FFhi&%>!!M$Yt<M}Xqht<Hs86T&3?wyVfo5bQ+?;sol*DX7Ux?$
zkh_{@dTWgYkFZOgRmpexxG4vo8E>C<tN8rVl-beJUpyzv9@nu9ye<=R?bDj<h645v
z+q0JSTryNi?R-4XUaRxjjdJ6Jl4sjnX0}XE_FNvy(Ej`I1b6$na#a&7f}79zS*-c-
zOq$`O_FLyOqMP_^9oMydwOGEeE>rYLVB_VD|4Q}#Gw5^Q-pFh^Pc=xQf9k=Pee=C0
zpZUxrS|ELITlc=_#usPVWt@8OoOyEJysJx7X4JGvBp%Q{`E|_<#)4I6w?_PDm>kPC
zKX=bt20lmC)!D^dPj^=b>lt6S(Ujp|o252)l854w1iq&)k1w^mc3;x4L0a~F)%C8^
zX9Cz+WOvxUnzZRkxLfMp{%PE~K^zAUp3^+LTqCHwck%q`8`s`gWAr#Dxjshls5kGl
z1E-XAC-<>e&DK3$JYo0cS!O>Q6MLrKzVbKQ?9oYO=Dq?C^#$M7-TLg$^M>#5-45B;
zX3tLUnI|I3ZgEs>hgxB|SgT!;$U6J>ZME4(v35?fA=6k=(soB~IdAB-!QSvrk%g$A
zuU>#OgYcE#Tn7)`>YwrG-T{W+jX6aeaakU^4fZ7uE00;Oo0hAe&Biz*eS4L#&jIVu
zhMXt!7KDptWkne;6P28ppTo05%j_|0MCn@B%N-78;yE(?FN2R~K4p?+t9vQ&r25K-
zNir*Sn+i{T?)s>8!7JS3>x-+G&a9cXa6;~>=l>$-En3odUGdS+rUwbn_xio+a;_?#
z?;Lb^?u=XBjK`Nh4p_Ndw(ol6@>3lTwph!0NN+G$Rd_b*Afr}~@g#>-=GGMgV!a}Y
zKMOyH&0XVlYSm$8g@2~60+(NTygGPc(WT=m+In2Y$E)`9E;_L^WNMPVRO;%U`7_>}
zGiN-Tb(?8@W6wO!#4A<TH~LA<3wd5N{f2$nZT_nLyfYQpP98XEx3x^8;>7W@m&?8O
zvM!i;bw;kN-@UJQ7T$O?rE5ZjHp9_=brn9tw^0Hwy|uPIJ^k3?_0O=i^JZ|h9zW%O
zPv+XubyIaJ4)do4-r81h;pCZTll}O1YD6>lS%~;9-!hTGxM^WwU(~KEml*;KJWsy9
zwaPn%#c=hL1@d0c3#BF=Ik`;4^7e-9401cxc)!-2v?JvhYq|Nidh0%Zo4m)O=d%KH
z(xfBUEY1~AjJe#nCq23SitdyTo-uP8s-zC@>YZL@P*8l}LD{3-+`mgFJWqSHeE*03
ztOI)*6!|Ci71?U{1@x{dJy!mzXnMi)f{4EtTkW>?mpHBGop-zA$zScISDbUse-yl|
zEU_-{Wn_@=at4`?w{|RLzbHFlMarER_8ca!$E^KcYu@bcdOD+uPxHHul*4Xsjpq^%
zeqXKBW8TJi=<$4qY*)F4XEP?9SfZJ5`q-W36QWV>3d!uv7yeDvX<60N;2*>9)m#^&
zAo19Gb;+7U_1a@*Oz9H;KCW8V(cXH{_En~59kXcMkst;MjXZ`2X2wysUOh8^=d^J}
zs={+o9f3I$nDf+`H!gdkc#>uE@$+E|-EI_ko;;UvN!2xGn(V@>(K0;6ucN~X*owCZ
zZ(-nk85!Vs?3vFBTjR4OQT1F)c;?NJb#;BSCjY`bZlyJi5f-w}<!oElz72J_!z}i?
z&oDSLdLj3r={5y??$@^JuG!?~_Gt0to>2F&RE=-i&UyVD+*ke_&=35&%#)$DL1yEV
z!a3I-9h9Hh&=_q!W4+&8R;O=Sk!9NhC)C>Z=Ch|2pUq6>t2lH@Lh193KD()`S9DH1
z^m}-{LPBz_Wnj_i!-h{-Z4E=#1=LqtyEz<Ow`21pPl?N}pPy{B2yE_=T4}q}_x7gK
zyRD0FZF$NOAs)k1P<@rNL(TD7&Eh^Q;aIL%zHnKe>J#S*3RYC}wQbZ-I+4F?LGh1p
z=VD3U0~$&E#Rp9L%Nhiy-g@$+`TXn1lS^X4i|5U{GSBm;yM?G{5=&2+<%zY`4F`4v
zar|`+5o~ZwZoIC%aUG}i+`_6Q?pZDSE>BwUD{SkALv1S4*c)5}+YG8EMet0#wN>Xz
zkJy2)?_*3QUj<(-`nz>^&Yi-hD#3eeIkwL@VUhMY^JU;IFX<ot3(t!dnFjwp^x)&M
zi`VB(eeU(=_*%cSJQ*i$t!|UvcwXhgwTG1!=N;#5O-W?G%ieo8bJHp2nkCG4W<Ae5
z`Km;1(H0F~v1eKa4DT<SIz2MI=fPt5e%7@zX}_{3ADcs-1qJ?;_Fta0<rm-gaLd;n
zoBSMdgbcFPo~Z^no^$y6GFJDDl7U|l!+GVkNq3zb?r$-)nf0#k)Nz^n#Y`cVmNLyh
zulPi|>o}aN__8*72GdSv?fI8h%=qxc;N|^myC17x_?)G*TlUYlFDp1zJqlK7-RbOk
z-eesjw9?|#$JoG$&re29oxymnLX>$<(PGJ0oX?iebZ}yiJGA=5niEEr$1T3DYw7d6
z)8>A<z(`Aty^KMbx$D~2i+ZMF0TU<j8E9YFqy0hrh@H~p6sgi9n*?{MM4bHWzFk(^
zebJRCb9Tnhd~!bTgt<_q<ja8BWnAT&48@bQ-=1%g-|+U`$`x++OlRFbELPOF-C;}f
z<tH-#N^iy09f%W?Q{L8f`e;y=n34asOuG|KE$8!!BR{+SZr?JcG|=8k<>|(&EB8fD
zV&iy!Y2V|I<$r|thh8p?KEF9z%<%SmJ14(`Dw=be!tJJB%DBJbeY4433A3G#PA=b_
z!0o&&^ODEv`_ktnS4?iYJL}liU-I+od^$ozl*^s_v@#xAK9SRYyEplp(}#0gCOR+8
zvYHYX7Rq~f$LXFAeEg!%?pgfp+LQTErFwUCV13G7d5f}l7Pi{fnl(DF+LR3IzO|n(
zP?{rCr1i%urh(1C>gwzJ9QQN6`?H>5(-eQNU-K)Nb<OJSz5Dirt6bOX`IZ^#|1f34
zk%R7*vc)gM7O`0zWY_bL2~KL4>G{pImFr1D>GyS>Kjo%q*|JH@c&uLZ{PNE$O)6Xk
zI}(g+4TBVp85DUw3Enf|m50il0*;rFxjV1EUGr6IOX7@4#&5JVl}<iye0w(Lpo>DE
zmDmckTSklr)kVXUZ>>FZb80}sw&HVIQ%=Zk=RK$$^~lChLfXA1lrx;a!NBtE(R^ML
zgSpY~(!37(x!XNjX}nV6`IT#}*PQ0wuqpYr=2(DnU-JUdi=wsscBMHdX4M|<nZG`&
z^|p@ZS-aGj6e0eoHRmE^9z0)~Gil?QSKD|s0vu&RQoCiCM3UN)&NeX~cpcclZz=hG
zZQx1Gn9YJZZWhY7wyZrM!P5LTa@$_Vf2C_P<sM(3_vO}w0~a?lOuRn--1fD}iqo}E
zK6$(}<%W~0R%H<X^H|ZI+=(xPt~FiRn=bcAL_av%z)A8{<Agn5UcU`l^VpU@pyFuG
z@jRy|{RN!IvhtInH>O>>ot>L{Qdv?aY0KM?Nvk}MuV3rRq^;=GvOe+J7RCOZK77p=
zF7G{=^;=xw6iZB=?2PZGE3*r?B+j-;VK6?M<|h4qUBGjNFWhgm-Uu!!T$%dmQ{jo1
z??Z(mZTc3dF~k`isJdF+$($D>_<~jY)WyltITJKbJnmX+vc}=}?#6Q(d%K(uCw^eO
z!^W|y=UMo}K3l{0zL`u<I~6@&|IOT&b&63Zu#)RQ;Vj=9UpBnn;dScF`Q9^o7~BdY
zzxTGsaj48;wF%uRVUopp>&JuV&2J+=ZAj;O-na7|Z}IlJ<yQhOom_18fc4ZnmU#u%
zVXUwIbcr+>ReW9h`|?)Fc7^_98`e)&E#Nbp;4V73{K{9QN!OnEDzG{*KYMWHqko%p
zM_^z3-n5w;LY`ZE6%~$o+GxX5d->kRa68RY&wW!Xmeia*<}Z6Re%n-KOO-jF&lZJE
zPh{$uRP{Oh=ugR?$E<R{uD4omwzpU5?P@DWi)l)p7PiL=|7zA<DO*2n>GVk+dA<p}
z9xVzokDF(0<$d;4b9V-d%=PISv3KQq)$5jh5pOeERXpddOv;1LVLY>^e7SqwR$I>U
z%+k6X!Rzy`=7}*(C}*;a>Dy}Z;9XVWbgj)M<zi*IOZF8QRQ$TUbYi&9ImY7>FK0Db
ziaG2*z|Z=<WZ_~yk@W3hvUO8m2KIheTC&@4QsM@7p2I61tvo5ytFGSoX-;9+WzJ{(
zyNb4)OcGY(PrQC5e5-5Gi$cFeQIfs+I~`?`CwabgsW3KInf9XUUufoH)&?#oIm?%q
z=4?#SUU7TsgY>;s6SG%7_lr5Z&ACvjl{LKRvE@0fDQoxMR%m{~rgi1woQMB%czWhd
z^$NQEDV|;8<jbh-xjxBHLZ>n{@9bcB!jmGk?zyDplMn7o<0`&u<t6W5U>dsEuJFXI
z`}ago2Sv$F^yzi1UH&xQYo6@^=1G@?`?egIJ-2NB1fF?Tvo>^I$y1-lv0iG+)}1ec
zqJ*68rS$ppPClNsVX~NxOo5e5*$PGph1yqhN|{-D3h(WB@_yw_j_9CNjkj}eC?q@y
zS@HYCXRAIoe~A@gW==bPw%wU{-{i-!2lq8)H(&2M?iRDf^~d(JN}J}SH@^>?o>6ge
z4il&D#A}-qPiooatXJ=|o4Ppb=$${ayS^-Wysq7P>a}GpmFm)mCjPN_rS-(2_9<iI
zbCpk8JxtD9CLg!8x_b3U=T4`Ex2%(wCac`qpl#-roV#=}!-m%r4~V$)J+toj<FEOB
zIbfRalFfWAkCud<>M=N0z#ws8$)bzAt6y$tbVy|^ig>GDRyU=ug@1Qb#rdTc8vQCI
z$rnP5{nkY=1Wy0>XnW7xFYY#9-C_?t-FaHhLGoyt-_MhwlJ7X4gl#>{qPSh?^ttNK
zk<&TuCFiNElvF8<TdT{jx5#)I<6*rz$8(QwEt)49u;g9h6`u0dd9y_}9*p^7`%1G>
z$5VyLGN3qCvsh-6r><AmYsosVjqm)jGE^#?o-hQIz5lvws&v0hIZL{!i39IKvyFCh
zU)_3<v~H_w!?`Xu^AsV@$D&b@EVC<=um5LQAEuJlF@-^<|M1Iz$rCCMzG7d$HR(~`
zij!;IoQ!%rB+oH^UFLRL>fM7<2H_wb6}bg@PZGYYNa>hjy>YjFxy0Gx%}Wj2a+nTE
zRQ1jHel}$4_sMOR>MF^mDaXuePG2e5`8rf3h|lrBIm1v{Qy2drwjBy)ckeaN3GGn(
z++g{8@nuu5h|a_vdF(r1@J4UxIkLNKp2fN1*ucy=p(Z+Ql`20E9A^=IJ!^kHWA0pz
zFUoVSgl)*PY4Ui$c;nifLSd~^`!|jE@9k15^qlrqw}Y{fuU7h3c<9m_;;unUUFMgo
zFW<Rlt=>^*zQSY9LRQy(m)&N5`ta(vo`x#^te4)-W^XcIZc}u3oOn=q&b2*aj?pFQ
zmX<6Z>iMH$?Gz8QDkmJ{51zMU?eFM{W0K+%jQ0N9ntkT%iSunoR)+oTlr1Ve>bI*h
z;+*k8^`cp~nyy$##va^pta7zrL}lSN_p|dJcg3vip7C^@$sP-B#pgQSa!<lyrl~0y
z*u8h0^K7^FT-%vH<M<d?nM>8(pRs5|Tnk^J-&x_e`im@n=9n$~S*~ucT`Kuy)uxEm
z&wCngw#Tn6y&O5sL4v`-*8PcA%df&v-ibRH3bbMZes0}lX_-^r5HdBuR*UmZ^ZHXo
z?t!yjJl$$7YnM><`9dhC;;p`oPqwd=-J3mWiQf!ku8^BkZx!9I_|G8tD<q#YOu92X
z@OX09#p;AY#fO`F%q3T-vpnr*w|3)mt-Px6cHzt5sa^Zi!h*O{4Bk|z1ZjNgQfe|U
zo_j;&cW-M&?9x6DS&hhpIp%*@<Q*fA&HZj=`CCl6<*DNXK6aaHQ><HN#Bud4+q^b5
zg5gfz?#=V&ZOyxt#L07{$?a10v)wD*y=AVdp2@p8)xp3q?MdUG*HQPMS<l@*@31Uu
z;;rT9xSmFo$SvBo=0m8I&pY)6FTbpJ(s(?%+)OuFI&{MgnH9&}pT?@LUEsj2fA$Lh
z%gCsb>cZ=Zw%RK<HEz=uIbC|Vlxg?nO_nNezU$tITt96`OiIdpuiINMZ|W#)wP6mt
zd3c|}nf9!?3-qh5yF7GvT5hR4|Jdv+PoG~8nt#(~?=hnpx7_@zmKUaVe{L|aE?s+5
zG+grd86)YfsrTI^`7TaaJ4xX2`l@5z8#Cu@Tgvv+aKi?M(y!~113EUoY)cAx-n4AD
zteaZr{HH$~S>}9Ommkux+vv%p!xl%2PsY6HSywoHf^j<wtM;egb){!tiOmr>Ue&jJ
zYgze)HTgY%jtDt^S(hE$eMWa@-vzUYe^jcPV?K3Wl#CDVzmj|Lae^?9Rhj9jR|Tge
z>)uuO{M&l#o=fDF^$Insj_s5U3f||goSDZE`0KiLZ(qmxou^~PB&GeHvd>z!X59_>
zk~uPco~y5C9jdf^EXlT6vaO&l_)5>0HEa61@4I-Ue(IN5@wRKN^3U{VlDxN;>Ty_C
ze>or3=4nu&(33F1@>f`Ad{A_(TVB`+*(wIHnfp}_3m9I|cl^(AeW^}}P&ohVIfa2@
zG4slkZ>_p!xT{JyFL-+~+naK(?SiKa53n@$gi5g8U7UaVI{Tcft;#ArxylRP2CH7V
zBpyAh?0NQt!|bxh3Zu8_ZVa~ePG0|?A!_I8%KFMC$H#NNujS63#1_qc{$-?T@>09@
z{AFiWE!oUd^0@hJbXl-LhdRUKX|meAm){-WD&8sn?wxIR*0nzy1I*U(TfX;`VwrhK
zyX97>vw*=-cjapfE9EN`a%C$-Lt@xMSvw2Qvp4<->h4+R=YEDc-08}*$v$f}0*;?%
z=y`6-n|61bw?<BX@Vza1cRhmltg~Pjoo{ewr^L?+hIv~r%{;D>>US^Z^!BIf*OvyC
zMM^dXFj^{K+oInvVS~&H$*{orhc>JA<guvTyLo<XiQ3F_U+yd{TU=@R^=!&r`MvYl
z?#*}~b)7@tghgJ}HJgVsQ*83oCum7uSaI)J><Lz9{u$qnFAZf7eNa$6YqQcy)<}=z
z`xsVT77buf(0DAndRpzo%hE9=@yaQ`9#mhw@myoyp3iS1pEey^zCd=b=4-ucmNvh+
z9#087UTP^_c3sP@T&7BDuk4{+3ERT$HR3qeNT^9L?hF3<I!tlLz2CE+zS(+QD|_LK
z;1%D@nQMBSc^bF8Tj0Hg;en9*Io34O+cn3_3@`8Xl9}f&DeE6|P0!3Mc=tw=Nqy#e
zY!%0|lK1r72$f*y^N{?bx$tM;9<kSbSI+hwdD2(OP-1EpJ!_@y#Gsc(%mR+;uluvk
z?ARVqX(75%CAGfaZmXNe!J^%6(mk{8St)DYUfFNM>UfULDl}4w_l5t;wU$#kRD|69
zkFA<vZe3q3dtCIU-}~UEg>yb=p7XSLw8~rXxh=cTwcUreRtbN3AFflQU%vW|(}Y8B
zpVeLvH@zyad~W3;%aV<g9u-VnEtcFMlD7Bq1MxT8*Vn{fd%U$xt?wp>@tqkbZ|toL
zyt{Yx&HoH(_iudi7t7kFyW*(!#`<}-Z6=P_b&g-D3V*5JZYP&{Pk2MD_~F2)7h#<o
z+l6kczxVv7etzZGwM#=?Gb%Ud`Jedl`@nyOP35hBWJ@`AY@YW%z@3|Q%7&ktcFKBd
zec0byeJ6_bd0T#5@Jh#rKQG-;2@4B*aha7_fi=KG<$B?xwYqiE8LMW69;r$(KK-9T
zn78WZcdylV+~;{qeZKN{fr+iX=QZ(zx2m_T=9(~T-}3zV#<KCU9_uPYcW>4*dArKc
zWW5MK`{~M+6{|gG{d`y1^gL#Y%bDT}>cKz50~h_f9M74v#bLUATCD3y{@moOGs=lK
zw$@x<{UbT{$HKMCR<C<iF17W^3-7yDW}==Cl=>Kcg^1s0>2LZvn|sQKZ>!fuYH`Y$
z&3^MQXXeZK{?8*mo!nn~WA!oX`3_n0x7fF-?P>b@HCJ%Wv1DJX>V&0!75dtI*)u-+
z_r2Gj=eqIAm+sx%d#r9pOgLooO(lHpk7idny~|O@9zXor*3WJ9C^En1?!LQLSO021
zIJR+VMcKVqS4$#t9~AG>HnaZr?c|E9OIOT_-t2!^EKYy(p5IlO+rAsJ{k=2MK;c)4
z+}A4+6_ca3WiG#7BVM}tpx&eJ+*@bouVC)s`usb-qg+m2KY7Ku9le`Y3#ageFRx&J
zT;9I^Nt^1tROY`~MsG!BUh*E?GRxw;=)d#vT>Gq-Ugmgmp|o?6w#Xx6nTh)>?*6!b
z^q>9Tseh_JoR6G!tX6jGX`$mMuIOIuI?=pZxKI1b>#&dJjenf0wwe8EojPsV@|u=^
zZ`LPHd*QLJ`|v)AYbI;$GIeW0`Bux_ah5q?_weO;iM3ZlRWq#@v^@8HQD^vi9-CR%
zX`4)yU~Q3Ux00Ck*aNH{?F?-V`QRM>djE0z=6f<9pY__z+Si)7EbCm0+VTWZBZn6b
zud+XHek_0RM2%qGrI+8kE18b&U92pm`F?_yy2RFs%~uaU*87=K$=SY)<G}02vsy<S
zYMM_Tzqb6AM30*FoGYE2G3G3NSC4ONUtO29Sd)wGp8tv!J@#s5J<ZoeYgRKzl$;Hn
zBU+Y|cmC(ujL9j*svBn;P2Mr}<$c?1y9Wi*nKH?uD+?C3u`^qo%Qku#>G95P>z1(P
zHqX8rssHTrJZ5pc>g*iDR0#>om$$Yo51!M1ZnOH`Ej=k!;W2@SE%z;rEPL>u!D`*v
zlaJ?T%?mIvs_L7{oEqI2y`*^iN<j(9XR|^?kJo%zZsyOfzRy<k#Pa=7TRL~z?znSc
z+RK+w*H$(eXq&Ne_wb+F@>X1CgZ0K6S8n*+-em1HCs}Ul#T!Pu*bd&E$G?4VLgWMo
zxjplv?rw<DxP9=%L7OY@q@}kpaGLeVOuW7|=fL83Z4b7~gz3)I^Sr}vtDSZGd&7$0
zIUnXtS)c2facx^~geJSa*M26$!V6lHLfz}vrr%nA#^^}$oX{WAt5dd1$`l7zPpmt-
z;t^N5;gflHK8Cr>_N)3}u;bB!zEFi8;WwIR?gc6^h<x(PYQEy#x&Im)W6@ssPe;?w
zZcUC|b6h6>ov*LKLEfGxMOriU=N`_mHETZ0zu{5KB&VY@+x&xH`c!%`l&8;Oyw0}z
z?&OOptOeYRw{NXB?wxs3dBL;Ene(QKOkY_R-QaPzlWF_%;E?aE^42_)4<65IT@q<9
z^8oK0srq?7DLa089*|g<{-jn+E><$`G0*MB1Lt+$zQ~sQ>CC`j?f56_@0A5dJd##b
zJ=?TiU3=n{a?@EpUzL6ti!M8;oT<Fwtiz>NTes><+n5E`&M7^<*4es5cH?zX^Kd)!
zsb6IDm?qqrq;;lTv4OSi)j6Ye4?J(NCpt(Lglsr&BezwkCvsJ|>CuZ85|(yzuC<sm
zb5Gtfhsple)$_-WcyX#$_efpra|@G8xKow4F7tx#UFplywap*z<~XqNW}n4#)8+Yv
zJJ^JZ5B$-dvwec`JZ}DnrpviMEx+>DKwCd)+U>c4EAQNCY+#+~sdIzn%cFIN6<Mp(
z=X^czKH}TMnGxDw^CU{vMyKVjvQB1Uj1_sbYx<eD3o|1WSwrT`$%}s-Y~r%g+9B~|
z;!B@~2V#%qTCVg-Ms}R{d)^bi+&ALslzDHu0z%t39#5Xt<jIn8?!MCZ<V&3?Ke;ys
zobqbeo7J-EE6<I%8K$@TENx3AF6G@R7rXoGYK@`p_o50BnZ{33fAxFCo+xZ?ejWBU
zQH??G>cQK$)fbwI9@3h6l40WHW}icw1-DPCWcjz%*lkkr;oQe|QxDsoJK?!?WvmCg
z<getV7Fyc+)}Hbuvs{=fBvi^CujOw#lC1qg`}B&f7rv}K?R{gOQOz1Yt9K`#T={L*
zqP=?=$J?J*1do4rbgDS!8W+N=;1|wS^`AlO(d;nmq~D!#jO^;`S)``8G1r{)kd64h
zv?n)ye!2Ww>-1@iDsp$N!@^@3w|Inf9Pn9P;9X|1n&ZF&1BT}+>z%YT1m}kTtNbeY
zHh5L<PL<}%jR#leJ-6N!EuMSK+fY5vncwHv)gLP9N&eCm=d|sNM2@X8xHt2awxi0O
zGm9rx$$ZkZzMl}KJx%oRx=%Z}k6(Woxap_B)Co^YrQIyPtma~BVm5l%c<b&ePPUlU
zV#@2)mRi5?-MN)LK}6uTgLKFHSu0Ck9d+tm-RH$u?0;(R+n#j=h5??O3~x^s8JK-B
z-Kv^iY&GlHiPd&0(kEGXQf4)UB+0hf^4Dp-3}aZ-AfZ>6*KYgDymvACGxl<s@YR0r
z!z#Cm&h7auwSlFv-{)#sXPFt>z2bSt)}LrR_U_-l8LK9HKT`<#x$Tpq=#{=mrxz=f
zZUy8%-7n}Z5SFu&B|Y!)v0EI{o$L%Be_R$k=QM|T&ZO+PHa)W|a~}toHTl&?`K#mx
zN!uNp(Q{huPP$B!JNvC=4MJRVQogKtGPkR(?@TbmM2_2ySGZPd)r+~k56b!^)aCKi
z^SEhLC`0RW)8l2ccV5oz^38jodE%WxrSiSSlkTMFJ5)<u=ri7tC-HoN<XH=+i0!Ai
z^qKn%z1MbUd(T{*Jb@|q_N0Ql`=%D%I_S(eXJXTyqO2DU%#-YXJXW^OdJ>R(yVbT$
zJGFG<(ZHCtYe$Z@Cq#Uec+9p%=Pg71Y~}JetKhe5k9matZ1Y#|32WV=xGmK)@R*V1
zuj@G`Ha}PAMQ&;3Ud^y(^|9)tU9olsA|emuDxQnZ&t+Q2RCBRa=CRGMaL45bW-r!0
zpgh0oO|(pKUE1A_+`|Pr=7qCfyjdI?w9q4`wqi}K1#8BYZJaiI`{yq$x%RQ+{`+mQ
zg*$kz-gut-CZg?XXqiUP56QeAt7qJm+IGS3?sDb+_19+0cuu^&&dB1#Y9ob+lk5tG
z+g7`&s%_0VnUc=q^l<aBTI<Q7saqN6w5p_}%d%$gkv_&?YgD=Fy;T3~Gujg;|G0Fc
zu)JzUc-X4v?@}6jCLdf?9L?&Z$hF4s`tobrX7N7JcYQwj&aZ2wmrUx7<}PMmo)21R
zbv$~8xWS)4Z&gYy4tzVB=AS?30kh(l$EJHL+k1;v?cUsWH1&?_1ZTZ_R;%l_o>yL`
zCVR#5B(rYw@x5ujLaP}J%0Bnk)J@%6EaMtkZZ*M(>*M*QX>raylUwVSo1Ro&#k*Mc
zg7&+Ip3hk~dnNF2ocquq^IbG8x=`ihJcpN!T^-9O6_lrZY<&53&9|tznwug#Viqk>
z_$I^nDyxEPy2|9;c>&Gmv?k6zkx;;)&TRS8SG-}WDxckpU*WE{om2X{E;+1Q<(;Q{
zKyK>pq}3{o4nGZ#Z(J92%2l1K+%RtEanXyJ;i~Ot3=Dhtw%%n=De?~9wlTI@`aeUv
zr0C^HnMKA7MMmajc3+Rb6zANM7vy($hq~mtY3E+-%2#=(lCC^CcH-tRi)CeILK{1|
zYx;I39QYXZ(JL+J__Lp$I@;5kKAE-($S&=)JfC%C>%P#Qgr3|3Cs+F~Jn^SDCCM(~
zl>5DdUw(y^K09g7yL9)Qva_Dw7Cv3A%xdkSe5LwY?U}=w0XNP&Xyx9hx#pI(BuweX
z9k!~x=Sz#H``J7__pW_{RoK&;#XI!w-u?cos_W=p8*>E>ndbYluO*c;jOXk>=BagR
z=YhQErf1`wq|BX)_>*79x-AL4_@R<}!jbFdRbg&-dxZOUU)p)g>dKm;SzT|Pmdw3h
zk^6+}$<_`>bp?S6(d(}QPd^h45Z2vYXuI*!&bgtI6DD-+`SpE`s@$@R>5?n*_{3GV
z7ijZ6*f?QMZt|<_#a9HhHnV7*{^RgvT~UGTzO*Ng=Y(7PZ@ehJp(!9@dR<{p{k$(H
zJCZn5G@jdSxqP45;<3eRUxiHx1?&#2UYC>Rtw~wGW1X9$#rdTc4<jDb?0Lt2`PK|!
zoBr7^?=4~c6j8u=;^f-Al-(>jbwMIe`WiwHa#+STPyO|5vH#3XH`y(Dw9Yu_ByOC1
zUGiwE_Uwa-Cxwj?ChXp^I)GnUyY~oBO5c?e6*f!^PbQv?X5eJFdxeSdg>S;mYl};Z
z&Mx^~w!-<sW82kn*PaH;n|TH}%5ClIeJXnL@Vo+k|EPKQ0-y2BNuQAIVOq=cv~Ia4
z>#ba7W%V`lzGisN3z1#Gbm!U5A9K6K?zZJwef$~LBF?R#=aDG!=En1T+x=Hg_6|8~
zuJy(<XL(58e+DP5sh1m`Fz%MWyVP^$_7t%%k40H-C$UVpmuM;TfIm5GdGgHFQ}gB<
zJ~9ePmU!8pb!>NfSgQI8N#%+2*JhkMul7vUS+LLDIkG%vvb2EJ*GF5QZJe%qO8AuE
zjlw1a%QdricBI`XFuYQA_4S2SA^lT?uM|fHul#gAu=$*I$Y(V!)#%Pm28`!xzOKr<
zy=}e3`TD4ur87QN7f%ei^*EoMq3YMHwzGmMn{v+IQ}2-vbl!imEy1uS;i|sP4z1()
zHgzWR(k|a%eUm-+cr4#kU7f5oJBu6+%kB4?C;Vyh#GdbOBMW1SICDOqjcj_d&Oy<w
z$l`URAJ2=HFIO(}xG~x^-rgJS_E}_7#W4eIEA6I>^JfTOTC1}vAn`|>huzkmspnSg
zJG#X6085@u0mJJbR~9+kuDEsg;6JJLqK7>=SXRw@wCv{%#=`=I5nJA`+%$DsOWy7$
z_V%)?T2HWUI55E~X`T0Og`9Kz3UX6fucT<)D(q{J+OaxP;Omv8PoM5&b$oMtugiwY
zmemDzTdmdJPuZ?Kzv}9RJ(h*5&Pqiei=EkU?9SJ3>sILcS@oUBZ?CcZyS!8+_tUh*
z?Fw_Q-`US#$941O?a00J=8IlibgAjQRlaiH>03MM8~!tJ=WbbBbS^WYdgX)jGY%Of
zhkf~O`c3?>_Q@JUoo~D3CYt=(dSzb9^l%rBg+9OjGYBUy5M8o7w_j<=yEoP0jaxcR
z&WbUvbQTexabt(WPP+raHHnY!^ZsD>{~floUScBuX_oArcXu-^-Wz$5Z9VUjOCA$_
ziw+med%A&J?%sj$_CG#9YSmV3?_K+9!yS|7B?S?SQxZNE-{6lrdiG^*&zipYNB<d)
zMgM2$h^i5IVP&;B#`Ec#?aJq;G4`#L_!+wQyw}bT)4!GO*me2V>zI$yxArt}=H60x
z=l=V6U+wDfhx$!xO!oR|`&zO0T~mBkxydp!rTDt+>KA9t9iy|8KmGJOY?quc@#nP(
z<x$M#mez0OZXc|Zh_(0I6lV5<W6zG>vcBr;6DpQH`_B+@TWi(*%{&jh8w_8@Er0B3
zvRgaTZ}IAFE0uS~Z<Z`u=kP$l>aX^*{*GTu3jA{muFopT)x5Rwpx(8>_ve?oEW52f
z?e~m(T9beC2^W_q+StaQ?8&zeU=6&yPd#JTn%>OZif=j|{48Ceo$s{e>ifRONoD4i
z*xFqd(qq}xB{}0kQE`ml+=s94%f<K>s;&MzM`g;1i)%OZ8698AdtG$uovn?Fwyrt1
z{dhcgNo3?#ZSS2+uBjc&F11&TcdE_2&zUSI{?RAt{ULwd#Rf((cYJqzyrUt%G_9ik
z(6*?wouW&2{XSbL^<3F5Lhk4L_fc|cwZZQDyw{qCTvco3kV{=U{S^DgfBI{Ki?Ysi
zXP1=kQ`oWZW7$@n3qQQhX(uX7%`?>~SlxG!ef{2?{+?Oe8y0-t%2^`oDCSe!cXvaG
z{6j9QP=CI<OVj>IY}wczcJZsNAJgG8J9qU8$QfSfxm@G?puf#t#?=2UKfAYT-*)ly
z#hDpTR8PKJB4_;m*21l-r*$RE3d`MH?cXXs)R$JVid(y6+q6sTp3YSHS^P%(=s)us
zy-PLjnZ;{gY!AFAkx<z2BVFRfy*=Mo|5|?dJpYUDLQ&bX?)5LsD%^JUa_jTCMtwJr
zJHPeW^kMI}S(DD>&HB&aKhKF}g#m*so845+9hudeqWABa+TXN3_n!82&*`TU3Ih0d
z)oQjG9%?@!yZX(2v41Bv{y6vctE|#L3Dw!}5BPD|7WY(zpWiP~$MI?(^CXWa+y*Rj
zPu#Srx4M3F+s=uv1CJi^be)%Ual*_Oj;3xUDy0V>{JJ)0BJb^piC@01ny$r^$f3N`
zZtIlTz1PaO%v*7C7jriM@jh*>m)<E)a^7eM)z2=l2`fD`mB)|M@<CO2Ox~M9-`mMz
z4}`1)?+8X-ZjEW4Gw<Kj^#%K~1uyQk)z&MOu(Y(>dR6W?&+MIZ9w;Zj7khkb^@h`e
zyXT}WpZ-MUtEfbr5uba_wd+@obQ&4XE5352V^0s?mf1!H9N(57<FMOdoB2k2n(lEG
zc|UExJ8b^WuU|%9)M{*=)Ax08)|tXS+f1I@8*2<?t5Rm&-kRfKrdNAD>)=+Mn1`D@
z)~<Ft)aPNlG3fZp{aMFtIoNx?nQqTGa7^^v!`pL`cCL=xvx)B=$3fZbsA~x?xK`-#
zNBL&1)Oqpt$%)rn_-2?c%r}o+kpIe-xA?;y0mmG@`rVhd=&lQ|U_5^1i_%0hlSf6e
z5|b5=-Q982d+(B@ic_D;`S>439(p@f)InYD$8E24A%ojJaz=cGA@`HkMC{(dkgOt;
zZoAqnyDe0;f~RomTi;nl;?FE4&a-WPzDuXbt?)wH;#t3Wg-#nf_U-Pse9W|RcH<6K
znXeKrL)E4jSUe~{`7bnd$&H5h7R>9T{FB#BzV>Y54vvZ-<2g^#ySls&EoOekQ2Zim
za!eCbn*}q&Whp1-6_(5wuIYy--&}6?Hp#p5OjnVJ;@imYMhy|kS_cYeMW*qz$jzUo
z)q3=tQN@ABT~_lZ&AvO;Q{@R?GfRkHM2}2LRaMYNON--iUu9;V|GMVZi;4@&PE0M|
zUGFtZA%=;KzrHGUXMho-gvD8ZuBjH1CvCIU-jr&wTxdA8glD^d)^3@E-qUmMt;yPx
zFild@?$G)phC7OmRE7C=-!!U@eg2F&<GiHkVwSpig?a3fwpnWoYnJwLD9d~87OCmi
z$!93uajklC%G5P+o2N8?YI1z=e8IQ1-KKnebsyeGeA{f2Y|Xq<Qsv*&mDyUo2b%a8
zAADW=VC&wFT^^S`!{1xYJ0MW0er?|SZDNln_;Gw$C1CdUNb{EM_g<dgYWq~>P4EQk
zq}>abEi;-PwDs_b@OedcFCWi3UvOled4FK|y3m<7nnL;tUx%g!Uf^lIw_9ZGYNK3R
zu7&1oG8@jv&0NNNSlY<IQZ}nt(24VfdsK7Ywb+@@m+v*ZeBq!r7l$QxL+#4YDG#ff
zugku4aWOpgcwbdlkwc)nh04d)M?2FlTO|h_$(!+edFC-AUyly2r+(M|)ouCODlMV&
zq~yS(WnBsjR<LZesc+Lhz2Z$($<opi-9223D;$hZ)_h$pcqIOP-gybxjltb%AzG`J
z_cbqAdF_G#^Ap1-jkor^wB9}Ub+$ldO3A6`@0tBV?iAJSJGADfg0?~K8*8~M?-l(j
zbf=y?F0rz#O0-DDiD~nP=y%Vz`gBS27#S2!zBE^a=aggY39E#Xm8aeWt!izMExi75
zRafp!2`^7wC!wPUa(CXTOR^4qvE3-w;{5l9qai`NEn=FCPbhS4&UvywD4>MpbNK0{
zJv;xLUS4@<cY_h1$4LuO(bMJjma<&43gpe-U70+q$Bprp<6~1TX_auh>Dnh=ty>^h
zcwT;~fzV>cZx7_BUt2oYvxm=1?!f1e+w5h=pLr5jFBABr6jaN(shi9Eo>uWR`vof^
z|2$}|c-_^@Y3(e~Sf#&k$!Ep`JZC5OY&cqew8T>C*_E!EhEoBl)z4OVh)Y-URL$C1
zu(-@$Lh^vA)6?&4%1;>{OvqlSB;$4NjI8^qy5y7Z`@Nji9`Ttq{|ZiFex|M<$1HsP
zrAK3mqBINRoY0#Rrn#JJ3yL_UZ*Fd=4&5YTCT=O~DH_S(yQInE<+io%r#33HTQXcL
zN-26}B~*LzAdBFy%Tv9#J*o>nX8UsftL~!vcGg#07!N8xJuk_;wBSm*OYjRL4l`r(
z^$Mj&qneDB--f9?E@N16k%Q6Ef_Ylv^?PfSTMoTrdCbnVJoecABtr>h$tN-&gEb<~
zhdq}0ZgOm*BeTk!Ql@65#JVsY%M)kwMT@(Z?=6e$ShX_esr9dGy}OTvyz94rD|n%7
z&5nqlw=MgXEswKpSsTN|`Iueay!d78hj5#lcV&4eFe<6`U9w7+6utEF)Na9cSq|l%
zaNT6}DZ<(fd-^KRmRRK+oLDI5X)AI)C-mxhtEKBo&4OBQakD4+pW6Fx>xF2u1oj34
z{+PPZ(-EhiCAN9KVD}08y63mQj)aCJOZu$Mvgg_~V-K8^Hry?HG_tbbNfU?s+O&g3
z!HV+vGrynKXMY*I<dh?0g9GR3!r-DQR>Foi?&#-CoVDCC%(~<8g>NgRLagT&G4;H&
zJ-#-0(o4A#7TzUdEXA`<p1Ei8dt%Jo(>uc}4l)RLo!rr)m3ynVaq@ZPmv6(DPOdWF
zXu-BQwUo=@sXIgZ(sWJf6()f@d|&UK-P6NlRVO;P^vKNQNsKvMm*)0e-g-#zdf(LE
zYMsEg^Xj&YYv!!WS@dh7_XM}6s{WzM3%{=UIWd);WrMmz-BsPEKU30pPdwI*_-@s9
zG_{O}^Mq_`@yYwiA-fFbOx(g`w7AUu$F<tGhursPi`vatb$!=jcR|h5=^GzyDCJF9
zvp_S3q2hdSWc<R*VsA3NSFk2TTf6%gzYcX<z@3mfV;<+ay4XO^J9c3*Umu&YR4q1X
zex}eL_w}-`r0<>gYu4{s!1q;wk3H(umhNMvTpU7G*Jr)7>Q~M#o>#H%u-6U=#`!#M
zo?q6T*!`~9`^1-M?Jd3w-u6u3$lH1`B3?}6>51c~8>)U^XHB%!msVz;*uS=9Te#wN
zYf;a~Dvx$gws?N)czo`PB!@qYa}qvB3&u<hJhf`x)RVVj^r!5%He_Kw9vB_QdrtZp
zi(J*?y&1FiPduyAyLFaRt9QDshsaY;Q8q7g3FUhWI*YnLKXhPu(0tZsMy17}$;Z$7
zotQSSRr+e|D@jJ?9X3)&uS7rPFgVUK&Hnk){MeM8D#^?i?<2%lt(tL?`*OLHwq!;|
zUw&YrLQ)Z95YywI;ie@FjNEgVTS&Z&)msu?_~`?Oh2^^9pp+otv}jBAopM{7%hHq5
zZC4$c<mQw*MUOdsa?I5~KFMyqn>Q=ZyLu&-mA8S5d1B-Jml5F;8D{c?Y<%G^u_ns2
z^Vlmv$%zdr$Napm+ZSi{-pQ3U$lkWAF}Td*bOFcP2&>i^Mi2Mpl;lS}nYP@gdd}@5
zOw;5R-|lj1t#cAro=_ac&zOGVg;h_ApigvYTAFr${D*aAzoc&N?c(MZirud9w(rYD
zxp;-i%|Anb=Kh+n#`5*s(4Od+6q#u!?6xj@?P!|KEqLQG_YUT{%a(ic{b$hOGn}yH
z#bU-HzsGOvy{0j({meMQlf7Wg(;K(UJ*Jr!Z_hZPymB>%*@gg1=1JC45lKl){T$>=
z(w1i@GzfY2^!;^Q8J&?|UZmv0FiqX!xw2`RLf4Bm!pt)N8CtcJ*;FQRzOxSEI3X?F
zRC%{=-jw_evo<Puth&SJXmRr8`>@2ja_%hEzpAdV+3P-L=i!j~HLE7xa<b0BMrHNB
zxvPH8cQ)I4<x=!g!}lle@cG^I)3RL0SkAq(-9h^2thLj6-u|8`dE$ku({<|!Z}0BD
zyj0z2s@<XUdgq+h`A41FpHyy;KV6dH*VUQpzA=S7o;d5=o*kbB8%~~gunJkZ`%b&3
zNcx0n&l~Uj3Uj^u-e!mL<!kHw^)48HmZ|!{8!$JbaZdV5rL}(VoowgM^m|&Yc;a}1
z=j)KPgSHH^ouYYxyCn`+6^5p>Hyv-hwbm{v#_N-zOcU4duFiFA#uMlK3%S{GnDO?U
zQ1{v;nv%A@QSZ{eq~3UEaO0Tmt1o;@uWmeXjx}*j^LF+9wpn+#91%Ku(Dt*-<QJK2
z@AB3hSn>MA^RC@IOWP{Ht?^i<Qv1*GebfZMh-Ar_TEm!4;psJIrV5jvgj%wEW!@XZ
zZ1X(xedM$^qIMru_`cQ%72LQJz20{9EU!yei`Gqe-SaL-&i`X*y2A|}N81ytb9RRa
zSTfJ|2~KXXtE&2ZG|20^Qr5ep8M<+9#|-WoS%<IxBmTi}`Px?#os&fmpD(Cck<`C>
z-jjKUcG@#mRPnlpwCY=QF5y-?dRpUresFx{AGr@#<hZYtWR%>F-F5f=d*v1lwR=Jp
zI@QA0MK8*V-h7g@?E0?$h#%S?a<|;y9G!Jw^^sNgLImF)d_T?feYu_d_AQgoZ{51Z
zT_XNo%>s>;Pv(}qwl26HcEN+`=XyhCyR8rQOXP0l_`10`ecdamp5jT}nfYSLJrhs7
zGWIHZ`lHn5tEha(m$xZ*PHP=aUln!i{K<&^naAtwy*}0p{c+mAci)anYkbTOnQPiy
z5-krspJ3c`eeS*bL&rDm4bA7@x+QCoVPUaFi`DZ6(aLq-56u&kliF4<Sh01>U%qp9
zwj8=EqcEfI$^5xz6IFLl(k|KQ_xZs0S@DPeYHqDfdvxuHsG{7<?ikOPPmkaKAnJW|
zzI18#Y0FEO-D~yzB4+t-e{H;Wx1V*6-;Tf8=Stsq2E6jGew3^2wOQ#-<;GXLPUh>n
zJ1F1%#VY!EmVfKl_5Js3=KT))$a8B+<o!aO?v2V0cCY$6v?{NL=CySeEu5$HWBsH5
z44qbI*G+u5yL6tSVz}7MPmj-sS6a<Kx8x&xlg=K~M5E)f%NDM7mHU1B<%}7RC7xLv
ztIYXs`c5p|j^o3%+3Za=+SSV=j^y5Y9C{_rVLcO{U-X7!Ro74L7q`!x&-2QB*1XOK
zy%w>VVmudl!%|P(+4*2<+}g>1+*Zw5dEDcbbI<pQ{{DUE!}g@_*!?;80he-@koeg$
z>rnBX&-SJrljpw?ANR8S*WGzj<z_PG24&1XV^BC>(^`__@vVJ1KfIT`4xjbMPT|Vo
zn=i$r-!Gl_$aeJ}%^Qp_d%lUDJigL(;m_^6)-BMB`}FkP(n{k^X)5!NO?jRYk~DAm
z{#W(Fa=8Zk+e%z7));e(T1|b$wriK=>+=jr3%ZZXX>F@0)!177`iH=OhT~gub{F<B
z23`nfUS5;2^`p$TZ{OFlglWuh)T(<^e<1tHAH&>g)sB51cD)Qw-7qP7QUAR;=@PFm
zZ3<0PFN;^cDZ9R5pK<K#?_txVzRk_J_Nj1Fg|l(W<8>D6v#-{uFUhcz+`aw7`Kb%C
z%=_eiz4pJA+EFUV|L*yZjd9!`RzJGmu4|K8oc_3%$yV&y31iOWlO6|N9(;ZN)4KT{
zSNPli_^yf1usXAA-sDxgV@$R?<XP`(o;UC6l-Cw!lYgHM*}2_a{^R8Xm+nS7uFh%A
zFZm?)I6-<Dk6oC$sQ1Bp3cI#$-M($+JP-dfEBv{SS6#ZMw_bh2KJS^`l{@3-ZsKY_
z@JG96TJ&mP+ruJG?DyoRp0)8ej*=BTY${%SbC2fZ6>GPO_CCIK?&m!T2JwBi^-^E{
zGj!Z%*>b+aj&)w-mnBo1W+v_K^07GaZGE@i*4MA4Z=`mG%$#P>wY1_`QTB`Xjqx(+
zE$->7yaM{XCpa-wCtupF7(Y=nuTS#Q`-LC-kG*dUk7LQqOPZ%SlOr_Zq@;XrMabno
zhnSRq`@a4<`EmBc)b&SZbLzdRSv^BvLF+YF-lrMG`)}>nvdLfU`|!NTtE!l;+i#aC
zY<?o7z3tw`V&&!BQQmi^Jrh05GwDW7;qj_-J0v8nH&y+<dUHu$#i=hR-iE{!xa+>C
zT^(`n*r&A6g9mlDOsaVBxa-^;rpgC=*<Oh|HUyr(w)uI`P1}lfE4CD#I6wF2i&};i
zW{+7u7++d*!a`=^+khQ$9M4}zX>XREV3gAHoNZZW**q)0DR+|9CBJ=HDKKZ^tc}qN
zljLTet1b>-dn1pf`0cHgF3TCpM9U0B)?GYi=)9S=B<q&^jE7Yvrt9-Oxa@aF6j~RA
zJSaJ)?RT$G&2ZxJs%c@*zOEK(n0#QZ#<EYdo4>BHka)mQz#d<9p(&_n37dS>^xDQZ
zdACk2DEaAetT<dKc}K2vqYU${je+}OG?`7)j1?S=n}2mx3+~*seU-?uknQU&M1}8a
zO|$l6cws5(aB_QoP+^mn@+YBF5dv0K7p67u%!>TbSY*Yw*wpP&l1jpw)ssAASE^3g
zex`Wdf?roPB^y(dIF7$|^2tyu<6^9l&&%35r75E3$g{~syGtz?`j4%iZowEm@5hph
zTdMohwag}8zclL-!vm(O;#n#EyID5q-oCc#+`%8`9KWoYweh~!(lwn+CM-Cp*!U!E
zrLRWXLB-<xTZMK=SV+ol4)FLrrHO(0^3wEm&sVHcU!HXM7{B9L=cXq-N$WgzSKhw9
zVbz-%u?G^{l}*pxYmd?7;i%@B?-<m3W^aLep{E3kP_)DsQI+iD5(>OGY{GPJCtqCd
z_F|sInK?|S=Vkrf-6LwrFn8ydRTr6*B^3%Ugw6<zWOK9aO)mMav{gE%d)t48*IaW%
zW!|!{%~-6!*p#?S-s}7}o-Ss=v(YWBX^%6GOFUb3;^VABU5AG=mfhX?@5Sm1-kUW%
zxaTn4bxl+LnYv5xHv6m%8$Zr@`~3ReT;6x*(sJDG>|*k6-4&a!bAw;uXW`9Co2wcE
z5B?l^e0i_Gq`C!r^L5kP+!4<*ze*}EW@?%C{6*H9ANjklTXI>5=6U>Q=;@hi$xys&
z@s6H7T?Gs$9)vqho36O*)a{e6TkYe%s3<q_-6>%8N<KXOR)k!!Cr_eXP{Ccth5MdW
zZ+z405oYblEU{eTThGMJHi>&P4>|ojVevQX_%sRqGpZ_i2W{=Po(?KAYuXv9^n}IQ
z_Q2|}hYo7NpM`sVU)U&Y^p<7b139fXfd=Zjr{$+4?WvlSd*f@yu~Uy9HZ&}GIA`vS
zs*MVXleZYkntfXmF^A)N*`LzKOC#GfS!_PPGVBT0&R=*}eBIIz=N*$88y{R+#rku;
z<qP(#slwTB{UUlAd?TWBKW<|?s;+M9e`%FrP|CTQ)j@l--kdtpFqh+<R;i<+mUt%1
zC-(TYk!`wXxF(3YNf<o2a#A|w!AglQPr_3&x4bFzTeS65klRZMhJ^JopA3VekM7a1
znNU<<koBN*U(RzD-sLhOA8*d|d(vH5_}Q#5dROeZ`s}NsE_vQ9iXvuj(i^lww@q1p
zM^)rQ?Z#PGx=x%HpSCB_&9-i8P3BseET#v7S9&H!SF7%Fsg8bEwCT2S+kuA_+TT6?
zGe|A8olxn_$}rVl^KI<vmn-Um#2e4u+v=6gaI_<UL3#4=sH?%IJ#W^WbGU7&T(xTA
zxrb*B*YfO(WapiGgg@&3bpHt}d3O30iLYGo@8}k$5IF;pYpcwv#J0MdmgjjKt9VhH
zZ54Y_FVvm=8QU)J-Rha*6~|>ZeOuE#<HBZbo}RwNld|3x-1=sumU`O!?(q*_kA@#&
zSDpRzo#V@+aeEtFmP}*TVVCtyGwJd4IA(mp;>7W)@SRhpo=#>xz|!Ex8GK-+?3qBp
zJ$-dCJy#`Ea}Q7OtCZWCV94cnc~aH$<y%v(7t0E%XKoPeVEiRt|6z6DJtIMh8jH8D
ze_Tu4dG3;%TakmT?W&ZSUXvIfJeF-O^3wV>ZRu61Tr*|X+0Rm6Ul*xexNT13?%xak
zGej*(y=AaigW>f#R;IKv6^5g`=3O=Pnf4~;bGO0EV@2+tR)@Wx!WZ3N9J#@Jhv1=q
zw!AUh1AbfO9X#-T-Hxg`!DS|oSd3?Ky?re4D|B|K^-1jsc5zkud(+*1hw$D!ANqcN
z)WvSSrQKpr_}GkNuUve7CG%Zwbi!20Cm)QD=G{D@l*)C#qSPkbHnVMN$ov@vJKu-r
zK9^zR?s+^fd#f(LRqpcQb(?o6860>llk$CC+o7_6^K-P5x7Bk!T9bEt>f|k~3i9!%
zw(G2)%FVNZrRY%GmW{G`rI}S>Au<W2^4HdJUu8&G)4uM`*L6|6PL>|Mr-ekODir>>
z@-e1q_2e!6Q#VF<ez8gv%m2GL>ur*|ENjp#*NF@VRjXFmTs7OxwQ#~DtCT*i#rHH4
z_{t6L?)mn8U8TpX9$)U6p<I*au@$hU#ojYc6?q%;HSoYHqxj7{({&iF{eN7w{L0(0
zL}ucF=kjwCHBE9B7FBoOH<V;NR>Uv!{MyF#>%%kqo2;roSY0tM-#K;4hPXf1?dyy9
z9;{j8_;X)gwqA0cn{V}s6|p;Wo~z&6dDb~J;YgzU@5tA0y;sC=m&(XIZt#~}SM}|)
zdJmuFvKuO@?>78ruwdys@ZI!${HrA!)9Tz8p3^MlUa;dt-cQR%8`GX_vr3-#b46F$
zY~houG+8v&b?49i6}nn`vC0yQlW}Jwc+V`{)}~Qld?RdaPfnv7qvW}Wu#<~o@>kx<
zEH+v+)#mHV*tV%fhb5l&8SxhU3P`xv<QF};F}7{idZ}p#BpwLWeal|N?=5pF*6+7p
zL7S3SLj_}m{ITt8)3|pC?&iI7T|GfSC&IDki;T>5_vHc)C2IdY+BG@dX5y8|Q|o0?
znqN3Px%PKSql2Wv{Bt|I)x!gJHz-e>7=3M0nu}_2-^<srS~1IYCa1gS8r-sSD{QFW
z+qGepc-w(8%e!}Go!zoC;(E61fhYZeUq!8BJ;I;n9_g9Wmz}z3m*rR4iht4Tp51ah
zSN;3Cd2I<x&+fKE$0wgOU0hvy;^gV|rsv}B8YKCoGnC5qrhPYwl9cK>bzf`U*)@zg
zrE8>j+B^%t!*PsJwlK<k(#$&>f4UV;(w2MXrt-neK)ukGe`)clvvUpKq{p7~Jg5`t
zAR%kdb!>0!?j;FJr~lY>?ab?Qk=Kh0mM>gW{o>oya%CM3(VpJx$x6=*l!8JSUtjsF
zt@e@q)Io1c+kUpK@Azl+@8&YFjF0yTD}8?EK%aH<1+Itl+I>vZOeV6cmKE*wkO>J?
z2(zyGSDO0i&2a|(wMq+vPgqw8zm3VwE-O8H+o|PalG2?g-&ahs?O3o<LGJ5PrB+sV
z+k>kvttjBUJ(VT-(pqb=uL|)qibN8wY&g8l=Yc@AoU3tW?3&Zf*X6e6Ng6ACSm=0s
zU#8jVt}q=pi&QSpud8)A?JaD0n55aitjIlB;P&{+{267dxm*qi6+9`E&D7Za!uo|`
z?AlY);%Z->7AOlls8V*`<UfP%h9wIb{xb;LO!Pl($?CzZ-e9TJzU;u{>ZxV2_pJ=s
z=geEQ{9ujX=Y*mi2Y!W2a;iDx_rUr$SAOsm#VI{9^RKP?>)DlJ?BOJ;{7jb7QX!Ok
z@;>9qJLHyM+wv{9?9P&^zGs`?P1ZTJU*pTyHEM4+ZYg!My;v5ss>tz$baP1RXSQc4
zTvij7o0h$jon$QF7}%#ZWx|u`x_t%?k0#aLOx2!tLc3LV<J-`i9v0^uMN21mEht#L
ztag=n^JzE9yL~f7182E-&AoeZc2QB+;ylAckMFMyo{^{OW;`$3>8Xcgd}4Em3QyPL
z#lmxbhsQ*DJeiYs=4O+2dimM=UFUZc&E&Ft=bPd8u;@;mt#8_$P19{^vlpq`Ok0wA
zm0z{fG)q%<w#tJq$FwFF9ci+gYP)OF50*zOS5N8fF8^s^sZfyZb@jWRW6sxSn{~nq
zEsj;EZCms9#yW`y!dJqCdi!4F#BJ^^oVVlopRP-NmZ~KQeuwPhr;Em26MezJzVT($
zw$AOVMPwOXcOCpWx6t1)smGAZQ$ems+u8T>v{$cBhuk|-bJ%uorcz^@TX9ce-`A~6
zA|>?&SWkaDo^vf`<%?{UOFQ4pXQ@%n<^6FbFZ@h|N5YPC9x~xK>N&o!Usl`sQS`CP
z_37&0Eq>0<vrs7$eI&nmee=9er;eRDZt(euuCdYItMAV*tqomyKeEEyYf{GAYw??x
zozCz$FtML|R=%&~r>)DLn`Kv&on7yGX4jK%-;2cbx<3AASQWR}{&9r7$UlvYdvcp2
z60R)VH*w>}INk?UZ<T*umt6H@e{`+hvqRb<O`qPZj=j6PG|28z*8>~xhp)SrPWt&c
z`*nwcg0{e_#XlKia?dV5z2Gs&{owO;Ds>mFo|yBNe7~1sU@5k(kY|JXk4~HGlVAO3
z5X<{&`S9u=N0rSCHzU+1Ot^PLefg!uAGbdF&v47UFw&znB4?6IOwV^N-^#Sj$!4op
zx};59+9t{<`g{J;<c#&f`$T46l<Thln0#cvsOfB5&85@sd-c{V?G?yv(*Ne};J<R+
z{p0h+^lgk6IzG&2yJI_v)luu%g44$Rdp>!-d>a?L@Th+KmoFQ)+}b|fGE?nEXf>DG
zMzITjXWcjQ*A|~u^JMZo29qy0?c<I9PJNm!X{U6>biF|4`9%&X-kvG<D^*l}Zttt#
zS2b1EFgCu`hJ9I$>E)8Q!ABEJf<5=$_6;)k5}#Kqes9-W>xhj%av$t0)zr;du%EGJ
z=X%Rb`Ax^He_uamr~lDz`{Tc{Ut^O4rw8mP2()h$t>3lEf@#b1Xji7in)_AC?^*wN
zzouf<@4#u<-HF_aUDv(0#%|m8a-I?UJ&W~nJ9f_x-ubyy^6HGj9eg5Hj5osOPH#`Q
z-_0RnZgI>oT;YSuv)CnK&liYTE_-+L(uVcfd>7Y5WlYQV{&CacfbZVdJ3h>Qtyw8D
ztLE6LPpaDc*pv(3_%F3SD9`6}+2OOxNy)^Ca|*w#UsuEUVY$!0bMBK&Lyx_m!Qj91
z+j^_59%hTqy|R!rx%o6s^h4?Qj(@R{bvH||pDVj_WZvSJ@eUQi2PPh0=GJG`CoUsk
z@$zN#Klu;6+h(qqsnF;oQ@~nPHkU>4XMpK0kvJo9cJ_Nam#W<TCA;z93gu&^`HbG>
zoV~g`WDh+4w2nFc!|F_ynTqAC+nQF!CwMNsefyYffsu8%>|=SRTNPa=7l(X0q1t!(
z<ezLyl^eBjFK_&4j=hlD=5HjTGn3)H&12Iy^^D3F^-WFs{{6YV`9WoBc|wT1z#g7o
zItxQ18mB!-3BBLAF=~J3+qLfm1)nAec76JH@9I^zs!uUL|M<#9Z>hR}WJUfS-i%q>
z+h<;4b&JfM@HTSFSDWjH>$g5_?eEdQ9=~l%zwbT)y&sEXDi>e3+xjc;WAMYR$F@JX
zyIMic;j`$K=h}U3`)%wqeR<c~=vP)1Omb9k3zwPrHtvwGsp=w|s-P`zzS|jd`91K|
zog;IFS2{;~PVSf0p9GF?NWQhGlyMhx-?F_DTazzNx^QBW?9KzntRJsUJ1?lt+!OAs
zly7n1<kv52e$UR`X<cdCnkjx&!s46d&+F{$msbC*-h5nc>sr$VY4RG6R(Z@&sprj_
zou(VHV26b4%h0m^!aE`7=6-CRw`E?$d0W@)A|ZJRo0K`TcC<4$H)u_gE4<#dQ98BZ
zaetJ+U+!z0autM6uGKE`W;~%&)pfi>sGLvQ;%HX%zDu08tYSOP&MsKm@m%(Gm>SnA
zHj(E|R@YQ_=x=$a@b$o24plABSN^ZPld7aXoSuF|<Uw_D*u^W04J2$0?no`<ymdh4
zUEHFzZl@1ES9$*0?a8J)-dlJ+d7P_1*2cTFSw?Qrj7|A>ESxxg7T#*lpRmHx;>qN&
z=|Se&K1=Ea8F~tDt@L8M9>iUE@SN708#<on>bpgwLY_BH{rW!ig79YJn{AJz`>t}U
zt4lKP%X-o|i9teX)d{C}x{c?bM{YTr<YcK>++Y<P!)opMd_}Mqr<0qJ@ukISCvD1~
z%$hE|Na*R6mBw<#$0c6|h&g#!+OCS+_wt0Ly3MTB%BAQ3Gpt*7m+xxGy(#813=E3T
zhSz8-CU~CD+HI4==I6;SdDKzO^MUZhW4x6zr<31hUfy)2wJ5TadEShbfewMY8^10S
z5LYO;+rHGw-1_rrb3ZNV^pu2&MKYTi!sY&5%?vP*e0ky7$|VOqo)_AbtoFDat*&Eu
zYeV_o6RWvbi%pp3*x10nHY#Yv?hS?a?e<Nb|4e?L|I;8>g=2qGCZAB3@68vv_xx;l
zzjnDvXoC%3b>X#jM-?XqdgRZ3#x4`)W7Pbo((=GskC;UZ6E8eT+qUyr#Gc7{0i4el
za%J6d^fOwX)HA{VY2*d7M@|gJSEnrxS9zBd()h>b`HgEICTATn*{*9mfBI8vfAv|(
z=avX=VJe;+dhcn+ts^{z{U27GSC`)ZKyBMj-uR%<q$NCwg-1;UB+};{zqF7~UcdSB
za=$5@AD9{3Ys~#Jy~0%8j@}Sec`|p&=Pg%GnLlqZs61b_WYUUM>Fo@bmhbPaWeX2g
zd9dE@>(L<JE%_WO-4_m>d)+^^@`d%)-xc5bmb89-9r8Ah@wBn{$;ayKOC!Cfo?vKv
zWi|1~b)NNSlXn?)_4VwPdTZUBGH<`R$j!MIa^u34ZBH(9HJ;NW@NP+gb<jJV(-XHI
zI8YocaVu)}XV)W>)Rg&{p4(P4hA-?mb+=ro`kQDJ<8z}1E{*3Ik4@KdxgB19{#e-@
zskh60^ZK-=<}SLCW48Na>&>>ee?qOIa+4%GnCI?z8MbiyXOU?yERQdZ>f)apDXejP
zT~&CA=DeC!O8qzGTv)!pj4Hd<s_gdZc3J_~oU5m^4H~D+J;fjMTy*8~%r=vk6Qb7@
z#%j%a)tBje-)ZT(xjh0$r_N@+{W_{Jg3Y1j&H1}_%eKDVawOvM!Mk_5E^OO$e{u`&
zAB*R?84vuoWIIot@6EZfDdG8hu5-IDb52-y_wi1p-P1Q5>EXENA2Uy@_22AmA&H+R
zSyf$Fn7sJbHw()(e2+H@PIWk8d1}_Fc^B5W&g3}w^199Sg=d$G_CNKJE3e;T`&um5
z)JyCb=Sl4@OTo)h)59#fZ>N?Wcws!rn(yklS7x^*CZDjW)!wt~^5PrE+3X!$i>20X
z2y7~QV-fS6Y3Y*ebA{hGKJ_!aZmG0!N&UUnV|V1-vdcq!%tB|F=X*VScl?x}o4d+2
zn?*%VoYRCS>^GW|QamfL<X}hg`J8!+Hut=qWM25QFmU!pl{savvUH2ZwWVHKy<;eO
zm*uh}NAS?|^`_mTA7Y;C6yI7VuIPU6r^l18C)T`qUsSnfO?KtO5JeT4bfr0Y7D*8k
z?2>P7s=Fn<@Nj9I=KLHTt9QvKkD7{nGkkvGZuHbX+b7e*lpC~e#fU%1laQJELVI@C
z2L=%t^}zX2TX`=EX-(c4-DKQ#OJLh^o#(ZE>ux=7@Kouqo4TI$)HA!f;9EPrEvM&s
z#vb^3HooaY{=+_hWz+j2lPs2;n-OQUIHgVE(BpN*VMlKr>1_{Byv)2WduH^11{ED=
zo8tLVGxN<_8J-CD`T1oh_b#uVyL8`zw1ao}tR^3S8UAR$?~=BI>MAlHvb(olab|EU
z@3Sgd%c0*adR}LFx!TfwOAoxc^s_6q$f&UST*c~%S=y7Q9hON+U%yX#;+B1uj1djB
z{$88DAC&AfZawB-^=!)8owp@qtzSiVFwW%oePABrDx+8W!lF5wYb%Z>^m=P8U_11m
zL95Suo0i+tTWkgXD&Zo}Cf?-Aoh_8rF7e>q3)|IJk3-MoF*TlN`IN2Xz0L5+gaS{S
zZ(mkj^6zt=%D!sWvr@h9R#(mDUd+p0HnCjuKyuI5myzb>NfvjzWcPCG2Y>mt;>?*%
zLcOh$538ik?3+15YonI&G5(i<b;nl8Mn?Vn*dKQHoN+|BdFs>;9Dj?$-`zNQLW1F%
z&+o-2b$8oL6<t(bmKHPZ%Hl%xSqp?BeubKBE7NV_-@klo>}0;XhJ96Em%B=8HgQV6
zVvkyvtq^!+(X=HS-`u;pG%@37$J2hVny@F&8;oCRd)>Rsq$Yk_t>bLW&S2A$9YqC<
zK_Wa=*P|09`*c#BmMg4ykv;da?m=dicec^Cua|9bC}6)UlOk6fTaYgDIHhD(M$oE#
z8InIYxt53}pPXc1C3qv;Iw8#TSdrnC@}s$j^-o!*vd`(e-&%Tfx6G!_OHqCX3vyY$
zy^j_v*9uA4H1E!1(^FBgtB*;`>)T9yZn`wPOhijVJ>SWi>!sIomA+k?J?{Mz>?LJ;
zE$+VId-X!H;`_4=kN5D1^BuSC{Ib0J;qK`Yc?H=EbBb=qa!)U2mSmT2uR646YBK+c
z+&gbq3!Qz&bmk|s%A|__3}3@^zuwT@&9ykcaPq9SD4)dzPyH>JZ8Xk%o!*%ryJylF
zt*b|VCM@hOzHV!`b-vmGqa#Zi9v9eV&x%WT%DW|^C$W=P(SrM`|6S9Gl|^fI>QqQa
zEA(akee*Q!@P?eio&L<1O&eFniT3D~PvAe{?{iJA?c(bq^@PxGbCMU@8b^i~uT0+A
zHTeMZgiN(PCyzz82RWS6TC$z%om)uq-oh(c)^iQE9n#(`#PmME^1MvQ+8*XZ-w(VD
zx#ke@q=7%bYNsII1L57=J<JEbud~cvd2Ny~<G#?R8$*9;d2$(595{K@=grcT8{S&;
z?xZc!TIGMvdUD@Z!Pmv1E4sHVJa}jEmC_{<9f><59W76ntz5f^W#0X$sSchN7QEN(
zk7T>t{bI89+L8$k6U;6|I-Wf1$<^~<?t-4)#b1`W?er;C-d3@iTWG?nx&U^I*Y2i`
zt{anY>0V@H`FiX4oRHO@eO4(SJZ8>(Yc_|+&jd#Kd$Nuzrz^N`NG_Lt6@2e#^h)8W
zF@N9Qwe2-H!nIAL_>ZktrScuOJ8iEIKKOk(#dp>61v1H!$1;4*o!z9`owX*X`uk&1
zzmEo$%=VYoPd<@9W5?^p3GRD?=9z_`S9O;)(3Z5mYrKe4m&bc{(M}oO<B~RyR_;kW
zdGNr$k1uE4*xjO^zci#`dLhS>^bKFv?7Vd4MaXSqDIF#*9=V<GLzkXNSn^hV!CG+*
ziJINN1@F{m+dZ8auH~UT@!l%FOE>()T)8K#iGKRC-KK2K>`BfBZ!C{y#q5`qIQd-p
z*EQcebIg<6S-z}$m9FzB)pycOWm6|7H#e*AwyT~VP%viR!FTh0$Wqm!=pE~Byk7YH
zl+{H3S&runk3S4wEB;JI&f;jW@43?roU(;c-wNw|-$q9}H090;n~?WS;gfOnG_ylK
zvO5_bvu$4UAWY`F1=}uZ=>kS&>5ij`dS|{Qir0F+%{?r3SmQaf-PY~7Y006FSDZL;
zPHW#>xdTfNO|Uq*_J$%)#OgL?+3b0q@5<c_GgaI(v-b$BC<<Tkb=~;`Q4YJWKJvWN
zIB}*`LYU|lyO<tlQTvj@W7(Jg3H%6p9(OhO)+NzhjBQWVWuAXsvgX3-B`depzWgxx
z(1ai9hpmd1rSI6;BGJs(@Tn;4+lJ$@*QYLWEKFV2yYaZhqwMCpd#CNZ&+y~gxBm=5
zwX(^Ys!Lco<v*QCW|w=mxA@R5*Qx7f$^>e?=ZU?&QhlZAnZM7=YD(6vD-yHkO>+^x
zXE`s%WV>G7gQSYk^NDfpAB)|tsNY|5Kskev_3hh(w`SVpCw}kz@-pu3NA9CW_oI$3
z%d9J(bAHQD=LV~kU$Y+D8U2`b`r-W6q_#UQrH2K$X5M|WkzLQd?8}#>6)W}~`?BEY
z)a`b9AD6fFO)gg5d!R4-^V}0N<br-T9<aOm^jCfB^5_%Y&kWB0K6Gb-?dq!u`*-Z-
z%QM(?=INXbCoR9PIT?IzuI_|KzBkL1mtWcw85-NadTC2R>&-K-tSoo#o>tPE)N9au
zWu2v|XQ{@P({s<W<ZS$uoM%*cv~2R4FsZcVJ3XfcJec?VLiqgH8(C6E=S<gRI&#kL
zWzH;Rz1qMjnm0c8OTMZ)-n;c@DfcxVkvC0>M+#QFS-h=!*5b^?ahlGX8RQ;!y?s+7
zyy{fXCAZZZH<X(@M^C7+y5{5Y(Lv96PRD(V<5@4~yqP+4ua;lbW_E`Qc}9~ZW`&<;
z^mzU{)@(UX*+iX3Hy;-m-ITSLn(ceZw3>VE`b3?q#qZvpe;TW{wl?EdoL*z+26K0X
zW5#i{o~!3A(OexXc~AEG+l9B*IjwU%_;2c0^+T&4u5{+zld@_9!<HE~W$UM_eR$jY
zc8T%r6O8BFr(gK1eeWN4{H6m7rHl3KejNN2ZtAur<IS?!e!B8*rhEIQiq9|j&tULi
zg7L297fmH>oLA1S2t2in@x<{<)BgP3?Yh14mi`2$8x|^;Dy+P-Z5{P&eoSWA5OjC-
zLNDzLPiAH5E?xPu@Q25p=+(*0GF&IG)fnpbWc*N&<I`Sw!Su)bD~u+ojt7|5y|zy6
zDAB&RSKP1HtLCCzk;NWYtvj3SihoRhc)2{`dAi1uw*L%LAJ;Seo$dcIb?1(sT&G(L
zZ#>(#=32>$t+^jPb{wlJU9W$sPQX!YW6`=z-rOg5svI+$^Fh05l2?@U<F^_s<()Pu
zemH+~-4dZC8y=>}avZHItGi|=vwiQsn_DOBinw)q&%!D5XT`1H-&*@~@#-JdPP6^@
z-?dV_EzRe4C;X)SHu=_B`7E!)%k<6)9e*afT=)7s?OXn#!cSGM+nzsdsP=aD$7h0V
zc3<xB?y$H!?`l<by|$K{^yJHPo-H&xy0NE4eNJEYUQ=1gSJ^5-le6a}%llpRi*N{6
z5UT3S4qPPNW?*|_g=$AilLPyYjlL#)W_ONPY;R-Xsg_z?n6vTue%rs=rEj+>#uT{+
zXib@RM&zmIbI~O!_m&C8@^~tTCY61E8Q`&cn#Eer+)oAmeug1W9F{y+2zz<w*ioZB
zPfFeg9pAk|p(@}(x`I$u(rk(6vRdB-tvtL-Pps9>G<(Z?akZ{hIg8ZpydynAwXMu%
zZ=SL%$jBYvn|WN3M_l53)S<2Qx}Pl9dc+s9e4MxZ(zJ!yo0BBl?g*ZE@cByU36;l;
z?(BP0kG<|GoK*3B^|f^o6Uv$AZMhshbIVzd^QWiDYdkQo>Rpm_r15yn#4DGbWe+#+
zmY=HaQJ4DEt-APZ)K$qh+SW!Bj2o;P|GZKQD4c(6Nzjprhk4TTi~R!Ui9cO7_h{Zy
z_1<Jj=BDcMRg)Gy?R1r!y3{1Wg^%IHiK9VN3JfP%UCP;-Z05o;$v$eOb{_kCjw?O$
zqb^S~Vzgy^erxm7{(`*!3|`?oSCwh{{CsX{u}bLlJU_|y<x69C1T1)a;y8Ox@~zG3
z5;>X&zpmW0bLq{yzT(qvN~Xx9f$FAX3~!@?+!*ejl+okQYB;iHZ(A*E&F@<OtC#j2
zWo?)wF{km`5<#}4P!HvKTFIRE3eWpx-j?LzU9wR{_|~RpJ9lkzahSrzXHXwilNZ{@
z#_;vI$l|hl4))L2nkzi5@4hzcx?9oJtXo1$`of>4-fr#>4qhf@)G+P+`>s{XPurVY
z{?+nWZYVSPz(0Mjm(h{(rX5?q>K!@NoWb(#W%%2JDNoWb&k3vXE8=s%658=jx;Sxz
zM1p|DTB*y<r>cy-ZniTs`c*3L^^lzz^G;IsKf@l|RZHr1Z2jJ($ds;T$o1L$?TKK>
z+^uSN*_Bz{xHw`;)D~u1#vWI<37&14+oEXO8=iaSj5AN}LFefBm9y0*JuuEyXTQB*
zMayYp#wN=HKX<I~JZ!+A!91z@a#-S=xw|_ad=Z^oE@fhKQT`OiPk)BKWox5Po_Ol<
zO{VLV@JvZZ1~W^otcbhLOh$gjlVjd}`)n3fCB5zZ=bAGXUsrb*9hk$oThemP>fpxf
zg|<ajp;wfD?0RmwF8l7?*(#Sz9?i*-xMO_m;q8~f?0kzetldw~y<7WgijVjl=EhcK
zl}Bq7B_w<L4$n#3-jerKEyz<!tYt^o9d12#+lsZnIS#j3`_G(b_#%7$Hk$?!J%1KH
z?Io9weY?dNrjVXn6|#8Yv(U+Y$F|Phm{jC1BV-k}b?GuLGqaVF-%O(p=^UHg##LW(
z?FfSq|0#*WhU{IMx_yyeN4vfGIAb*OiW{TNcGXWg{FKk@gYl)wzRg(^LMvo6Uu9=q
zySc==sg)t2>#9nRWm{B~Rx+2gtwHhmsw=)Wd9f?FlePRMR-3I@CDMAj-|^(v)u%Xq
zmTk!0U(!{^mn|tA$#1yH?AOQ0@Nd7>xbEaXm)m;9vv<J;og0>4)<nOUD8VDN<D9?O
zyruV^v0hO$-uYp7dG%jyp^u?YjB<ZE{EYbeCwt+}mbL)P-hLg{q%1DyIqA9w)t8Gz
zzRMR+D>i>6YZ1d_{c+Y~)2$v;XNm~!o)ey16Xbi$sbI<HOFLo{>b^EAJm2mZ^fo!-
z<ea<>YoC5NWqDq<Fy`#<bnV?-Y;{{NW^Lj$fAHsk%;Q;)zIysSGCrG_uIwHd9n^aD
z{=MUY$3>mIH@rH(JM*0JthR5-yOrewBPYeoc`$F@mbW*a&Gk#kcdhNowMaZy9n$t)
zy}AE&%#-qzl=S91S7*F4my^!3d^TOn_<7pPJ;yjKRRW*$alF3Iwz2ixh5BxhhZboM
z=0^!_Ry?_vcg3^AV!@yL_^LxsyekR?ttm=yE?HVU|M<N%hl|d*@!d~8mhH0D*s8nw
z64&;?mtA}E%h#1pvMM>oTU-z$!*KkW&D9<6Zcm(}zc#O@+)CrC(2rx69G=W;nrA9F
zxqpvUzkk&s@3t6?KN2M?uk@LjUA|M*wclAUc*)j1X#s0)1{pRU{B^Cze7V-nwD+%U
zSI=zx&fwEtX5jfk+lzH#pqJU737*PZi%*4_w}d+{YkM1J`*_+rc8irqKO3<<-Ff`F
zX*<ih`30qtDy4r`-3ixP!C}$A({AhGps;XTu7KTJdpWl<EYEt*ebDyRp6P9>Cv(_r
z`PT*-=hr^y-Ki|MRZ?+bO8ykh$8uYrpIdtIRq)c4<!{w;-b>s*)Og`<mU7A2-W!jv
z|ENE<y3;ejLE7<W`&QFucbwKM%gBVAq?D}CYn~OXWGz%F@o2M}b>F>UyFH)7?z!Iz
zR?vLmU$xNir{N^d$97lOq@G=5G)3sn^5Q8!t5ZJsJBFx+Pi|PU;_aQQJ5z$X=g*&0
z9N=jYc5C&9$Lw}nFP2Tc*t%8or=$vFb5D_0MTP(6u8f+UGIs6`m7+?*GR<?6mwK07
zDC|sA*eT0?ZSCzpYm6_1@=QyTDEX`HbSQCq=Dml-lMb)tG+minoRNFO!>qwkMdnG#
z+S{CcpWJn-cnV{#ZfW#tDqy$!x{>wd3CV;%2`go__s!XAkuIxK8kRFJQeoQ31HL!7
z-$#{Q*I8os_6T45-eR-u)>AgB7#u(4R?l^D`}7P2gX4BruS?1Vwe~e>uf6d1(F_a4
z_WG>-qE|W=dED5{Cn0)3^qlH70dto1EW&eYGZXhFJ$e7U!E@b?ea}@M7q9X44OkH5
zs4$N`%Js^h^HT&r%iTR%tR7@27GhJb{*x;?>y&}HXy9ehOKZMaN_o!JzOUI|HHlq0
zeQ)Z$_(Zk}mA?-v*OXs1oGdT%U|Jq)P;Q`?MVVZJh4RLgleRToeU)*#Lb}Z8K(gKP
zdz;tm^HdkP{bzV|@UiH0y;U2hIlPki_CB)sm9Ns|2~2%{+4H>KJ7?_WmA>nk7%8zq
z)j#>#&bdxMXWmKgd1Cn7a>e@6fZN^4g-<3%gwN`W&p38(@jTa}(;F|WIcupOBy#TW
zk^c-F|E9WS?>&+%GwW>ioK16Y%C#-5<V*@#f2Qi$&Xk?o&3$h7#WAM{)mp54v{U<B
z*}R=!MO$SLvohyZKAtsk-7K4?8wbwY7RQ`3i;@kTbm`gRSoW}2o)(smyGqIxdJl@v
zJN)Zf;GX0jgV;MgmnVIg=ENpZdh&qj<jLEPhs4fX_9vX@@Ko-}CuOr9`E(s<oKt7o
z&id&c%Z^+AcaNK<#3e>NV6c*pnp&2Vt<8IaLA|g2(%OWdtNVBN&3qysb*AlknUNdA
zlUZ9?FP&67BdStRc)5#h>zzHb&E`y%WM<sCa*}O>hT;YeWm&taPR84_KDe__oVClt
z^&mU*<nwY@ynS01*B;4Em5!fyuE3W?h(kqarzP`>rR74C#I+XG-1)LxCCN1RlBh~y
z|HBni-fYz~x%=ftd)5-4vK{JM-L>Aw2vs~*p5PmqDV1@7X9AnKoZ<V>RQ0^8Cjw6>
z{3|`Kxl{JSvPEg<C6hlJa_vbd4oMB#WL~?!T>jeDxlYEO-`fn2SDoI~+m-S_$jyC!
z)>PGMvog22*N*uf>52Ftz~pFmb++-F1WrlY-(hRdr1KemPM7(%X7*C{b>cGV*LE$q
z;5F&a**z0BXzU2^SDCkUcHtyGj}wn=SAD(oXEE;q3-(K!muol9i(Y8EdY9B3(Tv?M
z($5v}UHR$GvNm`IlkM-&=PG%}%qCu1Y1Mnvw%_Y*m(9<Mn}u!~_}!7K3cK5q@<ix3
zbDtI0x$RC%gxLKGqpNBvgS>?dUq&xqsWolc(mB;k&7XxY&w8no%-8Z*;uUN1%a7Yc
zdU(o@mTWT=-oC8%Kf_#~d(*97IvRalyDQi6=5!0?iP2%x*0elfkg0wDG9;(LNNeHG
zj)S%pYj;b;db6o^D6>?BYwxz!yzJVs@YZc3!#TO^J%6*W?i0vTce$pU8v6Ok{nog~
z+Sg|nc3E<5()0ZKuk`jGyU4cnoZUR;jFXl#JPGl3Dhzq=x%eGFcjh-MzRvnp2Y&9|
zt*bLh^Z>&*xn;X-wIg?3{<3VxXTB(dRV~F$mZqnoUYCniX*pMHoSA00(Bh}lyd82=
z<AXmkNzcrEyEH7ccDBH$J>fD-Yx#Quzi(B#VpCEgy=B(Tn!663`_GmAOb)Q$edqew
z`9l8`?*5qe>UB_NT+rn$yJ!4;cjtQL<Jm72=LeP@=#x0XTz=2uIolrfBf_<7a~Fkb
z?5}lr+4X3x=z3$@8kvwKU7Xd`)|=at_*H~2+qPyMRBrFqGFtHGz|~wk-iwQppMI0+
zdhx|pbji+M<sK{H$-CD-jB{D#c1u21Vs}>RE93KJJb@0!)Gc-9%sM5<d3~#f=$X^Y
zZ>M*rvE<9XzWwZ?i9hd)plqovr*m@|?wr1IqFU?v{A@YH{U1{|#osx|H}T<%J8SGR
zj%?PywDs_nE??tGYt?1L+Gl0$lW03C#_=aqW%5+k#vn$O{|x$7lU**BdaDPfu08PT
zc%#ZvPkX1VzTJ=b`IlT0Z4_Z{OL$()|1z@p^(@&dIlAASmHF&)9(B!Gn~~|cV_#ZT
zkNK~AGqtupojFsWDN3)%dd{`AchAo6DCxX$lxO1;9<Lpxe_o&aqx$$}u3CiD-{%?&
z_|2I=t=sPRv2T9a=I9u=NsG6+G&k91H{R2CzSgqXVpddrTh6|t(k?2^nLnKpr_6d|
zW1nf>o~JlVd!};Bg9Lq*$r0PcqG~3(<)lqhP5#dOeBPg`@ZgoN+|K)L?tOPXae7w6
zoG)Kj=DiPGdg^@irBdnWwU$BYQ=d98wdFsL6>neD@}1-GDX!<r6DQcdK3!v(%zDQu
zZ0b`_ar=s%Szp$-mzhnndwY9Ix|-XQ%bwd)gg15D_B#l;W-W7AbKuXOM_cvZtMuJH
zliQmAzHD95jhB~1dZSEJAGB7bEq?CE{C8UIla$s8Pvo<{%-Jd0KWD0F&~oEHp1OH^
zZZGF5GH#C5Z%gp*UfH~8Q{w^ly#;2|^(40RY&>C^7(2biR7s7wN#>Jlap0=OCikw(
zB|83APxg-5C>V9BdG5|*)m=Z{e_QZTCQj_b+b88Y&u;zo;oLlb@3DHmt>311o>rY~
zrT6TX8~ZZt&&}U%e(b;ftlKHWWx|r^Jy$Ife($Oa{bDok^X3abw#sELsc~KT^3bVI
z-WB)H^!l-^z1kXFT~x5-&()o_(^M7qz1{O`;@bf3P!2u|nH0XO`)#+_o^Vu2vWc#9
zSgy9(biqLx#(AvyTjxo<V_Esw;$?vCvS-Q}Tzj}gwrrADJ;NzD`6-J)6_eJQ3vwQk
za&6m}Znev|kx9?93e}!nP{n68>z2`t=OveRr<<2E#5{HUzGkQ5g9pX$V^yDUu<@A-
z6lse+Qe|yd;QP1rqFAw~-m;j#1`g~SMcJK<=aj83TIW`H<+1In)f!>U7p|S0ne)ar
zUS9L%wdFkxr_V>Vvd6V8>1@dPP^)#BTk6`|$;~%PzpnoFc242M_m?&b?vlHCK5pyM
zoZn@iPgpKr5plE6FZ!8Q)zufODtRnS)$&nCJUMhHUtgMW`-G#c;RT+My&f62-0m?a
zZ{ySaV^m=L<I5_+GaTv@7Oz~b^`J-d_QW|?Rcm`@sj=jpE}X}nH9>HL#<}oym1iBL
z&Cbl9xhtjE&rPL&c2Dx__o2!5is$7->k<t3j4!_oNe$jEle}JiZS<@(_V+w|3$9uo
zi?_7=%djjkC`h7#{S^E2P}P9-TiN3;t&cH3d-Cy(;t*BK*Wb_Y&zh3a^ZLSL=BAxr
zPp+9gr*E$3Kdoy!k`{c++tbIJ8msQ)|1juc#+OQ^dq>^l>!Z5mwV3J!v_7;O$uPND
z%?i7<c;aU{#^Y5#r?33ARx(!dm;uL$r#o-4N99kE;a#|Q)tjsXe;)e3D)h9Gj#eyS
zIPo^Pq}Q_NvBYW3Q_sJyn90ZRPoThZ^<?MC_dl%QI3B9-)pYF{ZO@3tCC3~sR32QA
z&%C`^S=RH>;wf4(Z6{Vtc{rm<qV)XottCezU)8)*3O9K$xq4kh1H0p;bt*>}Yw_K$
z`#Lf2IKy|-Dxre1WZRRbi#)T=Yi=)2y5y$g&V57p&#NQzE4MQ(XW&1#S?oQ7GHXtO
zVOZG1yXFaum)Cmb{p#HPBC24&Ig?Y>gOa0RpQaw3IKhfXZj0@~kOxnMdzddxEZd<X
zBY0`v?&fO;98OxQwg(*E8>ZD>Jby-dUvaRXN5awV={r^&sS)17R4u2ecDS}9tcGa`
zgX4LnwTCSfCM_ttV||5N?vs)6#LKo?Zl@R+AFpHORbO!RY;`6#|CD@{sz>WOZ8nrm
z@O*nCOn1+Yaz;;vl;>MB4mYiyW)Zi1Z_2}U%l_PoxYm~HKZA+gPwT-HgNQ3)$`iZJ
zHkiy|;F@~k@x-&4x3^?1;4!n5cpL3zR&Ja>GgAER%m$sqa~ce+!X20SG?x|KlsLIY
zI%d`1yJy&(<=VDwx%S!M3>V`KzO64Wbw0VW_uQ(3XF3c*3yKbunC?szlG*3I@VNv7
z*R$Lh7s0ZYAS1>n&$s4Bo;v!d=D}BGTmMVD9?LD)PLE%{?r)3SVuq^g&bdN!SJ(v}
zJRqAr`|^`p;!`aw75$lZ_1gUG{+z4lz_MPYzBMY$>5J)_hd0G8F(&!@%~*LSSt4hG
z^}H;VN+rj0wYz$*oNeN~z2)&UmC}{Fl0DWJFg+16D(opS?OmbKS@5JOTDh-n>pO$h
zJKkA74VTrndok6I%`@inIc>8yQEsvigr@&=$)3k3|9sZ-_lLGg6knIQ_Vrbo(~|d+
zcc;F--1U4bTL|yubKXUU^N%fh*7aO-jrUfS<lY(Q*aKtKc9m;}Fld|%zEfv<Cu{xA
zqVAqPhZotM*OWtpTNHoZoqTZR{;<q#$9Y%v_8dspF=Dg2F1|{EeI3V>o|1KkLw?R|
zU=cica-DTR{MXrig>(46tiREjRdlO+!up=lSK6{qetxJt@oei?hQmJ!=X)KRQJM02
z=U#2sw1lgjk7u(q8L>w9e%d2bA9d30bgoS3j%Qj7k0suRUDTXDDWPbm!tdZ~NuCE^
zRrPzVn)K`Y%Hnw~AG`VkcI!FnnZ149Bj6g_+SHoFEc0c}iKh&0CnO(KUA@5>x8unN
zR}-~f?@Ti$1FLe=BA!j(B`qc2Mt*zfXI}nb)_(4vedY!^A75VTO9<3Ec6;YJhqtf8
zlDezk*|5H=UmDh0ao|+fPN}!4Zx(#?Jzr)j^mj+Xiv0&F&R1R9uG6(x;qit43|8mc
zpT+SxeQ;Rq^@MjpUxAx%;i+1`6~Q}~%O2)*PRWybZn5&u1>+s>^A2Cy+^C$*WNY!{
z>fAFArXFWu@Gp!JO{toaaN5aFAerIwB<moL8>xYl?#y94>d-Rxz@N2!Y?&-;71%A4
zjIx`;iflPnYx7UM=@*{$j(N_9EKc>mw~e;F`FLq&L6LPr--7a0lVb7$l!N<T&ztw<
z(YH_1VJXXAe3M`(Ra%tBCd1^%F1gIJ;gz`DPg9mN2ZRnh;PZI4Eo@(#Z>-?%gmsUn
z{d=Fa)@t=;AwTw~vnHp{U<|V<;;(9p;5xy^DeJNJ?l;RjCEDg`D(m<z2Q4;W$y4Do
zejVh?SU4w_d85d@XuS)D*DrVJmb9)?X=JdGz4N4TUftFrh4uz7#v8x>W-Ytc+Zktk
z%-w6Anp}kR410C;rP?=^^lE!IS?2F!m+#GrKDjv~%`)HdoHmzv#xHY)l=QtZeGfd6
z5+uWSu&*sSdgtiDypn0#(=JXiU@=slcXg3|5hI_`y}PR?___!&GkMtSv3u>9by)uH
zW+ry$zT(&k>8c*f`j*5ms8Kf5eS2+IKG$lo-wQW3zKr=&HK8oVjN_c2g~;_Q2jq<l
zCm*Yt^}5?aRd~scJ$gI(0=KVY4X$<m-ZJsiI^&4uz?L2CivD5ezpR)Ys8wL_^i#!`
zx3jK#-8L5Yd$#1(q<52_o%3Js81nqe-Gi*#z6bX|k2KD*ncy@%-uc>QJyQj{n2r99
zF3WZazIl@s^J=*y3zMa?%(dEUi_ApASe{SVyISmV(4hwt94u6>O6Hq2EqMGQTU@>9
zs&!8M?kkdRmyX*lsGB-d^_VAPgXDvBQ|3F<4xCrsxI*^S=VP2})NbofJKAXdRz<+`
z`D?#$>&-hWo}@1g5EfXvz3{D1^&*dhPd*ezyk8hCwJByJ<Bl({-ET!RPguHJ>U8G!
zzKY|{{*lrJzn9<nYT8}PJ9*=h?W!|`>;f!T^6c(B^q6_)xopcc9;T_!Uw2KitO&e*
z<=N(}<1r~SmrUp5`oPs!UhlO(zof7y`QmC(cS}j-70=c<+HszitI~KIvE^LLxi0SJ
zIc*R4986cIJy9sCT4z*!-7>v+5~GE}$79)Hx1QI9Cs<hbXPw=aDRJj|SM2J87Qx3V
zO>@(%+vPPap8vd7W5ju;W|eh;`~GWdmGiWgFrT-NI`_@QbMNWs+1hi=?k(S!dGKcF
zY{v4wzpI!(i?Fx-Dhv}dY;b%qvFlj=&YK)}C;9AGQvAJ!tyXKbGJD|`*5JmMUAr#K
zWIXXerl(%3=W$JC9OL1X>&8=m&6}cGDf!v0DA4bc+dnJ8$m={z8zp2pxvFMen`h*m
zkm`8wyQtd-mP2op85*~*ztr)f+|AC7_0#ToYnbNw`_->aiJiMVnQ6!S=<NYdw@;qK
zyFhS4w$$^YNztse+N;Fw>`z_TZ6`6oz^(9Tz|^YwySuLJc36Jn<CaiKMa%jr4eX*X
zE|-N{rn{XuF-uS}$IP$DZYtNo-`CVXtbWhu`LnuY>8EeY{A~NQS9&f@K0j5odgHVY
z?KV7&*KJ>?oiPlYATp0rbS{$sySn9<M_b>DXB?0`zd!4u*Ri~*y}6d|r`lD@k5|21
zv-q=_0B0&gLf?F^=W8OGmS_aWn$7Sw`kwsyz_Pm+mnclWymD(I2gB5`vd|OUjnUUu
z-A+m{ywiMZ(;J4=(AXtBPdDG&z9vy$YVKm?$<1@F*u8nv6PR_$%&=(ol+VZWmzLY}
zpKK4`CS5-1^!9?+pG($7Nr*V_mYyL$c@9JNvJXpgW^Kt8vO0BxnSJHgby1tPT6)|v
z*}FO9e(;<1!kOLTZ7SEcynbEX>+avn9c_4LvE1E%Qy<Oa{%Cr>d+Y2M7dGEJ@z!`v
zcF&|L#(4Xe^Mz`B7gel}5xjHao8TS8ner<77DsDEKeQjc6&w@w>e{OLx0FH)mKsQ0
zKa=pWciF3)%Af1}c})M#-W@fiPWOj%<fUbs`kq}%6Do@6pXw>gTk&UB$o%|?X#t)5
zr}oEt{gwNebo<pW@o#-A^O=t%9AdJ#=bj%NFaO8=!`8Vy+)v(3a+|m$L45h+*vQrh
zjis_TAE%lux9a!pH{8Z45g?wtIa%UmY}nLQ5fMsEuT+zNZ*UKluk7EjjyZJKH1&v!
z{<EwM&of`!@m}=DrEKZ!+u7l2k(b}R)v#Gre*D@Vjpgd8JHLraEnCxf{`h?{ojv|5
zeTz#ZYb+P9pPrw?cezxr?x);L(a-+<|FpB_>0Wt~KFuRH@zg<~?OfJ{K|dykM|YcU
z?yT9d`MjmduUVgW&u&&ewZh!!``7i+yzQP_&a;b0o{Tio{?8y8pRaY~?XTw_mu22F
zpCnmyuBbxUbbevZD|3$-ch7OI5{}a5ea!GXe7#i2&&sHc4|ZPh`)+IR`ms93qTakv
z*1`VTZdvUky*8~ay*>TYO&^Gz*WJw2clwLzjSM-}NxVCg-_QGcIGpe59e;n`?rhI_
z_xX>!p3i&dz`<t%Y7q-8pIonfw7=`otNVwaGPqPaZ_cwgDQoyT-g4gxQ|*=xbJ+sk
zj352cX5V&&NIy|yH%czADHlEXX4*8{*6uw08NY8ojPF_dKKJ;o*&KW3&z^WZ>#IEX
zk9NN;_IdM6stYGb>=TjtbLDcKS=<Y=oN1p0-d>qk{5tUHZ|5H~oJ(_A|1?>;g*v5+
z&RQIvv0!!gvi>V?tsjdwCtsO$&NI0$t^V$`V<OdC%gp8}T{ab|G<m%v)?HmFPxQy-
zWfj|xTAh8FTwZK_>V7HvGwoOP&GEut`T3TJNwowYYtOLD67YW<d2VV}_N=nBh#Xg~
zO`9+L?tNc(S)hK$kxz#AcG)v$>CEc8en8;^Yh_>aBa>@7LL~_Yk2&j>?i1Nva^<m>
zM?#UuvpwrGF8hABjR`f?5{h$QUGY5FDy{Fk-y;p46zh4-m-b8Tv-+{gU-FOF^{tGR
zsz=g_d9tFP1}taKSbu5$t?!Q_K1@I4S!{Ol-R%?Y@)dK69KNkT)#-HSj`peFOYV3U
z9(yydUh4NPUq3CMKi^vIYfqf_PEG#fGOu2$X4?AAJUeAM<EGYW8}2-If5M!mt3}$O
z@lzIBO5X1(nyzh|ad^h_vzs~gx$y1XyK2p}<9TmtZvNi)^_m3J<WIeO+m{CH+#Yex
zli{nq*ZEtqS@tQDEpK;+X-{L>@Xq?GX6{T+cE!Dp>)ITc1vhL^mz&?48h5n!=TDCp
zg|qG%rQ0mpJ!kLPW!%#wZ617I<GtFk!JmC=>2<SLCvF_HJ)3ynx%c0^sn@yZn2OFl
z7xqjnOntqrYf#FK3U#$@@0E|M7S3Z$iBY>Q`+D)hzM}<Y8x&f<nfzg>kdd!S+Q7m*
z^|{RDgOVqeC6C%p^g0`}p}&v)Y~R-^%@Yq8{8z5oG3OH_OSROdNpFwmTxIr@7C2L2
z!7~5S`sfp(oq5%K*;1Ap*e>6;nYBA#Q)b%Zm26F_!ex@X=M))k`OjdrX;Pj~)19x+
ze}<V9H#q0ry|w1J#R=yA^;zX_icd<N)@tCpv|K{w!sSVOIaF#dM?QLNU(rAPQp>KG
zb(b$B?mU<E-RP;FG0$U*1ILPwx?C0r`L^oWi;W7o%)fW6nDs)y<KWw#OZ$@^buOD4
zkv?yR?5gI|Cr&)SzgJ~4-}9BLdhMPk`BgmYE!WL5dKY@|bn35vrc<rOlKi4=wXS>;
zmpt)!<NJ`AoBUPkz0PjB+8-OL%((OXQmy09?YRUPJnvqaH9hb0mcI{fo~!D+YCcUg
z+}5aK{p?A#{ueaEvYlovJg)wXT|)NXRM{hrQ$A1f<ILN-=!0lV&;nLVh7kTd$qwdu
zhc>#0+ipv9`MCMS-v;@)Vbj#^FiM;_&$d;yb!MON`ofoymo;>E%kZ(5s1%3HzH@$-
z(!!5@ZhWpGsft}2B-ToXXU$nJ*S7kkB=6h>W>&wr-nYJ~u;?r{oOZU!(!%cQ!aT`u
zee;%!#z`DFXw%qyK5IYMgHlV|SGS*9Ok3mX^du*FhfLZ!z2He}mhZ@a=^OE_gu9{e
zoo~$c#t`8-&nJ04+f<~f;=H+#JyU)DbcvNLdTb&haeG2%EK>AfZIm~VIB)V|V$GrG
z0v!kDdsBalW=~ZM)mzdt=dtYPz%#Siwfw9fPY%DQ_T>BB>w8_bra8#&ORCKIvhr1s
z&&sE(8jklFzyD&girGM6-NS<nA(z%YFuId2$+Vy#QP#rt<<eTWPUi`AG08T+uHNVt
zd+?v(fWN4ti0qu=8(&Np=Biy$k(vLkuP|(S!q)F5Z`(pxPvm?uytOUY^Hjr3mB)=;
z&)?j!&O514X1luRUd0vunH#Dm+<CMsS$wzQ-rkCa-tC55dmG>1+M=715wp5~a>luP
z$2Y8bZPpiAa3g`?(5&q{+@3bqzALEso4t-#CRA$gxo-c2vz-#}oVTpA-Ep);Olaz@
zg%f1TU;hYKO;>h%(EQBJ-=X^2x%n2UwmvgYo|jlRRj*xT;+@P*?{n-5j_1d@Wv|$@
zTTnFkk2152ko(#KtK56sya(jW<)&VajDPT8#fj(Y6Eb#cnOR$Va&TW}Ntsl{8ntb{
zVH?Bb?K;K>EZ0@tdMPBhbqeDPe*4y#ZM(P%%zigt+gxPgvEPulHSDC!oX@k)?KrjY
zX5)F+mAoGf7u>r&zsy6{Fmn6$t`+6H3;r{RW$Trk4k*8}zQiH@oV&#1o^aDuI}HB4
zVeT`iJTJPwwrC?;(DB0OWmVypwPkEyw0Fx&d@=1=*4G!;ZoJC;UDxC-$&Gzek7W1l
zj-R{l$GZK2J0?7NSeIvbTl7fwlAm^wF)|YhomQ-i*Dvn5T5df@h~uA<rRnMWht8b4
z{cGNiC)MHpEB~D1v^-&7@kx97mDy?UJQHt7iEQ0CyRY4J1<R+|k`}hB=kDkcIzB(^
zW&Wlo%spS%WbZikcFBV(u6um9WG1`WD@?o)yjXYIlX<q8msjvk;P|qld4s}K9{2pH
zdw<V(cj~h|Ua<1wzSx_(UsicMdBR|Pz3*z464wVl&zCO)u6F4iI@~<(u50|Zlc^_;
zi@LD}>|j^EerbyWyMiHu)Vyr5#YKOlXRLc9+U|9!VRh+)$4#v1F0(scS)Q=1Sj%0p
zFTl+~zFKM1l+yv5^$+mJ@E_aqwt3T&1SX@}RZACG#FeeIDZIAMrL{3|^6tHfTC3Aa
z4oy~%aB8@{Vg8w`C)}q_I3?+E^6Szj-h+$>Wp}RZ;P}s=!QcEcrc`Umnks>X*@hd}
zPYKUBsLq^kYP9qAq;Q5O1|~+6`}p47eE((n8kL$QvU`t5J(_Z7l6#F}ZiCRouey^b
z6yE-$*{PXl*1PxAmzAkbr<@)X_b{GVD!}3-*!Jw@@u;JVSGpZ#D>%Dxa)u>$e^kR6
zZ~fFK!d;uLJ!MqA|M&8(MHMN>&U}4w^H}zBXK`s;bL|G_9+{7Q_H%8g#0YUHZod6>
zW$V6(4-$``9kr9-*5KecX58nwHYCs6&w9!&*3){ImNPK1@ju84*`{?|LC$#c^_Ss1
z^82l?v>iXQZ{CcRtQ*qKd7O8ib$!CYrK^q9x&^ltaY{bku#7uUvFFe3{)bWi9FrUj
zdt_4TqdXH&YqDpsPqLD_=yuv!Gj`Lg+f!4+)NQ>rPRL#H&TXES6j8vQ9K~o<7k1*!
zq1mNb&Xw&l>)GwgKdhN`bGqn-^EY;|_Mh$P2|1Q55T?G2@xZ@OnI}ym$qWgTU%m}h
zov<T}p@msObWtr+Vf3QUF-#I{T8`&U4%RH!vHL9dw_=sB*E%~V&%m>;Do@25oaTMK
z&c19p%fl;IvoC+&UUTEA!wTR33=(?xeXcpj2)JE7Y5U54i-4zk<H<+67QNruy!7nK
z9oy#{+I;M3s#rSfyWsaHUxNGU4{f|w&aBvQRw!oM8R7FuT01A1waIRY+_B@%4#|V>
zY_shiJ)P)gHMyy{D`h%s)92=pC90cutH1v9%JQ9j*wbr=({?1dTc~_K8d`aJf`e)m
za~Rjp-X^!gfEfnO>m}DLHM%GHK574qle_2n`}9qbWVHPDPdKQfaK{8ryJa&ji25|X
zJ??*OL-D&*Eu9W?nRNCI|F&FU%=a_=x>C$&&5{os2eX0?JShIMc-C*3b93h{$>Q4h
z;=sHqdDeZE%SG<?`xLkud=e44<zE$j=iK$=BTxMdPreU6ZndiQoc-F6gPq&i)J>k0
z=q-8N$5tKUnYnUF?97EC3+6Cnon5W9Q{kb%4c9`M*%3lT^>ZV7Po67md>Qj=>&ly)
z5x2G#$tyPSREn<UY2kg$P;#s==8f)FX0``k&t^GmTEua!IB)Z8>D%IEIxlk5tgp;t
zkI~I^-eSSLJkH(g@a6Qcto?qhxzQ`N4t~#5N$y*;Q_H+~-6UVJJ#9`#X6-+xv#*U7
z<diPEyqTe?TB=Lpqe7acLNfb;)r_I13cveZoP2FV-uvK7OQkb9n^tXP*v7}mzF)+|
z`(%vVoa!s5r8dMqS;5{@d{%$zGd&3*%O}jYHh9PKNA>WWeCsvOnW6a59G<J(R}W3P
znN!@?a_!B^=?O-PGEDBlk>(td5h;`IE!*xMlev1%-5bA;Pn3|fkUYLMCFW@B$%8q`
z%*(VFUeURuXTV|eKrUPB*>&w5OiOxid|CVGi+j|vHRq~Axu>2elbN5j;-lWhrs6ph
z=Uh8_CM$GjKt%d-wUr$QV*cLYDOq<S-tU<3vYAs=EGJtW`+RG0M&BEr2j7&tE@T{<
zxP9KgFUOzoXeM8ln|hmVy7Q^kEL|5DYdn^)?Tv4KW}(Gq-8VIMiuNRF^#xy-A3QwC
z>Q~>^_0H!edlwh`A7_yHJ?mwTnoekJle&Y`b=_2rd*Q4RA17W3``YtFNU}S*Cw*<`
zx~-~Z?$L=RS#PB#-0m~(%P#kyGh<sy9&?Mj<o9)M=Uyzkz<$QkLVjsp#3}!C(Uz9C
z=cH|Xw(%loWW<|XHLX);M7`D-UN^n{L+_=+6_)d#IUc7;$lXc4x98re*Q&BJ^pmvL
zf4ID7yU>va%T!gbzuM=HZF}LVcf3yY-k!)CKfDj`vc2D^r+(!|wC~ziEYjWWjN4Ye
zveoiuxRvos{b<LQxyr%5K?l9&94lIN^JSdv$LB}beJ|SBE{%@KDcNqc!KZh3zs;}f
zOY08Gb3gfL-t*41x-EV4mL6}-<jXSsXRaT6xHx$7#@n+kJa=w>AK%Th;fK|=q_r}h
zLMuZ533vT;Kk{qi)#bA?{ZH-D7H;sf{vCelKZAr#rp&CEFm9>8^9(8yuRQMhvHIw&
zBa>czuDP9j$1%WwwIoSPt5;+5iBl`ALhdYETO9T1)U{7Kr#5cV`gHo!M*Fz0kK_ga
z*z*MVn0)6i_#|*ICF1do>uY~h2W{UwQE85mqom?Dx#-Vp&xRim_|bRaWH!@5AtvXY
z=U(lxnOrt;nPGHD4f`XP-P`&cUY&T{JTb;(yZE$;`<NN-MvHzETl-<(tz55?-JfnJ
zKAgQ=^r@W9hnliS!MRzI_PhI<_I2}zNt@Jc%?edpFMM#(?j5@)Xa1ahZ%e+(>TZvz
zAFN8&1}}-a6{FL!Zpq|NQ*DAxy}!+}*I;beaZY>Nl6O~<`prz1?NcjudwoW_h*37{
z-L$hhv)$R3Wo?lvoK<JZlHM45ywyfkXWb?d3tPiLbBRR@mTJnnAI|5p+q~vrR&qj$
zb?C<lwy*d9c>F;-<VW$t+qHGy*t&hEUNfELWS3^k@IF@kkgdSWs<Ue@yX{~ps!-e4
z@ps!F$>NXV-?A>OUn72IzUN-gCx?r|^DY&>jkmY73=gbQt2JJnqi=QP&$Ye#+U~M_
zVqcc+e>hI<;+u8K)g9B4_<bHLU)x~1pZ%3*dFR?E92KmquDAY^k9{RI$t5vC;*-DE
zw|R2&RiA3h$*ewQ<Y%z+oBcuE-~;n?4d<FY;?{Nbvzd8-b?@t!KWeO(y`B|*<Gt?V
zX^&KHZE9iY2|w^p_V2tuZhDG)KD^9$<|ON2GyhZe>-tvlc}ClIZ@X;cp71T4i@|8+
zBggyetA5@IwLDnt6z+cE;Zwgoxj{CYY_$(c)n4nB+4lR!?e_<Cs=}B3u=;Dib>Rse
z^9MarXS!W_bz63Oge%PHnUwXuY3mM?`6Bg87i4<~KC4tYa7#pZ)<+R#tBL-*tkZTD
zT>4_?_;<%Y{pcU>kB9w}zN~jEI+yXLs^)~6XTR^q6lg#9uDJU2j(C|xPS5A)f5tnc
z?)TL=RxNq6<BIxJ$#$JJNBZifhFJ$Vs60rYV150?#HN;zaObBlg7@SZM7JK$-jS^6
z_&{pQ2F3~IwVW##wkIbiCi!};@P3k_`D(|@NdH)VFM~}NMV55TIH+azc-~jH?3^~<
zo>CSbsaqvl2hyLuY`(X7-D5sah33C^zN~0Zb6Hrr?73|rA7{>lyRPZ4xSad^42%k+
z%MBAY${J3pW{eDv-gC%Xj3Gf!dy#gu@%c%YotfUL=Kgpvd7ie=FP=%&^DNiRdn6aX
zsO!{@Z4aLJ9oqG1O~E<ab3yM|LXT-n{kow&Eq?ko`$M}<-}d8YmwbP3qh79OO`YkL
zt(I|p&rS70J7oTeN>0z0ef9Q@&ZH;Fxq*poCnYV9ioH|0>^$|u&j5q!q~)Hwp7e07
zZd%;uzAiJ!uOPhds@aRM_rYGA?UIs`=S4GOp2#i{zTJ0qLjTsH<&$rOtXAZ4I1wfH
zU3K^DfIHI<t&n^<Yxdix4!q5M+PrG1KN%0cD)cjcP}o%KYkfOeQ<f>NcZP~kt%iAo
zgSgD+2&LEBTc>|ARf?H($Ba={>$dU6EqTY>E!fwZpXWH9XK-)X=CJ40tO`PwcY~NB
zdT$)74%ue1^}?3-pUn&^pNk5rr(5t|zj3MOi!$@J%-hn%iREP{MQx5Q2`y}#+)zK&
z<)e1;zFMvS3=_BTJ&{|ySFwG;1GztCYkqcn-JZ8+gVG6a-W!kmzN$>jbKF|k^H_PU
zFV{*LP22Y3FqQ-tra9#b{~5e~-n1>XJEm4YO)#`A<oO(_WVf#9N#T~KOGV2(ERT7_
z8P5C4vbtfx#48`Fub38x1|5q%z!P24T6tWi>)c%S51J3k*Un62&b)Q7U-Fo1&@3g{
zPU*_`XY*x!mTIr{iCmQXoO{RPWm#gKj}ts3WV5|o+1zaYti4ef_)~Q|&*XWJb|<Qz
zPN^&v{jPaf^0Qrl{Jdpb7W95kNSA8}x^<IDvhC{E_fgZz7ArhpsMS1`X3$>5k#NNE
zl$@VI))}!=2mV&go0^%(!?i9(Ut!+VJZ?8h_10q!wy)LoLb4@RPw8UO3dymxdJ?j6
z^|X6zG4-PHlP(wDa<g?<{&zNW0z3ER*O5D8rB=L3-MYb&<!^1)<b`)noKAl?IqG}i
z!>(4=#^<(Lb0$o<W5)Sv@dT}hm06mrb-8l+XGA>QAzxB&)%o_=ha+NvufuLOy5^pd
zUM?S%efl(C#ILfo$)yXX?wT^Sd=Bd^<Ab)nJ~FpkpQJBjUdq?CGe>Y|<$=GNyWOsG
z?C$zxd~19EM1H43F|Db0IPRX)4!iV(Vdqcp!n4IM&Ckx6dwhXy*4wSePFykbl-o1w
zrLW9cyXAqoc6Ffzvpp2jCr8B<o<H>?ZlP~+*!L8^mY($crYrLcmNwk~Jn@)Yebg;p
zUB1dCXHR=?@JKtg&f%2I#AvhW6|oD<nVbBxp1fUml`}3xj)Qq=R&?yD5}gNnhFAV(
z?45by@{Ko&S7uCQZ5CpBAjg~k@>lmBpXTSm2bEW>x9@w<V{nU;;h}Zd(RB+F4-4)2
zWPJT)u;q<Qf;(SKe6>RQZ(<rl!PJ6R9V>Un3zf%xJ#;IJ_tRzpgUau#yH^P9EMs`i
z@O@o+_`)kIOWh+%lbiQ`XR~0qk{lpkvU!E<@v3K&{xdw2F5JH2PF3*jaOL{#mT$Dh
zLv8yyE^J$K;mZ2&#(9!qPu{)Co`2>2wMeeVg6sG$RGLhenlLG58e`d~<8x*m-MfcJ
zrhodrhu1cg<}Td6Q8P>2=Y#{RbA4}-)s;7AiaZpaKQ&!nS-QRK%(Q<W^0a5}$$eh@
z@chchB3iR1y?l|FHECLG4`*ufR)4?h>-x1j51ZXdd9-V-liHkyCE~~39(Ns`cPHoI
zF%J9QOsQEjt*T_!o^cJCFh@AzyJy?&D-Y%`Ee$Vx{Pg8KN73eT&Yzt@4(~6U-t;TC
z`86@)`O}^Tf0fW+LC51P*XCRlJ;u(q+LQ5w!uNGowPm*L3^d*`ufXcjx?>e5o>Z5v
zxXO~_ch5NNQP7Rsx34YT_w<;#`u4yb%#-IW7G27d`XlwH@wu!u-1qb2cGzmWT`^;b
zEBtkh&+C?~V3Y1)$y?ExNtVa5gIMpiKe6^;S-C3g1%t(tCxU0QqLjq~{45W$T-SM4
zc5If3&I1Ll2RtRu*JeZ?pS)vb&>nvOL$g!!M5h?4Og^Z#_3gsD4Cf_n$`$@*H{ZH@
z<BOuV<Ft<q{HM1b|M_SwcVS=nB&`Sq4#}SfAFKCVUD{yg$C02tEqJrFqW|oo3GEW<
zt?$ozZQP)eYyZB?v~W>xDCddCbAoNQg#>ZNdEBa>n>O#P^onRFdCmT_bC)x-T;eXd
z#rdv6d0o~8r<3|;%(mHcO|pm#&swkE#~*d+?7N_@=$V(Ij%y1UZmHSd>vF5=fjG;C
zSNzMfZvHl84Ja+1^Pi#o*2FjGXGCsrGwWYlddP~|>z2gDTOGH1racj;4!Ic3FuQ4=
zyQ{4K-pqY7RxzG4zRqr{Q`RYQ?pf~ZCjY26J)&DI?<b3{?Poq?aXkFV6+1_Xq`Fj#
z_t&rOl6-q%Pim#bo2)(8R;_O0dr&>=_O#>1ecz32rfNB|<UQH&b;X~FT&ZqP)!A=t
zmE!o$v_?X1rmfbR2?7;$h3BdRPhU88cC)QR{;r|}UzoQFEk9ND^@;HDt&z7kHmJ+)
zUAgIq3d2f<d0TlSW=ni8%(d?L*&mRtmu`LhyTdudYuofDE|$FGd5&4`YIg~r-{W&t
zT+eRYE^)iOQMH^^{ocy+1&+%0`s=ce9d6)C__k`Z^GP1}xT#Czo}8OK?MT+|LzBu`
z?dE1K3$pv>Y0JLWD>35$D+lkZ!ay5mh1TO+^On~NZq+gUB62Re+}_M^R<?Bl+jH5^
z9*6T)co#1?>Q?w!RN{S8Rd8|Hg|90gns}J^K6w7ptFCZT#N<0)R<wD|J@U?$Lndj>
zLCJ%4g%_?^E?F0T)s4ezPJ!{O%(r<SPZFxjR|_8Bv*K|2jdasA>$HM1#jWyllU`N!
zznbQj9KpstdCR=^OS8TmbUgUjW`5NDwi~DH-dV8E%i>&fAYs)4na4{L-v(ctvvtF+
zjKsYQnAh>WbKmN6q2>&~#e=Xj6If~rD(oEt|ISDea^n{bTroZP@LJDhNhdjDcf?uA
z$nXT$EahV3{B}0WgiC(e#r{Vx17{al@_3%FYuZ|T;qz0UGu6fOX0mU~Y?3))VEt{a
z<bu;OA8fNU0~#0(eP3F>VDJ2*T?=0=`4|=&Ib%+%%H!LjQtIn1Y>UH{V~o}@K32Xr
z@5BzZ&fJ4Ri)E|2E^Sj`+Ffzt_>NVYViE}nldo-Ad*Q9ThU5deseQ*oOm1A;!oJ%u
z=I_O0+I9C-k3F1l^We!7C)Riy&evJhyYq0~m$k1;QyG|dq))1vls(Jq&AX-A%3c!2
zpB~%tMXhrc624yc@cvTgjM>RN4)*s}f4jIccL!^g2J@FSs?xGwp5I~dx*Z@Cul!WD
z*YBd$pVj9$)!EiWuU`DNfPcYpr6n$R<%;LX&9&zWY~Fd7bIbc;ZH88^UZu%bq)zW^
zuiB`!Z+7){*MjAzQyAnE3?s`0G+ocL@YH6<Ma#{#{A#)S#<@pN861ztJ=?6_^5^vF
z^xne@*51C#wa}A6<_l=oNsfq6(NE?5rWYlwWnV2a$V;kdWOQVCyfk2k|K5phvaUI&
zKkqK=&v~{vkIDVhTXmb_ST5ZXk>w((CyZ`N^0~2wY9+sknB4q2e0g^!1Ml)nt0ox4
z{8>`UytmXf;zOa(zQYogl_$<s_ib_67qgRLexdh{w~`Xcw^~n6(?0P2eJp3JoXzv3
zzpLI&;Jv}}$v^7W=H&ea))J-4dlL_eRVQ{l;9Gug>)U{JmbdP5vQG@w-c-A^_jlyR
z-o^VomA2)oYb)sYCuz^!&RW>y@#P%n+Guwp1_qe~zRI)3o-guNt!ocVF6?BepL(3j
zUEzA=hkt*fUsccC8F7QvR{p7l=(Dn*XD^G4P9DhlS9+tut)MjH`h-ie``UJV6f9nH
z@oL-ZlYt(SkJ|IU-=`Q6F<Ufp-9t8gO}}@>6SQB{-}vr*#YXty-ZJU#?C#82F1;6j
zJht82n)&bCJ?{SuE&500Z<T-RElgy4-Q<4uLfYQ=L;q|(#P_OSvEQ(EX>HUaH+`Ng
zw>xs))#0blPj#O9t}1k?W=Q_DkFOH``0Y#FA(p1GSf%9IzMSh1TGv0f%-Nlvbf>{~
z_3eL(_bb;I^eVe<nZRHp6F#}uBKG#QiA52A|IM)XdgwjjWt4LJ=H1=?yYlsX{xb+O
zUlzTYanHU>W3K9s(yh!AY46{@jG5kTV_BT?WNME53|8sQvp)3;?^~I<;y{4F?#(YO
zWRI2}ns2<zQtKSI=e&=r*G^k5J~K5{<=~acnuXitdn?_0m9OL+d;g|%l3wcsCa1?e
z*Tw%ca8BEG_TSEbK2N7^u$!^k@W=BbLeX!N<b(=4-FdWkx-E&ym8<?{w9DsFjpHL;
zvq$1#mrr@kl=&FLd&lWl?z9hcQc}ZbeVLo@(;cxZQ@t^O@8kCsZ%SrcyWZ+BXjhrH
z<a({;Z`<fApS3QP%5@z6u)QJfS!(5#2lJ|V!Z&8#lkCz?5m+J3uEid8Wb@8W5tl}h
z^$z@Md-)G>%YKQA=?jagS?XpS<+tC8t0K=g?Ad>YHr)s9p3yT|v@VLC^FLEm-?ne<
zkMbqAD=t4=`fX<Q-nFScE1is_FMnM>Tlj#H+PwU^e|7{gg?wN<@Ab?2LCN;b73FWf
z1^(P9%Gy^ED*EJ+=u)xj9i?a83MYPie|&zEagD{tn4&DRbGJnQ*>oOfl)kk7NBIMj
zS-pGr-s`NJ7i_eB+KrrvSHkbw3;YpWUgPvZ<yP8q!P!~cryVJ3`M$pM{=t9xKa?MZ
zcB_4MjpTOKn&j1Y_~Ys+x0fyFjk+rn^75FetmU7XU&0TqZ{Ia-qD|1f6`um#?shPq
zuli;icj-`Z*0P&Xu?IzO)EtoWH+}q%>&MwLlM`p(PSiMk<KgNHdn{L+T^HkQShV2D
znw+{9>+NrO-rsGl6_B0VH#xpfR_~w(dqT`g+p`ts{aaV+{Ly@Ld&iO+_iui7>+%2I
zX8iWr-st1E?uA5)-`<i3I(_3~ewWX*{|sC<{v~f}uC*$0u=B)z>_4^hrCyFtP_%Jo
z@YBPd=Qn=*I=7o);hdc}%<YqEvxB%@HAEv=&)pF`XsQy(afiu~`TDhWw~ih7bJ+HS
z{oJ~St5+|6F4=OSS4ZWZgecGQDeUYL%a7)rkc`kMvXZ(I#&dh7#e<Zue_na!GW5<6
zFg(Ff@@(f*vG3N87g?TMlyBH1%96sf&Ntn5c3YZyeSz)k6}z|dDqH@H-1p)bYrw3d
z$ttbI^E|&So_g<~%Dm&+wP~+BQnl|hJW1N{e4EV)Bex>kjj>1XZYa4sm9u}Lebn*Y
zm&^6eaq}%PWB9hNV@bc!n$io8^OTcfHka6!FrN5zE%b?`Op)>Vt);>@ws;iw2>!Sh
zdUZw68phOD!M3Yc>B{9?-C~)&;|AM-ld|W%j?LpSmubEd9$cH}@jxcIhyT*XbxJA^
zG!8zQ^`h%dfoFd5<SV(8=a_G2+Nd{q1(#LfIqh}3xAPbtvr6H5zW$-D2Ls>VV&^d9
zXvyqp@BP@*ii|Wjt-IXA_+`aG>)Kw|u4k%lhimrCJ5avTrKRzhZ9#FsF^}`t=1Hu4
z{PL(>(=)ZtlG_^l>Zh7Nvv}J#rCZueI?v;=X{w?G%ab};t(u-&JGqz~tv4BWZ5Hu6
z!_T8tp>tT~vC<ZWt?CVXCf=Hz<Z5v_K_>lm@KMf~dCivR3*SZw-e}(P=A`<k)rJvo
zC0}{|)i%4GHZj)AqpQGcp2bmbncR6hP8>6i3cQiJ^VH)xQc`CYr^|P)iQafo;<My2
zF+Z#REQfZ+0{;5hT^G%EyZNf!pCK$E`FP&dS(EiAd@al<-w|Z4ae^V_kg|jY1Mh+d
zpC^akyZ*hWLZ^B1yk#?z4<|fe?5oW_F(s!~ru5FaN#?1cVO&+u*M?L~Zsjs6VpQH&
zeQnFP-%orLWF1w$n6g~tX+2=`gsF1PS1YM7qotiqk5~0yxhmZn<gPw>o^{yTOYhFf
z^e*1MHgKx*e!rW_vf81GuRNRj=Hj%IyJ`#%$P`~%oYAAsGEL>nYGM8N9JdVT2>MEV
z`uU$B`nKKFt97S~C$8?>)|=Q}^m+0e#<Q8Xl#ExiCNUnf3YBoylz3))^L$O%-o>j<
z?O@N4-n(CF`ny*e>(Y~+u3bJWAepPWzBf+nsh?d;3G-SbBNgTZcI9WX7ON+&2-qFM
zU|{+7eayOW_oyys*A01PpKr(+2hJ{(alGC$KkjSF@z&huWgN%&v(^_GJyAR~uluEo
zyUK3K^7Q9+J6>el>~rqPNw5+=8ogKR(%XcHTuFs%HSf-No(Q!OoHz9<do5q4HSZ*U
z8>2jnHx5S~^)7A^idXo=W{|m7+v5mNfAUc?-`&UWCiijJYL}!hU3aoOzbAEv?5;Xf
zk0*u)m2DVmv&wgz(y(=WQWaYHjBAajGV}VN><aY@=VDJRJ(9n(U7^&(-SDvNe+G?%
z=L%dyXMW!v#AkhZ;xy+r#%&KCZ!OW-QtWx>p66*%jfZ=U?B_;p+pW2iEkyXTO!M1_
zY2U4z^I~|OBrT6_Vixjye5~-q+Wh1hFBa}}^1OR|!K3xA6+y1Ij!XX4p5eXEje|Mg
z!76mc`hBHglFlbASEj}K?YbOrd;W|DPf6KVpYF|ZpQiKkj>8Mr!Vh;hI9RI4G%cRL
zG~-sRR^pY7vPM<UcD%Bd-7?AQ=#|40Rvo|o@@;tX-ieNSmh39bbHepm4jwCzcy8Yt
z-}PCw>q+5ve)fAi)Xio4!{!LPyUHy&+Q6cD%yNnOLnSTF!rdy*n`3^*Z7K=cujg*L
z)ckjHf^)*hH@pdVws_pS=y7@07wetDljks499Z*v^}_8>S(h+R`qLbG?}Y-Fr{z1X
zjWai#x|8r+`O?B|+l9Q27<>G5`_B;F*jKS;^;6aU`a|nto{F%jY>z23bqY`5S9y@a
zc;i=Cr`fthO^wx((<2-_R1AMQX#ZKQ_S12~P8Km)!?)4qIR=%sZT@RhVm<d)X!m(a
zzKsodSA6c;#@1>vk($=dC+Q2;R4=(H8Tj>RUaZiOp1I4f&pNrILnG%?af7XE*>Tr}
z$2E#2iVrb9e%YV3<m1E61OFMyuWd~WabppRwyD)xa<R!zB=`I4SeY{iFZ-O&-(#t~
z)}O0Qz06UTKP#wZf}5>D{aj0dostKhZ#6sB!yS+^Rr^Az`ra&uvbWleH?DF_NS=51
zwb#|qxuMpd9A&fFReG;fNo{)}Ex{mEeXY04u=YsFV^ODbX1~uipJ%8F+q;N|P2pG4
zj^)Pd40o<(yP|#W-Hk85uI*i*l4lvPx4*vX#I~ZdJ7ky0&sJWW<>L2w%RBWsa#v64
z9nYyb{c(kh+lf?miFfR4qx2T%iOzYx;L)l`&jaZ>=64VGZB6w{EM-XDakx0b_N&#S
ztLr*_ByV|2?-r<(yQ*~TaIygNuVjl~S0Y&__qo^SdrjjD`I)@m=iACc)BeIBedDsq
z#}n9CqdP^`YdI%#A6J^0&9xz1rS10tx#Az8KNhD2L`u~2dAxofTj2RdJilmH^qW)(
z*3TE_O|>aoGI<Y^gG&0Wog&dQ64=yNFn?XSsKxTLpx2}dmhfDQ<qPh0teKV(VzeU6
z_E%4k?JD(CH-zLG__EWi8BG++dY62)Nt))Zpc-(-DuKc3pXrsU+brJ}GesM$GGI`i
zcs#0cZA4Qv-<;HjSB0_cH;py<cE(gan6<h%T_wX{mARaIa?}^YDLG#(SFRPdVUTzt
znzg)ClFMB7NSRDs>BX2^6FdWMyMHv4)#|-EO{DSnp&MKkPpYn%o?dxcTfHQql6$9{
z!OthpO(nThR2~`J`OBJVyYG^N%H-zn1;(LEw^~|<<h?rb`DpRZ>_pF^S7)kUl=HMO
zE5GOa+Nz_oCS+Yv#mU#PwRf~0@U+UZRbTzjz*?j7G5pBhK;1vq3u9m9_#L{a$i?w4
z;sa~S*KpQA*WYJ8PY;S<o_K<Rt8i12xz-cmYx^#J$p0hUA3e!pT}|R6ZC^37liAjZ
z&rh*mDbT+9<^2u$hpJr)yLMeSHCISIbI5Rhf^|60$CAuUO{s&YqFpzCPV;t~@UT&(
z$U`(N!(AfrXR_(9M)fy_A4+%pJ9kz2g#8}zCv$#XS6*9x(Dn~wh5xtu4%5@DFSma4
z&=#HX@IS+hFE6eXRvn!`$Jj}7=A5?{@2W4`oo$@A<n!6ug^%9<P&eC~wqCz&Pw4X3
zf&9Dq7PLuvetF#W^Y`)i&DW3kxASUTw=pc0G2H&A=H~jjg7GnH%XC~V{}|bxis&-F
z?;m`+g+<P=e`##f?PmcNJQcF9A|7#DHt_2n4=Hf`v+9l54`rQuJ57ToWd~nc?j;=V
zEOcXw%bdLPANtzXscsBqow7n%xogw5mjV(p+kMg}hdmAt2%Yid+uN=uQ`W_-xb2p{
zc15~G{EDwDp7raU-P6GCV0=F7qQGjin+66|&u6VRNhn~K|6A4eu5#+i$Zb8Di%zFA
zJoy~xEum7}e4A;Digb60gw2Bxp2p6bpZepj22L-2W+?J&ijQN1df^}Iz^9rFd^=1R
zZJ5cxtnlT;i_BwZ_}tI9XWhK=)a&`Qg)1j0oZxS$PL{1*wdUHKjiDAVyY7AB3=*w+
z()MMQar7rPhU6<<D?)Z(kyS}rlboH-x?6wcYJ=N5c{l?vEAO>jC~$_u+OJBgE=1_S
zq~~+OE=`*yc}(l^qTf#)?2el*PG(eCq2=+eer|As*yLhOhf0~Sy}c_+QWK=v?T$?@
zyRtjx#^tqU8Z0ss=XBlOwEd2Vq0D#rbDQ5J@i9o)YckJa$PPMPqA<;WW`TKfo9Hah
z-HY}y{oRwuR^HRx#Bna`i(ylNb3&OcuPcjBW3=+KmyO|O65oW(CKVJ_{JMDR*KD^X
z-rQMd4#+tw2>AP-TI0sYHH~Lgf!R8Hs}2F90QsQ#*OuQBb$l37x>lJxqs(nltcO}}
z(y>DkhAKT_p^tKTmRcOEw0&LpFs=5exyEz#p0K#3>}U9`Cx1G)Dll61%Iip(vv0gr
z;t~S4*8U3PeQ<-TJ&b)q_R_sf7Ppg{_B2`5nV!rtYVc}ovf}xWy=YEenY&<apj+*Z
zmvfTm-hH*?_-er^HdR-8)h=&!e7x?xSL2Oo63p}bFYQ|FD;aXsWL@Y48Tr{N^N+3c
zzqoPo``6)Wg**FwzOO1a)ZDu7#d)u*PA5KPJreEuv@e9|$HCXHY&Abv#u*+@u)Z28
z8!@NsO?B|12|ELpvu_kJ>DRq_y*TS;q`wv$8@uJ&?wG{#+@CwnRbP{x($GIc=<&Yn
zI8NsiyBnA#8Lk=Ca(&x=<z~YJfdwn$EZ>Ibo@!$-(6PGaCA5m;@Vv$IrdC}`wG3l0
zuvC`0ZqxhNTKZSogPXiPC3nxcmd=xFi(cy{){*2=@M`hi!hmx=S>p4TmdCMNU3j_l
zcji)Sg)m8#QrXv<_otnZO__V~yI%9Edl7$(wr_~Fef!>2V$agK?e`wD=Rc2WYhUI3
zA^k|09oxnT^^a^DPL*;VIDJ&|iC%U3-YW6VecBcAN9S{xJh`MUf2*pZ_wCi`*?Dn0
z*7Gz!T;Ek={&BnW$K##q{^}96ADVv8SP_5u*1mjEuX|t3FTb;`*)Ps@y*G7z-us1{
zKT2$w)q3jVC(nk(+t(J|s%^PGX`P#LT;ZQK?ZrPDPJN&5$N8B%FY&_Lb6N5n3-=2d
zEeu#ar}WS3lanueUo4j#b=qS?C-2!efyR4WLzleR_n_)}_mA5LH{8uSRIhkXy=c|K
zB8T&$Z+5lqO<okM6U10{L$x8MWnEEilJtT947=TIwnZ-rU))yrZu!iv-lZv(vgZ%I
zjxH^qq~bWQ_{-Pzx*t=guA6X%Wq!G(!p9%sOKZG8u9+stouORre)3Lq*U!sGs_tyQ
zGiAagiODBVoUP&t%62~gwAVJ}#QM@XXKFT`X!vHk+AOwkkp+*34bQBTyY}CS^*Fyb
z@oY^>DT8dwgXcf5U2Na-qUhYNzBAwUx7-ui|FQJ4pXk4n{QT;U^L?)G&XD7qr0b;K
zF?UJp!T4)?iVyu~*dn_A(0q=U*Q_GCB5M|Z>x?t_ee&0}HTSoML@n!5X`E!e@%rf)
znQ)W$wF*@tKb5x5+WAGi|EtS~r&IUM`|jpGpJzdVXsyTkioes=FW!A2eVb3^c}cFo
zPZGsv>k{pcu6`RGZoYkc@g1MHO_%Li$|Tk=|Id)VzPEpoH&0W&ftb8T4uf^qlhvBR
zSwYd#mkL%(1~*@wAM|Rzc*$SpBjQ%9cMfTudg#5~aZbs);NWWsA5|CMIC023p(4pL
z`Ns8W|E`!{3*RR$XLk8%geiCC^fQ6q=kf<=pRbdy@tYnrNm1pJx1xeU^1)x>dTWc1
zzBnHx^5E*St+vMx%;(QPw(V@b$)p9d<)XhFPduOX?dE#*%Oy7+OuCsor)OtRLf@Ux
z_?GzeeH**V9AxH9TK@d}%5~F^EfVmEIM3zIJ~`B6igffG;oQ(bo8u94*QNdapx^gw
z&+*4`3svVIUhW#Nckfe4FSA~`f$ip(ahq30tFE0s>p;)fyq4<l^YOA<J56<+eJ{<O
z`F3r<IVQUhV?K+oOQ!{Yo3Z4+)5fco878~t1&Yp@VQ<vLR+kvQcEa3M?ayytm%lbQ
zSJ>_4&V4}z9x{*Cs#H#qvpIBc@9Otb{?5-e*P5zynF?+^cF6MQ@2dwTCD>QWytN6*
z<h<pb8>-%VHnvIT&w{=JtxB=yNo5xn7iTTkxe<J4UcJ=9!W@q~lH1E=+y65}?c(1w
zx3$vALaTDcy`w#edp4hVXJJ~{d#_C|md`C(A+Ybtgn~PBCP$WklS|Z}F#q1aw`IXM
zwLa}PNNivb?JrE+$-&uRX}#*P+;UmZ7X{_lc$RE>{QS7(Ic=d&N{tQbwnkOq<@HHn
z;<Y<io=Y5*|C{xE-I^}>9R_}0{a&{WeI88lb9;9^OK!=ESN_Ej<z>5N_;(+aJX%&>
zmdwL>ck-cGNB3;j^Jg%7r|tTzz*ps*-lsdFwwA99W1cO{+}N+4TOK}bN&6k+D>8jw
z&%P>adGOBS4X=<J-*1`RE7tKA?50945yF>6SC(gl%$Z<(LNqp))550k+M;V$TuU0Z
zRUY5#H&G;2-PV9LuIcP1v)<G1!yjBevc#Ba-;I~Sxh9%31EY-1*!-+Rzidc55I6VW
z+U{Hv0j>`V3d3_tE<Kg0Ia2y))ty_y8z=Ji-QitQeXXag;+TcqvMtBvZ#62o-|w|)
zS9ab3=?V1`Hfam*9q75CRKoo!@3@8O!d!;LNk;z4va9Zx8RZ>#Ah&zxA8oJO-U>{?
z&)->x`5I?TQQl}|FoA!Hc~)f3X|bP$Z*T3AF!|h?lc27)wmxm)>%-d>`n?XtrTfIr
zYZp~rwEa{t`+C#RHJgr1Vyk;8yL$c3OP|gji<b5GI=l1ok;D+a$Mcsu-FHs8eBsMf
zR~_zT<wcMCk1d*H{OqyT33rv!wPGE|#Xjsv@R0u9)n0#Q&Fbwv^NeHs*e@<g_h>TH
zx+C@^p;YeKsu&0JrWTE3MR!-HJu*}{(KF$&`s<K9C8vdzI@ZZs`OL0z`JFhiJ1jI&
znm?wmI5K#}G4rCTm1{c{Pn=|yIB;Gj%xu9Tp@^CV^A-d>$-MDw%JiV#(_eDloezE)
zdS?FN9WvjS$Lx!kDz9dF)>-g|UDA#Nj1Di~N2w-H+`V7fN$9A%CG&-{wcJI5Mw~GT
zO;y*7&Q9La$M~jlt+nH`xeL<wJ-oMh)+QOLw69wZEZS{mR5opOXTkjPY25Ry!fbQ`
zMfACw3SVUv8l{}v^4`{CP42p7-_zP}8MUw|HoScOK6KfHx2IFvowoXUPg4;($X5_D
z|J2OAjXGxxPaLa~5=t(r<yg;UWp0spLbNZ1rE%{1d2=0ChZn8$$e%H9>-1v%(+zHS
zQu?c2E>G#R>fL7b$ieaMjt#cGA@e>YbaZgPzBg0#P=g19;p@qfmt%XFUtiiCqE~Fy
zcg-Yur%}SZ#g`W@J8AV!eovaM$D6H_rnkoQ-rudxd})n$!McWZPLG%7izcgEi^~Nn
z^*pwC#UJbw8R^JT_TWMDy%nnGRPrAMzp4suJzcc()USzAH*Y+f^6p(GCu2^D?53<h
zYyK&+%dc&cDi;6kzRlIj@;lpC^^eQ$J6dKw%hf%vA|!2_mGRDd+LK(rhA=D79S<hC
zm%Th2-BxtmQbJi$v}d+y?AaT7MThyX6!vL-U3<-dF{iJHU9?G$#iLpI*YD8Rku!Lv
zvCDk0s=98{HzTiP<6T47pAK<5f}6ux-zDEkIjO>Qq&nP^_tFWDyAAexvVu#zR`Ph-
zJgkWN{CwT=#hj6{47(15Ge1}O<ZHTar^>!}vm4e-tP7Ig+jKbpr^&~%Q~bZ3^H{yQ
zwSwF>OxP^odHBl$Z>h#<KO3HCoK1JP)MC`(u=sv_t(_%HPv!kNO+St~tbD3IGso{!
zXS1=PMlGARQPG)&6Q;i6u-m%0wS?W0%kEuO*IJX*z|Mog{Zp&1s^&7jN{QLCv}W^X
zv#RPa+aon6B>UJn*!PwQFLd6WozS=M>(tsj$qnIl55hi7ic)6hes#vXqsvTW+V{6z
zXLmlBc3iok@M!McquXr_tgeOLZZN1~K4*RHRd~Y6yAem`nVq!dPjC&{(KFTJ>E?Oa
zeucY#RM;;K+|jVXW`fmquPVt?b9=tCM*IpoDj7UY;=HNef#P}9SGvXgIPVl54Skb(
z;=Ag0_PGn1UsZ)|UE`!F%sj89Z)(sjh1unr?2^B(?Onwd7b5dTC0yrOZ!&w)*IkTT
zdY&)emK`OUsy&H0d4=eFhJf9b&zD(;wP+t??aq5{H}%-}-R?nQH}-RA?J<vgQoj1y
zV}(DvC%UUtUG?Dh+~~%~X7N5ef#pxT#0$qYw=X?A9dwJiEogVA#cDo@RR+hZl5I6Q
zat|AQ-10D_ROEHV#t9-{UuE-_cW&!;JGt<#KoG+@%k!o-3OmCbw>*9pCMj|vaDq^X
zLC#nEQ|oUXoW>%&C9%(%-)qa)bf^7#t*axt9&_!kGJN?nZ0_C-%+F*k9$#9xX<Nnt
zp5K#Iwz(B)hiN!(&|+qJv|DM*F6FfF2yTl5zwZ=>=e)IxtD4traZIZ)Pn=n?<HZUi
z-uO1z9XfpPeain$y)diecJ73~vrCvIxSJ<b2S46&{?v}!Jx_jJYbm?^-MA$9pzQf&
zT4nKuZhtfmJm`8EHd*>&RtmSw$$6ZQC0_^JiG0|g(7=DjU*Wpjgyl0L+@BfEk&*jy
zGncc-J-|Zc<BzLrCFk6mH7EAm9GhbY9+b)byE@Z$-x*~=iQ}h_mQ5Fv4t=70=RxWD
znrm_klcmjV`R^W04)RW(XmaypOtkEYRScFkrRVp0F0ZJ19k$myI>qRu;Y}&GrQO??
zvF6@*VVoU4G0HJlW%3D^jE(CeJ57H{|JJWN^DUlt%jw$e$WFbjKShkRHE!o{ys*FZ
zeO=1WC5w7iU+>k}c3$)E{QnFIrz>+7T(hZL+PrE@RFaI)UboM;U&e<YU66T?_tJIW
zi(7uz8vBPHI-Dut*k62achUl`CwtQCwiO5+XWqXzdB*xw_s=#}!c(J8&v;xq`%AZC
zv6}tv2;UW&%8gq-Uzad-5B;dSB`3sdrox{!g)x`2UY2T1K6himV}=je4^|Z|t7~mv
z%qkms<LpYkgBw2;ey`Qoesy7LNSVfwiRZl@<(cmPl78#Okqt*0o-l^4{hImkr`qkQ
zc^l<8-bQ?mjFmmj&$iuG$UU^^@%R2eioW`{-KV^GB^%w_W5oX;``m-;>$bdjmp1S5
z+rZVSL8gZl&ihwg>_76>Xy+{l?N5fbbyEW;Z=8L2`QmczANL>BAD-XAYX4B-!_}3$
zv;typ_NzJYuZ&x^ulVEfH?sNZ#{LiX3vKy0p)4Znbo0Ce7XQ-r{`-E^O<!H%+}Xo=
z1@1qtbUrfMF4R_98lsYuGa-A^w8SX!-ghpVR{pc*%&Kqv`So#rYn;}PychcvFFxNC
z^HzAleQpDb--o-NrSw~bCb$>RYufK89<}XyuG`#|2U(x?G=IPLStF(J$Mtjn8Kmn|
z_S(JTv~m7$E182~%PrnJGw;8Cvi;ww?3)X_m&f0&^4@rz=aBc^bz9!;4}Nm9&W-u0
zf^bvSe}-SH?Fu%@JmHbcb`Rb@-*5k{bH6xs@*d`Hias|x&iI|ST}<T~{!`WSu3o)%
zBz&dhYw?BdJsVt==S=Q-H2p-uk0eIs>&;<{Vpq8txI4cN;yAp|(c-(P=grmfwox|M
zUE<T9GaBxexzthA(#P<Cb#*3pg3v;TbCxGfHZBY*ThIHs__~StnS!FF$z~O1s}0W;
zHfUQtQd(?rQ1)!z*$K}zPufSF-qGh+@SMA+r})>kRo5@fi{<I$pWDVz^`y^p1=G`=
zzYkBc)p~O6m|ObYbJhPDyw>I3l-R~B_VQ)4ruNM_f7aA!rA-j>Kjp??dO6CCO`hSM
z#Iv2RJ-SXTStn5%^|EBer}B9Pb}wIKyL`D2HS60%1~<<D3zchY7wGWMaG%C^L4Jb!
zR`=w*^`AEj&XL{mI_la7vG^JKGyJ*x?p^hGKB;=)MW&_2JEt@2*w$*@UA4J2^rXz>
zd3P>FAAGt&XNf>T?a}C7$@v)!El<1VJh}Et_f^l&p8*Rcy!<NbmhPYGw=~vSgK_7}
ze<DvDdUrN|dCaVC^4i1Tn1fy3gKw(?FFjb*JJDxi@0#cp2W(f{{W808WRkyw!^^16
z%~DLa!+)<@wCSt4!Lj2EjOVPctzvgNl2x>81)I9!Ny+2Od<&!2EL{3Tfbn49t=+mY
zdG1`|1<#omtkVuXsk)2#<l{-%6)L^clun&EJ9Cqf#NzaMUj?T;k!#+$B4z4fgJXqP
zuK4a~KF1!z9IY#OHeBeoSfs&`rX}fX)9>tic6Sn=ZN<v;2^$Vrs4qMkG-n=L@$0^?
zxiZ0PYdM_X<`uYCO}kcOY4e|<HDpSgLJEJPH&1ipoZ`#Z7OtN2@9KT$teYQ>F!@!>
zU0t1DB<fcAbzPOF(>i{?`CgZ|On!DNYD3m_(^kJ{Z})WdPW_YZrupaiorp<R9}lkK
zNPAjW;Q08~mIphnr%x!-p5?vrI_KWLcK_LDVvn>wU+_9=!`+`b96I3=?3Z@Vu8e;A
zdqMuw#)I;$S&k)~3Xkj4@}CB#WS=cfzG)|zwLkMCZ|~Z(_g+Xn3|U~|xApt|WAgk_
zahX=GPh2K0b!jtWZ)MH?Y<yt4-mE9OQrkYg2;Xn{%2xY}@{y{mU*8`(tM}`hCQJCl
z4uN@gsWSCipADxhKV7kU@p|?kzBM6p=bjh*cy87HTMk0!K0RJ|PCNf#!O?u?e_v!z
zPGVed_0euk?v0JAOLds7<=ptaUi{Hs({kD7nxoW&kV%C<uAlPU9r3#&de)f}KN{D&
zE{$yznR)NG1NZBDJ9q3!WL>)Zq{gkT9d_$uzW48mxSuyGe5SOKz+wp%zOPTJ?)S_Q
z-gvu0<+%m3>3ui8lgiz~s%59|3)v)W-)#LZ{h)R7%MIZjud14Twawl?QenQe&BlG*
z=`!hRW1-5Nuj{n_{T9lVIPdsAZm-4N8$V-wtL=hv&zCFonv1DRuKRpAj;ZY#<F_>~
z$LF3sA=<p)czz~N@mZyxy|*vz+8rBF$s^|5Jtw7f-Emd<GV3`LV$RP>%kQk?-+OiC
zq*D*&Wdp)zpM0=3*muUimmTaZ>wK%X&0eFzvBbyEUE#~wn2lF-AMfce2|TfUlE)iM
z)4(GZt4-2_`Ic%QomcrlzFq2g*ZXOgE}g3GZn0Sq=f2<cZT*My_JVuNS@)D(<4?-#
zt9j&{P|NQ1CI4pm@onb&#r0>EbS6(yloDcKX1=uV+K%0qmkXXR=u`;*DN@4xI>vOP
z$edeKd^3J~<$4-FSTFZS>SOHmL(jHP4w&?H#+vQcn<7@cShOejVAPshY%3<3y;#zF
z;K@ApOZ!9i)Muuy%J}EHM`NRhxk2EZUupX-_Gj|*u0Q;~V?)ew$*x-;`yAvo5^S?)
zPvf(hXxs7V*^*`VCw_B(^Pl0da&b0O{%tk8kNJDMzO4-p=nwk)x?zo<vs}|YrN8t3
zByG=?N)2tiC1Gy*wRY<3O2gx7UvDk=bC<VL??ZP_f6?r3lb@@9Ox6h#Tr7LBD4N-R
z!usB=y{@Kn>jQQg<=r*bnpDAM!L)Db$9wB?zi{t-lH<;z_kfS{@z$E=<>#U#u5McQ
zGx7M!^QP}ozDz2b`Sh8oxJg2$Q|JT%W+8)!5>XpLi95NB=hsynb(dN4Hs_t?xr={Z
z{hd>J?Aa^h%U{;7*ktp<Gde7)>HgWnOl};u7N)tnhs6>OJXg21*UH`F+FY~KMqtUu
zFKam#Cit=6|5?E9zch4<?zvy<S^{p(Ti+UdK;G}GarFG+#vcBcVQ&`*J)Ga^UsT)}
zmfW)?wd2IwiPyGtMN59pEGxb)Rkcyk!>Mq)^8BSKcV3=Vm{^uB_x0N8oRmCajjHE!
zxYm_i3zv52;d9fPQf4@L*B6^#pZ!jzzBrQ1zHyE8TjLeX$;>Z%t}lyu>6%j9{Ao^`
z>}#&qo<hc&oijJ@Fnk;3npOFE;`8!ZZXqj}dGCa=zMB$yj?KW*{$bqg!sWtKcy<OA
zG0i%5#UyM34^y=Cw(p`#*HwO=l=Ip8uZBqOl1|RYT~AGI)!FrqJYT`w^>y`G)uzUS
zCyv>&?=8BuY)Xrz=7eLDqa<QJ#X6mtZoBceXqdIz2?eIwzuLR6d?{co;P|#Cc*%}D
zw)e@ACe~AO*W75bc)m9`>IP$z1G~hdwUH5qGRtgPb0c3a*>K`i-|EO$Ut~{}Rk@$y
zdgy7oY?qXBN@7D?fu-oy)MbmBr>5omd|9ipCS(VTk?_gT*P+=)e6b}tP0Ern=_<uR
zhnJZdiTBN5-dkq)a$kmZ-K!1fCDhirFP_QH(4UjQr88r8x^n&^IScDHyO-y(<8J#f
zJkE<KU=9z@efVCdO;E0C=X1LstH13MFxqWs@$%GH+f_2YBC{;BYZaat_VgJxURq<;
z_AgEPDSOYnrd?kzx-4|Rt5wAuu5{rsm%uTviC3-}b(;mbGZrrrkWOlsE@Jwwv~k@Z
z+fTBGtH0V^eJ%9Dvps2*WO$Ri(q{b<)1*6%JCa*p)V_+z%UF8jkb_eLAD^GM9IM;S
z?hMWymi9*T?4{(KrN3)9GTX8*4Vm=twgtPw=ks1qHoITbd(yT0j&RSDNscS>7RJu6
zQLx*8X=$YAo#Y#9`|RdNrA%6R=Uk(o!wJiycF{Q@OP9`^T+FF)lPjdB`1ZY>e_fb1
zG57nPei^ItCQ424ap5`h5~ZDQ1DT)X9AKY!KPIF|MmX%svvq#gj(Lh`FFd~9ulmxR
z)|d@ROLxk9t$oh3B2N1Ejh6veFSh=g6<~1i`0FS!mDTbO;})Av%z5gxGO<7S+InY=
zBuP(Y_U6FT%NF^)d$xW4VVT1IW6O9VIestB55ADLdD6pJN#ps`Ex!E8e5tjNa~{KS
zbyJ&l*ER-DoqIARS?bT@GVA{gQ7a3rbyPG@GArBq@AbCXDP4HXfo0axvLhbHC4vkm
zhD_eus#&HLbN77`yRvMpwq9mvNDfPK&$G3$b`q`m6F$^)o!MFN^U$BWg)g+%x;yvo
zE!93<R&!uUQ>|<8j`<nNmd8b9KD|k^Jiatw){FFMhlTI$N-Fd#Q=9fc&%h&Y$62rG
zzmpkce)qL)ihGhWxq)#>U*XBS^8>V9pCzC9ZZ7o1m}!Ywz1QTomORTBKDN8sopm#@
zxyjZyK9Zez^3k|6v+wMEp06<HN$InxD(PP(A6!jQE~{_({yt2Jx5@b0!i~pkxhHIV
ze|?+Qk)XG67T><C%6KZFUGnv9Sd!%nPg!lV-E#wDeN`q{#yoU*XPb4!_~CIIh9cvG
zYfk)N*vuMKu{tT|Ns3+--`8%BSH0JkO$nOFHKFLa#p5rgHs%a!Y{vI3l{WtQ7W1*^
z^I3n^<6N9FGOg=87cUbEH*IPCDE)Lw$$`IGCnkUII=Rz7pm5gdNC|x%kN0PzJv|ua
zJl-M8>g;z*Tw5wvn|H?v)_qCtQS;RJZUk7@oc<H)B+hTt#&fDtv`i(Hb^6o5pU*aD
zMi<<j=Jei&Nt}Jf*F`A@Z*bl?k}UJtd%xidl`lWL3p5X$a5$jl@VKX^Ds54Cl(e>O
zmoS^;t=r$27~e*27i@D=Jm;X&b#q5^LcM;5zw7f^XQnAPth4<gv1EGC8Sfb<+*lo^
zTb?dCrY)4wH7R=5%dHX}7J<`_%T4XnalP5KBIoOIrd`UqdS+`kwpI$KFnGuoz6^Ql
zGx?nV+ALr8Sx;o|l&w(NZnxhtR&eSTqpfH5YZS3N-}$;)!0}W{@yp;D#~co*6rWga
z;Cy3Flkt47p!rFQS+=WgYha#xVE@wiR<;Krg7f39iWq3Uu`asHD0B5`%h3r{rGK&~
zZpnDm`M6()&){&M_0`)YTEC~HtF!lMaU7FYcw+GWY+R#<%^Y)yK-V{047M$uT`}J#
zeZ9<=wGkne$(G9Rdish(bT6MdaGEu5`K2w2iXjV<4=@)zpTD+vZ(Q5QOJ}y{^hi1<
zH@Mq`o~b$LuDs8>I<!LkY(j+4Im_e=f3@8Nr`j~O9^*LXztr_j?}WEqXZVafRD^GY
zo(^H0u+HN+%RGCjwUR6hs}BBtzBD7!?X!``Vuk_+8?F^gcdj>nk#$=%<6n-5t=YA;
zYqy_TlAJ9w|HCS=LiSJ|OLa^2{zKbx74L=cls@@&J=MIHXU@9LwQre}bAvc7*=4n!
zWH~djRh;)K-DRZ_Gwr~^l~Mw$r=8>H-o7_ida5M<_PW9*{<PquwnZ`z=I%In==tXr
zi(9Wup1h;{xV+cyY~e-1b06?k9Mdj&yW;jMEyq21=i?fBlCLf8W8OZ2x%Bzo$gUeF
z4BjkZuzSyP<-Pp7k8@}KDUMopv1O|p?=5Wu{T@xr;PaO@<gMLv?b8jhn5K$#>t2~=
z%(qui-f*_Wo_mjqX>7zRal_-Pi;_<X$?tKGU$M@|*W+^coW7Esg0Jsy`p<CiM~Pd!
z;A>9dETNQWw;O*iC9jlQwr|JfuNu0KTqYjkDOK<Kx$XY3jW6f#YMp#Wb9?3s{`^au
zO6$9W6PGeBV*Z|W$fwESjdl20XYs($Zxbz69}V?1e%+b>u#ewl$IY9Yk5;TdI$y+-
zckRcfkV7(a<~8l<sj1l$&7r$=2gkY}I(H51JF1`UINvE}V>PYgd)d46N#-|g`u^;&
zyW3i2y4ofs^qf~=Na~s5UH=*SRHnT=F#pUQ!-*$szMM~v{8;fQBKbc<#H+U#_#D@p
zU9WNENk8G~eZud}djCT!Z&$P~XiuNJfw}qKzPgA^^ORaSX^BVMZFl>9ygcKhb!$w`
z>dSUtRqiR*dPZrivsuT;@>TRv*gwt48;e(l1s<NpJTdy(KGj%9!Lt{_72X|u&b+iB
zWYL4_3CE64`TCn*KqYXC(cS##&mMnSsr*r;AkE@wzJ6K2<euvAN&gvgy=8nhT1bEX
zELZt$)$}^0J)5?>N4FKuy)BbGubpkvH{Z3aZ-36~`TBak$kM|rd3R3u`0~dE8&94f
zZTDlJ7!SUl_iRts{UfJKLe{iK@a&LD+p^{NPt_MjCphj|$X2K=48C$V<XQjBH)6Bi
zFzzciJRu?U^Zdiuu$hlI+NU_GY_ygTynJm>(EU)2l{<Qb+c>O$UHvN`Gclo{{dDZ{
zH2dAb8rc<dKF`{AJoaP%gZXWB7B4?8wzy;y!T8&3-GZFto2p;guWzkUeeBQnx}M+0
zwQ#|YNk`Y1N|$S~)kU_aJOA;j&3>n`C-~W6p`X1^lh+y4P31qbo+ndY(njQ$-G=VJ
zOLJPcto3bwpL?gCGjFN?!u5*}CadPB#y>g7Y8h0%e0%bPtIiFElW))3EWqeBd4g5*
z?OW?!$I0#eaBXAhvMj-lbqgjed?Qho_;uAr9==NE^;KU~mo*m!UlnRP(~x&up}#6(
z)0@ca8N6H4rrA$03|H8`tuXjaXpe?;<8$?`oHu3OiabkoRdxI&w{^ZvWw`dI#~Wp{
zLl&~6=N&%B8anMx4nsQYPUfw#Z!SvBSkHFwj_|n)7N+qhb#`xi@cCF(*pUhE;@CLe
zz79B@6<Q@D_<glsZeHrCHGx}OZ}7IX<^4TcVim(Hz3REezYl9(S0_(wyL~f)M}BS2
z%>y9~N1kpxe`#0d%{isg;Z`03h12da$d}K$)$y~q_ThmCjki{0zF5~KIGN>%R^Q*(
zK^p%V%9!OiA1lv#(-Um5-0sLnm$lQ&PBl(gzSdUxC)WZ7!4vFk(<dBAX6X@fmv7%|
zWwC9WNCNW&|KP7{FKxQ;bjns)x$D1|XB=aA^7v)23`d9S&*J9E=eK1UEuF!zoVlkt
zjE6C%=Jxd8%eyW;^K$iW6-wqi{PdVL*Fvi;tBO2hcb-q~x;9m+erl1|*E`l>H4nEn
zaJ>y|p0#Moedoznk6l$fcPV^r!LKFJi|<OZGM-SGxApF89$C?*KF^mY&aW+;HEE8)
z<ix!F`V3N;)*`E9<~*Fa!;<}rsmR(^mUR-PO6y}pd*-nfpVOMjc$(oR`~Ic*+Zr`@
zOP*Iuwf!lfQgSq8uGgP~m1<j4H{UrR^PnebwRf6>0`tLRRgHe%E<8(fp1eEH_)gHm
zlNQpAZ{LSK-K==v$;Ymw+X+*T$32=dJt?et?QK48ndB>_Yb8`UPTfD;w|M)tmATAK
zoXT7M<ry01e=Cgily;ppVdF7Bj$=+&Pb|H&=Lws{n%!xJ3C4mqo~?K9T{5XUA)MFy
zP1(Vh3m3EAUaWcC@k-g+=<v^1j8hsMkAGcb5|%ijGH!<HtslyV-><qO6f$w{?h^;s
ztUNyR#!la$?wp$+-d_J^`*rS{meuYGNyQUf>t@vGUDdTS{ll{B!h`8n%VsTnaL2BW
z?MdR-C*jY}_tcp4O<t;_<s2jW)bSjfcKElPzf0Ed<EglGDSM{Mq?6JoXK8ZU<*@v@
z-|@<B>Z{)tD{jgOt<?;DzVqrI_su&x*C|)rvYs)YXXn%CeVH}N&-YC?GWcv4d#d=v
zfoFTYzb)E$DSuCV@}sp}70WODan9P#sZ@LS$CJW)dmbOYmMG*=b9bYNHM?U^iQU!@
z6|dxuE$+JU*PgZW*HMWpudn<({V2S1l5EyXPlY2-%{Dw&UR!CmaNW;$PwXCfTAnS7
zms>d9=cDW;rh>N<CttbVxAx@yNgj!}ukE!lmDr(H@#BrpVsqw@J0|Nq&#}Lb*tKNM
zbj60Z2UkzKE`5Ucb9HELN_u+YWz*}dr)~Y`t<+vCDH8tKbE~_>lk1*K?@iZQuXlcR
znB44)-9>ia^Q&H!ypERs+gT{#WO2_zX;-|quZdOQ<hyhICKo20kn;Y*=<r~k|JJJW
zO?wm<S4?-C_0*K(-qVm4*C)^K?U4@rQOUQU{N?723@Ph=?R}`<9%mN4!Q^;Rw8gC-
z=PX~w6fe2A<yqC2N!xW6{PoZJk^8`Vw!PGvX`dCQsr^3saejjKs~77^yLn}kr=_V(
zaM`^*X`lGT8ugD#&mN|1i*A{*(dpF<)y)^eFUB$L`mu0{+lII$<`<8-WQ+8fPww0L
zG)cqn&-vhWCYd{K#v0##_+#3|=%3=Qvs`?VE!I!{&ycsb>U`vfbB)EB2119+82fvV
z+xk}VAN_qd*!#oMqrdlveec+p+**6oe_8g!wbe(WmiN5B_*J@X=dGI|C$+SBWHooK
zT3q+a=GXekcc#7hy8h<pqy5WYZ*;rVado!N@wxZzNBzEiIBIuH#9@tl7p&5GPp&_A
zzjao~w_jIRGtRNFP+nU5^nvF2Z!s*>G&<N0-?^@*yRN=?<rmAES*=gf|6Qn4>i7C!
zxV3fvrTml#Zo}Ull@@Y)S3iHvwD{CP$$uYZS<CEY_xP3G7hgJsMcP{A?*rQ?r;6hj
z!W9!*M76g!&)Hhr7wdlWLino+i(B`u?U`ks`yqtYdRy^sS=X$aN1r8jXf2+=_~cq`
z|A(hjwtq}s_-*ZMlaK_b_3D%34n@git=*FPJ2m56nOKooL-n;a8V=0ziZbN~SCxIt
zJN)P7F-KX}9LJ1>4#5YXOne<G@zwO(`UOY&PtK5C&?dp-XZRy@Ysa3{hJz11gV<ks
zO?%|@^xvoLqE*_pjSl@1#|*UAyz^OQ(xscJv}+#Q<@1*o{T8c8O}SOX5!1Hz%2w9n
zC#NZ|kY5`SE&OTSpH*MZSKTta@O*06H_Pm~*1F1zepdJ0N&dQK_FltHZ`>qOieJb6
zxmC4m)l}8?50g)>GRjQZ7SnrEeVJkCsiJea^YRN9Pm$jCmZvT)uxHkpeV4f26&!7R
zuu|rq=!?%UpO&ZZd@%9W#`Rm?yt7bfzAn0S_NH`^r7NFKuZoy>l3}^z?aQX;UhUF*
zTFM%{uW;5^?Y$~;k)DsGSMz;#H)2{Cdgy6`<)4>D%NL4Q&vRXo(UWvoATpwVYNhhF
zY$;!kBi@xMbC_RfUwv<qcK6e2&-vdhA8pFpV>M|5ub>m(o0MmpvJU5OJbXLTXH$Y^
zngmPo(!7_mvV0!S=h*WhyN*|c^@-WL9mkBra=&bGwFvUJI9_$^ny%3ltBTP0DFXg1
zTvxVTy!tepK|4LOEbeO6rIU+qZ&nd7SiWFg*Li<+F0NgC-h4Y(eihC*)a|Dj&Utm$
ze+I1^8!tA$J@sk1&Kj$Krn~c(F@#vHyLiI!&+EAJ9$~y&N*N|)ewuK%hhvM6i@D6_
z`P27rjp_FcRsLT6@#^Zu+c&7|Fg#wKHTA85Nbl{C+ygH%%5I3yY?SL;AuYK0<ZjEC
z;mVuC)EfldosVXoOuNK0anAf}b5#`EB$%ohUq;%Nn))28HYrJH5lg%i=K5^jB0h21
za{j1Svuyi6HTE?;{&}rzF-Ms~Uo%5rrK#Dg*z+uV_Az=bdM>Z=e8Jac$5m3+bDvk;
zn{5y)({#MJv448kG;`$%k?x@}W$RqFUisaglDT^d!<rdE#yxdYPKFkRwuQe>DgU<W
z_Q}G=1~*IFmy&l*aVkIky5vjJ<Syr%$xn*busdlphxAM>Ru(vW;^Yfk?V?AHJ2Yz=
zuk>y0UE?Jw(<JGjWn{UsO0G6sHt@tNnFe<)KI5(hmr_<9<13taYt1XZ+eUm5Uzt{E
z2Jv~`?dmSEcyfAzNb-)FCw#7%?%FEJ8Pd_8Mdzosr!sD;{us5<`Ap5UKbn~v)-FA{
zm`j+aJ&*Cxl2pSLr>5HbWnRnJ_+;YN#*@#R!%{5bC)VYpt8WcmbA0ucWzpq2ryO5+
zybN6z>KGth^xbyVn@d_u2g~LCrusc-T6G{-Azf*b!<$_*%jcUb2;VntuUZo_!Jl2>
z+SkWIZj1+CWQ+Z5cAsR}w<kQN#9ig?xw5DCCwM4relmGd0mtg^H~4N>Un}gF?l|Xe
zu~uxw<0&08zbDHy`}9A{DgUz4X7cTiM?HD0J@Xu8K51PKwl+I{i0{vaXIm0;wn-HC
zN3E6NkuR_@PYz$)=v{c-zG~s_X^T!ilHT@>S)psLg~GNXHqDK$PaEeL3!jY%32>G@
zZYjg3745dM`G!l+#(&>8tmbHCIFz!@LgZ`bo(;(d>e&7EZB4V_tE(w8FvwOnDP5J!
zlAu<3()K9VjR}+IPw$x+v~}lsr{X!Ey;iK1`g)w%boSJ<A<;?w_cZPl)onFNmg%3J
zpXKq0A<@0gcGVZLd2xJ<C!Xz`v!+zT%r%cw^6_$~s;f6R(=Fdw^<BB~kU>+DtK!$y
z6UwI^&c4sQ*WKc-ZMOlBS@=|YZN}@b!wzb=T{yRRy@ch8w~G%oFtC4J{ZjIV!Qn~1
z>DwJYnOWW7kv(pCQsF;?)?B~B#>S?Kx86@#dt_3cE#qLR4&C5j@!hm%?%Bm`TQtsc
z&Exa1y}mVMXM;z<{&I_x@1t{>4J26F7z)p4EmzvpAzg0yr(@-_O*=O=p1<c(aHOxe
zhw+@Y-m?qq6HmOldg&}j;+BTvHgm4k9<fvqJn%kj`GPx9S7o+bOO@E%d!XmpqH6m`
zTFl8>w%J9`?q@P9HvW5Wxq^2G$0-KZw!(W`i}yVa`C|EPtIpET8|FPJS*f@s_lWTB
zmr=cG9PIgi4kr7&Se^(xC}K6Wbv&4v#IcxzAuim)Vx>^d69#F?gGx&bTMq<SKH2#G
zZJ@E%4i!=M#(PV%-d*gCHPdn3`Oo)2@!SQard2ocn2QpgPx3eQQ{K|XuJYuutkxC&
z-OqTpOnWf#&x^@<FJ)eP8%Ny`VbSN}v-%kR_R2A%8Bg2Fu4=pRPk6m&JHvX3KU#lx
zwH5yQcKq7T+1r)}#qx5nPwT1+Vk_d0U$HvuxU{#Bcj?)XKApL%jOSlk=VmSxGvRpu
zw9RGv4Oi{HD4yJ9d%N=-U*WvE`CeO7fA60-<K64a3|$L0?t4GAF<j>J=g{8<$~X5+
zk$)@m;M&Tjsv9qKlY`qNq$`gv&5vAI>a=8`vV45ismqa}1;0HX%M?dXn|5l_n#P+E
zJjs&mrdN4+mb_n?Cv)udxu^De{GV6O5W5j>!QC*`beHyog`T#>uiu6V32$wXI9hTv
zOZ#?NP?MPUj-ulWMHgM1aYgosfx;xskC7s$7;dW6vijwoa`O^!4}KrLw9I?b2A6lO
zes2EO9w(LN97!;XSi$n=u2B}J-~*jY+V2kBI`F}6(dw*OJyo{dF=uBg%WEB(8@Zb&
zDDT#^Nzt3OyxY~bJa@SQ``N^2t@cLCi?lCX4&8b=C->2&Q_>|jgk>1`wA(&pt!#?*
z3i$BKcq6ZLPi{{M^QD#9w_dv!s$H{7Ja>0F^Lo?I6(@Inej2UZcxB&;S6}zb{GBZP
zbGP)nH#W`hV`|@bd&d}w=^X83<c}#|CmnQs>AqR%leNV|c?x5`EnL4xqrCR(3&!^m
zmls_;_vB6a^f=uL(WpncuO+SH*^8cE+O+;pl-}dC$ho3BQ`DcCK0p6x*|adX$z^X+
z<ex@{m%mp2aMaEJ>^#@<L%NyS%Cmf>r%UbJz4M;v)Ek?M>fSF6x0>_qlv%?i#yQ)o
zp67inRcwe0m-(I?Ae;L1Ryk9Z=)Wme)uuZOr}nj$?wNG%z-B|s<I1<T=-9*rhAD3n
zRnWYBzP{?wy*Ea09eeK<-?$+A@b?Xy0@vb@_Tr@>Q%ZNfx|QB>^@_Xn?!?Z7zk4~p
zitZ?tT<7F!5ILpx(w^l13~S?D6Kf4Je(zr&<XawP`{%Ro^!zDBjJDcm*2;Otd^7l5
z9JX^i*Gb-EOcN(hu$EuBZk0vr#$NF=lh~P`6~Dg1e{AK;3rCBkwggT+Abt9~-PS9I
zmrmPuPrM?Aca`z>dpq^T*53KD*e{k<Y?09-vm0&<vS;&dYu#3ANe!O=Scb7{vF!e-
zg?k02C^PQ*@@=iemmlxf&OVoxBj;eDEaDn{*J$mT?rRyF54TH5vYwET__jLm)|vEV
z>BLH{<?p#BdvA`+d$|4N+$H@*4Mq;Kj_Wq*vPrT;OF4-MxEUDLX0Hq^y7qj!)j7N6
zXa6(E*(jE;jO4!JI_=qo{5#>#Cf4tspSSe^$3lr!PbOr)pD$ctk`*@TwioN6O^+Gt
zQlfseACD89f1u84_a(J3@5&kHGi*aXxn*Bi7<%f<lWl6EmT_~vI36%We6V`7rnl>W
z%&(6j4;4-<;E%nUDX~Fbqxf>Bgz3fV7iCMY6d&Hx`ZHvmg>2#Lz`t`ZOZLp$p}g?>
z>gLn;xA63o9yJx`D;GXB@8(gJF5}cKr%xE4FVZsG#>1)Osm#Ui+_hh6Ly799`fi)F
z35`#CPdW2FDfy#awti*nrJb{RSnodzT2QvuT0>Ut&O5I4A}5Z|=n>tXXS30?>XLbQ
zXlNR9-yErTOJ+U~&CDyY$_VHX=kofzedXE+2JQXqO?>`qlcH8~tl{L5US}9}db$%g
z<Lh(A?_;&t=bBefSK^$Oyv43Oard)%N}oa)-YjU`!91&#Pm)>B@80T{ud<FrhlL$H
zG_Rcb+Sa{aEVrwMh1lr*t7`6%2|2@e>Gsv=eCLzruPyB5Vpr`yV?42|fXP&)t+3DW
zmDZK58_fhx`R-b5&OGP&-qhGLmy{D7Pab&w^Xl!MsjOAWQ)PYAV~uubxk-GUko8VG
zt2k=MF>fKmpInbiU0E#86*tCC{h_}{aDw~U$!Ckjr`<~yDZRbDr~KQhXPVkFOQtPz
zOIR>XUF1bh*UD45$7T4w?%KxsBw>!|WA&aZua_~(2?*Uin=wmX_YB(x_T|>QucmF1
zE?|3C_s;Uy^_W@Vb5_q;$h<&gxi^FSbcGK_TI(-z9^BkvRi;w2PK9~yy{Tc*Y5@iX
zg)d_-zvz+9=AZJbr_MC!x#vBvpDC=5mq+Pc<TJZFC#Gy^Bm1;>zLvThihCX;Fvf}=
z>k`&!R{pxG>5dzNRz&kLO)tH3N8Oz*T(^{{Y<OVq7_3*^crxy9Z(hWYxc9*m{?6q#
zkmO=bI+>}uq;FD_!3|}0<$2jt4{i<(bziyt;aStK+E*J&iwqX;tuAlfa^!+a_+&Y!
z{(ELcj560}{@@S1_~z?rgUu^v-eBC3%)T%CQk~ALi<x!OyS8tcEpDvXpOL?N;`h~A
zB|l56=Y+oY^1I7#_Obq`qJ77@n(o#~rbT<^Z9S7^b^qH*bB$AzHBSVdI3W7u`bWF@
zMYo^di?%#?HuuGLqczo!a&JhyjxM!abH4I}`f={R)`t%t+BK(JZ^op`Ym>Z+a&LSM
zoOktA6ni(zB?nKP7AE)nwKdr*;>C0)o>=ejqx>U>h1qA1lSX{r=Io-Mf6f!XrD`!h
zeDdQ^^*5<kUjApu)RuU+^>C>`(k8vC0zU2MCv#QYRQ{E|tF!s2WA%4Qkk`BO@+|X;
zthqjK&SyR6P%8PlF=mFP#pS?^SH~|0ueg=2wCY6hugmK4850y39<Qsu_VwAsCk9$p
z&$l|}FRfgz{%PHhz5U`-*Gfre^4++?%JA*mvh&Jr(b)-Ix4e~Q5(KBqq+AKiIP|E1
z&++T)v(~HcynMQAlR?5YeVzMH=DGf7NcE3;yGQe5c*Mm#<w<H5am?xLvaj||Z(6i}
zN5tul1Fv^{{gZv)PO|RoEV=dH!uRe>i)4EwlA>3A-83?|%H#Dyo{-oFUnD==ew^jM
z^04R=KF*|Y-ut)q^<CKGpTBC6r;IN%>$!gmeuve~{jK$Kp8OWioTWmmcpu&~@Hbt#
z{D=3OViS&@d2vP_k3X#E7TWqfuKhy5)X4Ss<N|;DW_d6FV|6vnaFU92ur24e^%M5+
zE}XrSTX45UQuY_=N6!!2|M0UBFHYS2Onb`7S5+V5wJXveF8$BY{&aWOJM-Sf57H-9
zu3Q{t^5T@{t4fPqMWK_Y9lPGJMRxi{y{o4tco#SRxV|@gpIQGQIkC)x@mq2^C7dsw
zIAHN*z5R!Iv(@J3e_P%9>0(`4@eTgxG4&mP-1R%ZMyeLM?vkCbXilEolCT>-_Se$S
z{1Vi0UhY55dg`P{neUd(dKPSRS?JyKmBm-C?QPk=hvDS3V-Cl?PHov9lGAj9-R5)G
z%}t>vl%H~0B~QwJyD()<zu>y%j#*s?CN0o>^6{kI)eDhFeqY@<g;`yB{no_DeglSc
z5qw?l{#7q^t{(h3M}W;;CT&;pD&yU+a$intD)Ml#X*k|>Yip~z>w{c&#m+Tr4VVg~
zb@m$`k9x6IbV=}p)pL?%i=*DiykGETv&KTtnE7>Ai=-3fH3BbQUm&X$u~0AYTT9?M
zj_0PS0*ZHTJIH*D;yt~QMW9vt(>$yBQ5X6ys@ys#Fz>L<-^|43?{oS%C7ISc=R`Dk
zFqGJS^fgvH!Mn&HK}1o$+~%t0mIvNq&$pIz=cso-jcF+0b^GR3zSH5p8FSdi3r~wI
zR-ZL3C^BCm!}qnnbXk+7N=aVTKht~nZt$2h-{8|$dUfJyx!${*wyUFKWv*WjKL73w
z-zP?e0zUSrqq{Dv=#{6sakB+B*e%-2_wT^O)*#CRDq*R|W<2d<NW6UCWNmKynaZd4
zrU_fHOFX`};_RYkr3c!%(%bdx|1*SE@gAGPaeMBX%9oLsUgpeHU}8KjbIsW6u+O9a
z44cX(PvEd=TUMXGqG#8NTNUh=c1z|2IzKGyTYl%N^RgKq%2x2yEs%Pi^{g{GS?JP{
zRfddyPhT9Dx$d02{4HlIi}~`ks%twwZ#orGQ1<)U*Qq;%G}CVPKYSZ-?5kwv^0y3A
zc-TKQUfa6xGUulgG9Nt7zYNP+6c)ztr0BN$hgny*Y%$t3Pt-!ye=kRSS%9xe0|U$C
z7Zyvi<#j7qwkxyLZQakiO|<Nj_`)v>AF`KyKKTAsruPo@JI`m`&U&y~rl<Ji`5&R4
zNuT;SSp<7`ypO&v_G)9F-=_lcjeoMHY+IF<dQ0My+3(+B{y`HPRjk8#TTY%UynJuP
z9XAnyjbaJLyLM%6`KHL#!0u#xVwG@I>kMt)6O}4*O_L|4A7AnGSa{p{Q(6_B@iXQ;
z{=sQ!I-TW`OGN+VU60pBHaT0eJTQ1{+Wf9|^@=%pryrbhdXTuA%|@zz-U>dW=pE;>
zG#o#huTGh`U42gQO_tQU;K>Jal9on1o$I}p$$yU6gT^b*Hk3x5(0f(b$6&g$SbxfK
z=~#Ew_Vs&<e>J~X+3&>X@iyS*@$%{!;i~r+NZ4(ec45AWcJp<)FCV4NuAOt2`4zTw
z?xyFe%)&Rm{mB-4BN%h5Z`)RvRF@!!=kva<W!=eRWMR|u>tbfssUx3ziu<;%n7Ej?
zCBfkJouIHQHA{_lGfErJdl39*zoCOhv`j(a&nt7<xR05a+SazZD^!X(g~%>{_t-RM
zSBA{ly<Wj?3;GUxa!tQebMWJ&YOagZRs9}ZWR=m3n;MoD+Ob1=<8iiC=1~Hd>fBU6
z^CU|iFO2x!<t5<BWqob!?>RD`@60+mWBT1bH{<3@yB4h}_FYoEJ;U?&5xG6zSKad#
zS}yZ=PFU}e`aPBwa_vi9``RszS8XfuGz<6Gc(v+kqul%H>(^=>-g~@wUSZgSz^20s
zENntz?g=P)Y_O1AeZk>}lS2TXqujo)DupW*cyi;GgdS~}up_z8IMOT3JS0AG;;o72
z7%fklCRvy0R6UkSTX&c<UE2M^^R-^O`(h?<dA>L4Y3XXSUiA`Jo_d4hANoJfs-Lp-
z!kmq-%I2|ewQ)MSv0=wM>#H3Pbc)OxU%!rd=bKaZ+qAah8mqd!S@?>qiAr2IZnxPw
zuJ)MCQgK?Y<+0_;X{JiH$J^gk&5?RuT<bUE(yLQ1nOaozAO15<R4A%TJRy1D%W7{i
zY4+_3p&hz6PpYyc%et!D@`l=aT|6eP+@l}!Z8c~9*6Z2%i6<FCma&H4y0eW_^5xO!
zZOq9V8DnHu&)X{V?mB1izUH?N91bu~3ZLBP8ntbkYS#t{n}lEduU!H}xto?Z*q;2l
z`oqcu5v?ZU9rLyd&7Jq~&5empBCWS4_)D&I-K}hFHI;YLq9uL03-Z`MybYS<v_4EB
z!8GmZy0$sfJXXDK>S=f`$s)IC)xLnnE&4G}!djNrY*<y+`bB=Ob17%UVVTD(7FthD
zPZlakE#ux^@VxQX=4H;xLa(2RK1nI4o4UU|XH#23@x+5NVZKMyoF_NFFb-d6mT`QN
z!I3usOZR(qxw2;@6fIfrw{@wGSFhS19s|pGugo^zJ-vr5k7k}-$iH#MhK*@2x~!`{
z`f_<~keOiMo3X|#aDIVp(c%RwraG{5G1z)8)LUX%Vw@U#xJSF>Xt<^_6UQxg=6hSx
zI*wIUe_7#^xHRmQ$1#VO(dv2aB6IJ~6bamzvxDWkEu-ktbk0iSh6PMj-&U--V0g^1
z@5VW8r&~-hDNh)x%D=Cey!oQAXzfkgMbm4h9(+0LdXuQ7PRMFLew$fqr4~I_*xWyZ
z@odIzJ#W1bo+muvw(r)R+p*f~@U=T{1Lo@$&iUAQZ>@^Xs!&fZtMrwoMp|!wRwh{n
z8Sh%NcDHqUo;&k1S#7(tb1hT9D0Hc%^Ht=O*scz`#Hhg1^LfsrnX)@dIm))xTV2|^
z#fbH1$LZS3x7KDSMP;vCoGG>Oj+Of9<14?en|4lT(Q}nP%Qex_h4N>cQl2;dIhyx!
z<<?Noq~(&fKiB>8dhuj-VOo!&SIgTNx!oNvY_<OG-S#YYVPE))7gtr+RCM&D$l2w6
zU7not@z{zV(i=Qq7`~02(0$`+v6geT+9f~3KMp0UxpP+b?^Q11&q>>=xRt%APekzg
zr8UcD$=<LySGd*v^SbUVuh~^Hf3_`rto39=9{={O#n-J8uYB#_eB4UQ!CB(|&bMFI
zeGlDecB}Mssz_sN+P{wv!ffQ^e7P*rcgTevzcay*z4CnQ-NLv$vqj6f%e9ue{XJ|R
zH#KRaO2>lPijICuzW=JaJ}vIF(!EokPVU`!P`y=d>ZKpMBolY;?d;mpcjMfff0pa)
zBIXrL`>2?%RlIwF<$A7J`N=b1FPyygpz@(LUAvv8eLKIl@YmtDPN#m(X0~hEy*9=(
zHCuK|{|?O)TzlqOrR|LTvVGs}@0SaYaXk2&UE!(zM96ow%&KU%DJe`R$~OyNxEek4
z%;Yx5<9F3}eqXocN9D5)4Fy9BNsH(AZ>@;AaWG@G%%`Kz=e$e(C!h7+k9W?dZjYy>
z5@Bl2JC_6*PqjE2%#{>weeOYVQ+Clmi$$rH_xM%59p9Q18>7?vsWsnuo~w7}%vY`V
zt@pEQ+&FG?ZS5R!pXKrv=OtxVYh8P!ZlT+LuAt&*N!auyqKZz(YF|&=vNOm^^Y{6p
zr#<&mi|PW+4BKqDUTv{{#>4$^sf7gd*EJHexO=p=RQ^7&eQosC-PxJn_M8aq|L|?S
z+T!56=NA)ekFBe!o4Im}m-pX0HHWv^W?%fHy7pjgTJlesWb6L56+Tjp%1`G!XtMmW
zuKjS;lUXU<QeFzNhv$4Kjw|(ccYc{@u{`hjj<qd0%&Xe9=j2+5az`FbE$3Oa<k;~i
zcaBW6J-=hkUgpTpYYla}mP+*S8NYYD>U>W0cF{4vd;TxIgg0N=c`4ZTy3@tA`gw}G
zxA&+Xb`#k&ch%zkqSuZ;d>UFRXvTTKQhsj5_rv>zU5i)UKK9Adr(pd>|F7$pZ>f&<
zK5Of{>t~Nh-IqDcKf+f!70ucc`Pt%+R`+fT$v-C3HmzQ=;#@`HmB+HYH9vnx{t=yg
zB#LKO-&C&KcW<n}CFr3#L*pdFFR5S4<1erM^5NYpWrZhiADD~w7Z>N&XQ=Gzi8=J2
zVaF{$_cI(P*UI`uevVH*-z#=~;!kVQ!#0Myk3KbCao(0UuD2s*)x#?c<)zQ}meoty
z2;JlQ(OIARWOAzdd&L?2Q+HY(EehN|{kt1`&h?VibCYBJe%w1U-&%n4#4+Q(D{IcR
z-kkhB;?NF@lS{)@TCAG|C-$|?Rx99Mf2!W`ebmvc;7Ljone*JF`-~@5U&_64V46bu
zoLRj~^9?)f4wvth44*h*LS*H)wU6c<H<@*(iv8A7hx;d#Wy01@dY*Zbe|{Xh=xl*|
zKLU#Tm*zxi@NQLMZ0GTK9ed?!pVqXCcP?&D*z_jn9Yax-V3ar0qMB7Qf8WSuP2DHK
zICsY@e&?uy`L>}EjN5lusDz#TYVl;dkI1$wI!96(ca+GtM)cY2^tAh^F7d))SqD$<
z)Ewc1c{i4JsnwJUEx#-I`fTi^8_%<Di7Rn&KMY|!z&@wyl91%-2ETg-Rf4a*44-M|
z9KTYsOtPH8YFlOCF<Z+ubFUqZcG`0z!c#*3ob6t1sn@Fgy3IXrMb`+QQD;cszjD=d
zfi*6&H~d<vuXVfFMSrn8z1v~6Cc`xOqkX=~v4^)z+L2WEeZ{Zqp_SrO4m#d_|8<pp
z(p^PG2ljRB!M?UR@tgM@lbtu^63@0GONM&UoXCttuCX2Gq~E9aRA2iyf7v^(C1zig
z8T3D|n{?h?MLE&qeBrt5MchGq=Wen1u|?EiUGf9Izn*8=4?lVQy)x92H?C!u!Ni|V
zDq+tvUVm9S-Pz;1mgIMH=Udw@>G<idd@l4-M%3^re~{I+&|{O7?lB1&_Wb&*edWG$
z#KOZG{FC2zo!x(tC3?;((c|~Nd>2_ab8_$0n@^21ey~Q`S6_c>ztr6C!{yl6HHkc}
z9id!CMb+WS)j6AcqK-ckDEL$s_$uq@yse23S8UFhpLM0|f!|_o$(KiCCq>N>&C+-i
z<t-iGzDxI%hsdkV4YKTiHv2ojk5hkC8>qT-<^^@zhWD}k9jW`SzT=s+JNKOTM$4qC
z>)Q3Hxl#<5m}-wozdGl=?Hu3JrIjobriBMjY`nMr{*V0u`&*)8Jyq6;x2bRST@|k+
z{8U51jFI{4x}x_1S~o1tZ}r`}GwZqT+BItpb$%**Uu`FKHIC`T{gOE~SLL?UT(dYR
zapGvQtMbAV7710)R#x)<oICZS(;7z}j+3U-Sx?`L<y>s>_!-036>CbBb*d#kSzq#L
zXu2bKscp)Zge8yO^_}}1Fn7y~XUb;p`{&==q`S3KY0BTb%a@DZ{KI*5ORd{4f3Auq
z6JPU?BbsIZ8LI9D)rHAjo%(V9L$!?`l8;_`SvAx6mPgI$=q>UpC#nRpyDB_xp5l1l
zW)>cEX6@f)>YY<WRlZvM3)P!lA`~d+DDhz8tS3TmuP{j4{#<?S`jUN*KTW)C`fNwh
z-Obxf^WL31_Q@rqL4onke+I4GsVCg-A9~!UJ*zfaLGkg|CB80;9xpuSZkwg-yES?F
z?W3EwZrk7GIdz)vB(~=lu3x;*@hA0L#adl&_QNahSjl`_Khfl_=aTu)6F<v57kyjL
zYpUMnU9a2D!>%q<b)8R1SJyw9J<7Oj=P$#D>jfNFMVRh6)5Fx%Zej6d&FL*ox{fCu
zpPF0GZs1>9F}=km<b&0;2`2?l9NNYyxAo4;e=3uMx7qJCIwG&G{_}c!*s{LoJ0%WU
zFU!66>f+Y(p&kc+`qf8$`p+Qx@?)0NgNg$Y(TX#YRcf;reoWo_^z4S;`lrqxQ2u(f
zXu9F~B`?d(qk85=xk?`D^UOQ8XN9`v-BOz~E>o6f%VmFbK5A&aY;xLt9cLqh!uj7T
z)|nj?&dg-wop}7(O7Egut#2l8Ge6;1WSzDpH&CU_$b9+*uD`;ZekKXigAcCNKJ~11
zja>A@jR*fTSgx&3Ih>&P-obj-x$PZqkI$U?j`MZYwFNH8%zTE2nJ-*lEp2>0=kBGe
z)6+uQZa2lYzl`Nwm?9Cgn#sstq3e0>GRG!ngLiyvc2n20K4Mi!SKMo{ZpPb%&6#t}
z=G<Nybb8M7!t)G|yKZkto5WJQWplaR)zi^&3}w?8WD?5Nw(Gu|(zxaCJ^zJkg?DUq
z_s>-fY`w+q(|jd#hlI84f_(O8yk`?{-{qgKK5x&}D|6hAxhiKctJ_?C<9ok2OYByI
zPP5LPd0Us}Z@t>U!>OJjdo<Cp;7IRM1H11sT{kxG3J7UFXzFp!f8qYjt&igh4iqik
zv06yu7S{?1ONQc*wNG8^r?&aqS~9Ku**&4Sr{}Tgs$0*kFDx$3{j|9tqHp=q^q9zv
zX+2ZYxs3a(E={ZPc-14p$F<=_)|NE|XTN(MP^}8vaN$sHiD6!@&7so=xR2Yqrr*hY
zpq_f*n8TCb*WEt0sq_f2`v-?C-8SLx5#1f1mV6PpcgR0@%Dl6&b42XbjHf>6T3NWf
z<0O;m^Ofoo-*&y6!+Otf?%w{Y)ujxD)8l7+o|HW=?PI!T@$zG<PBrsbUzL1#XLq@|
zgtW)Hrf&x2q85oS?}WwN4wz$Dz;5wq=geilMRVWo3*~OOd*kcboLkXvxjc?<tDl?B
zDLK`v$?W3`-<-^+DKWgS=La4%mFn1^p5wIQmUwZ3{QIz`hYm99&o<A~ObEExc6+x3
z^Bk%0{^HbaqQ@<5dF^J++<s%Onp_&6S>LKXY3&mvxgImy_PGW|PgoODtoVfa+LSvT
zpHHw~TI6@Y?qO`irnd(r56jKF>Q^(#i$SvER`KO4mzVDft6_VvjxoV<Md0@-52_lf
zL-v;G8bvClTRYx;b@tvutBTa5<La_jX<Kp^r-d3ZFg}@(6`5PkrjQ~x(^lK8SMcX&
zkw;F;%g^>SWc`s2W-0QwT+_iA=6h<fOs(zfpgWU{_>52dx-M_{Wz&kgr&lUAg`VR`
z{__0NlJd;(f~n=jpEj=GIm3DT@H)<4zpey(Z^?hK(USf0wK+>t78lLEb3FTDx7k0(
zw{IiO`TX8_$osKo#!M?ekv#o;oz_G@34N8GKX*CT{Cu}n(_u9a<4)!q@=;ee`fgg0
z!(<&IaBRaQY01}LOl@~7vdrl#;&>Z*C+pO8(}n#>)7YErlB^yr?OA#FL0jC7qs}?M
zr)+$zENSvtBZm2$n^A4;>X25o3GAtsdS)9B@a*YI7E5eAsLV3o%e|nvj9o${{mU|w
z1r3sp;ZOK}td4q-bd&X%O8o3+j~TCAi@mL*5h_yh{KnOrPZ_&fe>yy7Uz>c_d)mQ+
z>T{CU#sozRtEJyL<!MtQI^AS0x6pE%s;k}0H5CJnG!>uE&pNwnr|O0RKkM?f(^fp0
z?C&)9RPULe=WVViBsMZ@J5M?j@|^k8QdYN%+dr<<(q62y#PXH{m(|4AVF|td@&+f4
z%dXm@$J}@Gh1TD7Pb?2A+xMocm0a%a4p`7x)@0mwwT|QDtw@KH#~A)*?Xmd1m;cgM
z-9-uaHPm~aTvvIT8~Nhc+;6&v*$f-%8G~&%y=8Sj<!4*?-fvU4<lz#V=4)GcSXS^h
z6*u`;JukM7Rn3<4WxFozc~W9&o9;S?*H>1`*1it%aN1#CozJYcFynx-_VszJiJDnn
zO?yv$=rP*VJjrn0)gld}C#!@{SejhjcHpp`utkvd)v2kmrxtS+ZV|q;xoBT|jKcP0
zDWy%kN4~zjx7J01e`+K1iZ3f#yzUsPI=+1!w8FYi+9r9Kre%rg)6Xi*r)AAozP$fB
zY+-7oI75jnd(?_e^UOCKcVLa#Uf}gWj?YteWz0I)+U|>P3wl>w>VF#cKryy#rNy^Z
z7v8FK-QIaFd~3Y((?#!UYS}GTL^U_dtvi0_oh3^GzfbUO6%8i?HjaN=w0duz;NkzW
z@Md7&C2yY6NAnM*o-RChTf#EbhH*>no8MQ&<7@c!Rogt?XnwN0vngScrAo@ImZszD
z*lQ1)WErhy|I~1xxAA9#<m0XBG0}PFE{QZ1dHg<nYnzl>8gql;oUiAXx<2*X=X}}T
zT>WR*#_P#qZx=SJXfX!vXee$zYx@1jjwG(_asL^nX8UJPeZsr;T=BJ)whICeyr10n
zXqIPA@j0Kf20I)ZEYCTt`sBK0!eaH6cW?X-o9&dMqRF-3-S_V+YPMA}wSJZ9zqTcM
z&ZXS7T#N=DI?JzoXPfzS^}{J`b@#p&F3Q<)YdO2j*A>OhZ2?Q`5|3uAuingd;%#C^
zc`gH6{H`kIsDMXC?DrmMCY}vxGD%Bg(0G+~cS~Z-r}8g$En%giXEk4CDhO^&Zt`H@
zNj9yz+mK+e^X<H^PO3U(+qo~+y6??cVtwGe7KgeGL*cERv2QnCmOabi>?6*s+Q%=G
zwk43m(xyJ}-b&}GLB&m0$;+~x4o-Pevxc8x-WBb*YgW5rw&n|Mu33HXd4WyR*0+m#
zXLzs~9ysvis&#h0P7m+tJIM>yR$I6@x<xS5#bqxNeASb_NWIT^-ofAUj?ud+0!|c9
zK5uIn^46jDcVpuG*~%=}miF)-SLQlyDf4)1mC4jC7OTv&XGaz1CmHQ{XElFq&LN|g
z4F}GNBwMcWwe>7ZocO9<ZtC8g!v(48%&Q*lezc}w+q<*Ur8=`WEZ|#GzSg_M&++8_
zL)#2oLpEz_uVnCA+{1YAY-Y5ZPmO^4-L<(3DwXD~T&B0^+q56nE=}%^=RVkGOCP)F
zU0kcJQaB?iaQjB~4eK`j%U8Nv^rFq;G~4ZIfiZR~OHHqCFkZA_=7F@BKK81gF~|IG
zM=vzY^Lsuw`&Mz>eb0jV8Z2x9RWhY()GqS~ONyH9{&0r>b*$O?yyF3aKbtI=Q=TN7
z`X6C9J~N3`Jj3<h%lwydMK!CPe#RS~$@*Y>V0)`upt$PBo_T++xqj^tD{}cW^;~Ss
z2aosBRr`Kdr<LX&W)S@IF=p!5%R0F`nymAlT<Y1f^RiUV^RKr*P0xAcsBrhwTN}oh
zHIq*lSDm?UXVrM+>e@J$(~}B&o>p}|SHIfgy~(JEL1q2Dbtk+uE9aCd-OLV|(*E<*
zqFqhQa@kT3W~wvty|ZErQQKFUl6$VK&%tEED>aUTEa|q@*FIj1cs|KL@RD)o)J@FK
zS-!3|&gK^~VmsAfX_Ndi)aJ>Q)vFuNJ74)dEBbZFB!k<H=NJ4d<<(Rz^9hdX+kQPg
zd51@6yN{f9y5Dux$SEGXo0)gc__8iG*<c+L6T79z;=oCU2W;eci~U;SR>}sfdUW;X
zt1_wo3{x5P4dnIgT<^Fq&C9s;_=%S!*Cf7|{LU}CKK{;4nX@o~^L?N8!b@K*8V-x4
z*|OC|Jy_{=YxDiZ-M+g13rzgQoNX3L#aOR*d*AQ%S~~jP3RREC+<)w^n?C#}c5Tt5
zh$ELBdiE$!p8Vtb(w9*waVk@t@4hYk?vr~^ZtJs<u<{qRyjJrrnfD!EQXzfx+q7A$
z++O+daSKjhUt3%JP&eDxs<icV?CLphIMz0PG5y%v->m*&--6FcktZC&*$eZ&ewlxm
z*V*?YTYJ7#ZrdlrEl1oq{xiJ3+#2fbdgb|gjjO#gU&X0Th;No*P3=i}vYlzq^9ZBc
zC-bwPPSH8#5KwmARj<=*uFhuZV=2MCa~;n|ZO={TTdumMr~c~x^ZzdW3YuGAf6wB1
zd)!%zz5NsR=lo~jTH2gpwWV;z%(RS%m3O!e&hggVI#`!*yqux*fZD!8e|P4d`6tly
z#L~4puyd+tT}(n#_T!@|oQJ-yuV>b)3jb`m%Jp*DCzVJ`?uK>jvL9@<_FNKEetNFr
zgr$71&g&*w;o@Y;bG+_4^P=X|UcR>1q|fb(aBo9T^OcRSgQL}+<sMh~`k#Soz4Xk&
z3(fa0t#g!|u<}Ic%gbHYI2UsoMSHZYd9z^hJocs82f5zm2=^DB4Qo?uJ+IE*yF})9
z*xbE~_3jzj`j)$96rH{>>Go8~uP1^Ju9Z$xJjPagUTwj4-_vt%D%-lh4w{st;dn~!
z#@d`jy`yiBG%aWgKFlTSIDz4J;~Vy>HIo(@YJd8C(r&B5gr1TF_A}u-S8bi!k@a-P
zQp1fl=@KVxS6MO&ZOQ%YKJjYh%hv(62i!Q8Ygq}0F~4)wE8>)S-gBksl~+`chJZ|J
zkrDgau-r|GB^K<<YO~6A+&O3Vq_1MtqMB`YcstMWJ7`5`W@U2}+j4!<P-bLvJdyK#
zby*m{O;;+z=RdZd%WfS=nHaI|3VV;7Z|N+#>ANM9+^wBU&&G(JyXrnwTR3x<$GL(%
zpU(FAFIfBA*K{en3X|Kz#y_v_O<nq7ozptLhyO(PZIfQC%HXv3<E>qjH(i)6cT7Y~
z>*P*%o?65C$L8D3o8Z1LKvcL{(c);_)jiJ3Uz)9nthpXIX+eSZsjdGRr0!--ni7y2
zX5n!mf$_al-Zzg&>*GYG&Nls8FB}<d(kWzmX2El=y?cve%C<fV+dVaTW?aM#p$QH~
zj9=8|KJ(c5J7jh4tIm^lSG{tJuKUGadnM-QP*WUrRL(TU=jkFncb(4*iZgkaNd9LC
z|L)EAbIt9WYaU7l%0*8&K6l5u;;@fX`efal8S3h8uG0_r=z8?XO#OLxt3vNQ_TFvf
zTO8xLwAB4>pTzu^FJnsoUU>4P!HOr8b8Gs<4|kgH@4s@D^WEK;&y%X9<d${Ep4!!L
zS}geBlNF+kwfU3h-uAH7F7lq!cBi&A<&L%C!32H>U)@taPq#9CoP17e_QQh-9I~&A
zeqBuovUo6W-`4I8N6xeq&fBq2w1{=;)E}0|mu5uYZT_@f;j8FW4TF<SyDL{FPtksE
zu{<#^)8>7;l~2!umF!vt?xx?KAKDx2`FGVmzB@ncqi6DWmb9GhS@P$d;qkcahX*aD
z*+tKKT_;%Mx&KG><8Ikx{~Z;lEQDD9nV#47^*nl4;L*J1J?Rg4!w>BGdT(ZJzS2qN
z3DGk0g%N>v67N|(9_@G9r}D$z{m1hM+4^Fcn(}jXS4_%nUR=(8C;aF<)gSeROJjGP
z7Q4pV5K{Q#x^0!`x{S5l%j2hh@-Oa9-p%{n&swS=;egoVzO6;MQrYDNr##MkbwtTL
zoVsn^obZ{at{q>nY}T&S)f#Of@6KP^eV_A{c~qv8UE*$w^H~qq=*)Z<z)&{HD*S>y
zS4plZ3x9dmB)bRY!gFMP)oQnkn{wQ`J$FW^rT3kxx$O;KSO0#!BEchu-Djmu>Eo{N
zxm=fG^^WpvDl(Ay*nez;NvxWr-qADGQaY&)5|6gNlUz4riPw!|9LGgJO?|R_(S=`K
zd4c`=-km#lsdB5*#@nk-6!y%k7mO4A?e=3;uHB>Shwu4pn-rt5Gxt^KOvYpGSFT@`
zXZXYM-RkJlV@r1Ho_J<1^H;0=kI3YQKH>k^F4~kYzrA3(%Y^8dDKTkxf5}-h$DIqE
zekk`!e(uC4$%VyBRi!h|pZ}r8RZy^a=k1fCo0Bg~oUUS?P`7MD!kiNex6R%0U}Dd;
zxpN+fs<}O9W++*|XxW+~-#fRu4OvxcZmO-1j$t|_)AD5Ejj-5_Ws|MH8>r6-ZJV*0
z_l<#vW#Z9t_gH?ryyMQfMh3^uo-w??HY+-2|FqLPJzv<a?%%rK&^kSjUqXFthGV6&
z*scEzZB<+^y^h<P&Rd?Gy~1eK=Bc+Yypvy>b30D7x4^4S#(r<XhPcKF1xqGRsP4LX
z`TgB4W441b+ErCom;CDWcHXn`ip|B7G3oMA`&kc*o=%o!yY@P!b?(DgM|gMM@;q^H
zt#+*=+ch3DeU<e}TW(BWdHrz75{8xsUoFpOMa3=>eR?>hfX)5dj@7olQBI*7W>+43
zwq<Q8r<FL1T#Fg!D*s@$FFWtuif3x*dH2G9YrOcv#SA-GcO0+z9WI``(&O&IxTQf`
zrUwRjo=}ldc;~-=Y1YgsQ_udMc`_kH>^QsH%!3L{W%HV^ZDw20zul(E|3Aa3W!397
z4V*TzE3>ViDd}Y;zKP$4??8Rj>MExN3VrM>a#zJ~+iVD!;CSF}=)3jJ+6%N6{8@Os
zYF^@suiAIdEcL&q!o$0G`L)f@W?p%0Z5NaGb-C^N8Fo2+mI+1vThs5v<h3w29C)m>
zDd(cz((IevZ?*U?Ue7$5d?$v-=tJT4zO8A$(mKqHjNBQ@)|GvG{;c9ysK3*4wv9R0
zj%^9IX?;~KP_cHcS?ud(g@dxjC)ep&FOA97^5#3X^~>+W9E>pueKVd&o%$|qo$cMD
z$>E)wlQdtYJ&CpUmA_4i-PcC3B?moD`2B9xnRV$&&C%lHOtWh_FI<@R-6(}ez>o9o
z+mO^NA|Bpy{EqKmM^1{Ha%bVT&2xI@Exxwt`TpalpZ#elRad#<<?J22u-4UT<;|Y*
z)dBZrdiNeKe2~1gpg8MB{*>P1J&eb%t$7)B+ngnDO5x<l?S;34FRxV(6hCw7l*M5=
z-w5-%gkxM!QuwZ(c3j2V_4Zs<@%3Bti&q)ts5I<2XB==d?8=X{BZ6XFlXe_e+ww5+
zsaDNy|D3B4x!<P!?369+o0=q=RJ6PC<O%z8d$tG1@-OcZQaR1UUH+g}OEc1d>FxO-
ztuuww;%85LJu&bk!;K@NDo=#FV!oH_Pdduh>D0ubQXkc4QJLf)cegO?j1I#K{vd`W
zhTAv;Cm&bezt;M0mdgC3c>w}^5np7!n0&ppuHlor<oT%R89g$|5^qCPW^>#)dGg@e
zM^n}&&+}cL)@zX$@uykKQu)%_pEo6x6>F`-OvI(9)ZEdHYI?gpFMhhR%=fk7VQ21b
z+gPw6_3oU6PlbOqyB-ES?Reg``dd@~+yg@U4NZBj+hv@1!gwrmN!rsDF?aQC-r8;L
zuPxs3lwa03_|B=2CxV~(+_JUaThCa@FmKM6wLv@2Yi5P)*vWfP;_LCMld~RdRH;)b
zUtMmQ^Hyd~%2j!lw+cL;`}V%tW)Su2M0w@xraxP4v<~QhufB9Je`|-$#xJs2CEHSK
zzRG6Wez!{6DlepMX5h!qzBRs8`u72z(3GBI1#U$}2G*e)mhdp{o_BY(WTfnsM;TF~
zuZ;WVbY0n2yJTt-qfGO?O>buxu<$e$urJNLt(f}u=ht<b^I9!V-a58-VS->ly4~Kk
zY(G=3$A!9mZmy}fChe}cRd~R(#EY}X;Lgr>h1+&4z4Lazn_a=ZKnVuRS5>n*FDy_f
zIp$WIc`VgZ-gw31zGI7@S1`YOyu#*+ZP=qIKBL_nClqoe{``Fv5-{WL_j6WVoxw)w
z+ZTRa?XmREZpPgUWDmUW>b`MRdt*nJBiE9eJB`=o?5yK^kd-RiAnDlW$GKdEHH2wN
z`ucU5%gZvR&OPQV_Q+rX1LsMbS=+fb8w4=&Sf%gPI^fLbF4NqXbtJIn@j~V~^PXRt
z*Y0Dg=KORK@6n>l<5fHJ6<lLv9z1wHDQjcw3_at|GCz}TLN;!6Si+OOe4VCB^sO^H
zCM!NY&r;-S`i<p4{fv2>F9VM(?NF#$@bQJ#kwBF_4}|<{K88)&w@j$tNwsHFOZ@CP
z#Ro)IatOJdc^bL-oP|wjTlW*q*5uxsU%ste+?rA(YPhxHouPA8#IeA4VYlK8w>s@B
zaxOh;<8nLX`Md_kUspE@6uG^5Eb&cl%BE${&m^?HsJ^)9qJ*d9u?r$WevkP4w}$N8
ze(SmRj{d4!72TpXEAD=Gc(gj^nAx`TQ-4jq{W5gXMVa$w4o*5>^+a~|j^kBb(X~BH
zJq=dBt}Qts%Ci1sT!D3no1yaOt97p?H&raJEj64}X83fQ%1TCeo1V{KS43T@)LJs>
z=&sz8e_kgh3u~msFxWkK{9#Fn$^$j8j|bmI-FKPTy6#<1Y47BzGV}P@*<S}A7iN__
z?`NCsd_sFm<L7zvW_(||y>oG>W)r8vyaOS-ZJorU1aBP>lvi00*mY&A1JjD1-}wqM
zx4oR$WNG)O`E~f(V>eE1_<qOwn(oazZ(2%KwyE?UNLF9@!ZrJ*i)6#8ro%mtdqN`)
zL_7}K8DP{bT6D*wE;Tf+S<ApRZSLKRH>OTo`r@$V?=u`0x_wjEXEdoX6!(>vpWm@c
z?CsQ^5|t;ve_xxsr%Oi2@jSCk+HQqnKPzdm69>Ip&$+)2e|zd@syCZT&-%4NTPCn*
zZ=GUzz}C$*cDr?~bIozfmj~9n&9YebW}E36CU5n#pA;pT<)*I8mQs**)Ux_~PTTC5
z!Ey!}nYU_N--=FQJe*S4e70PdPjj_#(xD<}hT8#6ZtTjJwqESwJ=?IPi9=H5``N-@
z*Skve*`iJsuY2_^%EZfD`(BJr%3tx7>*TI~+x??@WkuI*hYx>`t$egM>gADw+nHvq
z)7<P@H+r5r^(?QzJFM#7O69D{K1ws6c%*#VHsjl>2SvvBcJhneUpse;=MLq^Ey36C
z^j*FFqw3N-ex5rgi}Q8FubWRY*;Xt+i_L<O^Xq#4AM<O=m%h4g{L?i=?HJ1^>0A4}
zh3#`Ki@K!jgVwEl6rHi$$fnQpVYtk*ou~K9aK24xR?gaRr{ej?^=4Q1c$coc+izIL
zaMa;-_!sYF(<=dQbUq~tiWbH0X0Xlf64-w1ZStkX;<kO?jyaZR8^;(3?2wM^w2=3D
zxb^2-#m|$jJ@D!(JZP_7&bDvIhAVY!HT)NHa_SVkcKv7QR%=bGmY6bQ?MX?F+kT8+
z&sMs3|I?_jKYCV2D!t7l{>{p0!Q<(CCq=5Jy~>u_su|?vd3RsOw}Kg5SJ%H)J}uY#
z^^0BXN8ZB*))Iv$Rm#?x{d;_Rvi1pE57W2%jDKWJmx{f&`r$#-yIT~_7Bfm#gx}sN
z`cV85v!X)59RWAPxM^aAYj#e2`1r%8!+wWmx0b3~vXm_Qshpwkn7uL3?Ow*Ih61bS
zYppDoCM7Fqr7N!9<n7C^TpOvP6>NFlR;%Lu9oe-FbG24CdH&qad`$Dji{DdL{;cn;
zzNTBEX|_duj>*QA{?o6E@_bvZy=nC(-kpbjUE4OBe^wVy_4F0LLbgjeP1s%Mx7<|b
zq_y}-^^Io_a_gBJ-ko(JdvDJI;p_6PMz78%oZ41=d#Ueocd1RgHHw=jWT{M<Zn#D1
z@xrA`ycXo^{E=av^-KQ2kG<iZx+cG8Ix{TUl)!wsDf_sMb)iAV5vjyE>egi`@+(ch
ztUt70<h5A2z~4o@+kO`uc#xZSSoFc8CAZ4lFFu%k>-p;AkL^V>rVG}tKfJ*^Q>o+V
z!4e}DS<k4i@vN_Ax$S1YBkjNOKEsULpFYpqT6`c*;?h3l7rDGo%)Wna`MvbR%i}pE
zM+^69e0Wr&dv(zy$x>gnn@d7?E9@@k-F$gIlxgQ<&r>!RZ`=wEw_dJ$KEwOQ+Jvck
zQ_JU-^UUfy_v?nC;3lodDwD6Rc=7pu_AaBC+gVa(YdI9e+ML!{JXiQ?s&vama{Eo!
zts77EUGd{I73(`?HYMs+CHvdZMe;H~m;?LHJ#f=W5@(!Pw8?1BqkUpcW)sC(+O>CQ
z^T&JrHU4q%;j(M{q+f5FX7*P4Z<7;Cg!F6~u0M~rZaPx9nE#$y@Wdv=E8#n*|1pZ?
zHy78~E*Fw&x>Ku&>-pRzA)fiak81BQ;}_jsoc&Dw6yL?uG7qjA=7qLJv-00NRv-0M
zY}V$^B|%*$3_@Srb*}37+RM7|q!05PKDNT(Lw&cmJ>i@Ab**#+W09DS;APvot#_qw
z2T$C+;WtNk!0yf%IrnE;zw+(~x`p&ieCgN3{xsCvxQF-n*Okf*LTk4?;oWJ=TI#4Q
zX?LWMchv!=<tn+R8hj6)Zu`%$iLKZx>GqDE++UwPLMM7!ck_IGJL|4Wvi6O}HjyXI
z=O6Y*r3HrP*#-6pWLX}tHn0m~XTG+mlFey@P2avpD;L`<-8y$^LPh@UiF3HN#F$v`
zVyZZ?=13VIgG0FVjPIh>C%T#Pa(A3#%h)zebi(9wsi_R>4jG?yxvmz@b!6u;roNf0
z^a~Dlm;C$GJZp2-8-LAdU*h&hom^HP)Ok5mIqON1PjXL6*SnJF(7QV~9cXTFSGdl*
zY|acv8Rp&dv)&|LIXWdSdD=-y#;A^4>dDilrDuz5h;ryS82E9AcHyj(S85U#1+&lE
zaP%a*ZQa!8^E7`nip@^c`F!^{M~Gt0<w^BiA9I5rOL^M-3!Zsjnq~cg?+4aS+P~*K
zyJ&Cu)1}|%9egY=Ub}Vq<t-EP)I(3p)EmbYm#?`Wy=ML{g~n+~#pkk{rax-Ey2bct
zl8=#pzfpi)a^&_nt7#U_zG}tSWnY)9=@+~gb>eNF>FWa#qBZ8{yzA#pomu}#_hZja
zKF1vXs0Z)s6!t!8&%Cj?&-zky#Z<i~XAb1P<F5+O$<nz#KTgP4+3bzX+b?I+eM{Dz
zop$?ta_G8QoKsASv_8*WwsF~v#krCy<zH7zU7S@M*L$=-J}@+8kB;=@-Jrps_8A8~
zbEM1#9Dm<Q&scPLr^$2%o}OCcYco6^^x3jXhnE>nz9QwOd{&|7<CXGdYqamX1<x`%
zz_;YtCjCVTcX(tzxaLpXGRcoWC)9g((o^@c?=PLMxar>A6sz}CVXCA;)wPs~yCz6_
zm@Y3(RNXvNS(eY^>uR&YgRAr|e>(f}y~7#Tv>-PAYct-RdeGct`+DK*!?zi8rXH_4
zJKI;`N%4Ev8SBex9e+#KWY@9>)^lft^W@~u&hb@F4eig7kNT$H`HySsm3K?!yqcm{
zNc>s-V6N=)OY0ZxYPVig@R)s0*Kh8J-;bRC;bWqmTs&<@C({Y@)Xnc_S?&y-*_yF3
z@~efc{{jD{-dZfW!sU7X{~4mzzL4j7{E=HFTcqPn*_`zstHbwKg!^CqI{U<;T^@&w
zQ<~3<e#<}jzIi{d>W1w*Dy}{I(tF?H7UQ=ywOxDPFPxL*_s#vluJAXpk9hr9cW>U7
zd06w->f>H--u`2{^F!aWcdK-z?h*&iq&<0G&O67ioTcAp(yMmEJvm#Z;6KCWbD8s0
zK7{o?IxF|s`^uLec{<Nx*R&S6@38H4%`w%w_%ywiYwF6=vtImp`=P&`{pQ6<56dPM
zO6EMczT!vt!E4h#Nv;#Gmt?-S%_j1<@tr?L*La^bs9q__j4r#$nchCH{rc<R8w&+k
zCqGGLUwQ0eJY(;nkV99WRxRIb?|f?SJUyB3S4*_-|2X-_a@DQlSx$4<6wIxw3gb>b
zQq2Ci{6Tq_iDR?swb?q+(v$i(Og;aIwPtl@O-=mzSl^6)C7kM0c31H(XaBl>jh)~N
z{fGVRuf)x}HaKlCo;?2{m#4bv7s(h^?uZBH_RjA1FaEgg<Sh*|5C6H+Mh5ctf<pSw
zgw5U3Vl~Y|$NG!t^vqh(yZ4rw7<DR7`c;|qc-5AktY2>Dcg*BFctUpd&8$o5&Egem
zSqCepCU`pkQJ0b0G3hBs&g7nJQX2z5^G~fZc%yYIW<$w|QyY%Q-Cey%w$F31ud36L
zx0c#}oOi5zu*<+}$)BATDqW|=B_z`Y`x*-ak5_SR7K+|rdTEQB-f@4~cPBgbtR5uK
zy0H05%`~pqIfe=XR<+svU4K>=g@{UiJ^4k{{@ctJ#d`-B|E<3;?`y1HM_l@X=vS|1
zi&z9y9+U~aQOd|=)fe*Q@rA1Jxwl_yo!zq`rmra5O*YRhOra&+-r(O?xur4hA74p!
z-jj2~;rIL#*QRdU(6Zp1<C8~wUSv0Dr8iVODBz83kG$R6b5mx5{ZhMZfvP1^i<GrF
zJ!}~G7p~3FKdk+r;qLD688=@$?%-Qe^7@47*34CDf|ESe7usqTmv9?jNV+m*s(W7X
z{HV?OD<(-WPqAbP7tO5SIL-I*dYk8_^}hq2M$UNhJd+{W<Y(*Y+H-T?Z`0(QQd9cc
zXWG{?R>=oN#g}$|xpF#PrTCXra{Q{tll%jZRW5m6^jKQiD|@rFG3%*~PeL`<yFKEI
zt&%BQm0wXVpu#Z8TlkNuSN2Si{0EcINqiNZJuznS`e%1I)yw!5!bI;(6o}!O^HntI
z*LyCHggp-)6!<S#Q$2g~6DCi^=zN<5`R4&o!ZjxOgx<W;yydy<=C@I1*AFSr$yMpm
zEB<-i<nsPm9m^RTmCLytRzALB5MCIXeC*Yf>j9gsL$0t)6nw@v(<Vi#@70%@<y9*s
z?!JwAQoicM!e|ygj#b~KCUSAhOg?TiD|2FU+VilG*@_=dIh?b+{em}O?>?T;2@k6T
zj%`?H>b&Fcn_v3Hk;PfoojOODte6A7N^M+ew#3}S@k!x?%x_VbwYA$AWO}L|?Tqd|
zcxv@S&y%vofw%6pO)*rhHI8`~W*!)}%QoEmBbWScJ^na<(af)A%F^GzG4@uzn_S%*
z;GsTe&b2S*3`Y-FHt)M<{AJC%t847jQ_CunZomE6G~rBzj-lUg!{i;cpO34r%{-YC
zIltk4zgHlipW)>DeN!J7-}p7pd#cdoBn$QhFE2cQ9cbcsP_^v+>!{Pro(I+E)t(L6
zxt*o2ph_mVXUmn#H}73DoRh1b_mrp7ZrRMO8{T*)Z+m=ceXI+Ie9Q#@s`I-imX|8-
zI3UwkecdI!gm3D!*6hvuj87bR&b&6&+e}4WB_$>F_A$dF<>|^R+1IA|Jb0YRl0576
z(i@LfvmFh;wLs3V_}UuhqEk#?xKFU8ZHhei_V82tX<4q56D3&6Rpwj|cIOT=nU(wV
z=f+u$@7U~u=iSZP?IC;l+3n^pO0(6N8V;16E534Nd$OhL?SSHEhG7=E$1kn)E55wl
z=gOs1A%6~Rt6e1)Z#*^Nz~^hTYkg!&HTSqYsJUUg_eIymliFLD??_#4yJ8r7SlK3R
zjeGKr=Bex(*p{BU>nbw)%K4`2SqyHM{6$kT&(5FnRdjuBg4wDa$G6vnHDw<4IA%7_
zDok%_ztbGEbQ2vJg*!W+EAH+p3EO!<@>o&fmFup$?UT56+&#{krI@mOLWQ!j>2%ZY
z){CZ|=}=5z-=5%Zx;$MvFL<8Ci^5qGA{BZxR6cRUB&|Kl<<`ZaQhq+`P|&WOxA_(w
zb7sxicJRXYm97VMn+oU1xw>vmF8kScsN#Hpq5Bz;rt-r6V>@&2<asZ&oVe#0OM$zE
zt*>QhAHyq4m3dmr9`zXA-NkrqS!iT<vA|+xOWQ1|S6ty2Hg$J0eik#l{W|Oem!1Th
zI&a_BFqOM<Zx2g8mR)t?xJB-P@+D95g-TomzuqgJKWka1H(zUv+>$4Z0ot9?yeDOt
zUx$gX#;~#eXSnrk$;?%|tHczhc<f~0U2bn49OlV$+mBPZjNxU-<1>rv9GRQ64n8br
zRWzJaZkm~0T(LXLueHg}qhDG5!j;wPj62oeO?(;PIy1O;zri2F;HCRQ3Y&@;WnVqo
za^>plRjU0;24|uzZEdx#X#eh+e$Hy%%w^FoK3Ns#o#wSIZ!cor*><TYTy#ysyf(eC
zgw?y4p7-=TkeTyr?QQ-EBDr%uZ(qLG(50w(PJ_jhuS-9(xM(Od?zOr!N8Tmv*{t2E
zt*)O=Jl*m3N-%f7p$zkm&j%mdeOawEe@fBejgJ;hJ!KeF7xtp~(#9v5%MzZ<y4bH;
zeDaRR6FJuKX-22cxCu+HUe&U!aJTHQEBwve=@QH=hHpdD`YcbXubi*J!&V?I)B3_S
zq~iOk3EewAo?i*;KHMX-^5ij*;3(FKonf&zxk5@svU>7n&g<Nt5O8|lnZolwf-lL4
zz2LL@HEX*{bjl5OmK1BQjV$S_--O;h^?3cIt-1T!s??L!-@NNs*T*e<;=J>F|E|kt
zq@|ypIDY!_2h(-a8mBgup0xQD@;a?&d74+_<x2}s-ne9NJ*an!Vz9Jl@<Ej%tzRx4
z@|x!i)*hE{^%aR0b$Hs(ti0B1n{}mvv8KY~Ibmi+R*z2$b_#wvv|EU|<ZP_qo*j}J
z><kl6n7l|h#c<H^n1ija*Qvx_$5Kn{4ZMQO)wLt8UTq26<kBtS8aQF?_V;}Iz4m6G
zYPFv7^?cO|1*66tt?Y~CqxK6Q=gE0*C9i8PynFrDs*;z!B^Fu92Cv<<XKnKc3s`zO
zg@5|a?`ylwq7#(Lp74qG`4(#y7BHPxJ#{0>;6%B+buD|=UbW@2bM#dVrxfil7TkGn
zuc%+FKi9To*-(>w|3}%nVt3yy*WXx?aG0S^eQC|skJG>1y`~%Y-Q|O~W4b`?`jxDF
zKi&yUJbrDb|E=i9rB^0zZ!4ME#b8`suzZ^R9eJ;x3qD7!i1~asYtq%t{;?nBRz8~R
zxxTd4>3Q((;%T#<IlcXL{YC#Dq3(w+^0#KaKjQ0lH~P12-O=S@{y(!GKQE|lW38*I
z2tO><-c>ro<gMAY=+h@>=oGr_dGf{d_udcI4@2zP>$rbpADVV?jk(#kZreNiKVN!y
zz4-Zyia**X&uagcirIK~ZiH6ct#!MV?su+PvtaM8%IiXY_Ywmt)vx@%er~?l9$wX-
zJLd`cc<Q<RNxiyz&h-ryx8rtft(5w9S1I}X)uPbjep{bLo$oLC&3X8~Pn%inx%DTx
z_8P`ZbM<LG-}vUr(&QuaAG+>ca_Hrv+#}N`7+Skk$^YA0V#jgu%^vY3uj35&^?0gv
zOG}$hWV>w5r2ODl>6-WAH6eYU17>M(ZQ<G(7CecqV!hpunUAx(*SAE~HqJaV{nqT$
z3bsvp3>Lq>EDBl~cIU4D($gO<^jxmG@u~8wtoI}R&Uf$iQnNdsPh2uD$f$1SD)Zd(
zhsSl9cd=UVENS9jTK<pWQvHTKCY&zSuOCGhedV$atMA|X*V=!p*y&uJ?RiB9iUO);
zy?E9&X}M@g`J<0Qo@X~5Km4DeC!DingWoa9Ko1>up_Q+e?d<Q^mAd@ftk@`}j^#Ei
zIj!f_c09cj<?G-vag7)MhpTV>1FE}IVsG{o_j}z9oT{}d<cohv%{+DCw~wxTRkiZi
z>?6vu;k<2Y*rYp^ZH6x=SYOPo{<b=(=F(b$2Zra~XYEWin53vE-S0ea!S$jk`z}7V
z%6fHF<IBsKHpfqo_eT2Kc|1{B7xLKRW%RdjLykHJ?#Jp~7q`1k3|zt((epO$YRjtX
zGcT9By%i~$9oFjh^k?*P*;RkGy_g_+sNuP?^2FC+j@$|%HeW23pAw7C^E0^f*7kK%
z?!A}u)+;sbvRt|4KZ8-wswKzgq^-O8;=|1&Y6?PDnoq9WKH_)kpxgW1=cAe)E(u_K
zAl%sZb@!@AYj({s^7^iKd_}zV#^_~RxAX8Fk>IHgJ2(4r^<OnjfjDn%!*h|l1Ybsq
z3BGI5IsJQqxtvw#{U5$I$`5ylnmVjI6cEbvE-misu}O1whUC8pN!6<RZrXcVzW3L^
zhKqM^WM7K7``n_*X~~2N-CO%s{D}OW=f6H<(vRw6*QV`L?26dA!@|>EZ|VpC?mgiT
z&I{${%A96iEk9-1J^mlzW}D(~-ck8hp2H=x&iYq){neZ;-{WV>N6oJL&#<Te`g!I*
zo<C|uHoK<Ed=nQINbKpq`&ib<V(ssEF^;V>6p#I`?s+?*MCQx-)9+jCh5q>KE$0!A
z)pWSs_i*m&`%L?u{cwF0@yA=FIQAUFw)neq=4_VF`t&;Sj@r7fcI#QAL>2DWJzx3n
z(tVLH{~222c~vH5PPv!0|HZad$DgLzp1-t@aqg1r$%=<IoB5q-jGO;ErsCe^N99Ll
z)em3WWOGZr^#QNR$?tM6cWUw1l&se_nsjuRoX5d)*>?|JdfNMYo~)-{b(!j^6OJq!
zZ4W+MZN&S8xk*~pm*c6^G<Eg4`=%<3PPJmV%U@H=Tc$F5>zU}+Nfi&>0wP3$FX)>t
z&lZ;4z<7&Ybywr-$Zr?l27l&bm-+hZ+S3)0GuCk=?3o;E_{ngh(&}|)ZQ2*MRmx4Z
zpAg8Q{aN#Qsb?<p%9yDEj1THXBR$-wIIy0YH}h`n#v8}38{g2$-ZJ;jho}WR&V9F)
zzihkeG0(=JpNbv|$!mjmTb|4jIUsr7>xIY3*NZhy@jdViSWv{C9J-YI)01}gKI_n*
zcLWY@K5^p2%aFTF8fk}xia*VN9_^$#V|y-#x5(`V|K!P`^U@NkCRoeOZ}lxTI#N9M
z6<gVQmTS6KUM*%265V0>By7+2D>2`0%v_c>aoe^F{w!BldosybKbaTN9P`PioK<%c
z`}1&xJxs1#_YEyXr!21Zo$}?*+b_SL_K7k~;%B&S`Dneo+QhsIJ>Ck>pIIE=oAhJy
zk&iD0CdllWe?WL?#r4h_SDjCreV&}C_4R7~C1Wus_WI`bGxLwu>C6wB`~6JJ&R70f
z&z0vKm$poN-F3Qp{uZC3GbYbz(9Bckmb-hqc5}4GlFBmOZ41f`RUYr-O}l&Fw^-qD
zs(7E4zG0;0`%8<1M9gi{=1+L%|LkYxBm?`oidT9pxypKK>$#SfmhE`OX7MYmWb$;$
zCzD+-yeTRBwc9vXWn$mo>>$n7Q+X<U7SAWg_yoxw_$nW_b^DTgsSU};9p~M<s`*X%
z%Ds^LpL^!aNx0PUfj{PNmPezi|A%?^rWzmJ*wj$#xJo_OgXwL|gWkI@FRk<QQ19EC
zebPemSLw1DMaQ)YtV301@hy#btYh53`7SGLtHnu%glB7`4o;r8*iu<^+cd3@{CAn}
zceR+E^L^{AC(%%SP50UCryHj6-#uZ=TPD>yp=E;vk9D|uVVUoLhMRZZGS6Qdwy^qL
z<mJ5O^Z2z=B+qfr`?B4v+VY>^{cG#oHnuVdzij;T%5#cc^<^icM~?H@muJ1$WBJIl
z#(0HuLC^j4GESX@$IRC@vM5Y4K5KI<N?BT<;{BgjVQXf(z4*<2FzSnO)ZucLgHswp
z=575_emK5ESF+LOzRnSLmd9%Q?f-H7IHPlRiNE=K@u$AepB}AMfB5_6my;I{Pg>5-
z+;u7N@?D!}x2Deg?$-LT>-XVFZfDk(E<fd%GiQqW`iF6cANF_7vhP%qi#_D7|J^(M
zn4G}%b8GXT?*8|p$LRa7u(XA1UfHpHRH*ipxo!QP+2VDCd9GhaNWq2Q&X4`O^=ecf
zWSUlUw|Fj`ry#h&Wx+PCiSOf;e(Zl_UGX~Ts?Huu9?4nGJeS?>t5`}T`9E*adfvaM
zeAORcU-pB)bidyC$g)X#XYc0K9FJ~qVcLK1SYe#<$K#J}``@H4kN#0~-F^F2oA9D#
z5o_LUs@XID>!!!^{2gN~dd#oop50{oht2X~%#!UHzYaf0KitcISc>^x)^*M7<&iz7
zE3H|a?tbzup1)=P+uY1$fAl`iUEap!oG90A<5}}q$Yzb1`m}xR>g%I^<Ude9#xM8p
z;(TF|isNz9o}Da6y!0?$>zvFsi=NuY?~3E*{%2s-`%!6r=&$j^U5*9sm%iF`_S@CK
z*2<|N$M`p}e2gtw@hPJ(#!snqX<1G7!@G`KZhI)CDKHp+eIM7nIBRu9n{mUv#d|B~
z?3uI7)8^S0le3`@Q-i!7l(H`kdHGr2DD!H`n|a5VSI)S_<~48ma*>m&pE?*m-gS@9
zI<WcrqJ#-&9-j^H$&qg2&$>9RM&n6=kzaA3EZ=dBv#~i5;yUs=M-q2E|FYb(`k<D(
zOjTjTb#unK(Umbg&#$etTYCOf^`EP|CZ4!@_UisgYRY|kYc(GS=!MQ~eBL-udye=i
znRSmp^DtFimJaxNkc(@@yF%wlcc!c<)m~}hQ9f0B&Y!Cp*{KW`K@uhG%`t&jW^O#m
z?HlWHjNy(s^JP<;r#I(*%69*eqTKhFHEQ#<Z(b2QZyk}{`QZBeb?Yab-|^t%wzcl7
zc5mQ%B_dbxe5t#|mB^Rdtj_p__nz<%s(V}Vt8R-*{M|_lCU6{&Us|a*zj}LS?i!C1
z%73)iT;A%m)aa=DJuZId$X(N~N@*BhdU!>p%wcU`h1=`CXX}oxc;<V1TWg-<<AV1w
zuJabX|D4ZvxAL)QMb?{#(F%5!2OnH~YbB+X`>Kq)e#3^2=j;=GbA7`tY)aH^p6zVA
z=4Qavba>^8{|wvAn^ueQS(?msT$T4c;MZ#975Z~}o?ly38#sfBL;J+}y+t2i`P`N~
z;5=v2o{zz`8#k4044m^=Cd_Z$vVW(3%`y*97GhfR{lM36Yj)4%mgLki<9RDHD`k7$
zk30^01KZZXoijG7pHZF{P$sw4?&99Al1t7@r#id2m;OHT<=KjD3nv}6wVHgdduF+I
zy4I49_j|%(o)_r${*Za{VAdrggQ=!Fx9ysey>-Ut-rf7=YMEVidFPN&#IJDODE~m}
zW5#F;_S@GM{=1}*k|OuqG%aS?lV4q%T7!3dd3<T}vps>I7|e3NzKry(-^uNEd$;hN
ztL}T*j2!Y8iWsWIPx@JxxA@sP<3B4Cb{%u`41004(e&g5*_-U^_eO1>Iydm&gBOf8
z^Q#VJJ$LcD?6-qqfeQ06?K;b_vb%dbUNFrG7fmg2aewx@fA6JjZ_{rvJy^j|bGJ8T
zR#ePQ=S@bwvo)0&-oBr=zrTvB<B67taq{GOQx{#7U10d4aQj{%x2F+$+<e;4f3Dy8
zwXpR}k(rr5x@}RVXjJO0$o5m5FRW)>oTsql!6XlfH7A$6I^(JEL}PW(t_yE^b#+qx
z4xVO{T(f(^!hOjb!g?=F@ZfW_`5bxOVWaMe#1pc;B?n*Rf2}oft9h=qhVR+C<4aTT
zbo_f)Hu>Hb)qC%oFU)INaYuG>=0VH1_jV@+C-<!rz4erN+C2|t_O-01-~BXO!Tix=
z$plCC^5Eu|o<eQ6+zj0O?Y3T9wx*&q!(!7Vg_P%$-<~zyd1py2tKD6j%?$^q@89cp
zp;U{HeY@AWAWKW>i&Nxm7|M(1HSdksw9Ufe@omv0YX`{)`QxHxx9+O2FnRa+OROyV
zZ244BX%j>9;p(e9bQ*J%Sif4l4$ECrdFOG(d1hN}uWL7UF!1h~!|xbe^2K=j-n8Jh
zqii0w8>BC-<>2;Mb(5=bn&?W=E~ecR5_cS5xpLm^Jf<TydrH<URo!@#?c%g+{}~hl
ze;+b#sJ<Gh%Q0b!gMj>O`%Bw<S8tlIvGI85D_6H`Do*^<Bp461Jqa_aS)LO6-B9lS
znFKB~&KFia<tu!2*e+PS^EkP#QJ1r~?N}&tx!+ZuZI4f-KF^O4?9(>8ckJT3gp&fL
zcMK<0UE%T8+V1mJ)-dXlgQUcppVe|-XRGe6(kwFGBDd#Cytnu>Lj#Gn97D<TL0TSt
zpF|$Bq{z)QskC(cd+)mJ@x5Lfb8b)GdEP5ZDL7@r;>`*Vc+&f><_1n-QOK2<#9ozS
zAQbZP{Cd#^+n%grn)AGQUh}mLMOKgRG&sl>cTFu+j5rx!d|K{`$hpG9B`03gZM6yD
zS-nD$^Tpw{L0i^ji+M8rSvrNOD%XZ5^oIK+?_)b(*#*v#_tH%YV_2ymcShSyLd0kT
zW95@yfn|A1Pj7T%{rSUz<GJP87{iIZOExBcZ+Ia0Xx@j$q65swq@T*JYVX~8@Zo;`
zlco!e;&vWlu=6-xRQr0@RLhX8<96DjJf?P;w$-wxZ5^Mrer|HlS$iTgI`f#V){PGb
zCy7Vrx?QWBlB%3`;M@Ay!pDB~p8b7V^~#!033ks;9(Wt|P0n&(S82sN$ymPv=}UVv
zF7#B%OLv@keRb-iH~p?3=dE5}k;zjYRl3Xhdg(@W^;gx``SrV&PEs_AZQSy??d988
znR$kCsu%QfzB2Dza?okH4*!3KxIM;kvugQ66lE5zdvKAjCETg$MZf9QmFktAbKf36
z68$^7NA-1GZI;T9`Bffw3qPeR`bRx{m!~VH@zi;5taH;{$9LL#u~9~E%=C<Vp3T>(
z<_%e~Yx8yCN3n-Al<F3<dj8Gw*r(>L$l!g#rswOo^)lVTt+Uzf?tEEUzeUk;?%O$+
zz7<q$k-N6|RW<MVBihRXpPpJ(*u(el*}VAz?@lRoay*_qulRMGrP`|9&6P(!_EZIm
z?QnBGv1aF^`6^Y4#b@<9zAgU9Ri0ydSU|X;^5Dw-5ACPk5LVh(Dfw^f<IFXa@5mo(
zUUSOg{!#x;(M#km)t@<^*8WIZQSte?_YdRR*0?_Y&tR~k>&rrB+2XSm(XWk!cUR`!
z_saivYJqZv%onEVo4c<ae!gPgW!p=SkA0t!Fuln=vCq%=y^oyf&h666W?sC#GSa#_
zyv@90L*;}Ag~ugU#2;P5c2UhyZfi_uc2dZ)UGrUU{`hvuA#|%UKLfMo6M3KO<x4zs
z>qUwVmx^9<<5qt6EBvVO>wg*Sg)DN<_vZYFK5Dgg>7{P#or#5aB^qo$hNo>a&Ym51
zeoMao+qKFLsy`1L=(qJ>u)@?{@?{)Hqn^6qy;pflgKqRJs!G4NucrTz=$m;llVc^9
zwwf*cYI`<3H_taakXNT=-g0$Q&21;2Zo2dRJkRUz_jIq+U95BYFx8@^VD+7(RW*q}
zX3UfLu=Q|s%zT@p+YHzxUtYhp^DcXMw69`HSC}9BcGHLRWo%;gwy)++3UL>>y|I37
zbl450pL5Ua?V3~@RH?Uo;*wcmdhhN`@-4g1{*Uv=<j3;eZ*A-!zO~DKee-Vk_spri
zo=<0A;5zx?S!dz;EVHWG-i^EFl}Ai6u=}aLwC?C1wIBYA{~esaDZJB8A<N*<J%fLz
zGv_5)M#>~<Ouw&^wzVf$E;C1X?vs_r>rZ^Lzq$Ea>W6caKNjxcUbN|+dh67Do8UEb
z@^<ceuymK)DgKzM@Y}yOIqT11<~UWN@O}M^{|painXQ@6VHz*=YH8o*N8Ts(-=$A^
zvO}-%{L)&+N3~8CXC`S19Xs&0^hx#ggK1O$t_^=uJ1yS%rgPkJ^~V~CzXi>iBu}y{
z?w?z;{iE~2m&FD7xy=0L8W%NL1FE^cte32~l({ZX_t8|Z{DbN%n3rjvEA<y}t`umB
z4AT+by1B`>;>(hIZ@z@8o-N<``P=e`+^aS7^z!C~2HcEYENdMSwS{+0jpc?m-{)^`
z?O^g0msi%e)!z59Y%`D8Zk73O`);x@ewQd${&iiNZ(IH!)0OTzUaRwU%DF^-6<*r)
zRP&V0iLV=q0#;1v-OoNdd%a+mSeuRM-pQ3LMa;PmuAj5Iv&mQar185MoAZjQK403`
z{-Jiy+WJ+m%8I5{SBFhdP}ZGzS@!ia+w`FHd5#UMBKz(=cs|jeRowFA%rst&h#YaT
zZ<AC!KcCjly;B`}){AXpH@iytuU}zh%`C>R!;a+z%s;HWH225amcph5xp#Z6uMdnW
zY%hMAx+-^yPO*uP1BW$p*qb90)ILckzMa+V=9CnCOyc|6nTb3z?}+d<i#)B~B)2gt
z%Q=6ggv`9-eS5C;NbO#C$52_~beU*t!R#f<D$LCjqry(kbE|dVT6k9Xtj5`u8DFgC
z8r7S~?mYbG&b3{cpS)(?a<k;vQ&-x&=tEI~heFTwl|S;X>AJb3Dl_yb{M-60Y`XT&
z*X!%l#g|n?e)V;5TOw+y{Q7NJX*|ct<*y8*cB+a$FMHkiw(D!~BFBY-6=laRP6`#N
zy7=%lcW(5N)b2%Rq?t0SSii1w4SV;OFFxt}t4h1M4}R{+e>CHZ#5#HJrV?qjIX^4a
z7usFDRq>zUoBMx;*7S#4uB>04@ila^z}+J@H_WE~zG-=0eQ7Pf{6UL9amu^58gl=*
zZn&pi!{g=otS{_8R3EMN_VBe2+o5(<Tsh~-syPKhdu!};FK=r4IpaJ(*Qv`F=TG=9
zW&Be7yVx<aOvR*ikz9Z7?XcUrHeFkXxzdKGR{NcQ_x#PF)24kpWp{B^R`~Y`2UO;>
zexLSydBWB+br<C~r}aMA9lhg=(^}Ilfvv|RXH1;7?$wM{rFLeCU%jT>SMi@?BXDcS
zo=TG$au08M$u6F|d~2=Xhu=r#R6oS^eZLfSlI6W*AIHs&p9Op7{0f=Bv8;XRvTYx;
zK2)B%^fNWOUuWW#>-+!Ru;*X&;d<L2%QYDv^DZZ+ZQE`5rDwa=+c#C=OkHcEr+i(^
z`S9h+_~NHCE}syp+*CQ)<E+Xi;YsKGJWb{$Oqjst?%?sNHuI0#8v()d_n6o3brR=s
z*YWr#_5Dszn8oGII~r#^UYTIvrgg;n+f<L!THlzaIIR(tc=GnRUvcnp?u1VU6*~U$
zON-Zr&s@FZxBlE_@c@36<cV)%Syw!>y<w>`N9yF|H{UE(1E;G`sQQ~-cF+DD<8F!E
z{g-yVTo)^O($+idgj~2xuJZb-E%GTjd)j0e7$m=*H51&Vdq9u#z)`pK+md=~4$R4w
z_?f*+e51H`S?KP=t+%HrJo$JftYoucn%kl0tX>KI$F}4hC@9-@zNU1|&c%nU-@T}O
zytdR)b?5BMAz_)@jaO}IzAUlINMP0ZPtO+wp3K_*Jv=kWxp>DH)A`2J-E<q63vN8P
z9_4jh=IYf`!PZ)HSI(IuJkK>b?gZbXq65{B)wblln|)fRxPe1~FMHOk{HZf|Qoep&
zmG#<r=Bam&Q)V6rz29o7e*4zCo2NE1>+COe^X7jV=^+-TDAM3oUj1z2p5R9ki{#T9
zcl6ACJCF10n)DloN=-B?Hpg~VE}I#hnO9)R{4y?j&8vAeXN;qyzO8>|$9P_1U6fnq
zvI7iHzAio~vu&f*T~Wz94suhK@{;efq+eT;`O9ZApLjuX*G((!=vD7xl4U|8!rg?H
z`^@=x)X{pvaf`sq^S-XG5>g7OeYfMd*Xf;%zZwd!o9ZmxIbSbg-huBc9Bd7Y!@APz
zEY3P_Zhb8Is@Q#DG|&Cp^W(IxPHByAKJaWoo%oj}J@XdNskbr{yqhuE^wz3*5g$(;
zExC5fVy4Hddw*9qUDUUk8QA$GX|KHJP9YabKWCnl;;zhzswDyQP8<m3lb&~XWzy!F
zro&I3ORi;;erg%CFyhJMl`F+mR1yUHuk~&<_B*N_@y+{tInS51GZ=3$99q6&Rg;W>
z;ROD?uPNq}CC^{#j>wM<JpVeFJM%VkTh65HzK^QSm7c|%KifQymi*HRmI>TYblAE#
zDe7+bj(a*y{AseRVw-i%E`~c_Ir>D}``=G@=V(Q5Hra}kOgpSMs<p2+yAYCY@on9G
z&z;dP!V;=VC6+$n-?3(9VgGdIl`D4e*iVh0WqOc7ZfoEb2FCo^*H#)RbiMsz8+GZI
z*v*Xx_2ZLkOg_5UX<y7;#u|H*F?mO+?CK|$y2-m67pm}2dA!fJ%KXjqN6Rnn@tURj
zWL}7|-4*rU$Cp2kKKP>G+Va}|&3iPf&8F9E5@4xrdsJ(yedYa@yY}(Fl~3!WmN$5P
zI#5+N^+4vX<k}vW;|m_hU3EWRK5KpBKG7e?k4#*$sXjgP(u@s!HpiremoF=JS^3RU
zQF~vcJnxV5kLxy;f82ajPWi*Xt<{Sx_f}VX>ZBTOa+<I7`A7Q4HM-ehdq4KAR9m_3
z{+-uRJ&T|3-8bc=Ci8-m|3aT`us#-g`su#UhOa!IT#sJ(swu@KjpfU_vNi9jV|GQ#
zo&RlLG5w#w`i?5!qboeFKIK--+wu0-^}F{!guGb$C;7Kxh5ykBQ!{l;qa#C)=e`PU
zf5uvu{W6@5`-GZ1*T)SB$5$M!{rH$)#QkINKhEQiZTTw0-UnUMz4pzfsLq{t{%MoT
zg|pJaqmKOfdFh$>Hmz6AiIoSBn#L}ypCWehnD(p>d8=4DB_AXd+_hXE_Tm2Fwc*Fg
zHRUE|e4p(7J*l<a+^gMGw9+_Se3Rw3LLKV~>mI(pwCxLTM%>XS*1az(Y;WJ%u<Y{k
zOY5F(-QDG();m*DHE4}Q>4`P@+vXaF#opvNlJNV=i>ntyo?PDUd|}<UU2V)Z^NcTT
zN@v;jW;M@q+1FtwUB50mH`hbu?QynMC)0KxTB%y8Q+WScyLLutk^0KHd#0<FGu|#d
z>$-FL(^s4)RjzK^czc>;f+gFcX_qt7)KBLWzYn-^#d>N_i@Bvj`B_($Wxh8UlE18G
zyEAbD=X06MK_^?<8Q$7F7oEH-+$3<fq|7Ff!+h3)QPa*b9a|!NUZr%^hud?{6mE6+
zb2hq7U5Hgah<|CK+M5zLjhowNY&dX2ZtlnEvgz}6Qaxj8AKu$}J0xExp{Vv_*X@lz
zk9}oXzRsXxU8Miy;B_XGt*X8MoSb`h_cD)XTa$NcR0*uGxMRdyY<Q~N?e>nqu1mdV
z3ZK|LRo`E8-FnSstH<pZuJ^s1>-b>eANTDKgQO?QMVY0)eR(#Z^V`mQ<-+$bt+~CT
zsK+mY$<JNHYv1CCva6@N9<(NK7M^6>=u$N4&B-15ZgyKXI_(IH^OUfBrTI4RY?F~>
zHQ(cVn@Yc${@T}6x$_q1f#m)y8A&(U4<RyrGvv0c7nYP|6D^#d|DPe&@Irg+;vXKT
z`Rb-FQG0r&GuSgHe4g3uJ#&gDv0I8xESA(bb82UT14G#BLxIwn2iaBlj;->}*`%1n
zA3uA$=uN+{sLgE!``Yyjryk%~@OUwww%r4XrFTy?IX>QgX_xkDk*PCyZ=9=q8R|R1
zX=hCHb(yYrLD6%Hmftxrg{{M=ufO5IV^ik!=RD5&2l3{fUZ%D3?x$@P=Zizr8gBQV
zx|zWAr04m)b>EG@<^7V(WN=`R-d=b%rh%0~l(GHvoG;6zi}&^wPwq)t+Qi4i_~|Q4
z&oyJS9-TK4T`>uw=d4zqE1q?G^Gv75mX`9yQb#(un#>b-ob&fTwncY|y_WEf#!r(k
z-`a8W+M;V~?oBjsek<L0;>4;;r#~|l?%r`U+c(c?(gDM_jTb_>XP0t6GvwOwy6@}f
zzy2FqVz(GB`T3Y-s!F*H*U8;KXKb)wc-nT)|H8GWua5DF7V%r;eVtvh?)4--hZ7DJ
zYm*ngxU{r*{=Aw3X`MX{Vw<0zRF`1+eQoU>du`TJPl}2!t&Gvypm=B!18aNKC8MVo
zzGgmrzq7MgSe!*5vWjbQQM+P9t4hiH=x`+y>F=^TPXrjTrk-2<y=>Bvzi&#`&G37)
zx-HB&j!C4a;lP8m851|lwxl#!9*s&6NVd_pTW<1V!7V<<6Yr|8*QBSe{4BA@cAeEd
znPV2u?aNK;tj#C7-77qH?Y+<T9#-GOy4SC5c`SXixWPlY-#^N7?iahVC6<9KW=pqC
z*b%CdykjkQM)c_#0ZW;rrF}+@!Ke7j`5vvi&HIDP+l|fhcGvl{bA-1CG~JACnq+gP
z);Ox{+tSOesW}PHH!khE8>6ffm#k;^&G?;mv|pn$|CFBRma>|~wr3XYoVSECf9Hf;
zmcHdnqYYV|XB_%G=lS{#t0x{(=3!br?P0l8^&!sZJO}0!9#|u@b>~%%rK=3jZe}uU
z_|I^p_{5h-(@*{M@nN<zKAw1QOWegfY|QHU>-eL@F0}vN?VvFE3gi2r`$n71+LN_U
zemb@5%W;K}aD#VuYPNnm_{ugrGKpm)50g-Z%=3E-Cb1?+`icHH`B?o|nC`36V{bEx
zFGq{%E6X$$p7*m|wfNwPn@x*v?b6KYpTTf@-h+9pp}%z!x!#@@Q!uk!`tIIe?kwMk
zBLevkRt8ul&$%eN{@y7e_vGuMt8zoywY(m$JRa3&5nXY+r@C+7mD%AeGi3q|CugcN
z^ERK2mMml7nO9Y>71F!tiF)wlcUs4%7_ISpz#so{P2ZGRir%Fi4|?0@e1942DF41(
z>x-n^&t)dADf%0>c``81x%yh=vsX$UgMeS<e+H#F(cZP(cW>-XO_R`KayXV9Bx|#4
zTipxU-<L~%gu0)-@I~d@+pw>J-?AlRJ(F*SUz=<4+*BmnYT{CMOIyJcKc*im$P~{_
zm+4l0EZ~&;%<x6+%NqaE^c9&GqdG)+PM)7(mv}rd&h*ja+K2xcL}Z;lMo7x*aN5lO
z&k$PnPx+%r@Qs&IlRPH5DwQxiv`*T$XsW84S@it*j}3*6UMbG^YoC^FRh@aOXJb?N
zvj@L}4y(UAC|^+^eQo=mY?0zOdmEZI=~YN_)oRabb5>w)I=tc0u07|ZU*x_le<P!j
zBlBG4%ewkUQragbEws#AY?`Yk_GAN#Ox2e)^94Qh7M`qQIIccx`ig7Ijae@*5ZrlZ
z@8$p>#+;Q3a+xtd{Wv5=PNwke;J&|dd3Hv|++&hl>AYQ1Pn&w4^pw31*uav)d~L>Y
z<pn3cF5krK`RCA*bQQ*Xt-DT2zPu6|tjEZ{e#J6z73TYvOROU<N;RC1F_6{luklcf
z>GxW==d1es_$ZO)rlLas1rfWp2l323K5x(EeYXy}pWQ8cHZa}Nq_Ral*&{6V*uKh$
zCr{+A@@!&m-0B*ZroucYDDOdmpN4E_w^~Tay0%OCZ`PU^ZF`x=7*M}!@7dyM7vIe+
zp8R^&cH5J?rWCdWZgr~;u8!=wHJ5ejX8}%2=B4Fvg7I5pcn>Rl`M%!t^2F3q$phck
zdw+PQ`}Wv94w=cf=5@xLb1z(-t;shpph?K&P~&m?hw-+rx9hKXz3JrK+p`y}_x(6;
z!?s<~S|<){P?o#;tV+bUc%>LuY@fx-t0%H9hNs_?|KQz!^Pjx@A8$LYtGYFR&0Rug
z2JVcv`FsAf<oc!d4>tZYo9y^^o(Vsn(^J0vYZiHkZv4Gt%07-S=d^G9XLvAwKbQE!
z<p*r#A`?F4Z%q|1&XYG}e|P<4{D-LBpKjehG}m&|#oXOHv~ODmMqexY9`2If=I43#
zYufTR;UD94#UI?8m|C<ZNJX&YLc$7`$Mc@;?T-I=cirOUCfBxiYCbUu{Ij&SV?F=h
z34i!ASJW76+`3bx)9l2$lixXQKF95Rtbg;?Yp=`eOnKEq3{U>sp7JC|`R}Vgrv(;k
zZJK27(fo9|^f#N?N9XA@JzNs6qtoX(x#-LBh3l2Ce^rl^%zYLaY80Ve#2WK4WY@i!
zt7D>LBhN9)*RlmRzLQ?K&M2Gv^l{ab{S~j2RsNa0ymaZ=oR|8>Ge5F-N`<9<4o{lX
zQ~FCd;DxX1lQ*6doV6agGTZC#Shu6bJi1NTBP_J=fJV4!&|}wK7o$8LvN*9h_6T3T
zwku~*%bf3)oN8CML_gM@diY4Pz1p>7t_d+2W^#&?PweT{)xX>Md3r<fWu@J3J^nLf
zM?X`D`|9>Yx##gl(G#!5F8VIleG|lJWf-Y!BWmx}RaA2O>4ke+U#%^*@O3}9Yue;B
zwLK541j2m&ERk#L7qPnSEW-2RGLuojbJOI=t9g0>GgZ@5WrV83jgz7S_wc;o(ma1g
z``YreVVCDSKg*7q{Up|Jvv-H<@*{^gsx)7@dQ;ycV1|?7r{`-!VkABk6&dzj`MOOy
z{HbN&(L}S!J11Xu@%|QX>D=dE!0xr1CED=%ZM&^OydT~@XjMsgzH%)~g4yKW=j+~W
zJsTD!9hfPWo0q)3u<^6ubM>WF?hRk3_FkxL?0YlSCT&k&^rRTWn2C3)Lf@)Kn-wp9
z%(J}rc-MoKUcucN?-xfIR?QF7*_a)6J2HSRe(%ed-Vfh%)XsY5uX`(TLbR<t*C&3i
zKh8xHl}}FM*S>LmbA|HJ4~%l3&d-ZhpEy73^R3LNDCIjXis8X8>|3hR7DY)c>W$fW
zCgFKw+=InOCf#!7))8FCHEGY|OMCJk9zWu1cgN||!T`1lNssnkcK(<mb!vhCodxoh
zKhJL!`6;#a%<90o_SMr~9NhDvb>7sKk*{WTMsME~Hi;uz;xot7eOo`iKT^H>e8)bs
ztH~k1fA;3Kvl`y+`}_L!{jNCm?H9hxTzX4=qIf0mW%;Nd;Xyw-^OyZt_c?xh#^h|{
zP48a!&H2^!qOf;o_{wE+n);chtIcf$A0|GG=f8KiWY3lvVlfPV%9U^Jn|x{OS@p;I
zhkCOQ8Ev2UeHzb1kJURm9ZpUBqO{MT|B=c*qid$sx5EYhE`B~sgoWv^@t333=ii)s
zRQBO~r*b;;o3@AxTAz2!_dmB=X(^}XGE3Lc<r-UGzN*>Fy5z&c%{#-*%idi$v9Q2d
zQQ@CWNMpI|!R|6;iKEs0Z(|>Xd~iQLw~o7hvftIkzJ7P~B|lr#$lbX<<@U{%*d+`L
z9>{zZ{W5Leo1YnHqh9iMF`m2JQ#|iK!`zs*8<olSd-4hjPka-3;$pA$bjl|K{;aBL
z8K<V+-rZMyDRAG4t7mmjhgFw(1oMS6PriI@>q2||vs2%G`h0IiwCmmwCTB60M_ZL$
z1)oo1E1YMybKR{%&#YpzCnp=6X58GI@A@)e(*o9pa~#(G!9gn7#zHq0WOC0rN<4Tr
zTP0C=-QBzA)pjK{#<@nHm?|;ppc}vX+(nz!xQy70MAB`KXI<K*a!^TT-NP#aZgx{A
z>a^a`$h~`I;;miD`xZ@!46B?lY4zMQmh1~mrx)BVPkF5VRM!7#l=0gF38o$Svz6Ch
z+O&RI*a4O&DZGc5=I^ppXIGXFN%NRH{dw{~({=&j6QO?p{G2{FM_vCpbMry=?d!B8
zls!bBOzp{Nm{-AkZ}zPdPiJKZEnB*Lk5tX<0+or?d=BrjPyX>0ie!^MD7W+E+Wlfb
ze%{J7^S_WI@p9Xq%i-6g{>47|{3cs__Z)k%Wu<qPc^d7=`Fb?FqWJKqSH;H|RG!;v
z_03Gl*PFuNZFpSt-9FwATdMeGY~S1(u6-=r)Z>`Hw^Hl$)`gdKPJ4(LNHX+gPx)y2
zCG5<Lo+aPb-WRXfvTCYx(_#k3xY(6h@i`N>3;9*eny$TRG0Rq=%$_A1bDrN`8#<*&
zCT0FoGc%TiNp*9zEIVVqiCoez>^su)Sn_S)#Dli(!Tu6u><dg9nI;)ds!HqrCM2-#
z%iZlvb7c~zH_ksaHRL(-@~T-nIu-vyX33q<-R`QOkkTC2{xCMMhe?mm$l+)~!2)Fq
zg?U>q{HXi>CR}q;S@~nNzF9(7&mGuV6m4mFj`5{GkJ-CBm6mIME<18FepltQC7CV>
zlPX>}W$bpjSz_AKGUtI&ll7HJUWeCPS~A;6txVLITGrh2`P28+mt5N{k1-s#T{*cr
zuXvvEr(1`M`ga)=#_&xq-SnX6`_b}!2GU!$F%)q==}Fsj>|X5T{|sMW#xKmg@0@@1
zntaw4?~W^p;*<9JU)yA(yVkVjUtsdaJ`P*$6<cqw$b8E!P-Gp>z9QOeZq@58J#t#J
z-h{+`w2gI`XRP$eS}^o^!%CTwmv2LC1Xr*9x__c_)8Pi*{Ig<pNgPXN8ofz#*c~Ip
zD7&gMb=IXvvQ8)e>|Qa)YQuvkGF@FMpJwD8e;6edI^$}p*qeKisSnRPWFB`*4?3s*
zO8m{bmme=5luBF6<E?uoUiF;Snl8ih8`rO1_#=3seWR&9Z`QUz-^>**C#@{l3zYWj
z{AWnu@0|6Y;c$O<{fA!H0@t=>HT!kX3G8^`er<n5%9Upy-KLxFnw+`v@Kx(sFa5ml
zzA3bDe%$xwPw?OM^~t*V4_xn_+n<>8y-sA-!-?rVDUOp5ZLQgxX}D#MMV|4c{foW#
zbG(!n-Xp%Q!v2Wa#5=d+j$Ay=vwG4_i95CjpPT*={P>^Yq3-*G^4;@PKjc0#lq$Wf
z5@hi3k<H>dg|5<ElPBAw|1->7%6(8{d&#%|3`(-{5yFf99F~9H_5FV9e+FsY8pa3t
z;xDb*UU&QYd(OM1VYoBOO(O8u^^;}hZ__QF=UIGP_v~=6_g|akJP)g8J@LIOThz7n
z;;}ooJr}%kbYl{b^s~BtA)fJ{{;PdV*VdHEYLzzm-d0s*JSEuN^X1VV<|9FSPbp0*
zcPZHKb@fBo8l_pLM#-{;x0dbIxYFITEqSS?tJ-$=m+Z&oo9)DY9Q<G%`lJ2f>g4Q4
zyi$UN#ZpC^o-;g``SNVP&DR@Y)h4qowTvg;xqe|E<KLxqihnFW%v-pyqB>ynzY|xK
zv~|~>Vf^56?9JDgaiS{^e7fzWKH;?XyYw8!Y3gbl4<8FzxvJ>p=1;=mvu9Pme^pY)
zxaad)E<Mf!`Pc7bZI5;trzoed%RawP>ePoj$Cie$=C*pC7k$m2@-OX9Ti$#}FVCa%
z*2>qZTkCGK%%AEmu|jp@<ELTF+bT`3*v@;RI7O~NTK?QZGd<CL0XG;@u1KHa%qiwy
z#+oYg_2hHOg*uzg_OD>Rw5xHsc>GNB<lpx%P0}?KnAp2zt49{QmCmVkl7)T8mU_p}
znflb9C3$Jie}=R?ovPv!md{$ZXf~c&?-SxF?HI9|g<FDi`?EYgt+!huV_POH-eCLk
z;%$v0!+Edw$UhH%yFmKJ)F9@P_i?o@bI-jhf8i+-!&Yj+%%Z<G`?lkb6}DUr+{Gae
zTzV%z`+Ms@gK<=WS_QMBhw?_zXJ?CU9bf7nds66z;<1R0>izjq`!jRa6-jTac<I~F
zwB!L(h0M3r*UJ9z=!s9V+j{Qaw)7zHg-O@$DwoPvY<#SJZ;iKr%Fpc2OyvSq!IO(x
z4~9N&zLK=Gc4^b(wmi?k#=fg&yLa5{x@J5}=!Dm@3v89|16ldZSKe9P$D2{9d9#`M
znCFWuwMK`Ul(IW)_F8XR&Q%_E>ekc<=$ZIAUDh|Gf@fXh0m&Ct{KvNNSWC=gi1;{f
zEAyd+AKaeSImo`=rFZ5*LC}STwySgO;(6-ZR_&e1yR(5^X5y`FJ`NM77_OR=d~Nle
zBThf7o0{)@k-K_P@@2Ap%DgovvQ2I`_MX39a5iw~_Anm?#^cfz$A4VAGi{IPG5?)E
zSKCz_TA-}Ze1P5ZkJit*Z+fRn+)rkEB=$38HB&{<9w{k7Y1XIFlef#dW}atz{><ox
zrG&+^C4D+4%HNjVzVh{~rMIuozjZr%cC3xE=xR7_Z+`xq|JJx|+q9f>wI?<$_@H&A
ztapn{gX4M8t*JS20#1*M)7AU5`I7yU7g|qLYBFoH;VGURDDrvAN*{wKZL+QrsrNYV
zFvhV}2T$o_dwPf8>G(SBLxGtwzod%%+;opP2>-oMsbk#uGBUg%vD}br?PZw<;oeHq
z+|w9V^?ZFD@x6d&(kVt|_1iC_SM2Ri>)v=aCc3F$W4`I^vi`{(hw>yXpMO}_m%(=F
zu=?c2u5-J#PEbfYk#>TmhuOJ1eYfM{IdjD<X7|XoRE1@`Fup!+BY16_zCyzCh061)
zuX(;Ryde1FQtzWJR<GRj#5K=LXc#g5x*U>w?4IMxusEjI+m$EZTFkH@&+0?*t=%h6
zeY5kH<XiG>#cscAcWRBp*FJSrWD)W>@Ktn{?8L6WcY64P!xVQYY*1|f(DPVr*TdTL
zoky*$r49M-KDM`zVXFF@?RN1Kn@IJxY&q$Pd!02I<}hW)or|5sP~rHQxohT1l}e+k
z8#gzyMwBqy%=@}GpYI#rlDEH#Bg-<_RPGqwzqM^)(n2#)4#Ott$**Ik%5AsO44Qmr
zo@sF720jagqO3%YN<O<#n+AVJ&x|FLKg-@ccyjegsYwSL4lqw_o*Z#1TBUqd*p+45
z9&5jUANuYQhl<ut+i&x<6FuY&nN<>ain5j*RSDxVygB{aDji>qH_4}DR_Ac<-Wj#(
zV#4$jyca$m%{-eC@XnQ|e)px-2G)!RWCV<iT^4mUZ*+?&Z{mD>`|`C#pAM*Yz0Lnt
z9lBF+Vo}-iW$sJe3Ko}Z-8g8sbEWqp?fJ1jKc_~du$?PxJf^jM+Unhzij60pZCUOX
zKh4P_=F7jxRs5WXtL8sUzBJiWw7S=F!X!REiy+HiR~{E6Etn%X$>V+KNu5*DHboAr
z%|5N<WAjd!z#gD2HgiwZ&P1idjaSm!UbtpN9um+$wUd3r>%hpwUyMCP(LL2&mphnT
z5<{mtTFQOxnLD?yWA(HJJ#K+r+E)J=I8DR-KGtrrI`i$an~IC?(ugA82=hQko=x`B
z!3=zif3mx_ZZR*P?6=g7)22XbUo)fAe}+BjXVP{o`Oi=&Kl4(J*X1qerGI2S;?ND%
zdz7<yOGT2ySJBVU+tnt1dHtRzu9^4LGw-C+p9^p8eRVq6TY3wh?3~A1$Cnn)7q2m@
zxnbkH%#HQ#=E^>Sf(NB%tD}$nY`JCgpW(21=BlXEOV6H6a59v6C%5(dt7$<m!!PMO
z?bkf{GHk1M%f_q1f!pj=7MO|m$UWM!$GKE&w@i4FLJQ;k;-I-*UbiK<w;VD)X8GjV
zhOLsK&6>})=BaV+v^>8)>v{f@NXhNRU8ySRelz)ukA~kpE}^u>yTL<l-_}U?Ga)=x
zm+x#*^!Yr`YC@JJ`}&t*aYiD15pq{q7T=!eks5YVx9`d^OH-9SbCPFu&yo4IAj7Ee
zP38l$!sA~3mQ3^3p5MzPGQr}p#cQ8?{vtgF8G$FB&3L09c+?~%c~07rhgBB^?!B@<
zr>Wqw^v{kWyN?f&FHO^{JnE{+=G<4S`ElLj?;HG=N_Wnlm2m6ebcXB2OHXPa|K1Rw
z-FEr-B*7WY{nvI?l$sf=DO`5{*m{?qSv%Rg^NJaH4tBhZs%QA4^Uvr<@4}ZW>?_M_
zMY8yn-}7mAeiS`zawF~J8|@eW8Gfk0YyP|bw?jq1rlyH8l}rAzWv$e&l)P56<>v35
z4`a1-g&i+{`4N1&>l#Z3;~R$cXXJnAhVa+~eppq*G|%@+Z9!3F_E)uYIWC+h9`CIy
ztUs8x$L`kh!|$12zt|aT99WT>VBDziSpCC_S@|<A^*k08Nvk`(>r-@v(t*`7OR_()
zy*?iGZEpIb)u&}PPEZZ?-7QmcwkG|zWyOx$Ka@@yNUVBr%Hr{*-LKzEZP_I7&MBRp
zd6M?$sEuB0CjRo3{5^5ztLfsu*cOW1%MzKf@&QAbUB#mvxp9x3yVbwzy?T(qVEiMT
zf8~#!4wc)=3ljh6_arZ^+_v+P__Rmv*-fALzqVVPUm9b%ZO4*_)tmQzjN6}_E_-C-
zv5ttZkwzhXGbA7FDL*pLbkc_zf^#NL@X6o4ex0^{%txK=S|3-rD%szQwE9~db7G%e
zvZoZs<vx+?sTQ8^H=foyoiT6nL(g239}D(g;mKNIWG>`>S@dj;%Qcg=ML(Bce$%@4
zyr)XX1eITXQ%~N@_Ir`6-}v{=vz51Ee_rN!x~Woq)>7Bi+YT+$ve~oI_-l4$%JwM<
znsV)HlU{nQw2)Ajb$B1UZ(+7{^#1eHU-oA`6FU9o(q=w3<5_Q)n!dSZqxJSw%&|MX
z+e~k9zHM8{dss97Zo|$4&zGh}oH!t(FL^$yX7jeoH~oXM)wyj0c23=@zxPyM-AnoN
z*ZQ}!*%t9L^uLZ&3wXsJeEHTKJud;{i5D7gZ7zAY#%uM;75^D56h0YVt<4fY?K!Ec
zjCrltCCyL?$#b6Py>=_~pJdQD^>tm^n>V><&#q2fdjDi@;rAUUj`>#YZ#MmNYUQ&@
zZ;B_>dwrZ*yD5d|`ObCg4}H(s?qz&HAzV#q(xjbtn~zwWRr_Lh;z#OQ?QN+Or{wC0
z?w<8a{lKl?$;Bs*U92nW{nYyP**>oy=~W?G0+&7*urtglUGIGLpKA2WYnkahyB9g}
zUTK*l_alC3#fIJU+HX3oTFG?%t@X!UzmH7n=lYSC9r4Jgd*;lI%IQDcmuWw&7hSe0
zy+Zx7%BLF(jyb55{<_At_9N4?_m9-Juk<fE{8s#uk%on|@uz=HdyVcNm$F;E)M>L1
z&#N1U*E`;y^(*4yuT6el?{_{bcH8w`HM_)OKFg1NuMb!K2zt|aL#4x?)qiX4<KGq@
z`?NmB&CHjHW;w1^_K=OA{dU)n=A-?~;_kSYW=pN<I{aMrxKH@i_)YOWeEq6(&lu@^
zH+!%kZmC;wLsr(67F}!U#89`VUcbIr|7W<p?j8G&g9~msojP{kJG=JA>#c3|%JFsw
z!aTiZoUwdizxRDC``gJM+26*?)F`!{I{i&Db#`&_)*H#nAJ%9nl`HgYIAHVDZt53_
z`g@l{t>;^I{5|UKT01-b%66F?rU&Mh2W<JbdW!D5mc-P=?_}IHQTNcBpu>gdJYLWD
zns<+3598K;3uXJxbuTV&y72T_5qCyoXx-X#6$e%a>~mlcSTJ$^b5D^#H;2=jFW4$p
zrnsb9&sZmI$=;y7(Cu~N>Pc=+Pu`w-%rd$E&}=&?BY~dB68~N<HxLqNfBr=wg|Vym
z(ZtZ%tdVXWwnyWY-E)NY_MC2RD&nx6(PtQW`NKi)IqC8mPr~LNYT!K0eAVyXvd!-T
zjK#DM{1dY{|2RrLE$ij#*qM_xxtw{vv;WaHdn?&(^|*h^#9Q0m335soENAEPcYYb7
zr+Y2K&&|N`{N9Wu)7Cs$>G$4w_6~oYU-OFC17rA)+6(iV9W{C3`MLkhC(XAnvM-qm
zZ2RC{s4lo_dQP8%=;!`U{Usm8R-3He`RAId<Lkbgi{8$&)BN<J$b9<b*i#X6=D!Yp
z`OD_}B;KxQTaRaZ^$*<V(6{lnn%XesTv4Uy+g;)ZZS5UzsvbM0VQyAkU7NKtC~98t
zif<mD{oCSst~%Y1`!iADUV-JW(ET0vjQYg0GgNMM>}H6wi+Wk7^y8VX()r(ZCtQV=
zIg31A{&oGFuV>Sue@`n*@?ZHra{HN((5=c>zDDLPP1C7-z;|O!r_4t6<tDvm63<nt
zgV;}(TG(w-$yjr8Vuw??%&)R#8}A$_u`Tx8&G6N}m8I<*|JfVzUS@Z6E+lL?_@MdV
zLbq$T?D8JW3NmN=S2Fjw%zuV?S}nfYC!X^TS<NOadGHOdJ9FWL9n4!}!dROH=TryX
zFi8n`7u;lERhyme)#0i1q`~uDw#D%|bBb?^CMjI-Xena1_wwbw@G3uWZ9?xsl`p2z
zZxbHtaeiI4_wxDWMw1E~e_nHrduF1N@a1ntZq&og7v7jePth|v-1S1{*n@3%Z&;{&
zJX)|z_k`!RK1T()igg#47`bt9F+QmNeN|aAFS%l6_;15wMcOCcN$8%G`y&{)`O&mb
zUp6f%Vz+!B=UDbT&*S^EMaMRVS@rYBZb)dCFy-$xS-bxwhsCN{GPm;tet(Qzw=(1U
zudJTD6K72ex2G4Mv$0>XZEjuf<R*vpsZRPOKbHA09PSBkzvu8R+-FI`%13*nAHG|r
zzvaH}zGOK*+l*I2;o<7@gyyoxT{$f|OM9t8^0SjFAEU*m&HgT`(C78!>zd4fqmy==
zuzhuJm*lekfXjRQ^_o|`jCwcU+PR!rSy}PeNs*={b)mnGKd|qf_MbuMpKL|(Bfi<K
z`#g^BTb{R^RaN5d1ly{ArawRaR{q0zX@7>sR$H-GKceDvcTT#j{^NLHd`#VWd(Kk-
zrhj}Nr?-7|R;gN2Zn$gB@*;nZe<tf*IC^QFk6S)J$WM25#y7hS(JR*L>e@Iax3M}-
z(fEC;>iSduKVs~MCS=r0nABD(D4M>tGxMDOZhFszo8OOVe-(bPZt=JO4E!-s`wUrT
zJN5f}{rvuqtM~&$P0Zi9d8NK~V$&l&te)$1SFq^3xTpB1=O5POzTcH!+Z(!5Ie6KB
zhQ;>$Y0^^+9@{U?{t@?u^U&@m!hPBb+isjP3u)}~RyVlI#3v&2+%|jaYU91K<{fKn
zb{0!D$)qb>x6ih}kuS1-z0H?(r$VIKI@Asr9Y6mtrfn(zG)L|$X<J^doON;D!H3>o
z_iuDMzT%j>sNBkwfRl5~su*wI+p(W9TUA}qoXg+8>dWk>zkPS@c;09Kx3qWeaa~ix
zKk5nBcC9ulifDWA#q^!w%ijyyYC2_BoRpET`ozoUzd4I@ch);))m`D+UQRo$yGBjN
ztbp(Gfi<tb+v+H9%AB(A(3*3036?pJ_qzQGv$(bV%KS%iTQ924*Ev!+kK^B#FPl;o
z8V}n1t`j{qZ@cx|;`vfVjXM;NFMK|$E!MPq?&=AZ>dUlO^_`x(#LUs&;BDY+_0OBw
z6$|c^nr2Q-?*Dhbto-io^{4x;a=%<6du~tjob;t-!I@7zb(TgX_mr-XI$X86@w~d-
zzo}vS7WZB}wRSx_53eWhZb^?cc{7XSO54>o8?1ZOyv{?}CN#a#Stfz`&R5aHLArCV
zY}0m^d%N+i<22oAl8@FMa+(+YR7PlT*0#%snGV!@O_c4aRDS-PMe1{wTEElWUJn&E
zr{bwH$(Ob~p6HRl$uNhneriHx%ACfN3>&|!p7wpEjJ=sBZ;#-)>?ZHk*23mNu}ic?
z6%x`d|M>dL?EbJ*$;sdHmA2Bo$Myy+#Xql}Si-AedH(E#!e1drBQt`p-km<z@%*Xv
z%~z|hutvI{3w7FPVbi4f+VEkZlg8;(f6L{@lZ+1Vd~7};-<!|t^Q>#9j>iG6!`9n=
zeKU<dd1QzC&%*h~Uq|Um<|IqJoS@l!+D&GK<a6z}u^T6OJ5LMwHRWPo@z%(~a~Afk
zMh}$@8ucZf+n!t<v_Q+zm9_n2nP}u<z7RQwf8Voi>Bc?sI<ZhEf?X?SPR(78ReTNB
z9+5KJ7kycq-Qo05wp{<C=F7gTo|B)Qdg>_g@?3WIox83X=?d(Xk26n5EQzjZ5an}t
zGP#L0+At|-r;5gd4bMNWbV>1OU$i~YbGPW}yAy9YaBG%I$ZMQmnt$6>?ulRXiqi$z
zdIHOA4~j<Uv&h*^U7vFCm|OU>yg4OnChb-|cIv2xLx0(^J2y|*Ut6o7vv97%Eu-R)
z(8fBBTWpNyEY^C6i20SXJ!ZdrZ{xSHs96_RtP9w&<;)Bxj>P$smxj%|>tyH0J%`Dy
zFnYCs^Kn%+X2wga&vHymxzo~oO5?4&UZ>n!sqTfRPNpsIZQmBYaLw=4!OsK^>|mIx
zx=ZTSyWHE%<tzdPtm$V{nrv4~w20Z(M|C={e0zCyuAkbk<7avvGuu3v^(^mE#8b-v
zqaCbO;q|plD-sqMF>f*E3AbEvEAd0KboJxrh^^_>vVFU<gJ(}Na5HSY)Au#V?Q}xZ
z?wt(Z*J`imn4oZL-;%46$q^?VJhdv%SKXSmZ^h3$HETLH7?qdAHOzD6Hd6^ZHFxLh
z8<$mYH8eQQ_i9<~5#{*l<DAA@d#y4}YUEV!zR0<CwoOu@|I)TEx0k9GPqjT=vM%bz
zgqiHcrBAM{UGl)1Er88{FH3b<n@Fam@up3CRKs-)4)6aFc6IBeDO?hHIXsVlhD+xb
zl({gfHmsdpdCpKhj%i|y(B?Z|A36ozm35yNxi7)rrutgz&Paou2e^-4+qq*sPpY|)
zW5SNt{l!rqV^`eWT0XJK@|f*w>*$3SUTo<-`ZJv86ytH*{|sDRk8D@&Zs2#mw@_T`
zb@Sm33w+F;EAtt6t`6U~+%zgId}GwZPb=zzL<H{cSo5>&iOk121zBG%X|yykgj%rh
zWt*kx9eC=<yiB_;<g3k3b6yYCxr@>R7@xDtu3A1Pe1&Se&pgd@hs2Z>rahk@weGUS
z3^B$Jb`O8=k2-hgS<#i^os%=z%Pf^`wRX#%xKtz|lhW5VCB|e8gQV@0@>Rwj4!JjF
zK6@Vb<qeto?$`#UQ1xea3$C>;e%u<fKBx5in)3#0nk8fY&0Dr*ZTCCr4Gt30zQt#w
zldF6!r8cB;9K6%xaPTi{#!;g~d*<tW;?q{+IMX9o@L=NcrLOC<I#ZL%Pi{<A4exuj
zX}RyUNnKW2*Lu0~at?iT+pBwUl6Iw83rhpP#n;vM`L@QJUHh1>VV1l+NP9L%56>pK
z1z%*grdQMl|2wz+>f$@MJMS&pcWO$g#ZuwVx30=YT6(YC{m8a9`AWLL<mT_(#r;dI
zd<(bQ8Z4i=XUeUBFE3+EuWj4DZgSI_<?s3qtv<ZgGi}n`-%~z0zI_`u`Bi$hwxrdy
znYt6jrZY3eoMe=nx%9)Er4OcE$`L9G?kkQtxBgM&`mM2-PMqEHXQvH+*8bGm&P&fN
z>K`#&F3ZV!yj5C#OB%~_mHErJ7X4~wdXhXp>V4^q$9rApDW8-~UB?{l)>p)T`pc3_
zx;a7po$St&J>Iaay&zOozAV~{rMcj^O-P?}%(lxD=X-^3jN<S(sBZZ-(4#fv@ubRU
z%RYTN*!cSLt*ICKJnv-Qh?Xo`C#~}2SFl8KPty7rCy~!Ra#I64nP0y46zOO<s_*9>
z=zVqLm7tUWhKT3$ESK1AX_@cy`_jC^TXWkJi+6-<XjtX%W>Y6Bk;B*2n!C37tk^rI
z4F^xyT-mTueVeP{4c5o|3&To&ly6X((|qFVvd$M7Hxss>Iq?19TK_E_j}AU&R_HqM
znQ5D7UEEjEw=XK1R_7j<3Ea?ieY#xfv3Je(Q)_4cXJEOsu`j>RD)z{#vcu9R<Zb!$
zv>)|MIxN%md;UMpgBd43%4s(g2njdw85RFo?d5%c<LS;z>~Fp<Ju&Hw(Y6O}j-sFD
z{}Ew6nE8?Y0ee@;qkh#h2D4X)6n|c>aQ)&m@$<3^^me=1bA7(wSuS>~Z)T~;i*+ik
zj}MnvN~}8>ylLWdx0+2pe@gz&uklx@ldm=_bN6GgWwW}zG4jsdlMHijSDbuh9B&u<
z@_Ia1ozai>!#%qL^KLE*mksQ5WdFF{YwOigc7?YGY@WzX{rSzVT{ZmF*7TPVI{v02
z)16mdTkpH=#R=_s?Y7xxO7{j{^Hk;$jCeYG=jvV8_ErQQX@4Hvnoz`A`EGe(aY1aO
z?r!z9#fRohx^io6$X2y0`9TTMO$R<X9&=5JxxeT+_YQN}tf@yPy$hU^zT#{U<5P8p
z=L^@p2;RM?UutREy|xKE6hB43;*D&3k}H$T@G-K$SyP(x9RJd6*ECK>N8O%e(ZySP
z_AaiH%B<O};nE^xp*wHu{BrhbN48tau1Xe}@Q}?>W}2<$_TDE)oHtEVo;>TAr{hhj
z;#kQiZy6eD3w#xK2t8Jocq}TiT`na-lObK^N?cZh!}G4ymbyMMyM#<;oOqre=s79A
z=*jw}W(tw~F^?B6n6Nyr$d=tJ%y{p`x=VQrR-P|@9Uhgl(o(|WL0C{z_tpxF)fWX7
zgD>~(c(ief*o&p=8}lwPd}?4ceQ}TF!<<`NUaS_pJMs4X1J_j_-WC4s^pgGiuHt)p
z-5wvk@FU(gR^0E<Jx}>xKDRd|GjI65UTM#g`#R>fKBi`0)8kiGY`cEwTj$a!JM{zM
zGfLU_@j5Sk6_{mE$+c#N)0(B59KQZpeZ<sXDDO&~o66_ww!EeHn63pq4vRN(VrDR3
zZc}~j!l7fF#`l(Y#Ix|FKbn4E=bJ09eg#&(d2Zdb{T};1+tnu)UCy8OB3g5bn8l%a
zj_WVSx8CF2{IOfwv&T4k3s243mJP>0R)?8w|1JF^>-ez^*_ZC|+TBx9$+i(vRi1o4
zG2Yd0i|wrE)pDvay8c;z=f0^c|JxsU(Nt1bZ(XEM&7LCpnZ<EiKh!_^yZq4S($eB$
z(*vnLbr;!J{;t(l{<iIs@`e2w`NGF}vPJitWVz6C%xuPi^DpCkd3u&J@LA8>dR<3U
z$0c}r@R>fdZDNa`-j&Vot5bNj&*(?jKdq}WlIlmYR`@CP*1fuZc^>-}zSRpNW6iEl
z(D199BlT1K&7)tZD)@EW++|<C)W7*W*f;smYT<;R&U3z=caFVx(v8dTrcB^ktEn-|
z-ral^=d~h%?a^|bT8%Dqg@ift4Bv*?Oq)1iC0EE>iw8+lT$M!m74-PtXRUCQ&GQiw
zcT->SK<4VfoSIG143FP6UTbqJVLcI_e4|b@)xlx*X}ibU849oMx>DvgVU}w}VsZ1%
z0yZ{w<=3x+OkCRHqLnR`mu5uYJR)I|*en#;zSQH}(~C`i-~8F{Wf_#d(0BKp=kMOK
zT{>uF_Aw&pzzL(>bHlHsi(Ze9*49j5uwj^KBljmv^-Nrx)24|H-i-GzzYbWOURK2&
zQat(K9?ehx87kb_Z>_Rn40EcKEu1&?l4s5&(TNk@9aQd{>h<cPQp?Vh@sA|dESc{V
z!*BBO+e;h!LME%W8LQTDo|JqNmVWqrlWxI>xcj0__gUL#RQ}1VQ>j?Q%k-bYuVvLn
z)g=mi6)$H!OaF1dwCrN!VfE=k4XbuOTBUnbUa{9Nbk@!<o>xuw^F=J(+H|C6vGnv`
z*XRAX|A^%@%Z7yk{BFVD_ns}DSkYeEbzb#YL|@OHf1=Oq%szI`nb14uW51*4wsRUs
zU5<TB+o}5W^khw&>(aUh?$za0fA-nCzw&8O#N@7JDiZ9UmrUHcMLpA7xVfQvmU5Ee
zeNh1$p7NCodp7>%4R;h{W@3C*`18_(6>&yc5pPfF-Fr0afu=%=d|lgY+20&&2X}m`
zU1e{sW&LYb-TNtDSh{+dtrKS?^&6FDY!%dVPn`EPOR?2@6JN!u3)@d0F8;DwansIs
zwi!vUqPlq&l&)T}Y6lP7`=~S9rwASYV*A=j{0`fl;`c#+nw~95u-(jL<nVy&S<2k0
zcMMsYFJIa|DVZ;%c}v&RukIP^V?7S2cU47r-geIS+%33i;yiz)y?l~0GA~a2TzITH
zd`jkbSJ@(?;<$;+PCm<A;rLy0nfKmzJ@-Y<+)tVyP{dYg`s90$?_rtp^?o07j=#x2
zR{28vbXv`cyE_*h+h}Iu{QH4*O8D}ZOYTGp-j?Nf9T&M+XcO~1?Q1m_KGQrbndRs5
zOsjm}`(-jux7IR|?~5P4TW0b%(!6N>C((8Hk4XjHbvU^>gSo);>9lpf@|H+13_Hgw
zt*Bm_d@oNiz>}f)!rFxUj$7ML?^c+%Cv4yB(!YzBA2j-NWW|dt=@~|z%1spuBid{G
zJ^xOt(~J3|@MHPXtc}}ruaz1p+Us5Zw5^^g``hgBjT?VVf3W4M$+F((yS5lb-l^ZS
zlgs1ntbg@y?;JMZ+wpkS^;i9Wgin8K{CD%i96A20dEIxS^c3_Czx&0t)zZl;P<@)w
z9`(&u{Wp~#CtUyIy6VNOSxeWg%(cE5bIABe$C1MLKz|;q=KGoA8+E2#7ZlaF)8;0T
zP;d1^_^6ruhXwx`a(Ug}2ev(u=le13Y2Jf*Hyr|%OJzP@Ut4>0b=FC{iP`IJ3#`pO
z{r#tZa_rRybEaGmKEK#((L?=B{~35^{s{e@U3V_rp25x{JIcr@++%NY^)e6kQx^@-
z-TAfh(Z0%0_wH^utiIfD>hHO~YyYrs_`7HyTg>ZQUMlyLK78@5%t@9vULaZWXH)h^
zrFXim(?TE2N#9}G>Uw6X-|t^@L)1_Foqc=xEb~8F&z`BZuluL19=0iER>h5?<=XSM
z)*s4J*co8q(>Uw;$Flj~Dla{g5iM+!T|Mu+)!cOjQK^?RcQrB91=VKX`eR)&eOtt5
zBd;&A+Q+`mX5{7!Nk~?{w41+u*98@qr|t>9-oDm-r`)qk85sLK<o3S4Vki09{+8JO
z^oi%^i!<;o+w<&|!NJ|@i?(JTlG^`GZ?ni+#Xiye*?(`%n)s}5>BZU0Rg+&>tes^z
zhhgW}zrGP3#v43dIG4xqX<eJ8ylZQp$GNXl*w|l(&0~JH?P(n2LEF{mVgtWqom5Mg
zF#2Ti%=y5<e^WNz+L%9+S?tN<-hES-vgAn?%~$+=yl3*;ptbw%{^sL2=P4;4bx-SX
zrfuM)YqL9~9V{eIJ_*fSBO~N+n0Zo2$=aK`2cIyQ7f-&>pVj2yP;f*j<YRMq-ime6
z?>C;ge{)Sb=lwZhtamg%nLT2Zn|l3~_7(%b=4Zdsc2+;UdFb7_2)<=IS1DHoZoZt<
z-ILIG;_+>fo;EkdW0&mtmuj0SA4zFpUoGeA*5V;yey)Of-m*P6msJ`1X8Eb92yj?f
zNZ9)76bs09ms(2uE6Z(lUB>V{-}0c`zpY9qrFx86pUktm&T@6)p2)SiRx5*d7uq~u
zu$Dv5u}E~2yW?fi^HCnV@2ezMd|!RqAmXyT!O2_JT_;_oVs3cOaWm7qJjq+QA?v^t
zj;6P&zmjcNv-lJ?9AvBHz5Oz1Nn>LgtHawlP1+Ir0&UC8?JhrUXPL+6wEn}DT&<JJ
zyf-CIt-H6}=5yquP!6+Wc6n7_SBgD(f8#I@AG@q;iDs!$^o=b{y$81oUP)f7b4GT$
zj+^1xaN#^lnZ}EISDrZKaPYa^T-JQ)X^ZAPGO3vJv{L@)t<^R`C*IzeU$^gTLGA?E
zqZ{XOOQju($hWll<ePbB=9c85#(q|-jz)!fdoC+WPvvgAx7R;v&&M?htkMoo7%W6X
z@92kdc^B2zt~L)|xLkGajVGZDLT1ciy6+rIe>O6Fuu5BLbE<F}*Xrx+OpE*8DfszC
zzvuaK)F*ZAnOANvW?d|oUD8yZB6q(xFZ$iFKg`>k3?syZ7S5?zaLh{Z_@!;RGbb4t
zPvt(ot~jo1Nrg%F?PAZXhc-kUw3MG}<hUiZz^!o0w`DqwA~iSi1N@_mB3ke9OIoZb
z47>14OZ1X!^oj06ZkHlHf0{Sd>Dkqk;O~ur2V|c7njE!pneonOoyz1(6K?h%SzY)m
zOsLC!C6BYEcek0cP^<QhYqoE@rsgzmx8)bTdOq!tLk!b`c?=J(TJH{g`e2<~<$33r
zOWrFlye_qQ_U+)s0}RP`%GT_jZ4|8`vHsHTwN7U}Z42yPzRMPSbYes9V$Poaz=&hs
z$=$-ib7i`tQ#KnY^hY(Hy!W`Ad*0QHcV4av5xnq~<*H=P&B{=AS?y(}p=)YhFS*lm
zSnhJ`0p+z3ZBDBv?U6~TkDB=K_wj}-)1JmjmbSH;R<q>hNpq%`Wkz|uZ*@BI^=EZ$
zcGhvZq*k7gp80DNZZ8aw?1*zXVDmA$te9oOyh@4JG4I0NFI+mbI;*$BvtP%P_wCv2
z+c9(6R5l#rP+nTRD0Y?cC(Bp0tQnD~PAxLaJ!mz5t+%L;mB)+ZxjtI2Jazm}Rb9SS
zyyKlibW@kD{jn9%cZ8BzZ}aSqobvZ#SeTnzxboAJ=U0AN)tvdNV(ZGHPHiDZb(PQk
zSu3?x{5&ji+w$?8t26nepV_cJn6<*|#H#-cW+GCrmt6|CE8BHtWeIazz|Djr_jOr)
zaVEEzrX}}f{h3%fi7koaML|K<hR$tfkK1J#C6^T}El&xP*PhVMJIQFzv(;YhWsI>4
z{v6<$zcjkP(t795O6lq=#R^krFob-)V_VDXGPn2f%0LlC#w)v;51eN<tux{{p7U30
zrPJ+7#m0wcBir9S?O@@V+_&|tZtS#n7uktR^Lb{^Y^#uYyx@6rOnArp)GPVjCyutT
zwD_(5y6(}tf4atpFMB<8J=2`kc-4Jv<&x=@M#63C@2jrwY&l%5dRF)RtmBXFR(^7S
z=rSp8y)?f<@r~=+E8<Li>$k<vU93K_>%yduHP`MQvl5dyTl{P8!AzOQWsWh)TdTrt
zw!BNpteQFR=3;eeKUe3K@mmTutvu$&n{eaK&+ttPL08~hHGO)qW`dtp$h+8GGtG57
zyVI2~t-bk5O?SC%)wS9?J)U3wW{FH#oV?)c@)hTfWaoU;;Jqy&dNyl&ny07kZnjmm
z3!03Mug_|WH1ZbSJu8-N_oPDy@9;G(f109haq{KsP~B$?^QV-)4-<0uWO?H51-?VG
z*djUiD^Id|Qg~LUz0Q%{Rx`2Y1D|!sj?ZlODqlJax|JM|5$>BBmU>vYNBC#xwWQXz
zdakuvbDn&$U9qj9YiU_ezyGxv4iA0>-%0$b-sODZl54Mx{92`k!?R*|_slbNP?qVN
z@|Vrdlv!=gDGs(7^1Sc;c{nW|lr7(=l2ge%G5qb5Pm6NoXY_4#`KCTE^UV#J!men>
z<ZQ+rbL4)mP>G+tu5OCW(iuWUnvFXdN*4WU5>vf%VDi`X`|TghEwlJ2vT4KbjVst~
zE7vzXU|q`4XB@xqKf?#V4$-aF7aRgkH0xB!9SHkkr`#=G=gWWj%RJ|0<;hzL=ghf2
z{g0#PlI=6gHn1eK{F{0&I_}XqvwPA#h4*&Ki^M6f<}_O6D8W2A_H*WHxv({Vj{e<c
zBdFHDKBLZfTg-&}DZ8``xBp(_|1z%p;eQ5E-`Yf(OpW_JbN7Vbir>=Ty5>*qgW7U;
zE|p0h5r-$9+SRlEmG<ZL2Yxk2czg@jO5V|WCV%$|<tFW?8^27sdfoZer#sGZkJEG4
z-rr(ulEW;-TwVX`^{l;D+^4rb_|Kqq^Xl?Ur6h)g>hGeb?wUobE2QtOc$t}2ZK_`D
zF)N@h@yFzV!`gW&lef)y<>%B_e9l+dBh=xz<2h}Yb(NpWP1oi<zWd!#^2xQUdvCpC
zb(c7n-FwebMb7H$T4~N(j@v7hFG%I-t}anD$$3?E#j9&!QQbRtm05>&&pBn_aA&V?
zrf1g5@7sF59FJODn$`THNV>7BWn$6f8|QgK-n_G1DLla{-)^g7Gh@Z`m)B+`=cI1D
z(!?6pb7FGyyd#BvuIddtpYQkT4QW>?Ii7dbFeQmmC3%A5>%bR57v_ol?B6fCF*7M;
zn#G~_=WWW@oN%1{<UmYA_M%HCJlL)rPG46QuA6Bpy*R5ZKe%w+;tM8^lnb9vU^wv9
zx9Iz>$qs8iZ8WyjIal}5{$aSOu<7AE4ui$(SFV#k618LF&WdNb*BN-+_KLrbcvx_0
z{_OOWS6kM~cJtPKvbNbIIQiDD_582QXC-!3C>K@r^e}0k?EUh+nCbYOKMTSO7u?Sd
z+x9G3+jiG7ZZEq~`KYh26Q3+jNtN2%y(jXEc;kPD?7!|0zAetRxNz;w3i&;Kxyxmb
zS$F+ncmB`N)bPjhN4K>5BW=kVTMdVq1!epEElq#!T$P<$TM%6^S$W0FAEEM=OKcvq
zUz%cc)FR4vS-HE_RQ*0JpRea{?LHnQe#E|S*S56}yPJy_E!|^w;Z!)o)VRV|+9%tJ
zuPe=1@I<En(0nPTGe(8i_Wla^R?uTDZydIGZBVGx)|=ZG-jP_!+~;0*^$Y)-*Gaj@
z)-yVFE!RBHT<)a(+*>ou^1{Taj~nBoYxpm_NQqoe(1^SmZt=SB=Gym5dlWw|zOb<U
zG{d$?_nMSvOZzOYZr+jmg3a>R)y|{{C0@xK#*-q?+RxM;nA13??5xFFzTbV@wn*Q|
zXY|)%kJ>K8HsOJc#yiWSW|!YJ@T(*|xYoLLXZT5GTM@ahd%~SP%yj2yZDe9h%`4~o
z_ci@QCZmp<$FZvt#~+6&FisIN`_HhsYXSp9UbwBs)~&W)xihv;i(pt`@%Xu|*akh_
zDV=TwEz{0f&3c{J_Ttxs;!}O|j_rKwq?1~4{@%%VS<<hnO15T79OHSMG{L~)t0>#@
z)NMk}BEgsEX??N&zV7kCzgo6MGB>9MNjklgTvwN0I``A!l$!95^W(Gc%Vr7av>Z)a
z&D2x=D!b>y)!p~ACLFWWJHS*G@}EIKzxR6o)^F#W@0#2DX_l}>YozTe?$@mge0AlU
zz0KP4ptxoK8G1_JD`o0Fm~7}~R<pdP>+|o|&vqmonUq;7{kYKDGUwg16~a3v&$)EJ
z*qU?4Ta~ZN74EPXzjRud`1+03*QGNj^k|+9dz?}b{e*c^ag^D&mTe9vj%MD>c%t@b
zr`*?y+uR97Y_(c%Q<H7)o~cwcWGX1in$xU1-|NEODFR+|1gye>HyaC2>}oqU^~94R
zj|1v=E*;`f5q#&Xm_H?5<<gRr4}K4OE^hcGo_l<T!wH6}t_x;wl1_c{k2<$~GJj9a
z-m^JQCpSwTFnOmI^eK|##9`*2S8qGHG%shL=(1{0?(;cvRYBT%ZufY-u7t(<?YegC
z-n+X6Hx!b)KL2Nsh@Nfhqo`8&b=|CUP8%mmD)cm;b6l5v%<sL8&Jp45ESIFBrffNB
z?%ihlId0)1yOIw^91@TAbR9~X)O>Kg--kQ*^5!Z&$&pkkU3EkDoAICM0^il<p_YGm
zD|e^PncSDX`Qy}cN}Ri!=h<d=$6XN>O)ZXhmz>B}_I%~~$PcH*HgheuDen5TR@U1}
z@UrdeYc=LlYj-EVd;9p_++UJ=k7o;OYd&lY+|ItYa(PF|Va3Xce2(j#u3UX5Go8os
zm~Vhp;G7)8Y44;(v<26`^ZxMY$DPdcj1%(vSv0?_oA-=owS}ea0a@*q3sYXmsrO1u
zlsPWl?~r}bXSu}rn&LY_x1HwBTW(&^Gs!@`XyWm$<@OwPs#)?pe|)o7MecTgx<jw4
z?$h&$F|B_XRf-H=9hv;^{8ndy+X|KkUpBw=U)uB4KDl&0e@6Yb^aI(_yEVUMmu>uc
ztvsRkq=qb?RZ34-{bBvCUsKl~o*V4`QFhJSb(tIY&8^Lv_~$@l%VfDn`}F@d{%6Q+
z|Ka^n)JAtrOzs6!^+VR%e@(Z)wBPHW;t!_N!BcG_mz>ajo)W*!M0@vJ1G(k0=d7e&
z9X{)ICCk=ICiJ1ky)EXiU*7rr{^t8*6SHRZ9_ugr+4hfFe#&u$IfD0Z?U%IE_)&K2
z^ds}$lGg=1W>ROb7*2h;#iM|=ZbkOT^B=O0i{1LNLbqgl<T@Si`7>Mu9@~BWX<onP
z<jRWEQM+fJp6m23^Tx!!$dmuJyk73-zge4K)nfI#bx9cq->f^3IOA~fjYqrpdR^52
z;^`3-(Gb#?J;k8oU37tp{E_SFi%+C&_VASUIL4p#G<t4Pm0ZC`-Md>RS}0CeR@+z-
zz3ftH(3--w$EKIF#hx9GnBKU_xq*H8(qcJ<EuZvQ5Ajd8neQdHOPuX}@vV}V#}+PM
z((*v2z<zG{4yR4l`iZwM?Oe~8&GzVuOLX~0i$}X=A2H-%-0^sYsrjXYs_Dgd|MC7<
z^4dyq%f!#R8*gu4sokf2p=|Pw<jI$7Yp#CSA7>}`(Ra@zv(uS%o_tm5%d%e{JJLVl
z)JFq(qdw_NJD06_Q$54;v(uUAkmUW$%Az_>PJ9<nJbtB>A?Wm2I{dP!PS`=W5P_Qq
zj&cX@p829{(vh_d!3^Kk8Io3=736t1xnQm3W8DUa1b${&Ey={6(K-c{ccWH(bq*@u
zWI5NxZSDR!8(wKoxRM&NM5|$%P1DsIuL>JNRwS(86K$9LbzQQWS*`B1o}cA&`>1Ct
zruN;6n#m_+X|TNDypH`;r^`80a%A~FWL`QpbAotjfYAZ@*O6;ACH**#IjZg1`RYyI
ziM4teGdbC-#nk6q7Rs@_RhMMl^K8YI^9LjjKA7_{(DdB*yXQnEa6FKDI%!wpW|OH+
zcS>cRd<+x&Se_uJQe<7ro8Va!P_vvxhOg>Esi|hu!Ia~9g#n9;D*HO_C9tLaJXd7(
z`QEbTK$iJanpS_>X(6#L@GHMzNcwZ_bN7sW|6NQuuDbcaa}$g03$*s^nmZ?Iatfb_
zUQun`lppJEb_+dbe|qA{vmGzKrYb1Q|Jxe-@3P^3MvrrL!B?*BS--+<QO=v(cUMk`
z2%TCiH$!e~(!CER`CBG&zMS<~`D&MO?n#OB@fWV{j`ewWM_S@Z^L0`2LaRiRyXOv{
z(_4`Kqmq5A*O|$Or>Z<(W~)8BImF+{DCN+^b9|nw17967ldulY4?cKQ<I1+<DPhaz
z+}SiIrQ~&pUaaILrGxzzk0rjJP4{0RcCxqO<desyv+cI-C^-JqLV2mn(zO>aOnqGR
z_wKtV8pa2nYhVAkO0#x<+BMa}2L7zmyRJt0G&m;My({dQwdmJ8k>1}SMf`hn{nAAv
zZoK*OddVRLh3)ZcOT@}+MK%Pus}!Fts7n1c`E<$Km$9;2uLU%?tDAoDvx@nlaW!-H
z#k*#oBxe+V&XY;LwobcK((v*+@t$ic#_4tDf)~VBU-aJTm{hP_S(Y{J!Mx+k-33*$
zR(@7Zzq?2DpybP-T%HIf!|MulQ+a2%>KtX1<*O15a$0kVGn{Aff)|GOcB)Fpd|UY_
zcCyxap)GUf-I1F*w@@Uf#ZpD?*_L;9g>!h)8NM71n!s9ceA<&_(`Q%0(ickIdwZ_z
z+kKXlX<sDPeBUg@aO0L?le=^D<rO;0lJaJLS^A1>4wffv`o5l2Pw4r1F7DNVjXHIX
zS394iZC<|VkZ_OO4ACohj-6VwB!%&S^2+m3=XP(+J+gs8;rD`)vog1&E_dZUH!e+6
z&U0gz2`$d>ROZ=l?vu7ly1VvBo^*Bcj#d2(=lm+4Na?*zeo^qzQ*xq1^3340cYdC>
ztXa3CH^#g@$<83$m#N$=l$;=GKR15!_PdAX6rV`GH1$ojfTyDFgLLg3Z3@Zrrsmx;
z3#wF+W2*`|nY&dm)bPIj<6sW+XG+H<58l51Vad|ud0R?$%V&8j9N^+OCcQSAVU2<i
z!wGfuZB<vozU@$dFL<Fz>y$zsL-1wEm;Gz=&(xe#yy2N3F?HtVz5>>;I}SmscbA`@
zVEAL!g(>gU8RrN#zp2%l@~~gWlbJcw!g5`QX?DcVJ#OD!HH$tQ@ffl{J$P`{d~IWM
z#px3qpZ3P3u&m}0@-yt4-y1IYZc4*aPYae`q1#IrKEJ)<5>Ng!W0Bj92Y%m=N;x%Y
z#knWP1FD3>?g<1WOK<LZFw2oS_c+ht`BRcJ)<s&s>U}6|bA)+Cko)$;A0gMmo<+C1
zCB59OJMYo*j4SWdi#}iZYVwvzdClEd8(j|WJ1Llc@I@{A-qMFFKVP}N@MzD<H!E+J
zTJj6OZp&Vo(9fu>!q~U`*3Rt6eVGCq?)f|WT~!r)RqlCG-A0aMjp$C7y*GX`OP;M2
zidpsibnNyr$JKWw=58uHXH;FQZT0B&TeF|%Esi;^y7l$OtOpY~&sDCecqgUvJ#KDQ
z$np!<i-m*pH^0&gx3G2Js~od=;oG-ec^ir?6pAYCuEuE^>{K_+C>L`3d3z%}+ro)g
zKDc{DN=)*r-MK>M30JIJyYbwevbLE$9?$o3RNBp(vg5J(`n5c3TU$3hS`)Q0y}-6O
zG%?5X$JN#5w+$2L?RnI%X!J@?qHo5tWns3nC2gv%<n1*)zgO$@R<FLhnbu0>LMc2&
z#>eZPt+viPUi`9aezjcTr^YMaSIpom`)YDvwNjtIq-o4b+0S9$Qs#V-eZ?N!)99HI
zDD=UqPDHq=;*aLt6X!22F7B(k?8DBxByD=33?KVaLyPYsj}I;}EUKD+uIcv9^VeoL
zzW3snyTYiD!&k|^*IYTzu!&bQ_jHrJRK}P0zC6?J|IM0wKz(anOZ`E+JRhkg7umJe
ziOl&NKR;}Sx!~Wbq<vTac6{ButYVXkQ+>4r3*Viut6SEp6g&zl-1uuU?*XyQKU|g%
zzOIu$=Bs*Wqnly{OY_<6%&M8wj@DOj#83J4Wle46hraT3+rrmzZLgkBRn6s>`pCOv
zlCNQj*3v$XNBeF6Gi1bb@H77js6Op+D&p1rz2_74Kh~B0a(@(gO>JVhYRAFv>!;Ue
zu4n2OukiX*aov1c_Ok;aMI5hxrR_QOG0b|yR$0qsHT$NYEf>f=Fv*JR{LX|o)jikp
zW|p1IGq2fG@;>}pvPw#xgiT|gZ_V9^qEjz^E!RuwQ1uZ!E?XF2A>D5AZMAS}<4+IM
zh~DGxo;=^VRMszStJKA(5uY!AUa9k3VAu0ynKc_C`z?<r`%JpA$iPzN+P2t8v-DuL
zlN}RyZ^-tB>^wiOlChfS%bLA*FCY8%9<X7YwYy#S1WQ;@)Qim8wh4?DHe9RqjgqhY
zE4A(`>|qXl#@h9`xu+mY=!zA8TG#;wzAsl@GmS6zRs7XbI4#Ezdwk)u<xS=@4{#M#
zg{m|c{hP|{U$VlWw)5GpFPqIS$nbn_?)w_-aPdhi%cq6@1_Bl@tRGxEw!B_;>SVv)
z(OC~eKAtTIoxe9@_1uz`_rqd;)Gm-0sOU_bEEIkFxayUYJ&!CdY_wlm^SZw1*S)pn
zRh5~~(htb8Rme}Ro&H;`BJBH-S?yixN^ZODyW%%f$KVK~z46D!u>HC38?4+9*Yo``
zypn5DT`L^3+jH$#iQEn*hc1q!eLGdsc5j&a&@XTH-Fbb=-0D&>d;MqE3I4I3ee|Eg
z_Kq*Q2b7gf7k)f_R4lwsDW5+h@HpGlrHnk6oNkH-H-6rJL9S`9vgd~Whx-r879TBc
z6#cwn(*`ZCjnn*$_B&3FH#t15f0DQGwBjrCp1+P;CiOMtm3Qif&s_xvE-i2GKX&#0
zi{{L*;}W7)3bK6GA3YZE*?qLT@@csRv)s;?aWg;ha2MWx?cYDo@cO>0kjfy#?G063
z8}sG9Jm8WR+9kL4sa3AJZT8hVsXw7tY&h3u?0&cL;qT>!@otZmbiNk8?D{lmfrYK-
zqxG*0_xzJ9l&b8PZj!8OsJfWFXx%UQ1yZSR`!;i(U2^C6im0>SQ@0l!Y%`v>HDRLk
znic`8<X_jH+s$1YTaopOd$soI+0`fZU!7gq_2&5ocF`~CjrLjD88w<JcB;+iujRVG
zi&O01qWSOpVy+cu-HR8RoL{PY!TN)vPJzD@o7J_o%WaDo?KPMu$7O%m{U~ngN42Bx
zbndRrd;HAXat0^+j<2FG1!9<9o!=Qzv#>Bq^K(w=L9<?q;KK5dyT{dSHP0-KXW*al
zd3VEB8J-hs@0eSvH&}N~*80z2V98KqIOpoJ^5DH&v}2Ae?Xcv&tUNE9JE%qN%?6u~
zuVYmY@vH9m>2c2by7|fz@yyZ(UM%lFwqeeE=i7&^H|yQtH)vR}(egp*ia*Zz{~3fn
z)aA4u`)YCEX!PY|HK&CJPs*Oul@>>BHG0{?daFoU{o01AJ74ZhJN|5bui(Rv?>5WV
zZ?$;-I`Gx@?EF;G4G-3zsoT2yqp`2qevz$5C;zLSS!CVy*p$0}ON@1Lx#^-Ce{QY+
zsIuqO+s_-%ax9pi722_J?Ob!uNe{1Q<$aY{HuX%jN4Nim&m51t-jvK0VBtH(@b-Op
zi9Nr>6miDQ=arZGuFC3MzJ40Vy~PX@FKxN)Y`xQ3$$EPi$G5l48%^75YYaS#iq8h`
zy*jU`yxi9Db>wBAl)xKT?oQ1$QQkRYOV9B+zd~3)7<#=wXL#N#?b7mDQ<pu>(n#FB
zTw-a<=k4odE_*#Mvzuzd{h4`A^4Dc5zl7Z+CRuS^+@2J`+@rs|YK?NH_*3b^``6Ye
zXe?%GwDs)Cc`|`ReVvvWPs>}G=Q5$M^W1G7U*GGsE%AniicqopM7!2%?`bU$(nTje
z+V)wgcmJ(*UA~5og2Gkmrk?#Vy<>`jYU7_(xhpg0e6jJc+xlXk*e<1W5#MW{o)>-2
zeWiTe?Zd{aqAb~eREUOek~z~adVb#v&EvA!T&i~!R?j-}Ec^I*6`8aJn|n^Gu`=J3
z6>oog`s9gY26a>KxUY6zwj$`q@t{4|Rg-!%bNDWJ$hwB?-ccDb=lknf{wI3R-O3kn
zdhl`DvBFs$KNddu&k(|r{j%%P#guZHdF&2ae;f{Qs829<+V^<dH2FuouD3E&i|X9&
zFnwF^b;(q?e#t>I=D7=mSSx!^N$-$JX5g8poqQnb{bZhPLEF6KC*KHY&E-4vDaQT`
zqiuyu2-ki+F9Cjawbl3Uw#_WMY4P&1songUKjaN%dqdYR?B1pQN?bVex<K6Rrpa#Z
zXD?iTo&QJp`?qQBkG>zi{IE9bso(Zx$CQ-ZelBr7VEWT^<$*liCBf&!75Keg>`(vC
z(EV%r!TlXlX}c2*Lp_<!Ebe_d&vDuHgq^<@e(ZmE<)6U^^)4H$O<VRUZJDujg=OW^
zo-d*DcMks5{y6>EFV+7HO?z@Hm%K9AyZ7qS!%in2%QScWJ^ImX%YOy|8_~rzP9ORf
zs_wpjtK0hcHsuQ5%kv*9eE+`weE#j}-?DaJ$}918yWn2A{%%`!w{*F&pGflanv^G#
z<E}pLICOVw>Gpb)iVgeZg-=c1{CiLT)Uq|JMcP?AUjGx_y5yA7<fdrZ)z|8T{~fWH
zs8h%k`!4oRaM!kN#asL<JH+Sx$SeF2et91Ee}<;8_}e-{Keit$3*&8w;+BXC5Bs81
zpnYh{W7e|swZT*FF6uv@FP{0YcKw{4cUra;#_T=1^NLRKmif~sxYnJ|*#E(Iee*5X
z#iv)#O^!Zr=U&RcsNa89Y3)7#Ch@ny330#ahuh9YdfZmJcVg}2%PjL>#;liiwT-;W
zqno+DFsDwhBJAUqx1phJj26%K7V_T;G7?vEIVV2rZ_tPQKf=4e6-;{O{aT;@ZdSMO
zo*cdPb044jY9X;U^Gp2A!w-2bMfyIp6}#pU!LiUl@@c)_k}K!M-NYtW8AnyfxMm+R
z%w4bisoei!{yW*IbC({4g&i<(Iph9-wbt>&x9c(2|5&D_Tq@PydSqTObGlkg-;blU
zckPeMvs9>iUS8+cnYeiGqv_i&FWTx@yxoFz3jg$vYx244u3t01b!=g3`SRmZ2Ocb5
zD5?D;+~l(q=jwm%tJ_Z*PV@`xyO;5EzxR*AM}I?&+1pAzL)0R+uI9b(^=ixdo4=1&
zO=8$5wYx!x?Pb?G_D9(-JN9SU^X_rowlkIGO&tHznD1Tx8FJS1XNU=JDf{GYXJ5AS
z{d><eiRxJU1KS&po1Z?JKg(vVeae3Z`CU(<ZmfE2ow{54<R3Pzc?*AQ);J5y|1s_6
znf-UVJ{H;jJsURp9~W!MHxJ*nn~jXwwEoPi)t+^|{=vek-BEti%03);`Y*D0THrh0
zl+PMlOT|jpY!(&I^wMbh{w?#zoR3rFM0ONOv>w?w|M=RXUF+X${pcoibdPYghOCsh
z+h60LsQQCWHje3QE6;14mF!$}tN44r+X_?u+xw4JElIkky?o<oru5#n`jcy(_W5SB
zl{xFLnKxBAf9BJDIzK8Oo#)K|ck9Exjms5s@@Jj=)_i{g$I;5ampRL~q^4MEPrPc|
zTN}IJ-|af>?FG}NTB3Rsm`)ckKPhLo3HM(6$M!@2+suc);Q^Pwyte22@$T5ocL{qo
zI11gFVEpvN;<j^EUqxrF=RBz$Id}7+u*JSt%BF;UtNMHV$gu}My_jX>in8Wx-w{9M
z@it#>#Yr;Tf*hwzviW<RoyVR@+wAKGN0!1Hvx53|%LGrodf{ZLPJ-6t8`W2IS1o$}
z^jLM*nccH_3OLS3EqQZhF|*dbAM09uO)865T->p1<H1`uERXq1F10$G=*cC%!1iqM
zMPng<dwu44R}FMz%gb$^gs#d?o`2hOE=%|!*PMOE=VPwCUNJRASx4mC+n8TdoIkxw
z`+D4K6Ssh0)i>K$sbam!K`-vchHO+Wd-vm<K~{!om_<x~ef+td|GFnweK~7q$>%kB
z%ac;mvl`|rUk0t*Uc7qi)jK<Um|t$66S{GQ^$H>0f6X?}c3R9ms4MZ@f<;d2OSu1*
zr#oztE&pgwU2S}G+1Z)zXK=EgmAt)U;;j{T?ioLjv^XyJ<!Z5@_6g^n^c7#vx)$u$
zIP~~};I+vcub-KuZL(TAPhHaH(W2iTNtPDu@8*5ku8^#C+(xb{G|gH<kI(Sjy{l_P
zZ$7=YGJEzn^BjqHx0{R#@0(tH`Q2xMkaLlhTwz>gX3d4w?^u3Iz4-F_%@IyjPnq9U
z;g^oSsH;2o?cDcj<}JL-7t7U6U7T)hd7^0cdA}V>JAQLt<=$E)lk(;HwO!oYi@0Sp
zbMM;v@-EIQt~OrM<gcP}GA%B${bQY|)!FIkG4G4m7{7g4b984~yTsu+ld4NsdM}!$
z{aNFn>2Zs%wpO9>PDjt&_Be6!<;1ftDVZv)Q)Bq|@CRhB@eJrbEI3uyFX&CHybRAI
z+w7Ao7M)KLo;s1CznU#n*2Ctq(^n1KZS$jcC?xmvF5r2*%yZ?@{qL>_n3t~eT(Z@@
z)cnqKJ>9Mn=?<39a~^GezFo-kkHZF*>+Yo-&YvHc-&Mb~d3n3c!!t8}ZmJH;yz{R4
zdN5N2hn~kh3+BG8-M3dUZ;?-o4!XTMPkTy!@VTt1M;P5#p0GSBe&ySXt45Ezr%HQj
zU#}1TvU*$R=OQEf-S;NduDM^i<ALaV7oLj~H~Lwg^S4~{rds5c>ta7uZ3#xRjqEFr
z+8V`t+%A8Fo&Dnq-KY2372dv{_j9#DdIrnelTSS#JifH<o5e@d&@JkX%z1}JPM$pL
zC+hT+k3E6it3yw4#;$}i=Dl9K8&yRZDpvch^`Esic<v4Mlbh@BSte+4DxUf||A+<q
z*0?^S@OMn7C#;<_D`#S}(4=(>K9$SuZ_QYq>o2t=X5O)wjSmb8KW$g&>dbAHV^n5l
zw&B{X!rJ^HoaNJ<kZsr8Oz*ilKVJS((EpZoR^ppmsUhucZpl4)$Coel$~}2#LdbWO
zs}J)JoZ#SmXL0=68r?-3wIZ13tay_>eRk{@(;nG3XE@i2Ca34ISq4>IH+}FoGv}+m
z@Wx;cy=KiOJ~#FY*WP!&>s@-tX+e|7_EWXmC$`)TxSciYNRG_R$Ld+zKQbS!)ngOt
zwJX2!Gv`p|)hDqWHNoc7*PK~ml$TU)9vri5%`whPu6K$GKZo`0t$yw)dQRHn*3rJA
z+H9?FZadp66GEB_U%!o;lshl2O>BL^`4W!<ETyX^8+CM>S-jw{@^y2NR;jtMru+7$
zliMfM)@JRRVjU>`;YfnK*V*tJUZ0~3x6e;8K6g1}X3@>KEjiqQy`R3Gzc%Z>(U-^9
z<|~|ddE#xLeSq=A7aFNiZ#q8uA5@S^d~&I8##wRK2muCvQ`^;|b$hErt7_c&j4w5s
z<hUJAv*!EK!!^0D_}WbFX+Au`n>RD?tluk@=P<Y8MXj%^rk2HnM|0wppV^cy+n~dL
zhGXfrh7%ok7})u{`W&2!XU%gwG}YeJ;mK5+NvzWS%a-_5K4+WZ=9l?g;+*9&i{%?V
zvPzE?Wd2}Dn=Nr#K59BkihyRb<Z*>dGG)s}58R#Qa8uSGlR?aGr^s%H=S$VhnY}pK
zC;L6f$e8f+RuAXo(~Ldg7ymPC{<rZz1IPLP9FF9tHnaIH)a}phtNBo)t+z8vS|OiZ
zY42k1bJN$|ysOoFT0yH`>R9p9NfxU&e@#BLYvZg_0%f1}I?7a~T-}>ncY)L5_3^!x
z{fG1gc)cCA<{noSc_;fZZlcZn%rLHVM|gVg?wk6iCeT;T_v>bx??*J1Od8(a@>Euy
z7?=Ji*H%w=iF?q&D?Q0J;Ty6G+F1(sTd=>3k=vVbJNnG+mftg;%=-K~YfbNhH{b28
z_No2w{3H0d`*x}Pi|M-04;(BIkz4&$v}K*Fr%m5;(J$ZM3V!%eG2Jcm?FIMR^qGro
z&r2%&miifY?RC+E<_VUv9JZh1L~Bd!y19dIIh|jaG50XDP1Q%A8%5U7_u9@@`S|I=
z`%m)>`wX-v+AA*zXjb@QyD`YDX3xfx=c|@|_vk4%bC0uFk$Pq76p;yr=kLCrb<xdt
zwcy$8Y4T5s3g;Oa-rBO|^+p56<L9j9ELPp}n{Bqy#!x9?=P|#^^${PJAM7<hAkVS(
zPk3!*@!zf071P4XDy3CqV}5<mUS}dRb!PLbDU;l%pXz>Qezwha_oGD>H+a?=U$}JY
zwuhypvaNMU&%=jFbua$BZYnIfJM+@qQy*?mPd<0~{=IEmbPeCVn<OGVW8(3sGn)hM
ze0hI7>dXE1SxGZp&I%@9dAvdPb7V-KVcM0)=T*Y5te<r5t`g6h3w>qZL=R>E+I`>5
zTu^GBVe~xPoxgRTY*bFJ)N!-o_j;r<!>e8LxKH^Sji4y+;#H+FwTIu@|4_f*z4XJg
z-K);Z_^TA&t~_`9<M*lt&HWO&HsQZr{)A7Cy_)l+R_Ltn-n~mKQ=4S|z9~H|xAn<?
zhK=8kSlB3jbUUQIz0KOY=di~7h3s4FdNOZqZ{H_$a8<?WsB0y?=7*;>d9Q7}a?*?~
zP_+8<QH@Lg88R~8)qZ2zCT8KEZ(8Y^`Op2i{oBK;%iFfz=c-`#J{9#+jJv+9tH|!6
z#$&sO?yuvGpW7s>U)o*Y^`Ajl^~b@F_DAguc6T_L&b~fRqy5k3{zdu^3}Zs3-HSZ=
zNBgzL!QiIOpKbQSI%!Iw%f2Q`suW+}>vi_~acOt2-teafE$p`H@#n}Hp3P4w;4qxn
zQ1!_-BibdB<G}Hpuwr|M!_4-rC04cz<}mj8XR&<I@MTs?e{W{1^>FgZ4{twz+!?IC
zajo=krNvJr-(Fjh?SAUR)OX^Ox5#{ZwzN;3YkORjq-67nD$UhqZw`pto_jOvbd%cD
zgUm`>`2soqYUn2~{qSyo@shho3$u$=w;u7~Iw_p+{Ezm_`)%@D4fSQG_b3W2R16Pl
zs5v0V_VnBO{s+5K6dIef^Zl<xD4f48aaL`&xZje+8-L{{R<o^Nc6deRrKMMU<}A6m
zLE*Q&^V=ZfO(!Ss4C%coyZRx2+kUYc#}A*LF1fhwkh8kcZ6EVP|DIM$ef!VATX(fr
z`#9gug-4(4y!ZKrW$^rkZ|_atlI_+X)ThLmz1XhF_~%~no-&Iyt7n*d++@y|P~B-N
z-)<AXwBp)9y)W4}-c8*Z;m5rEO6atp69ON8Zz{0(72=oi?S<D%Pb2M&&)c(D)K|#z
zX55R?etB8IcuPvkmv1X{l=4l(lT!*OU)u66^zoMB1E=P#e(PE0UcIuG|J?msZr6XC
zKk8epq<7KAqbhmDdeyC)CcScH5c0R-`epridGmUk+>do0xsN^zS*J(`q^n=s_DAx!
z@%gOe`62O}kKA<+Vl8pAJ>PW9*KN<@XBB+y54vYR?^%;qE+fS5^<}N{fr&2zIQ8la
z7%bJ-W#2Zf_UHIxvuOhFbiVF}wV&qAwOBv5PO-*6H|UkeS^;N)fA2pnd$LQWW?fwK
z9{)!XIg{Uf+ad8}d)4RLe?8Z!sLZ_|b$<8W>g8%~Dw8kFa%Jt``Tb?EtZ#0vr}>s8
z0`^=%Go0_tn#AF>LS^Fnpgj)!eif!p_k(&?PCFkr=km`JCmH**ralgsap3stz-c`8
z!QLxwIdeSuTh%p_O<skksw=C(h~4?}UO)d+d-(m2O*<dpwrt*MC5Gzi(CH0%ho128
zO`X5I=VbFF|AlK;Jk-9BexccQGW)_HrqE5E+%Np2cJs8RKAE(9`Bs+?Ob2>)+PW`g
zGm?;zDLX378N0ad?!(f9H4{%ttdl=>W?3lbF~7p-i7{K$r8`W|RIKtha<Tk%Ib5dP
zfIaG!iRGWwlAIO_W$U80y}5tl^0FlBq_%Z2J>4^THe1>jN6j+bY`s#x({{C%sgeDa
z>yb-uOC;RyyQ|@-+Z~>#)WK?TV$Fk9&*!;{Z;wb?JjpL>N%15jf63(+&fWEmcpB=!
zp2zq;NYiM$|GCu;+>M_eZF$gtI<De;qNiTN)1;$IH$=>Nym6iHyW2k3W=`E;d}7_!
zb>;Fp7R;CTrbYhXkN?=WZrU!riRCNqoVww%y=AxMH>TN6-99fK?T-GTIC*~#&!a70
zGMmmZTCz`ac(!lS5AOdAEQfxqee9j_&c>0eBHVXE8*j~z>G{8#C&tJBQ2xj1{Xmz`
z;&#+Wv6ZX*#Irlhjx71N<Wi7_WxVresfw_O&bvFS%?y8p^0WT2|H$6I$NO*h!@Wk2
zL$9dRs0g@3^w%%nTX(?xk8t=y!Hfdagq1z(Z~goJ@@RGaVf!XIjvwZ^Dskc$6E@6p
z<<@=7d-(+W_c@<`gm^9L+Iwu}?pGDl-}wKw`*HhW{bA|1;>WiOY@N2CVcC?myF836
z?;LKZZLMWp^vB}E@z(nK^d+~B7IdGzvO;CL+`F5m&PVTyZmH*RtGimT@N;9lO-;z(
zbxHru&bsY6O;h#GVa1)=eKWqU*IJh7r@7))wM5OXrP0=ra-EOg-%7fDxa!F)y_r1a
zmyeX~W_#+M!x*dHurA^1+G876y!w6S$)=;qjhk<D{keFhPS<R5p?SyLOAq{&wYB^2
ztxn&Y?)*C_%h0D&WRub)4~7T*`BfiNJ67s<#{3FxTzdMn@28*h*PmRQ`H{6J#^q00
zLbm#mU;ZumCMWevyQ4XEAI3h*40V+FVw?S0{80Q>w?&_vWzRlooafppt}^M!w{`y+
z9+e;ao9?)2dvn0d*oiKSuDR;SJl68~wwxzr@sdTUfBQw=bM^e{JAYhGe*49|8rwz3
z^}16lB7-6#w%km<!hG5E<NG81?R6?Y#6SAg)*msS_@mqZin9GptJYgd+R69N#Q%K3
z?idx%YG>xSF6-E%XHKb;eBLQf{Z$pdv&L)3hxbSBGiS+(U6EL0F2ASgS&j8!gQxMI
z-^OfQUv|~~<&)|yFRXN}tZo1NOFy~&pWdbS@7|e4zdk-Iy77~Dp<?FqU;Gc_vmPaW
zl&(MIE%PhvBln~weT<^_e+Yl`yOJySKJ??a{rUOnENeE-4*M*ZdM-RaRbu%c_v?Es
zAD#%ierTWcyr(%AHsAGGu72lZtYPb=Yu`=hsTs_De0itBw(Gi)>+;nEk2u_DZ*qL+
zTPc4eUpUq+Pt3aE45wu9B-V0st9c6_?bZ<c9z6TadVxgV4craxGFQ3n87c}>+^5~j
zUM8ctYsxnN9kSUg6S8be+?#`qV$M&z^K)Ci;Qh*jA#;ocKQVdN#lCuy9<`6*@bY*+
ziLZTk&)ZL}4PTlm6*jRT>b&=+t#?lf9$HW>mz|m)>-~1lg5!7lTaQ<LQEpu>npSXb
zZ`Q1BH4Qa_k8aP`%doLu8IzaSEoNXZRkrw{zD(r0mo=uVl=O@a=`>WAn120yR%H`k
z>`nJ|yzVNWaujSDN^kF$UmL!0Sx4~dOYTRFPd=J$IW=YDm9_sFZhn&ZJb!7e=5O;q
zp;v1pb8Bl?sGePQTw2BPa^}QsbHXEQ_jIa+Ti936nf&9r^s3u4Z@KA|^&MXwuA5_O
zIj>J%FmCGQsqZTHUXcqvZ}`kJHFHk$#J!y=bz8fOPk-Ld@@?Jh*p7!E_vlr8Ia(Za
z<lOAC&$n$?>24O8opE}e(32)l$>)7pb0$2PaqL}n`P%;so1Qc`u>W>jA||1tC;p@J
znB%v#k5xB5z0#c~f8*Gt;_VWzJ#^=KmgSzF)A#j?<1%r#H0SM-4@#C;Ik(yC-TTwG
zwdSR<e9A3fnKuRk8z=esTQdK=y5h~Pa7ND)lIM)OF4fw|88|4-(>)h5&-gIoQB6<t
zl>yCe8Qbmlekd>bqj}HKdS=^I*%NE?)$@*Ol+B+q$tw8q#!60E@rCOmeN9uUOjg>S
z*^zsux{PP}_u|Vh!xdaDEDjf$_3iJC=sOx|<S4tB<5$4O8K;dVowB%9p|&&fO<=e4
zVxM<O9LG3ys)A0mxZHeFE;luaJK_Cy>1}<E@BJp-uTd-rkgHgl*S?VBZbq^<qn?9w
zh<?~}Q^$utn}trzJv7fZU)m|0$MJ2b-H8|jRR@MgTbtcyM|JPLdFp8KKIh#{m2yp6
z-n=&#;90_VwaF-2<>}{R>`_WPwa>X}zYu;?S9f*0_3rF{iwhJQ=N^|7y`1^0iN_!*
zU>?VMqYZlw#_l&?nSA}$u58(mp1C)|UNOGNN)LQvv2OXo==jbE8IL1#a)W!SuPxnk
zn8iZ1^X<JIy>>q(Y9CK1Jh=9@^`&sGCkD#J;jCW$5sNP`m7RI%XkWQz(&LT47lbY`
zoGNLl(qR2;<J&yXL!EWb*JWR)ojnocDf3Ns_1P8GAzSb4Qf3w8ymNfr!vm}JH!C+S
z-gx}esu#CI1Pafq%VySH+>s#rq_8o<v~=NZw)g9fN>A<WykYTv-u~X?voeK>jPn(~
zKbik;Yj(`pjm)Y3Wq)4ly-Q`BIYa1d<MFyft<Or1d8tZz`q(|3WO<&2ziMg0nU4jx
zCtq6c`?U9rU8Z#Nxq7aXb7xL%;4%E8wD`i?*0?Z7ZH=GhGU{suH%oM{l$mFIS>)yu
z9^=Vd3g2bzUYWyCd_LyOvPbtiZa$WgT+NsvFyAEi7N^C5)gQG^PM$NN;@}J0Y^|Gr
zj)mH+kT|$jqs~*zsZiogmQ?x1vo_&YdJab!&!1s@P{I;=kfG?#gowhgzd|!&Q>3Rn
zW>yjW6*^<;jD!gf+a+cA|LxU&x!NLT-AU!1b$0|O-rxS%aXWu&zzuc=;RAnOoe?`P
zrE%cFudkw&ik>27;)Sxm!vbfD?RPf0Rk=iV4dbigUtx_~omOs;UEFxwIb3Pet$-CQ
z!gIKGOqi+6abMrQWd7^mk~gz8oxL~9M4L}ymVIoYESss`n!8Ztp$OBNzZFNbxf4HY
zHJqwqstQ;A=pOd((1*7NgCw6YnFhY9|8?~$%X3p<skOn&p8Zm8Y7hE%_xe`O4J?6f
zVYcrl_LQzyzP3*4aGah5!<&$)7LRtx@<)l8Prs<au}OjF@T9HBf9!49zc-*fWkU9w
zg>n%q<mY?&Ex9vWGcHzg$&T%L)(hTto!+`Hw3w&2HRjQ3&$7#`6N(Nu8NZA)|70+6
zS#X12;j9g@-BG*d8{YMEd>iv;T`G$l*O#@HrSe;DB_tQTj1*cIt!!QU;%bv_<S7x+
z;;G6D-UgU7%D<Ph4#}$7#8<KGg!!bxE-v*$CqFYEU+S#X;CHbhv+Jp}sQIil{4$q!
z<b)qLS-e)ez+>4}(H(MAo<7et`LdjU%KD|gjnm(rkT~bQQq-9BXPf`^t&TYr$BJjo
z3%k=&!cev{_l?_hr8IVn*S_~S|IORd^EjVf{njkQ=5v}2ZyqlfIVmEhE+3caXV^FI
z%NyP$!asgp=3By7m+xn9)$(QK+^TsqR#*pY(Nw%BW3ifF*tqm{=mYybGHKgb5+Acm
z<Rk=pcHTHOLEuJS(_$@mzo~T*ZC51@my3pH##B9?HDRaR{iuKi|3uap_D3-=txglS
z+TUKbKl{3%2Yc4EKZS7%3uTXR^>6W5dH&K4|5md@*}rF+Jry#XALm=Oq1BJ!#eoNM
zUk}E4npA$Bzo*vqw@Jm}x3feSS=O7{mw)<dA*=mL*7VG^i|^$3*oekm{rUGp_>sql
ztsX^9E9r8-Bfi}B=lU%r_vJEvnYTULcePZy*6xzXnd#egTYAdbulx>Q+`eY6wOu>Q
z<f1Kp-A4p;0{8vVP_}rNePEwaP0WY$hi;orkG-P2eMgD4j_|V``92y?m|ta|s5AX{
z*Ieq%_9*?sC-$ApIh8p1h<QfMOLwOP=kM-2pY4;rUg~`}JbdS_EBb0z^zNSf-926J
z{a3X`#ozjlm+~0xeO7(FYk%hM^^!4O8(d8GS_lZ~@73-P%YPZOY;EbX>~D*nbiB<!
zZkJ-C-T$q9Z6%wZ)uW~2Mk^RRZv46~vSIbCmvdjqtovx)U9xwN^S5Zvb=G38YOC)=
zXIr1iTpsg_$Hlie?4Ht<H3tOZPIJhbnQ5K>qqghc(_?E(Ctm*E-nHW4W4X3Fm(srO
zZ~5B2omY3y3F~(;3E|F5D{KW8P49f7{!V*k;yZ_R9IvY0ZF;D(clVCu1Mvo5)=fVY
zrSeN`Desr1d!9VctNPU(@^IO+pjqDTE5D>4tZ)7F>ek+k5jHoPi<?i{U0wJ)`Hsqd
zfiLlFxAM&5#5S-w&S@?-KU4fpoM~VG-)TA}Gi%iD>C92Fs-3(0&bb>8S+XK`{?UG7
z8}u(<s-ivmqv=E4(lz%^Rvq2dn*2%s!H(5kPg`$3cZ=G&`MlbNS=BWw6xJDJ&)Iob
zWRlyF73}P`udnIpitwbY>SMabw)&yrTD_}3)hr}s4PQt2b*+6>7QE*1zT?`<y*9e<
z=GnU|ZSVVse6zDx-mpp6S7vaRIKQ>RZ~Md7?|IIOlxLNB*tyA<^nYCM@k8~|#pFlc
z7Ee;E6OI>cmw5a${9Kwyy2Oro&-m7;s@ywzzssI;tE_v(=Pk1%^*q@P-8k)A6Dy3r
z6@4u4+-foTx7M?BXExj~F4)b~_auF7ZRXP0W7`Dd9bV;mPq-KGc%9qjFKcb1AL)c?
z7nZKc;uUS(B3HdLeky}3`_45QkM3*rge~7}qsnPlm;AK<wzTiXeG;$kaegRo%UQT-
z$K{fTwbd03m7C70%NzbNj<^2Ne$485mtvc2aM-SW+dG~rPI3yYYudHH%g$uykNJ=1
zCLfuu+OVr&+Dr9&9^ozW)9rf;`o*Umd92;1{rcr4Kf@{4mY)e(tE%ZXJ4=6ovl<7(
z$1kg0yERVUxw|oBf=JEtrb@Oo?g}v*AJ(^vUe4unJAUj&{S4m2`!eI=IB$op>vW5>
z(7y0^tBcAp#-v(T?VkO@c{ws|Urb-j<J};int3O=vA^nbwWLem!rgLHU&YDYmYXJB
z7JcRN))P7F*Ek7<9nf2B8Bn<{`{?tNA8sE%kXCqL-SXhvQ+@{f_I*9}<5s|~B7Mty
zZ2r!#o%cJct~_;Ub-uu3-JZ*Ff$FyXdyU*!9V9I!e}!<X`CnQd9J(`6Lcq_!`sxkU
zb7tFR>!!}wRL=6)G*d+`s^?L|wdanBH6KqH9AQ4Dz3lS)DG3am=QwPxbLMK4ALEet
zeSE>{`?tAsm3}&G?*ExN&)DC=R_uOQJ^vlmTd}8;wamUwQrEiQAe&wH`rDF^yCc`G
zUA9#6z|C(f6M6Nl!aJpp@7z(DHg#T5-Dj!Gmlu7WBe!h%B;C7Hxh60Fuv<3v{t<hz
zS9xi>KFTe5SHIiPasGn!P9Nmo@;>^{z~%n*PMqED^xe9dH8&qi{ES}lC;Oz{QxBGm
zb)0z%!v6NR-TV^W8|8gM_wB-jo?eB|lKl>1)0MXN+HDN9OI53?nJ@Wf;m66Zr<LV3
zrG^-s*mJD<Z+86A`CG(vxLl`Bz4GL7^KrI4wp%3>C0g>1OWM|L4Xaez$9~rL!JL}o
zqA@FFKG%GDR<&9Dn4Qh;>+5DNnL59$_;X=Q&gMPucTDon`l7i<b=f`F!zL^|sg-M1
z)^Hc*JviceCjDKjgvq5VX70wUn@_M+K3|)0`{nN$#g}$@+jIJHI5JP3*HB_wcl(gJ
zn^Th#|Jv+R{^rHAqf@)|7!H^Qy*wZzpuJ`Cfn94J3p#k%&D-km$K)f+8pg{rR@&@)
zU|^eB)ah$Habf|VpXb*V2W0+5taomI$okv-{d-;AaK`PP8Wz8<Jb$>aJFWcg>l1f9
zBZO^jU+HYq`WyIM!tRDlXh*VQWf1?~D%<s~Hd+pxs%Ou%HU{os2;VQa_4beYho;MR
zTOD3rQIyHkyT#jj61&Xg8~kg7de6-D&Z|gWlGkosRD5mw!k#@@RU2jdqkhfz`;q?O
zJV)fI>A!ThZC;aeQ>w|wU{0ysvQ2O7q%*FE&rA8{IHMuzmgucjwtH9JQmOVVv&;L`
z<7GT?vTrC;jOfXi^R9l~Rb%tvNYE53-c2qoG7aT&mTWuTi~SHj{Cl3atga~IVFQz&
zUd7v{*%j?*VBVo=@nxNLZ0+ad4eOV$sgrcB-O(-3eUkqK+q%;qf)7t{l6rN@a=G@T
z4u6w1Yq-j)<&~oxpPgXMekEWcrjUH&(Y^&+esC_l8|!x1-@9T)ea(u;_qKm|-&7~M
z<+E6>Zho|7#FHd<|7)|ncUYa>EBJBU%*<zAOWQ=`YFDqC#L1&%5#%Ys$CBlj{ko$@
zeqm<EqU(om)$abpkkKr^-gM)#3fJfUh7Y%I?=z6xwn)p(dXmFS&zo8L8Bfl)Pd_y4
z*+K(>O!3cbFE`!otM~eLzBPWs@?-p6+fJ4)`4Lu~t^WMnu0n~w*{|bo>K}Cf*7IX-
zX(rp(4{j|7*QEtE79IF|p_Wth*UY7vX0!C>^G@yE6?N;-Lgg;Q*1%{@r&+suZ_HX5
z?Xg?$`IGYI{SPM07ktlClx_8I=CZ}LPs8+1*>inc&;Os{p!^?e(Ovb~KhAwz$Mx{+
z8ixMErFETxjR)57^S)+}_P%{I=l1OOHaUx1?JUplJX^NR@R;t3r7!lMdnhB5UwLx>
z{GSm&g%95U;FaHcPx{K^U01&P2FG-nu|%H;Q@H<L@Z|axe>gwPKN!#bR_Oj=IqAz=
zDlR0SX%gJ?H|F!N>+zE#zi-@fhoS7N>F3aoTje&|T9qu?qT{{VP2_EY(^t!N=>Z=%
z9eTIwRg4USZT8%c{~0=hoi-+MhKA}C-WGkx{Am9-^IKb`=g$&4up}jAdkxp8^tip=
z+s<e8i3wg^J>TtK#nm@oJ{H>?;(a6NXfy5G*LCSf=2`6gFugtQ-@mVUvG<D%e}-tj
z{j2@lJHNXsy#H(Y^tgGoQqq+z6W_7aamTfPjPox2QK6TjS-$w#fz|I$J}I0fvgGQL
zvQ>tC7u`?G%h#EEuFTrJVB*7!*;6DBs4xG|ux?-BHJh;OEgqL8*2R3!;}^|;+_#<g
z-gfQdhN(#gr+zB%HQQZ%TwZnAWC{BTS>xD=OU2f8eVf$1rLQ^qdY)<Q{EUe$C(6<n
zDBr)fbEhfy3W*i*#_C*-Poy%g*c{$6L9(B9^^5t<`!_yY_)+-b!;jzgKC<R#t*}i|
zvh@yj`V^Dg{M5~=q2lCPWiM;vjn|qy?+2gw@>V%~!=~+5_g&6SN>qx7@@&kre46!l
z{*jY^l2_jU&ye-XC^p{fc0<|;<z?(kt8M->u>NOA@3p&ApIPJcQM{vOk#jePki`6#
zb0%odz5Yk=gR)=9&JT}XO}xWUv-9b0o$@jjuIJf&|1`5o{X(w<_2le1!_WEZ`z^Os
z%PvNIvu3lpe(gSs{==r9!bb)EGi1c>xGTHnIJa2cYxy|q@PpxT3bPMKor`+<ZXwHz
zC+7p_8OJ?+7~f}Rwf66{1roPkDT%h#8y*PbvQXOb>QdKL#Y;!3_w2d1{3U;z()LTG
z)!EI<ZpFUz|75#c@3Dma5#wv?YrK9qFRhq#<JB*p!paYt`k59-iWTLJKE91({LuWZ
z`9k{TBh#m^EKy|H^!^Zo)suN&{xh`IZ*jfzpF!yTmfzRsJ$Kwcw?}Z=fj*l8@oSrx
z#x6Z|A*rCRD7a@=?LYTZ+b`d)@IF#5C%bb;$j-ipx30<Lo^kDC_<G#y*4CK}q3<U-
zs_!k7{}7mKcTT?l+sTD{wza<zjCE6ba4fR_M{u3YE32v3+jN#(Rr{RA!t@|v;;Zb}
zFD*|^DtcApGbb@DAXf6l%c46q55M!zV0{_pa#lcIljn}$9L9)(yFc@%9y6S~pj2+(
z)w)~ZnZ=V{6&P8|S1nt+@~Y(D$z}Idz22*Qyu5#_wc-rsy`q~OY~A>)R%fX&XC7j;
zv^{5kY>UleHKW_@F%u&^Z@lW+C3$_?X(bQigYUGbU(LB2dg7kH1xrfWZuRa{VaJU4
z8G0D!J=^?l?W0NwjiknXueLebUG1)tI`($)sjaa#Czct1`m?9;z_07JYIBryZk|wI
z_%?3-noQ}d`+^vse>huIHE#;{{JX9GLD@|~`OaG_=d9SmVtD)vzxuC`i_yDkZrm|2
zGXAqV;0Dvd88rve`yS2P#=GCT;#gs%X0)@U_N%sAQ96yY^CTY2d|i2L{uVYZ73PKP
zYvVU;6f|bLbzGA9(w4Vh=B@}`$m*Z-SoX8$saMY?cE2ey&ipN2$j(#6cw*JDgEu!+
z=9H?hSa<8O#}gq=X7zb(tIQ^GYcfo{%uw=m*|K{*)7h(4ikXfclz7EowL!Nfg)L@<
z#Hmlk(YnjE-m*_}GrV)<!pkEJx6e5|nHafkdwQzH?i+`r)l#$=neC5QrL8!fEj3NO
z!CG#|x_PgzIT@TY>tmMtI<Z`O+GL(33`VuDl(py05uMi-XSV9`cIE3LpOv*ACmS5A
zc<np)<Mv&Bo^o5|=k9;*WbwlIoVLr&`y9&@>+d$U@m}Y>5gaGb{KM1U;QO+6cgMyF
zi<wPkPp@ZRaNwP9Ou6Oj<13Hcjh>;BV9mGV;F{-2<%|day)FASZ|V-V1F}C}$9#P@
z<-)dy{j+cF?YQ!yt~6+N)J(HYChA(8k0pLxdpq^;RCdb)#~A*+YPxMSaSoGfW|YIJ
zQ(cA^CSQK-vMib7=Bxb7H>;R8+I(!N3ir$`ZhJ88#Or%Iqa(O96@Jb=ns?jx>9RKu
zr>_t_sT=#QN@Tj;a{p9o=bnaI-~1c*I2nGgGQ8jQC}C$<DCZ8D=96nR@^3Tj^xb*z
zJdc0YvnkT)C0Y@0T5nm&E^JC~Vq?pkbeG}JwyU-rUqzd<R~Uw=%-zcv=ayx?`?Ji>
z`{$FE_b<~n_5E%Y8okyxdgp=s8J{ZH*JZVQ7JIN!{bE(x=A~E8TYso#ytle`uY4iP
zM)sZ(kvp<`AN}1Dd||uEpIzGnDs2t4S~hFX+o4jbzSp&Qg%Z!Zyoy`(bAx7;sV_*L
z^ZBTK>LTeQi!M&`baXg8uUtS&VabG5Y!*DWnj3vv3wJB<%#WJIGfjpq-ubAvZ)UQ3
z{Oqu}t#T0zMMpmQ+mx-fQ2golz)ACj<vHK<TN8w>5AFZ%9~?e$iq%ThF1cEx?1?Au
zEDd{gtabUBGkawV{Qk9@F6C2U$<=yNX2W&7E3JodyQQUQs*1JUPaXbCo95KMOI|kj
zcFwh~(7A;>{i>R;B&}bv!k}k%wC#_#5uBE3K5B-ymz!2eZ!$7#JI<`WwAf<nDl6s1
z=8GmqbAJ!rEqwXjdPR53_?aQeSFW2(Pvo@T{Q8*x)9^*R6{oCtkWeS0vcA~+yV>;S
zEgM244;wt&qy6~W9<?iPzHD$)Jn~7v@_g3U*K<9hj~buU2ol*~T_Lf4+Meh&o@=th
zx34+!^OD@&h6nsht7n$#W$k&t@L}53zjH-dzx7B*|H&#^_Mlry^yHeoaZV>rRBADp
z@~yO=Sh6Ya@vUjEUgjx(=0CfqNc)xUl^<{WJm1-!SJv)hv|#SaS^2GF+s7uWuDZ2(
zMo$vmD!#AzUD@$7x~D+%hIFcDa)t3t&t;p%PqKUtf4BH^l7-FJN1JZ?r2Gm9x*^@u
zm2Gg;!{CUV|Fzjl4E2ZFj_o;?TvmK-_6eKI{lR@xmOQOo(j}G2p>pY>Z;$5F!tL^N
z4X*UuWL9Pg@Yad$pEBpU?5blA3|mjU)7qkAmMnAShhiVUSM&t8Kf=F)Bijr-*)L7)
zR5!U)RQorRr)ax_{ZuWb37HGKzQ6RlSH@Fk8rM{PBWDJe=c84^!G1SoKE4f*%gl>$
zcR#%T+AfaAyb>12Mb9%g@h>e2>+{iYPFG&IOml*_oV)zo;EZ1ni?X9!6pO+|y&Q@P
z3?1j)p5m2|&`|kkRtWQjkGIxXO>i`6EV?)Et7@68`-8tTvt^xXn=?{FldoUfo9(h~
z`!wC#H8-pJZfAG>a9pss!pw5+T;8LH6IRWi!T36^Gdp8ia?+7=WzTj0Y>t_#aA#fR
z<=wM4o_ighpS-eJOeyteBl}Y0NBsR;?WJ$txDn^Q-FK5i*u}cnJ6^qgmE|vZQ^a*%
z#;KW{ue7J^oud)jlWgmnDpeKr)Kz)%H6fEOPbbz}Mh1p)iN@knXUusrdDfSDQSom7
z$-1XYCD&V|+`hK!<!a?^b9cH;W#9@}y3)Tst0u$qoZ;W>;OL2OESWd1+kJ2!-{hD%
z)|#IJK6$);8}i5W;mNIU{iHJ<m+{<83p^0_Y+u`l=}k+o=qX+@spz|!>YiX!_{#9g
zmEBuYim$DBR224$rR-F~hDPS(Y!9oIUqpS^@Xvj!aUkqgw58>F)3@;=HtNg%=v*qf
z9Xj#c+LApEr$1M3w3~Y1NA%(Fs;e*hBqB7Gjpi|YUy~?)cIEN&rNwt^%pY_2bN)Lq
z>sn(@WZoa=m1?uv3r-#Ey=?I90Q1N7y4fyG*RvWW0z}LD4(+a&_&e>;Y1d1+ju~HG
zNY}KapP9OA`<HcQu9JRlo2ou<u2Htj&U=k#FTP3n+qrz^25vEhaQ|gL%4GFUzn$Lw
zbn^G|s$a8ie0bmbxQT7|&NChsj$hVgAFtEVi#o@|R%G!vW3H>0S#;;kUo!E%UtO*(
ztC(tYBK#S<{HZ;!vS;qGU!{LD`Z;sKukd^s>!tV4c^oT@+1|0Hr>bFUxZ#ci3gPS@
z?aYfSe2<5eMybCQS8q32n7BGR=B~(@i5&4+?~k$h7TnYOaeiHm%O~A;cXQVyJ%~O$
z@tJ(M?Q8ZUVoBBIx0V-uGQR&ZW|C!_PrAhFg)N5<em-QDzG(H8mC|NqO##0x)bH?V
zExFLtt~~4f#(g<Oe*BVaRVP?z-(Ht}acA?cw3G$M%qH*``qU`Iq-TCveVxPX!3I;`
zDf>_NE|JQ69D97R@w#L3nvYi6B~F~OK}9D0)-uaTw#Nrdwg=99e7AA0eUzlfY;Ohc
zNes{SrhDhS*s$-DInPw(h3geAr`Q$A6jdCpTH7<b#Nf#De620&$(Bk_PUI;Rc>Hv$
zDqU~;@p0~!R^#o@PkOx(4^|Se-f+&f@_x^Il^r`B?w1I;s%d2hv!*325%x)Y&NkaU
zs@!bDLq*qPStS!TeYz2!wQ8^C(cM)6*5bY=Us&|ZvTAumGsyAhef225yf&)wX7tn8
zH?_8zg2{<u(itt2g!~ilT)pjE`sCiWYY!L?nl`)&o;}mx@DIk5%a^S#d}1PKKAG|N
zsl6}XNYB;Td@$v-?vvT?W)>+q&Yd6C_%&JMaDw{|gC4nm%dcFw6+N!-;6H=a>~jYt
zfA4KrqPpzZ->na)l`(v}YZ!jRIe*KYn7PYWDV!8Nwf1zA*|eWK7~OnJ#MF+vy6n6v
z5*uTFXTy1hUpxOz$?@$yt99ww8}@DOCz}i6x7^vsekI($(60I6VVU6jc8gc=Y;OE?
zRN@QskJV?k%8SOo7T36RvLjjfRHKE*ffo#GI^R8;R92~?^QOpGd(-wi-!%3qWM15@
zrS;R{$%<FLj^;<ZtA%{b3U}Jxp7n`!>QqnmNtqW8t6pBob!6U;MQ2~!h?JXH|FJu8
zf|bKD(Y(frKiYHVACKDmJJ)!}`55_2(_KEOtz7Ff@o>(QZH7my`w#cutoj~YGCkmS
zra(e;y`}8O@RL_(?mVXNQn7A!>Y5*IsZFZ0ijGUf%z3tV^~3jX);_WqnL6#&wP+7F
z^U764*{}3DYD_+?KNKsL>-GB0MrW?P%ykB9Dqk7LnSSj4c1}?B*z^a7zm?Q1z9YQ5
zeAmT_<4NKsU-$MMy8hsLlbysK^{5@&ckD|!b(@WK*BAAzrRGvCMlTQDI;nX1?UJ8U
zbHi6nyfE+UNB?#k*UHruO}Wv*J0`t)`cq$9Y<;l3@VXX3S7ndYLJuS4wDOfIO>IA#
z=rUb8{WkpiiG3@3cK*rc5B|~nFjvxHb7cBt#iGKWf3=^z7yA>qb4R+zlJgQ_>c7Ix
z#depjj?tLpR9-y!b>RDL@md?d-25^B;qRH!HNnnTSbo;!{R!FCeq=uTok$a>dm)T&
zA41YUe0{dBs_)LZ`fiC=ys@*c=~`XcE&8%?$M@ASCu288nkQd;_G9+a?wiRQw#<@N
zoUqoMr=CmtQS2<8q)TE(3lCebt3R<`&U}8({2bo5^P}!vvN5k*VUzheSACw<^Lu?^
zUw2r$CtuqC&~DbtGPi{u=R)1@om{J{_BiOu=_Ot+J;u{ca-TImT+eTJR^YSJtpjZ8
zHjQyB7u>jc>+mMk-teq{AHJRq>gu|4_VnzO#2@tsw+pY1xih!HfOYnydpp)^{as<F
zEzMvjUr~D`=uYe8pn3B9MQRuSnzw9k{iFFuX2&yBn0=3$_RwV`PxOJ#f7_f7t@yX~
z<MaldJe$zRA^Wa8smyz?cP+a8d)mt{l1IHZYZ*KZPk;0NkMQ<~KK4BI>9I=A{L`yf
zZ`?Dr<Dm9M_NQlSon!J3%}}~r!@S_88`ILga|#=5r-UcO@GV=n^yl2OFLtcZmaNmg
za;*DdZPcHQ{+n-|)JVM1s#3SL{lm2jFYohjQK_Hgwk2}O`S0_esed+Y{O$Fl<%K<y
zO<^^gT!hI<37&5+<3+OV<@TvnY<IZyX3OiTmvvnCcu8IJzsGumLB6+g#!ZXMUbpA&
zs5rJ}*0Zhs`@i<fRMa27`0k2nwRgP3rv~2&^&|IhpFdE?wbv?d#^l%Ae`+0K{d-IB
zRrceXe`Hr=303Y>yuMDQvnWbaRps3p>D=@K`^2(4Z+lOVx?=u$La6)t$8o%?-rS1o
zj^Fc5^TI;$ve|zG-`1)9UGjB*$7ac=TYc@$etvpTKKNzKzSWPzd@U#Hw%&PjfVFPH
zuYaYFf4x8Y*YDRyw%H30Co&64Ee{L6Ab)DtU+Ku{K9|<z>Ce)5-=yeTKbx!i$|^5w
z*;A|L@9JD|?JKX-uebRZl^sO4?>Myl!ZrTm@wX(m%(dd@|B-z}?Vm<q-A$f7nl;J&
zhxZnKx6|8sef`$8X7`?Xo_^%C>du3Yjp2J-f1CCOdvB?(&eZ*CuV1q){q_X+kHR4f
zCGC~#%4N6Pcpuuuw)SK9ajEq7FE=E=%7#60WXb;SEw{8kfnDWy_~kf@zil<VAI@3i
z*7!c|O%J{Djo*%!?Vywff8nH}8#ZZsjz4(Tz4{OHkBzzO@7d^zZe4onsEUuoQDsGr
z!aLXEd;eLzlGC`p=&I_TnQ8*7iheNk?T?wa^|DsqtS3!sQzg8=Z=HYQ{g?ck@(<O!
z)GIDOW?Q)2r~YZ{yJ?NnZFhZLAM&H|<8J2*CY?2miAMJ_?IgBu-?X*=G`CEb__Nx5
zOFqX-`#;{jdTq!Zot{1pWp;*HCqCA9KE1j%e4oYdkX1rq=kFbOY<k)<bk)w(?O%7^
zSl+s1&dT@Cf64M6)%Et6_w`-L?~FB1ioA7{ndjYj8CSJy&Ke1A(Z|f}lYRT{Reul7
z(L7fvx^;O4bHr6;Bgf6m*ZaQi5xu%}=cCXg=Yn!`f-is3^$rhuvrhMucy)>Bi+KV+
z+@;lTE!!cqX#JVyrN!Uwab0_}PUuu^pw4&M+ny)v+V-w~V1Cf}qjKaGliBOV<09`k
z%@DfPxV=y&{bkJ8DUZubCW<V2<$c%hS$$W$--qw*Z`Zz2ZuV*w&*>|kZnyK-)%z{+
zqSJ0iZ`*$*Ptn)jH}=pAnFsUptA1%8w&%3b{h+7qZJYPn=cDf1H$rRgp6^iNmGPd_
z$)NsJfjM6APsYc#?#KCE`;_*6xVm-g^7bQ5*RJX={`7caaI->u@tklyu1QC)OtpS{
z<=Q^Ib$plV3s-;4KYsS(`A7ejKWg)x;I;8~)G`Af!w;O_)lF|^7IkN5Ocm!?xrOy@
z*JpjU%0i#m4Jm=2o|LTncBpWRfkJZc;%oaZ8GOrhl{c5_TXW~>ZmZosr=@BR=oviF
zk3Y6OSLXN@r3ri4thk<*{JyZ%u~6dmwq4%VYZ?x-Z1~xcXBen@?RiXE$+QlinJRO>
zN<Mxa<x#W4t?F^luQ1uQ4=PS1x5YdEd3FAFc^)g5#xX`q-k43{)`>x{o$gHf(>;Z!
z@U!6S8=+yrZ469B(H1W<#1+I?lI;xwDt=v<F8Th(q{7CoXOo{+%`GU864lSy^P_=T
z;lbpXzu)GmN^ptG2+z45l)}Nu(onTh{?w|N=!tqq6YlUX;i(gS9&$hU!m=+LkDp$A
z?3~9z`^(p6ZDW_7VkmjsZ|n7Cvv}H{vX>bh->P|eW{gOX;oECFo(8=;J6DTMblSAW
z?;1vO57sknOWgE1IVgnn<>Z5Fxoyo^#L5ml_&hQC+pVfC)n?iWPsH9H_d0u4_gpLc
zg{OU;Q!H+YeBQm{kJi#-Q-0{23T-d2Soiu(_J&-C+wON|LWD9GUbhT$s=Sr08CuP<
zQl;|Atw@$eDY1WI_7_4UbtUxPHnV?S_w2QwzriEJ27`#=$q`b$D|;sJpR$^D$$0n1
zB?*^yTdsU~=cq&c^l2;w_Q!U<zR{M#=)kVJZJqY2-9?L=w=zCSo*eUT>7Mt;8Fx>-
zaNR|6t9km$GqJ1G_*t48Pd@*!D%GRxL9R{8x3$toQ#&T@?tGBk7^&p6Tt?21!&3C}
z>L|Guxg&E}wLIj09MgR9^ol{?R(IWbZ3}YG+2x586y96juPV-1^=(!7E8mb=X-}Wc
zGux?k`bWC@r49NfOLG_Z9`6Y+tjyti!gtC%g`r4W>C?$66Sr3_x7Yu=cA?pKJFTTA
zg+-aCjtHJ$=biX6`1Y|?%@Qp0IA6Ku_~u<Qw@g~h`{~i5K2dkAfMiSdz42Qv7xSlG
z*`nOW#D8jc<8#p>4QXZV2~`h1XgTawWZ)5f-uLtC@?&qGE<X{y-ODRH%vIxdk?SGZ
z)%`Pml`ODY$go}VT&>p3J8QQ_%&U67RLJ}DMi!&*$9<C4X|GDLR1VBL^*H19``t}i
zYtMe}nU>_9b1nXs#D@c$C$O{kXQ@q2WUlwK3hPu|$me%^TJK{Y&-BL|&J|_8E{ZUo
z&b@ts?Q4ZQt;J26`?DB~wq5gK;|_UTnk-i~bJ=wj-e-;{e}-;6ztwG>YFb%RMCrj*
z`UVrH&dH1UvnQQxsi)IMOU4SBvK3R;c&)f~<x)paYwRi8T~a$G6kQJUo<FrDf$Mym
z;{lmDPadsVvg*FEkekC#*TS>g-U~0&`#n4C?R1x8F(2FhRj$_6;NP<0T#>ez_2g&0
zYhoVsRfuN3vwU3Uo|Cpiy{`JU^FFbR%ifdR-Y(>LJlWr<vN6OWxPNxxldfagz315P
zIaMA!C~80F$e;TL@z*wQ&U#*wo-4Rj_Lh>HW!cxS-&a1^7n1Y1tm63ky-912iL&3d
z?W>U6^5eZz&AKw?CjR{o15f<QDbcK)o%XX`a8={=0-LUR_r9!DF;G~q@;QQA@A;E=
zEJf~2%cAE_Vqnj^x?cBadEq~^>%DD_1+Nv|Q*Lm5s$4%WKUL%Sq|?{uZGBNMuyxsv
zz0t1LO1(ulUVmM0y<4&K9b4U!>g!h$GJji@*ZTLKd0m}#En1mBEZ#`TaJTZ(q{w>-
z5;G=PC12XM{#fzVV|UV*X-~f*x_HK}dDXMNOj|xxmUDf~8LxTTLK&y*C6%^3nh~oY
zvzqVU*0^_Uw;U|bKX-QC8Kima!II~<<`+s#VQOH08zN(6ZzJzjWBf*4ef?T#zQdAH
zX3F+a1&7zm2!=@+TAWZ`8k}mljX%)4sNE>{(TuE6#mn;+EmCMcFY<=NOXKb=&0gNP
zMN8{48xp#TpKRZ%&8%~K-L;tHd0P|P7>~zaxav{l?zO|nEqeJ<6;I)f2UUs#@}4&a
zowKl+QzabOVAf}ERhM+9KzW%}&^u;Jd&j_a%wOO7740}5<!~a^QfY?YMX&!1RWrZ0
zngrblj%Ay6_{|FrS*uyk8_(vwRFN)V{JHn#9hKPfJN`CuTAP<Ws^*)Tcp&`woDjb9
zWOj?Q-j|(iB|{gpZ1XGj<#PUFsx2e`I>=FezSgp`X$s6=O)kv*%6|B)ZO$I<CC59(
zOX?ECzOSwBZrR3jB-P_x@%*Kh^%qT6dsp0$*Scr1t<RFnIOf^zf^XmcOiC%<uKXjr
z%Xix?o43(ByC3m}dB1L2J+0S*wg1bS&@F<;KAr4OIKDP^>XF3na}4dKY?~!|Zr$ro
z`#4U>_J%0@Q+CzPt6bmPackp-Td|uPZ-fh%N-#X`ne}>~!ttj+W<{q=ub<G>F3X%e
z>uG9}d(4L;Wuliw-jp3r>WI14HaAiA%g5tFo2}=rvh`oEB4KOp0Rcx_i}g$E)A?K0
zm;YxF)&1gdRQk=<&gqu<@2{;AS6b`m68|IgL))iI=dRt;nEBOuS?q)2)_?DRT)#Vy
z>xcZ3KZ+l$v!t3<?4RhJ!oRC<M?>xEMSthjv8Z)s{%7En+bcfRq+yGu(Sucw`_Ju&
zzZL#y$vxGp$``kM`_JIq8fnbQp!uTSYUiy<yY767nd_TU;eJH&?Vij>l6v#bS(eRh
z@??upzqV=#)1~_-n^d}t8iW?`JifQ)c)IA8yi><@4Bp&%erv<l+5Z`goO$=G{me7T
zooPq1*w?gIRuX4-Jxbo0lAg2Dw&HB5ob-oX9}A1j7CdB@tJms3{L3;;@29GtLB*fF
zuJIqmw#)Trlx@i5`XIhyxz)sl(#=NuRDQJSnqAY5kXh35Heu`I&DM8!zhl|>vpekG
z&ee9yOFnzN^EP+Bm@PTII7MjnoT;Kuyq0e%PfWWc^`GHI*}cRE1_x~W*A`hF{q<hE
zdENo3s~`C`h=y@E8`?0=V=bD#BxUk^gU>xz9m`Gnj&dr0mTk1uoyWN@{D>IarPl@W
z+GVo6rK`7}yK|FyYwD{_OHX;Uq$@YSjJ<NZ+iJnvm8TsIdmdlfs<7*h+1K}TuGw@y
z-6_|$yvgt8v)xs)Y?r;(PQ3D+X_1bf@%44Cj?d;D$zxupRk0($lXc%zm$hu7Mg@*?
zZ7p}IKHvDORkWw{iQJW5J{8?b{9E-E@>lY1QR6<actT~=m(`ZrDk?pnOGqByTF{@l
zPh<*Hl%0{)qumlS>mSN1HdrJ!zsP*$ZM<~uVjpv#aNbAk`ZaD<T(9$%%UdQ-oM(J%
z$6P08-6w1ODvxD~Gi?<K;LEskf#JZ?B}<nvH#J^)d?RGh!;hP67T8VYdnfVL?#pUz
z#-q|*hmQyur!@cjxO~D2jxzO|S!y$HuNJb^GCp}$Uom1so`Knd1MlDa_PI}->TYwT
zaN)!T`OeiIVIsHoR&O=fr0?=NrDZkSe3|Xv>!$iHGcrue+4y8q)s@tf?++{ql5X<1
z)ryq*YVy{ybxG<08?KZ9+cO8lrzKxnp2D3j#df${^k$9a#kEVXOo~3RTBzp8#sf!9
zS~4owAM9KI=;vYQbY&O2&u=Z{p6!jPG5XNnC}eWAG(&w4Ltc}O!14>Tp6^qrsh;j}
z;kL(z-?~knQ_~tIcqKPvAB>LPwRdOcl9{u@Y<8+VYgfD0RJiZ?4LSLb*IV~kZQP<U
z`Bb!SPXgEO)&H)D&6C}nwy8BJcv4aVhuqXpoY(H%Vp{b^dgalid#{B24s15ekNLLd
zR?*$2E{`wsJO4Ate0|?BJ*akfz`Trd!Ka%O9o`sdpMUFoUgNRoyv{w3SDJ2Lb~~q3
zhl9Oq%Otsuw<bmtZlzl&ub0g%<&6qh8aPAU=Xp<v8Os}v<z-gMTO*r2W_>DiSTgN(
z*M;7^wCG6RQoVwh$;T?!eRlb9v(MmsL*blXVb@#j<aarLTlx5qhJ?y>&)Rg>xtkxX
z&@y1t*roRU#&czlw*r<it9mBS^Zd3>JMOCL)%-m>iZ`o2U0W~o>R<BD%*JyD%U1uW
zJ9JG`>e<WdyeH!JT=^X1#hX>SpT9<KS3~b|P67Y9drp1JmAmeBNjI=)e#XhW^Dpg@
z%9nFpJ}u&oQpx%4OH=RGc<q?lV9tJu-SQl-ySdX(y{&c|rH;<5=}|Ig$a{G_eramf
zJf)^Pn~z$mawxDpD7>~WWXF%y#nNfk?W*qIR~zMbSxr5(!`STd+#4@4wf9O)(aHOh
z`O)T{!N(Y>s&lDZHvWCAp`JN$|ADak2Y)DU`zYJ9yVCRV31yq~$#KaGCfB^To^Z)}
zy5)Mm4}qWb!aRPYq$;yZDs7yyGo@!$nSJU%p+Bx&&kt`CJn^*a7~7w(66;;(ANy8t
zWZiLv4-7W5et17P->>rTbi>ct1&g2ZUI^dp`Y2Oxiu<!kvnvvhWnbzJ3eR}7yKlNx
z{w?*Rf<Kl&c-~)f+hcalEYkx#?%~|?_P5qZKj4>j`^S4}U0g`uH;bzcmProBO~0jF
zm>ceYWzDk5HQ`~KZcp%Y&UZ5IKek`n#{7}=Uae!FU1s(aznnff^2Fkv)*{wQ$w_-n
zF5US0>E#N~d4C`A%N^98vFi8c&v~|WTc7>f-zoI=NyUfO*&j`h$7XHvH#2{G;>5E}
z=~w1imj65$%4Wcp{Ve9TU7P7-TY2v}ch79Tb7z(4`8YQ1c^|j;&wC!2v39wdsH4R5
zwT0W`6n7OUdxn|X)@Ca`*Yhm$Jg;t>_2|jfnR=VN@7nr55L>k2$ESzyY&P`^)V{r}
z@MV3}kBuKQ-`^~VOzue(jPK!p8LxKhm3UO{g`HccE|_VduKrA}ZL5FR)4gHY?MBuz
zGGA5|PB*=FJWO2N&#-XbbJsOLHhmAvk&Ia(lb3gI>QuSrW%o0pT0X~k%PkiS-_~c7
zoA}3Z^N+BcT~l&)@NVH-P-^m9Gsv~z?Dw6F^~bjTDBXGSyyV{4b7{}go1C|NKgJ((
zd2Lj7+pUZ5^7fRQZe3eZcQ?i}-+acCyb{~qpw0WFN;=-mI4J9yb0uZVmCsM+o6gjk
zc;}Y;GwH~Ue;>3w{;)RI{E_&#k~;TUr)pJL!WY-reEd8A_QUAi6?Z*vgkGsRwAbtJ
zKH1x6CS}c1UHU}#B%_n4?FQGvl|j>YTQBQX_REggz4-ZF)AxUhYnfiAuFt#iHsT>`
z|I_%?e`n-3&p(>av1ixb<85zmNw?jXnDtS)sMddLRrs5YkLI&w-uh$ZH+jj+TlMp#
zf=vR|XKvwpQ~5gH&-2l0i>03eLzY#fFfhh^wVk^5!k3ppt6e|47k}RWkBj>uzr+u7
z#}D_GufKoOI{W&hXy5cCz7vANTC;!8e;zLuso)gqcICvOzN_E)|A@SQEH?j9Zup`3
z{5g`Tv%RKn^>tXta_nf?BKacA^=)sT1()|3+&%DD`^BeU28&&bwBzH0pKQD|W%WtV
zJFoxP7F|2>dWVo-QLXmU%UcWkj0~(MA2dA_9V5}mkRW)aY;{!H#@3i=I{bk*!k6my
zd1Nkp9Tv6fX~e{a8Bfwbu6<qWa%9Er13Bpo1-9C!b4nF;RxuYD9yGla`Pz3w?{Vek
zSw~~;n$3K%A&bjA_k@no5gDeePjPDsH-47Z{vJ46X@{?QD6eGL&-z<$vg51|e)@Cs
zgy`&8-<M}zCG4xXGwCjS-A>btnAHnnCiq7j&w8%3H*byG<LkGUN1wmPGkHt%iC2X&
zQ<cwbwSMV8<%P|+{F&`{A1BSbchzW@!Tp`hg7+tXT@#@%AhfD*`#S0UOZ{_e_-BYt
zw|wDWzqWE~+4p|8DYLFhZ#ZT%Np#oeudB6%_4x1GFtvQpw&Ff0z~ndMNnhn!j&<zs
z4n1xD92fKGeYM<L%R861HOfB=VYiRExV`sk1@k1o=#AgkOxZ0FyP)~yJgrOd|2_sr
zFgdE({AY-IlDj>vv^eIHmUDaH?S6+W&SOT0nUyb#a^GiBVd9o+DDGNWTsKiOy{Ki5
z(D6?zw{DZ3`X!}2;#10Gp51Mi*sGqupRr5ipTL5vzfa0J94<DvCDD8LwN&*a;~fwF
zGjOv1ymr!7FQ}Hs*PrKMU6OzC>zHRtnMI1u)WvzOTlO?!pZl4+`;YBh>pOMo^nA<b
z^S0jQuTM64bIv<Jb$i0p^9rSFj`dD3`o;5HCT-jM0F%WG#~6;U%eD*UKGY-kJA0MJ
z+g|Uiu!vJnXBXQ2eRXy3zR%y?<=U6;RY>aKa1y^iA?xm<w}zj$$`loT+Wt6v-BZ6s
zo86;M2y;nT+8@bkJtU^nuJYJ=W3<qLa>4K6>#|zUxGqlmY4Ni8(sGwCc6m`VHbqM^
zsBZHA&{wf)W!@?76xn-oT{Af5i1M8iwlT9*>R5B-wA_u^Je<ll{VUe$Oulk-tzOrK
zLzna!QsigbT)Cg7({WSo@zPAkgye9ACzH=zY|tuPzGhv~>f=Gt8KUC;NvUi-lDbaq
zKm8v6seEiY-E^mmpK(KhwbZM1I-+$6YdqQC$?+z}I)%tg;#Z%1w&d8!jG~j##cb&s
zZf`WsS-kC9TU_Aq)32Im-c{3^9;Y|6S;|Kp-?=kIB|-SMt#-w-Tj?xMbGhv*Boueb
zJh#oro|^Mm_2ZQ=&%MXq@aX#_t##LCKWKU4T;c6YyJB)zPQ9&vyuhVGtHADss7cTo
z*BKx7`UZD)XdNzas;ZLOGVS(_)J>HSzML&SsrKgh>I)ZIPdB_PSlnRT(;sy~XzJ9$
zxie4L?FrRjeq0!OJT>q_SW7@kL2=`R@L8W%?anB@e08#0*|s8P(HB+0hc+Hmsgrp&
zJ8$-cl)RHKyJkyoaB7h?;E#F|RQBEP>mrw2X_d+#(cSgE-rUU>cQ7wAF!o7d+3s?C
zf}_plX-X4UhFQFkp4I8OHSf4f%C+X3_w(NI7oMxvstIR3#k+)mZ}WvZ(TIQVmp!N|
zyfmM$Xzh*-GIK6xy;NT4tGaNhAWzS6otr0^H?CAI=J9#vz_c=X@`bC82JB7Fa(g~T
z)@fgvcIotqFy;!ouUEaMTL-#@uGT6jN@sm!{dCX%U30JeIlS_HOwD&Cvm}XsrK?w4
zDo&|6Al#<5(|V?7T}1k|eaj5J%-oNh{Oo!1owv!u&eywl*lHU+WZC_@`j^zyC44v7
zS>60iHYR7Dd@?WFTX12sPCm<j2F*uHqA&PefATwQ>(yCrbhl6b8E$OTWO-jkpjPv%
z)RoP}JVg@@)+N8Zw^^-awfuC3&=+|Jf8RLqS1Y|WO-63ZcI{+M)r=i)gROo(E|<Ty
zY~G0m4_m8`A&nY$q`2<z1zehb&%oW({&dM40hMEhp-*}i9(*jq&^F60^T?%i6A`UX
znI0#XHFjyW_;NnKw)U9EgGr8}es+eJ);7<0708p*Q_J{$MW=e-;k_QG7+?42gzyy3
zktusNx%@(yjGvX@{3@rzEP|JpnsS_ENoz~|&v0$giIm*)7E467O!+0&aP3}~dGrKJ
z%Qemi*7gcN@0@(EyDM6%sCV_JiDyHn8lK;twY7*PLn3{hVb`j+TdIU_b<Z@~uUu~X
zQ*`Tt*Zgnw1z%n;V3m5vs8S+%HhEM3-jk-c{%CBD?iab$6v4t4#9mYKH)F?=Eq3j@
zcDiPI+}>`(d?jgTZ|S~^25t!+KQ|p;n(6sn;_c79w^y2;Qwh$NnzbP3n1yxa*&;Xd
zGMj&Cb5GBc`*8U6^b^7QlDP{K=KTJv{c?SKJmb_qmh~&+>)su@bSrvh%5kn$OFPal
zV-5N{f1mK_b@5Th6sHRr+%fE39q;+?nt%3($=_T*-o3h5V(Dc6Xi;0~n&k<{ANW>n
zT(;2f8Ta?8LH1&$-Vay3ntna8oAaH@L{Ixe5s$wd4GAqcz&H0}*qb%yC(9KSET|Jr
zPFmd4!&Epyd&W1toC^6v)9o~`tu;BFF>{^XlZYgS(liUv-|`=XzvXY=y5-WnU)NMN
zUwXT^yXB|K1pb)~zpfvx|KQ8ty6v9bkC*ATZ``7F)o#9@A^2&UjD~&Z`m6gTvp&AG
z3fVR-W1|bZwZ+{x+RJ!VDyKequCIKu&Z^?eOR3PKtvyY*cyd+Uj2Mow)_AYG!&qDp
zF~|6wq@~UEJ%3WJF58)~;>`)ZM;u>Y$J=KMY`NaA#JJ_F^4?_AGw)7B%RF0N^X6Vu
zp8CSLsqsFSub4fGN`F#v-gJNZ!<p;fT~3Q~v#{=~FkQXs<;999la7hc4HZK^IlhhX
zJvQlCYO(Ib^Ktj|dId8@DxV}2pR+ZLD_-|%a@@J|$`9m3*|T1ME&A@MnZ~azRQ|ZZ
z)^6+Ztgw@OpWgQ*JSktVw769E-r>C85|fWb6cyfP-@mu`*Sb{)rnK87JxQ$M+P&(P
zQsrEQb5>$6WBxqfpyT=Vb<D*#-}H2KC1+bt)E1tWWK|Vbdh7zHMe?uys>{19gP24m
zp6<<_b$u(xnuV#(?Y6#U2d!tjT4n_8zbbauPr`g}Ld>h4pMuZjmaV)Kv-k9*<9&w~
zsf)fi#+g@kOlHxfh)I<uPjlq`t8!&mM~j`6u5<{n`kQr2=;R60$;`Ql%~9VDpOdYW
zU9pkn1&77CTCGRNBABoIns;T|w}UeZCs|60F1VP>b;^z7pve1${IyPp6qRh!d3Oj-
zeH-N~*zS;Vzbv%fZ%?SN<dnD^i<rK@#?e;y4ll9kVtbZXP!;5|x%<jGrUOsr$a_7F
z+;rsGHq-72CmX81u8B!s%XaZb@QDRHfv&8rB66%E41um95lmAnO;}Gno4kIjiJH$Q
z))>a~Rax6lxhDrcpQWj=QR(aP`j{&#4yMXltoq%nQDl6UDeKwndqR(IcWv3Hu%ppt
z$DMVq32n-I^*&Y2(~NqUl=)s|M_GFAaa&(IO_zkKtHE8dPs*3^iaptx>CNQuE6A1a
z8Q1-}juK(Eg~6N-GV>UhZ&<r<ab^xv+kq43Mc1c1U_D*<GUoWLNPnJ+mAT8+t(O$p
zGA<NME8k}PEO47^jNI23by8PKav5v>dVP~jkvDL)%|6n5MDR%Dt-#~l`(>_$p1pOd
z%GltAciO_`7s_J&7n|<y-4(^wcFkc0JM-ScTgQ*qzh$_cYN5Q~(Vp5A-tW`xwkjGn
zcrXZiPj~Q?-T2XU=j=0;MTYbCW^S%nW+_|dB_OxMwsv)kv1syvFUt?zej;fZx78z8
z*7V=5v<Z4{_Z=fYXGL$XIa2mIvfo~IKUdl(_q@ubd5@yR>#q2@72M5~dOFQWu<vnb
zP>@^kk1G>>KMNFOHeYyeqp<YLj}LASuWzk#Z&&?vuF~4=apN4WPv==<CT4wXQ)z!7
zd~2`#;mv{;ffLr5&AWQkblq}Q*Og!S51vig6upA=itGZ$=2^eO9n)sn-?Io+?kPQ6
zll@_PkYJ3_JMFo9wB<bPrhfU)(6T2+=w@1HxzXG;(i3by#!gXRx}@Ng?wcyN_RPX>
zKMw7TIQ;ifRe#l=6F;sl@_xwQFE3#7cDKN*+=7MzF3-<gf0ZxqiMw!j{-#~ZR&!3=
zX;G;PKQ@1BdTZ<Zqy2Bs-d?<KQ?Fdoj(abU)$Le$wCLRI&YLZH#-8)-@7y`v=XQwC
zc;419x1SPo*lfPMj<vbPvR#N{?Ul2NcJroAd}M2t&%Jfht7)HZZ2jX_9c+_YbK~H_
zl=Fe}zJAW<*VH~L_jtbc)tSQDZbu$B8J`VTXGzK9F!FpL^?Yl-tb5im>k^|44>p&q
zvktuezEr(f<&5C|MnBe)po4zi_bv*&Dzo<WKDupNk(I`8mz~E1p70;rqVw#x@64GE
z0pSJl&T;W+o;%`<&sG`LJ@)6?aqiUD#J1(EDaBs-MN_OUOPWnN)%LJAragvvN8p^K
zo%4d6drzM)o){J|=?43~*@rGqdr`R7;*ZYj#aC`6e%e^}{%wG#{jA&OMf~fl&Rl*M
zXU?2|s=jO4p7!MFZU@erPALfJzOXYX<=UDTTX@w2udWl*)w>t{dhxV~g-`c$?W`<(
zBq6(2FE>ANp4rL1i0HC<t)m~#cf7aJugzW+<#F+3uGR?->#ADq7dQViWYoXy)w}h|
zQm%68e}+hr3~uvn9uLB6c~<jwUh+HhxlnSNGH*I-$tnBI`;SQM5r5RS|N7gsjofSp
zORYqlIL|qnzWL7}x<AiX{ji<v&g~zro{@Uqk>2yS&$@n=bn)Mx(ziE!T|Z|}_M^Mu
z$F>C>EVl{!aBjBi7S4Ib2cGSj9`xbuvF?U%{X7yUtT`lB94&Zb@F_H8z4(P!hd;{Z
zxYSPeG`zm+*ur(MX7z1ceb;XB>Q_RN>+(`9)9YW@u3EKO^@IY$@{L~?hODsmns%<9
zE3Lj}6+_x;uUksexp!xMlAZSMiOl1@NjKv~rt~~X-}r2++Tnu}s`?6JPE2%pA}6ih
zH)C<pgL0{|rJuDXA7A-8R&D-Dx!H~B&oAwHcI<UB^PK9h>$=W;Z9K@@XZ3AG!OpdB
z%CBud<`VXlQT=7t-3?bdT{%vzs=RZ2d)0$CUs>H4QiP2B17}^|yd$W4$CHUC*c$^L
z-pPu3QEm`#Z4h+o!2I)<)_321(t9*|gY3SkC!+6blpbbUAW*S3JM%>7ZH1qGj>ihL
z`wFY)7EC>R;+aOFbmJV87C!&AS<$i2T$QCAEtC5X?L4vM7V}Qt9kq|@mu9$@bUl98
zW}))<ljzYfn^$MPXq=zAtmI<s&q;=NCl!?QKU)2=WTWS&mFEMBe}(H!U+SSzwtMm<
z%axP9ZdjO_bjqkw()8KYwrTFm{kAO+mRk_yqVUe*_uS%e<$XzBZRaYi>m6fSiYJK9
z+~>Dsd({5S66RD-<*k)pHSf8XWG!E1rM9<RQboJZz&4BXU1)f5@$21lW}TZ9pmxrj
zf${FV#g`Umo?3CtwsOtd)5Y%Eo1#xQEibsm`Nm)QWu#Ed<{j2;#wS;*@05$4W_j?0
z`n<iXwVsuR9Aqd8c~By^wP5$16(^NE*EMOUtm?fZP#tFb=fwmAi#vDT+I$YY8?Uum
zC*|=zf6K2&6JCj*wVrXLOQI-Zo}c!GrR>F0Q+1QHzsJ5=z5OZka_0XG>m%RnOX)G5
zR3&(A;f}qL5fl5T_bzzSwf@^BuHsL^Q?*~mzM6Y!qkY7-WwR_ieob0XSMRkyS0Tb7
zaf+<?rHw&Bn*=-#7ti<FEAnuIXI{m#m4|K%>jX`{@@1!DYMMIx{Pm`OuWoqDb051u
zTPA6Xqg`^&T?xy;^I28yduQaHn!tG8=el%mmQ&`O@841q-m}i0c-A|AIiuRs`^STO
zCeM$$W%hG=-qn+~tDdf%=6U|qVHv^00k^m_Q__wvYqi_G*WL1LM6UTs>kS6}mTQ-^
z@Ge)F^Lg^6dDq@bS&IanKgd<YYLqH1v-Rk-E62|6nbY;$R9lVlTaUgC|HpNYzJJdW
z4PkP3DxP2UY^#Xg8naK8j~A{E$_}2CnZ59N`Nzr>CU%<-73;FT34JnFeCTiUb=~36
zhKAc70n3}W&pNnk3r|6PnZNU`y;fPLo=*(SE6$XRpHXByDSB)4_KCNx4=Uf^>-X)9
zbasQ|BGxpW9yfM{XS?RkJo9B^9>?~NO<iuq^BB)&-Z=7U*UF!b|Fo9p%Q?EM{OUWj
zU1z~9QIY1p8M4}w!aA?YdK*OAWEFYV)RksgOjDH>=W(z&#_KP&XsU$tl|M^nMNUnf
zl9w=FpQUfvp69+hE%QnpkLt2VCGuV1RQXWYped%W&)qX|4ujR-jL#w;)^6?3DGpM*
z@rl{Yligy?-dRCbk5#ixG`6K5R4`6fXbe2H({Y+kOA))o>c+Cwt4beys=8`fv}8r8
z%Ga1=(b=tArDk<<8@k0g%_%vTCAvGnBcST}t1RxB8;)nlJeX&(%F|M>fbCL!+x8ye
zFY32VzL<)|2t8<x`C{AuWu5hrThr%OHWf4o7+9!ndzTk>@8)eCPZ=i5^~Tq}mQRY5
zozd@?eeF<SVD7v$v&~aNJoHobpBb4|9@Cz&_eAoEJG>bOE4((Iw0!$Aa{D{k@AXz+
z1s`pi_n)E8*K1O1g7L}MT`N@@!~3#!osm5G#Ne^yGNW%R>y);ohFN#4i@mW~?40N7
z??vMFUduw}T{$-QM7>Z}M&3Pf7U9NQi#4~)wap6eY4n`FbH(&S2?rYvuG(Jqo1s)*
z^Mz~Z6Rw@<B@5n6e-?b;d=_i^PTz>d>3d_0mL6ddU};{sJm%%v-j5qn^4zp0=XGvy
zWNUn9KB02alsT6@k6KUBkO}nm^k8>0%DR%0doF8J-@UC$0(|_*_a+;stT`foX;A^k
zIqOTi6FwAsMB5hr2;fNizHGbf&!x5&%Vx2uiUj&>u+>gJ{6=)ii9gvgU)JXHZxGt%
zYT|w4&W`?~6q#?UgpQSO-)^fN`;b%OnB_aImKB~S)lIe=X}+;ZX0~mu3O{&Y+vP0r
zJR?ySFaMayxAuIpI4yXi>iVJzF~{sBI|9VdOkP*15OUhZ)xYIS{dSvok<*`YMXVHk
zQP1#C=1#@_$Q}vl({r0^7PGo#p9l(@I7#5C`3ARyN@mkv=D(%?Xte*9I`vO?kx6O)
zdiA|=Qi4U#(x--Qm3A+FvA?;Vb#0C4B4?ehMeaR$7SBaLvi}iX{7CCwg|z#JfAijL
zyB;-5XLkIPdL7|Q`<?%({y22|&^(!4u5*=VIJt2iWL{clQGd|E#x-?y#r}i8V&`0%
z=CO3oEVap1ZR%X^*LJ0<TYUC@QX0HesyMLU_x$v=4^l&|on?ysr6Uha)A@W%>xscT
z=6U@2Q8RNk9bhU?+xcs5{>ER9{~1_jU7U6IPw5J+RW7-T?R7?{yoGzNU%M~(wNNg(
zw}JaplU4YM_z%APqH5g>D?a;9atYSmBks_*V5OG(<ypU&kJ@Q;y-QCC`hA=^|8=au
zmCstMBR<=A=s!EG^2zY?<}Gpu!e`y6@OmD$`?gHZs=Ly8q1o3{FQ<QGz0z>B#lECZ
zbDsG}y@?;DyZ4GLnYHHiHtxc<33E#GvqDuRR-fq3UThH?blCq#{c@G<9V&Cy2^lz~
zTl@=sRCR89>8e*oad&c!EiHooFkf1F{f}$?BU?Z3(=TsDO3a^noWq(iB0QX1=;Y^=
z5}VI)s!@I6IZL<RIN5ZJd-tNAbje41E+3UTKEL9$bgoZ=f~Dlz`9j$TTrN2Mo-M&F
zlYISkOxA6aPn#!HK3Ccia@V)p@As5vN^TZ4DbJUi^rwVuKJ(!1%iEt<ujg{<Ik({P
zmvz~(S3mR!xkh|GUG+Pxi{ql(oAV#l*2`!elwhc|c%gl^RQvh9xt&QNa>ij_&nCWK
zmKtWwxMu3hxTP9Jt2bY2u?%QPo5QBTEW$kN<;E3^UB<2wOByO{{%ZUCO_|1gZ&UHD
zwUOrnucYtg6}ou$<;92W4pn_tA)jym*?D`OW!_bP*IlPp=Cya-%LsG4vg&bHtxnp-
z^UgEgeQ#i7SLnKaZP}+UPHqN%-suyMrrkY|J6~%L^PG_F>%Ld99?9BqNX+tWm($ZL
zpKo{eToS&$)otb8m7I@u%eUO}ZQK2Lt+D@=q|CMHMe9}-&g0dz)}FnzR`9s|^tGa2
z<U8xrt)o|}On2R#9Td~r^mq#M>$t=<f0RG!^+oKP_t}kKpZ$#C>xe^J)Hj<<)jV8M
zSW><^Tq^hMYSC%pz3l;~+&{0dS$?c+{;BOgrygr&mI+=-ntiEZ$CA&Ut|B}^8A}%L
zRpipJ2@0B*`GV0^Rj*=+xbR+flk!Ck8$MJh?=@d>Jj<$osceO828%`6_tg^^h0=SN
z&xVGuzYg*?;NI$Q`|{2-)ieJ}X8sereQBZkEQvX@a+%e8rm|1=o!Tz(WyQfSZyhZc
z7i`$Ea`DfACuJ+9Jo$X(^4yILoJSQ+^c-Z1z5E=GtFLwOGj<ZPJa2N$@2BH+<y$j%
z%ktS~w)s4s<$Lc6$Ndl27UbrO8n-6j-&-}Uv#RZt?2?V=mwSEGcxrfJosoyFYn6ZN
z*VJ7ex9cQ$1n0RHhxJ~Z^0=h>ebf7Sr~cgvI?Q!PrZDdD;);z*Er}mIZ6+V)`>}r7
z7k@#Q**u%qWZ6bAXfKcNz9;tKk5lwrPxYyMHXY~uU&fW&JT4U}_~dn4-a}rha;HI?
z-KpwpuGbGo&+jYpU374T+T2H>+b8*|>am|Jw(9BVv^D25ejRU}HGdml|ME4Ri(Xvz
za5!ZBFkG%h>cJn!-_aGvBd13DdYEL2Zg)4`spewaVcVPSC%WWvp-Hb*=Sp4v)pqRv
z&h2_t(e&v1u?;al@;xtJeSUrY`^l%<F0nklB7E35nfZ0R*1s$B<@D+^<a@sFQ`y@7
zW}fT@*UMYHbrPIY<xkD2+J4VIYWAb~Z^J(pKbCKMTVwv1U*`U+SvDN|QYW>xsw*#?
zvO+FV{%!cQMNM;7$RvxtQklHVJ@;1htHf7(?ilm6T$Q?bHAH2`G1m0Z>0%KZg02@f
zzK*@N*kJocp0nE<479s1F8rLonB_6M>Gns}>$NN{$UMI{QRup(bEj~VVX(u(8x6%>
z&lRt5@$TEp`8KL-`&<V5AnQxQZnqc=tQw;XUDUUy<nN!;94Yp>lOyr?+H6-vAyz*}
zS;tkK=Fx^7`?U{hJxN}ded(XrADNHm_U5fmU3{kG<;jvAy__)&ennOVyp>Nb{AV~F
zB9Z#`_N(kK=l^lO{vGni<Z=xwd$Wyqxmf!nvHDG$V;dA^`jrVBUsfD-dHoxe<;jx;
zU9b0RmDw>|vD3<olV!W_d3pcVtr{tZ?|9g`rrOQ@75<X_P(FW+$&d5Dbt}3<Kk8Uj
zUR`+c`L5|F4xP@L7pU;|6-Q#cRgKEuY3!~48M1h5ZGxAn9&diOe^Sb>R^|iAm3;T-
zFL=;X9QXWpb&cu8`t<zPTk|{quxF|+u4rTZ@b^gJw!}8eN~3gJ4;Dr@Wl<ZSOV4gR
zTiD*pdS>yy?|1&}*}(i}L(RJbE3NmsXSKfLdKI|L?$hV4?V>BTHHL4}yEFM^%-5xt
zW3zX%TUfi>YKbjhP-b6s<NNWYMa4WZhLYzBve)*!Ykq2Z!t%hnGVdfg$2ku-`A4<o
zvaa4KBP@G_e@frZbxp_KIyIcBTOHxm>eW+oXkE13Nq+xBYZXsBui3Iog4NIS#L?`V
zcZ>xXgO+?fZ+g<PbSneH<a=A!JP%{^xY^gfRb6h0X5@|63-_FipDpn^svwqiqQTj%
zyBe&*HF@tzG&k}4XYFTw(OdSM<x};u4F#spt+S)AOwO8oJg0B!(r+(rsorwh?mW*=
zyKVcGnzj2aZaF?$CiNloVf!-Pf-6hz9naC$Rw*-l#cKZG&yobuw_(axCpxfB^>|QX
zxlVTLenY|S&2M<+Z~bS`PIPA}VcPN3?d6@<%cG7jI$F0pF)heyQ{UCfQenZ=^L_=(
zXMN6&jcqI5J^8|%f1*qFDF~jpH2rf#Ps+!x&&%D8ul3uMX)XKy+k{&cDVmL2K2Lld
z5c9f2V(L$ab63^X<-Q)P&zoepXa4j#a(7>CxpnWs+8v^S&GUAw5tYvRYE`@IMQOOy
z##`ski6mQB|22&KUe&3!WTV0-j|bO{&DMoBDaw4jyf$cl*o3E!Ja>!d@6uZ6<ag%D
z)M{&~@4uRpC%2t9J$pB+f10IF$?=-2*?T>j$}R5H@+O`yi`liBp{nimwY^>;^Eww#
zTc&a``_0C33(1%BzPzq<>GE@UzVhGHrq3HJf<*W{UeCI)ZRU&*<?9Ui3}gRvX*~LM
z^yWpC*IJAl3a`jLTI*UMuF^Z>IZF!H@vUjMKU<zFytKYkc9Yed?_X9-5pu0guikt^
z=)q=9$y@x(1H&dZ7d=Syusp|FY?#Hfg7eNPzY9nH9NLommG}IoCkr0yRLw7pF<x}u
zYi`Dk7YS2-&fd1z_&)>3W9D01loBP?EiIlTTYNV?fBW7}`x=JjE8m7I>~uJ|Azbo(
z&#be7*Ul%WMz1yxa@3m6wdO$G++L?QN46bqa<n&h%95^bwfQ;Q|6^$8yEDtbS1|4p
zm$?-3wM=;RvZcB18vJJ@rvB42`yH-Xaa-wR?ishchqva(`uMy$o_F+3eb=US7mO@|
z_b^$+aJ_7`mMLB_JLl<prLZY;=FhA+Uw>%hdfj7}L^*>e`R9BWy?p0z+reY((*E&>
zHZ9+taD(}o%KX_&%QVyq&VETZv~kY25j<xlwf^bf3k%XE?^va6Tc7*qQNgMsaywp!
z99=)-KZDVy<#S{bu6s3}JoC=puP524;PBVAr%gEiGZ@&L@3UAXR`&K;k)_S!m7<&T
znv74UOrF?yj5pn?yxgScl6sLKqk~n6ZD#77<7aA;8@&09-}-kJtE8_pKL6wD{>^y@
zf*5|^RPH)@IlH(t=&5K&o^<2miN_fKGrSI2_@AL-X3jzxjhC~+8@t=@aWnQ+{ncD#
z(%ti+E~fg~=Be6Q;oFk-{oQ21>TrznMQzsBBd>(h{Mi-e@nuDRPwfb}VUaWM-c`4^
zQ)C1p9{<?iHYc-^^Qz|QX9kK9$;)jymN^Pr=bViD@nvObsOW~nSDJ%e^LlP~=T2Dn
zMsDi*O`Ftj&DixaBH`xTGdG#%WuG=Zoy>b=<<<U}@P$7X2YbAK`*yol>q*t!vmV<x
zt@zZ*oKmWoy{ac9@L=3>n>B?m4Lg7TD$3gXdYZzM2j4_ZAFq4l@G>NQdQp!IPnm3X
zb;ME8C$)F___8(|o-6M89OOH3Lh<pfp~>5O<}iDRC%$j;<Ft6|8*<`5L-vI$sePCG
z`0KK~i}&vO{NC4azml57gFeP(Px6>$LcSMFWtjZ-Xy{XqN7Ej(n^c~&T+yL@CFG;|
z_Z=&5DZF51tQLrh+ajdrfBKHprJdWGzR7;v5dJD#Eu&_W^_6RzYI>G#^tI+)w_??c
zz*D~h9e+RHD-yF|iOCkZ3`WPV&*oVw?^wn-KP!}ZUcDD*N{fKoJI9wkx(95Mn*0oX
z)n_qqKAZ4msq(#^w8qBQp04bT4u`gyupK>J+{5#1Q{&mJA2t6OmL)SxlXx~!KY6WS
zlE~|(s;ilgxqd!o-Wrn`nsmGO$UOF?0dpo_pX6(-dSj)f;HUjdtN7a&ne9s9aaxdi
zXR*wa>vPwo?{2e`E@p7}b$z+Z{@pGLZ(X@W%GPL^O=}ZXUAg<=g-uxo;!ob4Gn_Z|
z*X7@;H|}pgU~<(YnE%_9GtZ36oE9b+ET{^9vbC$WEh1*_q)A3g9x%q&{yVW>WbGcy
z2d^t^;%%<&lj@xnu`cx6nxa0B1Fw%-T$v)it4Abw`ktbB3V#>viGB2XZLr(k%L?-Y
z%-6GAJgv!Q)XtK&kL$<fN1Gq>_xw70AdtswN#t><Ijvll2Y)@=_w9=5`qpdvEUwrD
z^DVWxc($^*<bu)LQxiN)f3D|!mGw{MYW{Uqy>(A#a+fmBnfNO_c<aQyrn=E)Q;Ihv
z_OB56%BL1!wDP+8UQeN^%yXKrTz<Ru&+AEk#_uvSf<5I^>JFLv)da4&z3TB>DeE@o
z#SD+<X}`|@;U4$Qr}toFWlV|br{#ZykGRYiG}Tx-)r(i`!JG5`Go-%12Q8R8Hv3zz
z_TkwnJNzd_FO}D+l<hB$+SR4;d6lkry}&=Um+?GnrEVRP_$pg@nOm%2!+(Y?Uq3zD
zx#nK>t|`0P78YE;zG+(e+&-u0Kf*7Bz76tJ+c7P3d3N_oqq8P0laBnJ_4uo<`^iKR
z-@Tvb?a}!9eZA6}J9BTmn|HWW`o-GEpH*_#EY@1ILpJ@0@ST%d3S7H8PHn$;HYeL$
zx_lDLW`hUcL{Dw%ka)*9TT=VB?dx;1a&K~~*K$3&ewIhIM&YDRyUo?=otI3lJzTlm
z?me6K?T?F*c=H^+`l#c(r_M5&mcU`dJSS;o=E7CsnpxYQpGxq%a;(5#ZO`!|w_fg<
zxu~aMadX$@kL?}br*(;2z9@|GOrBS1`XXS-+q25Mrdn%n%;Y$$D|$D1g(k;YT@i-v
zYttGGU8Ng>7bmUZ-|v+xc~Hc_Dp%^q>L+s^FA%*IeMfRa%5#f9wX4s3`T1w3;hgZo
z#j(>vnc3$(YhBngacyb(w-x^HKDpPw49T5PY3y`g??L$TtQQZG6jUD1yV_rymptF_
z&w@|IcdA3}6<t29-ci#%Gx_D#j`hKR=i1m7uKMwcdy4$dt)0(`Z%Z7l{I)&!+3R2}
zK8fa8zjl8M_>kiLP}e^)q1?AXcj4o<P|3WyttUI@Z(erux~ryd%<J1ef^IW|+}u3g
zhAB5La!<J3zCdp4wU~?}=j=k6Wp~w;27dYRh?Pm`ajUFr&71Yw@}7Pk54Y;`XYQKx
zX4auwk8L(iWHdc_|Bw2IqZd!T%w@DZ*?Yo%YSo-?EUbrELoE(|`MM_icB-dDQA=6y
zoL`}bwp_hb&9WkR+FCi|m47%d>eWSOpYBe7zk^Nm@N0Xfuimj|Q!d_9kZCA5^1O%Z
zm)fHnZbt-cPrMKO+wt!WtJaNk?_;igI2zKo_C?`oX5ang&QD~c4_PhiHSBwLEW`h|
zM`2`c&WnP>>=x^{%sU&}Inm}$<B?U;Kd;Fx{P3T_@#^>Pxk>{5XD+#!8Crf7ec>!A
zw$<Wk<NTZHC(cU7%qdy+XkX7YJEj-kbCn}veKT(Up2T~~;?L`|e|$f52VPYE>@wjr
zds^7@PwRGswfeWtDP9^h|46^pG3yI%g<;D!O;S%uwVv|e(V`655TWHC*ZKr2Et(V1
zd{)iSXQ6dh;4DLTFV-Ek8SLy`nhTzrF#P>p6>u)H^XsyC8B4@OKKY6SUTfsKBjtG9
z;;dTb(zpJO-N%eHWu8xVPs(`kb<qO_wz(7MTrTcnP;0mo>|ndA`eNVR7cY-Wb3IzI
zT5S4uvDtg3YecVHb@QyOChNM$U3>OS>^g0{@yp%Ny1lhoPr?-^sLXl%ZcfQc*T$LK
zk861>_-<i8mFv*no_~wii!NMtyXjs@!`pcOs4W|!oaJ6l^_G7aAJzZXE=|mEli|h8
zjb{Gbk}=zpug}^y<M+<vqE0swe=+xaU28Hpec<HxRZ){So_}r0(`?hHtrNCx7t=Y0
zW45cc_p(jAap%Jx*Y(Vg6~fwfCR`6<veI>axb@S+X-;Jg7N%MEgCplo-4Je5?3tDJ
z-ST9~Pl0(BUynMrxAv=q$DEc~(7WHs`YPv^jd~Tgcta;lnICL)J*c$sbDi2QTe}Z-
z25t<mW1b$H@$HRQlfz5z%z|%EQa7;g^|<BpMdN8$i(cWxf3A);fnL3m*6xn4BX`9u
z>Xm9&m>+d@LjKQo>wfiX6Qw0?O+R8U>YgpvwNK^hbZ>XQZS^_zItDKsKxcBy?~$|p
zG5w(~`{6kAkD~9^Km2PHZ|=W&!pA)yBu_luIM4Xf9{(d{sVUx54ro=bzwn>o#_0ob
z3_qTJaE`c;zO74M;8x7>l3$Zo>TNrHy7BLwlJ9GtP5LCW{`A66=a2exy!a>hBXsHO
zz^n^%iv#vmxJ?lFx$#i*v#Ea>a~NO8Nk06cGVkMD%ly4ve}n%n`_GWt&v5cXt!YH5
z_uSyvE6HN_WV<A`O;cuh_n#q!=lY5HEdLo&=2kzFTUjkPHR-Z<`tG;6c0m@0o=oz1
zQ#R|8u9Nkh=fU}&+Qz38x6iu5I?-#ILxCHg)}AoC#NzGDE7q+(Zl~=pUa{h?<Fe?C
zZPUKJOlF&(<ry0BY3XS>Z$p;J?<2pJ{b$&fbb!g<Z_Bmo>9Oi{%WbYnM^FBoerZOo
z5vSz&OS?LC9N5d*Wn^k!ozE6pQ*rF^B;&BDGmGA&yDVjk_`a57&b#ybqp}VNubSu1
zyw+1jGOxJx<*Z95=LnTe%+)h6@MGVeH6#8_5kCu`Z?Nk@l~P;ddozA2KZ^-^s(mXX
zcG91>Je(&a|7gy?b-d5r>)gam$5|fku)E60>c?<G{)o1^=*~4M-%PKErZI@J@KvrB
z%(9$d=D%_cqvqY#^ET5&p3FUdb`pbya%r*Gta7Wxfs2>+2Xo!zaj=v;>oIG`?cM_q
z9-E$5y}?=;zpLtscZpNqyglJMD~^7#S{S*OZ_aC;2m#O79X6Nhvx*Gv$e-G|WX?2Y
zOSPrmliauk7#}Nb4zVn8TebDOmDrVT)|@8x_^7VzM;||antVR$sCmPJW0m&3?kaCL
z@I0TlHE_|iw%`@_p5E?0X7l0xTe+)2-iwu!8){u0&i71kRKB->FIu+vb!=g~^USl0
z?i5S%`+Vb#npPRgWpG%+=34A3v6y<n7ur!LW&5}u=&zT#y5oh@WYgTkdKXVTo{;Tj
zaYK~LYff?B*V#F-qEipenYZ)VmbIR4VFzu#zc{p^@Osddn>WwyE!!BoaC2Y9%CNT!
zYdSf6nA}&c3Xbh<5#mr*XuPyy?d^P4KaQ`fOV;JAy75YPeO+k55}D^bRn^z_ggd#0
z-Q8WN(0C<WmgRNJY32)$w_n<}<*$S0lXmA5%nM9sFIvBG)0*FNqfRYQRGr#yAvaa#
zh`GvJg^!bOZBp7DX|C;Y=DuJ1rOx*!14O3e7rJjUDGlvhrdxEoJUQc*QH5z(#<%TG
z?JK@0P1z_Te)70#yD9IP`C6-XSR`;9H(j-SVe_h>9d~!UJ%0E28LO(W+Djr_M^EQT
z9C(xM=Xz(8*?)!^a;!lWhfhR54^>Dm_dm3?*VeDx`dvzQ?nAo(BR{?hlkPOhlY&pa
zKmWS+#2e>1Dm8kJkC*R_YC57IA>CaNE%9hqh~RX~M%mf@Q$1Pa3=E^TO`O5@X70g#
z@4vTcyV=?Ze|oTLn}M}(*rUrH659LO=k)FOiaTSw$T;lGRF+h>qQYBCZU`6f+^w2d
z81*@7^G>eT4%y=V%X^KYV^=F42=fo_n(jMo>5Zc)tefoRi{FPX;htI6SDp7&ZtBWX
zfv3|mgRk`M`#Qa7>BKhCcE*CtYQ1gZRvIyWehdi`&+G0TTj8mH$}UEJZPc!UfK`o+
zrv;B++N?T5?~~uN0}OIaD+4b(#Rg?8;W#21Bt2*1<y%X565S`P$nBm}XBs5kqN3<z
z!O(nZRmHroxh2|@mOKr4IDN%=QNGFkA@R27wLa!|wLaTgsgURV_57zb)2{bkN-oQm
z4wSFmamQbMUACR{GB=x$rOCEmO`j)x5`KOC-pcJN%(u5%S(>ZcRR6lHCVA_~gA2Zs
zq<*}pns+rQ<0SiaQ^SOqbV*rF)tXP@d*xbnxpbJ)`;5J1S}bys<~(V-aX{sYx<cu*
z*~uF>ORc?PYbo2B<}J~!<;cD@>XP1(pw{GrrumT@GCpd=Pu=;bsjSS<Y--}Ux~+>d
z#b>q1d#wmK!RE%XGB*Nrg)Osmp|H}#dDfw>xyzSk$1$o@G9=5cR^24kG;J}b&ao*x
zL3~@bTugKo3B1C(K<?&I^@p?UWiBv1@6yz;;mSYZlq|BS(W_E&Nn@w0NMK@XW`<AL
z7r`%UZtY$Cv0}NTQd8>2YiB$IPdwi7N^8obR`#a{l})oeeHt`hMwa^@e9SDvl=-5k
zd!JN8T=vBL_^Et<s;;ld+_=~y<(7qv)aU;U%u!9(#dFwwcxHX+wdh#;m|@Q3Ni!e6
zj`?cSSGnw7^Hvp&l?rz4YpdTMwEq04pCvXU=-f*Ed8awjRG0!9kJkKNnU+6=VTQz$
z57|q8WIx(zV_j;jJt-{W3HKa1{+!UD>3fsK(}lf{PKf)Vd?-$5`;|jS>+{o9DiRM*
zvv$^hko`QL%PmN_e|De6%lN#yo8NE6?fq@>@}6>MV5#=(9XWrF%Iuo6nfc4nn&gE}
zVmFP-p09WxYZT~z*L-Oy>)D;V=N#GdVE(lwn^j^qTJZSG&D9iOmNR=$!hLV95XTfl
z>2vQGOxD<z*){x~`u<(6O?<WK+QY6ovr;y0406=+IR8oXb<~rWOAmNYJDuA3a$+3!
z2j(NX5C0bZdvNgEv}#FZkL?Le9#5_p)>qqYF3Qu7owAMZLS5)L(W7z8wKv^)ykh+-
z`PHw3vgDE-XI$Q(zT(@OgISj>84LLA>f^I&CLI^4etxL&)UU^v7Eb#ygZae$^yWEg
zc4c3V7QUK#lS_?neb%M>R*NTW)YM^Ds53owKdbt*JLgGu){RlKo_8$UUAC?HuiOnL
z3C7RD@3QAjKHVu@U>O%~dQyE|bCkdtA(ne@=a|*yeLYmM|43a-kVaimfmP|+dg1I$
znWDr~E1u8$`c!J&qF+;Qd)?tXwClr{om<murRp=9BBL@T?>y}f_F2^Rb(=L)m&URN
zjYVD3Oh<QV26>z{^WggOY<{NEF&WFZhq|WSSyxxY@a1gUmz1oTE`Rn`EVf*|-J9E^
zY)5|8nh#TD-5>f|zY9Im`{6-f_Nohd*E~anKc^&jJ!!mEu~t{_@u?Zb{m!9DQMOUH
z3ZFdfIQTkp*4*ne`gj`4zDS%j4Z9v-6tVHd<E|6)-t1{t=`+aKduHlIrx)vQ@ytBj
z2%5|5`J?s0{g0A7=O4qRmC>nYt4obFUaQPERR1jc;rqe;?Z$t?e$0RPpMmGLVE68+
znI~UuSbpaDC(&QkD_^cyckM&dhGUB?+KRV^B-AzS`4fEU%<BbjwYO9*JvMod%=5nE
zYtub5+(Z~8=5g3uudGc;u3-@0#`t8`f!!Mp{NDNg@~n@`ZdJ+MQQPh=UZ1~nhMB-T
zgS)TiT+zKU!R^A~W%vEP-h9=LWKK>H{PKL|x}skyjE}<{Z!@ng)~^m-_`+?uk!7c1
zzO^!onV-cHf!aUQSPY~izOD`rOwNqSV`(kgv;N1GJcm#o&cgl~p`X>>1&4<#8hi;l
z*kP|P!h3RWWP$bM<91iG%vcvo7r0Bl^tvd1?k6+rIYyhbm0q_y*By)bXspjs+&uZ(
zp8pJwv{d)acv|&fPWAN_s=K`<4p_W$lwjNOzGGL=od^SsK#7#(<$KF7Y&XhycqD#W
zxLx+;lAZba(Px5+?pKtr`*it`nbXBtk5o%<Pbj>!{g3s-h}^fXhg)x0K1r5;98stL
zkt?d*BYruvOkup^qANdrQ_iU$wThdW=RQ%;?S1pnqJ9S6<Nm=>Qmrp{PV9T+R{eF=
z$0MnhEBBran<aYb;?m!Xm#@|TmU19H&o$>})RQlId(XyAP42RJ!c$=T@`mR(OY<!i
z$IrA>UvV?Oz;%Dmu1H1+mQaqzzW<hd6PZ8ZO3$O^jb0)Xe}t{N<yO_VHBVc@t7o07
z7+>;y!R<@+r`*5$CwuL-%eqSr+^FZezUkuIz{XF(6361YInR84x_RO+O^fG^e!qE+
zJU*TC?Zo;ZZr(LI6P@MwRi;X=d6@L8_t4zk9k#933eVE#d1vZq@4V3XD$A7XY*Ter
zc;aJi#?*{vd9woFqOyxm50}YidGBlOFgZ5Ucmn%gvuxo!s~)NA?N3|gpEsRetL7<r
zJ|}Ia=C;6doL`qcnYU%_YYz<*r{^Mh$_tk)n&n{YU;Llp_41VmPdr*IDO0}uQ{m+o
znH-bfZ?ODz<>cFwYzqR|W3F6$r^0wp_OsU$)0N9JKTVu?eZ|@c1EteEzZxUU*2t`v
zd>hqs$hyem0CP`)uc6Gb&1%0lS#vE~T+I5_HuJlYWO|z2R=xT1v&*_~n|fSMDaqvA
zbcsVYvN&d!&&Q1iO>f2CQQcB_%<-6&;L+r}nVJPW6J><YY3h1J<%Mj%I?JGZPS@=%
zdm;lppHyErw4Ji;jWe@v(=!i=qQaLRI`dY%=@C4`!64W-b$0m@)|l4sFFlvNdeFPZ
z;XKQ=_cJD`Jw5I>^K4Mc%{fmu{dA4sk$U;%^wddAJyzeptoeP~rZqK2_^t2ewARl%
z8eev?oc^_U-S2W1CXNFN;p_h$t~0We{;_vyWNhr6!^`8&Y};<=tQe?NdQkRQb@;S1
zhaTPFy^&L5`>MU6bft~*<8JAv78UBA)9n^+%2E~8*rHzib#0wSjoruiW4iYK^A0`s
zZ+6{nRlCGIxL?<B+BB!Vofb?x=C|C^{qs-j`j*r2qIZ9kyIs#u+ctB}6}Cxtb{=5)
zq9V8Td7S!(cQfu;U#f{@TbjAjef^<d{gauSuI&y<+3<Gq#Hjn5+dFe@YCp>Au3K+2
zJ1pJoVTImfi<57RW4;Q9Jxy0#YBjwo;^*scn?H#4e|Y?@?fM@3ho`+eOuRL6uiacO
z`MK}@JcsJ0?4}J3rYrQgHmC^R+xP6p!H2%;kJmM?%{C8vUHB-T_bzw*#z>3%#d+<|
zau4q_?q6CHn_QW``pzrih+DQxSL~RW*yL%xYk>vB_O&IN#ct2TWVhRe1$`2|@~|SV
zE^B3J7N?^7!UJnB=WxdSX<;b7HdBYmf$xyVJFUwvO3v>*y>+wZIm7eZeN%M;9$WX_
z`?}nAwN88QO__<87K@$gDc4lsTeRJMwq|xoD$fJ)+Y^u58v0FSagpiikJ_ieJMp^m
z+VDv?zALlK`&>%Pb}dUeFIId<c+OR)-EKzpOS63?6a2)PSFQ>==JX)B@yholxsoP<
zNx_!vwkwxz;xn9hZB1ofmr>zSm;DvbWxgJG9hjCgOZguAZ<heSJ8usgmwj2jB&ALA
zn3YtxLxEd4-}Ai*S7%-nFD-C7wfMrX^5vZdvo}tv4isu-w~^Z-!Z@{3;q!d2w%*AX
ziai@Y^)b9XtM=%4nY#^NM#ur{!oE2n6K_AC!+4(|XoHbyOi}T~3rTCDZf*H-;N`ug
zU1AeIZeK6SwEc~aXh6Bdm-kUe4yAhg8tn7>Ch>gdT8k}b_A!fVpZIm{*!(4HdiUqc
zIvlUM*6hKzn1Rja3D>f|yu9P)vXd7ayX2q4H?=bNmQ7yn5}w~lyPTJt7IYGr6h3#a
z)|y{_7tT2K?qz1Gv|XjLe&eG3f!EW5p1hS%p6_+K^7dJqp5#kgpNDBY-DFhQd~2g#
zV6x5Jn_t#P28DgLyc%BQvis919&?*_ug_-QzW=r-VIE&Wtu}*&L)Gd6MpKKa9So&1
zPl78-eu=H#y7KaWhAc5lp4|;BjDKrim0sz7ulPNo_WtXbRelGAD)cXWU1{@1cyc>S
z0>77X>#j2CBbmiZedFKpOtOA!Ge0YHhYshRX7$A~=GX6SRNnEq;EkE#gXX_lUsrJ5
zx8ty3m33JCYiq~1?<Oow<%b%i7pU*`l*yAcw@9eaV9)BZ2+28U!LBer>SCARvzDa7
zD|13?<BrAM4mvxB=iHp;K8JIBwXf5(eFT=Q%-bW=IIHi_`6oI~Q)T%qkCuo{d!%~n
zz?2-B?NMI6-`Jy02OE}L+%jpu(RTLy_~bBQ|AhSp_T`pw4Zp(nPug*-GWT$%ZEJ*B
z%*Fuo;*-l3rs!uDbH1Gy$(W;gKJ3e??bBvh#+CE!b<3`c_FZ+hN8s+c;`fo?4Yc0g
z@=jOj`*KxRPd|6%={V<>f3E}_-$!g#d-Ai$$ZV4P>sY@9^ED1IOInDYi&^P2$+P(S
z)0a_h^Ak@k?W_A{v+-xyiU*UbeueqG2xpno$H=sOebVWvw|5$zvr5~fCo*YyTII3g
zzuKuzr%p<0^%qS$rZ8u!%GWjdV$FK9mDaJn+xfcd?%|(v9(+9YD~!KeTI_Yt!sm19
zrk?LydfIpMvME>JRDAuq%d&7@+s0=tdLGAEWA^XVEqX9V=8MR|&+9A>{?$Hw-=$1<
ztM=jvj0YI__I<TfO0lp^zBl8e%;!n`5-Seprb^h9NG@b{31V8`!(^M;dd$F`dExR?
z&ccmfS8cY85vW{sK|CqVS>Zv+i!4ro702tIO-$2nvYNN&%BzFNs^)u5n!RnQiM6!t
z(b8L{Z>-i%nYOup&FxmZsi#jfYuvFE*;ekKY%#HjSMgoUt}WHt?Y##jZ2hZRFDJ4T
zajgA$)%3KX)kmWq;Y%A%7#eE}PrPw4Z^=TX$xjcbzYNtA&la+(zVg}Nq(Yr(;JN7a
zqMlRQo|^=)X)M^VsQI`_0HbG5aI2~=gT|8cUcu)@6u6?iH104>=(%*!wL$A!ALpJJ
znNX?SOP;@VW>zU%;GevBLZiU*_v!P!PVLD_m#wwBHsy?y;03NzH?Er(x~=j|WA5_b
zIrGjByBqGyZZB#7n=GDW9bPQ-<cZ8eyBP=8+*LYcu`qVO)+!#Jgyz2NIF?%{$_*u+
z2;SRyXX+P=nCpgd|IAq3oEP)4I|pV=kTms>5-Q%!E`Q?6c5U6OC;ANg%GOz$zLw|Q
zCmj1aJaN*o$mc~;8joX&|33S+dMUeF+A9s^roT&SoU7#z^K(`dl}=2W_VeBK!pBcz
z_g~wy-210uKNmybwY}TFJ-YCp;i2S5_okA{rNZ~RJ@e9U6s?GCV5kdyZ05zZB7UZu
z0e{rXZOda)ekK?D>FzE%<MDb{z=H)b#a~uirOnh^TFSbH>(g27)`+Xcld8G4K8okb
zvJ<{icfOu|vYMZ`;^rTHUoLO>HFx@<`IBC~oU-EYJ)^_@YpV=qzI&3|P_&%&PR(M|
z=l3~vC%wwvIyG`?fHnW|uJ@(7VHPQ$6hqx)nZC+LJy`c>X>nKHr46TdDqa4m`#h$|
zHl&udxN7Q=*(y7Xn3eSZu+(b1pQ@BL@(__L|9UjxN7s|%xiS*RJayx0p8dNx_g!(&
z+|$Zd)70ngd>eCb>#EkUKC@HvJZ)Dyhg><q%Vfsx-1RwLGJADi+$Ax!w1>Ah$W1j_
zxvTHkmj}<j7}of%o&EFAl%fmE<)aSDYI>YyNZPx?)iqLXR?MnHj9pRuObx~18y#Im
zxH3S!7v`zu269_OEYu~L_nJ+OSm*E}%SGf#jo{=)pT#0?nC~`P$^;!%yT($o;^oJc
z=eK&8lv<fSte7b=NAUJu=TgI%ZB|vKYyMh2ak-h?@1?Kbz2DE+_eFa09s8ue<-g^>
z&H50WcT4Zdw6p*ETKKQ+_tAgDBA4S>8K&j@^>zHD`J10DDEZIOH;-wjj%R=5_9xXl
z<ge{d_`1Sj_wGAO<PH1P@9p{ZVYg||nm*~E&3ys4Ll-MI&+}MU_Et2`!OiJo@7{{n
zv3*N-xH%?qzJK{fd)BUYjYvMXd*!9;%?h^l%5GSldrmsAb?VHr2j(Bmy`Jf>Jr=LM
zwVk2t*Y(_0Zn86YPtRNOeO=NwRo97~KO0|V&%0Qqd}(RWbJa@mQ+J-P_+lEayVcwM
z1asfBt$K?xQhpZPcszMRR=3O2tJ?*8KGbHZN@q-KubS4vvCQe!!LrANC!T*WO_KP|
zYU}ZQsk`j{8D}mr$jmbgzaYqeYUgp*TCFv+UCeWx-#m?UE;;sQ<rAsrd*YXw%t}6S
zM1b-3#IDzCCrp^b^XqY!DX*3GY){7j3?Xa<?oscS%EkJ5ZF&}Fm$~=)t$W8JqI?oN
zw5*ul#)YqoKUr=qmecd=di_Tu)5~9HKI~=5crt<g`mBe^m*+j)6d*Y7>)WHnuJY!p
zr_~Zwc(wCxA77gtb>pG)#2%SzYpPPhZl08G&sthrEyK{7BU2nDxWl_(+hOj8sz)2&
z>vsz+-TC!w*v@@M(-dSLH;4Ay%-i>6ebFR!Bi;kd^DI^_e!{~)d*`YbOJ^`%T7Nrg
z^Mi)sd&|y5vpDu!JYH^EbR*xUiLGL#^5&aON9KGzUmUjf;o%~Oqk-nzmd>{L);R4u
z+q&6%8-%ah7T#OM87R(WlxcTivE}2xbH09G*t~Ofe%^I=`O1Fz-jZ)pK4k)IMdnp<
z`+JL~NlhtxU@Yfu!M5)7BlWplig)<@q%Tdr9wL@^-0-8^Q<ZrtZg=}0FI<;)%+7eb
z<=gNYU+X*Zy?+?2Ldvp~*%w;8oW*@J%d^_DlWC=e^2CVCcAqczM{TXNEPFk{VwH|t
zRZ{O3nP7nr88%(~UNJoZ-ARG2lE<%aWtOqD`RIR#Us+vl%LPW+&wlbtS@;9En$J~V
z`S85#jZFGd#|h$=Ctn_o+^XJ_B44GWmUWxy#(BRTOiQooHAM+tc-%ZM^IPC2&Ie)T
z9nV-Nvddk$*7DV0_R{PhRkzRX=5Z^$d~1{Tk`Hg<LWI0(4IP(kQ@*CRxgfmk!D88}
z;5YhatO0KK9$X8(dAH#0Ic{P9?L{+X!<O_;ym(qB+)&8DKI+V#3+7D$3Ew1F>aOdq
z=exUa@9V5fg&MyX%sYH(?upOtd`Z);Iq^A)u3eUOOqFrxb4k;!D_<7Ix?EZy`Q?4g
zoohkSvbQ~$mzv)dJzKnP>t64LTjuobklXUR+h#?{fwx^xbMocbWhNNM>djxFdrY+7
zdCsrP{!Wp$bMpMpUMTE3ay|Ley2T008DB4~_-6J+eeyAF{pjtPhdds9JjpaGw&h)I
z=m*c+N9{x}C|6v%6XmG8rkC^Q{FRKWjlb1gQQrEaG3UC!N?6*%#|DQdMC)#sDKd-|
zf3sy**!mCgN3LD#)|qv8+0y)?$Q?KHoA<VVT4#LtvhU(Q-dBY#IdgVBIVs3Kx8=Er
zYK2{}*zB2Kt}Xv4_Wqmg$8#I2YNTbp?Nhw0I@!;B{pQoDDs0O8IR6yKD^&O{+qGfm
zj```g(q}H47?5agET&MEY<jisy4CfrJ<gB+iU)sG+g!SeQ%8(jQB72-g`uof?(gfl
zA6#6&Z0Bt<@3TGdI#R=8_3Xf|o?d4G9d4PFqQ%QEEvgQXSoG(>*8^+)^)sIoUSIAU
zu)%P%S#i%}S^ljdp*OeOo!IeV(lMjOt*<OZ8MZUz$(QdGU2bv9aQAyY5Ba5T*AB`|
zJaNo+_41`NpPsxI?iSJM&yc)ReQWr<n>FY67{860q|bBQx|2aZYyFeT+3ojuJS9W~
zt6wGia&R{o?e+M&D%e5xIv3|-X3>lP8PWwWyp=7;oRrz+q0?H+s~ul7<y_#xJG~Q%
z>fYys2t_BXXSO|B^7&=1yfV+82Hy13NlWzDgU@AVZd?<$dq$g?Bp1K>@}(BhbJok0
zKi_|8OWc{~d2e_=ZeJjBFvokU#oammRYw<ZnzLo2Z|*rGH_I3PrV0%!4ji;C3>RdY
z!^%>1X_2UcK-sT}ky}b#mMG{>TF_@zeRahGJrO<jyz0x388?agtFIJYo}DEjG-uwN
zEBg+oOf#FEeDdYXu9siV>X%!K^j}+@In6S54aXhBIVq2C?OrSGEi-qwFr(LsCs&W1
zI21K8BIAfl_m&BVEsuNM+i>9|?-b>2Z}(<r9rua|*!+Bw!SbznhchNJcs-POd(612
z-L9>s<LUl~@^`p$a?hUH^!aSSz6%#pG|tyAt&$0wxWnch!-M2&tL|iMWJ%>HoL8&i
z_q)0C@pplrS>}qzthkQsYiLafXDL~?=+}+iqTCZWE##)2k3GhCsL#XV<lFezH(zWt
z&Yd}8X~eKbx?I9`qaVi!rU_1Re*EgQA{o<C4=R*ed|iI5%WRS2p`MznYcg-fN)><3
z&~{=_5%SEN`O;6YG_SbN?6ar9>5>!YENnH8C`@V9ad>QN80|E7m!#zj-%PG)cXw=i
zJSS}HVurUTUT{2~pe-fv#@$l(lXl#VEzJsS2cPuun!B#=n4ek8n;m*&zM+J2W8c-a
zc?(YT?wQ=XTy3+iN6-@4KQ#w;tX*qaxHVF=Ug}hU$CfWvymCS-H#~SSaem;}bxqe;
zO9Gs8<9A7I_;P6F%?+nd^=-WvwN21FrLpnk^N;H?wXN57`I;sjY_Ka>b)?*G%R|9b
z?u(mGiabqx=D``XcXz_&DV@rZ5*saU&w1Px_QtzR+h3&6Tzh}MY=!CUY6i8i2iq)|
z*XC|o5xj-%z%hw1-_v<PAt}op#3y7;dU3Smt7Y|%i4PMP`ECaA%l}*T{JrWYr#VGC
zSRKxrUWs?%Hc;n1$<S9EA#PZy>Z!2KiuvcYj~(x?JYUas=G>8|+l#D(BgD0qb{<x=
zJXam=S+d)L^>mfI*Wn#4XUuaLgugfb)m}I0u95!Ac|it8&sFoU-&;ISztu;BX~L2D
zGv?=MuTD8VkE_YBIYLf<yWz{#nvBylMgKGKd@7FlajWKvYF^uw^sG+f1Ew5%W-nLy
zB=Kx6r{oEi=S#CH&iiH8x_OHFPdi@pS6lANlR3g)*7wGxZ{KOXU9NfOmsOL#%hWoq
zTvo8)x$?bLyYtoWe_fo$tJqV{*ud~@)g|5==UJ}2zrgdLIz;8+#-_~Mj*HlS9|@41
zzK=J;?2b@X2(Ki=@2X2X%Y8Pp-b~}Vv;NW=-<(Z<4qv{snf-M1EMfPeW$MTN6!`K?
z+bwGH`}&3*$BJ4$zmF2nmOb@z!(;UyS#66`pL#hQI9?yMT=wwoFDlhtVLQHxJrJDp
z@ongF*{tZ!nqzn8T#3#6Dbm8uHh0dY+@;JSimf7nz72t{49|KQG?XnCbuk2azV>uw
zcyft>StQVvL3H7w{x1s-uUPY-I4a7da^ma_%UZsf=AGp5d{L|QpP`|o?dl&#KK7G>
zMne8RVSWqMPdDD%*ZX(EKb}|f1!f1%I(7BgNkQ$L-wTR7m!5k1Zt=7=I~9wyt{rlp
zp|qTR=cC>HTs2mEKAJ7fPE6+6)%x`KuhrG5caH8(zqD`eCHs`g*{dRL4<GATP`mcs
z^rsEA>_N5KOMaX6Kg^fN{Keif<K?DEk7dy-9^HDcXjA;M?`pxKg=_ki=bp@{eBNlE
z;vLU%_po_)UTCR#pyuTV)=xS+9~i!z_1#we@P&$Ozlt}x(LN3Ozi$4V+I}TGbfrz$
zuf1m<M4EPgQ%sqkXUV+rWz77}r&scCr}QMXZsIZ2EI+^VWvpk>YFFWt?_=lBi{JM2
z{;fLu$XoBzy<_!+mdyEdWO7_$z94(yKmDk;_L(O<|1RFTLPbZ4yCUGdrRDAUuVY#?
z_crLUU5;5_eAD}`&zJoz+y1#eeYZd|EMk%2vd>NC{4?8kh>9O6_1>#?t<Y$`=CKRX
z#kuE<YKtTO@qbL+-nQ;ZZIE(t!ePFR&kG(m+15?Xeq`UDvnO14N>u7@$5bATb;lIu
zCG*XYbr6}iX(QL~>HnlomOec%qd2?ZVCt{`3|jAf*ObkEn!wYNu6u7se(NTQqqh~A
zpUS-Z`Zl&_5_{UYnhpESs>3ID#qZf=@w~dzQb^nD)LJoqx&2X}*NbFZzmL;6_J=1g
z_`uqJp&v62%1pbq=Hi*h?;9tc7d?<IuI#>fQug#SGhW<1TNpj}#*Ed!X4Gk17k1uW
zpmO%|-=i{L-^V5DoG(=NcoTW!$>cE8TrXe0Po8roPyW<=Bh>cl+rVWj*Bf77&gY_6
z?8=bT^}>`(W6{(D8jHFTMC3FU^ju(c6$xN;6$#qRSS3~UVaeqG4A+;IFsbHze(5Xo
z_2sp0Aq(Tu7a1%YEiFy1S=t1**-dFF`Om<!?$+@~>aFVpx0zIJUCn0y^=kIF-A6Q3
z_V2tc!6h@*^7qvrl@EV6XRm#Exw)<Fl{&jzA8+0LY;h*fr0L8;2Sw%wB?rfRO|CYI
z-nLwKg<VLKk;v!fOFQod=v4ZwnN#>SmiJ2!^F!x%>aCAO&%Uy*?{xYlcx%UV?ibmT
zX6K@QMx3A5v-*eBGyTQZGoI+VpW%EW^=hj*%eD(<^US%Pnewzq`_J%DZ2Thox-T%G
z+?J~-<LNs=w@+ucGQP-aZcEt1aByQ&)wSL$r{<TuJ$d4N*8;D3oLWb|atEI*ub#Vc
z<pQT(BW+g3hSNDO!*n0zyggl1_E@&qb&tl%=1+Y)zppk-vt;Cnta>9;r#2-yGsDvB
z)RS+ol-fM5e%$iG^CbI);Puab+irfJKRwTXtCdJvh-AR|Ng+HRZ*8#2tuuM6=DZ{Q
zv}N#pxvSTu&68)IUu~E7qqAW8Kg~HpXPX=E&w8#hO`2odPUbts!LQAqMgLruzweE2
z;jbxgb=oJf`BrmQuawi7Z!$Y|u79-Ad&##4Wna&q_Hb#=w3ElQoJA%HHq>kFPhaS3
z86dE&`q3;WpA&s%d0oEoTQ5DCvi?-1tzm3m`vb{m(s%jp{Sduya^bBP(+)ll=&)e<
zx_VRhmA>2(i{0|P`|e(965lU>Y5kV4TQ#<9k1A|G2E6*G-Da+tvz)o-@!I0v>cWcO
z{qa@P-o>pC_Ivg>ay#GF(DnE8CE1s;nz(dMn=-LK>f*&GTV|Nu=zdU|xBR8oH}zl*
z-*UBrHHNROuB7T0&)03=x$YYG?hKD3+FMHb!<O&aFqbX&(DwN03r$4VJ2$sQPyBx2
z*XQtsd-d4-EFR0QULlxS{5)eK`;N2DX3e=KsSj(Cw;6_RJF>aws{N()%?S_q&&}2r
zalBCV>(QEfiTTm_F4o17+shet7u8yYe7&$~&ibAGDh*j$aXXhRE_RX4U}`Y*vbxO1
zl5BFpz}Wwl$Fe@nuE$e8F)a6-dg8T*=79-@*I#?EE8gKxejTnWU}kx8RblhA6K69b
zH0~|Fer=}C?cT^_K4}J?bjfweA-l}OeQutRN!w-pyD>Y-pR4e|*&^$1A^(^wt9!Yc
zs~N0kz0pk)yOqUL`!9Ry#{M&N-S?JUFK7O4(4%*OFXNR^Eth!Mo_98aAzp8}d-w{^
z=CgS&KEb-dKQQvU0rMY=^Ip}9ZMQ0IpYWW0ebmL)QxmG>7PD;*m9j~x+qwF}r{Y-x
zG1r^w7}PD~ru^=9+2Q2CQ+R3fqa>r^FVEIH>s_)c3~`;=T)u1%U)8$G<+n~h-PGqO
zdNn3$=^Go3^GVwC_iQxSC$94Sz{-u;o6Q&O{;V4yyt}V?t810bjlUw-@@Cslahj7*
zvevsz$mxiHb)&D{6Hl{R_TOT$=Sv^i3sz)ln(-!k&N9_LsI#Xr_&-B3<Eq+S2CG%v
zQ)Zs~<aqG;hxNvP=hTE3KjiPOli1fgO(|cDliQ4a+J6Skf2FVX8Dy_#{S)|6ZqkFj
zTle06>-HeA??LhX^--6&-Y(|Mcyy-zR_cN)$6MDuocLtYy%Wl9IS;$#Pi?G|SCo?b
z7W;bt#J;w*HI6-5)1tTQPZQSaGIIQ~^n>j7$q%E8eukx`Deri`aLtl6eJj+@<aqF%
zeQJ2l>Z<i30X=EXEB(%4>IxfE53m%TSDrU@a&3XKo_X?|^o=GDc5TYqcSPuv<DDB%
z9-ADSEy3k*Jb2cs?+lY0TVJ1*Zp=wvZ@Koo*;`w0MX}^9a{Ma)8Ct!0q#bTCG89fe
zYoxq=;<SLm^D#-wJ8KRtQ4_xtxZ&7}8x1V?oXg+3tZG+iDzN&tvc;A2u+Ysn7D`K6
zML!(KlP$2-@R6O?Rx|DQ39be5dw2ZX8ujQTpHZ`|cI@Kd$<u#&9!$J(>F<n90>LXz
zoP0L9?1s0mUsN;`zt59TS-Yb&Boq8DH+H?q%PBK@+-j41-qgvX?1|RYx_MWpOy2q8
z;?#>1zm*2>EQ+=`@O7n4)6Ek)Rw*T-IS2lLTF^2n!7g5_Za&@hL?+Bv_CwUvht0_e
z!i{&^@2%~%5|Lo6cxCZA^5ZeimpiI|U%T3(rNTS8fvx`6)!BD0F4^WDyfC`Knbo?T
z#o+DRxaK7<Kc19HUsv6?^+ZP5(T3V5DGbbI{~5ksUzD+7vsUjaH?~^G6-CCAVtqMs
zXR>kJ?_t=nmbG1HcmJ6)<$@O;&F3&^Iy2XeL49J-DhqkNE4mjpefhd3IQP!UmpdjN
zTD!6T)RHIqPQD)B-fHa=XSL#cQns4Q&MlRTt?aRER)!m=qNE$UUrSh5n9?;H{s6ng
z^D%-K9>}jvxUVKT<I_zWuB*FtoKaz7kmZlLrh1w6<n03oZ{L3%zu<T*|I9G2H|KH>
zJV@B^%0JN0<4DGlmCxsG&CH!~=6J@*<7b19FV9mkNU*KGdQU_2;=BXPzlR!LDPO)M
zSB>$@(<uen5ieaYmMwE*IJhL&a5BScp65MZ-$xa@FXS%P6j?1Q`FLG**woc|j5}l|
zb|pv6xURD<LgvfLYs$jB2mTzF2|2eYL+HA**DZ%oN0z3#nQK>D{yDJVdDgG8Z)+sl
zr+Fy6<(+!+<<X3&7#7yD2agqg&3g9SZCb70e(xPjt`dyD`?KzC-xH#@c$yBg!rK_v
zz3-mz+}ZB@{>QZ`Qmge<zCO16x<;itE<KU;kp+XsgHI0c-v`fLZ1l8nhfHzIoT|>-
zpQfJrZu{!gtDfV!P5hE^#}@83y0r6x-2%ho_u`g(u$wx+v~1&Mp|YL7Z~La5T(#L+
z%-ZRf{^vETZ~uK`6rCT(8xyuYr)|=OS??-UlOAie2t<pX_b*VXR4%C9@&0X4T#RMT
zYO4l!-q4htr#zS*cAge}XS=$>WZI&sTQu(GO_;+b#Cm{j)4IS;t~&zNefED#SL$7g
z&U<oPdCrqi&db@Y$7KW@PhDNLGAp<_RmFeGJ1sYUzh#^L1WU|!-0Sdqhs%xQ><Xo8
zw{c2Z9%DRacrKgy=uTh0ubX%Jq{v)aA6jjxuk_OKv&*NyTHgL5FSS$475aWD9^U_v
z>&e#rys<CLt5w}OqMO)Rs;*kE?p%|%=R{Gv?doNh>y&hl#JR1_o1S%m_ec@L`p($?
zylXd}#hFg!W7M&HwmGKeNzz_ES!KtoDY}{U-@=m57?m);j=Z(MQSVW(>aMk?ntP5M
zn15<*CD(V0MIMhW&YC=_y?=dg<ep3K*2;gM_DRpp?TNCeKWq5BeUGL)JKYi1P_Fej
zo3E*`K_=PMi#0Pw&(ikQkzXb!j2JDR%nB20@=oeme!8Hxy=rZ)a?~B|q9roHQJQP}
zJW{`yT$?z5<yo`9)hj)B9M`bCW2v?&_B#*PZkg5P9KC%UFKS;+Ug)M(p)`r5?Xu^|
zrR*lT%L2Bfiv+l3HU!>lKCpzXL99z-ae`R0=bXSfm+p92Uvw4u)uXYfD~w^SuXLm4
zSJ7$N!M-uk8)fUZ%+yaxKQp;OWS+b1>#y6tF<#2qBmAMmyPmP{@>{{JM;|SVIPvF=
zy<_|gd-fV*`JOtJjHr+UmBIHEr)<B=At82toA&qe!}jc7=C|3&UHNibGpv^H>$H!$
zO9FrIG-JGeX-hzn-?=lN4Mn9gqn%INnIB!9Ri_|c$9qN0o{!_mcEeMTY$x?Swwd5+
zeR!H2$A*h<YJ7RGf7`a@Kf|tRPUTuB`+SS`Z*f25FBJRYaO8*XlSP~6YkfN^&9i`y
zi|_04KhjrPugxuAa8LW@ojppSeI+-<TpzYsJ?VO}T%2XvbD23Y+ia5qJ}wd8Zf$c$
zF|oCyz`bf^^=cQ<N#cggw<XW<JI930&b9J8wej;D-o^bZ)}Fi&acq;<Z)xj}36B{9
z)h-rpYk$`Mma*>E^0%^&GoMU8t6iXU;%zIlXmiHG5Bv_sKQ8@o+$XjCn7nir*THMP
zUICI-2{JrE(es%3_$-eWFD<?@?Iiz<l-38IuWxnZ|0sCg!7BOQ5<dRZuPW6h-tL*l
zR&{Zw{@p0q`-d;eWEM{{7nRwZEV^}dR;yB~bK@T${-|d)axq7Zj!4dEY&}*~d})2Q
zmaa<uR)N`WWwSmR`hK1hD!#W^?ceh^x8J>sKa;RW;mg}upZH}f8ox@<*RWK!Oz<mw
z8=K!<`pr92FGWG=PsidP`?)^NTxxvklli^m$>Hrw%g-urY7ve(lPVG<-1Wup0<*}L
zKqrQC84Gv<eVDp57O<XG6=9xbF0ey(#qAxJLc6`ocGj-GzSeX#+Z&e^p2w@MT(Hqz
zRWUzg`{k0^+P!Z7%8rzMyEwhf?m%E}!u@QIO-4tGT&uQie{f#-kJgXshxL*#KmTV)
zU*4&wr@K~9cZqhvA{};RnTFzPbJk4kH_kip$u`-2=f&k2dJ`wPB=zv8v9r{=21(qG
z`<T3V-SXc$72CtFtA|GGW?kbIu3}cXyzj9E@0Erf>g!D(JZUJtwaM?rMP3!*c};T+
zJdQ^t$Xw|Nw<%lx!YpD-(dNZ{l9Ca%&Rl=DPkZ?6vdK=Br)Q_`yu}`n6!piWoiE(>
zX8nxyw=CaHla=@GpEhyJ@BBS{OdZqrCI=^T%@)}zDI#O2+1Fa}Z0B09fQ20__CB*N
z?%QL-yRgI3;<@Pg`!NEHY4<EoDqq|1bl+07GqYbdoj7`d$%5Thd&ZSz3?~G3<sCnJ
zZQEAMNQ)ee<M(X7uFL!R&EvtGFWP+#*Hv9t-u4SK)Qd4TWD&bRNAN;u&;#Maf)k?q
zM5;r(zuO-&FP_t9<QuG|<g?Esa1wKg{k4r>t&`quQE!oZyIqDYd2-kO{OP^i%+qCl
z8T`7I<3D$CkGXZj!9Q7dj6`4WWt3q($UbYU=)#y|y&Eb%ZfDMTWzFyPq)zjWRz=X$
z8#0T8=RGN3w@CB+w9ulMl$7u5oFA>(|IsU+vD0gz&Bs2im#a@bGoIG-GwkP{o8H=D
z-@mTf_;P+`LG|RoJ24_$?w8iRl-gsk;WL|CmDIP1Pj+uEcKqP5r_{PGpi(8-^u;ds
z79E`nHb<*kWghfbJx=^MDM~>w_l8yS+O${utY;p6Tl1vq;`!yfI-cg<dHW~&v9&z!
z&8gdO<(Uasg}1-nr?uyrdfGJS%{DxjOQm;yjczMTy0Pl@vb=+~wwkt~H<twUJFU{3
zxcOw_r7Z^poYwfupSa@9(2^|EcX#Ea%E=G-=5j1g_^cHhyZ6kG=Xn)td+ic)1)ij@
z%UWWlWW2N8mSOeA!*UGjcE^`$vquY8e)97;$nf?1+GuNbLrsOoD`|@^<vyNy?#R6Z
zJ&YGZ=f;XfcI|n8fvuO%@NMWq^L<AynJ%66Eb?)r$ny+S_mGb+0?{37KBXpp7P4T!
zwXt+9#~P*zb5Z6AejaP0YZ@F?LZ<AVb}z>5h|J`Zc3)>|ixv4s%=0O5lw4JNmURi+
z<VJ5-YcV!ZraQ{KaKS8g5u+SSwo0{m3-XpRg>Q4!VxIGOR+z9_Z^U-_>1(rZ>ai;;
zREL#rN^)>F-JZv~C+Ba&Yo{{B-7|OnJy7b=^mt#k)SCDh)1#+1S~53=zMQpIaOr|0
zaUcDR+-*YtI&QyfoSZ4USBsZ}<MA|~ngfMjS3Z#pI`U-RzA2Y>&aUd)I{&nUtyR}1
zQMKTn$D*?*i4<?YbM<v3<Dm%^@7<2Pb5xOe(tm1_`i%#2^S&<JtT1{0q17hL1<KEq
zS1j4xG0#9HDWviBtb(aip3ITC60pJ3z%^o`%e)!3A1}?23KQRPJn+Wzy;1Y-#456{
zkFyFB$+_4Rk}k_ub?t1=&%lXO|823pALO%A_fKcp<DO6KQQQ1}c)gYB_sjZvhTA}e
zVY!9eR>v#1KOLT5#ijP)->P46>vId`f4xxi41Tpl>UZ>`_%_`=xgVwdt})zZ+q%TD
zY*J-|-rpGte>v8-<Sh%CB4p=OskU#&hq#rckLp|EIIkp4*z?Qv@ymDT>YF74`@L>8
z|9$k?Xw}}^bC!gyIbWD^Fh1KT?|6*dqV4j2xypWxH5+A8i#P6`b#b<T@QS-`$3%Bk
z@+@F*b9|%ieKdUa>OVG@o_Y)C{EAthU##~2>(YLfzpSAdw|q*TR=g_^|Gx3a&O8pu
z1Mg#=K7DsR!R_f+yRAw8UQRi=d!<F-oCj6cST6tjkUoFqn#C(kRW4nab0^(;<N2t~
zJo_yq6iUvfNH<7s-a6%1*H)I<ZpPOyZTVsuWw!P?&(f;uUstcr*x0+>z;;8nlH~DI
zd(3URcBJ0hd4OHw(5zUG+d&_0Nk&Xhd%p6(`Mn<Nw;o{6ROsoOv8vFw&uhXeOZL5f
zo2KT^Xj6E?d~liB#mpTKIa3+Z?Y7!EeG-|o&hnMkEDy;dHm@grH&%wZ3-Zjbt7?4d
zcjVS@&Jw1T3LkrlBR@@;I7jWB@l;#muxArE?g$i~wBElo{iNcJ9a{cA^S(}5R~A_J
zk>%`;2MWO#Lb&$t`8j2~g{aEX$b<G~7AGE?a&L>yJRUQ_y6btaE`ONv#O`SfbDDd?
zrp-8FcU^(;g7CFXjo~?b2F78zdOSXy2M>NZFFI%1EUA0P7iSbrbx29o;dptc`ufs}
zx}+eZBgXu*3!a-kk<xt;Kf!>tdfw0VP8UoWrCpYGhCOdSAUb*X760V@+h&|rJMPoB
zFF|xka+2N4B+H=swZ*?m?-=E3Jy+b;Jpc2o>sxjPIB2%rDLUSBE$^4L%q?-nV}6gn
zep?c%@ucm<?^SzOs!Z6$FsJm{syp{)OwLTz?|Hmn)wAf1pNF0maXPqhKACr=$=IfK
z#vF~)g3Xg7_h(kJ^KqyzFUk)0>*-w=zVPI&a)#`8p|Sj2CR=t^ojb3-AhGe_+U{Bl
zhILL)_@>;paNeOjck#45<LIypiH;gv{~4;ku2GNOy4Xrqx2xIH(`-VE*5@A=)w<Zc
zKQ<qlw_v{4i#Km?UNAh#W5n-&seQZasSoU2{Bd)OW8Mo~-h1Y*N}pG@XlU4z>8Czl
zwcF~I?T{iD7a-R%=i9nfkFHG9*xmG4VdBBFX?Je@wA7lh__fUKjaq)z5)EsLG!zWv
z_IfT%J@%=b^_!^8hAqBo{Ab=y@Lw7-^WtLbx)&14vKghN+Bd%I9IVRyIOpAqqUw+f
zuaeAi%-k2QkyH^pCXmeif?wXN<KBc-%b%W?WLkNB-x00Yb4y-5yxQl+X0dE;Y@)iP
z&4W4L*M;2A4JvYDXSr&2b;H6>w_{S8L*MRfe{;(^{94&E<%!?FJo)-<)#NOXCmWKy
zYhOK9xps{Ij6Zwhec4rKq?%7OObhUMQGM~PQ11+@TwA^gF{>vXz0FX3KG3JSuWH&I
z!-lFb74a6H#lpL_9OX}~J+5&=Ia89kkJI9P(Cf%Zk(GDvxt^I8dUyAQ$>(l4Pg6;m
z!)Nh6@KET6hkHXlAN6sQ^p^-d=I%8!Y~!kBH(9!tJmIr=ReZK+pKaiO299}4j^y1I
zmSfXiJGWeG)h7>ogO@SSdl!DT(OkLWWN72e#`pbR=a%MWL_M3ZWXigl*JZmO$V{HV
z!BQP2(~&e;`Pwe;i%)JVr#$F0{<1FZk?)(@;yAnZq&q?{CpPj_tnIZwQXckhX<ANS
zyJ-WPpH_9nNefHnYmGN$*VyUpE9LquDa`(KLf-M`F0<zDJ(#~G>Y#!4F>(1*JA2<O
zXs8r5DVoRe+-~j)zcX!FTbIqWKQryT7+YQV%djAq3@^QiWSPEfGj;WCj87h|i`vOQ
zExGZ9)`Zz_+-sM5YN;`3_O+Cnp1=EI^X-j?%-EM(to!sv_3Jdtu;VN;f-zI?o_#jw
zUC({>74N?;-Eg_wpd;hFjiBG8c!R`t<-M8pnMXB`T+sY3n>F`khd@A)d)}2;sl3od
zU78|lw*m}ZMRFKjMascD2N=Mk*nzGJTpEkI85X2%)t$R|i%PQSG^@{NvkokEVm)SH
zv2d}a-0t7jx3_LvTfK@^uIT8K!-}tZ{5=1()?NQmd~EgO`R!G58*>Zfr1x5xl-xeG
zYem@K>`%f@AFk}@d;6u<thjsU+DYG1w43H7oRFWU{l)&9{70|X|9G$eu~m8a^wN{Q
zR~G#io&P?vzrM9~*_-ofYv#;r-?`?w+m3D9r}^u7J~UEJe=quFz2&tn7NzS&k5+B#
zkaT9txRS5?I#&G{=d#UL_ShCP8LRkwoW{H$G3I)AP5km2iwn{rSKd!MRkY-|gyf{O
z<BaTUOHO%7&H3p2qR_l*+0+HDm4&4x6HoH=NQg71+c0TATi-1&zLj6v+jQP+#b%$A
zpH*I5DyVzEV9k2TA1D8Wua3Fn)0@lksq&t8Y4SX7`KX6m-{xsYYnDAc$y2~?!+dhR
z+&;zai!a>Ld{gswsl(+gspdHo^5XZ$WiRM?BVGA;Yw<nlU>hT28RIi&C%^M8iDnD$
z*&tKJzqZsp`C_fRm6*?i#2wFO6j*3Ul>7>rR5Yi~V%5{a-32OgGgjSkuYbTBbl&xH
zY4+}|;Ztii=5anRD=Lh6-&s1-wEE<_XSLm@Mb9&Y#@e<|a6ESL<=^bCkKa3a`f?N!
z*#B(N{<He*9GO=)&IUi9KJna-$x&8YA9B<e%+dJzeND}?E{3D!t{SVA_o_^t5I85$
zQF1||t4Qz;R*}H72H+$SIOkHA0fWSAPY%ZetD{Pu-OGKv&M-9F+4=I4D_<pY7cwrL
z+N7Y)tnz5?+Z9V!ZLEC1WaqB%G|LmOukGvpa7IqzdX4^rpMNTLeYq!np{M=S<>l<(
zeQwVcF?Tw?W4-Lo4=#4{AM?MNEnb`X@w~J~<=Q8o7l+wAR$jkw-R?*GyVif@l{<c@
zEKJPMKU*R*_41SRGvyr&U*B7_)a9+{ZiDu+viVzC&o|pCRLJ{%^l#bP&Ci!1X4I`K
zf8fHlp9|Z6ES=K)Z)^V<&u^0Jr$t*X-O=WqIZHF(xY8V>4F}mKOgxsk<l+Uzhbwfv
zQ-b7t?F>(TTM#Y&rMrI1tFVGTp3QFaXEVlcnl&S0QIqhVRnbn3)rC@Be>#8UF1K6$
z_&jeE>u0IQ!P^{~*Z(?rX@B(Bn}6myJv5#qu|j<wJJW`h7bVUwY}GmVL@Qw3{ouw(
zan~smEYA6xt}O5t*AwAMXgs-Q_vIZaPbOL9wQa0Yn)cj&rTepEjE5SViqG*DTXiJv
zP_+B`GPd+X;O?>utJvOr{gXZQiu2E&hWsbbFLWIWpKP_DFY9HGt25K?eaT0|Goznb
zJdtyc+FVgQCE(0X8@_tJtVwJqQrRsJGhf@3IahPiu{X;LS-+QkS-Ehc*Cgj$-k$!a
z0eW{Ao-(p~!xKC~U&DCLbnREQtHNjI#tL_yn!}c+@WIwN=J*lKo_{j?+;SHvv!6Vk
zb%)1!8>7MmzH0upi52ti=I1QyozZjbz~hPGoUt=)h3y=7?o$2SQyp3|V_Agk-c{F@
zrzP%~Wu~t2r1*H%S`|ljWrk1M*Q4dC<@6=pb+UHH8Gp6>W*U3)LHT)+Yrk*2e*HEy
zm$leQ`)L5<iSMgduQ(LE;`Q;p2@fXsHE*>nVzXbW*KF2%#9fkEdB?J?mnJqaeV15s
z;>Y{5KFf=nJeS>1@{D`ZIOoX~p*z+oPac#UwVhs&<S%((Wzu%1!)L5r<(!>M_NF~L
z6!7wdY<Au4xGj~O*=2W*Pdc_>^QO%iKjP<<K40spx^@5Tjw`>XEzdhxyz9~$ozh<0
znU2m|+JgH(&-&~yl&S8vw^U}Oz2>_A42O=cUGp?)N8s&i8*Os4O1Yg2d)~fqHD5Vz
z<(<znV@^Dom7o9Gx%5w_rYvZJFd$hZ(9L3*qQmpG63>^aYW3a;(C$Cy@NN03Cw<3e
zusu`1w5)^4t*U&{BmJB1lXo*TRIJ`L<q)@;<kP*ctRozbOYgqQn^o|sW6FoUuG$l`
zHycfL^Z2r4W$vQSX@T!u&-%XRu-UCsdiR{G>112BSM%6eI!@kL-2ZQ{_QI1456bMe
zOq{H}C;b$|<H`3XseQWfsg~X3`@eTp<txrbKMg)#XBE8li`cT3+?|ZC>b9&|T=e$$
zS3k~E1^%|L9aG(IarMoV34WnH^-yl@UAC-4q9>P>K6sEK=*ggU<oTB+?JsQI*nQHL
zZJmG0;_jAolVgsDQ+h63WbQL^x4F1W^i6gr%f>%Tn5<_lE}IuESN?p~v~vz2{JZ=E
zU2i>~cwN+Ec8P(h@{IfQ{FCEd>&}G#XZSGThxXBXvY)$RmuRnuV*LB$_l-Z=&!aEz
zROQ)WyL!*xnR|-mo9nbPF2@Sws+Voq5oQsud(5b|ak<##9m}PUo%mjMZQav7m+t-a
z(da5vc0c_~erf5ofTh=4|9CDvZ+=VaowAL>+=Vj5JE}j%$Mm<z@&9=FVZBe6#M?Jp
z@7hT!wS7{#HK*kK^{$_3w-4=Fe(1eq^o?wf4R!w+PPtEbV)RA#Y;{DJR>{?fnu||^
zR%)ESdAhFs?5wFbg`QhCN<8nm=5k$;gXQbXx3S^JVl^s~AGvK`woq53xN^fB#u>M#
zTC8JTH(l9M{nDP^zN@P?R;~*z+Oxs-s4we*2R-j>H%FW;@~&A@`XFRtoJg8=f4tw6
z$(qZyxCczvo_0v^#iI2`?Oqy5%aoX&a;)DP!e%q?Znl&3ft{-TwjK+n3NP(*IQ_j}
z*{1mTQm;)*8kj6Cq<25t@b*1JKu807PUyxG`LcIRpWL&|6psfdrZF&Z%@HW{|Lqud
z?(Gq|sS{;harHEaFF5`>xORoaX#>W>gX-)r{oX1BUf5n}_i^Wq0xP+#6Ll}#3vX<m
z!x(TUu4Zp@$@A@xBR|Cnt2y(`GY+`9RWyC&g1jOQ=B(%YtL!fA*?5eTfx+@@`kLJ{
zWS)F|H0NxCTiths=Svg5+j`u&Fv($+UG3s4^;)5GRu_JHzQNSvR5Eu1p8?0~S(A1A
z7-M)Q6$WQZnU(Ac{XVTA#=!Ju#;z3}O`HGRcwiorwrAh9H>=p<r_1~^-JZF!fw6|q
z?!)t0({?RVx!Rw3>1zz{>`hB*FJF+mx;J;#lbUxinkNFP%h$_qyk1stw!xj<=DKV4
z+D{9km!FaNzA}5~xqHhO|7XY*X<60q`YKz2|JL-ouT@sh;a$GI?ymNf+JcP|HS=R0
zgr(l^Fk6|P(DGHf*SYsXta8)l9d}MnSWq7GL3{CK39UJ-fpbLSjNfVZZmPKIZCo?+
zxU66HnoH-W2s~ddnfIR|>U(<FZArITH(qXeKb7f$p1bq4?QbL!n#|<7cC5?08hXRb
zWyY(UZ(l}-Z4wDhf9QDPxw`D?xmWXp-C0V?@{as@`?Bqr*6AaBv4vYd?@0f;DlABS
z>eOV#IFGmCVuohS1s>-vUI;f?)$6jdl#|iVT!iI;Omk%U#Az>jxRd*{UNlID2!H-$
zCK&mB!o<Czn<sx-|DPdl<F}WFtHP^frY&38S#s#l?IO!H-t9S}GV(FuzO`Hn5_bqs
zs!B=Q@J=aC(o?U(rl9zJ=-c}RC0lPifA>7}A48-Ycago+(dt7Hyw8;t<~42Gs?l^T
zWD>(;_Ps^Z@9&!0uDa{NJa*A7+QpJyyu#iqwj_GmTUb2)d9C*Bm+q5El`li*{aie`
z!K!%H!s@CuOXe-w9%?OV5wVx|f|1Zo3w61xo0BbWEqR_FAhqLm_QYrDh0kZbG?_i^
z_V%)fFDxa?&&lkT710w}Ii+FW;%!-fcYgY|{=Ti-d#}^m%RUQiW|KI1V6BJhjdJ1h
z%dD^El~vDDy>nsfEe_epUCXzx^(i<qhlxM%_N~<iq?|kt`lR<=P4(c2{ujybxARw+
z-sV@C61};rc5-k1H7A|<*3SP7B1$J8?)BH5l#qIUq20Zym-e(Ks%XlTuggB_n)u<^
zN{xVbit3j$PCQ$DYg=?{|J<5TtHUyZ8a8}&TTe~Cw`J?^%jFek_*{dwZO?qd#c1lu
znXyj5{h7g|t;*Xq<yV?6PFyIjt&-U5UKe(iLuSsSRo9eW&b)8-iIe5|(&#N6=~GQ-
zs$NieAg3uFJjskjPBTYp^NO}3+wUHT+xh;>^0ga!)M8|cJl{qHRI~+@Z9HJ>v0D7v
z`ij|$cAlD(z?FN)H{$;1MTt*;o^bzt<>XtjU%I_*J_UzoJ&E_(<>d9W;T^AMj;Tlc
zyK6!07H>UcGIdXwTC;E3k@|L?R=4nlYjeN8xy0iy$ix1T@9T^+5l=2eiFG*?d;1r)
zy!LR@Jdo669K`4<5~{}Ns$jWvAw$rYCGY24y2NNaOM_V?m|?+1R|d;)9pekvt3RxF
zYClqEb<yPI$8X^~!e>mrDDuw!)Q$+dG|9)Juk5)^ZZ4P=>!g-Cp=RPnS^k<jk$JP`
ze2ty>?mvUrd;2Ya(se%>WW=yI@w-Sc)Jd#g@Sowq{Cmp%o<G*FxOvj<;EI?1lDwbU
zw2HK!T1U)_-1GYI6vvD0!LQ>MeqesY^vCw&7pqSi)2uy~{Jky1uCs$_bI;ai>9g*h
zzhK|9Uuci@!~Hz}88Wh_JF@Ox*(dt@v&BEbc;-K@KNha8@w_e{u!FB_Nr%$JPZQQV
zZmG4psxSYeKjO#4N8EGcqpw~)IN|SX|JJgjOl8bhe$9Fub?Tmy|E;A{JuDe_NPbyY
zb@k3)F7GLubreqBE4`7^z`=XqS6JTe!o<Wy_a>Y=a_qU5k>~B8<N28!%BPu`mDMdp
zyC26o>g+MD)yWd+F82{Ut}J@=qo;|$HBUMBhciySyl8eWT3!8hbncXM?6Q^bBctTs
znVc@={yrs{ZHx1?_}R@bvhR4joA#t@k*SWv#Ky(|li7^w&DUjDY35HX+WqapW46u9
zuQ)s`2){NxmNn({t^Q8G-o@tx^k*ynjNkDqe1@;KzxIhIn+;E@ZLM)HyL?va{hbBE
zJs)_JudG;d+e%SdVNsXnG!aO@v4Q!-qAsllhNB{ZJy*UmENZe`G`B_br*BCe%bvFL
z(Vtb1y;pOTv_JH_!u0H;o(YcZ6JL5R*tlrg8`boQn{KLXtC}CRQKm@xU_oAV#W9)r
zvp=snSoT9{R(kQBuC+R;nQ`Au{<xZym%lbDdM{xl^IZ3JWU{j5V#_37({@uc69<bI
zS+0r&R_WJf_EoG5l-zvbg6{d0zf-=ff7{=`kE3y7oXI|6+52xa^Iyg<-L+=*b8F$b
z?>rJ;Wk2Y@;q78RU;6EO32pafFTabkZ2vH6clgI=``*s|D9>Jyw_x6XhN#CYz8Y7(
zNIz8<X7i!e>MHkCBLSXtma0!$PY*h3ub8kw=J7ACwuDWqw$J=j&(+5rX8!8zr7MSb
zceEx1>;8$fkzbo|=N5~4q4kW9TRz8zo=WY|Fe={h-L%_;=gm)@O^nAx3f~5Nb^GWp
zU7A+5l7YELz}@R?cG1$sC)ih>__KQT&IX=oTu%?O%dR$x2uS5N4DRy{cg~hbG7r7o
z=Uj94Mu>`m*3Fpb){W1$yj#R*)K&R*9&hmE=j?SMW>&?`5f)}&wM$p}&M`>f42rgt
z<+Bdub(6Q_6nG!NR@6NC$F*iX?%u;$bNcF|7OyzxEVJG5VDJf1UGEt&d;O={lrEdA
ze`LB>$eJL#_p^4MzG*1*fU)oDyLeF>4bxoRb&IT*I-j_G@=x}`{ELqhrJE%Er1nM?
zKXd2xu<#CAd0Oy%Rox{wixmeCS678hTpv7VzSoPrH>W$ET3l{h73|5_Z}Rqb$h@oK
z(!C7U@3wiY7St?0@TBytllU{0$vt&j^F%b8n|H4~s<O`8`Qy{(iSvvD&KjmO$WOmD
z=}{R^xP|(PFDpbg+S+YVFkPEgV8omI^4nVL1?uapuklWru8_`rYxjD-$aQDlaQBHT
ze_fu<ytmgdche<}#Ru(=c1^0~ops4)h4%KB=eOp+_!acHT5#fdhJ>qUoeULI*z@J)
zgl<cjU;ONB*!4H%pAVlub$o5ey4lCSDV>j-EYl`4zv@{Q--<V&yL1<d=*o0yGM-rA
zI45}HoTLdoNmJyObvLZMwk~Qx@rmPkTARMEwU#*cN4Se4^@}!-?>Pg@b$O41P0rj~
zwym_%C+xPPrTYG*iF{L7!UI<S%26@Qdyta0(#?FIcG0c-Dba<~UY`wnJoOjTe4Wpe
z@2y+^UipFGyvkKQh7AiI+tx3QXiD5JGb?Q4w8u-kxj3Hu)l!R}-9L4g)V5PxCCVRH
zNGta76?!iaz3U~w#`$$+!o>M1AF6@`Ztr{`6&kzTa+RyNhb3#(7s&<IY{wkFy$y^$
z;dq>-@5$AMg_}H{-|BZN;dsJx(9eIZ&pH*KlE*ToM;+$q6*s;PV(t;(=KH&{vb)4i
z^Uunr#xH9n>#B>Y5=z&6IN0!bdDYz1wEq0UD^-_yw;ARK3mF7em74Y@7UX<oR7jHa
ztN1F@b^A&Y=l8$bGp2qt-(WM#^?2|%`)?{gns!}3JmY#{=93nt{sX){;cIFlexzr9
zj6Zmi_v!kZU#$yVm!3*4OuQf*&s2A4p8d32hrS)kp4+iWQ*!bI!((Fmz3lk2>px7o
zb?>IaZ?D4&ncSs5efC^mGQ+1$%y&LNS2SI9=g;Eb2^suLvi?b4nJ3y-nJabdMY{eo
zw+h{_qMsMX@_e~<Y`@$72TSA_JAT-``*)2^+-$pcQD5iW)fW%`XOQ}Hc~b7#Nq!6u
z=50M6q{nyAE#`ZE(ajyQg>B1C@1HXA_^Pzo=f*LAw$}MQDN+Y_%Z6RKw*89P)CX_R
zvu#P-7k)yWrTl!<(`iY2o~(TRChJh_gSKM^R+qW8Wm}{sIvIp7zqTd!{r6?^3!k&E
zzqDh=R_4RZ2W>t^aj!B`zkBlgYv(sT^Lk!~eUP}p+!A);sH54sj-?$u?6%pnbDi8Q
z>`T5po6$S{N#kqhtq0Y!7sovgG4^aIYrYWT6cDZQpvmHOi0Gj?4W2eq6{&X&55DtN
z&ujaTDV3?_HN|Gm$3Csp!W~S-2j50MO8b3pZ{f?};|eZ0n&)%oUG44LF+Jq{31*9z
zXYDIfd2Yxxgr-c^a<kj_Ri!%R<o(_1e;!R;*Sp3?K53cV%h&UxChA9-xyKX~He`uT
zSd-|japJkmr2_HmHv&b{l^1Ni>a1YNK5ysiD1&UDo+a;Y{XO|IrX=s;V-0^B220UA
z%f5@B<{pvz&#*SADdW+cosrk~?Fh9CJ|SWAyzBJt>r$~R_e`?>6{dbmC8y`lD#L55
z&T5``p7C5_`I|F8-|t+$>`uOonN0D1i*=iQcOSbcz^cBEuc$WroXO84XN*5hs_J_E
zWo46@^EQVA%nO&?-uU8XiS_HutBb>UJB_M}4}ATyb~a~&mRq$L_c`spjk`5M7Rx?o
zmVEs>mbLYXlM{2zPv-QxY_TU3-jr3<oI11Q^RWW!YfE?QBt{5H7v`wfuPxpcdx1g7
zY3fP2onO}On7M&d@+3=g|GAx7AusYJmQC&6TysE-_p{6s-JretO53=OwJR4_SA{O0
ze>&)tck<+UQ=J})`B;S6e3<z%u6o7d3$I#rXSuoFNv?W2Q+m<!#bK^@mrp6P_{`?5
zZ^?Xbm-mE88h4iK6fn)3I<=Cam#HD7^znpj``j~Yi<iH;9&XVab-!x6^u|f$g=Y(^
zT71$HcW*a+Q8jg<mN$=mfmOKTiU@;9MwWzxkGJ-6h3Z^e&KkvE+_&$PjNl~86Kk?h
z{&W5;le|FmQv7X3!B-LmzQs~K>MH%y%S~T8Mcw$UDs9U(?YsM#ClC5qOQm#Lrk)lk
zK4>@f#O;+rHHS^FW?U3Y4W7e)X_t^;#_KIVLv{p3tWWOyx;Mk2`x$eY-vhsjUtw~y
zIno&zyI$x{6>NBVx<|-%wd7h~;f+OtPxTxgd^_(|5fm|ZFW-aO6&_Pgo^DH(Y5cS5
ziM&yp^1G(u`!8cQ?J{?fNS6MyBdBQ2aog%}{*P7<ZvHTiOgI>Rii`cqW6}F}HtpeV
zI_0leIP25;-tXT388}{EeyFgrP-h8Wd3r<r+;mU7>@Qlr5kKE)oISFq>&+kQhZ{Ej
zywuQ8a>we*J&_Onx1!$)^SCUxkGk+Nza#g{Q?qO5jGFd}E?aKA`@-pKrXFt;Q{xPe
z%f9a1wWoTextPUUzrFjjZ<-ta(b}~#?ZD!*vs6>mioMvXLRaUSJ_~v~rMK?0;H7B}
z6Q8)4|DI*a{Y^`t@Y0%_@#oVHC(qq^?%uIkB0TSNszWvy9VrqvnX$8%?IY`N{gW*c
z$GHR7EnH!oZ+v2J2ivSXz5_dCJ~#R|sqZLQA{4#UWS#4q-dr*Nw~RXB6W1K*ljy6r
zI(f~+bi1?dPM*0JN~3Oj1p95j(K2&J&Dj^WniFq}_di#%xV_SZ)4aGxHbdFe_KnlM
zS1#-da=ebamfVTbShVVZNV<p|t9n$dLlkIEAkgta0AGfKNT90$SKO6!k=19JOiZFJ
z_4C6t9_zhx(qLBE_<*N2`%Agg-??ATb5-yko^~l~V|1Krrp)wf>jlz`_UoRHX()`h
z{C8kJ`=cN0KfZR|vZr^+<&vwpQ7>3e+!oj3d^_!ET}zGM2fNvivtP#S&b(gWyK`xK
zqsH5bZ=;>`uDeg{ocr`t&F9DcZBe2<fu{SOhsx_Su(9u4C;d-QJG<g;Sh7^@gD&=G
z+Iv49Z~3at>sM{IyS#_->5~r*?_+fTO|4Dy$TXLKsQl|X&z;%3-3$V~ow)-pKWg(~
zx3y4QZKNHzbAx%=TIsoVdFC5+?=Vgb=oU|MS4ffLe;rqHId_(*(D|vkM-Paes0o|m
z{NVLA`D0<meK$>C6x=l0=fNx^<gOc6{PAws^+Vq#HkJF9ta6lPcsA9dIK=hRo+Xuc
z!sXMN6eaGgSRlVnYwx?|{ksYb&-tdGET~y~uz#D@Y>(JRb<=loFWz~b-E{Ws&jRcD
z&m*Uc_nmQ2k$>tp&8c~X(#o?6%C|P>@61?QaC_<NS$$LY{amujG@4Z;&;vA9&#<UV
zgW;@(q{WisCW5mBSXlzyiZ3;AX}ok;z`Rx@fK5Xn(ABc~(hklhjU`Kudoew*x;ndX
znoLR+SEJ*X<EB-|bT2FX$>jKL|Bc~-m-FM=%ISGR+#GlKgLk$+?fSLonX91D<n8Ph
zqEG%aY~pLEvHigBH?1UOdgSg|Uk}Q>Vb2o&!S$8%{v<YuDme!EsL#)}PcHmas*tdp
zgI$aBtHt+K@BEds#2m^dS&FPLV0+5lcW2(QMbm;(w72)vKB!oF;i9hBcEk6#Kg&<Q
zw&ISHjNI;D@7_mw?S8_rE`(?D{LizxB5o|+T=s6c#fs^Mm$|bpo{PI}7O}#5^P$H*
zVKvi~lQ|9N87v9+`q1gk{PF_d{@#F{+s^nNJjZdswlFmN*R((9qJI0|aM`IWD^eVy
z-p?hWt)Jj7A$sw&T=KnD=8Y%vIM$p@3hT~L*j8)RWpi`Z)GY?So1BhwIlkgtWxkO+
zHK%p5#mU!mu6?<%q^RbBc+Mv`Hf^(Sq5`}J43ss>6B=VCZAmR&#9M0dd$&Py#!YYb
z--ox=u70lHW#v*8x9*UN_TIiXU)HafCC2x1hd@#By*<H?{kosKZTH&2GH>41i%!|M
zq8=S_o;Ba-MMaz0w)e+p%`@V><8OCWIx(Wj`0LV8uBz+n`W17moF^Fmy0j>P`JlzJ
z^k)n`SJyW1w4P*c49+`XqIZY!#7dq<<1O;%8s*-!{&^wz_M60$@&&%7+8gel{Mq?+
zxsu>9>u)O`J2o)BpXcha^0Q21f7BB7XVI4zpIN{Zk-oM3mdT+z3=WEw&vu+uWSr{G
z@NM0_%l_4^!P^s<*MDENX2!gZS6}v)$#33pOXLf)%+-r!dQNYAZ#+obshw*TI*0e{
zojKS3Zs}ZpEA@`pafW%tZXG9IRUSWj*Q8nWL`-s1ZT6Ygs_*?Oxz2~b8=IMHvddk4
zqBPkm;S2MLMU!nc-J{$Zy>Crku&9Bns3$n{@d~y!Z&k;gJC0uoyEb2p&tE?3)K-7P
zj$;?2`R=E0D}Q13Xd>S;zx9^WUQSo$JTB@qb$0Qj>d#K=9(Sd6yF_j1E@}AuW$hH}
z&FA<FwC3)rEac(yubL{+$IkG@Bq!yj<ze2vhUc^x9(ta9zCbjyF7<@X<Ik(!HQ8)t
z@U%(aD*i%sW11v)?#~VG602<z8XMe;?`;-)vbwnWZTQ03TJG#UU!I%%V)yPixo6Jz
zcU2(_Us>k#P0b6rBO-c0`Rj^EvuzI;k1thGOk(t8Zoaq9=>;Em%KS?!h1MAM`7e*T
zvT9*W`g?<gJv)|bw@S*sxU;+XqN~H&&xLdPw0wI%wLbL^_KgWs?QM9+zf`*Tvyl6>
z#T+5e%Pr1dS{5nt&f<h^#tzBw=fwsu#J{e~s#DFobKSk>_ma|s4CS_aSI^xgIpy1u
z?-zEgmOJ~~pknPG+sC()mU^8sn|p8X>aWG$ygsHZe`L2fT|15Ybpcz2bbHmG*dO(4
z=Q1CeX5Jts=+o!$<;2;#tu-wB+a7+oFL3LumMeEBXH4xO>;DX1*Ni+(&hdoY)zmDp
zz5H$S2dN*Y5A5m@Jp9aL!j_cg!zsyZ`*}_Os@3ynSG7$q;X0pgec-Xg6Zxm{7ks8)
zsF;8F`m{HP@{PnkEld6Bd7KSA&hnpuC+<h_qhmY1H+1T~lgoK~`@ZP);CsuK?2-uF
zl2tV?aZagC*?Wf~50(c~J%-7168NS(V3tYw_&O%sR<`rB%$&dXy-MoKUmkUx<gU(s
zYnkH-^`#tUS2p!{9<z{rb;!%WyTIYVs+SYEe$5HFxKf$RLgYl%w7}2(^>JH1EAupd
z_YV$aa!}7uYkI)Ic`(mjie+MYp`yowa><nwf9h^A{@5767a_az@q*PHWph_I&&!Hj
z66CY-#Lq*M8^0HaiA-v?l>GB*M_^BL^ZPKCO4-7R*EU_0Eeuodz3Om#>VxMtPp-TW
zNzgbfcVk6T=nbp+OMN+BwpqMvzO{L`mFU|N@2B&1K40$3bQ37NzD`rv-atNnt>*n5
zqQMg^pKUdov1IP;u0PA0n}ggA#>oC>&}yF8mFYBlyA1P%-@zAWB+tF^<oVK!iO;Uw
zJCkiCak|L(4%cd}KZm6o&U<atdeW1izg_10s_!~Cj=jC#?zKAN*k7L6mEBgY51POC
zmdvXCaKq8s<GJ$ILbG$X+tpubhe>{NJm*`ae&=hy%jHtvRWl1uyuJQ9R&RP$<3S#A
z<vG`<z5KPHBXt9Zj9_$F)H9i<o6mXJ9`)WGC9?L)H(l%Cun>lI7Z}f3&APXB&z(Mo
z*!}n3X`jfcaVTd?)7g1y`NFlQ;{~m)rvCJ+RNt}QYE}6zTP{txo?DGQt!=3abByMB
z%5Ay6JA8(~$_X<p)R+Ibt}3=E^5h-<oWAAv);U+D2NZ5$K3DO4YvtytThq6C%}*{l
zy+e8OmX;@S_oLceEploe$T^C#sN`yhOt>3=ZP~r!6DKe}NMErouIx+at(C`DPOcSm
z`m;xl-`4i^j6GY+^#q!?Jhp!vTY4leX+p?~<cVL`M9&a(<`Foo*brA7yCr^0`s|LT
z?i-)qCY{eKdmwwftSVf6Wpu92&J*m-U0=Chiz;@qPM3I6xAo+!S(%avjLHhaFJH#}
z)eT#IHq`I8jCPdK&Y;Dnmn!O1GY?F7^El)DrN!B*e4NZ>)$^vVUmUfe=G%z_>m4)t
z?eaHXczNx%nedk6hT81Kmlry7G8mpb7EvlXfB8b4uKg8X)^#1bv1Z8x&cyjk6AorB
z<S~0C^WceDanK@GPf@;~d<-fNlGb^0>YWP7eL3;cOcrmsD93GfOFPaP#(eIoGG3&2
z>hV?yzsXDXEqfp^Un!+De`!T|-?Qx9l1nF4?kqS{c=Gw)s`E#+H`Q;>Wvo|DpSeYb
z?QwIQ@1qvo#W5ZGzTKa~=bP!LsbqO)-fWq$<&VTRUiNY*dy>o@!}2lazW?54%jA38
zegD`c>D=k*J@B7F>x(}3>wmnP9rD+t?5N$r=ppedbhUb!`I&vfr*ijLmKQ4Z>pYl~
zF1qiY^tKOQ?DAIB>@@u3WSM5S{L=3K3<7^VF6Amt)8~I_=&W`}<<g%scFouJREJD^
zAF#Xfo$Ql|ecqO<pGCU_KC3!Y`)&ERn@xI(?VFZ+^)xmKe_qAt=g$(b=D`Eu;Afe6
zN2j*4Pm-7)HN$O%fggX=s=gzik6Ea#Ip#g_y4>=;MsY14k4}|*9c$jUCM=RW`5Bjo
z#QO+=9GS@{-^PZu>))Ir{As1lWTy+Wi}TEKZ57T;Hss!IdA8Vm`r6v^r*3DTu6$4?
zy7p17``gJjW|ew(3o4j4J-+npvdK%myPOFYc2oG%l3%sf-6;FUAip-`#L_Z7&*Vvd
zp34NgcmrN(EKz4`>~<9i+`+-7nX#xBw24%Qflb3?LHcqpj)Myvdy=p3wKM(MU=z&F
zY-+mW&VyVX&$q5e?)G2I|Dm$AXI6Q4P3($f?$V`ucd9U%Et6iq&bQY8@w9B)*d;1&
z%5JsrFl0Z!|3iI>;Sck}^Ax5PC0D#z+<qqTTBLMg{O>1R-~FY2bX|%LG(OS0VbUrO
z$#oqki{`P0Jykwpr<Zl%=$h!C{qs%jQvLJ3J~x*-6a2J-h41+GOKbl4eAJP;wl6R#
zHR3wQgOsAmgX@%D2S#iP`M`MaxZ0kVS9WjQbm8KT`89J4l-2uYuCVzK|NG7ZnJ~qj
zNk=;m##Ox2y5g6r(6q{3<!@Cu&$3Hbgm<o#IkNM4CA+2lsXgW28g}uRL>Ih?IQ7X$
zc;e;exEbFUX*6%V^SDj>{=Gf+k9l9;{n2*J%*I_>^tp}jwRMyIGG#@=_Y@ZGbCA`N
zRAuI}`ueC-qM@kb%UNgb+yJNROTJp?rYA{vZZf{L%IC+is*q3ntmg4A4YSmqWMt^?
zxQPGJqMl+`X{lC`K-UJ1#d{S@zB6XLcYN06Ad)trNV9MjgR!@(sx^nkVv7Yl0S2$V
z`-~kd7SFRdE6v&Xtjp)KD}%_+$0Bm9%=4@-3CT-X%6(nA?7(&7C4rx{H}n?XncV+6
zGK=9@_BH!-efHyz?YrY7E<X*r_Mag;y7OO5@5DdHe{yx6bTz*rR5Z!suh@reGi)>;
ztml1ks!{B)UmKgP<?YGGuUy$)?z)K~Xs#Qd#j;n|&+2|Ts~2H1GjQT}f1fbhGczBU
z`RB(U+oP(NUVi2M9Lo~b&yjP4LK`0R$9u8-oLII|w&OV4N^zlucYa#haMk#3bKtX(
zF<)D{ynJO>Z?CB8qGJX(4qcY1Ol<tdd!B8^r0Me2I@Wzxj+QW_Pg8l)=eX!~adw%=
z!W#$e9PZ2y(CV4UnOuCixhd=ZiK38{KI2(UC4oEJtUlRl9tkQlT-MI=bdx7LOYNO7
z-=iBW9X};*-hFSo-VX`Mq$=iv%C|P=O<AD+?6AzrbMB9$bGBN(U)PrMQ~%CN3+eq!
z(_)?0aOAGIH~-Ss=W`{yj2l8Lo{LV^nW6t#TjR0%3e%H8nmJpoUT*oGX6WOocH+?7
zJO3HB#<(AOEB@QvW#*~2Qr3M<dwCB`3b1B9=Wxz9`Bj);+|5&y*#176nyPGFvCiez
zq>Q(P!OKt8q*iBs%kETGw)T&?8s}*FSnlf8AFn<BoxYkDH#7N|_T=Qx)!`S9-}9Vr
zcXjTJvj;TapO2cSy(UG@O>3J$#cMCd6UXDWM5N6rZtg35p?S3JQ{kj+%h1h@U(foB
z?8q@>nD^zPn9jq!#_xmJRCtPSGzaR;WnZ~6_<K9kjEszzlRK8O^dxVslIvfq;p$`*
zlEN65$~C3bdQ)w0&dpdGcXf;JCc5TIUcY6(-rK0M>0KxTUx975UG&OzPjrq<p2PZO
zP3g6V7I)_!-|<4*>-Z6|4AB|v36-{*_YU1&@Sj02>ZE$xyQEtVDX-j3AM-4YXueXA
z{UZG8TGL$31-)0yIB(TvA1Xbqw&}_{Wo3!tF1HC6Z=7G$rD4XUVZ)`_uxMVxoWGjQ
zv!=3pO^U2K$Sq*_Wu<9nm(#}QldmnmEF!?nlfHA!TCaS&mnR<Zu}TST)w;S{;;^Ca
z{G8BKrzc74ZZoVC`0{m`rCsa$Jywl>vy?x}ynRuz+L2jvRnRl@<2K(Gy;Qaf`n$R<
zabiQo%C!EXhJqt}cUMha^0>}Q_;vV&_TY1u=lOCh>v<WlrlGHW#me00+KuzJCPg%!
zW}aWQ-2B}+vrpC+cWQnySu|$@WBY%GxOpLFGCT>-MQ8K;sC&X!R2A0cvu1gA%0$;U
zP1jO9mU7;)x^kG+QPMu{$|56ANoM<{N~;wupW8542kwYEJe8~X+A@bTJC0dATFmu4
z&#Ee<%VYA&Kbd<uorJf%J?1Gh%RJFP&r)gX)o!Nfz9U^JeP#y9&96OQNlTW`I6ddd
ze6K?@-dV`6&5hj|P-IYeZKH~H=lQjAZ4*^CO+K|F?40HLi~Kj$9~tcZz<$H#`@{o=
z9^uW$mG)a1Ii6U*xIU#{O4j(O_wo~dw|iIvs<!`UShZ<R%%V4ik5^WE8F~D*`%(PS
zvZNyHaOlpXiv<>6HNJ29QT^@jha7q~-qovLzT51~v+!W|gycHoc<1b}T)CTXZ_N0x
z<nuxM$8m`t!yW9@FR#~4vDbaNTHE+}lcmJ>vxN^f8aI6t^`Cy=(b97(y%+xcbbzTs
zaWAi>$FYK<>X7NvHr<Lj&(h4#J>$f8c9A2&FPr;M?RDEFA2s*t$q+VmnP+QVx*~)u
zR){e0Rf?uEhQ;uneCs+hf1?(IhqYhvwPh>~ewJTEj>Imlcx<`y+vf&;b%o2ZJ#&w^
z9XN4beW}IVpFa!xo-K*E-Plw9_)?4C@;UNxS4#L6ba~G!u$r}<L+1`-<E4cWr@ks*
zH#JE~;ormS?{w+9)1|rHeVkub3rwCkN2YjE)|PbL0|(#u`b~V;P&3JDVx(#DHjNDn
zWRLgAHAu~p3s%=EJYn-}fvaM(*7u{)J(G&(Sru4adGXCkzwl#2nc?ppFRU+LQ#vx=
zV1wg{<6fd1p~}x}H=eUy6>^X5@pu1%s=t{tJ>vs=#hyJ#N#8HBTI$nWTf-ouH!2gi
z%T`}VKAj>|%V&5rTl~W3S4ZzX;b91zH`C&5*bIi22gTv43~$fz+cLfnO>>kk>@m;U
z{c>Sb)T_c*H>|hIOg^yk;pC!82YMGvo{w7o%-Cq&f{>49;Z1JVvmQmuP4SgT*K#;;
zK(^n1ZDd<+i$U`IfNU*EzfUc-4`=P<JjT>#mAqGPnrZjW3sG6FJ9v)tO}&(P-DrY=
zn{<!d)#EQ8yw6!zFB9&*?DUqWv7wE!t_9a(`@`C{?Y#c-(zZ9o6B}E<oGsZ^G;_v$
z<Ko69!wK1wHcnwMVDsjEb6EYuy6s+tpO`1ye4MdfYDv!A^JU#PWqEgrh3XzqZeW*O
z?Z}X@L*c93p_$9wLW9c#&)H^22DaN6*u0fp-5YBy`z>r|zYU{^5ra(nv*gHd!M8mo
zoxcxxvdDa2*Y@hBr~M(rc{7iu-*Z`L_J+0L6?<UZRQ>YgGe@*vC(qd1Z+ODMd~)9&
zsb^oMMM{)2V(%KB)82IDEsJkk{ETnv(%DiKB5tP|rrTOy-|4wJR^Bu=_En+q%Lf)Z
z20PFBJ864ex{!D5g69*t8*js(Y~Z_@dTT*q<IAAi(Jc-k49EB9gs+%;b>_p6OW|(w
z=4Uy$E2!1`SKZszx~ZbSfFa#x)`_iJvl%7NOUA#B`qrbOpr~%Y{?g_;hb?N{&zbJ5
z>XYCz>^gXL>xq1oS<+?6A`(2S?pJ*OlkqXX<GSPJC!g-}Ug-)AsOOi>p7f#b$>z^b
z?)Y973#vH3a?RX#+3E}TKE7@~%fEfAX;Q9!!kv8yCxeU(-}Z#h$eOO4eB|)tv*l5H
zPtHDA9+h%g*sQncljHnHy*m$lTW^%<v*4`43FXGiCbmb#b0wetQ`t}*8x+d$_7(rN
zP3Ak^IjnmfJ4<@@`Z+0IesLY!aUo>ViNlGq#i42W#az}ql@;2Qw&mEk<|zxtMgQ!o
z+Vypna3;T`g=O5aReNV^Co9Za`0~ojo>`_Zf6BP{r!V|t&#d<%t@EI*=;|pMGyR?W
zqo%T)vJ10sTwcCeTyv{=`%|Z~752SOB|8N)l^Ob@&WUdqWbBl-dp7y)W%<W;duD}S
z(7kiLOSETYIz#h`*HIeBa#v3}z#kKCDSGn`x4H7QttM}MT`vir<5&2;=)33^tJBuf
z*%IX^x5hM-JzDW9YW^G_yQrV)tG*reH+HU7NSzycyT|Y-=W=Huv8msGF%;EJ(H5*%
zo>!}O>K!|mPjG4At(_|uW~8L#aagST_wA6yB4f8u{=#_<>w=>*)}<M__P#!xyqCY&
zW3#g4a>g!(qly+wH!j$cZX%b#EW!}z_#n`iA<$J%gW;`L#6*XfQkhF{ZTX{gJT4w*
zURpAb<8s*V$d-LvuD_45PjGk}^GjVJd`*qXhesT&S5}>pc&<|5zBJuZL)Rzk{4||k
z{0HMjzVfsDu#2@ipme&rXnVfqs~xcm>$%q4Gr9K1x#&`S{OOIJT&@3N<d%ybbC&j3
zdM+I@^_=DL1#44cCmQhVj_5ru)AiZ%samC$?>qk$aVI|a?6|`pYTN&Hsbrl*!t<Rg
z0+o8N*xlr?<Z>(ix>9Azo)(ov@zugXcPECa1t=d-5InCE<Ze;ZafN4n+?5=jQ+yJF
zug_`9)z8rASFHFM&CqqUvhB3v*<2BxxJaYI6U<#7^1H<Y?^HZ;@e`8}W&gZBYyXZ<
zk59`T;j6Cit@-}wW$X2>t&*Y@cSM+q+*nH!r#>%U)_$~DbLXSQGdZ0Y4xFponwTtc
z@POS`k<UB=)}`OqhaFE}>G=3qW>3MK9;uQwMd6aa%2vI5x{33wO1DewXIGKnw1y0s
zv@T81rh*wvfA&@`_>^h&Xj%*7oH-XABo;MrMR{p5$W2-BJKdyxDMJ9$qrNY4zKS9z
zZ)hx<zF>*LQI-!HY&{9T12^#Xt2TW+U-g^$o79JriLavGcXdtvrd_(J;d!IVobCUt
zw4X#v%*vj^+&J-^_Luf=#UJMXQH*E%Qt>QcdR6zng+*+R(mNb~@?YCwIMq_q-grB^
z_pPg6Y{g1>cWh)Xc-(W%r-6CGsk@!B`?lsiayZh&B~U%jV^v(%5ziAU^D5ReO}SH=
zzCLUs--QUlp1#LDm#>OHJ#Sqd<niEP(JJXh&u2+SOB`TcaNP8T<NZjvoW*H|>mpMb
zcLZ>-6#l%dvNPwHqXP3mc|TW`HC2@rw+xEvzV8hxQqECkFme{YwM$|BBBQ#Oi}cKo
zMMkq<`1*atlHK7v$u*O#=4rJA>-e2LcCT^v%4H@u!^&84{|UzicDox-J*iUg;6!ur
z#B<fv*FsO+d&AS+e0*!ftkM*grUr(>J6z{>PR~$T_ov9;r@l8cNm%PtV(b|P^$QK2
zay!?o?E89afwj4%(z3lXHW{sU3z6NgpS38D>G1-F5Bycnri42$6WX>QcB(+a1V#q^
z<oA)+&wN&%BU*Tp`@k`+!&4_0B!zaeBwY2rIWuAM!W;odo9q1A{=Vl<_^Q;r{TRhM
z@9iC#ZI3VQ*?N+v@NCun-Zy`KuROrzc~1MZ-Xg;jr>y#HSKn^h68QM!J-?@pk~zPA
zhrE<H?(Ed$f6ASCDeI{@#b3^5Y!%*nBzXhFmMhGKwl5Mqm*-f>wko8o@MP|*&3dA{
z;kl$~nDK>DmZarQB6{^+Ig_67n6s*+uggw4cmHif?9$B#n08Lzaiii%-`DkvveT}G
zvOFm{s(b8<$vPYBBEG-~{j7y{(@S%&$Olf0{X4&7@vM8MKaKC(zD&9DV9K@^fekhf
zGrHaKzFTldzwWkl4?NF)Y2E8-n(L!XUNP)&JXhbfD|5?T>!1W-0q^U)VY)RcA7zef
zZK~2-woUZy+J51RTjmLeSqd_Do-NsDb#ebD(<G6nDboAeb}ldsO<rof0KC21BdMV{
zZ0%3Q!g)Vet*U(GoB6Usw&S?^RyAjRyW7=jITLPIn4TB%RQYPUex2vjMNWHvW}WJ@
zy=h?~H|3q_!ldh23FfAW)A{EWUhi76>eOS|>a=yrLW^y~dOdQ*-_DqFC%n%v@UEK!
zZ}a2}ze28^Gkfyq?v7=#n#}7S_Qy@pH!8ca;F3(~lk&CJZYm#&3@>du&o2A>>h8>*
zWVVL=#eObH?BBE2o=KeE!{i<qmN>aet~{lDNk~}S+#Mon>I<iZtbFkCWzend(@s@N
zd|#Q~J-LB>S=MgZ#TFLJIPY8$W{YDy`96p(J%|6)=7gyS)q6ruq@P)}^Jl->gnLgH
zF-`EWT=w_k<T+P1ZPsA6lvwd`_x{s8)6`}d-qbzzxXFTT^_||XBIEb7W_AXj`q{p~
z?rPABx6=I#^QLIu@H=yI&ur^mljm)nQK@pR_03#|_qR5$lscll>PP<CZJm$qn!Q$Z
z@>xD_ZuZobZ&eNMC^PrSJZqS=%RaG2arxOt@~zY46k3I%gASRcK3J*Tmi4%FE>~pk
z@*P`?9w|i^&AD#;TjGy*yhx4i?hkwaUhMTU$+LdKKjC-j>N=T^D*yOD@*Znk<N55!
zx@2La590SaA54v?&hif3`QgSX!NZS4rcJk#`Eh(<ulOUmHB1tZ=J}hMs;f^t`R8+t
zSMBAAUroP!f1CN>#i`?KZXMbk<Q6vBX4kxy@G~0~?A00ggQNBarC)ydN^8qy**tR@
z!7Y6=S8rru2)^=pVt@;$y3Cxfc2kQKchA2x@#03Eih~v>{=JQEQ@JHEiMwRkQU1FU
zGIO3S<6vZ#+0J}zUd#5S7mmd=Srs=`U!LgIP<+lRd9BT%;yaIfE^R0c5RqB$?7U(9
zx+S`Yz9^(O`gbr`KHh(A3d4ivwv}gf3LmTb6(7@*ToSipqa@3E*MC!!40rBSVLq^8
zVSnQU+oO@~TAY^lYf~5A6^rN$jSMk7W+gQ{>3EOKq)N*b$#)7EC6wj=X3bMIl9_m{
zDkSQ->z50&j3<Q1uAS%cGFYd2^27$-@P3X;35Mru{dRDe%Y2;VUX^|3WZQ+<=9Ip}
z_NV4Ztm8ZxQzG-Pq$6b8BQw2wb3ecJcT<!sVwP(+T~m@iH|l+o*pro#%FC>hR-Jq3
zo}*TIHYy?IVB$QhZ)d}IdK^@k5b{`g1>083OWU6Fm><7w`8wG3Gmp$aksgKwcdw~-
zKNJe8tFO;5zUuYlqMP9agX4{1kK~Q!-F&vdg^Q78j@<ISk)4wLvbC>bf5{rSwN4P6
zU^S`o+4eUxU1pbkY@Afhb!cn1#f_rpE5EF3J6f>%gtE=7$185WycF9v-G8FF0(+b3
zm6v@>zZo36e9YhUM5IyEf|U$a-|epMPda+a>g0(xZk~U#Pfgoy+m*X`=jD`JtJZ!G
zdGL5`$;5SE!jlT_Xsk2#pW<><MBcdFGN<`y$*<}*S9|?aclaLdc(dq>Ez7&DdQ;TQ
z5_=k7MoyownpK^>FQTwH>h*UEh6%+zpR$&o(QuyA$L24?m%VM;F1gxlnJ3>~D(5No
zJt&f1vF3KSNS``ax%|7n?4oCP?{?m?c;lOP#zW0C_HH9HL;AhFt32P#{5+#K?@fy5
z^3_Zp63lbv?e|*wEndgChvV~>w5|6nQ*>4|-z@%hMJReRkAX(vB=)Q?50#Itl%DeD
zyV9zaPj@AEZLM6XHZvzR{V?OF-}AH9+r;^)FwA@2H}%ku<uT?$9aB$+%J6(!6g|T=
zEA`c_mRskx&gAne*zvsY>y@>qZbrYH7n683O;dsS-IKx};ns^>HXcYnc<(<$Y2iGr
zyT_Kwgb5#bvSyN6vg8wk7n!E1N$YEykA`oId?gsO)9_&7@0pL4wR=AJe_C((G4#TQ
zSuQP;vnso9)Ml@^n*aE!$#rwCg1VrcPbOa5^FCyU__`0q=I?e$zJD3KFtgm?>BN~c
z@5~XtwXi*K))lkL{wv=WJqnw6)9#%$bHK5K-O4q$cdXia+C=DYn$Je|YYQg0-Oyrs
zwCSDFq?-p$-pKGie87b7Znsaf!uE$<ZO<MCmaXb9zBlVq(~?gftJY6XDxPz>nm2pL
zwWQ-Fb89tU3o6X2=w_bi+O<p3Rx`9iq4~s0m*~wCe+2(&unH1fzAVe}V)Ep973Z_A
zd|IaG<2&)%&XS%^3yXD&J$Gt#@t?Wd%VMvj*?MN-qB2E~cUrSvw%Hze&|uxS^-4_4
z(Jit&O`|+odO!8~XJs12wKKg6atks%@8xy>y2;{cGwnXS+S=&8a#uN*#-d&~kwEt<
zJ*Eq6RYB{kf)6b57D?%2w>_)K@>|M^r=Yggn@3l9RYT>!l6T74hwjPEj=PfFWP0L6
zx?R)W{|xRIj&9vkw(;Gk>oO&0gMT<a%#P)E|LyvQU-#}Y`GObC8%$qluZq<2S|obw
zFthScsn1&H=iZdd_56J5y207jLrqJx5<b-0zVg`ew6}fMnX~tAe_Fjc?m(oY_LiQB
zw<RA<T-INCoF(N+Rk-r^seQR(treF{*t6O#&)c6`Y$R8ntb0A*YnFq|<Q*$yp4-go
zXgqn~SaD;(o9(IU%NG6Y-Ldo7y&JEzgboV4`8nsxY6YirYYMlsMilx+hFFwIyT`76
z?eBKzMM_mcX=bXbqs^T1^|MPmdv5((sh}`zXH7!#-df3ZSsP#Os=4&Doo8v+wBO4`
zKW8OncRrD6FH7>@x!##?;!WqY6Wzjd&tCts;ui1espo3X#tOU(Dto-$D|B1#j>jL@
zJG{JgEOSec@#LdHI~&|jNUUpqlR88Az_EhrYjrDgf|Ty=4!GLYy|dp{B*>JfOJmUt
zR@oOz)I}J!1iH#4fX+4**)m1=tp}^j1*=PPQ}jg`7JT$Lklqz!xnyAj&!t&jnm1S%
ztM0nQbNNC_&-bMZ)$2dRAJl(bFPHJlBY4}p(lFbm=4pSmzwCOe)SY9tqwkh!#3Bca
z(7*<Jub=+k^gpCeGL;uP&$OYDcMZ>DdE-*cuT1-vOq?08?edo|>!%&RTD1D~MfuQa
z4}WG>yI)yqvg4;j+v!|Mn`f&$6=PQMe7AfVeC{brgC_SuOPOa23U_Qcw6E~%%S(IS
zmDek8E19xxri$i?-?R5m^$9-}Kbw(%d0=Qr$6dF}msOtcjfgC2u6kHCao*I+GVX?l
zwZv|$v}cvibF?^UGci(Fi$(I-+v7c7PrjUWd*4(^Z^QSEeOKGdwVM7j?0Hfm@i+U*
z!r-0Ht}o9$u{8D5=PN58@ZG!0xkGFD`_x@mf@2n{O!C^U@J(s6`W|hy3x3AU$C>tO
zoGiE5sn#8Q_u;m8S~vcEH=SKxK4%?6&hz&vQj0#%eO@n_lTdOra9-`EiF@id@&CBi
zbMDD^;le4568*Dfo~_t=>}ibr?yJ#ruJBjRVVCwi&)jx4G@REk!9cvp^A)Rem!`)~
zm4_013z+;juG)O+b*`aub?%?KWwSQx^hJD-R%c#xRW>S-x93v(ts{a5kIPMMS+suR
zmh_a0<ws&8BCS{aXNXi#5dLHD^?CKu&!O^`C(dODKN4H{?QQB+H$i`yYp!eBymOat
zEx&g%;#t+Ju)r-7`@R@`o>UknrNeeW<@@oh-gd{H-&bGm=;%M)_hrSAZRLe81C0gv
z>oQwAMB1jF{&p%Zu<gOOwd`Bf7p$2bxo11eoUo^BKbcg#sLgogt$8x3E{X9^mi%Uq
z9;>`>YkLp({ky7ktflszt2NiN)U8*KSV(s$e2g}$y7TgIicqEctQE;Y#*GJGWIE@(
z*jp8t*0_1))*XEx%XZ#4V-Qi0opeol#!WFx?<T|R{l|99uKj)e`Z~{b-yQe-mhJYp
zzk8hdSKubqTi-4HJF9~C&M~(Unq$WAzqWF2)wb=c-B;X>)oC}}q39kHK6MA<ZCPW#
z@1`BMG!`{Ge*F7z*3HZA)6N`u%&acET8rg$)vs%(H{E)9=D?pL$t)r7&di_KUul0U
zZ|+I;t-cxeqTX64eC}GYc+S<^C7(G?{Ly@8rm}!tBBuJ;63HODsR>bS=L!nFzt!-~
zcr@?Gortu5x_hg-swZkqRcKwY*mtj+yH8^<i^9jFzPs3_Yj545t~5vKcF$I?Rk0r`
zmjA4j;6A@{`38;!D-Uh6d=PS4PrP~J>wuprDMkLDmV|2ExaEIorphGGo!=(TU+Uy=
zKt+aY29rTVvfPx9a!<dWw^;bfbRm=4yQ;2@(jEPGpY)$<>Crr9aaO^{<Bovs%NXgM
zit|^Vw|MCl^Y*|prS<o0cLo1Y5#o^B@@Bi(idn{e|Nb-d2Jcd6dobr?*OYe*6EFOd
zT50oJ`B?S$C1Pb8r<WX7?`vDN-_qiBSbD;7#j2}ecE_4s%=daq{A{zjQh$WiUnXT+
z*|Y8`=NIlz-7ja}V&l$iy#BpBYl@BVt$n>eCO(p`7yi+vy+YS@vx)Or$)7&+7VVS&
zuw`x9N*kABuZkl0vR|HWyDzF^<DbknbB##bE7jXFYZeG)Up$zk>{R#d%m-s0<s;h1
zi!aVU5dP2lM{Z4??w;Q<HXaXz+ZaA%KU{s+D%R**b>!sJ)5JA`*BNAg4gOXzOFOzZ
z{BYEqRoA4JM6}-ENta}i`l0=8`H!+X`9F!*bT8RX+b$$2(tqWj>Ba6I*{94r;_rSY
zeEH8{d?G~Xh`zknR*?izn+N5hEM7%?1zKmgWLTLQzQ2!4e7n8qjrtQVN9GlFQ|<20
zEc@i|bbqZ=_veI!$4kAXjSASTg{p%TUwDK+v$WxVxXj|`cjm3TyDZagUz)Q13|~=1
za+lCX|HR$qyvH+7E_c}-dZWPewbueOf%Se1$`+)C_prX76}>QHjaT=E=H2U~wy54J
zSl{?YYuP6@MwySZs!oJIu{TdXA9Z%|E-9r?W``_(?v|QenY%n+@~L~)l1W8u1?(%A
zFO*QoW8L5B?{#|RuGIHa*i_yze0dqfX}<B8!^`GNE0t4H%pC2bW}GPBU~xQ7W4}|%
zy9oCLr->InxqD5#Vf5wD^ZkJV%8e85db|wQo-_H=go<a|V*8|~Z7@ll^5+k~W1tWF
z+3gleYbw)E2l2i67I&4W<+1h0c?-I>-ju1%E8>+qyxF$mnDynwk~V#{uiROeKG(6H
zQ~q@&OTwnc?^RE(tLx30cSkDaqDufz*Cypu?c?#6CP_4FJ#W5}w%%E2!|ij{bHYv5
z^*hbUU$H?!QhAcQ#n-i~GfpXOV^rV2G_XryM}YgX#|PF*=dp3VKd0TbI6wK~a#>T;
zoX^G!f{NH5XfNI}q2W}WtIfM_>&niSO?v*6<w3&NwX;1rH4Ka@lx-MejLXwwO_weA
zUVbN6%R_>>?R~87)N_Y+CIs%hd*Qld?k*#VN#eG<xbAM*rP^i@_{w<JlfrAqOHxb9
z1Y(q#s#eX5UT*SI%}A5`dk4#EuH##FvH4H@7kH!ZYR0|J0ByU%E9<M?Elpi`FnY$?
zin1p6GtZm*woZBV@zj&XiRU;Ue_DP0l17kmYhByMCllVMvNP|?zPfBuxO;o7p=!NF
zUtQ{h4KKeei!pjDZB&&$tIgBv?SWe!C(c(btXv^o`{s<OQ_9N6qSqx$-KU%UnquR>
zs&>}R+z?@HChzL-xodQ*Yfc14Y<$>xkZEnqYyFjX{eEw1pK|hrtyZ*lqLj%xZ!-(~
zyX!i1`NH>JEDF-i{lM;WfZ@wJuSaD&r);!l>S3x}YwPv$p2LazYIo$Lo^GA%y4YX0
zE~v=!wf6-xm#C{ht0yQXojCsdz>93=h>6}4CGWUPGK(sCwrCaI-uo*oWyJ-rFt_7D
ze3>`)^4vaSQhn&{WYak^Z6|D=n=V$YjF~@W&Q-|(#XI%_8aK8~TrCm(I+f?JLh;d*
zJGXx7epzi+o|ty*o>kiVvw54<!l%E}NV;*5@9>HfUre>EK2ETBF7kSHTJPrVEZ<fb
zh0Hs`6{cxD?Q!Cq$8uM8J21@K8en<A^7vl+vszZqMYxVGIH1lp<J^)jkJp9^rEff{
z_s-*QR>SOqyH}Y1ybe0_U}21mfVK$FC+pA|OSJB{@%kQJxaYg;-Qq)E*Gh-;@XK1I
zU)uR)!nTWZ9_`Y#HIII-us^O=^Ow-^Shrq5N$J|x{ntzmW<7GT<h>E@x+-?nhn)`+
zt{Jb~)n9nduq)Z`n5f9Qr7}$huByrji@E|&E^Ju+)}PDLc9lV4ke2ZE`CetO94_os
zzqHr<VSeMe?FG{>EB-doG2r-pHm1F;#^%@28%|{|OT>#`zKwhM;P;C!rPU@3PD>0}
zin3IG`bAy7bmE(?v2)v{gMH@>Zx;6yu%>%1Ia->xz$wW#!eVt)-KOhRIX)7T1b9}y
zK3}D}d)`Z~ndN2`w+!m0o_H*}=*EMs6PxXNTBdc#{oQp{{PI1u=S3&nK$ov+mL*S}
zep-j&>F&pS*&d0_`S<2Tkx}@iP2UO=H=ZqOJgD;It@W<Ue=bO8oGZL??Z}7dlNJ&Q
zoCjEnG&kKi!1;4ypa0gPbCY+5ZR``vZfueL7%ZK#o$+Y_AD`n3tt;OHB6NCpCM!>J
zc)Gg%BYVfar#*!-n(WP20@g|^1nf50r}Vn%(Y2I@i4wuh_eGysg|5pD{cwB&yXlpR
zwX<yXLUY8^7-YVz*{h@zr8S4~!ngHaEjcsq`bH^iVEi<3^4oiJwl&V5U@sir#nbw_
zYt_Zgc7BfQR`2bO$~y6+eZg_%k89SZshUj^*m>a3>N*(%dp)DV$X{P~t)26nJtN3X
z<LcBa5B<F~7Bv@`1aK(d>+%E*?*~Aar}Hg0NjKps?qWD9-O!M5>7uJ{gQmN)rz?Zx
z$wgfpXKiP&GNg6IO<`a>xmK3z?D|rU#1JFH#8%m#YaU+P+y5>7gY%EwkL>2O@T-Y`
zPSw4j@m&4ZhSjEieEtgqnpc|2J--#tS)(;i-~-$A<qL0GAARn_|6wz~|I)HtW=)?7
zk(Ii0(v}+3{oLf7@Ib)g_*Tzv^(J%Lc#Jr|{t7=7viiK)&0o4!S#yNmq}lF%Sl(op
zJZbOotktTUkA)~Cznb~{b*xO-<HCf+FRG-v-uvqmw_8v7WX*Wnbke*Ps(xm>E%)mz
zPF{Il{nos5Hzg!(PxDD_z3dy?F!hH2`ofTB%^A0>TF+H??eO|FqbN3Z#&tjU7`9go
zPinQf-evsxu=CTCoF=QVcZ<ZFudGg1R-UIl^UBlk?J5l%Hgk$<Utd0KZN0bOSkT{>
z%UrmVxiY19xpZs5wD2O&BCk1pg+ZqczZ_s@;E#_wzH_(6)9pMHxAYy_JFDnL&D)Hd
zlkQr*RiDS^5x4W}n(Cc~a&IR2Rob3de&-eA)d>vVe5<mxs-GrLob=;e#kv=FZ#<aV
zslH2Z#p&kO*LOlP4bC0<-6&fe`RHl%Ld$P9A@Z3a6V0_XB&}CxOWu#36?l4g-mw#9
zHdSHr-Fh=kPVU*<v(9d6q1vY_Us;|@{3|_Gu{<>5^r0JRg>#p`3`{SYobzFCiP*lW
z=kMuMnueXr*F9GywR`Q;^)mB!`DJU^U1up`JexIbnyz#-SDSU={HVp&q6aLGZ;keB
z*`OD_ereF`ITJkXru^yLwzSOB?%9lccQxM}nP8wf<9U~>f~D@Hf~<&jl6>VdRl!__
zlCRyTxy$~2`K#yh_NyGs%F6e)to<r<WW|BA#a>H3HisqMSz^Y2sr$yX66-yO=P*<y
zEp5_yx+6d9{N@=sGLyfq)vjzSYrMW=_1=p!%l)>0esZ&SPlNHx=zj{Ir(KdxapUTq
zW`Anqmzh)ZlKESov&>&xE<D3`<{bT7oB<qab5HKt`Aq!%(<6Tp3r`#^d{^}3vE+K+
z>(|b`Q+4fJSY*6?ZRNMc%eO9>$yFwoRd(l+-czXnzd}zx2Xmfh6Ia&zbr(KfUo}6X
zcC}36r^RzZW~C%LCb=2Tn>xGJa#oooi}01eE8VeEKkvA@yF9h$!RJtsnmgBe7X&Qt
zKXQpJa_fvOuAX;}O?rCI=J7L;69?{;&2zPT{=8tp+#7#1)N=zx_uf8H_T}x_sA-8(
zlY7ceEOTc%vgES5;)In?zCN0<e#MJ-MF*xy*sgYBJ!P$_>YC!7m#W-1b!Wmei5mh;
z6Hkb+JvEzu>O1>dZiRxv#ycV30~9S89$UN&opxpQ#5qg_THAS#bsyZ#@?36fu2FEk
z&zDt&x0nhKDz9G}9m$i$c+4tkvZr;s<HskpPw&`fz7d(KlCWKr`_%1CY{f5c&5)ht
z8pOfAm*Hw>O8=ea{!@zr%AOZ0@3lUo<hPekb9n<>(Y|HV_A+~S9QmTd|7F#52ey}U
z%0+V*3#ChnTuwT-cW*{Un)M;?!UJDd{Ap8`I4`?8`?q}p!#|VHOWsNbAAI@NS1CVv
ze%s9@(=%9RU6^%u?IF$BC8cLGf7G2+y}r0-!kva%?KM9ZS1)^IKFfFB^rg$@nEWml
zJ$roip1U4?<<$&UTy2e~leOKt|FX#KTYMq(#@w|k!p91g{$73=m~mihpJ9)T%+;A9
zE9<BC%@keZ^JMacU+fRIAGchPU27k-%fO@gySep-;u~Bq?X#*m{}evF{77?wQS2=Z
z)yMJscD(YfS)H#lZPMz6_Ug*A*|%$WKQ_Fwlic&++iI<8)0l-$>lL`~-y1c%Z7yHr
z<)H7o=5cOMIBr|rwON3-r!ORJZe{M1IG>J(Q)N~tJQ19gwJ`16g+h-PzBjh=iTB8S
z<$WEzruu{m&vVPKE0mcN&Y!BE8X5RmrbMo-Nl%Sqg64x?e3?IZ${tMan|Vz0C}+&d
zV^%?LP9;CfDSbTId%@-Ejm?tE7SGqZNhmTDpW{5{>aW1A-6NC294Pwf#^fEW?=tU*
zedE1dSG%Xnqa(ra^}QL-<@N4=Se`5-z-MF_xp}3qO8aSrb?*xJszO%1Zago$YU43R
zl~0ELEFvlbwOYDY?#AqV*6O?0$XaR^`<+$C=kXPXgum0PRGxFS)tW<L;xXHm5x$%L
z<nAebdHdSZo+riz%<MffS1smSdp=g~37rwoGPzZK66e~$^VTK04nLULb$eK4f>XJh
zI8?TaT(vi9m5?|Wy_KcG&#&;<#mlclUlhIgVtMn?jiY^q^P_5*wRdM&zI>+@y;R;f
zU0GK1;yMO~!afdBo4(^q*^@jL^Hs*(pBmROMfur@FRNZGP5$X&cQsG(oY{k<o$74;
zZd3MsI>SAIyI#D=QZ(<D@B7}>#~m*#|H+zD#H#Y7t~5<e=&hF7wCBqu*V`?LcfQzj
zyDaDGwxo4@j4I#XXvf_uSg}AxCf)vVgn_(n;CyCDmgXy0zs{CO`Vn}};oCaNtaCeV
z%JKv~cry2=g5bQXtFsHA?#hc<S5zExckQ=J#=kEdex~rC&q8#0X3@c5R?xut(uAvh
zOI1q4rfW;8?yBOi+M)L-=t1JP^}2J)j~17GKeADQDMYyEQ`YTREm4))hx7J?2JcEM
zl}f$+Qv6K7+pXTB&zE1@l&2RcpJ9=BUq-6-$(xXs2PIjA&%cf=4`!5mW~op(Z|loT
z^JdM{&A7WwZDGwt#oG!heaq+W_j<a=dF5<xvkpVgbeXnShp%mkJr@|+Z9S){itEuI
z-xYcbSD&4JUuvQpzhmE$@Ko!QFZ#7MzY5>vzGFv7PlLP7udsUy3#MIUjcb2;aMi35
z?c6+>NwK>GuW+qh>8DaI-H~|bdfB<>BKfsvcJJOOXqkK`vAX{2>goG;@aq?!D-Ji+
zUM3{KR~r(>di36#o(EMypQUP#PJ5Ubmc(gcQx%re<b6HOCV8RBqo=o3K4fn4+o;Fx
zQ@1sI-(ruY%0CN@CYYzM4V<|1gyiae`B~ocY~9y}PG(_ZV_&}1wflvEyv~!tzuL*3
zJB4LrijVJ25-Jzs7d74Y<;G7f<AWmKuJ|1fE?x5T!j_KRQ>z<ep1zy+F=gV!x3T4I
zr7aUWmMULpzPI&jJilwPw9$lenVu4nj4y8GPs?9a=2aYg{QA~J_W=H<(N^pFzP%|h
zZjLx2anSPMlB>PJ{)r*Y6N)Ssq@<L8HQ}^+5^(l&>EZ<^85J!pY*%@le1HAgg5ys7
zA|HNNl`cATJK5=O2g6s{?7T}KeUw!gFF!RsciXE%;@SG8hn#j=NW6aU%TfDe_MCak
zZ3KNCY&Q5izI+{e>~&}Jud>y%Lzt%>keT!S+tLfulf?tJSKP6Tlisnabf@m=GY1Pl
z^)-B1HN8x6%1LpS(kT66mou+4Gc~7KT7Fp@EA2izY>!8>o65vV)*)49lg(C_O>kOz
z=bzKw=0pFa+g*EDna><QcmJO0lvhQ{vzEHba+vHDE!myA-6bIWy?k(Z|GOn8e#VrE
zuG}ah;52!T%$1-6b^!ux>g7>~=l!1Z{ayJ#&i%qSOkBiHoKz{$UgR*xbH|f8nnw%w
z^WAcrRZ{echi9rxc!she^Y+O%%$KiKPo9}sl6c=$ckSu7b$sF6$D`KmYCcqOV25M>
z^scMBC+IxxpZb^GInY-me+z>|dEk}nCJz<2T<j|iFOzxL@!-+wUa!oK9tHg-qioMF
zFFutEEcwLvGT33-HP5-H&eXT??eFzTdb{G5;gU;oC6hc;_4_aPdwtGz@nyZd<ZikA
zjMAf3SI?eIIO=xwm|fufb36S7G6nD5+HAyHu(Y|k|I(HxzOOHA`7P)E=;V=Qx9%1>
z=H53C4!XHmf%{I0DDSV?_XU-5PxK_;+NEu6nmdy@KR@b=rhd8e+MFN{ImdZ3A2(iF
zSD)TL)vJNw_}*BLvTcma?DA2YMHnMz&eoliv~{C-tdIDXh^Y-Mg~zg$kE~RQ()sjO
zL4eV2=DH`hR4xf$*Ph&W^-PUxX#e3OJdJzZtb;EdbuX!m6$uP3UZL^Y@mUvxgQ273
z(nV7nG!``(yFFl=EZ?gu0$K&H$LPx5==joy;ey7}vx=O3#jY9A(e5jbDTm!GvU^}F
zeQTvBx2v)??;1W1lXXmPyKiv)4*%x#VaBCBrj=`r*3T?^bk87s(vH(I|3W{px0&oL
z&5h!&P%`p(C!*E2{L+4xJ-kbuANKQS?#kifDLBCVPFAL8*2iM6JzI8KZN7QxrPkD)
zOE=l_ojkyjtRf><xwbl@<|IeT35%yY)|LCr{_d>IeTVPs<;>3?1RGOtH%MGRW?oWz
zsQ1#&Ds7p4qUG{=hn82HPW0CL`lP2s_EmQ2Ptl!<)#+=aT%C9D&AaQGwlq1EWlOq!
zY5LX~jmHf5ERSa$*}FAq!H4Dhs;{T&M0eg=UjJd@t)1CVPw$$}xT!9u<lEY$`_7if
zox86r3Z1%LsBrS7o!Srgwx8Y1{I2nwaqPTx?z0cFlqA25S^H_GZ2vulsb5TAT+FlD
zd}_6?_2NlaBp>VTxO1xVcu=ixQoP^6bI;DC)a+(6sC``@5G?K4`g3;E=_|j(mFtaH
z+j+{K`gXLImAy9db416hi+-Qpn3WmGZWlh5trgiVGo4}br11HtW>!{&wn>JpIC(a0
z@5ORU1>wK<roOoxC1>jF;dQpb!tX!Bzg?lZ=XNk|p5S45G^i<eM-2149q+>e*sL3G
z8DHS}9A#T(Y3m;2wNfs0+mj;xz_{#3vF>lB-cRHIwd15s_`+AmPi#4!Bc|h9u{z7`
z_mS{*mJA{+^R9B1x^0Y-kXoJg@POsBP5x2)SIBPKc`kZiR$EbVNVZ63X1z@wAA{Uh
znKR`@#peTqU#^^@{G(U(PBj1i4J&u*7q#8nDY=yS2G<O=vQLKh=II{p<IiF*(%tiz
zX({Md9h0xpY!MCCrlw0D_gOAaj5{>rs=rN;b~2YG)8fia$LH0)6z$B*T=+{od5Rjt
zpVdxx&lxR9xn^V#c;(TSH7bW04m|kseZk}fn;ez-r}OrCu6=79J?U~y5mWevH`(TH
z9li%&WiQ+EVgIa!je-kV*z=}b?RmPaZSK~6^H(X&->htDWAK>y(&nx5%+YtYOq{|X
z)3;YU@0xY3s<QvonQlexUHdj~nXu)Q)As!fS6xpmmbb2$?ljr)ik#T*_9^*+k>6IN
zOwcnvTh-rRvi@!C(ZG-+775njb8j8EaKh~pueaOAX|rbW@ot@I!7{Ni=Ffedxdye`
zd9MmQx^47hu1YTWY?pYUd`aj<PqzrUpQ~SgIu_AqyK4KCfKQB~3wazI`|d~Cy4>{H
z%=V)2*782L)RW6+I6qz?H>F9;e@3~?<s15Co+78W%$fYQYrXQu$r86`O?6~e;a|R1
zrTbZN6Mv4}R>h5`i*pax$z0oF9c32w`r0PlsoUNie~|U)RQHu+yD1#A(j@M1{;|zm
z_3-+f=eAn>7Rk-`zbsp+t9annmTy;d{Fbvk==b7KDOfP8BtePy^nFvMi4%U?>m6DV
zrsy$Wxu-TW&VG*Ep*4BZyPovbO}Tq2yxcj6_jZ!SBfdR7zXCQqp3`8<>#@eEjhV4p
z_*#?XvBz7Oj2J||ypXz4wCL><rYq-dL+14DNow%4c=<|GwlYjv*|t^e)uFe1ku}F0
zH!$BfUA&=^<w0$>mGY*bo9_>p)<*oDduPK#&t-FO%=A9Ap>u0?`@5Y7MOUx5$q+Gd
z=jVA@?afLI{^m6kEWfVZeR;-Y?j7q{HwPSC8^|}oIog9g?b(_W`_<U(zHH-K&Bi8T
zdGh<Bh!4m63@>fzUAuD5y1S>&iB=WgTBtg;&o0g?ZJEMG<)<t~g@L(Ge=yA2uPmKq
zz`tur^{lBChxi=7Jh;H1Fv%{zO0;RCa)C-R)3T>qQ?sWjC+=vn=l9wuf2LZ0<?*N$
zz0C(DZ7rTH@7>lv;~n!p&Gkk#-S!H{-0oRDn-*Z!CO5a&^%+x9h^S3USIQ=#CC$xm
zFN<VfSu5gx(k!}R@dn$EfgTGDuV;QW$yeDlfnP>GD%qMfj*mS_)9jn0#QngUgKBP!
z$5o{AXNb(7Zr3)=Ei`~b(&mbrPtjrZ70i3n&aL>_AG29ZUjMhs*OhLUX1skH`sZlk
z<ZDa#_!xd4{<6|kXW^$~70f%%M)aQA=5dE#!ZeV7M!_q~_hD1FZ98_5eW~u;BY(OD
zPfrR?NH8d#_chOq>oG%9HRHLgS!L(hZ4JZ3e2=e;d-8R)*Y7!-b8Wc~Id0(HDSNys
qL-$kSwt06F9^aeEJ!j6`!;*4Wmbu<rb6Cg1!nADLG4U(^Zvp^g9dY6S

literal 0
HcmV?d00001

diff --git a/mmdetection_practice/demo/simple_demo.py b/mmdetection_practice/demo/simple_demo.py
new file mode 100644
index 0000000..fb79783
--- /dev/null
+++ b/mmdetection_practice/demo/simple_demo.py
@@ -0,0 +1,61 @@
+# Copyright (c) Tencent Inc. All rights reserved.
+import os.path as osp
+
+import cv2
+import torch
+from mmengine.config import Config
+from mmengine.dataset import Compose
+from mmdet.apis import init_detector
+from mmdet.utils import get_test_pipeline_cfg
+
+
+def inference(model, image, texts, test_pipeline, score_thr=0.3, max_dets=100):
+    image = cv2.imread(image)
+    image = image[:, :, [2, 1, 0]]
+    data_info = dict(img=image, img_id=0, texts=texts)
+    data_info = test_pipeline(data_info)
+    data_batch = dict(inputs=data_info['inputs'].unsqueeze(0),
+                      data_samples=[data_info['data_samples']])
+    with torch.no_grad():
+        output = model.test_step(data_batch)[0]
+    pred_instances = output.pred_instances
+    # score thresholding
+    pred_instances = pred_instances[pred_instances.scores.float() > score_thr]
+    # max detections
+    if len(pred_instances.scores) > max_dets:
+        indices = pred_instances.scores.float().topk(max_dets)[1]
+        pred_instances = pred_instances[indices]
+
+    pred_instances = pred_instances.cpu().numpy()
+    boxes = pred_instances['bboxes']
+    labels = pred_instances['labels']
+    scores = pred_instances['scores']
+    label_texts = [texts[x][0] for x in labels]
+    return boxes, labels, label_texts, scores
+
+
+if __name__ == "__main__":
+
+    config_file = "configs/pretrain/yolo_world_v2_x_vlpan_bn_2e-3_100e_4x8gpus_obj365v1_goldg_train_1280ft_lvis_minival.py"
+    checkpoint = "weights/yolo_world_v2_x_obj365v1_goldg_cc3mlite_pretrain_1280ft-14996a36.pth"
+
+    cfg = Config.fromfile(config_file)
+    cfg.work_dir = osp.join('./work_dirs')
+    # init model
+    cfg.load_from = checkpoint
+    model = init_detector(cfg, checkpoint=checkpoint, device='cuda:0')
+    test_pipeline_cfg = get_test_pipeline_cfg(cfg=cfg)
+    test_pipeline_cfg[0].type = 'mmdet.LoadImageFromNDArray'
+    test_pipeline = Compose(test_pipeline_cfg)
+
+    texts = [['person'], ['bus'], [' ']]
+    image = "demo/sample_images/bus.jpg"
+    print(f"starting to detect: {image}")
+    results = inference(model, image, texts, test_pipeline)
+    format_str = [
+        f"obj-{idx}: {box}, label-{lbl}, class-{lbl_text}, score-{score}"
+        for idx, (box, lbl, lbl_text, score) in enumerate(zip(*results))
+    ]
+    print("detecting results:")
+    for q in format_str:
+        print(q)
diff --git a/mmdetection_practice/demo/video_demo.py b/mmdetection_practice/demo/video_demo.py
new file mode 100644
index 0000000..9e6b13e
--- /dev/null
+++ b/mmdetection_practice/demo/video_demo.py
@@ -0,0 +1,108 @@
+# Copyright (c) Tencent Inc. All rights reserved.
+# This file is modifef from mmyolo/demo/video_demo.py
+import argparse
+
+import cv2
+import mmcv
+import torch
+from mmengine.dataset import Compose
+from mmdet.apis import init_detector
+from mmengine.utils import track_iter_progress
+
+from mmyolo.registry import VISUALIZERS
+
+
+def parse_args():
+    parser = argparse.ArgumentParser(description='YOLO-World video demo')
+    parser.add_argument('config', help='Config file')
+    parser.add_argument('checkpoint', help='Checkpoint file')
+    parser.add_argument('video', help='video file path')
+    parser.add_argument(
+        'text',
+        help=
+        'text prompts, including categories separated by a comma or a txt file with each line as a prompt.'
+    )
+    parser.add_argument('--device',
+                        default='cuda:0',
+                        help='device used for inference')
+    parser.add_argument('--score-thr',
+                        default=0.1,
+                        type=float,
+                        help='confidence score threshold for predictions.')
+    parser.add_argument('--out', type=str, help='output video file')
+    args = parser.parse_args()
+    return args
+
+
+def inference_detector(model, image, texts, test_pipeline, score_thr=0.3):
+    data_info = dict(img_id=0, img=image, texts=texts)
+    data_info = test_pipeline(data_info)
+    data_batch = dict(inputs=data_info['inputs'].unsqueeze(0),
+                      data_samples=[data_info['data_samples']])
+
+    with torch.no_grad():
+        output = model.test_step(data_batch)[0]
+        pred_instances = output.pred_instances
+        pred_instances = pred_instances[pred_instances.scores.float() >
+                                        score_thr]
+    output.pred_instances = pred_instances
+    return output
+
+
+def main():
+    args = parse_args()
+
+    model = init_detector(args.config, args.checkpoint, device=args.device)
+
+    # build test pipeline
+    model.cfg.test_dataloader.dataset.pipeline[
+        0].type = 'mmdet.LoadImageFromNDArray'
+    test_pipeline = Compose(model.cfg.test_dataloader.dataset.pipeline)
+
+    if args.text.endswith('.txt'):
+        with open(args.text) as f:
+            lines = f.readlines()
+        texts = [[t.rstrip('\r\n')] for t in lines] + [[' ']]
+    else:
+        texts = [[t.strip()] for t in args.text.split(',')] + [[' ']]
+
+    # reparameterize texts
+    model.reparameterize(texts)
+
+    # init visualizer
+    visualizer = VISUALIZERS.build(model.cfg.visualizer)
+    # the dataset_meta is loaded from the checkpoint and
+    # then pass to the model in init_detector
+    visualizer.dataset_meta = model.dataset_meta
+
+    video_reader = mmcv.VideoReader(args.video)
+    video_writer = None
+    if args.out:
+        fourcc = cv2.VideoWriter_fourcc(*'mp4v')
+        video_writer = cv2.VideoWriter(
+            args.out, fourcc, video_reader.fps,
+            (video_reader.width, video_reader.height))
+
+    for frame in track_iter_progress(video_reader):
+        result = inference_detector(model,
+                                    frame,
+                                    texts,
+                                    test_pipeline,
+                                    score_thr=args.score_thr)
+        visualizer.add_datasample(name='video',
+                                  image=frame,
+                                  data_sample=result,
+                                  draw_gt=False,
+                                  show=False,
+                                  pred_score_thr=args.score_thr)
+        frame = visualizer.get_image()
+
+        if args.out:
+            video_writer.write(frame)
+
+    if video_writer:
+        video_writer.release()
+
+
+if __name__ == '__main__':
+    main()
diff --git a/mmdetection_practice/deploy/__init__.py b/mmdetection_practice/deploy/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/mmdetection_practice/deploy/easydeploy/README.md b/mmdetection_practice/deploy/easydeploy/README.md
new file mode 100644
index 0000000..1816e7e
--- /dev/null
+++ b/mmdetection_practice/deploy/easydeploy/README.md
@@ -0,0 +1,11 @@
+# MMYOLO Model Easy-Deployment
+
+## Introduction
+
+This project is developed for easily converting your MMYOLO models to other inference backends without the need of MMDeploy, which reduces the cost of both time and effort on getting familiar with MMDeploy.
+
+Currently we support converting to `ONNX` and `TensorRT` formats, other inference backends such `ncnn` will be added to this project as well.
+
+## Supported Backends
+
+- [Model Convert](docs/model_convert.md)
diff --git a/mmdetection_practice/deploy/easydeploy/README_zh-CN.md b/mmdetection_practice/deploy/easydeploy/README_zh-CN.md
new file mode 100644
index 0000000..4c6bc0c
--- /dev/null
+++ b/mmdetection_practice/deploy/easydeploy/README_zh-CN.md
@@ -0,0 +1,11 @@
+# MMYOLO 模型转换
+
+## 介绍
+
+本项目作为 MMYOLO 的部署 project 单独存在,意图剥离 MMDeploy 当前的体系,独自支持用户完成模型训练后的转换和部署功能,使用户的学习和工程成本下降。
+
+当前支持对 ONNX 格式和 TensorRT 格式的转换,后续对其他推理平台也会支持起来。
+
+## 转换教程
+
+- [Model Convert](docs/model_convert.md)
diff --git a/mmdetection_practice/deploy/easydeploy/backbone/__init__.py b/mmdetection_practice/deploy/easydeploy/backbone/__init__.py
new file mode 100644
index 0000000..dc167f8
--- /dev/null
+++ b/mmdetection_practice/deploy/easydeploy/backbone/__init__.py
@@ -0,0 +1,5 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from .common import DeployC2f
+from .focus import DeployFocus, GConvFocus, NcnnFocus
+
+__all__ = ['DeployFocus', 'NcnnFocus', 'GConvFocus', 'DeployC2f']
diff --git a/mmdetection_practice/deploy/easydeploy/backbone/common.py b/mmdetection_practice/deploy/easydeploy/backbone/common.py
new file mode 100644
index 0000000..617875b
--- /dev/null
+++ b/mmdetection_practice/deploy/easydeploy/backbone/common.py
@@ -0,0 +1,16 @@
+import torch
+import torch.nn as nn
+from torch import Tensor
+
+
+class DeployC2f(nn.Module):
+
+    def __init__(self, *args, **kwargs):
+        super().__init__()
+
+    def forward(self, x: Tensor) -> Tensor:
+        x_main = self.main_conv(x)
+        x_main = [x_main, x_main[:, self.mid_channels:, ...]]
+        x_main.extend(blocks(x_main[-1]) for blocks in self.blocks)
+        x_main.pop(1)
+        return self.final_conv(torch.cat(x_main, 1))
diff --git a/mmdetection_practice/deploy/easydeploy/backbone/focus.py b/mmdetection_practice/deploy/easydeploy/backbone/focus.py
new file mode 100644
index 0000000..2a19afc
--- /dev/null
+++ b/mmdetection_practice/deploy/easydeploy/backbone/focus.py
@@ -0,0 +1,79 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+import torch
+import torch.nn as nn
+import torch.nn.functional as F
+from torch import Tensor
+
+
+class DeployFocus(nn.Module):
+
+    def __init__(self, orin_Focus: nn.Module):
+        super().__init__()
+        self.__dict__.update(orin_Focus.__dict__)
+
+    def forward(self, x: Tensor) -> Tensor:
+        batch_size, channel, height, width = x.shape
+        x = x.reshape(batch_size, channel, -1, 2, width)
+        x = x.reshape(batch_size, channel, x.shape[2], 2, -1, 2)
+        half_h = x.shape[2]
+        half_w = x.shape[4]
+        x = x.permute(0, 5, 3, 1, 2, 4)
+        x = x.reshape(batch_size, channel * 4, half_h, half_w)
+
+        return self.conv(x)
+
+
+class NcnnFocus(nn.Module):
+
+    def __init__(self, orin_Focus: nn.Module):
+        super().__init__()
+        self.__dict__.update(orin_Focus.__dict__)
+
+    def forward(self, x: Tensor) -> Tensor:
+        batch_size, c, h, w = x.shape
+        assert h % 2 == 0 and w % 2 == 0, f'focus for yolox needs even feature\
+            height and width, got {(h, w)}.'
+
+        x = x.reshape(batch_size, c * h, 1, w)
+        _b, _c, _h, _w = x.shape
+        g = _c // 2
+        # fuse to ncnn's shufflechannel
+        x = x.view(_b, g, 2, _h, _w)
+        x = torch.transpose(x, 1, 2).contiguous()
+        x = x.view(_b, -1, _h, _w)
+
+        x = x.reshape(_b, c * h * w, 1, 1)
+
+        _b, _c, _h, _w = x.shape
+        g = _c // 2
+        # fuse to ncnn's shufflechannel
+        x = x.view(_b, g, 2, _h, _w)
+        x = torch.transpose(x, 1, 2).contiguous()
+        x = x.view(_b, -1, _h, _w)
+
+        x = x.reshape(_b, c * 4, h // 2, w // 2)
+
+        return self.conv(x)
+
+
+class GConvFocus(nn.Module):
+
+    def __init__(self, orin_Focus: nn.Module):
+        super().__init__()
+        device = next(orin_Focus.parameters()).device
+        self.weight1 = torch.tensor([[1., 0], [0, 0]]).expand(3, 1, 2,
+                                                              2).to(device)
+        self.weight2 = torch.tensor([[0, 0], [1., 0]]).expand(3, 1, 2,
+                                                              2).to(device)
+        self.weight3 = torch.tensor([[0, 1.], [0, 0]]).expand(3, 1, 2,
+                                                              2).to(device)
+        self.weight4 = torch.tensor([[0, 0], [0, 1.]]).expand(3, 1, 2,
+                                                              2).to(device)
+        self.__dict__.update(orin_Focus.__dict__)
+
+    def forward(self, x: Tensor) -> Tensor:
+        conv1 = F.conv2d(x, self.weight1, stride=2, groups=3)
+        conv2 = F.conv2d(x, self.weight2, stride=2, groups=3)
+        conv3 = F.conv2d(x, self.weight3, stride=2, groups=3)
+        conv4 = F.conv2d(x, self.weight4, stride=2, groups=3)
+        return self.conv(torch.cat([conv1, conv2, conv3, conv4], dim=1))
diff --git a/mmdetection_practice/deploy/easydeploy/bbox_code/__init__.py b/mmdetection_practice/deploy/easydeploy/bbox_code/__init__.py
new file mode 100644
index 0000000..b85a815
--- /dev/null
+++ b/mmdetection_practice/deploy/easydeploy/bbox_code/__init__.py
@@ -0,0 +1,5 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from .bbox_coder import (rtmdet_bbox_decoder, yolov5_bbox_decoder,
+                         yolox_bbox_decoder)
+
+__all__ = ['yolov5_bbox_decoder', 'rtmdet_bbox_decoder', 'yolox_bbox_decoder']
diff --git a/mmdetection_practice/deploy/easydeploy/bbox_code/bbox_coder.py b/mmdetection_practice/deploy/easydeploy/bbox_code/bbox_coder.py
new file mode 100644
index 0000000..6483cf8
--- /dev/null
+++ b/mmdetection_practice/deploy/easydeploy/bbox_code/bbox_coder.py
@@ -0,0 +1,46 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from typing import Optional
+
+import torch
+from torch import Tensor
+
+
+def yolov5_bbox_decoder(priors: Tensor, bbox_preds: Tensor,
+                        stride: Tensor) -> Tensor:
+    bbox_preds = bbox_preds.sigmoid()
+
+    x_center = (priors[..., 0] + priors[..., 2]) * 0.5
+    y_center = (priors[..., 1] + priors[..., 3]) * 0.5
+    w = priors[..., 2] - priors[..., 0]
+    h = priors[..., 3] - priors[..., 1]
+
+    x_center_pred = (bbox_preds[..., 0] - 0.5) * 2 * stride + x_center
+    y_center_pred = (bbox_preds[..., 1] - 0.5) * 2 * stride + y_center
+    w_pred = (bbox_preds[..., 2] * 2)**2 * w
+    h_pred = (bbox_preds[..., 3] * 2)**2 * h
+
+    decoded_bboxes = torch.stack(
+        [x_center_pred, y_center_pred, w_pred, h_pred], dim=-1)
+
+    return decoded_bboxes
+
+
+def rtmdet_bbox_decoder(priors: Tensor, bbox_preds: Tensor,
+                        stride: Optional[Tensor]) -> Tensor:
+    stride = stride[None, :, None]
+    bbox_preds *= stride
+    tl_x = (priors[..., 0] - bbox_preds[..., 0])
+    tl_y = (priors[..., 1] - bbox_preds[..., 1])
+    br_x = (priors[..., 0] + bbox_preds[..., 2])
+    br_y = (priors[..., 1] + bbox_preds[..., 3])
+    decoded_bboxes = torch.stack([tl_x, tl_y, br_x, br_y], -1)
+    return decoded_bboxes
+
+
+def yolox_bbox_decoder(priors: Tensor, bbox_preds: Tensor,
+                       stride: Optional[Tensor]) -> Tensor:
+    stride = stride[None, :, None]
+    xys = (bbox_preds[..., :2] * stride) + priors
+    whs = bbox_preds[..., 2:].exp() * stride
+    decoded_bboxes = torch.cat([xys, whs], -1)
+    return decoded_bboxes
diff --git a/mmdetection_practice/deploy/easydeploy/deepstream/CMakeLists.txt b/mmdetection_practice/deploy/easydeploy/deepstream/CMakeLists.txt
new file mode 100644
index 0000000..f640bea
--- /dev/null
+++ b/mmdetection_practice/deploy/easydeploy/deepstream/CMakeLists.txt
@@ -0,0 +1,35 @@
+cmake_minimum_required(VERSION 2.8.12)
+
+set(CMAKE_CUDA_ARCHITECTURES 60 61 62 70 72 75 86)
+set(CMAKE_CUDA_COMPILER /usr/local/cuda/bin/nvcc)
+
+project(nvdsparsebbox_mmyolo LANGUAGES CXX)
+
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 -O3 -g -Wall -Werror -shared -fPIC")
+set(CMAKE_CXX_STANDARD 14)
+set(CMAKE_BUILD_TYPE Release)
+option(CUDA_USE_STATIC_CUDA_RUNTIME OFF)
+
+# CUDA
+find_package(CUDA REQUIRED)
+
+# TensorRT
+set(TensorRT_INCLUDE_DIRS "/usr/include/x86_64-linux-gnu" CACHE STRING "TensorRT headers path")
+set(TensorRT_LIBRARIES "/usr/lib/x86_64-linux-gnu" CACHE STRING "TensorRT libs path")
+
+# DeepStream
+set(DEEPSTREAM "/opt/nvidia/deepstream/deepstream" CACHE STRING "DeepStream root path")
+set(DS_LIBRARIES ${DEEPSTREAM}/lib)
+set(DS_INCLUDE_DIRS ${DEEPSTREAM}/sources/includes)
+
+include_directories(
+        ${CUDA_INCLUDE_DIRS}
+        ${TensorRT_INCLUDE_DIRS}
+        ${DS_INCLUDE_DIRS})
+
+add_library(
+        ${PROJECT_NAME}
+        SHARED
+        custom_mmyolo_bbox_parser/nvdsparsebbox_mmyolo.cpp)
+
+target_link_libraries(${PROJECT_NAME} PRIVATE nvinfer nvinfer_plugin)
diff --git a/mmdetection_practice/deploy/easydeploy/deepstream/README.md b/mmdetection_practice/deploy/easydeploy/deepstream/README.md
new file mode 100644
index 0000000..111f376
--- /dev/null
+++ b/mmdetection_practice/deploy/easydeploy/deepstream/README.md
@@ -0,0 +1,48 @@
+# Inference MMYOLO Models with DeepStream
+
+This project demonstrates how to inference MMYOLO models with customized parsers in [DeepStream SDK](https://developer.nvidia.com/deepstream-sdk).
+
+## Pre-requisites
+
+### 1. Install Nvidia Driver and CUDA
+
+First, please follow the official documents and instructions to install dedicated Nvidia graphic driver and CUDA matched to your gpu and target Nvidia AIoT devices.
+
+### 2. Install DeepStream SDK
+
+Second, please follow the official instruction to download and install DeepStream SDK. Currently stable version of DeepStream is v6.2.
+
+### 3. Generate TensorRT Engine
+
+As DeepStream builds on top of several NVIDIA libraries, you need to first convert your trained MMYOLO models to TensorRT engine files. We strongly recommend you to try the supported TensorRT deployment solution in [EasyDeploy](../../easydeploy/).
+
+## Build and Run
+
+Please make sure that your converted TensorRT engine is already located in the `deepstream` folder as the config shows. Create your own model config files and change the `config-file` parameter in [deepstream_app_config.txt](deepstream_app_config.txt) to the model you want to run with.
+
+```bash
+mkdir build && cd build
+cmake ..
+make -j$(nproc) && make install
+```
+
+Then you can run the inference with this command.
+
+```bash
+deepstream-app -c deepstream_app_config.txt
+```
+
+## Code Structure
+
+```bash
+├── deepstream
+│   ├── configs                   # config file for MMYOLO models
+│   │   └── config_infer_rtmdet.txt
+│   ├── custom_mmyolo_bbox_parser # customized parser for MMYOLO models to DeepStream formats
+│   │   └── nvdsparsebbox_mmyolo.cpp
+|   ├── CMakeLists.txt
+│   ├── coco_labels.txt           # labels for coco detection
+│   ├── deepstream_app_config.txt # deepStream reference app configs for MMYOLO models
+│   ├── README_zh-CN.md
+│   └── README.md
+```
diff --git a/mmdetection_practice/deploy/easydeploy/deepstream/README_zh-CN.md b/mmdetection_practice/deploy/easydeploy/deepstream/README_zh-CN.md
new file mode 100644
index 0000000..13a85d5
--- /dev/null
+++ b/mmdetection_practice/deploy/easydeploy/deepstream/README_zh-CN.md
@@ -0,0 +1,48 @@
+# 使用 DeepStream SDK 推理 MMYOLO 模型
+
+本项目演示了如何使用 [DeepStream SDK](https://developer.nvidia.com/deepstream-sdk) 配合改写的 parser 来推理 MMYOLO 的模型。
+
+## 预先准备
+
+### 1. 安装 Nidia 驱动和 CUDA
+
+首先请根据当前的显卡驱动和目标使用设备的驱动完成显卡驱动和 CUDA 的安装。
+
+### 2. 安装 DeepStream SDK
+
+目前 DeepStream SDK 稳定版本已经更新到 v6.2,官方推荐使用这个版本。
+
+### 3. 将 MMYOLO 模型转换为 TensorRT Engine
+
+推荐使用 EasyDeploy 中的 TensorRT 方案完成目标模型的转换部署,具体可参考 [此文档](../../easydeploy/docs/model_convert.md) 。
+
+## 编译使用
+
+当前项目使用的是 MMYOLO 的 rtmdet 模型,若想使用其他的模型,请参照目录下的配置文件进行改写。然后将转换完的 TensorRT engine 放在当前目录下并执行如下命令:
+
+```bash
+mkdir build && cd build
+cmake ..
+make -j$(nproc) && make install
+```
+
+完成编译后可使用如下命令进行推理:
+
+```bash
+deepstream-app -c deepstream_app_config.txt
+```
+
+## 项目代码结构
+
+```bash
+├── deepstream
+│   ├── configs                   # MMYOLO 模型对应的 DeepStream 配置
+│   │   └── config_infer_rtmdet.txt
+│   ├── custom_mmyolo_bbox_parser # 适配 DeepStream formats 的 parser
+│   │   └── nvdsparsebbox_mmyolo.cpp
+|   ├── CMakeLists.txt
+│   ├── coco_labels.txt           # coco labels
+│   ├── deepstream_app_config.txt # DeepStream app 配置
+│   ├── README_zh-CN.md
+│   └── README.md
+```
diff --git a/mmdetection_practice/deploy/easydeploy/deepstream/coco_labels.txt b/mmdetection_practice/deploy/easydeploy/deepstream/coco_labels.txt
new file mode 100644
index 0000000..ca76c80
--- /dev/null
+++ b/mmdetection_practice/deploy/easydeploy/deepstream/coco_labels.txt
@@ -0,0 +1,80 @@
+person
+bicycle
+car
+motorbike
+aeroplane
+bus
+train
+truck
+boat
+traffic light
+fire hydrant
+stop sign
+parking meter
+bench
+bird
+cat
+dog
+horse
+sheep
+cow
+elephant
+bear
+zebra
+giraffe
+backpack
+umbrella
+handbag
+tie
+suitcase
+frisbee
+skis
+snowboard
+sports ball
+kite
+baseball bat
+baseball glove
+skateboard
+surfboard
+tennis racket
+bottle
+wine glass
+cup
+fork
+knife
+spoon
+bowl
+banana
+apple
+sandwich
+orange
+broccoli
+carrot
+hot dog
+pizza
+donut
+cake
+chair
+sofa
+pottedplant
+bed
+diningtable
+toilet
+tvmonitor
+laptop
+mouse
+remote
+keyboard
+cell phone
+microwave
+oven
+toaster
+sink
+refrigerator
+book
+clock
+vase
+scissors
+teddy bear
+hair drier
+toothbrush
diff --git a/mmdetection_practice/deploy/easydeploy/deepstream/configs/config_infer_rtmdet.txt b/mmdetection_practice/deploy/easydeploy/deepstream/configs/config_infer_rtmdet.txt
new file mode 100644
index 0000000..a1e5efd
--- /dev/null
+++ b/mmdetection_practice/deploy/easydeploy/deepstream/configs/config_infer_rtmdet.txt
@@ -0,0 +1,22 @@
+[property]
+gpu-id=0
+net-scale-factor=0.01735207357279195
+offsets=57.375;57.12;58.395
+model-color-format=1
+model-engine-file=../end2end.engine
+labelfile-path=../coco_labels.txt
+batch-size=1
+network-mode=0
+num-detected-classes=80
+interval=0
+gie-unique-id=1
+process-mode=1
+network-type=0
+cluster-mode=2
+maintain-aspect-ratio=1
+parse-bbox-func-name=NvDsInferParseCustomMMYOLO
+custom-lib-path=../build/libnvdsparsebbox_mmyolo.so
+
+[class-attrs-all]
+pre-cluster-threshold=0.45
+topk=100
diff --git a/mmdetection_practice/deploy/easydeploy/deepstream/configs/config_infer_yolov5.txt b/mmdetection_practice/deploy/easydeploy/deepstream/configs/config_infer_yolov5.txt
new file mode 100644
index 0000000..6ad7d64
--- /dev/null
+++ b/mmdetection_practice/deploy/easydeploy/deepstream/configs/config_infer_yolov5.txt
@@ -0,0 +1,21 @@
+[property]
+gpu-id=0
+net-scale-factor=0.0039215697906911373
+model-color-format=0
+model-engine-file=../end2end.engine
+labelfile-path=../coco_labels.txt
+batch-size=1
+network-mode=0
+num-detected-classes=80
+interval=0
+gie-unique-id=1
+process-mode=1
+network-type=0
+cluster-mode=2
+maintain-aspect-ratio=1
+parse-bbox-func-name=NvDsInferParseCustomMMYOLO
+custom-lib-path=../build/libnvdsparsebbox_mmyolo.so
+
+[class-attrs-all]
+pre-cluster-threshold=0.45
+topk=100
diff --git a/mmdetection_practice/deploy/easydeploy/deepstream/configs/config_infer_yolov8.txt b/mmdetection_practice/deploy/easydeploy/deepstream/configs/config_infer_yolov8.txt
new file mode 100644
index 0000000..6ad7d64
--- /dev/null
+++ b/mmdetection_practice/deploy/easydeploy/deepstream/configs/config_infer_yolov8.txt
@@ -0,0 +1,21 @@
+[property]
+gpu-id=0
+net-scale-factor=0.0039215697906911373
+model-color-format=0
+model-engine-file=../end2end.engine
+labelfile-path=../coco_labels.txt
+batch-size=1
+network-mode=0
+num-detected-classes=80
+interval=0
+gie-unique-id=1
+process-mode=1
+network-type=0
+cluster-mode=2
+maintain-aspect-ratio=1
+parse-bbox-func-name=NvDsInferParseCustomMMYOLO
+custom-lib-path=../build/libnvdsparsebbox_mmyolo.so
+
+[class-attrs-all]
+pre-cluster-threshold=0.45
+topk=100
diff --git a/mmdetection_practice/deploy/easydeploy/deepstream/custom_mmyolo_bbox_parser/nvdsparsebbox_mmyolo.cpp b/mmdetection_practice/deploy/easydeploy/deepstream/custom_mmyolo_bbox_parser/nvdsparsebbox_mmyolo.cpp
new file mode 100644
index 0000000..eb78085
--- /dev/null
+++ b/mmdetection_practice/deploy/easydeploy/deepstream/custom_mmyolo_bbox_parser/nvdsparsebbox_mmyolo.cpp
@@ -0,0 +1,118 @@
+#include "nvdsinfer_custom_impl.h"
+#include <cassert>
+#include <iostream>
+
+/**
+ * Function expected by DeepStream for decoding the MMYOLO output.
+ *
+ * C-linkage [extern "C"] was written to prevent name-mangling. This function must return true after
+ * adding all bounding boxes to the objectList vector.
+ *
+ * @param [outputLayersInfo] std::vector of NvDsInferLayerInfo objects with information about the output layer.
+ * @param [networkInfo] NvDsInferNetworkInfo object with information about the MMYOLO network.
+ * @param [detectionParams] NvDsInferParseDetectionParams with information about some config params.
+ * @param [objectList] std::vector of NvDsInferParseObjectInfo objects to which bounding box information must
+ * be stored.
+ *
+ * @return true
+ */
+
+// This is just the function prototype. The definition is written at the end of the file.
+extern "C" bool NvDsInferParseCustomMMYOLO(
+	std::vector<NvDsInferLayerInfo> const& outputLayersInfo,
+	NvDsInferNetworkInfo const& networkInfo,
+	NvDsInferParseDetectionParams const& detectionParams,
+	std::vector<NvDsInferParseObjectInfo>& objectList);
+
+static __inline__ float clamp(float& val, float min, float max)
+{
+	return val > min ? (val < max ? val : max) : min;
+}
+
+static std::vector<NvDsInferParseObjectInfo> decodeMMYoloTensor(
+	const int* num_dets,
+	const float* bboxes,
+	const float* scores,
+	const int* labels,
+	const float& conf_thres,
+	const unsigned int& img_w,
+	const unsigned int& img_h
+)
+{
+	std::vector<NvDsInferParseObjectInfo> bboxInfo;
+	size_t nums = num_dets[0];
+	for (size_t i = 0; i < nums; i++)
+	{
+		float score = scores[i];
+		if (score < conf_thres)continue;
+		float x0 = (bboxes[i * 4]);
+		float y0 = (bboxes[i * 4 + 1]);
+		float x1 = (bboxes[i * 4 + 2]);
+		float y1 = (bboxes[i * 4 + 3]);
+		x0 = clamp(x0, 0.f, img_w);
+		y0 = clamp(y0, 0.f, img_h);
+		x1 = clamp(x1, 0.f, img_w);
+		y1 = clamp(y1, 0.f, img_h);
+		NvDsInferParseObjectInfo obj;
+		obj.left = x0;
+		obj.top = y0;
+		obj.width = x1 - x0;
+		obj.height = y1 - y0;
+		obj.detectionConfidence = score;
+		obj.classId = labels[i];
+		bboxInfo.push_back(obj);
+	}
+
+	return bboxInfo;
+}
+
+/* C-linkage to prevent name-mangling */
+extern "C" bool NvDsInferParseCustomMMYOLO(
+	std::vector<NvDsInferLayerInfo> const& outputLayersInfo,
+	NvDsInferNetworkInfo const& networkInfo,
+	NvDsInferParseDetectionParams const& detectionParams,
+	std::vector<NvDsInferParseObjectInfo>& objectList)
+{
+
+// Some assertions and error checking.
+	if (outputLayersInfo.empty() || outputLayersInfo.size() != 4)
+	{
+		std::cerr << "Could not find output layer in bbox parsing" << std::endl;
+		return false;
+	}
+
+//	Score threshold of bboxes.
+	const float conf_thres = detectionParams.perClassThreshold[0];
+
+// Obtaining the output layer.
+	const NvDsInferLayerInfo& num_dets = outputLayersInfo[0];
+	const NvDsInferLayerInfo& bboxes = outputLayersInfo[1];
+	const NvDsInferLayerInfo& scores = outputLayersInfo[2];
+	const NvDsInferLayerInfo& labels = outputLayersInfo[3];
+
+// num_dets(int) bboxes(float) scores(float) labels(int)
+	assert (num_dets.dims.numDims == 2);
+	assert (bboxes.dims.numDims == 3);
+	assert (scores.dims.numDims == 2);
+	assert (labels.dims.numDims == 2);
+
+
+// Decoding the output tensor of MMYOLO to the NvDsInferParseObjectInfo format.
+	std::vector<NvDsInferParseObjectInfo> objects =
+		decodeMMYoloTensor(
+			(const int*)(num_dets.buffer),
+			(const float*)(bboxes.buffer),
+			(const float*)(scores.buffer),
+			(const int*)(labels.buffer),
+			conf_thres,
+			networkInfo.width,
+			networkInfo.height
+		);
+
+	objectList.clear();
+	objectList = objects;
+	return true;
+}
+
+/* Check that the custom function has been defined correctly */
+CHECK_CUSTOM_PARSE_FUNC_PROTOTYPE(NvDsInferParseCustomMMYOLO);
diff --git a/mmdetection_practice/deploy/easydeploy/deepstream/deepstream_app_config.txt b/mmdetection_practice/deploy/easydeploy/deepstream/deepstream_app_config.txt
new file mode 100644
index 0000000..3317768
--- /dev/null
+++ b/mmdetection_practice/deploy/easydeploy/deepstream/deepstream_app_config.txt
@@ -0,0 +1,62 @@
+[application]
+enable-perf-measurement=1
+perf-measurement-interval-sec=5
+
+[tiled-display]
+enable=1
+rows=1
+columns=1
+width=1280
+height=720
+gpu-id=0
+nvbuf-memory-type=0
+
+[source0]
+enable=1
+type=3
+uri=file:///opt/nvidia/deepstream/deepstream/samples/streams/sample_1080p_h264.mp4
+num-sources=1
+gpu-id=0
+cudadec-memtype=0
+
+[sink0]
+enable=1
+type=2
+sync=0
+gpu-id=0
+nvbuf-memory-type=0
+
+[osd]
+enable=1
+gpu-id=0
+border-width=5
+text-size=15
+text-color=1;1;1;1;
+text-bg-color=0.3;0.3;0.3;1
+font=Serif
+show-clock=0
+clock-x-offset=800
+clock-y-offset=820
+clock-text-size=12
+clock-color=1;0;0;0
+nvbuf-memory-type=0
+
+[streammux]
+gpu-id=0
+live-source=0
+batch-size=1
+batched-push-timeout=40000
+width=1920
+height=1080
+enable-padding=0
+nvbuf-memory-type=0
+
+[primary-gie]
+enable=1
+gpu-id=0
+gie-unique-id=1
+nvbuf-memory-type=0
+config-file=configs/config_infer_rtmdet.txt
+
+[tests]
+file-loop=0
diff --git a/mmdetection_practice/deploy/easydeploy/docs/model_convert.md b/mmdetection_practice/deploy/easydeploy/docs/model_convert.md
new file mode 100644
index 0000000..9af6259
--- /dev/null
+++ b/mmdetection_practice/deploy/easydeploy/docs/model_convert.md
@@ -0,0 +1,156 @@
+# MMYOLO 模型 ONNX 转换
+
+## 1. 导出后端支持的 ONNX
+
+## 环境依赖
+
+- [onnx](https://github.com/onnx/onnx)
+
+  ```shell
+  pip install onnx
+  ```
+
+  [onnx-simplifier](https://github.com/daquexian/onnx-simplifier) (可选,用于简化模型)
+
+  ```shell
+  pip install onnx-simplifier
+  ```
+
+\*\*\* 请确保您在 `MMYOLO` 根目录下运行相关脚本,避免无法找到相关依赖包。\*\*\*
+
+## 使用方法
+
+[模型导出脚本](./projects/easydeploy/tools/export_onnx.py)用于将 `MMYOLO` 模型转换为 `onnx` 。
+
+### 参数介绍:
+
+- `config` : 构建模型使用的配置文件,如 [`yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py`](./configs/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py) 。
+- `checkpoint` : 训练得到的权重文件,如 `yolov5s.pth` 。
+- `--work-dir` : 转换后的模型保存路径。
+- `--img-size`: 转换模型时输入的尺寸,如 `640 640`。
+- `--batch-size`: 转换后的模型输入 `batch size` 。
+- `--device`: 转换模型使用的设备,默认为 `cuda:0`。
+- `--simplify`: 是否简化导出的 `onnx` 模型,需要安装 [onnx-simplifier](https://github.com/daquexian/onnx-simplifier),默认关闭。
+- `--opset`: 指定导出 `onnx` 的 `opset`,默认为 `11` 。
+- `--backend`: 指定导出 `onnx` 用于的后端名称,`ONNXRuntime`: `onnxruntime`, `TensorRT8`: `tensorrt8`, `TensorRT7`: `tensorrt7`,默认为`onnxruntime`即 `ONNXRuntime`。
+- `--pre-topk`: 指定导出 `onnx` 的后处理筛选候选框个数阈值,默认为 `1000`。
+- `--keep-topk`: 指定导出 `onnx` 的非极大值抑制输出的候选框个数阈值,默认为 `100`。
+- `--iou-threshold`: 非极大值抑制中过滤重复候选框的 `iou` 阈值,默认为 `0.65`。
+- `--score-threshold`: 非极大值抑制中过滤候选框得分的阈值,默认为 `0.25`。
+- `--model-only`: 指定仅导出模型 backbone + neck, 不包含后处理,默认关闭。
+
+例子:
+
+```shell
+python ./projects/easydeploy/tools/export.py \
+	configs/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py \
+	yolov5s.pth \
+	--work-dir work_dir \
+    --img-size 640 640 \
+    --batch 1 \
+    --device cpu \
+    --simplify \
+	--opset 11 \
+	--backend 1 \
+	--pre-topk 1000 \
+	--keep-topk 100 \
+	--iou-threshold 0.65 \
+	--score-threshold 0.25
+```
+
+然后利用后端支持的工具如 `TensorRT` 读取 `onnx` 再次转换为后端支持的模型格式如 `.engine/.plan` 等。
+
+`MMYOLO` 目前支持 `TensorRT8`, `TensorRT7`, `ONNXRuntime` 后端的端到端模型转换,目前仅支持静态 shape 模型的导出和转换,动态 batch 或动态长宽的模型端到端转换会在未来继续支持。
+
+端到端转换得到的 `onnx` 模型输入输出如图:
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/92794867/232403745-101ca999-2003-46fa-bc5b-6b0eb2b2d41b.png"/>
+</div>
+
+输入名: `images`, 尺寸 640x640
+
+输出名: `num_dets`, 尺寸 1x1,表示检测目标数量。
+
+输出名: `boxes`, 尺寸 1x100x4,表示检测框的坐标,格式为 `x1y1x2y1`。
+
+输出名: `scores`, 尺寸 1x100,表示检测框的分数。
+
+输出名: `labels`, 尺寸 1x100,表示检测框的类别 id。
+
+可以利用 `num_dets` 中的个数对 `boxes`, `scores`, `labels` 进行截断,从 100 个检测结果中抽取前 `num_dets` 个目标作为最终检测结果。
+
+## 2. 仅导出模型 Backbone + Neck
+
+当您需要部署在非 `TensorRT`, `ONNXRuntime` 等支持端到端部署的平台时,您可以考虑使用`--model-only` 参数并且不要传递 `--backend` 参数,您将会导出仅包含 `Backbone` + `neck` 的模型,模型的部分输出如图:
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/92794867/232406169-40eee9fd-bc53-4fdc-bd37-d0e9033826f9.png"/>
+</div>
+
+这种导出方式获取的 `ONNX` 模型具有如下优点:
+
+- 算子简单,一般而言只包含 `Conv`,激活函数等简单算子,几乎不存在无法正确导出的情况,对于嵌入式部署更加友好。
+- 方便不同算法之间对比速度性能,由于不同的算法后处理不同,仅对比 `backbone` + `Neck` 的速度更加公平。
+
+也有如下缺点:
+
+- 后处理逻辑需要单独完成,会有额外的 `decode` + `nms` 的操作需要实现。
+- 与 `TensorRT` 相比,由于 `TensorRT` 可以利用多核优势并行进行后处理,使用 `--model-only` 方式导出的模型性能会差很多。
+
+### 使用方法
+
+```shell
+python ./projects/easydeploy/tools/export.py \
+	configs/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py \
+	yolov5s.pth \
+	--work-dir work_dir \
+    --img-size 640 640 \
+    --batch 1 \
+    --device cpu \
+    --simplify \
+	--opset 11 \
+	--model-only
+```
+
+## 使用 `model-only` 导出的 ONNX 进行推理
+
+[模型推理脚本](./projects/easydeploy/examples/main_onnxruntime.py)用于推理导出的 `ONNX` 模型,需要安装基础依赖环境:
+
+[`onnxruntime`](https://github.com/microsoft/onnxruntime) 和 [`opencv-python`](https://github.com/opencv/opencv-python)
+
+```shell
+pip install onnxruntime
+pip install opencv-python==4.7.0.72 # 建议使用最新的 opencv
+```
+
+### 参数介绍:
+
+- `img` : 待检测的图片路径或图片文件夹路径。
+- `onnx` : 导出的 `model-only` ONNX 模型。
+- `--type` : 模型名称,目前支持 `yolov5`, `yolox`, `yolov6`, `ppyoloe`, `ppyoloep`, `yolov7`, `rtmdet`, `yolov8`。
+- `--img-size`: 转换模型时输入的尺寸,如 `640 640`。
+- `--out-dir`: 保存检测结果的路径 。
+- `--show`: 是否可视化检测结果。
+- `--score-thr`: 模型检测后处理的置信度分数 。
+- `--iou-thr`: 模型检测后处理的 IOU 分数 。
+
+## 使用方法
+
+```shell
+cd ./projects/easydeploy/examples
+python main_onnxruntime.py \
+	"image_path_to_detect" \
+	yolov5_s_model-only.onnx \
+	--out-dir work_dir \
+    --img-size 640 640 \
+    --show \
+    --score-thr 0.3 \
+    --iou-thr 0.7
+```
+
+*注意!!!*
+
+当您使用自定义数据集训练得到的模型时,请修改 [`config.py`](./projects/easydeploy/examples/config.py) 中 `CLASS_NAMES` 和 `CLASS_COLORS`,如果是 `yolov5` 或者 `yolov7` 基于 `anchor` 的模型请同时修改 `YOLOv5_ANCHORS` 和 `YOLOv7_ANCHORS`。
+
+[`numpy_coder.py`](./projects/easydeploy/examples/numpy_coder.py) 是目前所有算法仅使用 `numpy` 实现的 `decoder`,如果您对性能有较高的要求,可以参照相关代码改写为 `c/c++`。
diff --git a/mmdetection_practice/deploy/easydeploy/examples/config.py b/mmdetection_practice/deploy/easydeploy/examples/config.py
new file mode 100644
index 0000000..4a85ff3
--- /dev/null
+++ b/mmdetection_practice/deploy/easydeploy/examples/config.py
@@ -0,0 +1,64 @@
+from enum import Enum
+
+
+class TASK_TYPE(Enum):
+    DET = 'det'
+    SEG = 'seg'
+    POSE = 'pose'
+
+
+class ModelType(Enum):
+    YOLOV5 = 'yolov5'
+    YOLOX = 'yolox'
+    PPYOLOE = 'ppyoloe'
+    PPYOLOEP = 'ppyoloep'
+    YOLOV6 = 'yolov6'
+    YOLOV7 = 'yolov7'
+    RTMDET = 'rtmdet'
+    YOLOV8 = 'yolov8'
+
+
+CLASS_NAMES = ('person', 'bicycle', 'car', 'motorcycle', 'airplane', 'bus',
+               'train', 'truck', 'boat', 'traffic light', 'fire hydrant',
+               'stop sign', 'parking meter', 'bench', 'bird', 'cat', 'dog',
+               'horse', 'sheep', 'cow', 'elephant', 'bear', 'zebra', 'giraffe',
+               'backpack', 'umbrella', 'handbag', 'tie', 'suitcase', 'frisbee',
+               'skis', 'snowboard', 'sports ball', 'kite', 'baseball bat',
+               'baseball glove', 'skateboard', 'surfboard', 'tennis racket',
+               'bottle', 'wine glass', 'cup', 'fork', 'knife', 'spoon', 'bowl',
+               'banana', 'apple', 'sandwich', 'orange', 'broccoli', 'carrot',
+               'hot dog', 'pizza', 'donut', 'cake', 'chair', 'couch',
+               'potted plant', 'bed', 'dining table', 'toilet', 'tv', 'laptop',
+               'mouse', 'remote', 'keyboard', 'cell phone', 'microwave',
+               'oven', 'toaster', 'sink', 'refrigerator', 'book', 'clock',
+               'vase', 'scissors', 'teddy bear', 'hair drier', 'toothbrush')
+
+CLASS_COLORS = [(220, 20, 60), (119, 11, 32), (0, 0, 142), (0, 0, 230),
+                (106, 0, 228), (0, 60, 100), (0, 80, 100), (0, 0, 70),
+                (0, 0, 192), (250, 170, 30), (100, 170, 30), (220, 220, 0),
+                (175, 116, 175), (250, 0, 30), (165, 42, 42), (255, 77, 255),
+                (0, 226, 252), (182, 182, 255), (0, 82, 0), (120, 166, 157),
+                (110, 76, 0), (174, 57, 255), (199, 100, 0), (72, 0, 118),
+                (255, 179, 240), (0, 125, 92), (209, 0, 151), (188, 208, 182),
+                (0, 220, 176), (255, 99, 164), (92, 0, 73), (133, 129, 255),
+                (78, 180, 255), (0, 228, 0), (174, 255, 243), (45, 89, 255),
+                (134, 134, 103), (145, 148, 174), (255, 208, 186),
+                (197, 226, 255), (171, 134, 1), (109, 63, 54), (207, 138, 255),
+                (151, 0, 95), (9, 80, 61), (84, 105, 51), (74, 65, 105),
+                (166, 196, 102), (208, 195, 210), (255, 109, 65),
+                (0, 143, 149), (179, 0, 194), (209, 99, 106), (5, 121, 0),
+                (227, 255, 205), (147, 186, 208), (153, 69, 1), (3, 95, 161),
+                (163, 255, 0), (119, 0, 170), (0, 182, 199), (0, 165, 120),
+                (183, 130, 88), (95, 32, 0), (130, 114, 135), (110, 129, 133),
+                (166, 74, 118), (219, 142, 185), (79, 210, 114), (178, 90, 62),
+                (65, 70, 15), (127, 167, 115), (59, 105, 106), (142, 108, 45),
+                (196, 172, 0), (95, 54, 80), (128, 76, 255), (201, 57, 1),
+                (246, 0, 122), (191, 162, 208)]
+
+YOLOv5_ANCHORS = [[(10, 13), (16, 30), (33, 23)],
+                  [(30, 61), (62, 45), (59, 119)],
+                  [(116, 90), (156, 198), (373, 326)]]
+
+YOLOv7_ANCHORS = [[(12, 16), (19, 36), (40, 28)],
+                  [(36, 75), (76, 55), (72, 146)],
+                  [(142, 110), (192, 243), (459, 401)]]
diff --git a/mmdetection_practice/deploy/easydeploy/examples/cv2_nms.py b/mmdetection_practice/deploy/easydeploy/examples/cv2_nms.py
new file mode 100644
index 0000000..79e3763
--- /dev/null
+++ b/mmdetection_practice/deploy/easydeploy/examples/cv2_nms.py
@@ -0,0 +1,36 @@
+from typing import List, Tuple, Union
+
+import cv2
+from numpy import ndarray
+
+MAJOR, MINOR = map(int, cv2.__version__.split('.')[:2])
+assert MAJOR == 4
+
+
+def non_max_suppression(boxes: Union[List[ndarray], Tuple[ndarray]],
+                        scores: Union[List[float], Tuple[float]],
+                        labels: Union[List[int], Tuple[int]],
+                        conf_thres: float = 0.25,
+                        iou_thres: float = 0.65) -> Tuple[List, List, List]:
+    if MINOR >= 7:
+        indices = cv2.dnn.NMSBoxesBatched(boxes, scores, labels, conf_thres,
+                                          iou_thres)
+    elif MINOR == 6:
+        indices = cv2.dnn.NMSBoxes(boxes, scores, conf_thres, iou_thres)
+    else:
+        indices = cv2.dnn.NMSBoxes(boxes, scores, conf_thres,
+                                   iou_thres).flatten()
+
+    nmsd_boxes = []
+    nmsd_scores = []
+    nmsd_labels = []
+    for idx in indices:
+        box = boxes[idx]
+        # x0y0wh -> x0y0x1y1
+        box[2:] = box[:2] + box[2:]
+        score = scores[idx]
+        label = labels[idx]
+        nmsd_boxes.append(box)
+        nmsd_scores.append(score)
+        nmsd_labels.append(label)
+    return nmsd_boxes, nmsd_scores, nmsd_labels
diff --git a/mmdetection_practice/deploy/easydeploy/examples/main_onnxruntime.py b/mmdetection_practice/deploy/easydeploy/examples/main_onnxruntime.py
new file mode 100644
index 0000000..bc0ad1b
--- /dev/null
+++ b/mmdetection_practice/deploy/easydeploy/examples/main_onnxruntime.py
@@ -0,0 +1,110 @@
+import math
+import sys
+from argparse import ArgumentParser
+from pathlib import Path
+
+import cv2
+import onnxruntime
+from config import (CLASS_COLORS, CLASS_NAMES, ModelType, YOLOv5_ANCHORS,
+                    YOLOv7_ANCHORS)
+from cv2_nms import non_max_suppression
+from numpy_coder import Decoder
+from preprocess import Preprocess
+from tqdm import tqdm
+
+# Add __FILE__  to sys.path
+sys.path.append(str(Path(__file__).resolve().parents[0]))
+
+IMG_EXTENSIONS = ('.jpg', '.jpeg', '.png', '.ppm', '.bmp', '.pgm', '.tif',
+                  '.tiff', '.webp')
+
+
+def path_to_list(path: str):
+    path = Path(path)
+    if path.is_file() and path.suffix in IMG_EXTENSIONS:
+        res_list = [str(path.absolute())]
+    elif path.is_dir():
+        res_list = [
+            str(p.absolute()) for p in path.iterdir()
+            if p.suffix in IMG_EXTENSIONS
+        ]
+    else:
+        raise RuntimeError
+    return res_list
+
+
+def parse_args():
+    parser = ArgumentParser()
+    parser.add_argument(
+        'img', help='Image path, include image file, dir and URL.')
+    parser.add_argument('onnx', type=str, help='Onnx file')
+    parser.add_argument('--type', type=str, help='Model type')
+    parser.add_argument(
+        '--img-size',
+        nargs='+',
+        type=int,
+        default=[640, 640],
+        help='Image size of height and width')
+    parser.add_argument(
+        '--out-dir', default='./output', type=str, help='Path to output file')
+    parser.add_argument(
+        '--show', action='store_true', help='Show the detection results')
+    parser.add_argument(
+        '--score-thr', type=float, default=0.3, help='Bbox score threshold')
+    parser.add_argument(
+        '--iou-thr', type=float, default=0.7, help='Bbox iou threshold')
+    args = parser.parse_args()
+    return args
+
+
+def main():
+    args = parse_args()
+    out_dir = Path(args.out_dir)
+    model_type = ModelType(args.type.lower())
+
+    if not args.show:
+        out_dir.mkdir(parents=True, exist_ok=True)
+
+    files = path_to_list(args.img)
+    session = onnxruntime.InferenceSession(
+        args.onnx, providers=['CPUExecutionProvider'])
+    preprocessor = Preprocess(model_type)
+    decoder = Decoder(model_type, model_only=True)
+    if model_type == ModelType.YOLOV5:
+        anchors = YOLOv5_ANCHORS
+    elif model_type == ModelType.YOLOV7:
+        anchors = YOLOv7_ANCHORS
+    else:
+        anchors = None
+
+    for file in tqdm(files):
+        image = cv2.imread(file)
+        image_h, image_w = image.shape[:2]
+        img, (ratio_w, ratio_h) = preprocessor(image, args.img_size)
+        features = session.run(None, {'images': img})
+        decoder_outputs = decoder(
+            features,
+            args.score_thr,
+            num_labels=len(CLASS_NAMES),
+            anchors=anchors)
+        nmsd_boxes, nmsd_scores, nmsd_labels = non_max_suppression(
+            *decoder_outputs, args.score_thr, args.iou_thr)
+        for box, score, label in zip(nmsd_boxes, nmsd_scores, nmsd_labels):
+            x0, y0, x1, y1 = box
+            x0 = math.floor(min(max(x0 / ratio_w, 1), image_w - 1))
+            y0 = math.floor(min(max(y0 / ratio_h, 1), image_h - 1))
+            x1 = math.ceil(min(max(x1 / ratio_w, 1), image_w - 1))
+            y1 = math.ceil(min(max(y1 / ratio_h, 1), image_h - 1))
+            cv2.rectangle(image, (x0, y0), (x1, y1), CLASS_COLORS[label], 2)
+            cv2.putText(image, f'{CLASS_NAMES[label]}: {score:.2f}',
+                        (x0, y0 - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5,
+                        (0, 255, 255), 2)
+        if args.show:
+            cv2.imshow('result', image)
+            cv2.waitKey(0)
+        else:
+            cv2.imwrite(f'{out_dir / Path(file).name}', image)
+
+
+if __name__ == '__main__':
+    main()
diff --git a/mmdetection_practice/deploy/easydeploy/examples/numpy_coder.py b/mmdetection_practice/deploy/easydeploy/examples/numpy_coder.py
new file mode 100644
index 0000000..3011965
--- /dev/null
+++ b/mmdetection_practice/deploy/easydeploy/examples/numpy_coder.py
@@ -0,0 +1,309 @@
+from typing import List, Tuple, Union
+
+import numpy as np
+from config import ModelType
+from numpy import ndarray
+
+
+def softmax(x: ndarray, axis: int = -1) -> ndarray:
+    e_x = np.exp(x - np.max(x, axis=axis, keepdims=True))
+    y = e_x / e_x.sum(axis=axis, keepdims=True)
+    return y
+
+
+def sigmoid(x: ndarray) -> ndarray:
+    return 1. / (1. + np.exp(-x))
+
+
+class Decoder:
+
+    def __init__(self, model_type: ModelType, model_only: bool = False):
+        self.model_type = model_type
+        self.model_only = model_only
+        self.boxes_pro = []
+        self.scores_pro = []
+        self.labels_pro = []
+        self.is_logging = False
+
+    def __call__(self,
+                 feats: Union[List, Tuple],
+                 conf_thres: float,
+                 num_labels: int = 80,
+                 **kwargs) -> Tuple:
+        if not self.is_logging:
+            print('Only support decode in batch==1')
+            self.is_logging = True
+        self.boxes_pro.clear()
+        self.scores_pro.clear()
+        self.labels_pro.clear()
+
+        if self.model_only:
+            # transpose channel to last dim for easy decoding
+            feats = [
+                np.ascontiguousarray(feat[0].transpose(1, 2, 0))
+                for feat in feats
+            ]
+        else:
+            # ax620a horizonX3 transpose channel to last dim by default
+            feats = [np.ascontiguousarray(feat) for feat in feats]
+        if self.model_type == ModelType.YOLOV5:
+            self.__yolov5_decode(feats, conf_thres, num_labels, **kwargs)
+        elif self.model_type == ModelType.YOLOX:
+            self.__yolox_decode(feats, conf_thres, num_labels, **kwargs)
+        elif self.model_type in (ModelType.PPYOLOE, ModelType.PPYOLOEP):
+            self.__ppyoloe_decode(feats, conf_thres, num_labels, **kwargs)
+        elif self.model_type == ModelType.YOLOV6:
+            self.__yolov6_decode(feats, conf_thres, num_labels, **kwargs)
+        elif self.model_type == ModelType.YOLOV7:
+            self.__yolov7_decode(feats, conf_thres, num_labels, **kwargs)
+        elif self.model_type == ModelType.RTMDET:
+            self.__rtmdet_decode(feats, conf_thres, num_labels, **kwargs)
+        elif self.model_type == ModelType.YOLOV8:
+            self.__yolov8_decode(feats, conf_thres, num_labels, **kwargs)
+        else:
+            raise NotImplementedError
+        return self.boxes_pro, self.scores_pro, self.labels_pro
+
+    def __yolov5_decode(self,
+                        feats: List[ndarray],
+                        conf_thres: float,
+                        num_labels: int = 80,
+                        **kwargs):
+        anchors: Union[List, Tuple] = kwargs.get(
+            'anchors',
+            [[(10, 13), (16, 30),
+              (33, 23)], [(30, 61), (62, 45),
+                          (59, 119)], [(116, 90), (156, 198), (373, 326)]])
+        for i, feat in enumerate(feats):
+            stride = 8 << i
+            feat_h, feat_w, _ = feat.shape
+            anchor = anchors[i]
+            feat = sigmoid(feat)
+            feat = feat.reshape((feat_h, feat_w, len(anchor), -1))
+            box_feat, conf_feat, score_feat = np.split(feat, [4, 5], -1)
+
+            hIdx, wIdx, aIdx, _ = np.where(conf_feat > conf_thres)
+
+            num_proposal = hIdx.size
+            if not num_proposal:
+                continue
+
+            score_feat = score_feat[hIdx, wIdx, aIdx] * conf_feat[hIdx, wIdx,
+                                                                  aIdx]
+            boxes = box_feat[hIdx, wIdx, aIdx]
+            labels = score_feat.argmax(-1)
+            scores = score_feat.max(-1)
+
+            indices = np.where(scores > conf_thres)[0]
+            if len(indices) == 0:
+                continue
+
+            for idx in indices:
+                a_w, a_h = anchor[aIdx[idx]]
+                x, y, w, h = boxes[idx]
+                x = (x * 2.0 - 0.5 + wIdx[idx]) * stride
+                y = (y * 2.0 - 0.5 + hIdx[idx]) * stride
+                w = (w * 2.0)**2 * a_w
+                h = (h * 2.0)**2 * a_h
+
+                x0 = x - w / 2
+                y0 = y - h / 2
+
+                self.scores_pro.append(float(scores[idx]))
+                self.boxes_pro.append(
+                    np.array([x0, y0, w, h], dtype=np.float32))
+                self.labels_pro.append(int(labels[idx]))
+
+    def __yolox_decode(self,
+                       feats: List[ndarray],
+                       conf_thres: float,
+                       num_labels: int = 80,
+                       **kwargs):
+        for i, feat in enumerate(feats):
+            stride = 8 << i
+            score_feat, box_feat, conf_feat = np.split(
+                feat, [num_labels, num_labels + 4], -1)
+            conf_feat = sigmoid(conf_feat)
+
+            hIdx, wIdx, _ = np.where(conf_feat > conf_thres)
+
+            num_proposal = hIdx.size
+            if not num_proposal:
+                continue
+
+            score_feat = sigmoid(score_feat[hIdx, wIdx]) * conf_feat[hIdx,
+                                                                     wIdx]
+            boxes = box_feat[hIdx, wIdx]
+            labels = score_feat.argmax(-1)
+            scores = score_feat.max(-1)
+            indices = np.where(scores > conf_thres)[0]
+
+            if len(indices) == 0:
+                continue
+
+            for idx in indices:
+                score = scores[idx]
+                label = labels[idx]
+
+                x, y, w, h = boxes[idx]
+
+                x = (x + wIdx[idx]) * stride
+                y = (y + hIdx[idx]) * stride
+                w = np.exp(w) * stride
+                h = np.exp(h) * stride
+
+                x0 = x - w / 2
+                y0 = y - h / 2
+
+                self.scores_pro.append(float(score))
+                self.boxes_pro.append(
+                    np.array([x0, y0, w, h], dtype=np.float32))
+                self.labels_pro.append(int(label))
+
+    def __ppyoloe_decode(self,
+                         feats: List[ndarray],
+                         conf_thres: float,
+                         num_labels: int = 80,
+                         **kwargs):
+        reg_max: int = kwargs.get('reg_max', 17)
+        dfl = np.arange(0, reg_max, dtype=np.float32)
+        for i, feat in enumerate(feats):
+            stride = 8 << i
+            score_feat, box_feat = np.split(feat, [
+                num_labels,
+            ], -1)
+            score_feat = sigmoid(score_feat)
+            _argmax = score_feat.argmax(-1)
+            _max = score_feat.max(-1)
+            indices = np.where(_max > conf_thres)
+            hIdx, wIdx = indices
+            num_proposal = hIdx.size
+            if not num_proposal:
+                continue
+
+            scores = _max[hIdx, wIdx]
+            boxes = box_feat[hIdx, wIdx].reshape(num_proposal, 4, reg_max)
+            boxes = softmax(boxes, -1) @ dfl
+            labels = _argmax[hIdx, wIdx]
+
+            for k in range(num_proposal):
+                score = scores[k]
+                label = labels[k]
+
+                x0, y0, x1, y1 = boxes[k]
+
+                x0 = (wIdx[k] + 0.5 - x0) * stride
+                y0 = (hIdx[k] + 0.5 - y0) * stride
+                x1 = (wIdx[k] + 0.5 + x1) * stride
+                y1 = (hIdx[k] + 0.5 + y1) * stride
+
+                w = x1 - x0
+                h = y1 - y0
+
+                self.scores_pro.append(float(score))
+                self.boxes_pro.append(
+                    np.array([x0, y0, w, h], dtype=np.float32))
+                self.labels_pro.append(int(label))
+
+    def __yolov6_decode(self,
+                        feats: List[ndarray],
+                        conf_thres: float,
+                        num_labels: int = 80,
+                        **kwargs):
+        for i, feat in enumerate(feats):
+            stride = 8 << i
+            score_feat, box_feat = np.split(feat, [
+                num_labels,
+            ], -1)
+            score_feat = sigmoid(score_feat)
+            _argmax = score_feat.argmax(-1)
+            _max = score_feat.max(-1)
+            indices = np.where(_max > conf_thres)
+            hIdx, wIdx = indices
+            num_proposal = hIdx.size
+            if not num_proposal:
+                continue
+
+            scores = _max[hIdx, wIdx]
+            boxes = box_feat[hIdx, wIdx]
+            labels = _argmax[hIdx, wIdx]
+
+            for k in range(num_proposal):
+                score = scores[k]
+                label = labels[k]
+
+                x0, y0, x1, y1 = boxes[k]
+
+                x0 = (wIdx[k] + 0.5 - x0) * stride
+                y0 = (hIdx[k] + 0.5 - y0) * stride
+                x1 = (wIdx[k] + 0.5 + x1) * stride
+                y1 = (hIdx[k] + 0.5 + y1) * stride
+
+                w = x1 - x0
+                h = y1 - y0
+
+                self.scores_pro.append(float(score))
+                self.boxes_pro.append(
+                    np.array([x0, y0, w, h], dtype=np.float32))
+                self.labels_pro.append(int(label))
+
+    def __yolov7_decode(self,
+                        feats: List[ndarray],
+                        conf_thres: float,
+                        num_labels: int = 80,
+                        **kwargs):
+        anchors: Union[List, Tuple] = kwargs.get(
+            'anchors',
+            [[(12, 16), (19, 36),
+              (40, 28)], [(36, 75), (76, 55),
+                          (72, 146)], [(142, 110), (192, 243), (459, 401)]])
+        self.__yolov5_decode(feats, conf_thres, num_labels, anchors=anchors)
+
+    def __rtmdet_decode(self,
+                        feats: List[ndarray],
+                        conf_thres: float,
+                        num_labels: int = 80,
+                        **kwargs):
+        for i, feat in enumerate(feats):
+            stride = 8 << i
+            score_feat, box_feat = np.split(feat, [
+                num_labels,
+            ], -1)
+            score_feat = sigmoid(score_feat)
+            _argmax = score_feat.argmax(-1)
+            _max = score_feat.max(-1)
+            indices = np.where(_max > conf_thres)
+            hIdx, wIdx = indices
+            num_proposal = hIdx.size
+            if not num_proposal:
+                continue
+
+            scores = _max[hIdx, wIdx]
+            boxes = box_feat[hIdx, wIdx]
+            labels = _argmax[hIdx, wIdx]
+
+            for k in range(num_proposal):
+                score = scores[k]
+                label = labels[k]
+
+                x0, y0, x1, y1 = boxes[k]
+
+                x0 = (wIdx[k] - x0) * stride
+                y0 = (hIdx[k] - y0) * stride
+                x1 = (wIdx[k] + x1) * stride
+                y1 = (hIdx[k] + y1) * stride
+
+                w = x1 - x0
+                h = y1 - y0
+
+                self.scores_pro.append(float(score))
+                self.boxes_pro.append(
+                    np.array([x0, y0, w, h], dtype=np.float32))
+                self.labels_pro.append(int(label))
+
+    def __yolov8_decode(self,
+                        feats: List[ndarray],
+                        conf_thres: float,
+                        num_labels: int = 80,
+                        **kwargs):
+        self.__yolov6_decode(feats, conf_thres, num_labels)
diff --git a/mmdetection_practice/deploy/easydeploy/examples/preprocess.py b/mmdetection_practice/deploy/easydeploy/examples/preprocess.py
new file mode 100644
index 0000000..6b6fb56
--- /dev/null
+++ b/mmdetection_practice/deploy/easydeploy/examples/preprocess.py
@@ -0,0 +1,57 @@
+from typing import List, Tuple, Union
+
+import cv2
+import numpy as np
+from config import ModelType
+from numpy import ndarray
+
+
+class Preprocess:
+
+    def __init__(self, model_type: ModelType):
+        if model_type in (ModelType.YOLOV5, ModelType.YOLOV6, ModelType.YOLOV7,
+                          ModelType.YOLOV8):
+            mean = np.array([0, 0, 0], dtype=np.float32)
+            std = np.array([255, 255, 255], dtype=np.float32)
+            is_rgb = True
+        elif model_type == ModelType.YOLOX:
+            mean = np.array([0, 0, 0], dtype=np.float32)
+            std = np.array([1, 1, 1], dtype=np.float32)
+            is_rgb = False
+        elif model_type == ModelType.PPYOLOE:
+            mean = np.array([123.675, 116.28, 103.53], dtype=np.float32)
+            std = np.array([58.395, 57.12, 57.375], dtype=np.float32)
+            is_rgb = True
+
+        elif model_type == ModelType.PPYOLOEP:
+            mean = np.array([0, 0, 0], dtype=np.float32)
+            std = np.array([255, 255, 255], dtype=np.float32)
+            is_rgb = True
+        elif model_type == ModelType.RTMDET:
+            mean = np.array([103.53, 116.28, 123.675], dtype=np.float32)
+            std = np.array([57.375, 57.12, 58.3955], dtype=np.float32)
+            is_rgb = False
+        else:
+            raise NotImplementedError
+
+        self.mean = mean.reshape((3, 1, 1))
+        self.std = std.reshape((3, 1, 1))
+        self.is_rgb = is_rgb
+
+    def __call__(self,
+                 image: ndarray,
+                 new_size: Union[List[int], Tuple[int]] = (640, 640),
+                 **kwargs) -> Tuple[ndarray, Tuple[float, float]]:
+        # new_size: (height, width)
+        height, width = image.shape[:2]
+        ratio_h, ratio_w = new_size[0] / height, new_size[1] / width
+        image = cv2.resize(
+            image, (0, 0),
+            fx=ratio_w,
+            fy=ratio_h,
+            interpolation=cv2.INTER_LINEAR)
+        image = np.ascontiguousarray(image.transpose(2, 0, 1))
+        image = image.astype(np.float32)
+        image -= self.mean
+        image /= self.std
+        return image[np.newaxis], (ratio_w, ratio_h)
diff --git a/mmdetection_practice/deploy/easydeploy/examples/requirements.txt b/mmdetection_practice/deploy/easydeploy/examples/requirements.txt
new file mode 100644
index 0000000..0b76118
--- /dev/null
+++ b/mmdetection_practice/deploy/easydeploy/examples/requirements.txt
@@ -0,0 +1,2 @@
+onnxruntime
+opencv-python==4.7.0.72
diff --git a/mmdetection_practice/deploy/easydeploy/model/__init__.py b/mmdetection_practice/deploy/easydeploy/model/__init__.py
new file mode 100644
index 0000000..38af8bc
--- /dev/null
+++ b/mmdetection_practice/deploy/easydeploy/model/__init__.py
@@ -0,0 +1,6 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from .backend import MMYOLOBackend
+from .backendwrapper import ORTWrapper, TRTWrapper
+from .model import DeployModel
+
+__all__ = ['DeployModel', 'TRTWrapper', 'ORTWrapper', 'MMYOLOBackend']
diff --git a/mmdetection_practice/deploy/easydeploy/model/backend.py b/mmdetection_practice/deploy/easydeploy/model/backend.py
new file mode 100644
index 0000000..64d6e3f
--- /dev/null
+++ b/mmdetection_practice/deploy/easydeploy/model/backend.py
@@ -0,0 +1,23 @@
+from enum import Enum
+
+import torch
+import torch.nn.functional as F
+
+
+class MMYOLOBackend(Enum):
+    AX620A = 'ax620a'
+    COREML = 'coreml'
+    HORIZONX3 = 'horizonx3'
+    NCNN = 'ncnn'
+    ONNXRUNTIME = 'onnxruntime'
+    OPENVINO = 'openvino'
+    PPLNN = 'pplnn'
+    RKNN = 'rknn'
+    TENSORRT8 = 'tensorrt8'
+    TENSORRT7 = 'tensorrt7'
+    TORCHSCRIPT = 'torchscript'
+    TVM = 'tvm'
+
+
+def HSigmoid__forward(self, x: torch.Tensor) -> torch.Tensor:
+    return F.hardsigmoid(x, inplace=True)
diff --git a/mmdetection_practice/deploy/easydeploy/model/backendwrapper.py b/mmdetection_practice/deploy/easydeploy/model/backendwrapper.py
new file mode 100644
index 0000000..2997d84
--- /dev/null
+++ b/mmdetection_practice/deploy/easydeploy/model/backendwrapper.py
@@ -0,0 +1,202 @@
+import warnings
+from collections import namedtuple
+from functools import partial
+from pathlib import Path
+from typing import List, Optional, Union
+
+import numpy as np
+import onnxruntime
+
+try:
+    import tensorrt as trt
+except Exception:
+    trt = None
+import torch
+
+warnings.filterwarnings(action='ignore', category=DeprecationWarning)
+
+
+class TRTWrapper(torch.nn.Module):
+    dtype_mapping = {}
+
+    def __init__(self, weight: Union[str, Path],
+                 device: Optional[torch.device]):
+        super().__init__()
+        weight = Path(weight) if isinstance(weight, str) else weight
+        assert weight.exists() and weight.suffix in ('.engine', '.plan')
+        if isinstance(device, str):
+            device = torch.device(device)
+        elif isinstance(device, int):
+            device = torch.device(f'cuda:{device}')
+        self.weight = weight
+        self.device = device
+        self.stream = torch.cuda.Stream(device=device)
+        self.__update_mapping()
+        self.__init_engine()
+        self.__init_bindings()
+
+    def __update_mapping(self):
+        self.dtype_mapping.update({
+            trt.bool: torch.bool,
+            trt.int8: torch.int8,
+            trt.int32: torch.int32,
+            trt.float16: torch.float16,
+            trt.float32: torch.float32
+        })
+
+    def __init_engine(self):
+        logger = trt.Logger(trt.Logger.ERROR)
+        self.log = partial(logger.log, trt.Logger.ERROR)
+        trt.init_libnvinfer_plugins(logger, namespace='')
+        self.logger = logger
+        with trt.Runtime(logger) as runtime:
+            model = runtime.deserialize_cuda_engine(self.weight.read_bytes())
+
+        context = model.create_execution_context()
+
+        names = [model.get_binding_name(i) for i in range(model.num_bindings)]
+
+        num_inputs, num_outputs = 0, 0
+
+        for i in range(model.num_bindings):
+            if model.binding_is_input(i):
+                num_inputs += 1
+            else:
+                num_outputs += 1
+
+        self.is_dynamic = -1 in model.get_binding_shape(0)
+
+        self.model = model
+        self.context = context
+        self.input_names = names[:num_inputs]
+        self.output_names = names[num_inputs:]
+        self.num_inputs = num_inputs
+        self.num_outputs = num_outputs
+        self.num_bindings = num_inputs + num_outputs
+        self.bindings: List[int] = [0] * self.num_bindings
+
+    def __init_bindings(self):
+        Binding = namedtuple('Binding', ('name', 'dtype', 'shape'))
+        inputs_info = []
+        outputs_info = []
+
+        for i, name in enumerate(self.input_names):
+            assert self.model.get_binding_name(i) == name
+            dtype = self.dtype_mapping[self.model.get_binding_dtype(i)]
+            shape = tuple(self.model.get_binding_shape(i))
+            inputs_info.append(Binding(name, dtype, shape))
+
+        for i, name in enumerate(self.output_names):
+            i += self.num_inputs
+            assert self.model.get_binding_name(i) == name
+            dtype = self.dtype_mapping[self.model.get_binding_dtype(i)]
+            shape = tuple(self.model.get_binding_shape(i))
+            outputs_info.append(Binding(name, dtype, shape))
+        self.inputs_info = inputs_info
+        self.outputs_info = outputs_info
+        if not self.is_dynamic:
+            self.output_tensor = [
+                torch.empty(o.shape, dtype=o.dtype, device=self.device)
+                for o in outputs_info
+            ]
+
+    def forward(self, *inputs):
+
+        assert len(inputs) == self.num_inputs
+
+        contiguous_inputs: List[torch.Tensor] = [
+            i.contiguous() for i in inputs
+        ]
+
+        for i in range(self.num_inputs):
+            self.bindings[i] = contiguous_inputs[i].data_ptr()
+            if self.is_dynamic:
+                self.context.set_binding_shape(
+                    i, tuple(contiguous_inputs[i].shape))
+
+        # create output tensors
+        outputs: List[torch.Tensor] = []
+
+        for i in range(self.num_outputs):
+            j = i + self.num_inputs
+            if self.is_dynamic:
+                shape = tuple(self.context.get_binding_shape(j))
+                output = torch.empty(
+                    size=shape,
+                    dtype=self.output_dtypes[i],
+                    device=self.device)
+
+            else:
+                output = self.output_tensor[i]
+            outputs.append(output)
+            self.bindings[j] = output.data_ptr()
+
+        self.context.execute_async_v2(self.bindings, self.stream.cuda_stream)
+        self.stream.synchronize()
+
+        return tuple(outputs)
+
+
+class ORTWrapper(torch.nn.Module):
+
+    def __init__(self, weight: Union[str, Path],
+                 device: Optional[torch.device]):
+        super().__init__()
+        weight = Path(weight) if isinstance(weight, str) else weight
+        assert weight.exists() and weight.suffix == '.onnx'
+
+        if isinstance(device, str):
+            device = torch.device(device)
+        elif isinstance(device, int):
+            device = torch.device(f'cuda:{device}')
+        self.weight = weight
+        self.device = device
+        self.__init_session()
+        self.__init_bindings()
+
+    def __init_session(self):
+        providers = ['CPUExecutionProvider']
+        if 'cuda' in self.device.type:
+            providers.insert(0, 'CUDAExecutionProvider')
+
+        session = onnxruntime.InferenceSession(
+            str(self.weight), providers=providers)
+        self.session = session
+
+    def __init_bindings(self):
+        Binding = namedtuple('Binding', ('name', 'dtype', 'shape'))
+        inputs_info = []
+        outputs_info = []
+        self.is_dynamic = False
+        for i, tensor in enumerate(self.session.get_inputs()):
+            if any(not isinstance(i, int) for i in tensor.shape):
+                self.is_dynamic = True
+            inputs_info.append(
+                Binding(tensor.name, tensor.type, tuple(tensor.shape)))
+
+        for i, tensor in enumerate(self.session.get_outputs()):
+            outputs_info.append(
+                Binding(tensor.name, tensor.type, tuple(tensor.shape)))
+        self.inputs_info = inputs_info
+        self.outputs_info = outputs_info
+        self.num_inputs = len(inputs_info)
+
+    def forward(self, *inputs):
+
+        assert len(inputs) == self.num_inputs
+
+        contiguous_inputs: List[np.ndarray] = [
+            i.contiguous().cpu().numpy() for i in inputs
+        ]
+
+        if not self.is_dynamic:
+            # make sure input shape is right for static input shape
+            for i in range(self.num_inputs):
+                assert contiguous_inputs[i].shape == self.inputs_info[i].shape
+
+        outputs = self.session.run([o.name for o in self.outputs_info], {
+            j.name: contiguous_inputs[i]
+            for i, j in enumerate(self.inputs_info)
+        })
+
+        return tuple(torch.from_numpy(o).to(self.device) for o in outputs)
diff --git a/mmdetection_practice/deploy/easydeploy/model/model.py b/mmdetection_practice/deploy/easydeploy/model/model.py
new file mode 100644
index 0000000..21cf50f
--- /dev/null
+++ b/mmdetection_practice/deploy/easydeploy/model/model.py
@@ -0,0 +1,217 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from copy import deepcopy
+from functools import partial
+from typing import List, Optional, Tuple
+
+import torch
+import torch.nn as nn
+from mmdet.models.backbones.csp_darknet import Focus
+from mmdet.models.layers import ChannelAttention
+from mmengine.config import ConfigDict
+from torch import Tensor
+
+from mmyolo.models import RepVGGBlock
+from mmyolo.models.dense_heads import (PPYOLOEHead, RTMDetHead, YOLOv5Head,
+                                       YOLOv7Head, YOLOv8Head, YOLOXHead)
+from mmyolo.models.layers import ImplicitA, ImplicitM
+from ..backbone import DeployFocus, GConvFocus, NcnnFocus
+from ..bbox_code import (rtmdet_bbox_decoder, yolov5_bbox_decoder,
+                         yolox_bbox_decoder)
+from ..nms import batched_nms, efficient_nms, onnx_nms
+from .backend import MMYOLOBackend
+
+
+class DeployModel(nn.Module):
+    transpose = False
+
+    def __init__(self,
+                 baseModel: nn.Module,
+                 backend: MMYOLOBackend,
+                 postprocess_cfg: Optional[ConfigDict] = None,
+                 with_nms=True,
+                 without_bbox_decoder=False):
+        super().__init__()
+        self.baseModel = baseModel
+        self.baseHead = baseModel.bbox_head
+        self.backend = backend
+        self.with_nms = with_nms
+        self.without_bbox_decoder = without_bbox_decoder
+        if postprocess_cfg is None:
+            self.with_postprocess = False
+        else:
+            self.with_postprocess = True
+            self.__init_sub_attributes()
+            self.detector_type = type(self.baseHead)
+            self.pre_top_k = postprocess_cfg.get('pre_top_k', 1000)
+            self.keep_top_k = postprocess_cfg.get('keep_top_k', 100)
+            self.iou_threshold = postprocess_cfg.get('iou_threshold', 0.65)
+            self.score_threshold = postprocess_cfg.get('score_threshold', 0.25)
+        self.__switch_deploy()
+
+    def __init_sub_attributes(self):
+        self.bbox_decoder = self.baseHead.bbox_coder.decode
+        self.prior_generate = self.baseHead.prior_generator.grid_priors
+        self.num_base_priors = self.baseHead.num_base_priors
+        self.featmap_strides = self.baseHead.featmap_strides
+        self.num_classes = self.baseHead.num_classes
+
+    def __switch_deploy(self):
+        headType = type(self.baseHead)
+        if not self.with_postprocess:
+            if headType in (YOLOv5Head, YOLOv7Head):
+                self.baseHead.head_module.forward_single = self.forward_single
+            elif headType in (PPYOLOEHead, YOLOv8Head):
+                self.baseHead.head_module.reg_max = 0
+
+        if self.backend in (MMYOLOBackend.HORIZONX3, MMYOLOBackend.NCNN,
+                            MMYOLOBackend.TORCHSCRIPT):
+            self.transpose = True
+        for layer in self.baseModel.modules():
+            if isinstance(layer, RepVGGBlock):
+                layer.switch_to_deploy()
+            elif isinstance(layer, ChannelAttention):
+                layer.global_avgpool.forward = self.forward_gvp
+            elif isinstance(layer, Focus):
+                # onnxruntime openvino tensorrt8 tensorrt7
+                if self.backend in (MMYOLOBackend.ONNXRUNTIME,
+                                    MMYOLOBackend.OPENVINO,
+                                    MMYOLOBackend.TENSORRT8,
+                                    MMYOLOBackend.TENSORRT7):
+                    self.baseModel.backbone.stem = DeployFocus(layer)
+                # ncnn
+                elif self.backend == MMYOLOBackend.NCNN:
+                    self.baseModel.backbone.stem = NcnnFocus(layer)
+                # switch focus to group conv
+                else:
+                    self.baseModel.backbone.stem = GConvFocus(layer)
+
+    def pred_by_feat(self,
+                     cls_scores: List[Tensor],
+                     bbox_preds: List[Tensor],
+                     objectnesses: Optional[List[Tensor]] = None,
+                     coeff_preds: Optional[List[Tensor]] = None,
+                     proto_preds: Optional[List[Tensor]] = None,
+                     **kwargs):
+        assert len(cls_scores) == len(bbox_preds)
+        dtype = cls_scores[0].dtype
+        device = cls_scores[0].device
+
+        nms_func = self.select_nms()
+        if self.detector_type in (YOLOv5Head, YOLOv7Head):
+            bbox_decoder = yolov5_bbox_decoder
+        elif self.detector_type is RTMDetHead:
+            bbox_decoder = rtmdet_bbox_decoder
+        elif self.detector_type is YOLOXHead:
+            bbox_decoder = yolox_bbox_decoder
+        else:
+            bbox_decoder = self.bbox_decoder
+        print(bbox_decoder)
+        
+        num_imgs = cls_scores[0].shape[0]
+        featmap_sizes = [cls_score.shape[2:] for cls_score in cls_scores]
+
+        mlvl_priors = self.prior_generate(featmap_sizes,
+                                          dtype=dtype,
+                                          device=device)
+
+        flatten_priors = torch.cat(mlvl_priors)
+        mlvl_strides = [
+            flatten_priors.new_full(
+                (featmap_size[0] * featmap_size[1] * self.num_base_priors, ),
+                stride) for featmap_size, stride in zip(
+                    featmap_sizes, self.featmap_strides)
+        ]
+        flatten_stride = torch.cat(mlvl_strides)
+
+        text_len = cls_scores[0].shape[1]
+        flatten_cls_scores = [
+            cls_score.permute(0, 2, 3, 1).reshape(num_imgs, -1, text_len)
+            for cls_score in cls_scores
+        ]
+        cls_scores = torch.cat(flatten_cls_scores, dim=1).sigmoid()
+
+        flatten_bbox_preds = [
+            bbox_pred.permute(0, 2, 3, 1).reshape(num_imgs, -1, 4)
+            for bbox_pred in bbox_preds
+        ]
+        flatten_bbox_preds = torch.cat(flatten_bbox_preds, dim=1)
+
+        if objectnesses is not None:
+            flatten_objectness = [
+                objectness.permute(0, 2, 3, 1).reshape(num_imgs, -1)
+                for objectness in objectnesses
+            ]
+            flatten_objectness = torch.cat(flatten_objectness, dim=1).sigmoid()
+            cls_scores = cls_scores * (flatten_objectness.unsqueeze(-1))
+
+        scores = cls_scores
+        bboxes = flatten_bbox_preds
+        if self.without_bbox_decoder:
+            return scores, bboxes
+        bboxes = bbox_decoder(flatten_priors[None], flatten_bbox_preds,
+                              flatten_stride)
+
+        if self.with_nms:
+            return nms_func(bboxes, scores, self.keep_top_k,
+                            self.iou_threshold, self.score_threshold,
+                            self.pre_top_k, self.keep_top_k)
+        else:
+            return scores, bboxes
+
+    def select_nms(self):
+        if self.backend in (MMYOLOBackend.ONNXRUNTIME, MMYOLOBackend.OPENVINO):
+            nms_func = onnx_nms
+        elif self.backend == MMYOLOBackend.TENSORRT8:
+            nms_func = efficient_nms
+        elif self.backend == MMYOLOBackend.TENSORRT7:
+            nms_func = batched_nms
+        else:
+            raise NotImplementedError
+        if type(self.baseHead) in (YOLOv5Head, YOLOv7Head, YOLOXHead):
+            nms_func = partial(nms_func, box_coding=1)
+
+        return nms_func
+
+    def forward(self, inputs: Tensor):
+        neck_outputs = self.baseModel(inputs)
+        if self.with_postprocess:
+            return self.pred_by_feat(*neck_outputs)
+        else:
+            outputs = []
+            if self.transpose:
+                for feats in zip(*neck_outputs):
+                    if self.backend in (MMYOLOBackend.NCNN,
+                                        MMYOLOBackend.TORCHSCRIPT):
+                        outputs.append(
+                            torch.cat(
+                                [feat.permute(0, 2, 3, 1) for feat in feats],
+                                -1))
+                    else:
+                        outputs.append(torch.cat(feats, 1).permute(0, 2, 3, 1))
+            else:
+                for feats in zip(*neck_outputs):
+                    outputs.append(torch.cat(feats, 1))
+            return tuple(outputs)
+
+    @staticmethod
+    def forward_single(x: Tensor, convs: nn.Module) -> Tuple[Tensor]:
+        if isinstance(convs, nn.Sequential) and any(
+                type(m) in (ImplicitA, ImplicitM) for m in convs):
+            a, c, m = convs
+            aw = a.implicit.clone()
+            mw = m.implicit.clone()
+            c = deepcopy(c)
+            nw, cw, _, _ = c.weight.shape
+            na, ca, _, _ = aw.shape
+            nm, cm, _, _ = mw.shape
+            c.bias = nn.Parameter(c.bias + (
+                c.weight.reshape(nw, cw) @ aw.reshape(ca, na)).squeeze(1))
+            c.bias = nn.Parameter(c.bias * mw.reshape(cm))
+            c.weight = nn.Parameter(c.weight * mw.transpose(0, 1))
+            convs = c
+        feat = convs(x)
+        return (feat, )
+
+    @staticmethod
+    def forward_gvp(x: Tensor) -> Tensor:
+        return torch.mean(x, [2, 3], keepdim=True)
diff --git a/mmdetection_practice/deploy/easydeploy/nms/__init__.py b/mmdetection_practice/deploy/easydeploy/nms/__init__.py
new file mode 100644
index 0000000..59c5cdb
--- /dev/null
+++ b/mmdetection_practice/deploy/easydeploy/nms/__init__.py
@@ -0,0 +1,5 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from .ort_nms import onnx_nms
+from .trt_nms import batched_nms, efficient_nms
+
+__all__ = ['efficient_nms', 'batched_nms', 'onnx_nms']
diff --git a/mmdetection_practice/deploy/easydeploy/nms/ort_nms.py b/mmdetection_practice/deploy/easydeploy/nms/ort_nms.py
new file mode 100644
index 0000000..597f3fb
--- /dev/null
+++ b/mmdetection_practice/deploy/easydeploy/nms/ort_nms.py
@@ -0,0 +1,215 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+import torch
+from torch import Tensor
+from torchvision.ops import batched_nms
+
+_XYWH2XYXY = torch.tensor([[1.0, 0.0, 1.0, 0.0], [0.0, 1.0, 0.0, 1.0],
+                           [-0.5, 0.0, 0.5, 0.0], [0.0, -0.5, 0.0, 0.5]],
+                          dtype=torch.float32)
+
+
+def sort_nms_index(nms_index, scores, batch_size, keep_top_k=-1):
+    """
+    first sort the nms_index by batch, and then sort by score in every image result, final apply keep_top_k strategy. In the process, we can also get the number of detections for each image: num_dets
+    """
+    # first sort by batch index to make sure that the same batch index is together
+    device = nms_index.device
+    nms_index_indices = torch.argsort(nms_index[:, 0], dim=0).to(device)
+    nms_index = nms_index[nms_index_indices]
+
+    scores = scores[nms_index[:, 0], nms_index[:, 1], nms_index[:, 2]]
+    batch_inds = nms_index[:, 0]
+
+    # Get the number of detections for each image
+    num_dets = torch.bincount(batch_inds,minlength=batch_size).to(device)
+    # Calculate the sum from front to back
+    cumulative_sum = torch.cumsum(num_dets, dim=0).to(device)
+    # add initial value 0
+    cumulative_sum = torch.cat((torch.tensor([0]).to(device), cumulative_sum))
+    for i in range(len(num_dets)):
+        start = cumulative_sum[i]
+        end = cumulative_sum[i + 1]
+        # sort by score in every batch
+        block_idx = torch.argsort(scores[start:end], descending=True).to(device)
+        nms_index[start:end] = nms_index[start:end][block_idx]
+        if keep_top_k > 0 and end - start > keep_top_k:
+            # delete lines from start+keep_top_k to end to keep only top k
+            nms_index = torch.cat(
+                (nms_index[: start + keep_top_k], nms_index[end:]), dim=0
+            )
+            num_dets[i] -= end - start - keep_top_k
+            cumulative_sum -= end - start - keep_top_k
+    return nms_index, num_dets
+
+
+def select_nms_index(
+    scores: Tensor,
+    boxes: Tensor,
+    nms_index: Tensor,
+    batch_size: int,
+    keep_top_k: int = -1,
+):
+    if nms_index.numel() == 0:
+        return torch.empty(0), torch.empty(0, 4), torch.empty(0), torch.empty(0)
+    nms_index, num_dets = sort_nms_index(nms_index, scores, batch_size, keep_top_k)
+    batch_inds, cls_inds = nms_index[:, 0], nms_index[:, 1]
+    box_inds = nms_index[:, 2]
+
+    # according to the nms_index to get the scores,boxes and labels
+    batched_scores = scores[batch_inds, cls_inds, box_inds]
+    batched_dets = boxes[batch_inds, box_inds, ...]
+    batched_labels = cls_inds
+
+    return num_dets, batched_dets, batched_scores, batched_labels
+
+
+def construct_indice(batch_idx, select_bbox_idxs, class_idxs, original_idxs):
+    num_bbox = len(select_bbox_idxs)
+    class_idxs = class_idxs[select_bbox_idxs]
+    indice = torch.zeros((num_bbox, 3), dtype=torch.int32).to(select_bbox_idxs.device)
+    # batch_idx
+    indice[:, 0] = batch_idx
+    # class_idxs
+    indice[:, 1] = class_idxs
+    # select_bbox_idxs
+    indice[:, 2] = original_idxs[select_bbox_idxs]
+    return indice
+
+
+def filter_max_boxes_per_class(
+    select_bbox_idxs, class_idxs, max_output_boxes_per_class
+):
+    class_counts = {}  #  used to track the count of each class
+
+    filtered_select_bbox_idxs = []
+    filtered_max_class_idxs = []
+
+    for bbox_idx, class_idx in zip(select_bbox_idxs, class_idxs):
+        class_count = class_counts.get(
+            class_idx.item(), 0
+        )  #  Get the count of the current class, or return 0 if it does not exist
+        if class_count < max_output_boxes_per_class:
+            filtered_select_bbox_idxs.append(bbox_idx)
+            filtered_max_class_idxs.append(class_idx)
+            class_counts[class_idx.item()] = class_count + 1
+    return torch.tensor(filtered_select_bbox_idxs), torch.tensor(
+        filtered_max_class_idxs
+    )
+
+
+class ONNXNMSop(torch.autograd.Function):
+
+    @staticmethod
+    def forward(
+        ctx,
+        boxes: Tensor,
+        scores: Tensor,
+        max_output_boxes_per_class: Tensor = torch.tensor([100]),
+        iou_threshold: Tensor = torch.tensor([0.5]),
+        score_threshold: Tensor = torch.tensor([0.05])
+    ) -> Tensor:
+        """
+        Non-Maximum Suppression (NMS) implementation.
+
+        Args:
+            boxes (Tensor): Bounding boxes of shape (batch_size, num_boxes, 4).
+            scores (Tensor): Confidence scores of shape (batch_size, num_classes, num_boxes).
+            max_output_boxes_per_class (Tensor): Maximum number of output boxes per class.
+            iou_threshold (Tensor): IoU threshold for NMS.
+            score_threshold (Tensor): Confidence score threshold.
+
+        Returns:
+            Tensor: Selected indices of shape (num_det, 3).first value is batch index, second value is class index, third value is box index
+        """
+        device = boxes.device
+        batch_size, num_classes, num_boxes = scores.shape
+        selected_indices = []
+        for batch_idx in range(batch_size):
+            boxes_per_image = boxes[batch_idx]
+            scores_per_image = scores[batch_idx]
+
+            # If no boxes in this image, continue to the next image
+            if boxes_per_image.numel() == 0:
+                continue
+
+            # for one box, only exist one class,so use torch.max to get the max score and class index
+            scores_per_image, class_idxs = torch.max(scores_per_image, dim=0)
+            # Apply score threshold before batched_nms bacause nms operation is time expensive
+            keep_idxs = scores_per_image > score_threshold
+            if not torch.any(keep_idxs):
+                # If no boxes left after applying score threshold, continue to the next image
+                continue
+
+            boxes_per_image = boxes_per_image[keep_idxs]
+            scores_per_image = scores_per_image[keep_idxs]
+            class_idxs = class_idxs[keep_idxs]
+
+            #  The purpose of original_idxs is we want to return the indexs to the original input data instead of the filtered.
+            original_idxs = torch.arange(num_boxes, device=device)[keep_idxs]
+            # reference: https://pytorch.org/vision/main/generated/torchvision.ops.batched_nms.html
+            select_bbox_idxs = batched_nms(
+                boxes_per_image, scores_per_image, class_idxs, iou_threshold
+            )
+            if (
+                select_bbox_idxs.shape[0] > max_output_boxes_per_class
+            ):  # If the boxes detected by all classes together are less than max_output_boxes_per_class, then there is no need to filter
+                select_bbox_idxs, _ = filter_max_boxes_per_class(
+                    select_bbox_idxs,
+                    class_idxs[select_bbox_idxs],
+                    max_output_boxes_per_class,
+                )
+            selected_indice = construct_indice(
+                batch_idx, select_bbox_idxs, class_idxs, original_idxs
+            )
+            selected_indices.append(selected_indice)
+        if len(selected_indices) == 0:
+            return torch.tensor([], device=device)
+        selected_indices = torch.cat(selected_indices, dim=0)
+        return selected_indices
+
+    @staticmethod
+    def symbolic(
+            g,
+            boxes: Tensor,
+            scores: Tensor,
+            max_output_boxes_per_class: Tensor = torch.tensor([100]),
+            iou_threshold: Tensor = torch.tensor([0.5]),
+            score_threshold: Tensor = torch.tensor([0.05]),
+    ):
+        return g.op(
+            'NonMaxSuppression',
+            boxes,
+            scores,
+            max_output_boxes_per_class,
+            iou_threshold,
+            score_threshold,
+            outputs=1)
+
+
+def onnx_nms(
+    boxes: torch.Tensor,
+    scores: torch.Tensor,
+    max_output_boxes_per_class: int = 100,
+    iou_threshold: float = 0.5,
+    score_threshold: float = 0.05,
+    pre_top_k: int = -1,
+    keep_top_k: int = 100,
+    box_coding: int = 0,
+):
+    max_output_boxes_per_class = torch.tensor([max_output_boxes_per_class])
+    iou_threshold = torch.tensor([iou_threshold]).to(boxes.device)
+    score_threshold = torch.tensor([score_threshold]).to(boxes.device)
+
+    batch_size, _, _ = scores.shape
+    if box_coding == 1:
+        boxes = boxes @ (_XYWH2XYXY.to(boxes.device))
+    scores = scores.transpose(1, 2).contiguous()
+    selected_indices = ONNXNMSop.apply(boxes, scores,
+                                       max_output_boxes_per_class,
+                                       iou_threshold, score_threshold)
+
+    num_dets, batched_dets, batched_scores, batched_labels = select_nms_index(
+        scores, boxes, selected_indices, batch_size, keep_top_k=keep_top_k)
+
+    return num_dets, batched_dets, batched_scores, batched_labels.to(
+        torch.int32)
diff --git a/mmdetection_practice/deploy/easydeploy/nms/trt_nms.py b/mmdetection_practice/deploy/easydeploy/nms/trt_nms.py
new file mode 100644
index 0000000..e0db1e2
--- /dev/null
+++ b/mmdetection_practice/deploy/easydeploy/nms/trt_nms.py
@@ -0,0 +1,226 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+import torch
+from torch import Tensor
+
+_XYWH2XYXY = torch.tensor([[1.0, 0.0, 1.0, 0.0], [0.0, 1.0, 0.0, 1.0],
+                           [-0.5, 0.0, 0.5, 0.0], [0.0, -0.5, 0.0, 0.5]],
+                          dtype=torch.float32)
+
+
+class TRTEfficientNMSop(torch.autograd.Function):
+
+    @staticmethod
+    def forward(
+        ctx,
+        boxes: Tensor,
+        scores: Tensor,
+        background_class: int = -1,
+        box_coding: int = 0,
+        iou_threshold: float = 0.45,
+        max_output_boxes: int = 100,
+        plugin_version: str = '1',
+        score_activation: int = 0,
+        score_threshold: float = 0.25,
+    ):
+        batch_size, _, num_classes = scores.shape
+        num_det = torch.randint(
+            0, max_output_boxes, (batch_size, 1), dtype=torch.int32)
+        det_boxes = torch.randn(batch_size, max_output_boxes, 4)
+        det_scores = torch.randn(batch_size, max_output_boxes)
+        det_classes = torch.randint(
+            0, num_classes, (batch_size, max_output_boxes), dtype=torch.int32)
+        return num_det, det_boxes, det_scores, det_classes
+
+    @staticmethod
+    def symbolic(g,
+                 boxes: Tensor,
+                 scores: Tensor,
+                 background_class: int = -1,
+                 box_coding: int = 0,
+                 iou_threshold: float = 0.45,
+                 max_output_boxes: int = 100,
+                 plugin_version: str = '1',
+                 score_activation: int = 0,
+                 score_threshold: float = 0.25):
+        out = g.op(
+            'TRT::EfficientNMS_TRT',
+            boxes,
+            scores,
+            background_class_i=background_class,
+            box_coding_i=box_coding,
+            iou_threshold_f=iou_threshold,
+            max_output_boxes_i=max_output_boxes,
+            plugin_version_s=plugin_version,
+            score_activation_i=score_activation,
+            score_threshold_f=score_threshold,
+            outputs=4)
+        num_det, det_boxes, det_scores, det_classes = out
+        return num_det, det_boxes, det_scores, det_classes
+
+
+class TRTbatchedNMSop(torch.autograd.Function):
+    """TensorRT NMS operation."""
+
+    @staticmethod
+    def forward(
+        ctx,
+        boxes: Tensor,
+        scores: Tensor,
+        plugin_version: str = '1',
+        shareLocation: int = 1,
+        backgroundLabelId: int = -1,
+        numClasses: int = 80,
+        topK: int = 1000,
+        keepTopK: int = 100,
+        scoreThreshold: float = 0.25,
+        iouThreshold: float = 0.45,
+        isNormalized: int = 0,
+        clipBoxes: int = 0,
+        scoreBits: int = 16,
+        caffeSemantics: int = 1,
+    ):
+        batch_size, _, numClasses = scores.shape
+        num_det = torch.randint(
+            0, keepTopK, (batch_size, 1), dtype=torch.int32)
+        det_boxes = torch.randn(batch_size, keepTopK, 4)
+        det_scores = torch.randn(batch_size, keepTopK)
+        det_classes = torch.randint(0, numClasses,
+                                    (batch_size, keepTopK)).float()
+        return num_det, det_boxes, det_scores, det_classes
+
+    @staticmethod
+    def symbolic(
+        g,
+        boxes: Tensor,
+        scores: Tensor,
+        plugin_version: str = '1',
+        shareLocation: int = 1,
+        backgroundLabelId: int = -1,
+        numClasses: int = 80,
+        topK: int = 1000,
+        keepTopK: int = 100,
+        scoreThreshold: float = 0.25,
+        iouThreshold: float = 0.45,
+        isNormalized: int = 0,
+        clipBoxes: int = 0,
+        scoreBits: int = 16,
+        caffeSemantics: int = 1,
+    ):
+        out = g.op(
+            'TRT::BatchedNMSDynamic_TRT',
+            boxes,
+            scores,
+            shareLocation_i=shareLocation,
+            plugin_version_s=plugin_version,
+            backgroundLabelId_i=backgroundLabelId,
+            numClasses_i=numClasses,
+            topK_i=topK,
+            keepTopK_i=keepTopK,
+            scoreThreshold_f=scoreThreshold,
+            iouThreshold_f=iouThreshold,
+            isNormalized_i=isNormalized,
+            clipBoxes_i=clipBoxes,
+            scoreBits_i=scoreBits,
+            caffeSemantics_i=caffeSemantics,
+            outputs=4)
+        num_det, det_boxes, det_scores, det_classes = out
+        return num_det, det_boxes, det_scores, det_classes
+
+
+def _efficient_nms(
+    boxes: Tensor,
+    scores: Tensor,
+    max_output_boxes_per_class: int = 1000,
+    iou_threshold: float = 0.5,
+    score_threshold: float = 0.05,
+    pre_top_k: int = -1,
+    keep_top_k: int = 100,
+    box_coding: int = 0,
+):
+    """Wrapper for `efficient_nms` with TensorRT.
+    Args:
+        boxes (Tensor): The bounding boxes of shape [N, num_boxes, 4].
+        scores (Tensor): The detection scores of shape
+            [N, num_boxes, num_classes].
+        max_output_boxes_per_class (int): Maximum number of output
+            boxes per class of nms. Defaults to 1000.
+        iou_threshold (float): IOU threshold of nms. Defaults to 0.5.
+        score_threshold (float): score threshold of nms.
+            Defaults to 0.05.
+        pre_top_k (int): Number of top K boxes to keep before nms.
+            Defaults to -1.
+        keep_top_k (int): Number of top K boxes to keep after nms.
+            Defaults to -1.
+        box_coding (int): Bounding boxes format for nms.
+            Defaults to 0 means [x1, y1 ,x2, y2].
+            Set to 1 means [x, y, w, h].
+    Returns:
+        tuple[Tensor, Tensor, Tensor, Tensor]:
+        (num_det, det_boxes, det_scores, det_classes),
+        `num_det` of shape [N, 1]
+        `det_boxes` of shape [N, num_det, 4]
+        `det_scores` of shape [N, num_det]
+        `det_classes` of shape [N, num_det]
+    """
+    num_det, det_boxes, det_scores, det_classes = TRTEfficientNMSop.apply(
+        boxes, scores, -1, box_coding, iou_threshold, keep_top_k, '1', 0,
+        score_threshold)
+    return num_det, det_boxes, det_scores, det_classes
+
+
+def _batched_nms(
+    boxes: Tensor,
+    scores: Tensor,
+    max_output_boxes_per_class: int = 1000,
+    iou_threshold: float = 0.5,
+    score_threshold: float = 0.05,
+    pre_top_k: int = -1,
+    keep_top_k: int = 100,
+    box_coding: int = 0,
+):
+    """Wrapper for `efficient_nms` with TensorRT.
+    Args:
+        boxes (Tensor): The bounding boxes of shape [N, num_boxes, 4].
+        scores (Tensor): The detection scores of shape
+            [N, num_boxes, num_classes].
+        max_output_boxes_per_class (int): Maximum number of output
+            boxes per class of nms. Defaults to 1000.
+        iou_threshold (float): IOU threshold of nms. Defaults to 0.5.
+        score_threshold (float): score threshold of nms.
+            Defaults to 0.05.
+        pre_top_k (int): Number of top K boxes to keep before nms.
+            Defaults to -1.
+        keep_top_k (int): Number of top K boxes to keep after nms.
+            Defaults to -1.
+        box_coding (int): Bounding boxes format for nms.
+            Defaults to 0 means [x1, y1 ,x2, y2].
+            Set to 1 means [x, y, w, h].
+    Returns:
+        tuple[Tensor, Tensor, Tensor, Tensor]:
+        (num_det, det_boxes, det_scores, det_classes),
+        `num_det` of shape [N, 1]
+        `det_boxes` of shape [N, num_det, 4]
+        `det_scores` of shape [N, num_det]
+        `det_classes` of shape [N, num_det]
+    """
+    if box_coding == 1:
+        boxes = boxes @ (_XYWH2XYXY.to(boxes.device))
+    boxes = boxes if boxes.dim() == 4 else boxes.unsqueeze(2)
+    _, _, numClasses = scores.shape
+
+    num_det, det_boxes, det_scores, det_classes = TRTbatchedNMSop.apply(
+        boxes, scores, '1', 1, -1, int(numClasses), min(pre_top_k, 4096),
+        keep_top_k, score_threshold, iou_threshold, 0, 0, 16, 1)
+
+    det_classes = det_classes.int()
+    return num_det, det_boxes, det_scores, det_classes
+
+
+def efficient_nms(*args, **kwargs):
+    """Wrapper function for `_efficient_nms`."""
+    return _efficient_nms(*args, **kwargs)
+
+
+def batched_nms(*args, **kwargs):
+    """Wrapper function for `_batched_nms`."""
+    return _batched_nms(*args, **kwargs)
diff --git a/mmdetection_practice/deploy/easydeploy/onnx_demo.py b/mmdetection_practice/deploy/easydeploy/onnx_demo.py
new file mode 100644
index 0000000..e69de29
diff --git a/mmdetection_practice/deploy/easydeploy/tools/build_engine.py b/mmdetection_practice/deploy/easydeploy/tools/build_engine.py
new file mode 100644
index 0000000..b400c9d
--- /dev/null
+++ b/mmdetection_practice/deploy/easydeploy/tools/build_engine.py
@@ -0,0 +1,136 @@
+import argparse
+from pathlib import Path
+from typing import List, Optional, Tuple, Union
+
+try:
+    import tensorrt as trt
+except Exception:
+    trt = None
+import warnings
+
+import numpy as np
+import torch
+
+warnings.filterwarnings(action='ignore', category=DeprecationWarning)
+
+
+class EngineBuilder:
+
+    def __init__(
+            self,
+            checkpoint: Union[str, Path],
+            opt_shape: Union[Tuple, List] = (1, 3, 640, 640),
+            device: Optional[Union[str, int, torch.device]] = None) -> None:
+        checkpoint = Path(checkpoint) if isinstance(checkpoint,
+                                                    str) else checkpoint
+        assert checkpoint.exists() and checkpoint.suffix == '.onnx'
+        if isinstance(device, str):
+            device = torch.device(device)
+        elif isinstance(device, int):
+            device = torch.device(f'cuda:{device}')
+
+        self.checkpoint = checkpoint
+        self.opt_shape = np.array(opt_shape, dtype=np.float32)
+        self.device = device
+
+    def __build_engine(self,
+                       scale: Optional[List[List]] = None,
+                       fp16: bool = True,
+                       with_profiling: bool = True) -> None:
+        logger = trt.Logger(trt.Logger.WARNING)
+        trt.init_libnvinfer_plugins(logger, namespace='')
+        builder = trt.Builder(logger)
+        config = builder.create_builder_config()
+        config.max_workspace_size = torch.cuda.get_device_properties(
+            self.device).total_memory
+        flag = (1 << int(trt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH))
+        network = builder.create_network(flag)
+        parser = trt.OnnxParser(network, logger)
+        if not parser.parse_from_file(str(self.checkpoint)):
+            raise RuntimeError(
+                f'failed to load ONNX file: {str(self.checkpoint)}')
+        inputs = [network.get_input(i) for i in range(network.num_inputs)]
+        outputs = [network.get_output(i) for i in range(network.num_outputs)]
+        profile = None
+        dshape = -1 in network.get_input(0).shape
+        if dshape:
+            profile = builder.create_optimization_profile()
+            if scale is None:
+                scale = np.array(
+                    [[1, 1, 0.5, 0.5], [1, 1, 1, 1], [4, 1, 1.5, 1.5]],
+                    dtype=np.float32)
+                scale = (self.opt_shape * scale).astype(np.int32)
+            elif isinstance(scale, List):
+                scale = np.array(scale, dtype=np.int32)
+                assert scale.shape[0] == 3, 'Input a wrong scale list'
+            else:
+                raise NotImplementedError
+
+        for inp in inputs:
+            logger.log(
+                trt.Logger.WARNING,
+                f'input "{inp.name}" with shape{inp.shape} {inp.dtype}')
+            if dshape:
+                profile.set_shape(inp.name, *scale)
+        for out in outputs:
+            logger.log(
+                trt.Logger.WARNING,
+                f'output "{out.name}" with shape{out.shape} {out.dtype}')
+        if fp16 and builder.platform_has_fast_fp16:
+            config.set_flag(trt.BuilderFlag.FP16)
+        self.weight = self.checkpoint.with_suffix('.engine')
+        if dshape:
+            config.add_optimization_profile(profile)
+        if with_profiling:
+            config.profiling_verbosity = trt.ProfilingVerbosity.DETAILED
+        with builder.build_engine(network, config) as engine:
+            self.weight.write_bytes(engine.serialize())
+        logger.log(
+            trt.Logger.WARNING, f'Build tensorrt engine finish.\n'
+            f'Save in {str(self.weight.absolute())}')
+
+    def build(self,
+              scale: Optional[List[List]] = None,
+              fp16: bool = True,
+              with_profiling=True):
+        self.__build_engine(scale, fp16, with_profiling)
+
+
+def parse_args():
+    parser = argparse.ArgumentParser()
+    parser.add_argument('checkpoint', help='Checkpoint file')
+    parser.add_argument(
+        '--img-size',
+        nargs='+',
+        type=int,
+        default=[640, 640],
+        help='Image size of height and width')
+    parser.add_argument(
+        '--device', type=str, default='cuda:0', help='TensorRT builder device')
+    parser.add_argument(
+        '--scales',
+        type=str,
+        default='[[1,3,640,640],[1,3,640,640],[1,3,640,640]]',
+        help='Input scales for build dynamic input shape engine')
+    parser.add_argument(
+        '--fp16', action='store_true', help='Build model with fp16 mode')
+    args = parser.parse_args()
+    args.img_size *= 2 if len(args.img_size) == 1 else 1
+    return args
+
+
+def main(args):
+    img_size = (1, 3, *args.img_size)
+    try:
+        scales = eval(args.scales)
+    except Exception:
+        print('Input scales is not a python variable')
+        print('Set scales default None')
+        scales = None
+    builder = EngineBuilder(args.checkpoint, img_size, args.device)
+    builder.build(scales, fp16=args.fp16)
+
+
+if __name__ == '__main__':
+    args = parse_args()
+    main(args)
diff --git a/mmdetection_practice/deploy/easydeploy/tools/export_onnx.py b/mmdetection_practice/deploy/easydeploy/tools/export_onnx.py
new file mode 100644
index 0000000..b937cc8
--- /dev/null
+++ b/mmdetection_practice/deploy/easydeploy/tools/export_onnx.py
@@ -0,0 +1,157 @@
+import argparse
+import os
+import sys
+import warnings
+from io import BytesIO
+from pathlib import Path
+
+import onnx
+import torch
+from mmdet.apis import init_detector
+from mmengine.config import ConfigDict
+from mmengine.logging import print_log
+from mmengine.utils.path import mkdir_or_exist
+
+# Add MMYOLO ROOT to sys.path
+sys.path.append(str(Path(__file__).resolve().parents[3]))
+from projects.easydeploy.model import DeployModel, MMYOLOBackend  # noqa E402
+
+warnings.filterwarnings(action='ignore', category=torch.jit.TracerWarning)
+warnings.filterwarnings(action='ignore', category=torch.jit.ScriptWarning)
+warnings.filterwarnings(action='ignore', category=UserWarning)
+warnings.filterwarnings(action='ignore', category=FutureWarning)
+warnings.filterwarnings(action='ignore', category=ResourceWarning)
+
+
+def parse_args():
+    parser = argparse.ArgumentParser()
+    parser.add_argument('config', help='Config file')
+    parser.add_argument('checkpoint', help='Checkpoint file')
+    parser.add_argument(
+        '--model-only', action='store_true', help='Export model only')
+    parser.add_argument(
+        '--work-dir', default='./work_dir', help='Path to save export model')
+    parser.add_argument(
+        '--img-size',
+        nargs='+',
+        type=int,
+        default=[640, 640],
+        help='Image size of height and width')
+    parser.add_argument('--batch-size', type=int, default=1, help='Batch size')
+    parser.add_argument(
+        '--device', default='cuda:0', help='Device used for inference')
+    parser.add_argument(
+        '--simplify',
+        action='store_true',
+        help='Simplify onnx model by onnx-sim')
+    parser.add_argument(
+        '--opset', type=int, default=11, help='ONNX opset version')
+    parser.add_argument(
+        '--backend',
+        type=str,
+        default='onnxruntime',
+        help='Backend for export onnx')
+    parser.add_argument(
+        '--pre-topk',
+        type=int,
+        default=1000,
+        help='Postprocess pre topk bboxes feed into NMS')
+    parser.add_argument(
+        '--keep-topk',
+        type=int,
+        default=100,
+        help='Postprocess keep topk bboxes out of NMS')
+    parser.add_argument(
+        '--iou-threshold',
+        type=float,
+        default=0.65,
+        help='IoU threshold for NMS')
+    parser.add_argument(
+        '--score-threshold',
+        type=float,
+        default=0.25,
+        help='Score threshold for NMS')
+    args = parser.parse_args()
+    args.img_size *= 2 if len(args.img_size) == 1 else 1
+    return args
+
+
+def build_model_from_cfg(config_path, checkpoint_path, device):
+    model = init_detector(config_path, checkpoint_path, device=device)
+    model.eval()
+    return model
+
+
+def main():
+    args = parse_args()
+    mkdir_or_exist(args.work_dir)
+    backend = MMYOLOBackend(args.backend.lower())
+    if backend in (MMYOLOBackend.ONNXRUNTIME, MMYOLOBackend.OPENVINO,
+                   MMYOLOBackend.TENSORRT8, MMYOLOBackend.TENSORRT7):
+        if not args.model_only:
+            print_log('Export ONNX with bbox decoder and NMS ...')
+    else:
+        args.model_only = True
+        print_log(f'Can not export postprocess for {args.backend.lower()}.\n'
+                  f'Set "args.model_only=True" default.')
+    if args.model_only:
+        postprocess_cfg = None
+        output_names = None
+    else:
+        postprocess_cfg = ConfigDict(
+            pre_top_k=args.pre_topk,
+            keep_top_k=args.keep_topk,
+            iou_threshold=args.iou_threshold,
+            score_threshold=args.score_threshold)
+        output_names = ['num_dets', 'boxes', 'scores', 'labels']
+    baseModel = build_model_from_cfg(args.config, args.checkpoint, args.device)
+
+    deploy_model = DeployModel(
+        baseModel=baseModel, backend=backend, postprocess_cfg=postprocess_cfg)
+    deploy_model.eval()
+
+    fake_input = torch.randn(args.batch_size, 3,
+                             *args.img_size).to(args.device)
+    # dry run
+    deploy_model(fake_input)
+
+    save_onnx_path = os.path.join(
+        args.work_dir,
+        os.path.basename(args.checkpoint).replace('pth', 'onnx'))
+    # export onnx
+    with BytesIO() as f:
+        torch.onnx.export(
+            deploy_model,
+            fake_input,
+            f,
+            input_names=['images'],
+            output_names=output_names,
+            opset_version=args.opset)
+        f.seek(0)
+        onnx_model = onnx.load(f)
+        onnx.checker.check_model(onnx_model)
+
+        # Fix tensorrt onnx output shape, just for view
+        if not args.model_only and backend in (MMYOLOBackend.TENSORRT8,
+                                               MMYOLOBackend.TENSORRT7):
+            shapes = [
+                args.batch_size, 1, args.batch_size, args.keep_topk, 4,
+                args.batch_size, args.keep_topk, args.batch_size,
+                args.keep_topk
+            ]
+            for i in onnx_model.graph.output:
+                for j in i.type.tensor_type.shape.dim:
+                    j.dim_param = str(shapes.pop(0))
+    if args.simplify:
+        try:
+            import onnxsim
+            onnx_model, check = onnxsim.simplify(onnx_model)
+            assert check, 'assert check failed'
+        except Exception as e:
+            print_log(f'Simplify failure: {e}')
+    onnx.save(onnx_model, save_onnx_path)
+    print_log(f'ONNX export success, save into {save_onnx_path}')
+
+
+if __name__ == '__main__':
+    main()
diff --git a/mmdetection_practice/deploy/easydeploy/tools/image-demo.py b/mmdetection_practice/deploy/easydeploy/tools/image-demo.py
new file mode 100644
index 0000000..12ebadd
--- /dev/null
+++ b/mmdetection_practice/deploy/easydeploy/tools/image-demo.py
@@ -0,0 +1,152 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from easydeploy.model import ORTWrapper, TRTWrapper  # isort:skip
+import os
+import random
+from argparse import ArgumentParser
+
+import cv2
+import mmcv
+import numpy as np
+import torch
+from mmcv.transforms import Compose
+from mmdet.utils import get_test_pipeline_cfg
+from mmengine.config import Config, ConfigDict
+from mmengine.utils import ProgressBar, path
+
+from mmyolo.utils import register_all_modules
+from mmyolo.utils.misc import get_file_list
+
+
+def parse_args():
+    parser = ArgumentParser()
+    parser.add_argument(
+        'img', help='Image path, include image file, dir and URL.')
+    parser.add_argument('config', help='Config file')
+    parser.add_argument('checkpoint', help='Checkpoint file')
+    parser.add_argument(
+        '--out-dir', default='./output', help='Path to output file')
+    parser.add_argument(
+        '--device', default='cuda:0', help='Device used for inference')
+    parser.add_argument(
+        '--show', action='store_true', help='Show the detection results')
+    args = parser.parse_args()
+    return args
+
+
+def preprocess(config):
+    data_preprocess = config.get('model', {}).get('data_preprocessor', {})
+    mean = data_preprocess.get('mean', [0., 0., 0.])
+    std = data_preprocess.get('std', [1., 1., 1.])
+    mean = torch.tensor(mean, dtype=torch.float32).reshape(1, 3, 1, 1)
+    std = torch.tensor(std, dtype=torch.float32).reshape(1, 3, 1, 1)
+
+    class PreProcess(torch.nn.Module):
+
+        def __init__(self):
+            super().__init__()
+
+        def forward(self, x):
+            x = x[None].float()
+            x -= mean.to(x.device)
+            x /= std.to(x.device)
+            return x
+
+    return PreProcess().eval()
+
+
+def main():
+    args = parse_args()
+
+    # register all modules in mmdet into the registries
+    register_all_modules()
+
+    colors = [[random.randint(0, 255) for _ in range(3)] for _ in range(1000)]
+
+    # build the model from a config file and a checkpoint file
+    if args.checkpoint.endswith('.onnx'):
+        model = ORTWrapper(args.checkpoint, args.device)
+    elif args.checkpoint.endswith('.engine') or args.checkpoint.endswith(
+            '.plan'):
+        model = TRTWrapper(args.checkpoint, args.device)
+    else:
+        raise NotImplementedError
+
+    model.to(args.device)
+
+    cfg = Config.fromfile(args.config)
+    class_names = cfg.get('class_name')
+
+    test_pipeline = get_test_pipeline_cfg(cfg)
+    test_pipeline[0] = ConfigDict({'type': 'mmdet.LoadImageFromNDArray'})
+    test_pipeline = Compose(test_pipeline)
+
+    pre_pipeline = preprocess(cfg)
+
+    if not args.show:
+        path.mkdir_or_exist(args.out_dir)
+
+    # get file list
+    files, source_type = get_file_list(args.img)
+
+    # start detector inference
+    progress_bar = ProgressBar(len(files))
+    for i, file in enumerate(files):
+        bgr = mmcv.imread(file)
+        rgb = mmcv.imconvert(bgr, 'bgr', 'rgb')
+        data, samples = test_pipeline(dict(img=rgb, img_id=i)).values()
+        pad_param = samples.get('pad_param',
+                                np.array([0, 0, 0, 0], dtype=np.float32))
+        h, w = samples.get('ori_shape', rgb.shape[:2])
+        pad_param = torch.asarray(
+            [pad_param[2], pad_param[0], pad_param[2], pad_param[0]],
+            device=args.device)
+        scale_factor = samples.get('scale_factor', [1., 1])
+        scale_factor = torch.asarray(scale_factor * 2, device=args.device)
+        data = pre_pipeline(data).to(args.device)
+
+        result = model(data)
+        if source_type['is_dir']:
+            filename = os.path.relpath(file, args.img).replace('/', '_')
+        else:
+            filename = os.path.basename(file)
+        out_file = None if args.show else os.path.join(args.out_dir, filename)
+
+        # Get candidate predict info by num_dets
+        num_dets, bboxes, scores, labels = result
+        scores = scores[0, :num_dets]
+        bboxes = bboxes[0, :num_dets]
+        labels = labels[0, :num_dets]
+        bboxes -= pad_param
+        bboxes /= scale_factor
+
+        bboxes[:, 0::2].clamp_(0, w)
+        bboxes[:, 1::2].clamp_(0, h)
+        bboxes = bboxes.round().int()
+
+        for (bbox, score, label) in zip(bboxes, scores, labels):
+            bbox = bbox.tolist()
+            color = colors[label]
+
+            if class_names is not None:
+                label_name = class_names[label]
+                name = f'cls:{label_name}_score:{score:0.4f}'
+            else:
+                name = f'cls:{label}_score:{score:0.4f}'
+
+            cv2.rectangle(bgr, bbox[:2], bbox[2:], color, 2)
+            cv2.putText(
+                bgr,
+                name, (bbox[0], bbox[1] - 2),
+                cv2.FONT_HERSHEY_SIMPLEX,
+                2.0, [225, 255, 255],
+                thickness=3)
+
+        if args.show:
+            mmcv.imshow(bgr, 'result', 0)
+        else:
+            mmcv.imwrite(bgr, out_file)
+        progress_bar.update()
+
+
+if __name__ == '__main__':
+    main()
diff --git a/mmdetection_practice/deploy/export_onnx.py b/mmdetection_practice/deploy/export_onnx.py
new file mode 100644
index 0000000..4041b12
--- /dev/null
+++ b/mmdetection_practice/deploy/export_onnx.py
@@ -0,0 +1,182 @@
+# # Copyright (c) OpenMMLab. All rights reserved.
+import os
+import json
+import warnings
+import argparse
+from io import BytesIO
+
+import onnx
+import torch
+from mmdet.apis import init_detector
+from mmengine.config import ConfigDict
+from mmengine.logging import print_log
+from mmengine.utils.path import mkdir_or_exist
+
+from easydeploy.model import DeployModel, MMYOLOBackend  # noqa E402
+
+warnings.filterwarnings(action='ignore', category=torch.jit.TracerWarning)
+warnings.filterwarnings(action='ignore', category=torch.jit.ScriptWarning)
+warnings.filterwarnings(action='ignore', category=UserWarning)
+warnings.filterwarnings(action='ignore', category=FutureWarning)
+warnings.filterwarnings(action='ignore', category=ResourceWarning)
+
+
+def parse_args():
+    parser = argparse.ArgumentParser()
+    parser.add_argument('config', help='Config file')
+    parser.add_argument('checkpoint', help='Checkpoint file')
+    parser.add_argument('--custom-text',
+                        type=str,
+                        help='custom text inputs (text json) for YOLO-World.')
+    parser.add_argument('--add-padding',
+                        action="store_true",
+                        help="add an empty padding to texts.")
+    parser.add_argument('--model-only',
+                        action='store_true',
+                        help='Export model only')
+    parser.add_argument('--without-nms',
+                        action='store_true',
+                        help='Export model without NMS')
+    parser.add_argument('--without-bbox-decoder',
+                        action='store_true',
+                        help='Export model without Bbox Decoder (for INT8 Quantization)')
+    parser.add_argument('--work-dir',
+                        default='./work_dirs',
+                        help='Path to save export model')
+    parser.add_argument('--img-size',
+                        nargs='+',
+                        type=int,
+                        default=[640, 640],
+                        help='Image size of height and width')
+    parser.add_argument('--batch-size', type=int, default=1, help='Batch size')
+    parser.add_argument('--device',
+                        default='cuda:0',
+                        help='Device used for inference')
+    parser.add_argument('--simplify',
+                        action='store_true',
+                        help='Simplify onnx model by onnx-sim')
+    parser.add_argument('--opset',
+                        type=int,
+                        default=11,
+                        help='ONNX opset version')
+    parser.add_argument('--backend',
+                        type=str,
+                        default='onnxruntime',
+                        help='Backend for export onnx')
+    parser.add_argument('--pre-topk',
+                        type=int,
+                        default=1000,
+                        help='Postprocess pre topk bboxes feed into NMS')
+    parser.add_argument('--keep-topk',
+                        type=int,
+                        default=100,
+                        help='Postprocess keep topk bboxes out of NMS')
+    parser.add_argument('--iou-threshold',
+                        type=float,
+                        default=0.65,
+                        help='IoU threshold for NMS')
+    parser.add_argument('--score-threshold',
+                        type=float,
+                        default=0.25,
+                        help='Score threshold for NMS')
+    args = parser.parse_args()
+    args.img_size *= 2 if len(args.img_size) == 1 else 1
+    return args
+
+
+def build_model_from_cfg(config_path, checkpoint_path, device):
+    model = init_detector(config_path, checkpoint_path, device=device)
+    model.eval()
+    return model
+
+
+def main():
+    args = parse_args()
+    mkdir_or_exist(args.work_dir)
+    backend = MMYOLOBackend(args.backend.lower())
+    if backend in (MMYOLOBackend.ONNXRUNTIME, MMYOLOBackend.OPENVINO,
+                   MMYOLOBackend.TENSORRT8, MMYOLOBackend.TENSORRT7):
+        if not args.model_only:
+            print_log('Export ONNX with bbox decoder and NMS ...')
+    else:
+        args.model_only = True
+        print_log(f'Can not export postprocess for {args.backend.lower()}.\n'
+                  f'Set "args.model_only=True" default.')
+    if args.model_only:
+        postprocess_cfg = None
+        output_names = None
+    else:
+        postprocess_cfg = ConfigDict(pre_top_k=args.pre_topk,
+                                     keep_top_k=args.keep_topk,
+                                     iou_threshold=args.iou_threshold,
+                                     score_threshold=args.score_threshold)
+
+        output_names = ['num_dets', 'boxes', 'scores', 'labels']
+        if args.without_bbox_decoder or args.without_nms:
+            output_names = ['scores', 'boxes']
+
+    if args.custom_text is not None and len(args.custom_text) > 0:
+        with open(args.custom_text) as f:
+            texts = json.load(f)
+        texts = [x[0] for x in texts]
+    else:
+        from mmdet.datasets import CocoDataset
+        texts = CocoDataset.METAINFO['classes']
+    if args.add_padding:
+        texts = texts + [' ']
+
+    baseModel = build_model_from_cfg(args.config, args.checkpoint, args.device)
+    if hasattr(baseModel, 'reparameterize'):
+        # reparameterize text into YOLO-World
+        baseModel.reparameterize([texts])
+    deploy_model = DeployModel(baseModel=baseModel,
+                               backend=backend,
+                               postprocess_cfg=postprocess_cfg,
+                               with_nms=not args.without_nms,
+                               without_bbox_decoder=args.without_bbox_decoder)
+    deploy_model.eval()
+
+    fake_input = torch.randn(args.batch_size, 3,
+                             *args.img_size).to(args.device)
+    # dry run
+    deploy_model(fake_input)
+
+    save_onnx_path = os.path.join(
+        args.work_dir,
+        os.path.basename(args.checkpoint).replace('pth', 'onnx'))
+    # export onnx
+    with BytesIO() as f:
+        torch.onnx.export(deploy_model,
+                          fake_input,
+                          f,
+                          input_names=['images'],
+                          output_names=output_names,
+                          opset_version=args.opset)
+        f.seek(0)
+        onnx_model = onnx.load(f)
+        onnx.checker.check_model(onnx_model)
+
+        # Fix tensorrt onnx output shape, just for view
+        if not args.model_only and not args.without_nms and backend in (
+                MMYOLOBackend.TENSORRT8, MMYOLOBackend.TENSORRT7):
+            shapes = [
+                args.batch_size, 1, args.batch_size, args.keep_topk, 4,
+                args.batch_size, args.keep_topk, args.batch_size,
+                args.keep_topk
+            ]
+            for i in onnx_model.graph.output:
+                for j in i.type.tensor_type.shape.dim:
+                    j.dim_param = str(shapes.pop(0))
+    if args.simplify:
+        try:
+            import onnxsim
+            onnx_model, check = onnxsim.simplify(onnx_model)
+            assert check, 'assert check failed'
+        except Exception as e:
+            print_log(f'Simplify failure: {e}')
+    onnx.save(onnx_model, save_onnx_path)
+    print_log(f'ONNX export success, save into {save_onnx_path}')
+
+
+if __name__ == '__main__':
+    main()
diff --git a/mmdetection_practice/deploy/onnx_demo.py b/mmdetection_practice/deploy/onnx_demo.py
new file mode 100644
index 0000000..35f2713
--- /dev/null
+++ b/mmdetection_practice/deploy/onnx_demo.py
@@ -0,0 +1,235 @@
+import os
+import json
+import argparse
+import os.path as osp
+
+import cv2
+import numpy as np
+import supervision as sv
+import onnxruntime as ort
+from mmengine.utils import ProgressBar
+
+try:
+    import torch
+    from torchvision.ops import nms
+except Exception as e:
+    print(e)
+
+BOUNDING_BOX_ANNOTATOR = sv.BoundingBoxAnnotator(thickness=1)
+MASK_ANNOTATOR = sv.MaskAnnotator()
+
+
+class LabelAnnotator(sv.LabelAnnotator):
+
+    @staticmethod
+    def resolve_text_background_xyxy(
+        center_coordinates,
+        text_wh,
+        position,
+    ):
+        center_x, center_y = center_coordinates
+        text_w, text_h = text_wh
+        return center_x, center_y, center_x + text_w, center_y + text_h
+
+
+LABEL_ANNOTATOR = LabelAnnotator(text_padding=4,
+                                 text_scale=0.5,
+                                 text_thickness=1)
+
+
+def parse_args():
+    parser = argparse.ArgumentParser('YOLO-World ONNX Demo')
+    parser.add_argument('onnx', help='onnx file')
+    parser.add_argument('image', help='image path, include image file or dir.')
+    parser.add_argument(
+        'text',
+        help=
+        'detecting texts (str or json), should be consistent with the ONNX model'
+    )
+    parser.add_argument('--output-dir',
+                        default='./output',
+                        help='directory to save output files')
+    parser.add_argument('--device',
+                        default='cuda:0',
+                        help='device used for inference')
+    parser.add_argument(
+        '--onnx-nms',
+        action='store_false',
+        help='whether ONNX model contains NMS and postprocessing')
+    args = parser.parse_args()
+    return args
+
+
+def preprocess(image, size=(640, 640)):
+    h, w = image.shape[:2]
+    max_size = max(h, w)
+    scale_factor = size[0] / max_size
+    pad_h = (max_size - h) // 2
+    pad_w = (max_size - w) // 2
+    pad_image = np.zeros((max_size, max_size, 3), dtype=image.dtype)
+    pad_image[pad_h:h + pad_h, pad_w:w + pad_w] = image
+    image = cv2.resize(pad_image, size,
+                       interpolation=cv2.INTER_LINEAR).astype('float32')
+    image /= 255.0
+    image = image[None]
+    return image, scale_factor, (pad_h, pad_w)
+
+
+def visualize(image, bboxes, labels, scores, texts):
+    detections = sv.Detections(xyxy=bboxes, class_id=labels, confidence=scores)
+    labels = [
+        f"{texts[class_id][0]} {confidence:0.2f}" for class_id, confidence in
+        zip(detections.class_id, detections.confidence)
+    ]
+
+    image = BOUNDING_BOX_ANNOTATOR.annotate(image, detections)
+    image = LABEL_ANNOTATOR.annotate(image, detections, labels=labels)
+    return image
+
+
+def inference(ort_session,
+              image_path,
+              texts,
+              output_dir,
+              size=(640, 640),
+              **kwargs):
+    # normal export
+    # with NMS and postprocessing
+    ori_image = cv2.imread(image_path)
+    h, w = ori_image.shape[:2]
+    image, scale_factor, pad_param = preprocess(ori_image[:, :, [2, 1, 0]],
+                                                size)
+    input_ort = ort.OrtValue.ortvalue_from_numpy(image.transpose((0, 3, 1, 2)))
+    results = ort_session.run(["num_dets", "labels", "scores", "boxes"],
+                              {"images": input_ort})
+    num_dets, labels, scores, bboxes = results
+    num_dets = num_dets[0][0]
+    labels = labels[0, :num_dets]
+    scores = scores[0, :num_dets]
+    bboxes = bboxes[0, :num_dets]
+
+    bboxes -= np.array(
+        [pad_param[1], pad_param[0], pad_param[1], pad_param[0]])
+    bboxes /= scale_factor
+    bboxes[:, 0::2] = np.clip(bboxes[:, 0::2], 0, w)
+    bboxes[:, 1::2] = np.clip(bboxes[:, 1::2], 0, h)
+    bboxes = bboxes.round().astype('int')
+
+    image_out = visualize(ori_image, bboxes, labels, scores, texts)
+    cv2.imwrite(osp.join(output_dir, osp.basename(image_path)), image_out)
+    return image_out
+
+
+def inference_with_postprocessing(ort_session,
+                                  image_path,
+                                  texts,
+                                  output_dir,
+                                  size=(640, 640),
+                                  nms_thr=0.7,
+                                  score_thr=0.3,
+                                  max_dets=300):
+    # export with `--without-nms`
+    ori_image = cv2.imread(image_path)
+    h, w = ori_image.shape[:2]
+    image, scale_factor, pad_param = preprocess(ori_image[:, :, [2, 1, 0]],
+                                                size)
+    input_ort = ort.OrtValue.ortvalue_from_numpy(image.transpose((0, 3, 1, 2)))
+    results = ort_session.run(["scores", "boxes"], {"images": input_ort})
+    scores, bboxes = results
+    # move numpy array to torch
+    ori_scores = torch.from_numpy(scores[0]).to('cuda:0')
+    ori_bboxes = torch.from_numpy(bboxes[0]).to('cuda:0')
+
+    scores_list = []
+    labels_list = []
+    bboxes_list = []
+    # class-specific NMS
+    for cls_id in range(len(texts)):
+        cls_scores = ori_scores[:, cls_id]
+        labels = torch.ones(cls_scores.shape[0], dtype=torch.long) * cls_id
+        keep_idxs = nms(ori_bboxes, cls_scores, iou_threshold=nms_thr)
+        cur_bboxes = ori_bboxes[keep_idxs]
+        cls_scores = cls_scores[keep_idxs]
+        labels = labels[keep_idxs]
+        scores_list.append(cls_scores)
+        labels_list.append(labels)
+        bboxes_list.append(cur_bboxes)
+
+    scores = torch.cat(scores_list, dim=0)
+    labels = torch.cat(labels_list, dim=0)
+    bboxes = torch.cat(bboxes_list, dim=0)
+
+    keep_idxs = scores > score_thr
+    scores = scores[keep_idxs]
+    labels = labels[keep_idxs]
+    bboxes = bboxes[keep_idxs]
+    if len(keep_idxs) > max_dets:
+        _, sorted_idx = torch.sort(scores, descending=True)
+        keep_idxs = sorted_idx[:max_dets]
+        bboxes = bboxes[keep_idxs]
+        scores = scores[keep_idxs]
+        labels = labels[keep_idxs]
+
+    # Get candidate predict info by num_dets
+    scores = scores.cpu().numpy()
+    bboxes = bboxes.cpu().numpy()
+    labels = labels.cpu().numpy()
+
+    bboxes -= np.array(
+        [pad_param[1], pad_param[0], pad_param[1], pad_param[0]])
+    bboxes /= scale_factor
+    bboxes[:, 0::2] = np.clip(bboxes[:, 0::2], 0, w)
+    bboxes[:, 1::2] = np.clip(bboxes[:, 1::2], 0, h)
+    bboxes = bboxes.round().astype('int')
+
+    image_out = visualize(ori_image, bboxes, labels, scores, texts)
+    cv2.imwrite(osp.join(output_dir, osp.basename(image_path)), image_out)
+    return image_out
+
+
+def main():
+
+    args = parse_args()
+    onnx_file = args.onnx
+    # init ONNX session
+    ort_session = ort.InferenceSession(
+        onnx_file, providers=['CUDAExecutionProvider', 'CPUExecutionProvider'])
+    print("Init ONNX Runtime session")
+    output_dir = "onnx_outputs"
+    if not osp.exists(output_dir):
+        os.mkdir(output_dir)
+
+    # load images
+    if not osp.isfile(args.image):
+        images = [
+            osp.join(args.image, img) for img in os.listdir(args.image)
+            if img.endswith('.png') or img.endswith('.jpg')
+        ]
+    else:
+        images = [args.image]
+
+    if args.text.endswith('.txt'):
+        with open(args.text) as f:
+            lines = f.readlines()
+        texts = [[t.rstrip('\r\n')] for t in lines]
+    elif args.text.endswith('.json'):
+        texts = json.load(open(args.text))
+    else:
+        texts = [[t.strip()] for t in args.text.split(',')]
+
+    print("Start to inference.")
+    progress_bar = ProgressBar(len(images))
+
+    if args.onnx_nms:
+        inference_func = inference
+    else:
+        inference_func = inference_with_postprocessing
+
+    for img in images:
+        inference_func(ort_session, img, texts, output_dir=output_dir)
+        progress_bar.update()
+    print("Finish inference")
+
+
+if __name__ == "__main__":
+    main()
diff --git a/mmdetection_practice/deploy/tflite_demo.py b/mmdetection_practice/deploy/tflite_demo.py
new file mode 100644
index 0000000..ae5bf1a
--- /dev/null
+++ b/mmdetection_practice/deploy/tflite_demo.py
@@ -0,0 +1,254 @@
+import os
+import json
+import argparse
+import os.path as osp
+
+import cv2
+import tqdm
+import torch
+import numpy as np
+import tensorflow as tf
+import supervision as sv
+from torchvision.ops import nms
+
+BOUNDING_BOX_ANNOTATOR = sv.BoundingBoxAnnotator(thickness=1)
+MASK_ANNOTATOR = sv.MaskAnnotator()
+
+
+class LabelAnnotator(sv.LabelAnnotator):
+
+    @staticmethod
+    def resolve_text_background_xyxy(
+        center_coordinates,
+        text_wh,
+        position,
+    ):
+        center_x, center_y = center_coordinates
+        text_w, text_h = text_wh
+        return center_x, center_y, center_x + text_w, center_y + text_h
+
+
+LABEL_ANNOTATOR = LabelAnnotator(text_padding=4,
+                                 text_scale=0.5,
+                                 text_thickness=1)
+
+
+def parse_args():
+    parser = argparse.ArgumentParser('YOLO-World TFLite (INT8) Demo')
+    parser.add_argument('path', help='TFLite Model `.tflite`')
+    parser.add_argument('image', help='image path, include image file or dir.')
+    parser.add_argument(
+        'text',
+        help=
+        'detecting texts (str, txt, or json), should be consistent with the ONNX model'
+    )
+    parser.add_argument('--output-dir',
+                        default='./output',
+                        help='directory to save output files')
+    args = parser.parse_args()
+    return args
+
+
+def preprocess(image, size=(640, 640)):
+    h, w = image.shape[:2]
+    max_size = max(h, w)
+    scale_factor = size[0] / max_size
+    pad_h = (max_size - h) // 2
+    pad_w = (max_size - w) // 2
+    pad_image = np.zeros((max_size, max_size, 3), dtype=image.dtype)
+    pad_image[pad_h:h + pad_h, pad_w:w + pad_w] = image
+    image = cv2.resize(pad_image, size,
+                       interpolation=cv2.INTER_LINEAR).astype('float32')
+    image /= 255.0
+    image = image[None]
+    return image, scale_factor, (pad_h, pad_w)
+
+
+def generate_anchors_per_level(feat_size, stride, offset=0.5):
+    h, w = feat_size
+    shift_x = (torch.arange(0, w) + offset) * stride
+    shift_y = (torch.arange(0, h) + offset) * stride
+    yy, xx = torch.meshgrid(shift_y, shift_x)
+    anchors = torch.stack([xx, yy]).reshape(2, -1).transpose(0, 1)
+    return anchors
+
+
+def generate_anchors(feat_sizes=[(80, 80), (40, 40), (20, 20)],
+                     strides=[8, 16, 32],
+                     offset=0.5):
+    anchors = [
+        generate_anchors_per_level(fs, s, offset)
+        for fs, s in zip(feat_sizes, strides)
+    ]
+    anchors = torch.cat(anchors)
+    return anchors
+
+
+def simple_bbox_decode(points, pred_bboxes, stride):
+
+    pred_bboxes = pred_bboxes * stride[None, :, None]
+    x1 = points[..., 0] - pred_bboxes[..., 0]
+    y1 = points[..., 1] - pred_bboxes[..., 1]
+    x2 = points[..., 0] + pred_bboxes[..., 2]
+    y2 = points[..., 1] + pred_bboxes[..., 3]
+    bboxes = torch.stack([x1, y1, x2, y2], -1)
+
+    return bboxes
+
+
+def visualize(image, bboxes, labels, scores, texts):
+    detections = sv.Detections(xyxy=bboxes, class_id=labels, confidence=scores)
+    labels = [
+        f"{texts[class_id][0]} {confidence:0.2f}" for class_id, confidence in
+        zip(detections.class_id, detections.confidence)
+    ]
+
+    image = BOUNDING_BOX_ANNOTATOR.annotate(image, detections)
+    image = LABEL_ANNOTATOR.annotate(image, detections, labels=labels)
+    return image
+
+
+def inference_per_sample(interp,
+                         image_path,
+                         texts,
+                         priors,
+                         strides,
+                         output_dir,
+                         size=(640, 640),
+                         vis=False,
+                         score_thr=0.05,
+                         nms_thr=0.3,
+                         max_dets=300):
+
+    # input / output details from TFLite
+    input_details = interp.get_input_details()
+    output_details = interp.get_output_details()
+
+    # load image from path
+    ori_image = cv2.imread(image_path)
+    h, w = ori_image.shape[:2]
+    image, scale_factor, pad_param = preprocess(ori_image[:, :, [2, 1, 0]],
+                                                size)
+
+    # inference
+    interp.set_tensor(input_details[0]['index'], image)
+    interp.invoke()
+
+    scores = interp.get_tensor(output_details[1]['index'])
+    bboxes = interp.get_tensor(output_details[0]['index'])
+
+    # can be converted to numpy for other devices
+    # using torch here is only for references.
+    ori_scores = torch.from_numpy(scores[0])
+    ori_bboxes = torch.from_numpy(bboxes)
+
+    # decode bbox cordinates with priors
+    decoded_bboxes = simple_bbox_decode(priors, ori_bboxes, strides)[0]
+    scores_list = []
+    labels_list = []
+    bboxes_list = []
+    for cls_id in range(len(texts)):
+        cls_scores = ori_scores[:, cls_id]
+        labels = torch.ones(cls_scores.shape[0], dtype=torch.long) * cls_id
+        keep_idxs = nms(decoded_bboxes, cls_scores, iou_threshold=0.5)
+        cur_bboxes = decoded_bboxes[keep_idxs]
+        cls_scores = cls_scores[keep_idxs]
+        labels = labels[keep_idxs]
+        scores_list.append(cls_scores)
+        labels_list.append(labels)
+        bboxes_list.append(cur_bboxes)
+
+    scores = torch.cat(scores_list, dim=0)
+    labels = torch.cat(labels_list, dim=0)
+    bboxes = torch.cat(bboxes_list, dim=0)
+
+    keep_idxs = scores > score_thr
+    scores = scores[keep_idxs]
+    labels = labels[keep_idxs]
+    bboxes = bboxes[keep_idxs]
+    # only for visualization, add an extra NMS
+    keep_idxs = nms(bboxes, scores, iou_threshold=nms_thr)
+    num_dets = min(len(keep_idxs), max_dets)
+    bboxes = bboxes[keep_idxs].unsqueeze(0)
+    scores = scores[keep_idxs].unsqueeze(0)
+    labels = labels[keep_idxs].unsqueeze(0)
+
+    scores = scores[0, :num_dets].numpy()
+    bboxes = bboxes[0, :num_dets].numpy()
+    labels = labels[0, :num_dets].numpy()
+
+    bboxes -= np.array(
+        [pad_param[1], pad_param[0], pad_param[1], pad_param[0]])
+    bboxes /= scale_factor
+    bboxes[:, 0::2] = np.clip(bboxes[:, 0::2], 0, w)
+    bboxes[:, 1::2] = np.clip(bboxes[:, 1::2], 0, h)
+
+    if vis:
+        image_out = visualize(ori_image, bboxes, labels, scores, texts)
+        cv2.imwrite(osp.join(output_dir, osp.basename(image_path)), image_out)
+        print(f"detecting {num_dets} objects.")
+        return image_out, ori_scores, ori_bboxes[0]
+    else:
+        return bboxes, labels, scores
+
+
+def main():
+
+    args = parse_args()
+    tflite_file = args.tflite
+    # init ONNX session
+    interpreter = tf.lite.Interpreter(model_path=tflite_file,
+                                      experimental_preserve_all_tensors=True)
+    interpreter.allocate_tensors()
+    print("Init TFLite Interpter")
+    output_dir = "onnx_outputs"
+    if not osp.exists(output_dir):
+        os.mkdir(output_dir)
+
+    # load images
+    if not osp.isfile(args.image):
+        images = [
+            osp.join(args.image, img) for img in os.listdir(args.image)
+            if img.endswith('.png') or img.endswith('.jpg')
+        ]
+    else:
+        images = [args.image]
+
+    if args.text.endswith('.txt'):
+        with open(args.text) as f:
+            lines = f.readlines()
+        texts = [[t.rstrip('\r\n')] for t in lines]
+    elif args.text.endswith('.json'):
+        texts = json.load(open(args.text))
+    else:
+        texts = [[t.strip()] for t in args.text.split(',')]
+
+    size = (640, 640)
+    strides = [8, 16, 32]
+
+    # prepare anchors, since TFLite models does not contain anchors, due to INT8 quantization.
+    featmap_sizes = [(size[0] // s, size[1] // s) for s in strides]
+    flatten_priors = generate_anchors(featmap_sizes, strides=strides)
+    mlvl_strides = [
+        flatten_priors.new_full((featmap_size[0] * featmap_size[1] * 1, ),
+                                stride)
+        for featmap_size, stride in zip(featmap_sizes, strides)
+    ]
+    flatten_strides = torch.cat(mlvl_strides)
+
+    print("Start to inference.")
+    for img in tqdm.tqdm(images):
+        inference_per_sample(interpreter,
+                             img,
+                             texts,
+                             flatten_priors[None],
+                             flatten_strides,
+                             output_dir=output_dir,
+                             vis=True,
+                             score_thr=0.3,
+                             nms_thr=0.5)
+    print("Finish inference")
+
+
+if __name__ == "__main__":
+    main()
diff --git a/mmdetection_practice/docs/data.md b/mmdetection_practice/docs/data.md
new file mode 100644
index 0000000..9e792f6
--- /dev/null
+++ b/mmdetection_practice/docs/data.md
@@ -0,0 +1,124 @@
+## Preparing Data for YOLO-World
+
+### Overview
+
+For pre-training YOLO-World, we adopt several datasets as listed in the below table:
+
+| Data | Samples | Type | Boxes  |
+| :-- | :-----: | :---:| :---: | 
+| Objects365v1 | 609k | detection | 9,621k |
+| GQA | 621k | grounding | 3,681k |
+| Flickr | 149k | grounding | 641k |
+| CC3M-Lite | 245k | image-text | 821k |
+ 
+### Dataset Directory
+
+We put all data into the `data` directory, such as:
+
+```bash
+├── coco
+│   ├── annotations
+│   ├── lvis
+│   ├── train2017
+│   ├── val2017
+├── flickr
+│   ├── annotations
+│   └── images
+├── mixed_grounding
+│   ├── annotations
+│   ├── images
+├── mixed_grounding
+│   ├── annotations
+│   ├── images
+├── objects365v1
+│   ├── annotations
+│   ├── train
+│   ├── val
+```
+**NOTE**: We strongly suggest that you check the directories or paths in the dataset part of the config file, especially for the values `ann_file`, `data_root`, and `data_prefix`.
+
+We provide the annotations of the pre-training data in the below table:
+
+| Data | images | Annotation File |
+| :--- | :------| :-------------- |
+| Objects365v1 | [`Objects365 train`](https://opendatalab.com/OpenDataLab/Objects365_v1) | [`objects365_train.json`](https://opendatalab.com/OpenDataLab/Objects365_v1) |
+| MixedGrounding | [`GQA`](https://nlp.stanford.edu/data/gqa/images.zip) | [`final_mixed_train_no_coco.json`](https://huggingface.co/GLIPModel/GLIP/tree/main/mdetr_annotations/final_mixed_train_no_coco.json) |
+| Flickr30k | [`Flickr30k`](https://shannon.cs.illinois.edu/DenotationGraph/) |[`final_flickr_separateGT_train.json`](https://huggingface.co/GLIPModel/GLIP/tree/main/mdetr_annotations/final_flickr_separateGT_train.json) |
+| LVIS-minival | [`COCO val2017`](https://cocodataset.org/) | [`lvis_v1_minival_inserted_image_name.json`](https://huggingface.co/GLIPModel/GLIP/blob/main/lvis_v1_minival_inserted_image_name.json) |
+
+**Acknowledgement:** We sincerely thank [GLIP](https://github.com/microsoft/GLIP) and [mdetr](https://github.com/ashkamath/mdetr) for providing the annotation files for pre-training.
+
+
+### Dataset Class
+
+> For fine-tuning YOLO-World on Close-set Object Detection, using `MultiModalDataset` is recommended.
+
+#### Setting CLASSES/Categories
+
+If you use `COCO-format` custom datasets, you "DO NOT" need to define a dataset class for custom vocabularies/categories.
+Explicitly setting the CLASSES in the config file through `metainfo=dict(classes=your_classes),` is simple:
+
+```python
+
+coco_train_dataset = dict(
+    _delete_=True,
+    type='MultiModalDataset',
+    dataset=dict(
+        type='YOLOv5CocoDataset',
+        metainfo=dict(classes=your_classes),
+        data_root='data/your_data',
+        ann_file='annotations/your_annotation.json',
+        data_prefix=dict(img='images/'),
+        filter_cfg=dict(filter_empty_gt=False, min_size=32)),
+    class_text_path='data/texts/your_class_texts.json',
+    pipeline=train_pipeline)
+```
+
+
+For training YOLO-World, we mainly adopt two kinds of dataset classs:
+
+#### 1. `MultiModalDataset`
+
+`MultiModalDataset` is a simple wrapper for pre-defined Dataset Class, such as `Objects365` or `COCO`, which add the texts (category texts) into the dataset instance for formatting input texts.  
+
+**Text JSON**
+
+The json file is formatted as follows:
+
+```json
+[
+    ['A_1','A_2'],
+    ['B'],
+    ['C_1', 'C_2', 'C_3'],
+    ...
+]
+```
+
+We have provided the text json for [`LVIS`](./../data/texts/lvis_v1_class_texts.json), [`COCO`](../data/texts/coco_class_texts.json), and [`Objects365`](../data/texts/obj365v1_class_texts.json)
+
+#### 2. `YOLOv5MixedGroundingDataset`
+
+The `YOLOv5MixedGroundingDataset` extends the `COCO` dataset by supporting loading texts/captions from the json file. It's desgined for `MixedGrounding` or `Flickr30K` with text tokens for each object.
+
+
+
+### 🔥 Custom Datasets
+
+For custom dataset, we suggest the users convert the annotation files according to the usage. Note that, converting the annotations to the **standard COCO format** is basically required.
+
+1. **Large vocabulary, grounding, referring:** you can follow the annotation format as the `MixedGrounding` dataset, which adds `caption` and `tokens_positive` for assigning the text for each object. The texts can be a category or a noun phrases.
+
+2. **Custom vocabulary (fixed):** you can adopt the `MultiModalDataset` wrapper as the `Objects365` and create a **text json** for your custom categories.
+
+
+### CC3M Pseudo Annotations
+
+The following annotations are generated according to the automatic labeling process in our paper. Adn we report the results based on these annotations.
+
+To use CC3M annotations, you need to prepare the `CC3M` images first.
+
+| Data | Images | Boxes | File |
+| :--: | :----: | :---: | :---: |
+| CC3M-246K | 246,363 | 820,629 | [Download 🤗](https://huggingface.co/wondervictor/YOLO-World/blob/main/cc3m_pseudo_annotations.json) |
+| CC3M-500K | 536,405 | 1,784,405| [Download 🤗](https://huggingface.co/wondervictor/YOLO-World/blob/main/cc3m_pseudo_500k_annotations.json) |
+| CC3M-750K | 750,000 | 4,504,805 | [Download 🤗](https://huggingface.co/wondervictor/YOLO-World/blob/main/cc3m_pseudo_750k_annotations.json) |
\ No newline at end of file
diff --git a/mmdetection_practice/docs/deploy.md b/mmdetection_practice/docs/deploy.md
new file mode 100644
index 0000000..b55d64c
--- /dev/null
+++ b/mmdetection_practice/docs/deploy.md
@@ -0,0 +1,59 @@
+## Deploy YOLO-World
+
+- [x] ONNX export
+- [x] ONNX demo
+- [ ] TensorRT
+- [ ] TFLite
+
+We provide several ways to deploy YOLO-World with ONNX or TensorRT
+
+### Priliminaries
+
+```bash
+pip install supervision onnx onnxruntime onnxsim
+```
+
+### Export ONNX on Gradio Demo
+
+start the `demo.py` and you can modify the texts in the demo and output the ONNX model.
+
+```bash
+python demo.py path/to/config path/to/weights
+```
+
+### Export YOLO-World to ONNX models
+
+You can also use [`export_onnx.py`](../deploy/export_onnx.py) to obtain the ONNX model. You might specify the `--custom-text` with your own `Text JSON` for your custom prompts. The format of `Text JSON` can be found in [`docs/data`](../docs/data.md).
+
+```bash
+PYTHONPATH=./ python deploy/export_onnx.py path/to/config path/to/weights --custom-text path/to/customtexts --opset 11
+```
+
+If you don't want to include `NMS` or "post-processing" into the ONNX model, you can add `--without-nms`
+```bash
+PYTHONPATH=./ python deploy/export_onnx.py path/to/config path/to/weights --custom-text path/to/customtexts --opset 11 --without-nms
+```
+
+If you want to quantize YOLO-World with ONNX model, you'd better remove `NMS` and `bbox_decoder` by adding `--without-bbox-decoder`
+
+```bash
+PYTHONPATH=./ python deploy/export_onnx.py path/to/config path/to/weights --custom-text path/to/customtexts --opset 11 --without-bbox-decoder
+```
+
+**Running ONNX demo**
+
+```bash
+python deploy/onnx_demo.py path/to/model.onnx path/to/images path/to/texts
+```
+
+
+### Export YOLO-World to TensorRT models
+
+coming soon.
+
+### FAQ
+
+**Q1**. `RuntimeError: Exporting the operator einsum to ONNX opset version 11 is not supported. Support for this operator was added in version 12, try exporting with this version.`
+
+**A:** This error arises because YOLO-World adopts `einsum` for matrix multiplication while it is not supported by `opset 11`. You can set the `--opset` from `11` to `12` if your device supports or change the `einsum` to normal `permute/reshape/multiplication` by set `use_einsum=False` in the `MaxSigmoidCSPLayerWithTwoConv` and `YOLOWorldHeadModule`. You can refer to the [sample config](../configs/pretrain/yolo_world_v2_m_vlpan_bn_noeinsum_2e-3_100e_4x8gpus_obj365v1_goldg_train_lvis_minival.py) without einsum.
+
diff --git a/mmdetection_practice/docs/faq.md b/mmdetection_practice/docs/faq.md
new file mode 100644
index 0000000..48817d2
--- /dev/null
+++ b/mmdetection_practice/docs/faq.md
@@ -0,0 +1,9 @@
+## Frequently Asked Questions (FAQ)
+
+
+1. ` Incorrect path_or_model_id`
+```bash
+OSError: class `YOLOWorldDetector` in yolo_world/models/detectors/yolo_world.py: class `MultiModalYOLOBackbone` in yolo_world/models/backbones/mm_backbone.py: class `HuggingCLIPLanguageBackbone` in yolo_world/models/backbones/mm_backbone.py: Incorrect path_or_model_id: '../pretrained_models/clip-vit-base-patch32-projection'. Please provide either the path to a local folder or the repo_id of a model on the Hub.
+```
+
+**Solution:** 
\ No newline at end of file
diff --git a/mmdetection_practice/docs/finetuning.md b/mmdetection_practice/docs/finetuning.md
new file mode 100644
index 0000000..d128369
--- /dev/null
+++ b/mmdetection_practice/docs/finetuning.md
@@ -0,0 +1,105 @@
+## Fine-tuning YOLO-World
+
+Fine-tuning YOLO-World is easy and we provide the samples for COCO object detection as a simple guidance.
+
+
+### Fine-tuning Requirements
+
+Fine-tuning YOLO-World is cheap:
+
+* it does not require 32 GPUs for multi-node distributed training. **8 GPUs or even 1 GPU** is enough.
+
+* it does not require the long schedule, *e.g.,* 300 epochs or 500 epochs for training YOLOv5 or YOLOv8. **80 epochs or fewer** is enough considering that we provide the good pre-trained weights.
+
+### Data Preparation
+
+The fine-tuning dataset should have the similar format as the that of the pre-training dataset.
+We suggest you refer to [`docs/data`](./data.md) for more details about how to build the datasets:
+
+* if you fine-tune YOLO-World for close-set / custom vocabulary object detection, using `MultiModalDataset` with a `text json` is preferred.
+
+* if you fine-tune YOLO-World for open-vocabulary detection with rich texts or grounding tasks, using `MixedGroundingDataset` is preferred.
+
+### Hyper-parameters and Config
+
+Please refer to the [config for fine-tuning YOLO-World-L on COCO](../configs/finetune_coco/yolo_world_l_dual_vlpan_2e-4_80e_8gpus_finetune_coco.py) for more details.
+
+1. Basic config file:
+
+If the fine-tuning dataset **contains mask annotations**:
+
+```python
+_base_ = ('../../third_party/mmyolo/configs/yolov8/yolov8_l_mask-refine_syncbn_fast_8xb16-500e_coco.py')
+```
+
+If the fine-tuning dataset **doesn't contain mask annotations**:
+
+```python
+_base_ = ('../../third_party/mmyolo/configs/yolov8/yolov8_l_syncbn_fast_8xb16-500e_coco.py')
+```
+
+2. Training Schemes:
+
+Reducing the epochs and adjusting the learning rate
+
+```python
+max_epochs = 80
+base_lr = 2e-4
+weight_decay = 0.05
+train_batch_size_per_gpu = 16
+close_mosaic_epochs=10
+
+train_cfg = dict(
+    max_epochs=max_epochs,
+    val_interval=5,
+    dynamic_intervals=[((max_epochs - close_mosaic_epochs),
+                        _base_.val_interval_stage2)])
+
+```
+
+3. Datasets:
+
+```python
+coco_train_dataset = dict(
+    _delete_=True,
+    type='MultiModalDataset',
+    dataset=dict(
+        type='YOLOv5CocoDataset',
+        data_root='data/coco',
+        ann_file='annotations/instances_train2017.json',
+        data_prefix=dict(img='train2017/'),
+        filter_cfg=dict(filter_empty_gt=False, min_size=32)),
+    class_text_path='data/texts/coco_class_texts.json',
+    pipeline=train_pipeline)
+```
+
+#### Finetuning without RepVL-PAN or Text Encoder 🚀
+
+For further efficiency and simplicity, we can fine-tune an efficient version of YOLO-World without RepVL-PAN and the text encoder.
+The efficient version of YOLO-World has the similar architecture or layers with the orignial YOLOv8 but we provide the pre-trained weights on large-scale datasets.
+The pre-trained YOLO-World has strong generalization capabilities and is more robust compared to YOLOv8 trained on the COCO dataset.
+
+You can refer to the [config for Efficient YOLO-World](./../configs/finetune_coco/yolo_world_l_efficient_neck_2e-4_80e_8gpus_finetune_coco.py) for more details.
+
+The efficient YOLO-World adopts `EfficientCSPLayerWithTwoConv` and the text encoder can be removed during inference or exporting models.
+
+```python
+
+model = dict(
+    type='YOLOWorldDetector',
+    mm_neck=True,
+    neck=dict(type='YOLOWorldPAFPN',
+              guide_channels=text_channels,
+              embed_channels=neck_embed_channels,
+              num_heads=neck_num_heads,
+              block_cfg=dict(type='EfficientCSPLayerWithTwoConv')))
+
+```
+
+### Launch Fine-tuning!
+
+It's easy:
+
+```bash
+./dist_train.sh <path/to/config> <NUM_GPUS> --amp
+```
diff --git a/mmdetection_practice/docs/installation.md b/mmdetection_practice/docs/installation.md
new file mode 100644
index 0000000..73a4a04
--- /dev/null
+++ b/mmdetection_practice/docs/installation.md
@@ -0,0 +1,43 @@
+## Installation Guide
+
+YOLO-World is built based on `pytorch=1.11.0` and `mmcv=2.0.0`.
+
+We provide the `requirements` files in [./requirements](./../requirements/):
+
+* `basic_requirements`: training, finetuning, evaluation.
+* `demo_requirements`: running YOLO-World [demos](./../demo/).
+* `onnx_requirements`: converting YOLO-World to ONNX or TFLite models (TFLite is coming soon).
+
+#### Install `MMCV`
+
+YOLO-World adopts `mmcv>=2.0.0`. There are several ways to install `mmcv`
+
+**1. using `openmim`**:
+
+see more in [official guide](https://github.com/open-mmlab/mmcv/tree/master?tab=readme-ov-file#install-mmcv-full).
+
+```bash
+pip install openmim
+mim install mmcv==2.0.0 
+```
+
+**2. using `pip`**:
+
+go to [install-with-pip](https://mmcv.readthedocs.io/en/latest/get_started/installation.html#install-with-pip) to select the pip index. 
+
+```bash
+# cuda=11.3, torch=1.11
+pip install mmcv==2.0.0 -f https://download.openmmlab.com/mmcv/dist/cu113/torch1.11/index.html
+# cuda=11.7, torch=1.13
+pip install mmcv==2.2.0 -f https://download.openmmlab.com/mmcv/dist/cu117/torch1.13/index.html
+# cuda=12.1, torch=2.1
+pip install mmcv==2.1.0 -f https://download.openmmlab.com/mmcv/dist/cu121/torch2.1/index.html
+```
+
+**3. using `whl`**
+
+go to [index packages](https://download.openmmlab.com/mmcv/dist/cu117/torch1.13/index.html) to find a suitable version and download.
+
+```bash
+pip install mmcv-2.0.1-cp38-cp38-manylinux1_x86_64.whl
+```
\ No newline at end of file
diff --git a/mmdetection_practice/docs/prompt_yolo_world.md b/mmdetection_practice/docs/prompt_yolo_world.md
new file mode 100644
index 0000000..28eaa18
--- /dev/null
+++ b/mmdetection_practice/docs/prompt_yolo_world.md
@@ -0,0 +1,73 @@
+## Prompt YOLO-World
+
+
+### 1. Simple YOLO-World with Embeddings
+
+For simplifying YOLO-World and get rid of the language model, we define a new basic detector `SimpleYOLOWorldDetector`:
+
+The `SimpleYOLOWorldDetector` supports prompt embeddings as the input and doesn't not contain a language model anymore!
+Now, YOLO-World adopts `embeddings` as language inputs, and the embeddings support several kinds: (1) text embeddings from the language model, e.g., CLIP language encoder, (2) image embeddings from a vision model, e.g., CLIP vision encoder, and (3) image-text fused embeddings, and (4) random embeddings.
+The (1)(2)(3) supports zero-shot inference and (4), including (1)(2)(3) are designed for prompt tuning on your custom data.
+
+The basic detector is defined as follows:
+
+```python
+class SimpleYOLOWorldDetector(YOLODetector):
+    """Implementation of YOLO World Series"""
+
+    def __init__(self,
+                 *args,
+                 mm_neck: bool = False,
+                 num_train_classes=80,
+                 num_test_classes=80,
+                 prompt_dim=512,
+                 num_prompts=80,
+                 embedding_path='',
+                 freeze_prompt=False,
+                 use_mlp_adapter=False,
+                 **kwargs)
+```
+
+To use it in a zero-shot manner, you need to pre-compute the text embeddings (image embeddings) and save it as a `numpy array (*.npy)` with a `NxD` shape (N is the number of prompts and D is the dimension of the embeddings). Currently, we only support one prompt for one class. You can use several prompts for one class but you need to merge the results in the post-processing steps.
+
+
+### 2. Prompt Tuning YOLO-World
+
+We introduce prompt tuning for YOLO-World to maintain the zero-shot ability while improve the performance on your custom datasets.
+
+For more details about writing configs for prompt tuning, you can refer to [`prompt tuning for COCO data`](./../configs/prompt_tuning_coco/yolo_world_v2_l_vlpan_bn_2e-4_80e_8gpus_mask-refine_prompt_tuning_coco.py).
+
+1. Use random prompts
+
+```python
+dict(type='SimpleYOLOWorldDetector',
+             mm_neck=True,
+             num_train_classes=num_training_classes,
+             num_test_classes=num_classes,
+             prompt_dim=text_channels,
+             num_prompts=80,
+             ...)
+```
+
+2. Use CLIP embeddings (text, image, or text-image embeddings)
+
+the `clip_vit_b32_coco_80_embeddings.npy` can be downloaded at [HuggingFace](https://huggingface.co/wondervictor/YOLO-World/blob/main/clip_vit_b32_coco_80_embeddings.npy).
+
+```python
+dict(type='SimpleYOLOWorldDetector',
+             mm_neck=True,
+             num_train_classes=num_training_classes,
+             num_test_classes=num_classes,
+             embedding_path='embeddings/clip_vit_b32_coco_80_embeddings.npy',
+             prompt_dim=text_channels,
+             num_prompts=80,
+             ...)
+```
+
+Using CLIP model to obtains the image and text embeddings will maintain the zero-shot performace.
+
+
+| Model | Config |  AP  | AP50 | AP75  | APS | APM | APL |
+| :---- | :----: | :--: | :--: | :---: | :-: | :-: | :-: |
+| YOLO-World-v2-L | Zero-shot | 45.7 | 61.6 | 49.8 | 29.9 | 50.0 | 60.8 |
+| [YOLO-World-v2-L](./../configs/prompt_tuning_coco/yolo_world_v2_l_vlpan_bn_2e-4_80e_8gpus_mask-refine_prompt_tuning_coco.py) | Prompt tuning | 47.9 | 64.3 | 52.5 | 31.9 | 52.6 | 61.3 | 
diff --git a/mmdetection_practice/docs/reparameterize.md b/mmdetection_practice/docs/reparameterize.md
new file mode 100644
index 0000000..9115783
--- /dev/null
+++ b/mmdetection_practice/docs/reparameterize.md
@@ -0,0 +1,77 @@
+## Reparameterize YOLO-World
+
+The reparameterization incorporates text embeddings as parameters into the model. For example, in the final classification layer, text embeddings are reparameterized into a simple 1x1 convolutional layer.
+
+<div align="center">
+<img width="600" src="../assets/reparameterize.png">
+</div>
+
+### Key Advantages from Reparameterization
+
+> Reparameterized YOLO-World still has zero-shot ability!
+
+* **Efficiency:** reparameterized YOLO-World has a simple and efficient archtecture, e.g., `conv1x1` is faster than `transpose & matmul`. In addition, it enables further optmization for deployment.
+ 
+* **Accuracy:** reparameterized YOLO-World supports fine-tuning. Compared to the normal `fine-tuning` or `prompt tuning`, **reparameterized version can optimize the `neck` and `head` independently** since the `neck` and `head` have different parameters and do not depend on `text embeddings` anymore!
+For example, fine-tuning the **reparameterized YOLO-World** obtains *46.3 AP* on COCO *val2017* while fine-tuning the normal version obtains *46.1 AP*, with all hyper-parameters kept the same.
+
+### Getting Started
+
+#### 1. Prepare cutstom text embeddings
+
+You need to generate the text embeddings by [`toos/generate_text_prompts.py`](../tools/generate_text_prompts.py) and save it as a `numpy.array` with shape `NxD`.
+
+#### 2. Reparameterizing
+
+Reparameterizing will generate a new checkpoint with text embeddings!
+
+Check those files first:
+
+* model checkpoint
+* text embeddings
+
+We mainly reparameterize two groups of modules:
+
+* head (`YOLOWorldHeadModule`)
+* neck (`MaxSigmoidCSPLayerWithTwoConv`)
+
+```bash
+python tools/reparameterize_yoloworld.py \
+    --model path/to/checkpoint \
+    --out-dir path/to/save/re-parameterized/ \
+    --text-embed path/to/text/embeddings \
+    --conv-neck
+```
+
+
+#### 3. Prepare the model config
+
+Please see the sample config: [`finetune_coco/yolo_world_v2_s_rep_vlpan_bn_2e-4_80e_8gpus_mask-refine_finetune_coco.py`](../configs/finetune_coco/yolo_world_v2_s_rep_vlpan_bn_2e-4_80e_8gpus_mask-refine_finetune_coco.py) for reparameterized training.
+
+
+* `RepConvMaxSigmoidCSPLayerWithTwoConv`:
+
+```python
+neck=dict(type='YOLOWorldPAFPN',
+        guide_channels=num_classes,
+        embed_channels=neck_embed_channels,
+        num_heads=neck_num_heads,
+        block_cfg=dict(type='RepConvMaxSigmoidCSPLayerWithTwoConv',
+                        guide_channels=num_classes)),
+```
+
+* `RepYOLOWorldHeadModule`:
+
+```python
+bbox_head=dict(head_module=dict(type='RepYOLOWorldHeadModule',
+                                embed_dims=text_channels,
+                                num_guide=num_classes,
+                                num_classes=num_classes)),
+
+```
+
+#### 4. Reparameterized Training
+
+**Reparameterized YOLO-World** is easier to fine-tune and can be treated as an enhanced and pre-trained YOLOv8!
+
+You can check [`finetune_coco/yolo_world_v2_s_rep_vlpan_bn_2e-4_80e_8gpus_mask-refine_finetune_coco.py`](../configs/finetune_coco/yolo_world_v2_s_rep_vlpan_bn_2e-4_80e_8gpus_mask-refine_finetune_coco.py) for more details.
\ No newline at end of file
diff --git a/mmdetection_practice/docs/tflite_deploy.md b/mmdetection_practice/docs/tflite_deploy.md
new file mode 100644
index 0000000..4cdadff
--- /dev/null
+++ b/mmdetection_practice/docs/tflite_deploy.md
@@ -0,0 +1,78 @@
+## Run YOLO-World (Quantized) on TF-Lite
+
+- [x] Export YOLO-World to TFLite with INT8 Quantization.
+- [x] TFLite demo
+
+### Priliminaries
+
+```bash
+pip install onnxruntime onnx onnx-simplifier
+pip install tensorflow==2.15.1
+```
+
+See [onnx2tf](https://github.com/PINTO0309/onnx2tf) for more details about export TFLite models.
+The contributor of `onnx2tf` is very nice!
+
+### Export TFLite INT8 Quantization models 
+
+Please use **Reparameterized YOLO-World** for TFLite!!
+
+1. Prepare the ONNX model
+
+Please export the ONNX model without `postprocessing` and `bbox_decoder`, just add `--without-bbox-decoder`!
+`bbox_decoder` is not supported for INT8 quantization, please take care!
+
+```bash
+PYTHONPATH=./ python deploy/export_onnx.py path/to/config path/to/weights --custom-text path/to/customtexts --opset 11 --without-bbox-decoder
+```
+
+2. Generate the calibration samples
+
+Using 100 COCO images is suggested to create a simple calibration dataset for quantization.
+
+```python
+import os
+import random
+from PIL import Image, ImageOps
+import cv2
+import glob
+import numpy as np
+
+root = "data/coco/val2017/"
+image_list = os.listdir(root)
+image_list = [os.path.join(root, f) for f in image_list]
+random.shuffle(image_list)
+
+img_datas = []
+for idx, file in enumerate(image_list[:100]):
+    image = Image.open(file).convert('RGB')
+    # Get sample input data as a numpy array in a method of your choosing.
+    img_width, img_height = image.size
+    size = max(img_width, img_height)
+    image = ImageOps.pad(image, (size, size), method=Image.BILINEAR)
+    image = image.resize((640, 640), Image.BILINEAR)
+    tensor_image = np.asarray(image).astype(np.float32)
+    tensor_image /= 255.0
+    tensor_image = np.expand_dims(tensor_image, axis=0)
+    img_datas.append(tensor_image)
+
+calib_datas = np.vstack(img_datas)
+print(f'calib_datas.shape: {calib_datas.shape}')
+np.save(file='tflite_calibration_data_100_images_640.npy', arr=calib_datas)
+
+```
+
+3. Export ONNX to TFLite using `onnx2tf`
+
+```bash
+onnx2tf -i [ONNX] -o [OUTPUT] -oiqt  -cind "images" "tflite_calibration_data_100_images_640.npy" "[[[[0.,0.,0.]]]]" "[[[[1.,1.,1.]]]]"  -onimc "scores" "bboxes" --verbosity debug
+```
+
+We provide a sample TFLite INT8 model: [yolo_world_x_coco_zeroshot_rep_integer_quant.tflite](https://huggingface.co/wondervictor/YOLO-World/blob/main/yolo_x_coco_zeroshot_rep_integer_quant.tflite)
+
+### Inference using TFLite
+
+```bash
+python deploy/tflite_demo.py path/to/tflite path/to/images path/to/texts
+
+```
\ No newline at end of file
diff --git a/mmdetection_practice/docs/updates.md b/mmdetection_practice/docs/updates.md
new file mode 100644
index 0000000..4605c76
--- /dev/null
+++ b/mmdetection_practice/docs/updates.md
@@ -0,0 +1,14 @@
+## Update Notes
+
+We provide the details for important updates of YOLO-World in this note.
+
+### Model Architecture
+
+**[2024-2-29]:** YOLO-World-v2:
+
+1. We remove the `I-PoolingAttention`: though it improves the performance for zero-shot LVIS evaluation, it affects the inference speeds after exporting YOLO-World to ONNX or TensorRT. Considering the trade-off, we remove the `I-PoolingAttention` in the newest version.
+2. We replace the `L2-Norm` in the contrastive head with the `BatchNorm`. The `L2-Norm` contains complex operations, such as `reduce`, which is time-consuming for deployment. However, the `BatchNorm` can be fused into the convolution, which is much more efficient and also improves the zero-shot performance.
+
+
+
+
diff --git a/mmdetection_practice/pyproject.toml b/mmdetection_practice/pyproject.toml
new file mode 100644
index 0000000..8351de5
--- /dev/null
+++ b/mmdetection_practice/pyproject.toml
@@ -0,0 +1,57 @@
+[build-system]
+requires = ["setuptools","wheel","torch"]
+build-backend = "setuptools.build_meta"
+
+[project]
+name = "yolo_world"
+version = "0.1.0"
+description = "YOLO-World: Real-time Open Vocabulary Object Detection"
+readme = "README.md"
+keywords = ["object detection"]
+authors = [
+    { name = "Tencent AILab", email = "ronnysong@tencent.com" },
+]
+license = {text = "Apache License 2.0"}
+
+classifiers = [
+    "Development Status :: 4 - Beta",
+    "License :: OSI Approved :: Apache Software License",
+    "Operating System :: OS Independent",
+    "Programming Language :: Python :: 3",
+    "Programming Language :: Python :: 3.7",
+    "Programming Language :: Python :: 3.8",
+    "Programming Language :: Python :: 3.9",
+    "Programming Language :: Python :: 3.10",
+    "Programming Language :: Python :: 3.11",
+    "Topic :: Scientific/Engineering :: Artificial Intelligence",
+]
+requires-python = ">= 3.7"
+
+dependencies = [
+    "wheel",
+    "torch>=1.11.0",
+    "torchvision>=0.16.2",
+    "transformers",
+    "tokenizers",
+    "numpy",
+    "opencv-python",
+    "supervision==0.19.0",
+    "openmim",
+    "mmcv-lite>=2.0.0rc4",
+    "mmdet==3.0.0",
+    "mmengine>=0.7.1",
+    "openmim",
+    "mmcv",
+    'mmyolo @ git+https://github.com/onuralpszr/mmyolo.git',
+
+]
+
+[tool.setuptools]
+package-dir = {"yolo_world" = "yolo_world"}
+include-package-data = false
+license-files = ["LICENSE"]
+zip-safe = true
+
+[tool.setuptools.packages.find]
+include = ["yolo_world*"]
+exclude = ["docs*", "tests*","third_party*","assets*"]
\ No newline at end of file
diff --git a/mmdetection_practice/requirements/basic_requirements.txt b/mmdetection_practice/requirements/basic_requirements.txt
new file mode 100644
index 0000000..d9c56e2
--- /dev/null
+++ b/mmdetection_practice/requirements/basic_requirements.txt
@@ -0,0 +1,9 @@
+opencv-python==4.9.0.80
+opencv-python-headless==4.2.0.34
+mmcv==2.0.0
+mmdet==3.0.0
+mmengine==0.10.3
+mmyolo==0.6.0
+timm==0.6.13
+transformers==4.36.2
+albumentations
\ No newline at end of file
diff --git a/mmdetection_practice/requirements/demo_requirements.txt b/mmdetection_practice/requirements/demo_requirements.txt
new file mode 100644
index 0000000..0268ad3
--- /dev/null
+++ b/mmdetection_practice/requirements/demo_requirements.txt
@@ -0,0 +1,2 @@
+gradio==4.16.0
+supervision
\ No newline at end of file
diff --git a/mmdetection_practice/requirements/onnx_requirements.txt b/mmdetection_practice/requirements/onnx_requirements.txt
new file mode 100644
index 0000000..a96fb18
--- /dev/null
+++ b/mmdetection_practice/requirements/onnx_requirements.txt
@@ -0,0 +1,4 @@
+supervision
+onnx
+onnxruntime
+onnxsim
\ No newline at end of file
diff --git a/mmdetection_practice/third_party/mmyolo/.circleci/config.yml b/mmdetection_practice/third_party/mmyolo/.circleci/config.yml
new file mode 100644
index 0000000..59ba321
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/.circleci/config.yml
@@ -0,0 +1,34 @@
+version: 2.1
+
+# this allows you to use CircleCI's dynamic configuration feature
+setup: true
+
+# the path-filtering orb is required to continue a pipeline based on
+# the path of an updated fileset
+orbs:
+  path-filtering: circleci/path-filtering@0.1.2
+
+workflows:
+  # the always-run workflow is always triggered, regardless of the pipeline parameters.
+  always-run:
+    jobs:
+      # the path-filtering/filter job determines which pipeline
+      # parameters to update.
+      - path-filtering/filter:
+          name: check-updated-files
+          # 3-column, whitespace-delimited mapping. One mapping per
+          # line:
+          # <regex path-to-test> <parameter-to-set> <value-of-pipeline-parameter>
+          mapping: |
+            mmyolo/.* lint_only false
+            requirements/.* lint_only false
+            tests/.* lint_only false
+            tools/.* lint_only false
+            configs/.* lint_only false
+            .circleci/.* lint_only false
+          base-revision: main
+          # this is the path of the configuration we should trigger once
+          # path filtering and pipeline parameter value updates are
+          # complete. In this case, we are using the parent dynamic
+          # configuration itself.
+          config-path: .circleci/test.yml
diff --git a/mmdetection_practice/third_party/mmyolo/.circleci/docker/Dockerfile b/mmdetection_practice/third_party/mmyolo/.circleci/docker/Dockerfile
new file mode 100644
index 0000000..d9cf8cc
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/.circleci/docker/Dockerfile
@@ -0,0 +1,11 @@
+ARG PYTORCH="1.8.1"
+ARG CUDA="10.2"
+ARG CUDNN="7"
+
+FROM pytorch/pytorch:${PYTORCH}-cuda${CUDA}-cudnn${CUDNN}-devel
+
+# To fix GPG key error when running apt-get update
+RUN apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/3bf863cc.pub
+RUN apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/7fa2af80.pub
+
+RUN apt-get update && apt-get install -y ninja-build libglib2.0-0 libsm6 libxrender-dev libxext6 libgl1-mesa-glx
diff --git a/mmdetection_practice/third_party/mmyolo/.circleci/test.yml b/mmdetection_practice/third_party/mmyolo/.circleci/test.yml
new file mode 100644
index 0000000..149d6ca
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/.circleci/test.yml
@@ -0,0 +1,213 @@
+version: 2.1
+
+# the default pipeline parameters, which will be updated according to
+# the results of the path-filtering orb
+parameters:
+  lint_only:
+    type: boolean
+    default: true
+
+jobs:
+  lint:
+    docker:
+      - image: cimg/python:3.7.4
+    steps:
+      - checkout
+      - run:
+          name: Install pre-commit hook
+          command: |
+            pip install pre-commit
+            pre-commit install
+      - run:
+          name: Linting
+          command: pre-commit run --all-files
+      - run:
+          name: Check docstring coverage
+          command: |
+            pip install interrogate
+            interrogate -v --ignore-init-method --ignore-module --ignore-nested-functions --ignore-magic --ignore-regex "__repr__" --fail-under 90 mmyolo
+  build_cpu:
+    parameters:
+      # The python version must match available image tags in
+      # https://circleci.com/developer/images/image/cimg/python
+      python:
+        type: string
+      torch:
+        type: string
+      torchvision:
+        type: string
+    docker:
+      - image: cimg/python:<< parameters.python >>
+    resource_class: large
+    steps:
+      - checkout
+      - run:
+          name: Install Libraries
+          command: |
+            sudo apt-get update
+            sudo apt-get install -y ninja-build libglib2.0-0 libsm6 libxrender-dev libxext6 libgl1-mesa-glx libjpeg-dev zlib1g-dev libtinfo-dev libncurses5
+      - run:
+          name: Configure Python & pip
+          command: |
+            pip install --upgrade pip
+            pip install wheel
+      - run:
+          name: Install PyTorch
+          command: |
+            python -V
+            pip install torch==<< parameters.torch >>+cpu torchvision==<< parameters.torchvision >>+cpu -f https://download.pytorch.org/whl/torch_stable.html
+      - run:
+          name: Install ONNXRuntime
+          command: |
+            pip install onnxruntime==1.8.1
+            wget https://github.com/microsoft/onnxruntime/releases/download/v1.8.1/onnxruntime-linux-x64-1.8.1.tgz
+            tar xvf onnxruntime-linux-x64-1.8.1.tgz
+      - run:
+          name: Install mmyolo dependencies
+          command: |
+            pip install -U openmim
+            mim install git+https://github.com/open-mmlab/mmengine.git@main
+            mim install 'mmcv >= 2.0.0'
+            mim install git+https://github.com/open-mmlab/mmdetection.git@dev-3.x
+            pip install -r requirements/albu.txt
+            pip install -r requirements/tests.txt
+      - run:
+          name: Install mmdeploy
+          command: |
+            pip install setuptools
+            git clone -b dev-1.x --depth 1 https://github.com/open-mmlab/mmdeploy.git mmdeploy --recurse-submodules
+            wget https://github.com/Kitware/CMake/releases/download/v3.20.0/cmake-3.20.0-linux-x86_64.tar.gz
+            tar -xzvf cmake-3.20.0-linux-x86_64.tar.gz
+            sudo ln -sf $(pwd)/cmake-3.20.0-linux-x86_64/bin/* /usr/bin/
+            cd mmdeploy && mkdir build && cd build && cmake .. -DMMDEPLOY_TARGET_BACKENDS=ort -DONNXRUNTIME_DIR=/home/circleci/project/onnxruntime-linux-x64-1.8.1 && make -j8 && make install
+            export LD_LIBRARY_PATH=/home/circleci/project/onnxruntime-linux-x64-1.8.1/lib:${LD_LIBRARY_PATH}
+            cd /home/circleci/project/mmdeploy && python -m pip install -v -e .
+      - run:
+          name: Build and install
+          command: |
+            pip install -e .
+      - run:
+          name: Run unittests
+          command: |
+            export LD_LIBRARY_PATH=/home/circleci/project/onnxruntime-linux-x64-1.8.1/lib:${LD_LIBRARY_PATH}
+            pytest tests/
+#            coverage run --branch --source mmyolo -m pytest tests/
+#            coverage xml
+#            coverage report -m
+  build_cuda:
+    parameters:
+      torch:
+        type: string
+      cuda:
+        type: enum
+        enum: ["10.1", "10.2", "11.0", "11.7"]
+      cudnn:
+        type: integer
+        default: 7
+    machine:
+      image: ubuntu-2004-cuda-11.4:202110-01
+      # docker_layer_caching: true
+    resource_class: gpu.nvidia.small
+    steps:
+      - checkout
+      - run:
+          # Cloning repos in VM since Docker doesn't have access to the private key
+          name: Clone Repos
+          command: |
+            git clone -b main --depth 1 https://github.com/open-mmlab/mmengine.git /home/circleci/mmengine
+            git clone -b dev-3.x --depth 1 https://github.com/open-mmlab/mmdetection.git /home/circleci/mmdetection
+      - run:
+          name: Build Docker image
+          command: |
+            docker build .circleci/docker -t mmyolo:gpu --build-arg PYTORCH=<< parameters.torch >> --build-arg CUDA=<< parameters.cuda >> --build-arg CUDNN=<< parameters.cudnn >>
+            docker run --gpus all -t -d -v /home/circleci/project:/mmyolo -v /home/circleci/mmengine:/mmengine -v /home/circleci/mmdetection:/mmdetection -w /mmyolo --name mmyolo mmyolo:gpu
+      - run:
+          name: Install mmyolo dependencies
+          command: |
+            docker exec mmyolo pip install -U openmim
+            docker exec mmyolo mim install -e /mmengine
+            docker exec mmyolo mim install 'mmcv >= 2.0.0'
+            docker exec mmyolo pip install -e /mmdetection
+            docker exec mmyolo pip install -r requirements/albu.txt
+            docker exec mmyolo pip install -r requirements/tests.txt
+      - run:
+          name: Build and install
+          command: |
+            docker exec mmyolo pip install -e .
+      - run:
+          name: Run unittests
+          command: |
+            docker exec mmyolo pytest tests/
+
+workflows:
+  pr_stage_lint:
+    when: << pipeline.parameters.lint_only >>
+    jobs:
+      - lint:
+          name: lint
+          filters:
+            branches:
+              ignore:
+                - main
+
+  pr_stage_test:
+    when:
+      not: << pipeline.parameters.lint_only >>
+    jobs:
+      - lint:
+          name: lint
+          filters:
+            branches:
+              ignore:
+                - main
+      - build_cpu:
+          name: minimum_version_cpu
+          torch: 1.8.0
+          torchvision: 0.9.0
+          python: 3.8.0 # The lowest python 3.7.x version available on CircleCI images
+          requires:
+            - lint
+      - build_cpu:
+          name: maximum_version_cpu
+          # mmdeploy not supported
+#          torch: 2.0.0
+#          torchvision: 0.15.1
+          torch: 1.12.1
+          torchvision: 0.13.1
+          python: 3.9.0
+          requires:
+            - minimum_version_cpu
+      - hold:
+          type: approval
+          requires:
+            - maximum_version_cpu
+      - build_cuda:
+          name: mainstream_version_gpu
+          torch: 1.8.1
+          # Use double quotation mark to explicitly specify its type
+          # as string instead of number
+          cuda: "10.2"
+          requires:
+            - hold
+      - build_cuda:
+          name: maximum_version_gpu
+          torch: 2.0.0
+          cuda: "11.7"
+          cudnn: 8
+          requires:
+            - hold
+  merge_stage_test:
+    when:
+      not: << pipeline.parameters.lint_only >>
+    jobs:
+      - build_cuda:
+          name: minimum_version_gpu
+          torch: 1.7.0
+          # Use double quotation mark to explicitly specify its type
+          # as string instead of number
+          cuda: "11.0"
+          cudnn: 8
+          filters:
+            branches:
+              only:
+                - main
diff --git a/mmdetection_practice/third_party/mmyolo/.dev_scripts/gather_models.py b/mmdetection_practice/third_party/mmyolo/.dev_scripts/gather_models.py
new file mode 100644
index 0000000..f05e2b5
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/.dev_scripts/gather_models.py
@@ -0,0 +1,312 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+import argparse
+import glob
+import os
+import os.path as osp
+import shutil
+import subprocess
+import time
+from collections import OrderedDict
+
+import torch
+import yaml
+from mmengine.config import Config
+from mmengine.fileio import dump
+from mmengine.utils import mkdir_or_exist, scandir
+
+
+def ordered_yaml_dump(data, stream=None, Dumper=yaml.SafeDumper, **kwds):
+
+    class OrderedDumper(Dumper):
+        pass
+
+    def _dict_representer(dumper, data):
+        return dumper.represent_mapping(
+            yaml.resolver.BaseResolver.DEFAULT_MAPPING_TAG, data.items())
+
+    OrderedDumper.add_representer(OrderedDict, _dict_representer)
+    return yaml.dump(data, stream, OrderedDumper, **kwds)
+
+
+def process_checkpoint(in_file, out_file):
+    checkpoint = torch.load(in_file, map_location='cpu')
+    # remove optimizer for smaller file size
+    if 'optimizer' in checkpoint:
+        del checkpoint['optimizer']
+    if 'message_hub' in checkpoint:
+        del checkpoint['message_hub']
+    if 'ema_state_dict' in checkpoint:
+        del checkpoint['ema_state_dict']
+
+    for key in list(checkpoint['state_dict']):
+        if key.startswith('data_preprocessor'):
+            checkpoint['state_dict'].pop(key)
+        elif 'priors_base_sizes' in key:
+            checkpoint['state_dict'].pop(key)
+        elif 'grid_offset' in key:
+            checkpoint['state_dict'].pop(key)
+        elif 'prior_inds' in key:
+            checkpoint['state_dict'].pop(key)
+
+    # if it is necessary to remove some sensitive data in checkpoint['meta'],
+    # add the code here.
+    if torch.__version__ >= '1.6':
+        torch.save(checkpoint, out_file, _use_new_zipfile_serialization=False)
+    else:
+        torch.save(checkpoint, out_file)
+    sha = subprocess.check_output(['sha256sum', out_file]).decode()
+    final_file = out_file.rstrip('.pth') + f'-{sha[:8]}.pth'
+    subprocess.Popen(['mv', out_file, final_file])
+    return final_file
+
+
+def is_by_epoch(config):
+    cfg = Config.fromfile('./configs/' + config)
+    return cfg.train_cfg.type == 'EpochBasedTrainLoop'
+
+
+def get_final_epoch_or_iter(config):
+    cfg = Config.fromfile('./configs/' + config)
+    if cfg.train_cfg.type == 'EpochBasedTrainLoop':
+        return cfg.train_cfg.max_epochs
+    else:
+        return cfg.train_cfg.max_iters
+
+
+def get_best_epoch_or_iter(exp_dir):
+    best_epoch_iter_full_path = list(
+        sorted(glob.glob(osp.join(exp_dir, 'best_*.pth'))))[-1]
+    best_epoch_or_iter_model_path = best_epoch_iter_full_path.split('/')[-1]
+    best_epoch_or_iter = best_epoch_or_iter_model_path. \
+        split('_')[-1].split('.')[0]
+    return best_epoch_or_iter_model_path, int(best_epoch_or_iter)
+
+
+def get_real_epoch_or_iter(config):
+    cfg = Config.fromfile('./configs/' + config)
+    if cfg.train_cfg.type == 'EpochBasedTrainLoop':
+        epoch = cfg.train_cfg.max_epochs
+        return epoch
+    else:
+        return cfg.runner.max_iters
+
+
+def get_final_results(log_json_path,
+                      epoch_or_iter,
+                      results_lut='coco/bbox_mAP',
+                      by_epoch=True):
+    result_dict = dict()
+    with open(log_json_path) as f:
+        r = f.readlines()[-1]
+        last_metric = r.split(',')[0].split(': ')[-1].strip()
+    result_dict[results_lut] = last_metric
+    return result_dict
+
+
+def get_dataset_name(config):
+    # If there are more dataset, add here.
+    name_map = dict(
+        CityscapesDataset='Cityscapes',
+        CocoDataset='COCO',
+        PoseCocoDataset='COCO Person',
+        YOLOv5CocoDataset='COCO',
+        CocoPanopticDataset='COCO',
+        YOLOv5DOTADataset='DOTA 1.0',
+        DeepFashionDataset='Deep Fashion',
+        LVISV05Dataset='LVIS v0.5',
+        LVISV1Dataset='LVIS v1',
+        VOCDataset='Pascal VOC',
+        YOLOv5VOCDataset='Pascal VOC',
+        WIDERFaceDataset='WIDER Face',
+        OpenImagesDataset='OpenImagesDataset',
+        OpenImagesChallengeDataset='OpenImagesChallengeDataset')
+    cfg = Config.fromfile('./configs/' + config)
+    return name_map[cfg.dataset_type]
+
+
+def find_last_dir(model_dir):
+    dst_times = []
+    for time_stamp in os.scandir(model_dir):
+        if osp.isdir(time_stamp):
+            dst_time = time.mktime(
+                time.strptime(time_stamp.name, '%Y%m%d_%H%M%S'))
+            dst_times.append([dst_time, time_stamp.name])
+    return max(dst_times, key=lambda x: x[0])[1]
+
+
+def convert_model_info_to_pwc(model_infos):
+    pwc_files = {}
+    for model in model_infos:
+        cfg_folder_name = osp.split(model['config'])[-2]
+        pwc_model_info = OrderedDict()
+        pwc_model_info['Name'] = osp.split(model['config'])[-1].split('.')[0]
+        pwc_model_info['In Collection'] = 'Please fill in Collection name'
+        pwc_model_info['Config'] = osp.join('configs', model['config'])
+
+        # get metadata
+        meta_data = OrderedDict()
+        if 'epochs' in model:
+            meta_data['Epochs'] = get_real_epoch_or_iter(model['config'])
+        else:
+            meta_data['Iterations'] = get_real_epoch_or_iter(model['config'])
+        pwc_model_info['Metadata'] = meta_data
+
+        # get dataset name
+        dataset_name = get_dataset_name(model['config'])
+
+        # get results
+        results = []
+        # if there are more metrics, add here.
+        if 'bbox_mAP' in model['results']:
+            metric = round(model['results']['bbox_mAP'] * 100, 1)
+            results.append(
+                OrderedDict(
+                    Task='Object Detection',
+                    Dataset=dataset_name,
+                    Metrics={'box AP': metric}))
+        if 'segm_mAP' in model['results']:
+            metric = round(model['results']['segm_mAP'] * 100, 1)
+            results.append(
+                OrderedDict(
+                    Task='Instance Segmentation',
+                    Dataset=dataset_name,
+                    Metrics={'mask AP': metric}))
+        if 'PQ' in model['results']:
+            metric = round(model['results']['PQ'], 1)
+            results.append(
+                OrderedDict(
+                    Task='Panoptic Segmentation',
+                    Dataset=dataset_name,
+                    Metrics={'PQ': metric}))
+        pwc_model_info['Results'] = results
+
+        link_string = 'https://download.openmmlab.com/mmyolo/v0/'
+        link_string += '{}/{}'.format(model['config'].rstrip('.py'),
+                                      osp.split(model['model_path'])[-1])
+        pwc_model_info['Weights'] = link_string
+        if cfg_folder_name in pwc_files:
+            pwc_files[cfg_folder_name].append(pwc_model_info)
+        else:
+            pwc_files[cfg_folder_name] = [pwc_model_info]
+    return pwc_files
+
+
+def parse_args():
+    parser = argparse.ArgumentParser(description='Gather benchmarked models')
+    parser.add_argument(
+        'root',
+        type=str,
+        help='root path of benchmarked models to be gathered')
+    parser.add_argument(
+        'out', type=str, help='output path of gathered models to be stored')
+    parser.add_argument(
+        '--best',
+        action='store_true',
+        help='whether to gather the best model.')
+
+    args = parser.parse_args()
+    return args
+
+
+# TODO: Refine
+def main():
+    args = parse_args()
+    models_root = args.root
+    models_out = args.out
+    mkdir_or_exist(models_out)
+
+    # find all models in the root directory to be gathered
+    raw_configs = list(scandir('./configs', '.py', recursive=True))
+
+    # filter configs that is not trained in the experiments dir
+    used_configs = []
+    for raw_config in raw_configs:
+        if osp.exists(osp.join(models_root, raw_config)):
+            used_configs.append(raw_config)
+    print(f'Find {len(used_configs)} models to be gathered')
+
+    # find final_ckpt and log file for trained each config
+    # and parse the best performance
+    model_infos = []
+    for used_config in used_configs:
+        exp_dir = osp.join(models_root, used_config)
+        by_epoch = is_by_epoch(used_config)
+        # check whether the exps is finished
+        if args.best is True:
+            final_model, final_epoch_or_iter = get_best_epoch_or_iter(exp_dir)
+        else:
+            final_epoch_or_iter = get_final_epoch_or_iter(used_config)
+            final_model = '{}_{}.pth'.format('epoch' if by_epoch else 'iter',
+                                             final_epoch_or_iter)
+
+        model_path = osp.join(exp_dir, final_model)
+        # skip if the model is still training
+        if not osp.exists(model_path):
+            continue
+
+        # get the latest logs
+        latest_exp_name = find_last_dir(exp_dir)
+        latest_exp_json = osp.join(exp_dir, latest_exp_name, 'vis_data',
+                                   latest_exp_name + '.json')
+
+        model_performance = get_final_results(
+            latest_exp_json, final_epoch_or_iter, by_epoch=by_epoch)
+
+        if model_performance is None:
+            continue
+
+        model_info = dict(
+            config=used_config,
+            results=model_performance,
+            final_model=final_model,
+            latest_exp_json=latest_exp_json,
+            latest_exp_name=latest_exp_name)
+        model_info['epochs' if by_epoch else 'iterations'] = \
+            final_epoch_or_iter
+        model_infos.append(model_info)
+
+    # publish model for each checkpoint
+    publish_model_infos = []
+    for model in model_infos:
+        model_publish_dir = osp.join(models_out, model['config'].rstrip('.py'))
+        mkdir_or_exist(model_publish_dir)
+
+        model_name = osp.split(model['config'])[-1].split('.')[0]
+
+        model_name += '_' + model['latest_exp_name']
+        publish_model_path = osp.join(model_publish_dir, model_name)
+        trained_model_path = osp.join(models_root, model['config'],
+                                      model['final_model'])
+
+        # convert model
+        final_model_path = process_checkpoint(trained_model_path,
+                                              publish_model_path)
+
+        # copy log
+        shutil.copy(model['latest_exp_json'],
+                    osp.join(model_publish_dir, f'{model_name}.log.json'))
+
+        # copy config to guarantee reproducibility
+        config_path = model['config']
+        config_path = osp.join(
+            'configs',
+            config_path) if 'configs' not in config_path else config_path
+        target_config_path = osp.split(config_path)[-1]
+        shutil.copy(config_path, osp.join(model_publish_dir,
+                                          target_config_path))
+
+        model['model_path'] = final_model_path
+        publish_model_infos.append(model)
+
+    models = dict(models=publish_model_infos)
+    print(f'Totally gathered {len(publish_model_infos)} models')
+    dump(models, osp.join(models_out, 'model_info.json'))
+
+    pwc_files = convert_model_info_to_pwc(publish_model_infos)
+    for name in pwc_files:
+        with open(osp.join(models_out, name + '_metafile.yml'), 'w') as f:
+            ordered_yaml_dump(pwc_files[name], f, encoding='utf-8')
+
+
+if __name__ == '__main__':
+    main()
diff --git a/mmdetection_practice/third_party/mmyolo/.dev_scripts/print_registers.py b/mmdetection_practice/third_party/mmyolo/.dev_scripts/print_registers.py
new file mode 100644
index 0000000..52646da
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/.dev_scripts/print_registers.py
@@ -0,0 +1,448 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+import argparse
+import importlib
+import os
+import os.path as osp
+import pkgutil
+import sys
+import tempfile
+from multiprocessing import Pool
+from pathlib import Path
+
+import numpy as np
+import pandas as pd
+
+# host_addr = 'https://gitee.com/open-mmlab'
+host_addr = 'https://github.com/open-mmlab'
+tools_list = ['tools', '.dev_scripts']
+proxy_names = {
+    'mmdet': 'mmdetection',
+    'mmseg': 'mmsegmentation',
+    'mmcls': 'mmclassification'
+}
+merge_module_keys = {'mmcv': ['mmengine']}
+# exclude_prefix = {'mmcv': ['<class \'mmengine.model.']}
+exclude_prefix = {}
+markdown_title = '# MM 系列开源库注册表\n'
+markdown_title += '(注意:本文档是通过 .dev_scripts/print_registers.py 脚本自动生成)'
+
+
+def capitalize(repo_name):
+    lower = repo_name.lower()
+    if lower == 'mmcv':
+        return repo_name.upper()
+    elif lower.startswith('mm'):
+        return 'MM' + repo_name[2:]
+    return repo_name.capitalize()
+
+
+def mkdir_or_exist(dir_name, mode=0o777):
+    if dir_name == '':
+        return
+    dir_name = osp.expanduser(dir_name)
+    os.makedirs(dir_name, mode=mode, exist_ok=True)
+
+
+def parse_repo_name(repo_name):
+    proxy_names_rev = dict(zip(proxy_names.values(), proxy_names.keys()))
+    repo_name = proxy_names.get(repo_name, repo_name)
+    module_name = proxy_names_rev.get(repo_name, repo_name)
+    return repo_name, module_name
+
+
+def git_pull_branch(repo_name, branch_name='', pulldir='.'):
+    mkdir_or_exist(pulldir)
+    exec_str = f'cd {pulldir};git init;git pull '
+    exec_str += f'{host_addr}/{repo_name}.git'
+    if branch_name:
+        exec_str += f' {branch_name}'
+    returncode = os.system(exec_str)
+    if returncode:
+        raise RuntimeError(
+            f'failed to get the remote repo, code: {returncode}')
+
+
+def load_modules_from_dir(module_name, module_root, throw_error=False):
+    print(f'loading the {module_name} modules...')
+    # # install the dependencies
+    # if osp.exists(osp.join(pkg_dir, 'requirements.txt')):
+    #     os.system('pip install -r requirements.txt')
+    # get all module list
+    module_list = []
+    error_dict = {}
+    module_root = osp.join(module_root, module_name)
+    assert osp.exists(module_root), \
+        f'cannot find the module root: {module_root}'
+    for _root, _dirs, _files in os.walk(module_root):
+        if (('__init__.py' not in _files)
+                and (osp.split(_root)[1] != '__pycache__')):
+            # add __init__.py file to the package
+            with open(osp.join(_root, '__init__.py'), 'w') as _:
+                pass
+
+    def _onerror(*args, **kwargs):
+        pass
+
+    for _finder, _name, _ispkg in pkgutil.walk_packages([module_root],
+                                                        prefix=module_name +
+                                                        '.',
+                                                        onerror=_onerror):
+        try:
+            module = importlib.import_module(_name)
+            module_list.append(module)
+        except Exception as e:
+            if throw_error:
+                raise e
+            _error_msg = f'{type(e)}: {e}.'
+            print(f'cannot import the module: {_name} ({_error_msg})')
+            assert (_name not in error_dict), \
+                f'duplicate error name was found: {_name}'
+            error_dict[_name] = _error_msg
+    for module in module_list:
+        assert module.__file__.startswith(module_root), \
+            f'the importing path of package was wrong: {module.__file__}'
+    print('modules were loaded...')
+    return module_list, error_dict
+
+
+def get_registries_from_modules(module_list):
+    registries = {}
+    objects_set = set()
+    # import the Registry class,
+    # import at the beginning is not allowed
+    # because it is not the temp package
+    from mmengine.registry import Registry
+
+    # only get the specific registries in module list
+    for module in module_list:
+        for obj_name in dir(module):
+            _obj = getattr(module, obj_name)
+            if isinstance(_obj, Registry):
+                objects_set.add(_obj)
+    for _obj in objects_set:
+        if _obj.scope not in registries:
+            registries[_obj.scope] = {}
+        registries_scope = registries[_obj.scope]
+        assert _obj.name not in registries_scope, \
+            f'multiple definition of {_obj.name} in registries'
+        registries_scope[_obj.name] = {
+            key: str(val)
+            for key, val in _obj.module_dict.items()
+        }
+    print('registries got...')
+    return registries
+
+
+def merge_registries(src_dict, dst_dict):
+    assert type(src_dict) == type(dst_dict), \
+        (f'merge type is not supported: '
+         f'{type(dst_dict)} and {type(src_dict)}')
+    if isinstance(src_dict, str):
+        return
+    for _k, _v in dst_dict.items():
+        if (_k not in src_dict):
+            src_dict.update({_k: _v})
+        else:
+            assert isinstance(_v, (dict, str)) and \
+                isinstance(src_dict[_k], (dict, str)), \
+                'merge type is not supported: ' \
+                f'{type(_v)} and {type(src_dict[_k])}'
+            merge_registries(src_dict[_k], _v)
+
+
+def exclude_registries(registries, exclude_key):
+    for _k in list(registries.keys()):
+        _v = registries[_k]
+        if isinstance(_v, str) and _v.startswith(exclude_key):
+            registries.pop(_k)
+        elif isinstance(_v, dict):
+            exclude_registries(_v, exclude_key)
+
+
+def get_scripts_from_dir(root):
+
+    def _recurse(_dict, _chain):
+        if len(_chain) <= 1:
+            _dict[_chain[0]] = None
+            return
+        _key, *_chain = _chain
+        if _key not in _dict:
+            _dict[_key] = {}
+        _recurse(_dict[_key], _chain)
+
+    # find all scripts in the root directory. (not just ('.py', '.sh'))
+    # can not use the scandir function in mmengine to scan the dir,
+    # because mmengine import is not allowed before git pull
+    scripts = {}
+    for _subroot, _dirs, _files in os.walk(root):
+        for _file in _files:
+            _script = osp.join(osp.relpath(_subroot, root), _file)
+            _recurse(scripts, Path(_script).parts)
+    return scripts
+
+
+def get_version_from_module_name(module_name, branch):
+    branch_str = str(branch) if branch is not None else ''
+    version_str = ''
+    try:
+        exec(f'import {module_name}')
+        _module = eval(f'{module_name}')
+        if hasattr(_module, '__version__'):
+            version_str = str(_module.__version__)
+        else:
+            version_str = branch_str
+        version_str = f' ({version_str})' if version_str else version_str
+    except (ImportError, AttributeError) as e:
+        print(f'can not get the version of module {module_name}: {e}')
+    return version_str
+
+
+def print_tree(print_dict):
+    # recursive print the dict tree
+    def _recurse(_dict, _connector='', n=0):
+        assert isinstance(_dict, dict), 'recursive type must be dict'
+        tree = ''
+        for idx, (_key, _val) in enumerate(_dict.items()):
+            sub_tree = ''
+            _last = (idx == (len(_dict) - 1))
+            if isinstance(_val, str):
+                _key += f' ({_val})'
+            elif isinstance(_val, dict):
+                sub_tree = _recurse(_val,
+                                    _connector + ('   ' if _last else '│  '),
+                                    n + 1)
+            else:
+                assert (_val is None), f'unknown print type {_val}'
+            tree += '  ' + _connector + \
+                    ('└─' if _last else '├─') + f'({n}) {_key}' + '\n'
+            tree += sub_tree
+        return tree
+
+    for _pname, _pdict in print_dict.items():
+        print('-' * 100)
+        print(f'{_pname}\n' + _recurse(_pdict))
+
+
+def divide_list_into_groups(_array, _maxsize_per_group):
+    if not _array:
+        return _array
+    _groups = np.asarray(len(_array) / _maxsize_per_group)
+    if len(_array) % _maxsize_per_group:
+        _groups = np.floor(_groups) + 1
+    _groups = _groups.astype(int)
+    return np.array_split(_array, _groups)
+
+
+def registries_to_html(registries, title=''):
+    max_col_per_row = 5
+    max_size_per_cell = 20
+    html = ''
+    table_data = []
+    # save repository registries
+    for registry_name, registry_dict in registries.items():
+        # filter the empty registries
+        if not registry_dict:
+            continue
+        registry_strings = []
+        if isinstance(registry_dict, dict):
+            registry_dict = list(registry_dict.keys())
+        elif isinstance(registry_dict, list):
+            pass
+        else:
+            raise TypeError(
+                f'unknown type of registry_dict {type(registry_dict)}')
+        for _k in registry_dict:
+            registry_strings.append(f'<li>{_k}</li>')
+        table_data.append((registry_name, registry_strings))
+
+    # sort the data list
+    table_data = sorted(table_data, key=lambda x: len(x[1]))
+    # split multi parts
+    table_data_multi_parts = []
+    for (registry_name, registry_strings) in table_data:
+        multi_parts = False
+        if len(registry_strings) > max_size_per_cell:
+            multi_parts = True
+        for cell_idx, registry_cell in enumerate(
+                divide_list_into_groups(registry_strings, max_size_per_cell)):
+            registry_str = ''.join(registry_cell.tolist())
+            registry_str = f'<ul>{registry_str}</ul>'
+            table_data_multi_parts.append([
+                registry_name if not multi_parts else
+                f'{registry_name} (part {cell_idx + 1})', registry_str
+            ])
+
+    for table_data in divide_list_into_groups(table_data_multi_parts,
+                                              max_col_per_row):
+        table_data = list(zip(*table_data.tolist()))
+        html += dataframe_to_html(
+            pd.DataFrame([table_data[1]], columns=table_data[0]))
+    if html:
+        html = f'<div align=\'center\'><b>{title}</b></div>\n{html}'
+        html = f'<details open>{html}</details>\n'
+    return html
+
+
+def tools_to_html(tools_dict, repo_name=''):
+
+    def _recurse(_dict, _connector, _result):
+        assert isinstance(_dict, dict), \
+            f'unknown recurse type: {_dict} ({type(_dict)})'
+        for _k, _v in _dict.items():
+            if _v is None:
+                if _connector not in _result:
+                    _result[_connector] = []
+                _result[_connector].append(_k)
+            else:
+                _recurse(_v, osp.join(_connector, _k), _result)
+
+    table_data = {}
+    title = f'{capitalize(repo_name)} Tools'
+    _recurse(tools_dict, '', table_data)
+    return registries_to_html(table_data, title)
+
+
+def dataframe_to_html(dataframe):
+    styler = dataframe.style
+    styler = styler.hide(axis='index')
+    styler = styler.format(na_rep='-')
+    styler = styler.set_properties(**{
+        'text-align': 'left',
+        'align': 'center',
+        'vertical-align': 'top'
+    })
+    styler = styler.set_table_styles([{
+        'selector':
+        'thead th',
+        'props':
+        'align:center;text-align:center;vertical-align:bottom'
+    }])
+    html = styler.to_html()
+    html = f'<div align=\'center\'>\n{html}</div>'
+    return html
+
+
+def generate_markdown_by_repository(repo_name,
+                                    module_name,
+                                    branch,
+                                    pulldir,
+                                    throw_error=False):
+    # add the pull dir to the system path so that it can be found
+    if pulldir not in sys.path:
+        sys.path.insert(0, pulldir)
+    module_list, error_dict = load_modules_from_dir(
+        module_name, pulldir, throw_error=throw_error)
+    registries_tree = get_registries_from_modules(module_list)
+    if error_dict:
+        error_dict_name = 'error_modules'
+        assert (error_dict_name not in registries_tree), \
+            f'duplicate module name was found: {error_dict_name}'
+        registries_tree.update({error_dict_name: error_dict})
+    # get the tools files
+    for tools_name in tools_list:
+        assert (tools_name not in registries_tree), \
+            f'duplicate tools name was found: {tools_name}'
+        tools_tree = osp.join(pulldir, tools_name)
+        tools_tree = get_scripts_from_dir(tools_tree)
+        registries_tree.update({tools_name: tools_tree})
+    # print_tree(registries_tree)
+    # get registries markdown string
+    module_registries = registries_tree.get(module_name, {})
+    for merge_key in merge_module_keys.get(module_name, []):
+        merge_dict = registries_tree.get(merge_key, {})
+        merge_registries(module_registries, merge_dict)
+    for exclude_key in exclude_prefix.get(module_name, []):
+        exclude_registries(module_registries, exclude_key)
+    markdown_str = registries_to_html(
+        module_registries, title=f'{capitalize(repo_name)} Module Components')
+    # get tools markdown string
+    tools_registries = {}
+    for tools_name in tools_list:
+        tools_registries.update(
+            {tools_name: registries_tree.get(tools_name, {})})
+    markdown_str += tools_to_html(tools_registries, repo_name=repo_name)
+    version_str = get_version_from_module_name(module_name, branch)
+    title_str = f'\n\n## {capitalize(repo_name)}{version_str}\n'
+    # remove the pull dir from system path
+    if pulldir in sys.path:
+        sys.path.remove(pulldir)
+    return f'{title_str}{markdown_str}'
+
+
+def parse_args():
+    parser = argparse.ArgumentParser(
+        description='print registries in openmmlab repositories')
+    parser.add_argument(
+        '-r',
+        '--repositories',
+        nargs='+',
+        default=['mmdet', 'mmcls', 'mmseg', 'mmengine', 'mmcv'],
+        type=str,
+        help='git repositories name in OpenMMLab')
+    parser.add_argument(
+        '-b',
+        '--branches',
+        nargs='+',
+        default=['3.x', '1.x', '1.x', 'main', '2.x'],
+        type=str,
+        help='the branch names of git repositories, the length of branches '
+        'must be same as the length of repositories')
+    parser.add_argument(
+        '-o', '--out', type=str, default='.', help='output path of the file')
+    parser.add_argument(
+        '--throw-error',
+        action='store_true',
+        default=False,
+        help='whether to throw error when trying to import modules')
+    args = parser.parse_args()
+    return args
+
+
+# TODO: Refine
+def main():
+    args = parse_args()
+    repositories = args.repositories
+    branches = args.branches
+    assert isinstance(repositories, list), \
+        'Type of repositories must be list'
+    if branches is None:
+        branches = [None] * len(repositories)
+    assert isinstance(branches, list) and \
+           len(branches) == len(repositories), \
+           'The length of branches must be same as ' \
+           'that of repositories'
+    assert isinstance(args.out, str), \
+        'The type of output path must be string'
+    # save path of file
+    mkdir_or_exist(args.out)
+    save_path = osp.join(args.out, 'registries_info.md')
+    with tempfile.TemporaryDirectory() as tmpdir:
+        # multi process init
+        pool = Pool(processes=len(repositories))
+        multi_proc_input_list = []
+        multi_proc_output_list = []
+        # get the git repositories
+        for branch, repository in zip(branches, repositories):
+            repo_name, module_name = parse_repo_name(repository)
+            pulldir = osp.join(tmpdir, f'tmp_{repo_name}')
+            git_pull_branch(
+                repo_name=repo_name, branch_name=branch, pulldir=pulldir)
+            multi_proc_input_list.append(
+                (repo_name, module_name, branch, pulldir, args.throw_error))
+        print('starting the multi process to get the registries')
+        for multi_proc_input in multi_proc_input_list:
+            multi_proc_output_list.append(
+                pool.apply_async(generate_markdown_by_repository,
+                                 multi_proc_input))
+        pool.close()
+        pool.join()
+        with open(save_path, 'w', encoding='utf-8') as fw:
+            fw.write(f'{markdown_title}\n')
+            for multi_proc_output in multi_proc_output_list:
+                markdown_str = multi_proc_output.get()
+                fw.write(f'{markdown_str}\n')
+    print(f'saved registries to the path: {save_path}')
+
+
+if __name__ == '__main__':
+    main()
diff --git a/mmdetection_practice/third_party/mmyolo/.github/CODE_OF_CONDUCT.md b/mmdetection_practice/third_party/mmyolo/.github/CODE_OF_CONDUCT.md
new file mode 100644
index 0000000..92afad1
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/.github/CODE_OF_CONDUCT.md
@@ -0,0 +1,76 @@
+# Contributor Covenant Code of Conduct
+
+## Our Pledge
+
+In the interest of fostering an open and welcoming environment, we as
+contributors and maintainers pledge to making participation in our project and
+our community a harassment-free experience for everyone, regardless of age, body
+size, disability, ethnicity, sex characteristics, gender identity and expression,
+level of experience, education, socio-economic status, nationality, personal
+appearance, race, religion, or sexual identity and orientation.
+
+## Our Standards
+
+Examples of behavior that contributes to creating a positive environment
+include:
+
+- Using welcoming and inclusive language
+- Being respectful of differing viewpoints and experiences
+- Gracefully accepting constructive criticism
+- Focusing on what is best for the community
+- Showing empathy towards other community members
+
+Examples of unacceptable behavior by participants include:
+
+- The use of sexualized language or imagery and unwelcome sexual attention or
+  advances
+- Trolling, insulting/derogatory comments, and personal or political attacks
+- Public or private harassment
+- Publishing others' private information, such as a physical or electronic
+  address, without explicit permission
+- Other conduct which could reasonably be considered inappropriate in a
+  professional setting
+
+## Our Responsibilities
+
+Project maintainers are responsible for clarifying the standards of acceptable
+behavior and are expected to take appropriate and fair corrective action in
+response to any instances of unacceptable behavior.
+
+Project maintainers have the right and responsibility to remove, edit, or
+reject comments, commits, code, wiki edits, issues, and other contributions
+that are not aligned to this Code of Conduct, or to ban temporarily or
+permanently any contributor for other behaviors that they deem inappropriate,
+threatening, offensive, or harmful.
+
+## Scope
+
+This Code of Conduct applies both within project spaces and in public spaces
+when an individual is representing the project or its community. Examples of
+representing a project or community include using an official project e-mail
+address, posting via an official social media account, or acting as an appointed
+representative at an online or offline event. Representation of a project may be
+further defined and clarified by project maintainers.
+
+## Enforcement
+
+Instances of abusive, harassing, or otherwise unacceptable behavior may be
+reported by contacting the project team at chenkaidev@gmail.com. All
+complaints will be reviewed and investigated and will result in a response that
+is deemed necessary and appropriate to the circumstances. The project team is
+obligated to maintain confidentiality with regard to the reporter of an incident.
+Further details of specific enforcement policies may be posted separately.
+
+Project maintainers who do not follow or enforce the Code of Conduct in good
+faith may face temporary or permanent repercussions as determined by other
+members of the project's leadership.
+
+## Attribution
+
+This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
+available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
+
+For answers to common questions about this code of conduct, see
+https://www.contributor-covenant.org/faq
+
+[homepage]: https://www.contributor-covenant.org
diff --git a/mmdetection_practice/third_party/mmyolo/.github/CONTRIBUTING.md b/mmdetection_practice/third_party/mmyolo/.github/CONTRIBUTING.md
new file mode 100644
index 0000000..4ac764f
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/.github/CONTRIBUTING.md
@@ -0,0 +1 @@
+We appreciate all contributions to improve MMYOLO. Please refer to [CONTRIBUTING.md](https://github.com/open-mmlab/mmcv/blob/master/CONTRIBUTING.md) in MMCV for more details about the contributing guideline.
diff --git a/mmdetection_practice/third_party/mmyolo/.github/ISSUE_TEMPLATE/1-bug-report.yml b/mmdetection_practice/third_party/mmyolo/.github/ISSUE_TEMPLATE/1-bug-report.yml
new file mode 100644
index 0000000..0cec585
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/.github/ISSUE_TEMPLATE/1-bug-report.yml
@@ -0,0 +1,67 @@
+name: "🐞 Bug report"
+description: "Create a report to help us reproduce and fix the bug"
+
+
+body:
+  - type: markdown
+    attributes:
+      value: |
+        Thank you for reporting this issue to help us improve!
+        If you have already identified the reason, we strongly appreciate you creating a new PR to fix it [here](https://github.com/open-mmlab/mmyolo/pulls)!
+        If this issue is about installing MMCV, please file an issue at [MMCV](https://github.com/open-mmlab/mmcv/issues/new/choose).
+        If you need our help, please fill in as much of the following form as you're able.
+
+  - type: checkboxes
+    attributes:
+      label: Prerequisite
+      description: Please check the following items before creating a new issue.
+      options:
+      - label: I have searched [the existing and past issues](https://github.com/open-mmlab/mmyolo/issues) but cannot get the expected help.
+        required: true
+      - label: I have read the [FAQ documentation](https://mmyolo.readthedocs.io/en/latest/faq.html) but cannot get the expected help.
+        required: true
+      - label: The bug has not been fixed in the [latest version](https://github.com/open-mmlab/mmyolo).
+        required: true
+
+  - type: textarea
+    attributes:
+      label: 🐞 Describe the bug
+      description: |
+        Please provide a clear and concise description of what the bug is.
+        Preferably a simple and minimal code snippet that we can reproduce the error by running the code.
+      placeholder: |
+        A clear and concise description of what the bug is.
+
+        ```python
+        # Sample code to reproduce the problem
+        ```
+
+        ```shell
+        The command or script you run.
+        ```
+
+        ```
+        The error message or logs you got, with the full traceback.
+        ```
+    validations:
+      required: true
+
+  - type: textarea
+    attributes:
+      label: Environment
+      description: |
+        Please run `python mmyolo/utils/collect_env.py` to collect necessary environment information and paste it here.
+        You may add addition that may be helpful for locating the problem, such as
+          - How you installed PyTorch \[e.g., pip, conda, source\]
+          - Other environment variables that may be related (such as `$PATH`, `$LD_LIBRARY_PATH`, `$PYTHONPATH`, etc.)
+    validations:
+      required: true
+
+  - type: textarea
+    attributes:
+      label: Additional information
+      description: Tell us anything else you think we should know.
+      placeholder: |
+        1. Did you make any modifications on the code or config? Did you understand what you have modified?
+        2. What dataset did you use?
+        3. What do you think might be the reason?
diff --git a/mmdetection_practice/third_party/mmyolo/.github/ISSUE_TEMPLATE/2-feature-request.yml b/mmdetection_practice/third_party/mmyolo/.github/ISSUE_TEMPLATE/2-feature-request.yml
new file mode 100644
index 0000000..8b24846
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/.github/ISSUE_TEMPLATE/2-feature-request.yml
@@ -0,0 +1,32 @@
+name: 🚀 Feature request
+description: Suggest an idea for this project
+labels: [feature request]
+
+body:
+  - type: markdown
+    attributes:
+      value: |
+        Thank you for suggesting an idea to make MMYOLO better.
+        We strongly appreciate you creating a PR to implete this feature [here](https://github.com/open-mmlab/mmyolo/pulls)!
+
+        If you need our help, please fill in as much of the following form as you're able.
+
+  - type: textarea
+    attributes:
+      label: What is the problem this feature will solve?
+      placeholder: |
+        E.g., It is inconvenient when \[....\].
+    validations:
+      required: true
+
+  - type: textarea
+    attributes:
+      label: What is the feature you are proposing to solve the problem?
+    validations:
+      required: true
+
+  - type: textarea
+    attributes:
+      label: What alternatives have you considered?
+      description: |
+        Add any other context or screenshots about the feature request here.
diff --git a/mmdetection_practice/third_party/mmyolo/.github/ISSUE_TEMPLATE/3-new-model.yml b/mmdetection_practice/third_party/mmyolo/.github/ISSUE_TEMPLATE/3-new-model.yml
new file mode 100644
index 0000000..2aacff4
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/.github/ISSUE_TEMPLATE/3-new-model.yml
@@ -0,0 +1,30 @@
+name: "\U0001F31F New model/dataset addition"
+description: Submit a proposal/request to implement a new model / dataset
+labels: [ "New model/dataset" ]
+
+body:
+  - type: textarea
+    id: description-request
+    validations:
+      required: true
+    attributes:
+      label: Model/Dataset description
+      description: |
+        Put any and all important information relative to the model/dataset
+
+  - type: checkboxes
+    attributes:
+      label: Open source status
+      description: |
+          Please provide the open-source status, which would be very helpful
+      options:
+        - label: "The model implementation is available"
+        - label: "The model weights are available."
+
+  - type: textarea
+    id: additional-info
+    attributes:
+      label: Provide useful links for the implementation
+      description: |
+        Please provide information regarding the implementation, the weights, and the authors.
+        Please mention the authors by @gh-username if you're aware of their usernames.
diff --git a/mmdetection_practice/third_party/mmyolo/.github/ISSUE_TEMPLATE/4-documentation.yml b/mmdetection_practice/third_party/mmyolo/.github/ISSUE_TEMPLATE/4-documentation.yml
new file mode 100644
index 0000000..dbf1ef8
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/.github/ISSUE_TEMPLATE/4-documentation.yml
@@ -0,0 +1,22 @@
+name: 📚 Documentation
+description: Report an issue related to https://mmyolo.readthedocs.io/en/latest/.
+
+body:
+- type: textarea
+  attributes:
+    label: 📚 The doc issue
+    description: >
+      A clear and concise description of what content in https://mmyolo.readthedocs.io/en/latest/ is an issue.
+  validations:
+    required: true
+
+- type: textarea
+  attributes:
+    label: Suggest a potential alternative/fix
+    description: >
+      Tell us how we could improve the documentation in this regard.
+
+- type: markdown
+  attributes:
+    value: >
+      Thanks for contributing 🎉!
diff --git a/mmdetection_practice/third_party/mmyolo/.github/ISSUE_TEMPLATE/5-reimplementation.yml b/mmdetection_practice/third_party/mmyolo/.github/ISSUE_TEMPLATE/5-reimplementation.yml
new file mode 100644
index 0000000..1240aa8
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/.github/ISSUE_TEMPLATE/5-reimplementation.yml
@@ -0,0 +1,87 @@
+name: "💥 Reimplementation Questions"
+description: "Ask about questions during model reimplementation"
+
+
+body:
+  - type: markdown
+    attributes:
+      value: |
+        If you have already identified the reason, we strongly appreciate you creating a new PR to fix it [here](https://github.com/open-mmlab/mmyolo/pulls)!
+
+  - type: checkboxes
+    attributes:
+      label: Prerequisite
+      description: Please check the following items before creating a new issue.
+      options:
+      - label: I have searched [the existing and past issues](https://github.com/open-mmlab/mmyolo/issues) but cannot get the expected help.
+        required: true
+      - label: I have read the [FAQ documentation](https://mmyolo.readthedocs.io/en/latest/faq.html) but cannot get the expected help.
+        required: true
+      - label: The bug has not been fixed in the [latest version](https://github.com/open-mmlab/mmyolo).
+        required: true
+    validations:
+      required: true
+
+  - type: textarea
+    attributes:
+      label: 💬 Describe the reimplementation questions
+      description: |
+        A clear and concise description of what the problem you meet and what have you done.
+        There are several common situations in the reimplementation issues as below
+
+        1. Reimplement a model in the model zoo using the provided configs
+        2. Reimplement a model in the model zoo on other dataset (e.g., custom datasets)
+        3. Reimplement a custom model but all the components are implemented in MMDetection
+        4. Reimplement a custom model with new modules implemented by yourself
+
+        There are several things to do for different cases as below.
+
+        - For case 1 & 3, please follow the steps in the following sections thus we could help to quick identify the issue.
+        - For case 2 & 4, please understand that we are not able to do much help here because we usually do not know the full code and the users should be responsible to the code they write.
+        - One suggestion for case 2 & 4 is that the users should first check whether the bug lies in the self-implemented code or the original code. For example, users can first make sure that the same model runs well on supported datasets. If you still need help, please describe what you have done and what you obtain in the issue, and follow the steps in the following sections and try as clear as possible so that we can better help you.
+      placeholder: |
+        A clear and concise description of what the bug is.
+        What config dir you run?
+
+        ```none
+        A placeholder for the config.
+        ```
+
+        ```shell
+        The command or script you run.
+        ```
+
+        ```
+        The error message or logs you got, with the full traceback.
+        ```
+    validations:
+      required: true
+
+  - type: textarea
+    attributes:
+      label: Environment
+      description: |
+         Please run `python mmyolo/utils/collect_env.py` to collect necessary environment information and paste it here.
+         You may add addition that may be helpful for locating the problem, such as
+            - How you installed PyTorch \[e.g., pip, conda, source\]
+            - Other environment variables that may be related (such as `$PATH`, `$LD_LIBRARY_PATH`, `$PYTHONPATH`, etc.)
+    validations:
+      required: true
+
+  - type: textarea
+    attributes:
+      label: Expected results
+      description: If applicable, paste the related results here, e.g., what you expect and what you get.
+      placeholder: |
+         ```none
+         A placeholder for results comparison
+         ```
+
+  - type: textarea
+    attributes:
+      label: Additional information
+      description: Tell us anything else you think we should know.
+      placeholder: |
+        1. Did you make any modifications on the code or config? Did you understand what you have modified?
+        2. What dataset did you use?
+        3. What do you think might be the reason?
diff --git a/mmdetection_practice/third_party/mmyolo/.github/ISSUE_TEMPLATE/config.yml b/mmdetection_practice/third_party/mmyolo/.github/ISSUE_TEMPLATE/config.yml
new file mode 100644
index 0000000..585c786
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/.github/ISSUE_TEMPLATE/config.yml
@@ -0,0 +1,9 @@
+blank_issues_enabled: true
+
+contact_links:
+  - name: 💬 Forum
+    url: https://github.com/open-mmlab/mmyolo/discussions
+    about: Ask general usage questions and discuss with other MMYOLO community members
+  - name: 🌐 Explore OpenMMLab
+    url: https://openmmlab.com/
+    about: Get know more about OpenMMLab
diff --git a/mmdetection_practice/third_party/mmyolo/.github/pull_request_template.md b/mmdetection_practice/third_party/mmyolo/.github/pull_request_template.md
new file mode 100644
index 0000000..2997d88
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/.github/pull_request_template.md
@@ -0,0 +1,25 @@
+Thanks for your contribution and we appreciate it a lot. The following instructions would make your pull request more healthy and more easily get feedback. If you do not understand some items, don't worry, just make the pull request and seek help from maintainers.
+
+## Motivation
+
+Please describe the motivation for this PR and the goal you want to achieve through this PR.
+
+## Modification
+
+Please briefly describe what modification is made in this PR.
+
+## BC-breaking (Optional)
+
+Does the modification introduce changes that break the backward compatibility of the downstream repos?
+If so, please describe how it breaks the compatibility and how the downstream projects should modify their code to keep compatibility with this PR.
+
+## Use cases (Optional)
+
+If this PR introduces a new feature, it is better to list some use cases here and update the documentation.
+
+## Checklist
+
+1. Pre-commit or other linting tools are used to fix potential lint issues.
+2. The modification is covered by complete unit tests. If not, please add more unit tests to ensure the correctness.
+3. If the modification has a potential influence on downstream projects, this PR should be tested with downstream projects, like MMDetection or MMClassification.
+4. The documentation has been modified accordingly, like docstring or example tutorials.
diff --git a/mmdetection_practice/third_party/mmyolo/.github/workflows/deploy.yml b/mmdetection_practice/third_party/mmyolo/.github/workflows/deploy.yml
new file mode 100644
index 0000000..08f542b
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/.github/workflows/deploy.yml
@@ -0,0 +1,28 @@
+name: deploy
+
+on: push
+
+concurrency:
+  group: ${{ github.workflow }}-${{ github.ref }}
+  cancel-in-progress: true
+
+jobs:
+  build-n-publish:
+    runs-on: ubuntu-latest
+    if: startsWith(github.event.ref, 'refs/tags')
+    steps:
+      - uses: actions/checkout@v2
+      - name: Set up Python 3.7
+        uses: actions/setup-python@v2
+        with:
+          python-version: 3.7
+      - name: Install torch
+        run: pip install torch
+      - name: Install wheel
+        run: pip install wheel
+      - name: Build MMYOLO
+        run: python setup.py sdist bdist_wheel
+      - name: Publish distribution to PyPI
+        run: |
+          pip install twine
+          twine upload dist/* -u __token__ -p ${{ secrets.pypi_password }}
diff --git a/mmdetection_practice/third_party/mmyolo/.gitignore b/mmdetection_practice/third_party/mmyolo/.gitignore
new file mode 100644
index 0000000..195f194
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/.gitignore
@@ -0,0 +1,126 @@
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[cod]
+*$py.class
+
+# C extensions
+*.so
+
+# Distribution / packaging
+.Python
+build/
+develop-eggs/
+dist/
+downloads/
+eggs/
+.eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+wheels/
+*.egg-info/
+.installed.cfg
+*.egg
+MANIFEST
+
+# PyInstaller
+#  Usually these files are written by a python script from a template
+#  before PyInstaller builds the exe, so as to inject date/other infos into it.
+*.manifest
+*.spec
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Unit test / coverage reports
+htmlcov/
+.tox/
+.coverage
+.coverage.*
+.cache
+nosetests.xml
+coverage.xml
+*.cover
+.hypothesis/
+.pytest_cache/
+
+# Translations
+*.mo
+*.pot
+
+# Django stuff:
+*.log
+local_settings.py
+db.sqlite3
+
+# Flask stuff:
+instance/
+.webassets-cache
+
+# Scrapy stuff:
+.scrapy
+
+# Sphinx documentation
+docs/en/_build/
+docs/zh_cn/_build/
+
+# PyBuilder
+target/
+
+# Jupyter Notebook
+.ipynb_checkpoints
+
+# pyenv
+.python-version
+
+# celery beat schedule file
+celerybeat-schedule
+
+# SageMath parsed files
+*.sage.py
+
+# Environments
+.env
+.venv
+env/
+venv/
+ENV/
+env.bak/
+venv.bak/
+
+# Spyder project settings
+.spyderproject
+.spyproject
+
+# Rope project settings
+.ropeproject
+
+# mkdocs documentation
+/site
+
+# mypy
+.mypy_cache/
+data/
+data
+.vscode
+.idea
+.DS_Store
+
+# custom
+*.pkl
+*.pkl.json
+*.log.json
+docs/modelzoo_statistics.md
+mmyolo/.mim
+output/
+work_dirs
+yolov5-6.1/
+
+# Pytorch
+*.pth
+*.pt
+*.py~
+*.sh~
diff --git a/mmdetection_practice/third_party/mmyolo/.pre-commit-config-zh-cn.yaml b/mmdetection_practice/third_party/mmyolo/.pre-commit-config-zh-cn.yaml
new file mode 100644
index 0000000..52bb607
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/.pre-commit-config-zh-cn.yaml
@@ -0,0 +1,60 @@
+exclude: ^tests/data/
+repos:
+  - repo: https://gitee.com/openmmlab/mirrors-flake8
+    rev: 5.0.4
+    hooks:
+      - id: flake8
+  - repo: https://gitee.com/openmmlab/mirrors-isort
+    rev: 5.11.5
+    hooks:
+      - id: isort
+  - repo: https://gitee.com/openmmlab/mirrors-yapf
+    rev: v0.32.0
+    hooks:
+      - id: yapf
+  - repo: https://gitee.com/openmmlab/mirrors-pre-commit-hooks
+    rev: v4.3.0
+    hooks:
+      - id: trailing-whitespace
+      - id: check-yaml
+      - id: end-of-file-fixer
+      - id: requirements-txt-fixer
+      - id: double-quote-string-fixer
+      - id: check-merge-conflict
+      - id: fix-encoding-pragma
+        args: ["--remove"]
+      - id: mixed-line-ending
+        args: ["--fix=lf"]
+  - repo: https://gitee.com/openmmlab/mirrors-mdformat
+    rev: 0.7.9
+    hooks:
+      - id: mdformat
+        args: ["--number"]
+        additional_dependencies:
+          - mdformat-openmmlab
+          - mdformat_frontmatter
+          - linkify-it-py
+  - repo: https://gitee.com/openmmlab/mirrors-codespell
+    rev: v2.2.1
+    hooks:
+      - id: codespell
+  - repo: https://gitee.com/openmmlab/mirrors-docformatter
+    rev: v1.3.1
+    hooks:
+      - id: docformatter
+        args: ["--in-place", "--wrap-descriptions", "79"]
+  - repo: https://gitee.com/openmmlab/mirrors-pyupgrade
+    rev: v3.0.0
+    hooks:
+      - id: pyupgrade
+        args: ["--py36-plus"]
+  - repo: https://github.com/open-mmlab/pre-commit-hooks
+    rev: v0.2.0
+    hooks:
+      - id: check-copyright
+        args: ["mmyolo", "tests"]
+#  - repo: https://gitee.com/openmmlab/mirrors-mypy
+#    rev: v0.812
+#    hooks:
+#      - id: mypy
+#        exclude: "docs"
diff --git a/mmdetection_practice/third_party/mmyolo/.pre-commit-config.yaml b/mmdetection_practice/third_party/mmyolo/.pre-commit-config.yaml
new file mode 100644
index 0000000..ffae20d
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/.pre-commit-config.yaml
@@ -0,0 +1,60 @@
+exclude: ^tests/data/
+repos:
+  - repo: https://github.com/PyCQA/flake8
+    rev: 5.0.4
+    hooks:
+      - id: flake8
+  - repo: https://github.com/PyCQA/isort
+    rev: 5.11.5
+    hooks:
+      - id: isort
+  - repo: https://github.com/pre-commit/mirrors-yapf
+    rev: v0.32.0
+    hooks:
+      - id: yapf
+  - repo: https://github.com/pre-commit/pre-commit-hooks
+    rev: v4.3.0
+    hooks:
+      - id: trailing-whitespace
+      - id: check-yaml
+      - id: end-of-file-fixer
+      - id: requirements-txt-fixer
+      - id: double-quote-string-fixer
+      - id: check-merge-conflict
+      - id: fix-encoding-pragma
+        args: ["--remove"]
+      - id: mixed-line-ending
+        args: ["--fix=lf"]
+  - repo: https://github.com/executablebooks/mdformat
+    rev: 0.7.9
+    hooks:
+      - id: mdformat
+        args: ["--number"]
+        additional_dependencies:
+          - mdformat-openmmlab
+          - mdformat_frontmatter
+          - linkify-it-py
+  - repo: https://github.com/codespell-project/codespell
+    rev: v2.2.1
+    hooks:
+      - id: codespell
+  - repo: https://github.com/myint/docformatter
+    rev: v1.3.1
+    hooks:
+      - id: docformatter
+        args: ["--in-place", "--wrap-descriptions", "79"]
+  - repo: https://github.com/asottile/pyupgrade
+    rev: v3.0.0
+    hooks:
+      - id: pyupgrade
+        args: ["--py36-plus"]
+  - repo: https://github.com/open-mmlab/pre-commit-hooks
+    rev: v0.2.0
+    hooks:
+      - id: check-copyright
+        args: ["mmyolo", "tests"]
+#  - repo: https://github.com/pre-commit/mirrors-mypy
+#    rev: v0.812
+#    hooks:
+#      - id: mypy
+#        exclude: "docs"
diff --git a/mmdetection_practice/third_party/mmyolo/.readthedocs.yml b/mmdetection_practice/third_party/mmyolo/.readthedocs.yml
new file mode 100644
index 0000000..c9ab01c
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/.readthedocs.yml
@@ -0,0 +1,8 @@
+version: 2
+
+formats: all
+
+python:
+  version: 3.7
+  install:
+    - requirements: requirements/docs.txt
diff --git a/mmdetection_practice/third_party/mmyolo/LICENSE b/mmdetection_practice/third_party/mmyolo/LICENSE
new file mode 100644
index 0000000..f288702
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/LICENSE
@@ -0,0 +1,674 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    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, see <https://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<https://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<https://www.gnu.org/licenses/why-not-lgpl.html>.
diff --git a/mmdetection_practice/third_party/mmyolo/MANIFEST.in b/mmdetection_practice/third_party/mmyolo/MANIFEST.in
new file mode 100644
index 0000000..5bf1d9e
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/MANIFEST.in
@@ -0,0 +1,6 @@
+include requirements/*.txt
+include mmyolo/VERSION
+include mmyolo/.mim/model-index.yml
+include mmyolo/.mim/demo/*/*
+recursive-include mmyolo/.mim/configs *.py *.yml
+recursive-include mmyolo/.mim/tools *.sh *.py
diff --git a/mmdetection_practice/third_party/mmyolo/README.md b/mmdetection_practice/third_party/mmyolo/README.md
new file mode 100644
index 0000000..b799a75
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/README.md
@@ -0,0 +1,428 @@
+<div align="center">
+  <img width="100%" src="https://user-images.githubusercontent.com/27466624/222385101-516e551c-49f5-480d-a135-4b24ee6dc308.png"/>
+  <div>&nbsp;</div>
+  <div align="center">
+    <b><font size="5">OpenMMLab website</font></b>
+    <sup>
+      <a href="https://openmmlab.com">
+        <i><font size="4">HOT</font></i>
+      </a>
+    </sup>
+    &nbsp;&nbsp;&nbsp;&nbsp;
+    <b><font size="5">OpenMMLab platform</font></b>
+    <sup>
+      <a href="https://platform.openmmlab.com">
+        <i><font size="4">TRY IT OUT</font></i>
+      </a>
+    </sup>
+  </div>
+  <div>&nbsp;</div>
+
+[![PyPI](https://img.shields.io/pypi/v/mmyolo)](https://pypi.org/project/mmyolo)
+[![docs](https://img.shields.io/badge/docs-latest-blue)](https://mmyolo.readthedocs.io/en/latest/)
+[![deploy](https://github.com/open-mmlab/mmyolo/workflows/deploy/badge.svg)](https://github.com/open-mmlab/mmyolo/actions)
+[![codecov](https://codecov.io/gh/open-mmlab/mmyolo/branch/main/graph/badge.svg)](https://codecov.io/gh/open-mmlab/mmyolo)
+[![license](https://img.shields.io/github/license/open-mmlab/mmyolo.svg)](https://github.com/open-mmlab/mmyolo/blob/main/LICENSE)
+[![open issues](https://isitmaintained.com/badge/open/open-mmlab/mmyolo.svg)](https://github.com/open-mmlab/mmyolo/issues)
+[![issue resolution](https://isitmaintained.com/badge/resolution/open-mmlab/mmyolo.svg)](https://github.com/open-mmlab/mmyolo/issues)
+
+[📘Documentation](https://mmyolo.readthedocs.io/en/latest/) |
+[🛠️Installation](https://mmyolo.readthedocs.io/en/latest/get_started/installation.html) |
+[👀Model Zoo](https://mmyolo.readthedocs.io/en/latest/model_zoo.html) |
+[🆕Update News](https://mmyolo.readthedocs.io/en/latest/notes/changelog.html) |
+[🤔Reporting Issues](https://github.com/open-mmlab/mmyolo/issues/new/choose)
+
+</div>
+
+<div align="center">
+
+English | [简体中文](README_zh-CN.md)
+
+</div>
+
+<div align="center">
+  <a href="https://openmmlab.medium.com/" style="text-decoration:none;">
+    <img src="https://user-images.githubusercontent.com/25839884/219255827-67c1a27f-f8c5-46a9-811d-5e57448c61d1.png" width="3%" alt="" /></a>
+  <img src="https://user-images.githubusercontent.com/25839884/218346358-56cc8e2f-a2b8-487f-9088-32480cceabcf.png" width="3%" alt="" />
+  <a href="https://discord.com/channels/1037617289144569886/1046608014234370059" style="text-decoration:none;">
+    <img src="https://user-images.githubusercontent.com/25839884/218347213-c080267f-cbb6-443e-8532-8e1ed9a58ea9.png" width="3%" alt="" /></a>
+  <img src="https://user-images.githubusercontent.com/25839884/218346358-56cc8e2f-a2b8-487f-9088-32480cceabcf.png" width="3%" alt="" />
+  <a href="https://twitter.com/OpenMMLab" style="text-decoration:none;">
+    <img src="https://user-images.githubusercontent.com/25839884/218346637-d30c8a0f-3eba-4699-8131-512fb06d46db.png" width="3%" alt="" /></a>
+  <img src="https://user-images.githubusercontent.com/25839884/218346358-56cc8e2f-a2b8-487f-9088-32480cceabcf.png" width="3%" alt="" />
+  <a href="https://www.youtube.com/openmmlab" style="text-decoration:none;">
+    <img src="https://user-images.githubusercontent.com/25839884/218346691-ceb2116a-465a-40af-8424-9f30d2348ca9.png" width="3%" alt="" /></a>
+  <img src="https://user-images.githubusercontent.com/25839884/218346358-56cc8e2f-a2b8-487f-9088-32480cceabcf.png" width="3%" alt="" />
+  <a href="https://space.bilibili.com/1293512903" style="text-decoration:none;">
+    <img src="https://user-images.githubusercontent.com/25839884/219026751-d7d14cce-a7c9-4e82-9942-8375fca65b99.png" width="3%" alt="" /></a>
+  <img src="https://user-images.githubusercontent.com/25839884/218346358-56cc8e2f-a2b8-487f-9088-32480cceabcf.png" width="3%" alt="" />
+  <a href="https://www.zhihu.com/people/openmmlab" style="text-decoration:none;">
+    <img src="https://user-images.githubusercontent.com/25839884/219026120-ba71e48b-6e94-4bd4-b4e9-b7d175b5e362.png" width="3%" alt="" /></a>
+</div>
+
+## 📄 Table of Contents
+
+- [🥳 🚀 What's New](#--whats-new-)
+  - [✨ Highlight](#-highlight-)
+- [📖 Introduction](#-introduction-)
+- [🛠️ Installation](#%EF%B8%8F-installation-)
+- [👨‍🏫 Tutorial](#-tutorial-)
+- [📊 Overview of Benchmark and Model Zoo](#-overview-of-benchmark-and-model-zoo-)
+- [❓ FAQ](#-faq-)
+- [🙌 Contributing](#-contributing-)
+- [🤝 Acknowledgement](#-acknowledgement-)
+- [🖊️ Citation](#️-citation-)
+- [🎫 License](#-license-)
+- [🏗️ Projects in OpenMMLab](#%EF%B8%8F-projects-in-openmmlab-)
+
+## 🥳 🚀 What's New [🔝](#-table-of-contents)
+
+💎 **v0.6.0** was released on 15/8/2023:
+
+- Support YOLOv5 instance segmentation
+- Support YOLOX-Pose based on MMPose
+- Add 15 minutes instance segmentation tutorial.
+- YOLOv5 supports using mask annotation to optimize bbox
+- Add Multi-scale training and testing docs
+
+For release history and update details, please refer to [changelog](https://mmyolo.readthedocs.io/en/latest/notes/changelog.html).
+
+### ✨ Highlight [🔝](#-table-of-contents)
+
+We are excited to announce our latest work on real-time object recognition tasks, **RTMDet**, a family of fully convolutional single-stage detectors. RTMDet not only achieves the best parameter-accuracy trade-off on object detection from tiny to extra-large model sizes but also obtains new state-of-the-art performance on instance segmentation and rotated object detection tasks. Details can be found in the [technical report](https://arxiv.org/abs/2212.07784). Pre-trained models are [here](configs/rtmdet).
+
+[![PWC](https://img.shields.io/endpoint.svg?url=https://paperswithcode.com/badge/rtmdet-an-empirical-study-of-designing-real/real-time-instance-segmentation-on-mscoco)](https://paperswithcode.com/sota/real-time-instance-segmentation-on-mscoco?p=rtmdet-an-empirical-study-of-designing-real)
+[![PWC](https://img.shields.io/endpoint.svg?url=https://paperswithcode.com/badge/rtmdet-an-empirical-study-of-designing-real/object-detection-in-aerial-images-on-dota-1)](https://paperswithcode.com/sota/object-detection-in-aerial-images-on-dota-1?p=rtmdet-an-empirical-study-of-designing-real)
+[![PWC](https://img.shields.io/endpoint.svg?url=https://paperswithcode.com/badge/rtmdet-an-empirical-study-of-designing-real/object-detection-in-aerial-images-on-hrsc2016)](https://paperswithcode.com/sota/object-detection-in-aerial-images-on-hrsc2016?p=rtmdet-an-empirical-study-of-designing-real)
+
+| Task                     | Dataset | AP                                   | FPS(TRT FP16 BS1 3090) |
+| ------------------------ | ------- | ------------------------------------ | ---------------------- |
+| Object Detection         | COCO    | 52.8                                 | 322                    |
+| Instance Segmentation    | COCO    | 44.6                                 | 188                    |
+| Rotated Object Detection | DOTA    | 78.9(single-scale)/81.3(multi-scale) | 121                    |
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/12907710/208044554-1e8de6b5-48d8-44e4-a7b5-75076c7ebb71.png"/>
+</div>
+
+MMYOLO currently implements the object detection and rotated object detection algorithm, but it has a significant training acceleration compared to the MMDeteciton version. The training speed is 2.6 times faster than the previous version.
+
+## 📖 Introduction [🔝](#-table-of-contents)
+
+MMYOLO is an open source toolbox for YOLO series algorithms based on PyTorch and [MMDetection](https://github.com/open-mmlab/mmdetection). It is a part of the [OpenMMLab](https://openmmlab.com/) project.
+
+The master branch works with **PyTorch 1.6+**.
+<img src="https://user-images.githubusercontent.com/45811724/190993591-bd3f1f11-1c30-4b93-b5f4-05c9ff64ff7f.gif"/>
+
+<details open>
+<summary>Major features</summary>
+
+- 🕹️ **Unified and convenient benchmark**
+
+  MMYOLO unifies the implementation of modules in various YOLO algorithms and provides a unified benchmark. Users can compare and analyze in a fair and convenient way.
+
+- 📚 **Rich and detailed documentation**
+
+  MMYOLO provides rich documentation for getting started, model deployment, advanced usages, and algorithm analysis, making it easy for users at different levels to get started and make extensions quickly.
+
+- 🧩 **Modular Design**
+
+  MMYOLO decomposes the framework into different components where users can easily customize a model by combining different modules with various training and testing strategies.
+
+<img src="https://user-images.githubusercontent.com/27466624/199999337-0544a4cb-3cbd-4f3e-be26-bcd9e74db7ff.jpg" alt="BaseModule-P5"/>
+  The figure above is contributed by RangeKing@GitHub, thank you very much!
+
+And the figure of P6 model is in [model_design.md](docs/en/recommended_topics/model_design.md).
+
+</details>
+
+## 🛠️ Installation [🔝](#-table-of-contents)
+
+MMYOLO relies on PyTorch, MMCV, MMEngine, and MMDetection. Below are quick steps for installation. Please refer to the [Install Guide](docs/en/get_started/installation.md) for more detailed instructions.
+
+```shell
+conda create -n mmyolo python=3.8 pytorch==1.10.1 torchvision==0.11.2 cudatoolkit=11.3 -c pytorch -y
+conda activate mmyolo
+pip install openmim
+mim install "mmengine>=0.6.0"
+mim install "mmcv>=2.0.0rc4,<2.1.0"
+mim install "mmdet>=3.0.0,<4.0.0"
+git clone https://github.com/open-mmlab/mmyolo.git
+cd mmyolo
+# Install albumentations
+pip install -r requirements/albu.txt
+# Install MMYOLO
+mim install -v -e .
+```
+
+## 👨‍🏫 Tutorial [🔝](#-table-of-contents)
+
+MMYOLO is based on MMDetection and adopts the same code structure and design approach. To get better use of this, please read [MMDetection Overview](https://mmdetection.readthedocs.io/en/latest/get_started.html) for the first understanding of MMDetection.
+
+The usage of MMYOLO is almost identical to MMDetection and all tutorials are straightforward to use, you can also learn about [MMDetection User Guide and Advanced Guide](https://mmdetection.readthedocs.io/en/3.x/).
+
+For different parts from MMDetection, we have also prepared user guides and advanced guides, please read our [documentation](https://mmyolo.readthedocs.io/zenh_CN/latest/).
+
+<details>
+<summary>Get Started</summary>
+
+- [Overview](docs/en/get_started/overview.md)
+- [Dependencies](docs/en/get_started/dependencies.md)
+- [Installation](docs/en/get_started/installation.md)
+- [15 minutes object detection](docs/en/get_started/15_minutes_object_detection.md)
+- [15 minutes rotated object detection](docs/en/get_started/15_minutes_rotated_object_detection.md)
+- [15 minutes instance segmentation](docs/en/get_started/15_minutes_instance_segmentation.md)
+- [Resources summary](docs/en/get_started/article.md)
+
+</details>
+
+<details>
+<summary>Recommended Topics</summary>
+
+- [How to contribute code to MMYOLO](docs/en/recommended_topics/contributing.md)
+- [Training testing tricks](docs/en/recommended_topics/training_testing_tricks.md)
+- [MMYOLO model design](docs/en/recommended_topics/model_design.md)
+- [Algorithm principles and implementation](docs/en/recommended_topics/algorithm_descriptions/)
+- [Replace the backbone network](docs/en/recommended_topics/replace_backbone.md)
+- [MMYOLO model complexity analysis](docs/en/recommended_topics/complexity_analysis.md)
+- [Annotation-to-deployment workflow for custom dataset](docs/en/recommended_topics/labeling_to_deployment_tutorials.md)
+- [Visualization](docs/en/recommended_topics/visualization.md)
+- [Model deployment](docs/en/recommended_topics/deploy/)
+- [Troubleshooting steps](docs/en/recommended_topics/troubleshooting_steps.md)
+- [MMYOLO application examples](docs/en/recommended_topics/application_examples/)
+- [MM series repo essential basics](docs/en/recommended_topics/mm_basics.md)
+- [Dataset preparation and description](docs/en/recommended_topics/dataset_preparation.md)
+
+</details>
+
+<details>
+<summary>Common Usage</summary>
+
+- [Resume training](docs/en/common_usage/resume_training.md)
+- [Enabling and disabling SyncBatchNorm](docs/en/common_usage/syncbn.md)
+- [Enabling AMP](docs/en/common_usage/amp_training.md)
+- [Multi-scale training and testing](docs/en/common_usage/ms_training_testing.md)
+- [TTA Related Notes](docs/en/common_usage/tta.md)
+- [Add plugins to the backbone network](docs/en/common_usage/plugins.md)
+- [Freeze layers](docs/en/common_usage/freeze_layers.md)
+- [Output model predictions](docs/en/common_usage/output_predictions.md)
+- [Set random seed](docs/en/common_usage/set_random_seed.md)
+- [Module combination](docs/en/common_usage/module_combination.md)
+- [Cross-library calls using mim](docs/en/common_usage/mim_usage.md)
+- [Apply multiple Necks](docs/en/common_usage/multi_necks.md)
+- [Specify specific device training or inference](docs/en/common_usage/specify_device.md)
+- [Single and multi-channel application examples](docs/en/common_usage/single_multi_channel_applications.md)
+
+</details>
+
+<details>
+<summary>Useful Tools</summary>
+
+- [Browse coco json](docs/en/useful_tools/browse_coco_json.md)
+- [Browse dataset](docs/en/useful_tools/browse_dataset.md)
+- [Print config](docs/en/useful_tools/print_config.md)
+- [Dataset analysis](docs/en/useful_tools/dataset_analysis.md)
+- [Optimize anchors](docs/en/useful_tools/optimize_anchors.md)
+- [Extract subcoco](docs/en/useful_tools/extract_subcoco.md)
+- [Visualization scheduler](docs/en/useful_tools/vis_scheduler.md)
+- [Dataset converters](docs/en/useful_tools/dataset_converters.md)
+- [Download dataset](docs/en/useful_tools/download_dataset.md)
+- [Log analysis](docs/en/useful_tools/log_analysis.md)
+- [Model converters](docs/en/useful_tools/model_converters.md)
+
+</details>
+
+<details>
+<summary>Basic Tutorials</summary>
+
+- [Learn about configs with YOLOv5](docs/en/tutorials/config.md)
+- [Data flow](docs/en/tutorials/data_flow.md)
+- [Rotated detection](docs/en/tutorials/rotated_detection.md)
+- [Custom Installation](docs/en/tutorials/custom_installation.md)
+- [Common Warning Notes](docs/zh_cn/tutorials/warning_notes.md)
+- [FAQ](docs/en/tutorials/faq.md)
+
+</details>
+
+<details>
+<summary>Advanced Tutorials</summary>
+
+- [MMYOLO cross-library application](docs/en/advanced_guides/cross-library_application.md)
+
+</details>
+
+<details>
+<summary>Descriptions</summary>
+
+- [Changelog](docs/en/notes/changelog.md)
+- [Compatibility](docs/en/notes/compatibility.md)
+- [Conventions](docs/en/notes/conventions.md)
+- [Code Style](docs/en/notes/code_style.md)
+
+</details>
+
+## 📊 Overview of Benchmark and Model Zoo [🔝](#-table-of-contents)
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/17425982/222087414-168175cc-dae6-4c5c-a8e3-3109a152dd19.png"/>
+</div>
+
+Results and models are available in the [model zoo](docs/en/model_zoo.md).
+
+<details open>
+<summary><b>Supported Tasks</b></summary>
+
+- [x] Object detection
+- [x] Rotated object detection
+
+</details>
+
+<details open>
+<summary><b>Supported Algorithms</b></summary>
+
+- [x] [YOLOv5](configs/yolov5)
+- [ ] [YOLOv5u](configs/yolov5/yolov5u) (Inference only)
+- [x] [YOLOX](configs/yolox)
+- [x] [RTMDet](configs/rtmdet)
+- [x] [RTMDet-Rotated](configs/rtmdet)
+- [x] [YOLOv6](configs/yolov6)
+- [x] [YOLOv7](configs/yolov7)
+- [x] [PPYOLOE](configs/ppyoloe)
+- [x] [YOLOv8](configs/yolov8)
+
+</details>
+
+<details open>
+<summary><b>Supported Datasets</b></summary>
+
+- [x] COCO Dataset
+- [x] VOC Dataset
+- [x] CrowdHuman Dataset
+- [x] DOTA 1.0 Dataset
+
+</details>
+
+<details open>
+<div align="center">
+  <b>Module Components</b>
+</div>
+<table align="center">
+  <tbody>
+    <tr align="center" valign="bottom">
+      <td>
+        <b>Backbones</b>
+      </td>
+      <td>
+        <b>Necks</b>
+      </td>
+      <td>
+        <b>Loss</b>
+      </td>
+      <td>
+        <b>Common</b>
+      </td>
+    </tr>
+    <tr valign="top">
+      <td>
+      <ul>
+        <li>YOLOv5CSPDarknet</li>
+        <li>YOLOv8CSPDarknet</li>
+        <li>YOLOXCSPDarknet</li>
+        <li>EfficientRep</li>
+        <li>CSPNeXt</li>
+        <li>YOLOv7Backbone</li>
+        <li>PPYOLOECSPResNet</li>
+        <li>mmdet backbone</li>
+        <li>mmcls backbone</li>
+        <li>timm</li>
+      </ul>
+      </td>
+      <td>
+      <ul>
+        <li>YOLOv5PAFPN</li>
+        <li>YOLOv8PAFPN</li>
+        <li>YOLOv6RepPAFPN</li>
+        <li>YOLOXPAFPN</li>
+        <li>CSPNeXtPAFPN</li>
+        <li>YOLOv7PAFPN</li>
+        <li>PPYOLOECSPPAFPN</li>
+      </ul>
+      </td>
+      <td>
+        <ul>
+          <li>IoULoss</li>
+          <li>mmdet loss</li>
+        </ul>
+      </td>
+      <td>
+        <ul>
+        </ul>
+      </td>
+    </tr>
+</td>
+    </tr>
+  </tbody>
+</table>
+
+</details>
+
+## ❓ FAQ [🔝](#-table-of-contents)
+
+Please refer to the [FAQ](docs/en/tutorials/faq.md) for frequently asked questions.
+
+## 🙌 Contributing [🔝](#-table-of-contents)
+
+We appreciate all contributions to improving MMYOLO. Ongoing projects can be found in our [GitHub Projects](https://github.com/open-mmlab/mmyolo/projects). Welcome community users to participate in these projects. Please refer to [CONTRIBUTING.md](.github/CONTRIBUTING.md) for the contributing guideline.
+
+## 🤝 Acknowledgement [🔝](#-table-of-contents)
+
+MMYOLO is an open source project that is contributed by researchers and engineers from various colleges and companies. We appreciate all the contributors who implement their methods or add new features, as well as users who give valuable feedback.
+We wish that the toolbox and benchmark could serve the growing research community by providing a flexible toolkit to re-implement existing methods and develop their own new detectors.
+
+<div align="center">
+  <a href="https://github.com/open-mmlab/mmyolo/graphs/contributors"><img src="https://contrib.rocks/image?repo=open-mmlab/mmyolo"/></a>
+</div>
+
+## 🖊️ Citation [🔝](#-table-of-contents)
+
+If you find this project useful in your research, please consider citing:
+
+```latex
+@misc{mmyolo2022,
+    title={{MMYOLO: OpenMMLab YOLO} series toolbox and benchmark},
+    author={MMYOLO Contributors},
+    howpublished = {\url{https://github.com/open-mmlab/mmyolo}},
+    year={2022}
+}
+```
+
+## 🎫 License [🔝](#-table-of-contents)
+
+This project is released under the [GPL 3.0 license](LICENSE).
+
+## 🏗️ Projects in OpenMMLab [🔝](#-table-of-contents)
+
+- [MMEngine](https://github.com/open-mmlab/mmengine): OpenMMLab foundational library for training deep learning models.
+- [MMCV](https://github.com/open-mmlab/mmcv): OpenMMLab foundational library for computer vision.
+- [MMPreTrain](https://github.com/open-mmlab/mmpretrain): OpenMMLab pre-training toolbox and benchmark.
+- [MMagic](https://github.com/open-mmlab/mmagic): Open**MM**Lab **A**dvanced, **G**enerative and **I**ntelligent **C**reation toolbox.
+- [MMDetection](https://github.com/open-mmlab/mmdetection): OpenMMLab detection toolbox and benchmark.
+- [MMDetection3D](https://github.com/open-mmlab/mmdetection3d): OpenMMLab's next-generation platform for general 3D object detection.
+- [MMRotate](https://github.com/open-mmlab/mmrotate): OpenMMLab rotated object detection toolbox and benchmark.
+- [MMYOLO](https://github.com/open-mmlab/mmyolo): OpenMMLab YOLO series toolbox and benchmark.
+- [MMSegmentation](https://github.com/open-mmlab/mmsegmentation): OpenMMLab semantic segmentation toolbox and benchmark.
+- [MMOCR](https://github.com/open-mmlab/mmocr): OpenMMLab text detection, recognition, and understanding toolbox.
+- [MMPose](https://github.com/open-mmlab/mmpose): OpenMMLab pose estimation toolbox and benchmark.
+- [MMHuman3D](https://github.com/open-mmlab/mmhuman3d): OpenMMLab 3D human parametric model toolbox and benchmark.
+- [MMSelfSup](https://github.com/open-mmlab/mmselfsup): OpenMMLab self-supervised learning toolbox and benchmark.
+- [MMRazor](https://github.com/open-mmlab/mmrazor): OpenMMLab model compression toolbox and benchmark.
+- [MMFewShot](https://github.com/open-mmlab/mmfewshot): OpenMMLab fewshot learning toolbox and benchmark.
+- [MMAction2](https://github.com/open-mmlab/mmaction2): OpenMMLab's next-generation action understanding toolbox and benchmark.
+- [MMTracking](https://github.com/open-mmlab/mmtracking): OpenMMLab video perception toolbox and benchmark.
+- [MMFlow](https://github.com/open-mmlab/mmflow): OpenMMLab optical flow toolbox and benchmark.
+- [MMEditing](https://github.com/open-mmlab/mmediting): OpenMMLab image and video editing toolbox.
+- [MMGeneration](https://github.com/open-mmlab/mmgeneration): OpenMMLab image and video generative models toolbox.
+- [MMDeploy](https://github.com/open-mmlab/mmdeploy): OpenMMLab model deployment framework.
+- [MIM](https://github.com/open-mmlab/mim): MIM installs OpenMMLab packages.
+- [MMEval](https://github.com/open-mmlab/mmeval): OpenMMLab machine learning evaluation library.
+- [Playground](https://github.com/open-mmlab/playground): A central hub for gathering and showcasing amazing projects built upon OpenMMLab.
diff --git a/mmdetection_practice/third_party/mmyolo/README_zh-CN.md b/mmdetection_practice/third_party/mmyolo/README_zh-CN.md
new file mode 100644
index 0000000..6eb4d95
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/README_zh-CN.md
@@ -0,0 +1,468 @@
+<div align="center">
+  <img src="https://user-images.githubusercontent.com/27466624/222385182-1247251c-8fac-4e77-94f5-57580e0ce3bd.png" width="100%"/>
+  <div>&nbsp;</div>
+  <div align="center">
+    <b><font size="5">OpenMMLab 官网</font></b>
+    <sup>
+      <a href="https://openmmlab.com">
+        <i><font size="4">HOT</font></i>
+      </a>
+    </sup>
+    &nbsp;&nbsp;&nbsp;&nbsp;
+    <b><font size="5">OpenMMLab 开放平台</font></b>
+    <sup>
+      <a href="https://platform.openmmlab.com">
+        <i><font size="4">TRY IT OUT</font></i>
+      </a>
+    </sup>
+  </div>
+  <div>&nbsp;</div>
+
+[![PyPI](https://img.shields.io/pypi/v/mmyolo)](https://pypi.org/project/mmyolo)
+[![docs](https://img.shields.io/badge/docs-latest-blue)](https://mmyolo.readthedocs.io/zh_CN/latest/)
+[![deploy](https://github.com/open-mmlab/mmyolo/workflows/deploy/badge.svg)](https://github.com/open-mmlab/mmyolo/actions)
+[![codecov](https://codecov.io/gh/open-mmlab/mmyolo/branch/main/graph/badge.svg)](https://codecov.io/gh/open-mmlab/mmyolo)
+[![license](https://img.shields.io/github/license/open-mmlab/mmyolo.svg)](https://github.com/open-mmlab/mmyolo/blob/main/LICENSE)
+[![open issues](https://isitmaintained.com/badge/open/open-mmlab/mmyolo.svg)](https://github.com/open-mmlab/mmyolo/issues)
+[![issue resolution](https://isitmaintained.com/badge/resolution/open-mmlab/mmyolo.svg)](https://github.com/open-mmlab/mmyolo/issues)
+
+[📘使用文档](https://mmyolo.readthedocs.io/zh_CN/latest/) |
+[🛠️安装教程](https://mmyolo.readthedocs.io/zh_CN/latest/get_started/installation.html) |
+[👀模型库](https://mmyolo.readthedocs.io/zh_CN/latest/model_zoo.html) |
+[🆕更新日志](https://mmyolo.readthedocs.io/zh_CN/latest/notes/changelog.html) |
+[🤔报告问题](https://github.com/open-mmlab/mmyolo/issues/new/choose)
+
+</div>
+
+<div align="center">
+
+[English](README.md) | 简体中文
+
+</div>
+
+<div align="center">
+  <a href="https://openmmlab.medium.com/" style="text-decoration:none;">
+    <img src="https://user-images.githubusercontent.com/25839884/219255827-67c1a27f-f8c5-46a9-811d-5e57448c61d1.png" width="3%" alt="" /></a>
+  <img src="https://user-images.githubusercontent.com/25839884/218346358-56cc8e2f-a2b8-487f-9088-32480cceabcf.png" width="3%" alt="" />
+  <a href="https://discord.com/channels/1037617289144569886/1046608014234370059" style="text-decoration:none;">
+    <img src="https://user-images.githubusercontent.com/25839884/218347213-c080267f-cbb6-443e-8532-8e1ed9a58ea9.png" width="3%" alt="" /></a>
+  <img src="https://user-images.githubusercontent.com/25839884/218346358-56cc8e2f-a2b8-487f-9088-32480cceabcf.png" width="3%" alt="" />
+  <a href="https://twitter.com/OpenMMLab" style="text-decoration:none;">
+    <img src="https://user-images.githubusercontent.com/25839884/218346637-d30c8a0f-3eba-4699-8131-512fb06d46db.png" width="3%" alt="" /></a>
+  <img src="https://user-images.githubusercontent.com/25839884/218346358-56cc8e2f-a2b8-487f-9088-32480cceabcf.png" width="3%" alt="" />
+  <a href="https://www.youtube.com/openmmlab" style="text-decoration:none;">
+    <img src="https://user-images.githubusercontent.com/25839884/218346691-ceb2116a-465a-40af-8424-9f30d2348ca9.png" width="3%" alt="" /></a>
+  <img src="https://user-images.githubusercontent.com/25839884/218346358-56cc8e2f-a2b8-487f-9088-32480cceabcf.png" width="3%" alt="" />
+  <a href="https://space.bilibili.com/1293512903" style="text-decoration:none;">
+    <img src="https://user-images.githubusercontent.com/25839884/219026751-d7d14cce-a7c9-4e82-9942-8375fca65b99.png" width="3%" alt="" /></a>
+  <img src="https://user-images.githubusercontent.com/25839884/218346358-56cc8e2f-a2b8-487f-9088-32480cceabcf.png" width="3%" alt="" />
+  <a href="https://www.zhihu.com/people/openmmlab" style="text-decoration:none;">
+    <img src="https://user-images.githubusercontent.com/25839884/219026120-ba71e48b-6e94-4bd4-b4e9-b7d175b5e362.png" width="3%" alt="" /></a>
+</div>
+
+## 📄 Table of Contents
+
+- [🥳 🚀 最新进展](#--最新进展-)
+  - [✨ 亮点](#-亮点-)
+- [📖 简介](#-简介-)
+- [🛠️ 安装](#️%EF%B8%8F-安装-)
+- [👨‍🏫 教程](#-教程-)
+- [📊 基准测试和模型库](#-基准测试和模型库-)
+- [❓ 常见问题](#-常见问题-)
+- [🙌 贡献指南](#-贡献指南-)
+- [🤝 致谢](#🤝-致谢-)
+- [🖊️ 引用](#️-引用-)
+- [🎫 开源许可证](#-开源许可证-)
+- [🏗️ OpenMMLab 的其他项目](#%EF%B8%8F-openmmlab-的其他项目-)
+- [❤️ 欢迎加入 OpenMMLab 社区](#%EF%B8%8F-欢迎加入-openmmlab-社区-)
+
+## 🥳 🚀 最新进展 [🔝](#-table-of-contents)
+
+💎 **v0.6.0** 版本已经在 2023.8.15 发布:
+
+- 支持 YOLOv5 实例分割
+- 基于 MMPose 支持 YOLOX-Pose
+- 添加 15 分钟的实例分割教程
+- YOLOv5 支持使用 mask 标注来优化边界框
+- 添加多尺度训练和测试文档
+
+我们提供了实用的**脚本命令速查表**
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/27466624/213104312-3580c783-2423-442f-b5f6-79204a06adb5.png">
+</div>
+
+你可以点击[链接](https://pan.baidu.com/s/1QEaqT7YayUdEvh1an0gjHg?pwd=yolo),下载高清版 PDF 文件。
+
+同时我们也推出了解读视频:
+
+|     |                内容                |                                                                                                                                                                                                     视频                                                                                                                                                                                                      |                                                                                                         课程中的代码                                                                                                          |
+| :-: | :--------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: |
+| 🌟  |            特征图可视化            | [![Link](https://i2.hdslb.com/bfs/archive/480a0eb41fce26e0acb65f82a74501418eee1032.jpg@112w_63h_1c.webp)](https://www.bilibili.com/video/BV188411s7o8)  [![bilibili](https://img.shields.io/badge/dynamic/json?label=views&style=social&logo=bilibili&query=data.stat.view&url=https%3A%2F%2Fapi.bilibili.com%2Fx%2Fweb-interface%2Fview%3Fbvid%3DBV188411s7o8)](https://www.bilibili.com/video/BV188411s7o8) | [特征图可视化.ipynb](https://github.com/open-mmlab/OpenMMLabCourse/blob/main/codes/MMYOLO_tutorials/%5B%E5%B7%A5%E5%85%B7%E7%B1%BB%E7%AC%AC%E4%B8%80%E6%9C%9F%5D%E7%89%B9%E5%BE%81%E5%9B%BE%E5%8F%AF%E8%A7%86%E5%8C%96.ipynb) |
+| 🌟  |     源码阅读和调试「必备」技巧     | [![Link](https://i2.hdslb.com/bfs/archive/790d2422c879ff20488910da1c4422b667ea6af7.jpg@112w_63h_1c.webp)](https://www.bilibili.com/video/BV1N14y1V7mB)  [![bilibili](https://img.shields.io/badge/dynamic/json?label=views&style=social&logo=bilibili&query=data.stat.view&url=https%3A%2F%2Fapi.bilibili.com%2Fx%2Fweb-interface%2Fview%3Fbvid%3DBV1N14y1V7mB)](https://www.bilibili.com/video/BV1N14y1V7mB) |                                                                           [源码阅读和调试「必备」技巧文档](https://zhuanlan.zhihu.com/p/580885852)                                                                            |
+| 🌟  |         10分钟换遍主干网络         | [![Link](http://i0.hdslb.com/bfs/archive/c51f1aef7c605856777249a7b4478f44bd69f3bd.jpg@112w_63h_1c.webp)](https://www.bilibili.com/video/BV1JG4y1d7GC)  [![bilibili](https://img.shields.io/badge/dynamic/json?label=views&style=social&logo=bilibili&query=data.stat.view&url=https%3A%2F%2Fapi.bilibili.com%2Fx%2Fweb-interface%2Fview%3Fbvid%3DBV1JG4y1d7GC)](https://www.bilibili.com/video/BV1JG4y1d7GC)  |     [10分钟换遍主干网络文档](https://zhuanlan.zhihu.com/p/585641598)<br>[10分钟换遍主干网络.ipynb](https://github.com/open-mmlab/OpenMMLabCourse/blob/main/codes/MMYOLO_tutorials/[实用类第二期]10分钟换遍主干网络.ipynb)     |
+| 🌟  | 自定义数据集从标注到部署保姆级教程 | [![Link](https://i2.hdslb.com/bfs/archive/13f566c89a18c9c881713b63ec14da952d4c0b14.jpg@112w_63h_1c.webp)](https://www.bilibili.com/video/BV1RG4y137i5)  [![bilibili](https://img.shields.io/badge/dynamic/json?label=views&style=social&logo=bilibili&query=data.stat.view&url=https%3A%2F%2Fapi.bilibili.com%2Fx%2Fweb-interface%2Fview%3Fbvid%3DBV1RG4y137i5)](https://www.bilibili.com/video/BV1JG4y1d7GC) |                                                 [自定义数据集从标注到部署保姆级教程](https://github.com/open-mmlab/mmyolo/blob/dev/docs/zh_cn/user_guides/custom_dataset.md)                                                  |
+| 🌟  |      顶会第一步 · 模块自定义       | [![Link](http://i2.hdslb.com/bfs/archive/5b23d41ac57466824eaf185ef806ef734414e93b.jpg@112w_63h_1c.webp)](https://www.bilibili.com/video/BV1yd4y1j7VD)  [![bilibili](https://img.shields.io/badge/dynamic/json?label=views&style=social&logo=bilibili&query=data.stat.view&url=https%3A%2F%2Fapi.bilibili.com%2Fx%2Fweb-interface%2Fview%3Fbvid%3DBV1yd4y1j7VD)](https://www.bilibili.com/video/BV1yd4y1j7VD)  |                                    [顶会第一步·模块自定义.ipynb](https://github.com/open-mmlab/OpenMMLabCourse/blob/main/codes/MMYOLO_tutorials/[实用类第四期]顶会第一步·模块自定义.ipynb)                                    |
+
+完整视频列表请参考 [中文解读资源汇总 - 视频](https://mmyolo.readthedocs.io/zh_CN/latest/get_started/article.html)
+
+发布历史和更新细节请参考 [更新日志](https://mmyolo.readthedocs.io/zh_CN/latest/notes/changelog.html)
+
+### ✨ 亮点 [🔝](#-table-of-contents)
+
+我们很高兴向大家介绍我们在实时目标识别任务方面的最新成果 RTMDet,包含了一系列的全卷积单阶段检测模型。 RTMDet 不仅在从 tiny 到 extra-large 尺寸的目标检测模型上实现了最佳的参数量和精度的平衡,而且在实时实例分割和旋转目标检测任务上取得了最先进的成果。 更多细节请参阅[技术报告](https://arxiv.org/abs/2212.07784)。 预训练模型可以在[这里](configs/rtmdet)找到。
+
+[![PWC](https://img.shields.io/endpoint.svg?url=https://paperswithcode.com/badge/rtmdet-an-empirical-study-of-designing-real/real-time-instance-segmentation-on-mscoco)](https://paperswithcode.com/sota/real-time-instance-segmentation-on-mscoco?p=rtmdet-an-empirical-study-of-designing-real)
+[![PWC](https://img.shields.io/endpoint.svg?url=https://paperswithcode.com/badge/rtmdet-an-empirical-study-of-designing-real/object-detection-in-aerial-images-on-dota-1)](https://paperswithcode.com/sota/object-detection-in-aerial-images-on-dota-1?p=rtmdet-an-empirical-study-of-designing-real)
+[![PWC](https://img.shields.io/endpoint.svg?url=https://paperswithcode.com/badge/rtmdet-an-empirical-study-of-designing-real/object-detection-in-aerial-images-on-hrsc2016)](https://paperswithcode.com/sota/object-detection-in-aerial-images-on-hrsc2016?p=rtmdet-an-empirical-study-of-designing-real)
+
+| Task                     | Dataset | AP                                   | FPS(TRT FP16 BS1 3090) |
+| ------------------------ | ------- | ------------------------------------ | ---------------------- |
+| Object Detection         | COCO    | 52.8                                 | 322                    |
+| Instance Segmentation    | COCO    | 44.6                                 | 188                    |
+| Rotated Object Detection | DOTA    | 78.9(single-scale)/81.3(multi-scale) | 121                    |
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/12907710/208044554-1e8de6b5-48d8-44e4-a7b5-75076c7ebb71.png"/>
+</div>
+
+MMYOLO 中目前实现了目标检测和旋转框目标检测算法,但是相比 MMDeteciton 版本有显著训练加速,训练速度相比原先版本提升 2.6 倍。
+
+## 📖 简介 [🔝](#-table-of-contents)
+
+MMYOLO 是一个基于 PyTorch 和 MMDetection 的 YOLO 系列算法开源工具箱。它是 [OpenMMLab](https://openmmlab.com/) 项目的一部分。
+
+主分支代码目前支持 PyTorch 1.6 以上的版本。
+<img src="https://user-images.githubusercontent.com/45811724/190993591-bd3f1f11-1c30-4b93-b5f4-05c9ff64ff7f.gif"/>
+
+<details open>
+<summary>主要特性</summary>
+
+- 🕹️ **统一便捷的算法评测**
+
+  MMYOLO 统一了各类 YOLO 算法模块的实现, 并提供了统一的评测流程,用户可以公平便捷地进行对比分析。
+
+- 📚 **丰富的入门和进阶文档**
+
+  MMYOLO 提供了从入门到部署到进阶和算法解析等一系列文档,方便不同用户快速上手和扩展。
+
+- 🧩 **模块化设计**
+
+  MMYOLO 将框架解耦成不同的模块组件,通过组合不同的模块和训练测试策略,用户可以便捷地构建自定义模型。
+
+<img src="https://user-images.githubusercontent.com/27466624/199999337-0544a4cb-3cbd-4f3e-be26-bcd9e74db7ff.jpg" alt="基类-P5"/>
+  图为 RangeKing@GitHub 提供,非常感谢!
+
+P6 模型图详见 [model_design.md](docs/zh_cn/recommended_topics/model_design.md)。
+
+</details>
+
+## 🛠️ 安装 [🔝](#-table-of-contents)
+
+MMYOLO 依赖 PyTorch, MMCV, MMEngine 和 MMDetection,以下是安装的简要步骤。 更详细的安装指南请参考[安装文档](docs/zh_cn/get_started/installation.md)。
+
+```shell
+conda create -n mmyolo python=3.8 pytorch==1.10.1 torchvision==0.11.2 cudatoolkit=11.3 -c pytorch -y
+conda activate mmyolo
+pip install openmim
+mim install "mmengine>=0.6.0"
+mim install "mmcv>=2.0.0rc4,<2.1.0"
+mim install "mmdet>=3.0.0,<4.0.0"
+git clone https://github.com/open-mmlab/mmyolo.git
+cd mmyolo
+# Install albumentations
+pip install -r requirements/albu.txt
+# Install MMYOLO
+mim install -v -e .
+```
+
+## 👨‍🏫 教程 [🔝](#-table-of-contents)
+
+MMYOLO 基于 MMDetection 开源库,并且采用相同的代码组织和设计方式。为了更好的使用本开源库,请先阅读 [MMDetection 概述](https://mmdetection.readthedocs.io/zh_CN/latest/get_started.html) 对 MMDetection 进行初步地了解。
+
+MMYOLO 用法和 MMDetection 几乎一致,所有教程都是通用的,你也可以了解 [MMDetection 用户指南和进阶指南](https://mmdetection.readthedocs.io/zh_CN/3.x/) 。
+
+针对和 MMDetection 不同的部分,我们也准备了用户指南和进阶指南,请阅读我们的 [文档](https://mmyolo.readthedocs.io/zh_CN/latest/) 。
+
+<details>
+<summary>开启 MMYOLO 之旅</summary>
+
+- [概述](docs/zh_cn/get_started/overview.md)
+- [依赖](docs/zh_cn/get_started/dependencies.md)
+- [安装和验证](docs/zh_cn/get_started/installation.md)
+- [15 分钟上手 MMYOLO 目标检测](docs/zh_cn/get_started/15_minutes_object_detection.md)
+- [15 分钟上手 MMYOLO 旋转框目标检测](docs/zh_cn/get_started/15_minutes_rotated_object_detection.md)
+- [15 分钟上手 MMYOLO 实例分割](docs/zh_cn/get_started/15_minutes_instance_segmentation.md)
+- [中文解读资源汇总](docs/zh_cn/get_started/article.md)
+
+</details>
+
+<details>
+<summary>推荐专题</summary>
+
+- [如何给 MMYOLO 贡献代码](docs/zh_cn/recommended_topics/contributing.md)
+- [训练和测试技巧](docs/zh_cn/recommended_topics/training_testing_tricks.md)
+- [MMYOLO 模型结构设计](docs/zh_cn/recommended_topics/model_design.md)
+- [原理和实现全解析](docs/zh_cn/recommended_topics/algorithm_descriptions/)
+- [轻松更换主干网络](docs/zh_cn/recommended_topics/replace_backbone.md)
+- [MMYOLO 模型复杂度分析](docs/zh_cn/recommended_topics/complexity_analysis.md)
+- [标注+训练+测试+部署全流程](docs/zh_cn/recommended_topics/labeling_to_deployment_tutorials.md)
+- [关于可视化的一切](docs/zh_cn/recommended_topics/visualization.md)
+- [模型部署流程](docs/zh_cn/recommended_topics/deploy/)
+- [常见错误排查步骤](docs/zh_cn/recommended_topics/troubleshooting_steps.md)
+- [MMYOLO 应用范例介绍](docs/zh_cn/recommended_topics/application_examples/)
+- [MM 系列 Repo 必备基础](docs/zh_cn/recommended_topics/mm_basics.md)
+- [数据集准备和说明](docs/zh_cn/recommended_topics/dataset_preparation.md)
+
+</details>
+
+<details>
+<summary>常用功能</summary>
+
+- [恢复训练](docs/zh_cn/common_usage/resume_training.md)
+- [开启和关闭 SyncBatchNorm](docs/zh_cn/common_usage/syncbn.md)
+- [开启混合精度训练](docs/zh_cn/common_usage/amp_training.md)
+- [多尺度训练和测试](docs/zh_cn/common_usage/ms_training_testing.md)
+- [测试时增强相关说明](docs/zh_cn/common_usage/tta.md)
+- [给主干网络增加插件](docs/zh_cn/common_usage/plugins.md)
+- [冻结指定网络层权重](docs/zh_cn/common_usage/freeze_layers.md)
+- [输出模型预测结果](docs/zh_cn/common_usage/output_predictions.md)
+- [设置随机种子](docs/zh_cn/common_usage/set_random_seed.md)
+- [算法组合替换教程](docs/zh_cn/common_usage/module_combination.md)
+- [使用 mim 跨库调用其他 OpenMMLab 仓库的脚本](docs/zh_cn/common_usage/mim_usage.md)
+- [应用多个 Neck](docs/zh_cn/common_usage/multi_necks.md)
+- [指定特定设备训练或推理](docs/zh_cn/common_usage/specify_device.md)
+- [单通道和多通道应用案例](docs/zh_cn/common_usage/single_multi_channel_applications.md)
+- [MM 系列开源库注册表](docs/zh_cn/common_usage/registries_info.md)
+
+</details>
+
+<details>
+<summary>实用工具</summary>
+
+- [可视化 COCO 标签](docs/zh_cn/useful_tools/browse_coco_json.md)
+- [可视化数据集](docs/zh_cn/useful_tools/browse_dataset.md)
+- [打印完整配置文件](docs/zh_cn/useful_tools/print_config.md)
+- [可视化数据集分析结果](docs/zh_cn/useful_tools/dataset_analysis.md)
+- [优化锚框尺寸](docs/zh_cn/useful_tools/optimize_anchors.md)
+- [提取 COCO 子集](docs/zh_cn/useful_tools/extract_subcoco.md)
+- [可视化优化器参数策略](docs/zh_cn/useful_tools/vis_scheduler.md)
+- [数据集转换](docs/zh_cn/useful_tools/dataset_converters.md)
+- [数据集下载](docs/zh_cn/useful_tools/download_dataset.md)
+- [日志分析](docs/zh_cn/useful_tools/log_analysis.md)
+- [模型转换](docs/zh_cn/useful_tools/model_converters.md)
+
+</details>
+
+<details>
+<summary>基础教程</summary>
+
+- [学习 YOLOv5 配置文件](docs/zh_cn/tutorials/config.md)
+- [数据流](docs/zh_cn/tutorials/data_flow.md)
+- [旋转目标检测](docs/zh_cn/tutorials/rotated_detection.md)
+- [自定义安装](docs/zh_cn/tutorials/custom_installation.md)
+- [常见警告说明](docs/zh_cn/tutorials/warning_notes.md)
+- [常见问题](docs/zh_cn/tutorials/faq.md)
+
+</details>
+
+<details>
+<summary>进阶教程</summary>
+
+- [MMYOLO 跨库应用解析](docs/zh_cn/advanced_guides/cross-library_application.md)
+
+</details>
+
+<details>
+<summary>说明</summary>
+
+- [更新日志](docs/zh_cn/notes/changelog.md)
+- [兼容性说明](docs/zh_cn/notes/compatibility.md)
+- [默认约定](docs/zh_cn/notes/conventions.md)
+- [代码规范](docs/zh_cn/notes/code_style.md)
+
+</details>
+
+## 📊 基准测试和模型库 [🔝](#-table-of-contents)
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/17425982/222087414-168175cc-dae6-4c5c-a8e3-3109a152dd19.png"/>
+</div>
+
+测试结果和模型可以在 [模型库](docs/zh_cn/model_zoo.md) 中找到。
+
+<details open>
+<summary><b>支持的任务</b></summary>
+
+- [x] 目标检测
+- [x] 旋转框目标检测
+
+</details>
+
+<details open>
+<summary><b>支持的算法</b></summary>
+
+- [x] [YOLOv5](configs/yolov5)
+- [ ] [YOLOv5u](configs/yolov5/yolov5u) (仅推理)
+- [x] [YOLOX](configs/yolox)
+- [x] [RTMDet](configs/rtmdet)
+- [x] [RTMDet-Rotated](configs/rtmdet)
+- [x] [YOLOv6](configs/yolov6)
+- [x] [YOLOv7](configs/yolov7)
+- [x] [PPYOLOE](configs/ppyoloe)
+- [x] [YOLOv8](configs/yolov8)
+
+</details>
+
+<details open>
+<summary><b>支持的数据集</b></summary>
+
+- [x] COCO Dataset
+- [x] VOC Dataset
+- [x] CrowdHuman Dataset
+- [x] DOTA 1.0 Dataset
+
+</details>
+
+<details open>
+<div align="center">
+  <b>模块组件</b>
+</div>
+<table align="center">
+  <tbody>
+    <tr align="center" valign="bottom">
+      <td>
+        <b>Backbones</b>
+      </td>
+      <td>
+        <b>Necks</b>
+      </td>
+      <td>
+        <b>Loss</b>
+      </td>
+      <td>
+        <b>Common</b>
+      </td>
+    </tr>
+    <tr valign="top">
+      <td>
+      <ul>
+        <li>YOLOv5CSPDarknet</li>
+        <li>YOLOv8CSPDarknet</li>
+        <li>YOLOXCSPDarknet</li>
+        <li>EfficientRep</li>
+        <li>CSPNeXt</li>
+        <li>YOLOv7Backbone</li>
+        <li>PPYOLOECSPResNet</li>
+        <li>mmdet backbone</li>
+        <li>mmcls backbone</li>
+        <li>timm</li>
+      </ul>
+      </td>
+      <td>
+      <ul>
+        <li>YOLOv5PAFPN</li>
+        <li>YOLOv8PAFPN</li>
+        <li>YOLOv6RepPAFPN</li>
+        <li>YOLOXPAFPN</li>
+        <li>CSPNeXtPAFPN</li>
+        <li>YOLOv7PAFPN</li>
+        <li>PPYOLOECSPPAFPN</li>
+      </ul>
+      </td>
+      <td>
+        <ul>
+          <li>IoULoss</li>
+          <li>mmdet loss</li>
+        </ul>
+      </td>
+      <td>
+        <ul>
+        </ul>
+      </td>
+    </tr>
+</td>
+    </tr>
+  </tbody>
+</table>
+
+</details>
+
+## ❓ 常见问题 [🔝](#-table-of-contents)
+
+请参考 [FAQ](docs/zh_cn/tutorials/faq.md) 了解其他用户的常见问题。
+
+## 🙌 贡献指南 [🔝](#-table-of-contents)
+
+我们感谢所有的贡献者为改进和提升 MMYOLO 所作出的努力。我们将正在进行中的项目添加进了[GitHub Projects](https://github.com/open-mmlab/mmyolo/projects)页面,非常欢迎社区用户能参与进这些项目中来。请参考[贡献指南](.github/CONTRIBUTING.md)来了解参与项目贡献的相关指引。
+
+## 🤝 致谢 [🔝](#-table-of-contents)
+
+MMYOLO 是一款由来自不同高校和企业的研发人员共同参与贡献的开源项目。我们感谢所有为项目提供算法复现和新功能支持的贡献者,以及提供宝贵反馈的用户。 我们希望这个工具箱和基准测试可以为社区提供灵活的代码工具,供用户复现已有算法并开发自己的新模型,从而不断为开源社区提供贡献。
+
+<div align="center">
+  <a href="https://github.com/open-mmlab/mmyolo/graphs/contributors"><img src="https://contrib.rocks/image?repo=open-mmlab/mmyolo"/></a>
+</div>
+
+## 🖊️ 引用 [🔝](#-table-of-contents)
+
+如果你觉得本项目对你的研究工作有所帮助,请参考如下 bibtex 引用 MMYOLO
+
+```latex
+@misc{mmyolo2022,
+    title={{MMYOLO: OpenMMLab YOLO} series toolbox and benchmark},
+    author={MMYOLO Contributors},
+    howpublished = {\url{https://github.com/open-mmlab/mmyolo}},
+    year={2022}
+}
+```
+
+## 🎫 开源许可证 [🔝](#-table-of-contents)
+
+该项目采用 [GPL 3.0 开源许可证](LICENSE)。
+
+## 🏗️ OpenMMLab 的其他项目 [🔝](#-table-of-contents)
+
+- [MMEngine](https://github.com/open-mmlab/mmengine): OpenMMLab 深度学习模型训练基础库
+- [MMCV](https://github.com/open-mmlab/mmcv): OpenMMLab 计算机视觉基础库
+- [MMPreTrain](https://github.com/open-mmlab/mmpretrain): OpenMMLab 深度学习预训练工具箱
+- [MMagic](https://github.com/open-mmlab/mmagic): OpenMMLab 新一代人工智能内容生成(AIGC)工具箱
+- [MMDetection](https://github.com/open-mmlab/mmdetection): OpenMMLab 目标检测工具箱
+- [MMDetection3D](https://github.com/open-mmlab/mmdetection3d): OpenMMLab 新一代通用 3D 目标检测平台
+- [MMRotate](https://github.com/open-mmlab/mmrotate): OpenMMLab 旋转框检测工具箱与测试基准
+- [MMYOLO](https://github.com/open-mmlab/mmyolo): OpenMMLab YOLO 系列工具箱
+- [MMSegmentation](https://github.com/open-mmlab/mmsegmentation): OpenMMLab 语义分割工具箱
+- [MMOCR](https://github.com/open-mmlab/mmocr): OpenMMLab 全流程文字检测识别理解工具包
+- [MMPose](https://github.com/open-mmlab/mmpose): OpenMMLab 姿态估计工具箱
+- [MMHuman3D](https://github.com/open-mmlab/mmhuman3d): OpenMMLab 人体参数化模型工具箱与测试基准
+- [MMSelfSup](https://github.com/open-mmlab/mmselfsup): OpenMMLab 自监督学习工具箱与测试基准
+- [MMRazor](https://github.com/open-mmlab/mmrazor): OpenMMLab 模型压缩工具箱与测试基准
+- [MMFewShot](https://github.com/open-mmlab/mmfewshot): OpenMMLab 少样本学习工具箱与测试基准
+- [MMAction2](https://github.com/open-mmlab/mmaction2): OpenMMLab 新一代视频理解工具箱
+- [MMTracking](https://github.com/open-mmlab/mmtracking): OpenMMLab 一体化视频目标感知平台
+- [MMFlow](https://github.com/open-mmlab/mmflow): OpenMMLab 光流估计工具箱与测试基准
+- [MMEditing](https://github.com/open-mmlab/mmediting): OpenMMLab 图像视频编辑工具箱
+- [MMGeneration](https://github.com/open-mmlab/mmgeneration): OpenMMLab 图片视频生成模型工具箱
+- [MMDeploy](https://github.com/open-mmlab/mmdeploy): OpenMMLab 模型部署框架
+- [MIM](https://github.com/open-mmlab/mim): MIM 是 OpenMMlab 项目、算法、模型的统一入口
+- [MMEval](https://github.com/open-mmlab/mmeval): OpenMMLab 机器学习算法评测库
+- [Playground](https://github.com/open-mmlab/playground): 收集和展示 OpenMMLab 相关的前沿、有趣的社区项目
+
+## ❤️ 欢迎加入 OpenMMLab 社区 [🔝](#-table-of-contents)
+
+扫描下方的二维码可关注 OpenMMLab 团队的 [知乎官方账号](https://www.zhihu.com/people/openmmlab),加入 OpenMMLab 团队的 [官方交流 QQ 群](https://jq.qq.com/?_wv=1027&k=aCvMxdr3)
+
+<div align="center">
+<img src="resources/zhihu_qrcode.jpg" height="400" />  <img src="resources/qq_group_qrcode.jpg" height="400" />
+</div>
+
+我们会在 OpenMMLab 社区为大家
+
+- 📢 分享 AI 框架的前沿核心技术
+- 💻 解读 PyTorch 常用模块源码
+- 📰 发布 OpenMMLab 的相关新闻
+- 🚀 介绍 OpenMMLab 开发的前沿算法
+- 🏃 获取更高效的问题答疑和意见反馈
+- 🔥 提供与各行各业开发者充分交流的平台
+
+干货满满 📘,等你来撩 💗,OpenMMLab 社区期待您的加入 👬
diff --git a/mmdetection_practice/third_party/mmyolo/configs/_base_/default_runtime.py b/mmdetection_practice/third_party/mmyolo/configs/_base_/default_runtime.py
new file mode 100644
index 0000000..098f220
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/_base_/default_runtime.py
@@ -0,0 +1,43 @@
+default_scope = 'mmyolo'
+
+default_hooks = dict(
+    timer=dict(type='IterTimerHook'),
+    logger=dict(type='LoggerHook', interval=50),
+    param_scheduler=dict(type='ParamSchedulerHook'),
+    checkpoint=dict(type='CheckpointHook', interval=1),
+    sampler_seed=dict(type='DistSamplerSeedHook'),
+    visualization=dict(type='mmdet.DetVisualizationHook'))
+
+env_cfg = dict(
+    cudnn_benchmark=False,
+    mp_cfg=dict(mp_start_method='fork', opencv_num_threads=0),
+    dist_cfg=dict(backend='nccl'),
+)
+
+vis_backends = [dict(type='LocalVisBackend')]
+visualizer = dict(
+    type='mmdet.DetLocalVisualizer',
+    vis_backends=vis_backends,
+    name='visualizer')
+log_processor = dict(type='LogProcessor', window_size=50, by_epoch=True)
+
+log_level = 'INFO'
+load_from = None
+resume = False
+
+# Example to use different file client
+# Method 1: simply set the data root and let the file I/O module
+# automatically infer from prefix (not support LMDB and Memcache yet)
+
+# data_root = 's3://openmmlab/datasets/detection/coco/'
+
+# Method 2: Use `backend_args`, `file_client_args` in versions
+# before MMDet 3.0.0rc6
+# backend_args = dict(
+#     backend='petrel',
+#     path_mapping=dict({
+#         './data/': 's3://openmmlab/datasets/detection/',
+#         'data/': 's3://openmmlab/datasets/detection/'
+#     }))
+
+backend_args = None
diff --git a/mmdetection_practice/third_party/mmyolo/configs/_base_/det_p5_tta.py b/mmdetection_practice/third_party/mmyolo/configs/_base_/det_p5_tta.py
new file mode 100644
index 0000000..8df0d5e
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/_base_/det_p5_tta.py
@@ -0,0 +1,58 @@
+# TODO: Need to solve the problem of multiple backend_args parameters
+# _backend_args = dict(
+#     backend='petrel',
+#     path_mapping=dict({
+#         './data/': 's3://openmmlab/datasets/detection/',
+#         'data/': 's3://openmmlab/datasets/detection/'
+#     }))
+
+_backend_args = None
+
+tta_model = dict(
+    type='mmdet.DetTTAModel',
+    tta_cfg=dict(nms=dict(type='nms', iou_threshold=0.65), max_per_img=300))
+
+img_scales = [(640, 640), (320, 320), (960, 960)]
+
+#                                LoadImageFromFile
+#                     /                 |                     \
+# (RatioResize,LetterResize) (RatioResize,LetterResize) (RatioResize,LetterResize) # noqa
+#        /      \                    /      \                    /        \
+#  RandomFlip RandomFlip      RandomFlip RandomFlip        RandomFlip RandomFlip # noqa
+#      |          |                |         |                  |         |
+#  LoadAnn    LoadAnn           LoadAnn    LoadAnn           LoadAnn    LoadAnn
+#      |          |                |         |                  |         |
+#  PackDetIn  PackDetIn         PackDetIn  PackDetIn        PackDetIn  PackDetIn # noqa
+
+_multiscale_resize_transforms = [
+    dict(
+        type='Compose',
+        transforms=[
+            dict(type='YOLOv5KeepRatioResize', scale=s),
+            dict(
+                type='LetterResize',
+                scale=s,
+                allow_scale_up=False,
+                pad_val=dict(img=114))
+        ]) for s in img_scales
+]
+
+tta_pipeline = [
+    dict(type='LoadImageFromFile', backend_args=_backend_args),
+    dict(
+        type='TestTimeAug',
+        transforms=[
+            _multiscale_resize_transforms,
+            [
+                dict(type='mmdet.RandomFlip', prob=1.),
+                dict(type='mmdet.RandomFlip', prob=0.)
+            ], [dict(type='mmdet.LoadAnnotations', with_bbox=True)],
+            [
+                dict(
+                    type='mmdet.PackDetInputs',
+                    meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                               'scale_factor', 'pad_param', 'flip',
+                               'flip_direction'))
+            ]
+        ])
+]
diff --git a/mmdetection_practice/third_party/mmyolo/configs/_base_/pose/coco.py b/mmdetection_practice/third_party/mmyolo/configs/_base_/pose/coco.py
new file mode 100644
index 0000000..865a95b
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/_base_/pose/coco.py
@@ -0,0 +1,181 @@
+dataset_info = dict(
+    dataset_name='coco',
+    paper_info=dict(
+        author='Lin, Tsung-Yi and Maire, Michael and '
+        'Belongie, Serge and Hays, James and '
+        'Perona, Pietro and Ramanan, Deva and '
+        r'Doll{\'a}r, Piotr and Zitnick, C Lawrence',
+        title='Microsoft coco: Common objects in context',
+        container='European conference on computer vision',
+        year='2014',
+        homepage='http://cocodataset.org/',
+    ),
+    keypoint_info={
+        0:
+        dict(name='nose', id=0, color=[51, 153, 255], type='upper', swap=''),
+        1:
+        dict(
+            name='left_eye',
+            id=1,
+            color=[51, 153, 255],
+            type='upper',
+            swap='right_eye'),
+        2:
+        dict(
+            name='right_eye',
+            id=2,
+            color=[51, 153, 255],
+            type='upper',
+            swap='left_eye'),
+        3:
+        dict(
+            name='left_ear',
+            id=3,
+            color=[51, 153, 255],
+            type='upper',
+            swap='right_ear'),
+        4:
+        dict(
+            name='right_ear',
+            id=4,
+            color=[51, 153, 255],
+            type='upper',
+            swap='left_ear'),
+        5:
+        dict(
+            name='left_shoulder',
+            id=5,
+            color=[0, 255, 0],
+            type='upper',
+            swap='right_shoulder'),
+        6:
+        dict(
+            name='right_shoulder',
+            id=6,
+            color=[255, 128, 0],
+            type='upper',
+            swap='left_shoulder'),
+        7:
+        dict(
+            name='left_elbow',
+            id=7,
+            color=[0, 255, 0],
+            type='upper',
+            swap='right_elbow'),
+        8:
+        dict(
+            name='right_elbow',
+            id=8,
+            color=[255, 128, 0],
+            type='upper',
+            swap='left_elbow'),
+        9:
+        dict(
+            name='left_wrist',
+            id=9,
+            color=[0, 255, 0],
+            type='upper',
+            swap='right_wrist'),
+        10:
+        dict(
+            name='right_wrist',
+            id=10,
+            color=[255, 128, 0],
+            type='upper',
+            swap='left_wrist'),
+        11:
+        dict(
+            name='left_hip',
+            id=11,
+            color=[0, 255, 0],
+            type='lower',
+            swap='right_hip'),
+        12:
+        dict(
+            name='right_hip',
+            id=12,
+            color=[255, 128, 0],
+            type='lower',
+            swap='left_hip'),
+        13:
+        dict(
+            name='left_knee',
+            id=13,
+            color=[0, 255, 0],
+            type='lower',
+            swap='right_knee'),
+        14:
+        dict(
+            name='right_knee',
+            id=14,
+            color=[255, 128, 0],
+            type='lower',
+            swap='left_knee'),
+        15:
+        dict(
+            name='left_ankle',
+            id=15,
+            color=[0, 255, 0],
+            type='lower',
+            swap='right_ankle'),
+        16:
+        dict(
+            name='right_ankle',
+            id=16,
+            color=[255, 128, 0],
+            type='lower',
+            swap='left_ankle')
+    },
+    skeleton_info={
+        0:
+        dict(link=('left_ankle', 'left_knee'), id=0, color=[0, 255, 0]),
+        1:
+        dict(link=('left_knee', 'left_hip'), id=1, color=[0, 255, 0]),
+        2:
+        dict(link=('right_ankle', 'right_knee'), id=2, color=[255, 128, 0]),
+        3:
+        dict(link=('right_knee', 'right_hip'), id=3, color=[255, 128, 0]),
+        4:
+        dict(link=('left_hip', 'right_hip'), id=4, color=[51, 153, 255]),
+        5:
+        dict(link=('left_shoulder', 'left_hip'), id=5, color=[51, 153, 255]),
+        6:
+        dict(link=('right_shoulder', 'right_hip'), id=6, color=[51, 153, 255]),
+        7:
+        dict(
+            link=('left_shoulder', 'right_shoulder'),
+            id=7,
+            color=[51, 153, 255]),
+        8:
+        dict(link=('left_shoulder', 'left_elbow'), id=8, color=[0, 255, 0]),
+        9:
+        dict(
+            link=('right_shoulder', 'right_elbow'), id=9, color=[255, 128, 0]),
+        10:
+        dict(link=('left_elbow', 'left_wrist'), id=10, color=[0, 255, 0]),
+        11:
+        dict(link=('right_elbow', 'right_wrist'), id=11, color=[255, 128, 0]),
+        12:
+        dict(link=('left_eye', 'right_eye'), id=12, color=[51, 153, 255]),
+        13:
+        dict(link=('nose', 'left_eye'), id=13, color=[51, 153, 255]),
+        14:
+        dict(link=('nose', 'right_eye'), id=14, color=[51, 153, 255]),
+        15:
+        dict(link=('left_eye', 'left_ear'), id=15, color=[51, 153, 255]),
+        16:
+        dict(link=('right_eye', 'right_ear'), id=16, color=[51, 153, 255]),
+        17:
+        dict(link=('left_ear', 'left_shoulder'), id=17, color=[51, 153, 255]),
+        18:
+        dict(
+            link=('right_ear', 'right_shoulder'), id=18, color=[51, 153, 255])
+    },
+    joint_weights=[
+        1., 1., 1., 1., 1., 1., 1., 1.2, 1.2, 1.5, 1.5, 1., 1., 1.2, 1.2, 1.5,
+        1.5
+    ],
+    sigmas=[
+        0.026, 0.025, 0.025, 0.035, 0.035, 0.079, 0.079, 0.072, 0.072, 0.062,
+        0.062, 0.107, 0.107, 0.087, 0.087, 0.089, 0.089
+    ])
diff --git a/mmdetection_practice/third_party/mmyolo/configs/deploy/base_dynamic.py b/mmdetection_practice/third_party/mmyolo/configs/deploy/base_dynamic.py
new file mode 100644
index 0000000..747c21f
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/deploy/base_dynamic.py
@@ -0,0 +1,17 @@
+_base_ = ['./base_static.py']
+onnx_config = dict(
+    dynamic_axes={
+        'input': {
+            0: 'batch',
+            2: 'height',
+            3: 'width'
+        },
+        'dets': {
+            0: 'batch',
+            1: 'num_dets'
+        },
+        'labels': {
+            0: 'batch',
+            1: 'num_dets'
+        }
+    })
diff --git a/mmdetection_practice/third_party/mmyolo/configs/deploy/base_static.py b/mmdetection_practice/third_party/mmyolo/configs/deploy/base_static.py
new file mode 100644
index 0000000..dee01dd
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/deploy/base_static.py
@@ -0,0 +1,23 @@
+onnx_config = dict(
+    type='onnx',
+    export_params=True,
+    keep_initializers_as_inputs=False,
+    opset_version=11,
+    save_file='end2end.onnx',
+    input_names=['input'],
+    output_names=['dets', 'labels'],
+    input_shape=None,
+    optimize=True)
+codebase_config = dict(
+    type='mmyolo',
+    task='ObjectDetection',
+    model_type='end2end',
+    post_processing=dict(
+        score_threshold=0.05,
+        confidence_threshold=0.005,
+        iou_threshold=0.5,
+        max_output_boxes_per_class=200,
+        pre_top_k=5000,
+        keep_top_k=100,
+        background_label_id=-1),
+    module=['mmyolo.deploy'])
diff --git a/mmdetection_practice/third_party/mmyolo/configs/deploy/detection_onnxruntime_dynamic.py b/mmdetection_practice/third_party/mmyolo/configs/deploy/detection_onnxruntime_dynamic.py
new file mode 100644
index 0000000..14f4a12
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/deploy/detection_onnxruntime_dynamic.py
@@ -0,0 +1,15 @@
+_base_ = ['./base_dynamic.py']
+codebase_config = dict(
+    type='mmyolo',
+    task='ObjectDetection',
+    model_type='end2end',
+    post_processing=dict(
+        score_threshold=0.05,
+        confidence_threshold=0.005,
+        iou_threshold=0.5,
+        max_output_boxes_per_class=200,
+        pre_top_k=5000,
+        keep_top_k=100,
+        background_label_id=-1),
+    module=['mmyolo.deploy'])
+backend_config = dict(type='onnxruntime')
diff --git a/mmdetection_practice/third_party/mmyolo/configs/deploy/detection_onnxruntime_static.py b/mmdetection_practice/third_party/mmyolo/configs/deploy/detection_onnxruntime_static.py
new file mode 100644
index 0000000..3eac8ca
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/deploy/detection_onnxruntime_static.py
@@ -0,0 +1,15 @@
+_base_ = ['./base_static.py']
+codebase_config = dict(
+    type='mmyolo',
+    task='ObjectDetection',
+    model_type='end2end',
+    post_processing=dict(
+        score_threshold=0.05,
+        confidence_threshold=0.005,
+        iou_threshold=0.5,
+        max_output_boxes_per_class=200,
+        pre_top_k=5000,
+        keep_top_k=100,
+        background_label_id=-1),
+    module=['mmyolo.deploy'])
+backend_config = dict(type='onnxruntime')
diff --git a/mmdetection_practice/third_party/mmyolo/configs/deploy/detection_rknn-fp16_static-320x320.py b/mmdetection_practice/third_party/mmyolo/configs/deploy/detection_rknn-fp16_static-320x320.py
new file mode 100644
index 0000000..b7bd313
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/deploy/detection_rknn-fp16_static-320x320.py
@@ -0,0 +1,9 @@
+_base_ = ['./base_static.py']
+onnx_config = dict(
+    input_shape=[320, 320], output_names=['feat0', 'feat1', 'feat2'])
+codebase_config = dict(model_type='rknn')
+backend_config = dict(
+    type='rknn',
+    common_config=dict(target_platform='rv1126', optimization_level=1),
+    quantization_config=dict(do_quantization=False, dataset=None),
+    input_size_list=[[3, 320, 320]])
diff --git a/mmdetection_practice/third_party/mmyolo/configs/deploy/detection_rknn-int8_static-320x320.py b/mmdetection_practice/third_party/mmyolo/configs/deploy/detection_rknn-int8_static-320x320.py
new file mode 100644
index 0000000..10c96b2
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/deploy/detection_rknn-int8_static-320x320.py
@@ -0,0 +1,9 @@
+_base_ = ['./base_static.py']
+onnx_config = dict(
+    input_shape=[320, 320], output_names=['feat0', 'feat1', 'feat2'])
+codebase_config = dict(model_type='rknn')
+backend_config = dict(
+    type='rknn',
+    common_config=dict(target_platform='rv1126', optimization_level=1),
+    quantization_config=dict(do_quantization=True, dataset=None),
+    input_size_list=[[3, 320, 320]])
diff --git a/mmdetection_practice/third_party/mmyolo/configs/deploy/detection_tensorrt-fp16_dynamic-192x192-960x960.py b/mmdetection_practice/third_party/mmyolo/configs/deploy/detection_tensorrt-fp16_dynamic-192x192-960x960.py
new file mode 100644
index 0000000..da565b6
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/deploy/detection_tensorrt-fp16_dynamic-192x192-960x960.py
@@ -0,0 +1,13 @@
+_base_ = ['./base_dynamic.py']
+backend_config = dict(
+    type='tensorrt',
+    common_config=dict(fp16_mode=True, max_workspace_size=1 << 30),
+    model_inputs=[
+        dict(
+            input_shapes=dict(
+                input=dict(
+                    min_shape=[1, 3, 192, 192],
+                    opt_shape=[1, 3, 640, 640],
+                    max_shape=[1, 3, 960, 960])))
+    ])
+use_efficientnms = False  # whether to replace TRTBatchedNMS plugin with EfficientNMS plugin # noqa E501
diff --git a/mmdetection_practice/third_party/mmyolo/configs/deploy/detection_tensorrt-fp16_dynamic-64x64-1344x1344.py b/mmdetection_practice/third_party/mmyolo/configs/deploy/detection_tensorrt-fp16_dynamic-64x64-1344x1344.py
new file mode 100644
index 0000000..bad8521
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/deploy/detection_tensorrt-fp16_dynamic-64x64-1344x1344.py
@@ -0,0 +1,13 @@
+_base_ = ['./base_dynamic.py']
+backend_config = dict(
+    type='tensorrt',
+    common_config=dict(fp16_mode=True, max_workspace_size=1 << 32),
+    model_inputs=[
+        dict(
+            input_shapes=dict(
+                input=dict(
+                    min_shape=[1, 3, 64, 64],
+                    opt_shape=[1, 3, 640, 640],
+                    max_shape=[1, 3, 1344, 1344])))
+    ])
+use_efficientnms = False  # whether to replace TRTBatchedNMS plugin with EfficientNMS plugin # noqa E501
diff --git a/mmdetection_practice/third_party/mmyolo/configs/deploy/detection_tensorrt-fp16_static-640x640.py b/mmdetection_practice/third_party/mmyolo/configs/deploy/detection_tensorrt-fp16_static-640x640.py
new file mode 100644
index 0000000..24d2a00
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/deploy/detection_tensorrt-fp16_static-640x640.py
@@ -0,0 +1,14 @@
+_base_ = ['./base_static.py']
+onnx_config = dict(input_shape=(640, 640))
+backend_config = dict(
+    type='tensorrt',
+    common_config=dict(fp16_mode=True, max_workspace_size=1 << 30),
+    model_inputs=[
+        dict(
+            input_shapes=dict(
+                input=dict(
+                    min_shape=[1, 3, 640, 640],
+                    opt_shape=[1, 3, 640, 640],
+                    max_shape=[1, 3, 640, 640])))
+    ])
+use_efficientnms = False  # whether to replace TRTBatchedNMS plugin with EfficientNMS plugin # noqa E501
diff --git a/mmdetection_practice/third_party/mmyolo/configs/deploy/detection_tensorrt-int8_dynamic-192x192-960x960.py b/mmdetection_practice/third_party/mmyolo/configs/deploy/detection_tensorrt-int8_dynamic-192x192-960x960.py
new file mode 100644
index 0000000..21591c4
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/deploy/detection_tensorrt-int8_dynamic-192x192-960x960.py
@@ -0,0 +1,15 @@
+_base_ = ['./base_dynamic.py']
+backend_config = dict(
+    type='tensorrt',
+    common_config=dict(
+        fp16_mode=True, max_workspace_size=1 << 30, int8_mode=True),
+    model_inputs=[
+        dict(
+            input_shapes=dict(
+                input=dict(
+                    min_shape=[1, 3, 192, 192],
+                    opt_shape=[1, 3, 640, 640],
+                    max_shape=[1, 3, 960, 960])))
+    ])
+calib_config = dict(create_calib=True, calib_file='calib_data.h5')
+use_efficientnms = False  # whether to replace TRTBatchedNMS plugin with EfficientNMS plugin # noqa E501
diff --git a/mmdetection_practice/third_party/mmyolo/configs/deploy/detection_tensorrt-int8_static-640x640.py b/mmdetection_practice/third_party/mmyolo/configs/deploy/detection_tensorrt-int8_static-640x640.py
new file mode 100644
index 0000000..ac394a6
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/deploy/detection_tensorrt-int8_static-640x640.py
@@ -0,0 +1,16 @@
+_base_ = ['./base_static.py']
+onnx_config = dict(input_shape=(640, 640))
+backend_config = dict(
+    type='tensorrt',
+    common_config=dict(
+        fp16_mode=True, max_workspace_size=1 << 30, int8_mode=True),
+    model_inputs=[
+        dict(
+            input_shapes=dict(
+                input=dict(
+                    min_shape=[1, 3, 640, 640],
+                    opt_shape=[1, 3, 640, 640],
+                    max_shape=[1, 3, 640, 640])))
+    ])
+calib_config = dict(create_calib=True, calib_file='calib_data.h5')
+use_efficientnms = False  # whether to replace TRTBatchedNMS plugin with EfficientNMS plugin # noqa E501
diff --git a/mmdetection_practice/third_party/mmyolo/configs/deploy/detection_tensorrt_dynamic-192x192-960x960.py b/mmdetection_practice/third_party/mmyolo/configs/deploy/detection_tensorrt_dynamic-192x192-960x960.py
new file mode 100644
index 0000000..17047d7
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/deploy/detection_tensorrt_dynamic-192x192-960x960.py
@@ -0,0 +1,13 @@
+_base_ = ['./base_dynamic.py']
+backend_config = dict(
+    type='tensorrt',
+    common_config=dict(fp16_mode=False, max_workspace_size=1 << 30),
+    model_inputs=[
+        dict(
+            input_shapes=dict(
+                input=dict(
+                    min_shape=[1, 3, 192, 192],
+                    opt_shape=[1, 3, 640, 640],
+                    max_shape=[1, 3, 960, 960])))
+    ])
+use_efficientnms = False  # whether to replace TRTBatchedNMS plugin with EfficientNMS plugin # noqa E501
diff --git a/mmdetection_practice/third_party/mmyolo/configs/deploy/detection_tensorrt_static-640x640.py b/mmdetection_practice/third_party/mmyolo/configs/deploy/detection_tensorrt_static-640x640.py
new file mode 100644
index 0000000..9ec49cc
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/deploy/detection_tensorrt_static-640x640.py
@@ -0,0 +1,14 @@
+_base_ = ['./base_static.py']
+onnx_config = dict(input_shape=(640, 640))
+backend_config = dict(
+    type='tensorrt',
+    common_config=dict(fp16_mode=False, max_workspace_size=1 << 30),
+    model_inputs=[
+        dict(
+            input_shapes=dict(
+                input=dict(
+                    min_shape=[1, 3, 640, 640],
+                    opt_shape=[1, 3, 640, 640],
+                    max_shape=[1, 3, 640, 640])))
+    ])
+use_efficientnms = False  # whether to replace TRTBatchedNMS plugin with EfficientNMS plugin # noqa E501
diff --git a/mmdetection_practice/third_party/mmyolo/configs/deploy/model/yolov5_s-static.py b/mmdetection_practice/third_party/mmyolo/configs/deploy/model/yolov5_s-static.py
new file mode 100644
index 0000000..11b7f6a
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/deploy/model/yolov5_s-static.py
@@ -0,0 +1,19 @@
+_base_ = '../../yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py'
+
+test_pipeline = [
+    dict(type='LoadImageFromFile', backend_args=_base_.backend_args),
+    dict(
+        type='LetterResize',
+        scale=_base_.img_scale,
+        allow_scale_up=False,
+        use_mini_pad=False,
+    ),
+    dict(type='LoadAnnotations', with_bbox=True, _scope_='mmdet'),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                   'scale_factor', 'pad_param'))
+]
+
+test_dataloader = dict(
+    dataset=dict(pipeline=test_pipeline, batch_shapes_cfg=None))
diff --git a/mmdetection_practice/third_party/mmyolo/configs/deploy/model/yolov6_s-static.py b/mmdetection_practice/third_party/mmyolo/configs/deploy/model/yolov6_s-static.py
new file mode 100644
index 0000000..4f64438
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/deploy/model/yolov6_s-static.py
@@ -0,0 +1,19 @@
+_base_ = '../../yolov6/yolov6_s_syncbn_fast_8xb32-400e_coco.py'
+
+test_pipeline = [
+    dict(type='LoadImageFromFile', backend_args=_base_.backend_args),
+    dict(
+        type='LetterResize',
+        scale=_base_.img_scale,
+        allow_scale_up=False,
+        use_mini_pad=False,
+    ),
+    dict(type='LoadAnnotations', with_bbox=True, _scope_='mmdet'),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                   'scale_factor', 'pad_param'))
+]
+
+test_dataloader = dict(
+    dataset=dict(pipeline=test_pipeline, batch_shapes_cfg=None))
diff --git a/mmdetection_practice/third_party/mmyolo/configs/ppyoloe/README.md b/mmdetection_practice/third_party/mmyolo/configs/ppyoloe/README.md
new file mode 100644
index 0000000..70a5b20
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/ppyoloe/README.md
@@ -0,0 +1,43 @@
+# PPYOLOE
+
+<!-- [ALGORITHM] -->
+
+## Abstract
+
+PP-YOLOE is an excellent single-stage anchor-free model based on PP-YOLOv2, surpassing a variety of popular YOLO models. PP-YOLOE has a series of models, named s/m/l/x, which are configured through width multiplier and depth multiplier. PP-YOLOE avoids using special operators, such as Deformable Convolution or Matrix NMS, to be deployed friendly on various hardware.
+
+<div align=center>
+<img src="https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.5/docs/images/ppyoloe_plus_map_fps.png" width="600" />
+</div>
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/71306851/213100232-a2e278a6-0b97-4d21-9c1b-09eabb741b84.png"/>
+PPYOLOE-PLUS-l model structure
+</div>
+
+## Results and models
+
+### PPYOLOE+ COCO
+
+|  Backbone   | Arch | Size | Epoch | SyncBN | Mem (GB) | Box AP |                      Config                      |                                                                                                                                                      Download                                                                                                                                                      |
+| :---------: | :--: | :--: | :---: | :----: | :------: | :----: | :----------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: |
+| PPYOLOE+ -s |  P5  | 640  |  80   |  Yes   |   4.7    |  43.5  | [config](./ppyoloe_plus_s_fast_8xb8-80e_coco.py) | [model](https://download.openmmlab.com/mmyolo/v0/ppyoloe/ppyoloe_plus_s_fast_8xb8-80e_coco/ppyoloe_plus_s_fast_8xb8-80e_coco_20230101_154052-9fee7619.pth) \| [log](https://download.openmmlab.com/mmyolo/v0/ppyoloe/ppyoloe_plus_s_fast_8xb8-80e_coco/ppyoloe_plus_s_fast_8xb8-80e_coco_20230101_154052.log.json) |
+| PPYOLOE+ -m |  P5  | 640  |  80   |  Yes   |   8.4    |  49.5  | [config](./ppyoloe_plus_m_fast_8xb8-80e_coco.py) | [model](https://download.openmmlab.com/mmyolo/v0/ppyoloe/ppyoloe_plus_m_fast_8xb8-80e_coco/ppyoloe_plus_m_fast_8xb8-80e_coco_20230104_193132-e4325ada.pth) \| [log](https://download.openmmlab.com/mmyolo/v0/ppyoloe/ppyoloe_plus_m_fast_8xb8-80e_coco/ppyoloe_plus_m_fast_8xb8-80e_coco_20230104_193132.log.json) |
+| PPYOLOE+ -l |  P5  | 640  |  80   |  Yes   |   13.2   |  52.6  | [config](./ppyoloe_plus_l_fast_8xb8-80e_coco.py) | [model](https://download.openmmlab.com/mmyolo/v0/ppyoloe/ppyoloe_plus_l_fast_8xb8-80e_coco/ppyoloe_plus_l_fast_8xb8-80e_coco_20230102_203825-1864e7b3.pth) \| [log](https://download.openmmlab.com/mmyolo/v0/ppyoloe/ppyoloe_plus_l_fast_8xb8-80e_coco/ppyoloe_plus_l_fast_8xb8-80e_coco_20230102_203825.log.json) |
+| PPYOLOE+ -x |  P5  | 640  |  80   |  Yes   |   19.1   |  54.2  | [config](./ppyoloe_plus_x_fast_8xb8-80e_coco.py) | [model](https://download.openmmlab.com/mmyolo/v0/ppyoloe/ppyoloe_plus_x_fast_8xb8-80e_coco/ppyoloe_plus_x_fast_8xb8-80e_coco_20230104_194921-8c953949.pth) \| [log](https://download.openmmlab.com/mmyolo/v0/ppyoloe/ppyoloe_plus_x_fast_8xb8-80e_coco/ppyoloe_plus_x_fast_8xb8-80e_coco_20230104_194921.log.json) |
+
+**Note**:
+
+1. The above Box APs are all models with the best performance in COCO
+2. The gap between the above performance and the official release is about 0.3. To speed up training in mmyolo, we use pytorch to implement the image resizing in `PPYOLOEBatchRandomResize` for multi-scale training, while official PPYOLOE use opencv. And `lanczos4` is not yet supported in `PPYOLOEBatchRandomResize`. The above two reasons lead to the gap. We will continue to experiment and address the gap in future releases.
+3. The mAP of the non-Plus version needs more verification, and we will update more details of the non-Plus version in future versions.
+
+```latex
+@article{Xu2022PPYOLOEAE,
+  title={PP-YOLOE: An evolved version of YOLO},
+  author={Shangliang Xu and Xinxin Wang and Wenyu Lv and Qinyao Chang and Cheng Cui and Kaipeng Deng and Guanzhong Wang and Qingqing Dang and Shengyun Wei and Yuning Du and Baohua Lai},
+  journal={ArXiv},
+  year={2022},
+  volume={abs/2203.16250}
+}
+```
diff --git a/mmdetection_practice/third_party/mmyolo/configs/ppyoloe/metafile.yml b/mmdetection_practice/third_party/mmyolo/configs/ppyoloe/metafile.yml
new file mode 100644
index 0000000..5b7ed94
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/ppyoloe/metafile.yml
@@ -0,0 +1,69 @@
+Collections:
+  - Name: PPYOLOE
+    Metadata:
+      Training Data: COCO
+      Training Techniques:
+        - SGD with Nesterov
+        - Weight Decay
+        - Synchronize BN
+      Training Resources: 8x A100 GPUs
+      Architecture:
+        - PPYOLOECSPResNet
+        - PPYOLOECSPPAFPN
+    Paper:
+      URL: https://arxiv.org/abs/2203.16250
+      Title: 'PP-YOLOE: An evolved version of YOLO'
+    README: configs/ppyoloe/README.md
+    Code:
+      URL: https://github.com/open-mmlab/mmyolo/blob/v0.0.1/mmyolo/models/detectors/yolo_detector.py#L12
+      Version: v0.0.1
+
+Models:
+  - Name: ppyoloe_plus_s_fast_8xb8-80e_coco
+    In Collection: PPYOLOE
+    Config: configs/ppyoloe/ppyoloe_plus_s_fast_8xb8-80e_coco.py
+    Metadata:
+      Training Memory (GB): 4.7
+      Epochs: 80
+    Results:
+      - Task: Object Detection
+        Dataset: COCO
+        Metrics:
+          box AP: 43.5
+    Weights: https://download.openmmlab.com/mmyolo/v0/ppyoloe/ppyoloe_plus_s_fast_8xb8-80e_coco/ppyoloe_plus_s_fast_8xb8-80e_coco_20230101_154052-9fee7619.pth
+  - Name: ppyoloe_plus_m_fast_8xb8-80e_coco
+    In Collection: PPYOLOE
+    Config: configs/ppyoloe/ppyoloe_plus_m_fast_8xb8-80e_coco.py
+    Metadata:
+      Training Memory (GB): 8.4
+      Epochs: 80
+    Results:
+      - Task: Object Detection
+        Dataset: COCO
+        Metrics:
+          box AP: 49.5
+    Weights: https://download.openmmlab.com/mmyolo/v0/ppyoloe/ppyoloe_plus_m_fast_8xb8-80e_coco/ppyoloe_plus_m_fast_8xb8-80e_coco_20230104_193132-e4325ada.pth
+  - Name: ppyoloe_plus_L_fast_8xb8-80e_coco
+    In Collection: PPYOLOE
+    Config: configs/ppyoloe/ppyoloe_plus_L_fast_8xb8-80e_coco.py
+    Metadata:
+      Training Memory (GB): 13.2
+      Epochs: 80
+    Results:
+      - Task: Object Detection
+        Dataset: COCO
+        Metrics:
+          box AP: 52.6
+    Weights: https://download.openmmlab.com/mmyolo/v0/ppyoloe/ppyoloe_plus_l_fast_8xb8-80e_coco/ppyoloe_plus_l_fast_8xb8-80e_coco_20230102_203825-1864e7b3.pth
+  - Name: ppyoloe_plus_x_fast_8xb8-80e_coco
+    In Collection: PPYOLOE
+    Config: configs/ppyoloe/ppyoloe_plus_x_fast_8xb8-80e_coco.py
+    Metadata:
+      Training Memory (GB): 19.1
+      Epochs: 80
+    Results:
+      - Task: Object Detection
+        Dataset: COCO
+        Metrics:
+          box AP: 54.2
+    Weights: https://download.openmmlab.com/mmyolo/v0/ppyoloe/ppyoloe_plus_x_fast_8xb8-80e_coco/ppyoloe_plus_x_fast_8xb8-80e_coco_20230104_194921-8c953949.pth
diff --git a/mmdetection_practice/third_party/mmyolo/configs/ppyoloe/ppyoloe_l_fast_8xb20-300e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/ppyoloe/ppyoloe_l_fast_8xb20-300e_coco.py
new file mode 100644
index 0000000..ef1b4ea
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/ppyoloe/ppyoloe_l_fast_8xb20-300e_coco.py
@@ -0,0 +1,23 @@
+_base_ = './ppyoloe_s_fast_8xb32-300e_coco.py'
+
+# The pretrained model is geted and converted from official PPYOLOE.
+# https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.5/configs/ppyoloe/README.md
+checkpoint = 'https://download.openmmlab.com/mmyolo/v0/ppyoloe/ppyoloe_pretrain/cspresnet_l_imagenet1k_pretrained-c0010e6c.pth'  # noqa
+
+deepen_factor = 1.0
+widen_factor = 1.0
+
+train_batch_size_per_gpu = 20
+
+model = dict(
+    backbone=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+        init_cfg=dict(checkpoint=checkpoint)),
+    neck=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+    ),
+    bbox_head=dict(head_module=dict(widen_factor=widen_factor)))
+
+train_dataloader = dict(batch_size=train_batch_size_per_gpu)
diff --git a/mmdetection_practice/third_party/mmyolo/configs/ppyoloe/ppyoloe_m_fast_8xb28-300e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/ppyoloe/ppyoloe_m_fast_8xb28-300e_coco.py
new file mode 100644
index 0000000..abcfd78
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/ppyoloe/ppyoloe_m_fast_8xb28-300e_coco.py
@@ -0,0 +1,23 @@
+_base_ = './ppyoloe_s_fast_8xb32-300e_coco.py'
+
+# The pretrained model is geted and converted from official PPYOLOE.
+# https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.5/configs/ppyoloe/README.md
+checkpoint = 'https://download.openmmlab.com/mmyolo/v0/ppyoloe/ppyoloe_pretrain/cspresnet_m_imagenet1k_pretrained-09f1eba2.pth'  # noqa
+
+deepen_factor = 0.67
+widen_factor = 0.75
+
+train_batch_size_per_gpu = 28
+
+model = dict(
+    backbone=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+        init_cfg=dict(checkpoint=checkpoint)),
+    neck=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+    ),
+    bbox_head=dict(head_module=dict(widen_factor=widen_factor)))
+
+train_dataloader = dict(batch_size=train_batch_size_per_gpu)
diff --git a/mmdetection_practice/third_party/mmyolo/configs/ppyoloe/ppyoloe_plus_l_fast_8xb8-80e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/ppyoloe/ppyoloe_plus_l_fast_8xb8-80e_coco.py
new file mode 100644
index 0000000..9db53e2
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/ppyoloe/ppyoloe_plus_l_fast_8xb8-80e_coco.py
@@ -0,0 +1,16 @@
+_base_ = './ppyoloe_plus_s_fast_8xb8-80e_coco.py'
+
+# The pretrained model is geted and converted from official PPYOLOE.
+# https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.5/configs/ppyoloe/README.md
+load_from = 'https://download.openmmlab.com/mmyolo/v0/ppyoloe/ppyoloe_pretrain/ppyoloe_plus_l_obj365_pretrained-3dd89562.pth'  # noqa
+
+deepen_factor = 1.0
+widen_factor = 1.0
+
+model = dict(
+    backbone=dict(deepen_factor=deepen_factor, widen_factor=widen_factor),
+    neck=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+    ),
+    bbox_head=dict(head_module=dict(widen_factor=widen_factor)))
diff --git a/mmdetection_practice/third_party/mmyolo/configs/ppyoloe/ppyoloe_plus_m_fast_8xb8-80e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/ppyoloe/ppyoloe_plus_m_fast_8xb8-80e_coco.py
new file mode 100644
index 0000000..17cb335
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/ppyoloe/ppyoloe_plus_m_fast_8xb8-80e_coco.py
@@ -0,0 +1,16 @@
+_base_ = './ppyoloe_plus_s_fast_8xb8-80e_coco.py'
+
+# The pretrained model is geted and converted from official PPYOLOE.
+# https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.5/configs/ppyoloe/README.md
+load_from = 'https://download.openmmlab.com/mmyolo/v0/ppyoloe/ppyoloe_pretrain/ppyoloe_plus_m_ojb365_pretrained-03206892.pth'  # noqa
+
+deepen_factor = 0.67
+widen_factor = 0.75
+
+model = dict(
+    backbone=dict(deepen_factor=deepen_factor, widen_factor=widen_factor),
+    neck=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+    ),
+    bbox_head=dict(head_module=dict(widen_factor=widen_factor)))
diff --git a/mmdetection_practice/third_party/mmyolo/configs/ppyoloe/ppyoloe_plus_s_fast_1xb12-40e_cat.py b/mmdetection_practice/third_party/mmyolo/configs/ppyoloe/ppyoloe_plus_s_fast_1xb12-40e_cat.py
new file mode 100644
index 0000000..752ff63
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/ppyoloe/ppyoloe_plus_s_fast_1xb12-40e_cat.py
@@ -0,0 +1,56 @@
+# Compared to other same scale models, this configuration consumes too much
+# GPU memory and is not validated for now
+_base_ = 'ppyoloe_plus_s_fast_8xb8-80e_coco.py'
+
+data_root = './data/cat/'
+class_name = ('cat', )
+num_classes = len(class_name)
+metainfo = dict(classes=class_name, palette=[(20, 220, 60)])
+
+num_last_epochs = 5
+
+max_epochs = 40
+train_batch_size_per_gpu = 12
+train_num_workers = 2
+
+load_from = 'https://download.openmmlab.com/mmyolo/v0/ppyoloe/ppyoloe_plus_s_fast_8xb8-80e_coco/ppyoloe_plus_s_fast_8xb8-80e_coco_20230101_154052-9fee7619.pth'  # noqa
+
+model = dict(
+    backbone=dict(frozen_stages=4),
+    bbox_head=dict(head_module=dict(num_classes=num_classes)),
+    train_cfg=dict(
+        initial_assigner=dict(num_classes=num_classes),
+        assigner=dict(num_classes=num_classes)))
+
+train_dataloader = dict(
+    batch_size=train_batch_size_per_gpu,
+    num_workers=train_num_workers,
+    dataset=dict(
+        data_root=data_root,
+        metainfo=metainfo,
+        ann_file='annotations/trainval.json',
+        data_prefix=dict(img='images/')))
+
+val_dataloader = dict(
+    dataset=dict(
+        metainfo=metainfo,
+        data_root=data_root,
+        ann_file='annotations/test.json',
+        data_prefix=dict(img='images/')))
+
+test_dataloader = val_dataloader
+
+default_hooks = dict(
+    param_scheduler=dict(
+        warmup_min_iter=10,
+        warmup_epochs=3,
+        total_epochs=int(max_epochs * 1.2)))
+
+val_evaluator = dict(ann_file=data_root + 'annotations/test.json')
+test_evaluator = val_evaluator
+
+default_hooks = dict(
+    checkpoint=dict(interval=10, max_keep_ckpts=2, save_best='auto'),
+    logger=dict(type='LoggerHook', interval=5))
+train_cfg = dict(max_epochs=max_epochs, val_interval=10)
+# visualizer = dict(vis_backends = [dict(type='LocalVisBackend'), dict(type='WandbVisBackend')]) # noqa
diff --git a/mmdetection_practice/third_party/mmyolo/configs/ppyoloe/ppyoloe_plus_s_fast_8xb8-80e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/ppyoloe/ppyoloe_plus_s_fast_8xb8-80e_coco.py
new file mode 100644
index 0000000..3d98252
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/ppyoloe/ppyoloe_plus_s_fast_8xb8-80e_coco.py
@@ -0,0 +1,239 @@
+_base_ = ['../_base_/default_runtime.py', '../_base_/det_p5_tta.py']
+
+# dataset settings
+data_root = 'data/coco/'
+dataset_type = 'YOLOv5CocoDataset'
+
+# parameters that often need to be modified
+img_scale = (640, 640)  # width, height
+deepen_factor = 0.33
+widen_factor = 0.5
+max_epochs = 80
+num_classes = 80
+save_epoch_intervals = 5
+train_batch_size_per_gpu = 8
+train_num_workers = 8
+val_batch_size_per_gpu = 1
+val_num_workers = 2
+
+# The pretrained model is geted and converted from official PPYOLOE.
+# https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.5/configs/ppyoloe/README.md
+load_from = 'https://download.openmmlab.com/mmyolo/v0/ppyoloe/ppyoloe_pretrain/ppyoloe_plus_s_obj365_pretrained-bcfe8478.pth'  # noqa
+
+# persistent_workers must be False if num_workers is 0.
+persistent_workers = True
+
+# Base learning rate for optim_wrapper
+base_lr = 0.001
+
+strides = [8, 16, 32]
+
+model = dict(
+    type='YOLODetector',
+    data_preprocessor=dict(
+        # use this to support multi_scale training
+        type='PPYOLOEDetDataPreprocessor',
+        pad_size_divisor=32,
+        batch_augments=[
+            dict(
+                type='PPYOLOEBatchRandomResize',
+                random_size_range=(320, 800),
+                interval=1,
+                size_divisor=32,
+                random_interp=True,
+                keep_ratio=False)
+        ],
+        mean=[0., 0., 0.],
+        std=[255., 255., 255.],
+        bgr_to_rgb=True),
+    backbone=dict(
+        type='PPYOLOECSPResNet',
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+        block_cfg=dict(
+            type='PPYOLOEBasicBlock', shortcut=True, use_alpha=True),
+        norm_cfg=dict(type='BN', momentum=0.1, eps=1e-5),
+        act_cfg=dict(type='SiLU', inplace=True),
+        attention_cfg=dict(
+            type='EffectiveSELayer', act_cfg=dict(type='HSigmoid')),
+        use_large_stem=True),
+    neck=dict(
+        type='PPYOLOECSPPAFPN',
+        in_channels=[256, 512, 1024],
+        out_channels=[192, 384, 768],
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+        num_csplayer=1,
+        num_blocks_per_layer=3,
+        block_cfg=dict(
+            type='PPYOLOEBasicBlock', shortcut=False, use_alpha=False),
+        norm_cfg=dict(type='BN', momentum=0.1, eps=1e-5),
+        act_cfg=dict(type='SiLU', inplace=True),
+        drop_block_cfg=None,
+        use_spp=True),
+    bbox_head=dict(
+        type='PPYOLOEHead',
+        head_module=dict(
+            type='PPYOLOEHeadModule',
+            num_classes=num_classes,
+            in_channels=[192, 384, 768],
+            widen_factor=widen_factor,
+            featmap_strides=strides,
+            reg_max=16,
+            norm_cfg=dict(type='BN', momentum=0.1, eps=1e-5),
+            act_cfg=dict(type='SiLU', inplace=True),
+            num_base_priors=1),
+        prior_generator=dict(
+            type='mmdet.MlvlPointGenerator', offset=0.5, strides=strides),
+        bbox_coder=dict(type='DistancePointBBoxCoder'),
+        loss_cls=dict(
+            type='mmdet.VarifocalLoss',
+            use_sigmoid=True,
+            alpha=0.75,
+            gamma=2.0,
+            iou_weighted=True,
+            reduction='sum',
+            loss_weight=1.0),
+        loss_bbox=dict(
+            type='IoULoss',
+            iou_mode='giou',
+            bbox_format='xyxy',
+            reduction='mean',
+            loss_weight=2.5,
+            return_iou=False),
+        # Since the dflloss is implemented differently in the official
+        # and mmdet, we're going to divide loss_weight by 4.
+        loss_dfl=dict(
+            type='mmdet.DistributionFocalLoss',
+            reduction='mean',
+            loss_weight=0.5 / 4)),
+    train_cfg=dict(
+        initial_epoch=30,
+        initial_assigner=dict(
+            type='BatchATSSAssigner',
+            num_classes=num_classes,
+            topk=9,
+            iou_calculator=dict(type='mmdet.BboxOverlaps2D')),
+        assigner=dict(
+            type='BatchTaskAlignedAssigner',
+            num_classes=num_classes,
+            topk=13,
+            alpha=1,
+            beta=6,
+            eps=1e-9)),
+    test_cfg=dict(
+        multi_label=True,
+        nms_pre=1000,
+        score_thr=0.01,
+        nms=dict(type='nms', iou_threshold=0.7),
+        max_per_img=300))
+
+train_pipeline = [
+    dict(type='LoadImageFromFile', backend_args=_base_.backend_args),
+    dict(type='LoadAnnotations', with_bbox=True),
+    dict(type='PPYOLOERandomDistort'),
+    dict(type='mmdet.Expand', mean=(103.53, 116.28, 123.675)),
+    dict(type='PPYOLOERandomCrop'),
+    dict(type='mmdet.RandomFlip', prob=0.5),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                   'flip_direction'))
+]
+
+train_dataloader = dict(
+    batch_size=train_batch_size_per_gpu,
+    num_workers=train_num_workers,
+    persistent_workers=persistent_workers,
+    pin_memory=True,
+    sampler=dict(type='DefaultSampler', shuffle=True),
+    collate_fn=dict(type='yolov5_collate', use_ms_training=True),
+    dataset=dict(
+        type=dataset_type,
+        data_root=data_root,
+        ann_file='annotations/instances_train2017.json',
+        data_prefix=dict(img='train2017/'),
+        filter_cfg=dict(filter_empty_gt=True, min_size=0),
+        pipeline=train_pipeline))
+
+test_pipeline = [
+    dict(type='LoadImageFromFile', backend_args=_base_.backend_args),
+    dict(
+        type='mmdet.FixShapeResize',
+        width=img_scale[0],
+        height=img_scale[1],
+        keep_ratio=False,
+        interpolation='bicubic'),
+    dict(type='LoadAnnotations', with_bbox=True, _scope_='mmdet'),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                   'scale_factor'))
+]
+
+val_dataloader = dict(
+    batch_size=val_batch_size_per_gpu,
+    num_workers=val_num_workers,
+    persistent_workers=persistent_workers,
+    pin_memory=True,
+    drop_last=False,
+    sampler=dict(type='DefaultSampler', shuffle=False),
+    dataset=dict(
+        type=dataset_type,
+        data_root=data_root,
+        test_mode=True,
+        data_prefix=dict(img='val2017/'),
+        filter_cfg=dict(filter_empty_gt=True, min_size=0),
+        ann_file='annotations/instances_val2017.json',
+        pipeline=test_pipeline))
+
+test_dataloader = val_dataloader
+
+param_scheduler = None
+optim_wrapper = dict(
+    type='OptimWrapper',
+    optimizer=dict(
+        type='SGD',
+        lr=base_lr,
+        momentum=0.9,
+        weight_decay=5e-4,
+        nesterov=False),
+    paramwise_cfg=dict(norm_decay_mult=0.))
+
+default_hooks = dict(
+    param_scheduler=dict(
+        type='PPYOLOEParamSchedulerHook',
+        warmup_min_iter=1000,
+        start_factor=0.,
+        warmup_epochs=5,
+        min_lr_ratio=0.0,
+        total_epochs=int(max_epochs * 1.2)),
+    checkpoint=dict(
+        type='CheckpointHook',
+        interval=save_epoch_intervals,
+        save_best='auto',
+        max_keep_ckpts=3))
+
+custom_hooks = [
+    dict(
+        type='EMAHook',
+        ema_type='ExpMomentumEMA',
+        momentum=0.0002,
+        update_buffers=True,
+        strict_load=False,
+        priority=49)
+]
+
+val_evaluator = dict(
+    type='mmdet.CocoMetric',
+    proposal_nums=(100, 1, 10),
+    ann_file=data_root + 'annotations/instances_val2017.json',
+    metric='bbox')
+test_evaluator = val_evaluator
+
+train_cfg = dict(
+    type='EpochBasedTrainLoop',
+    max_epochs=max_epochs,
+    val_interval=save_epoch_intervals)
+val_cfg = dict(type='ValLoop')
+test_cfg = dict(type='TestLoop')
diff --git a/mmdetection_practice/third_party/mmyolo/configs/ppyoloe/ppyoloe_plus_x_fast_8xb8-80e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/ppyoloe/ppyoloe_plus_x_fast_8xb8-80e_coco.py
new file mode 100644
index 0000000..b8e6112
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/ppyoloe/ppyoloe_plus_x_fast_8xb8-80e_coco.py
@@ -0,0 +1,16 @@
+_base_ = './ppyoloe_plus_s_fast_8xb8-80e_coco.py'
+
+# The pretrained model is geted and converted from official PPYOLOE.
+# https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.5/configs/ppyoloe/README.md
+load_from = 'https://download.openmmlab.com/mmyolo/v0/ppyoloe/ppyoloe_pretrain/ppyoloe_plus_x_obj365_pretrained-43a8000d.pth'  # noqa
+
+deepen_factor = 1.33
+widen_factor = 1.25
+
+model = dict(
+    backbone=dict(deepen_factor=deepen_factor, widen_factor=widen_factor),
+    neck=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+    ),
+    bbox_head=dict(head_module=dict(widen_factor=widen_factor)))
diff --git a/mmdetection_practice/third_party/mmyolo/configs/ppyoloe/ppyoloe_s_fast_8xb32-300e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/ppyoloe/ppyoloe_s_fast_8xb32-300e_coco.py
new file mode 100644
index 0000000..6223328
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/ppyoloe/ppyoloe_s_fast_8xb32-300e_coco.py
@@ -0,0 +1,36 @@
+_base_ = './ppyoloe_plus_s_fast_8xb8-80e_coco.py'
+
+# The pretrained model is geted and converted from official PPYOLOE.
+# https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.5/configs/ppyoloe/README.md
+checkpoint = 'https://download.openmmlab.com/mmyolo/v0/ppyoloe/ppyoloe_pretrain/cspresnet_s_imagenet1k_pretrained-2be81763.pth'  # noqa
+
+train_batch_size_per_gpu = 32
+max_epochs = 300
+
+# Base learning rate for optim_wrapper
+base_lr = 0.01
+
+model = dict(
+    data_preprocessor=dict(
+        mean=[0.485 * 255, 0.456 * 255, 0.406 * 255],
+        std=[0.229 * 255., 0.224 * 255., 0.225 * 255.]),
+    backbone=dict(
+        block_cfg=dict(use_alpha=False),
+        init_cfg=dict(
+            type='Pretrained',
+            prefix='backbone.',
+            checkpoint=checkpoint,
+            map_location='cpu')),
+    train_cfg=dict(initial_epoch=100))
+
+train_dataloader = dict(batch_size=train_batch_size_per_gpu)
+
+optim_wrapper = dict(optimizer=dict(lr=base_lr))
+
+default_hooks = dict(param_scheduler=dict(total_epochs=int(max_epochs * 1.2)))
+
+train_cfg = dict(max_epochs=max_epochs)
+
+# PPYOLOE plus use obj365 pretrained model, but PPYOLOE not,
+# `load_from` need to set to None.
+load_from = None
diff --git a/mmdetection_practice/third_party/mmyolo/configs/ppyoloe/ppyoloe_s_fast_8xb32-400e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/ppyoloe/ppyoloe_s_fast_8xb32-400e_coco.py
new file mode 100644
index 0000000..bef9e91
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/ppyoloe/ppyoloe_s_fast_8xb32-400e_coco.py
@@ -0,0 +1,9 @@
+_base_ = './ppyoloe_s_fast_8xb32-300e_coco.py'
+
+max_epochs = 400
+
+model = dict(train_cfg=dict(initial_epoch=133))
+
+default_hooks = dict(param_scheduler=dict(total_epochs=int(max_epochs * 1.2)))
+
+train_cfg = dict(max_epochs=max_epochs)
diff --git a/mmdetection_practice/third_party/mmyolo/configs/ppyoloe/ppyoloe_x_fast_8xb16-300e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/ppyoloe/ppyoloe_x_fast_8xb16-300e_coco.py
new file mode 100644
index 0000000..fed594f
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/ppyoloe/ppyoloe_x_fast_8xb16-300e_coco.py
@@ -0,0 +1,23 @@
+_base_ = './ppyoloe_s_fast_8xb32-300e_coco.py'
+
+# The pretrained model is geted and converted from official PPYOLOE.
+# https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.5/configs/ppyoloe/README.md
+checkpoint = 'https://download.openmmlab.com/mmyolo/v0/ppyoloe/ppyoloe_pretrain/cspresnet_x_imagenet1k_pretrained-81c33ccb.pth'  # noqa
+
+deepen_factor = 1.33
+widen_factor = 1.25
+
+train_batch_size_per_gpu = 16
+
+model = dict(
+    backbone=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+        init_cfg=dict(checkpoint=checkpoint)),
+    neck=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+    ),
+    bbox_head=dict(head_module=dict(widen_factor=widen_factor)))
+
+train_dataloader = dict(batch_size=train_batch_size_per_gpu)
diff --git a/mmdetection_practice/third_party/mmyolo/configs/razor/subnets/README.md b/mmdetection_practice/third_party/mmyolo/configs/razor/subnets/README.md
new file mode 100644
index 0000000..456021b
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/razor/subnets/README.md
@@ -0,0 +1,79 @@
+# Projecs Based on MMRazor
+
+There are many research works and pre-trained models built on MMRazor. We list some of them as examples of how to use MMRazor slimmable models for downstream frameworks. As the page might not be completed, please feel free to contribute more efficient mmrazor-models to update this page.
+
+## Description
+
+This is an implementation of MMRazor Searchable Backbone Application, we provide detection configs and models for MMRazor in MMYOLO.
+
+### Backbone support
+
+Here are the Neural Architecture Search(NAS) Models that come from MMRazor which support YOLO Series. If you are looking for MMRazor models only for Backbone, you could refer to MMRazor [ModelZoo](https://github.com/open-mmlab/mmrazor/blob/dev-1.x/docs/en/get_started/model_zoo.md) and corresponding repository.
+
+- [x] [AttentiveMobileNetV3](https://github.com/open-mmlab/mmrazor/blob/dev-1.x/configs/_base_/nas_backbones/attentive_mobilenetv3_supernet.py)
+- [x] [SearchableShuffleNetV2](https://github.com/open-mmlab/mmrazor/blob/dev-1.x/configs/_base_/nas_backbones/spos_shufflenet_supernet.py)
+- [x] [SearchableMobileNetV2](https://github.com/open-mmlab/mmrazor/blob/dev-1.x/configs/_base_/nas_backbones/spos_mobilenet_supernet.py)
+
+## Usage
+
+### Prerequisites
+
+- [MMRazor v1.0.0rc2](https://github.com/open-mmlab/mmrazor/tree/v1.0.0rc2) or higher (dev-1.x)
+
+Install MMRazor using MIM.
+
+```shell
+mim install mmengine
+mim install "mmrazor>=1.0.0rc2"
+```
+
+Install MMRazor from source
+
+```
+git clone -b dev-1.x https://github.com/open-mmlab/mmrazor.git
+cd mmrazor
+# Install MMRazor
+mim install -v -e .
+```
+
+### Training commands
+
+In MMYOLO's root directory, if you want to use single GPU for training, run the following command to train the model:
+
+```bash
+CUDA_VISIBLE_DEVICES=0 PORT=29500 ./tools/dist_train.sh configs/razor/subnets/yolov5_s_spos_shufflenetv2_syncbn_8xb16-300e_coco.py
+```
+
+If you want to use several of these GPUs to train in parallel, you can use the following command:
+
+```bash
+CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 PORT=29500 ./tools/dist_train.sh configs/razor/subnets/yolov5_s_spos_shufflenetv2_syncbn_8xb16-300e_coco.py
+```
+
+### Testing commands
+
+In MMYOLO's root directory, run the following command to test the model:
+
+```bash
+CUDA_VISIBLE_DEVICES=0 PORT=29500 ./tools/dist_test.sh configs/razor/subnets/yolov5_s_spos_shufflenetv2_syncbn_8xb16-300e_coco.py ${CHECKPOINT_PATH}
+```
+
+## Results and Models
+
+Here we provide the baseline version of YOLO Series with NAS backbone.
+
+|           Model            | size | box AP |  Params(M)   | FLOPs(G) |                                 Config                                  |                                                                                                                                                                   Download                                                                                                                                                                   |
+| :------------------------: | :--: | :----: | :----------: | :------: | :---------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: |
+|          yolov5-s          | 640  |  37.7  |    7.235     |  8.265   |   [config](../../yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py)    | [model](https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth) \| [log](https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700.log.json) |
+| yolov5_s_spos_shufflenetv2 | 640  |  38.0  | 7.04(-2.7%)  |   7.03   |    [config](./yolov5_s_spos_shufflenetv2_syncbn_8xb16-300e_coco.py)     |                                                                                          [model](https://download.openmmlab.com/mmrazor/v1/yolo_nas_backbone/yolov5_s_spos_shufflenetv2_syncbn_8xb16-300e_coco_20230211_220635-578be9a9.pth) \| log                                                                                          |
+|          yolov6-s          | 640  |  44.0  |    18.869    |  24.253  |     [config](../../yolov6/yolov6_s_syncbn_fast_8xb32-400e_coco.py)      |         [model](https://download.openmmlab.com/mmyolo/v0/yolov6/yolov6_s_syncbn_fast_8xb32-400e_coco/yolov6_s_syncbn_fast_8xb32-400e_coco_20221102_203035-932e1d91.pth) \| [log](https://download.openmmlab.com/mmyolo/v0/yolov6/yolov6_s_syncbn_fast_8xb32-400e_coco/yolov6_s_syncbn_fast_8xb32-400e_coco_20221102_203035.log.json)         |
+|  yolov6_l_attentivenas_a6  | 640  |  45.3  | 18.38(-2.6%) |   8.49   | [config](./yolov6_l_attentivenas_a6_d12_syncbn_fast_8xb32-300e_coco.py) |                                                                                      [model](https://download.openmmlab.com/mmrazor/v1/yolo_nas_backbone/yolov6_l_attentivenas_a6_d12_syncbn_fast_8xb32-300e_coco_20230211_222409-dcc72668.pth) \| log                                                                                       |
+|        RTMDet-tiny         | 640  |  41.0  |     4.8      |   8.1    |     [config](../../rtmdet/rtmdet_l_syncbn_fast_8xb32-300e_coco.py)      |   [model](https://download.openmmlab.com/mmyolo/v0/rtmdet/rtmdet_tiny_syncbn_fast_8xb32-300e_coco/rtmdet_tiny_syncbn_fast_8xb32-300e_coco_20230102_140117-dbb1dc83.pth) \| [log](https://download.openmmlab.com/mmyolo/v0/rtmdet/rtmdet_tiny_syncbn_fast_8xb32-300e_coco/rtmdet_tiny_syncbn_fast_8xb32-300e_coco_20230102_140117.log.json)   |
+|   rtmdet_tiny_ofa_lat31    | 960  |  41.3  | 3.91(-18.5%) |   6.09   |      [config](./rtmdet_tiny_ofa_lat31_syncbn_16xb16-300e_coco.py)       |                                                                                            [model](https://download.openmmlab.com/mmrazor/v1/yolo_nas_backbone/rtmdet_tiny_ofa_lat31_syncbn_16xb16-300e_coco_20230214_210623-449bb2a0.pth) \| log                                                                                            |
+
+**Note**:
+
+1. For fair comparison, the training configuration is consistent with the original configuration and results in an improvement of about 0.2-0.5% AP.
+2. `yolov5_s_spos_shufflenetv2` achieves 38.0% AP with only 7.042M parameters, directly instead of the backbone, and outperforms `yolov5_s` with a similar size by more than 0.3% AP.
+3. With the efficient backbone of `yolov6_l_attentivenas_a6`, the input channels of `YOLOv6RepPAFPN` are reduced. Meanwhile, modify the **deepen_factor** and the neck is made deeper to restore the AP.
+4. with the `rtmdet_tiny_ofa_lat31` backbone with only 3.315M parameters and 3.634G flops, we can modify the input resolution to 960, with a similar model size compared to `rtmdet_tiny` and exceeds `rtmdet_tiny` by 0.4% AP, reducing the size of the whole model to 3.91 MB.
diff --git a/mmdetection_practice/third_party/mmyolo/configs/razor/subnets/rtmdet_tiny_ofa_lat31_syncbn_16xb16-300e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/razor/subnets/rtmdet_tiny_ofa_lat31_syncbn_16xb16-300e_coco.py
new file mode 100644
index 0000000..2f9da66
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/razor/subnets/rtmdet_tiny_ofa_lat31_syncbn_16xb16-300e_coco.py
@@ -0,0 +1,124 @@
+_base_ = [
+    'mmrazor::_base_/nas_backbones/ofa_mobilenetv3_supernet.py',
+    '../../rtmdet/rtmdet_s_syncbn_fast_8xb32-300e_coco.py'
+]
+
+checkpoint_file = 'https://download.openmmlab.com/mmrazor/v1/ofa/ofa_mobilenet_subnet_8xb256_in1k_note8_lat%4031ms_top1%4072.8_finetune%4025.py_20221214_0939-981a8b2a.pth'  # noqa
+fix_subnet = 'https://download.openmmlab.com/mmrazor/v1/yolo_nas_backbone/OFA_SUBNET_NOTE8_LAT31.yaml'  # noqa
+deepen_factor = 0.167
+widen_factor = 1.0
+channels = [40, 112, 160]
+train_batch_size_per_gpu = 16
+img_scale = (960, 960)
+
+_base_.nas_backbone.out_indices = (2, 4, 5)
+_base_.nas_backbone.conv_cfg = dict(type='mmrazor.OFAConv2d')
+_base_.nas_backbone.init_cfg = dict(
+    type='Pretrained',
+    checkpoint=checkpoint_file,
+    prefix='architecture.backbone.')
+nas_backbone = dict(
+    type='mmrazor.sub_model',
+    fix_subnet=fix_subnet,
+    cfg=_base_.nas_backbone,
+    extra_prefix='backbone.')
+
+_base_.model.backbone = nas_backbone
+_base_.model.neck.widen_factor = widen_factor
+_base_.model.neck.deepen_factor = deepen_factor
+_base_.model.neck.in_channels = channels
+_base_.model.neck.out_channels = channels[0]
+_base_.model.bbox_head.head_module.in_channels = channels[0]
+_base_.model.bbox_head.head_module.feat_channels = channels[0]
+_base_.model.bbox_head.head_module.widen_factor = widen_factor
+
+_base_.model.test_cfg = dict(
+    multi_label=True,
+    nms_pre=1000,
+    min_bbox_size=0,
+    score_thr=0.05,
+    nms=dict(type='nms', iou_threshold=0.6),
+    max_per_img=100)
+
+train_pipeline = [
+    dict(type='LoadImageFromFile', backend_args=_base_.backend_args),
+    dict(type='LoadAnnotations', with_bbox=True),
+    dict(
+        type='Mosaic',
+        img_scale=img_scale,
+        use_cached=True,
+        max_cached_images=20,
+        random_pop=False,
+        pad_val=114.0),
+    dict(
+        type='mmdet.RandomResize',
+        scale=(1280, 1280),
+        ratio_range=(0.5, 2.0),  # note
+        resize_type='mmdet.Resize',
+        keep_ratio=True),
+    dict(type='mmdet.RandomCrop', crop_size=img_scale),
+    dict(type='mmdet.YOLOXHSVRandomAug'),
+    dict(type='mmdet.RandomFlip', prob=0.5),
+    dict(type='mmdet.Pad', size=img_scale, pad_val=dict(img=(114, 114, 114))),
+    dict(
+        type='YOLOXMixUp',
+        img_scale=(960, 960),
+        ratio_range=(1.0, 1.0),
+        max_cached_images=10,
+        use_cached=True,
+        random_pop=False,
+        pad_val=(114, 114, 114),
+        prob=0.5),
+    dict(type='mmdet.PackDetInputs')
+]
+
+train_pipeline_stage2 = [
+    dict(type='LoadImageFromFile', backend_args=_base_.backend_args),
+    dict(type='LoadAnnotations', with_bbox=True),
+    dict(
+        type='mmdet.RandomResize',
+        scale=img_scale,
+        ratio_range=(0.5, 2.0),  # note
+        resize_type='mmdet.Resize',
+        keep_ratio=True),
+    dict(type='mmdet.RandomCrop', crop_size=img_scale),
+    dict(type='mmdet.YOLOXHSVRandomAug'),
+    dict(type='mmdet.RandomFlip', prob=0.5),
+    dict(type='mmdet.Pad', size=img_scale, pad_val=dict(img=(114, 114, 114))),
+    dict(type='mmdet.PackDetInputs')
+]
+
+train_dataloader = dict(
+    batch_size=train_batch_size_per_gpu, dataset=dict(pipeline=train_pipeline))
+
+test_pipeline = [
+    dict(type='LoadImageFromFile', backend_args=_base_.backend_args),
+    dict(type='mmdet.Resize', scale=(960, 960), keep_ratio=True),
+    dict(type='mmdet.Pad', size=(960, 960), pad_val=dict(img=(114, 114, 114))),
+    dict(type='LoadAnnotations', with_bbox=True, _scope_='mmdet'),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                   'scale_factor'))
+]
+
+val_dataloader = dict(
+    dataset=dict(pipeline=test_pipeline, batch_shapes_cfg=None))
+
+test_dataloader = val_dataloader
+
+custom_hooks = [
+    dict(
+        type='EMAHook',
+        ema_type='ExpMomentumEMA',
+        momentum=0.0002,
+        update_buffers=True,
+        strict_load=False,
+        priority=49),
+    dict(
+        type='mmdet.PipelineSwitchHook',
+        switch_epoch=_base_.max_epochs - _base_.num_epochs_stage2,
+        switch_pipeline=train_pipeline_stage2)
+]
+
+find_unused_parameters = True
diff --git a/mmdetection_practice/third_party/mmyolo/configs/razor/subnets/yolov5_s_spos_shufflenetv2_syncbn_8xb16-300e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/razor/subnets/yolov5_s_spos_shufflenetv2_syncbn_8xb16-300e_coco.py
new file mode 100644
index 0000000..beb4941
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/razor/subnets/yolov5_s_spos_shufflenetv2_syncbn_8xb16-300e_coco.py
@@ -0,0 +1,29 @@
+_base_ = [
+    'mmrazor::_base_/nas_backbones/spos_shufflenet_supernet.py',
+    '../../yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py'
+]
+
+checkpoint_file = 'https://download.openmmlab.com/mmrazor/v1/spos/spos_shufflenetv2_subnet_8xb128_in1k_flops_0.33M_acc_73.87_20211222-1f0a0b4d_v3.pth'  # noqa
+fix_subnet = 'https://download.openmmlab.com/mmrazor/v1/spos/spos_shufflenetv2_subnet_8xb128_in1k_flops_0.33M_acc_73.87_20211222-1f0a0b4d_subnet_cfg_v3.yaml'  # noqa
+widen_factor = 1.0
+channels = [160, 320, 640]
+
+_base_.nas_backbone.out_indices = (1, 2, 3)
+_base_.nas_backbone.init_cfg = dict(
+    type='Pretrained',
+    checkpoint=checkpoint_file,
+    prefix='architecture.backbone.')
+nas_backbone = dict(
+    type='mmrazor.sub_model',
+    fix_subnet=fix_subnet,
+    cfg=_base_.nas_backbone,
+    extra_prefix='architecture.backbone.')
+
+_base_.model.backbone = nas_backbone
+_base_.model.neck.widen_factor = widen_factor
+_base_.model.neck.in_channels = channels
+_base_.model.neck.out_channels = channels
+_base_.model.bbox_head.head_module.in_channels = channels
+_base_.model.bbox_head.head_module.widen_factor = widen_factor
+
+find_unused_parameters = True
diff --git a/mmdetection_practice/third_party/mmyolo/configs/razor/subnets/yolov6_l_attentivenas_a6_d12_syncbn_fast_8xb32-300e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/razor/subnets/yolov6_l_attentivenas_a6_d12_syncbn_fast_8xb32-300e_coco.py
new file mode 100644
index 0000000..0ab64a6
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/razor/subnets/yolov6_l_attentivenas_a6_d12_syncbn_fast_8xb32-300e_coco.py
@@ -0,0 +1,35 @@
+_base_ = [
+    'mmrazor::_base_/nas_backbones/attentive_mobilenetv3_supernet.py',
+    '../../yolov6/yolov6_l_syncbn_fast_8xb32-300e_coco.py'
+]
+
+checkpoint_file = 'https://download.openmmlab.com/mmrazor/v1/bignas/attentive_mobilenet_subnet_8xb256_in1k_flops-0.93G_acc-80.81_20221229_200440-73d92cc6.pth'  # noqa
+fix_subnet = 'https://download.openmmlab.com/mmrazor/v1/bignas/ATTENTIVE_SUBNET_A6.yaml'  # noqa
+deepen_factor = 1.2
+widen_factor = 1
+channels = [40, 128, 224]
+mid_channels = [40, 128, 224]
+
+_base_.train_dataloader.batch_size = 16
+_base_.nas_backbone.out_indices = (2, 4, 6)
+_base_.nas_backbone.conv_cfg = dict(type='mmrazor.BigNasConv2d')
+_base_.nas_backbone.norm_cfg = dict(type='mmrazor.DynamicBatchNorm2d')
+_base_.nas_backbone.init_cfg = dict(
+    type='Pretrained',
+    checkpoint=checkpoint_file,
+    prefix='architecture.backbone.')
+nas_backbone = dict(
+    type='mmrazor.sub_model',
+    fix_subnet=fix_subnet,
+    cfg=_base_.nas_backbone,
+    extra_prefix='backbone.')
+
+_base_.model.backbone = nas_backbone
+_base_.model.neck.widen_factor = widen_factor
+_base_.model.neck.deepen_factor = deepen_factor
+_base_.model.neck.in_channels = channels
+_base_.model.neck.out_channels = mid_channels
+_base_.model.bbox_head.head_module.in_channels = mid_channels
+_base_.model.bbox_head.head_module.widen_factor = widen_factor
+
+find_unused_parameters = True
diff --git a/mmdetection_practice/third_party/mmyolo/configs/rtmdet/README.md b/mmdetection_practice/third_party/mmyolo/configs/rtmdet/README.md
new file mode 100644
index 0000000..94e8654
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/rtmdet/README.md
@@ -0,0 +1,83 @@
+# RTMDet: An Empirical Study of Designing Real-Time Object Detectors
+
+[![PWC](https://img.shields.io/endpoint.svg?url=https://paperswithcode.com/badge/rtmdet-an-empirical-study-of-designing-real/real-time-instance-segmentation-on-mscoco)](https://paperswithcode.com/sota/real-time-instance-segmentation-on-mscoco?p=rtmdet-an-empirical-study-of-designing-real)
+[![PWC](https://img.shields.io/endpoint.svg?url=https://paperswithcode.com/badge/rtmdet-an-empirical-study-of-designing-real/object-detection-in-aerial-images-on-dota-1)](https://paperswithcode.com/sota/object-detection-in-aerial-images-on-dota-1?p=rtmdet-an-empirical-study-of-designing-real)
+[![PWC](https://img.shields.io/endpoint.svg?url=https://paperswithcode.com/badge/rtmdet-an-empirical-study-of-designing-real/object-detection-in-aerial-images-on-hrsc2016)](https://paperswithcode.com/sota/object-detection-in-aerial-images-on-hrsc2016?p=rtmdet-an-empirical-study-of-designing-real)
+
+<!-- [ALGORITHM] -->
+
+## Abstract
+
+In this paper, we aim to design an efficient real-time object detector that exceeds the YOLO series and is easily extensible for many object recognition tasks such as instance segmentation and rotated object detection. To obtain a more efficient model architecture, we explore an architecture that has compatible capacities in the backbone and neck, constructed by a basic building block that consists of large-kernel depth-wise convolutions. We further introduce soft labels when calculating matching costs in the dynamic label assignment to improve accuracy. Together with better training techniques, the resulting object detector, named RTMDet, achieves 52.8% AP on COCO with 300+ FPS on an NVIDIA 3090 GPU, outperforming the current mainstream industrial detectors. RTMDet achieves the best parameter-accuracy trade-off with tiny/small/medium/large/extra-large model sizes for various application scenarios, and obtains new state-of-the-art performance on real-time instance segmentation and rotated object detection. We hope the experimental results can provide new insights into designing versatile real-time object detectors for many object recognition tasks.
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/12907710/208070055-7233a3d8-955f-486a-82da-b714b3c3bbd6.png"/>
+</div>
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/27466624/204126145-cb4ff4f1-fb16-455e-96b5-17620081023a.jpg"/>
+RTMDet-l model structure
+</div>
+
+## Results and Models
+
+### Object Detection
+
+|     Model      | size | Params(M) | FLOPs(G) | TRT-FP16-Latency(ms) |   box AP    | TTA box AP  |                           Config                            |                                                                                                                                                                 Download                                                                                                                                                                  |
+| :------------: | :--: | :-------: | :------: | :------------------: | :---------: | :---------: | :---------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: |
+|  RTMDet-tiny   | 640  |    4.8    |   8.1    |         0.98         |    41.0     |    42.7     |   [config](./rtmdet_tiny_syncbn_fast_8xb32-300e_coco.py)    | [model](https://download.openmmlab.com/mmyolo/v0/rtmdet/rtmdet_tiny_syncbn_fast_8xb32-300e_coco/rtmdet_tiny_syncbn_fast_8xb32-300e_coco_20230102_140117-dbb1dc83.pth) \| [log](https://download.openmmlab.com/mmyolo/v0/rtmdet/rtmdet_tiny_syncbn_fast_8xb32-300e_coco/rtmdet_tiny_syncbn_fast_8xb32-300e_coco_20230102_140117.log.json)  |
+| RTMDet-tiny \* | 640  |    4.8    |   8.1    |         0.98         | 41.8 (+0.8) | 43.2 (+0.5) | [config](./distillation/kd_tiny_rtmdet_s_neck_300e_coco.py) | [model](https://download.openmmlab.com/mmrazor/v1/rtmdet_distillation/kd_tiny_rtmdet_s_neck_300e_coco/kd_tiny_rtmdet_s_neck_300e_coco_20230213_104240-e1e4197c.pth) \| [log](https://download.openmmlab.com/mmrazor/v1/rtmdet_distillation/kd_tiny_rtmdet_s_neck_300e_coco/kd_tiny_rtmdet_s_neck_300e_coco_20230213_104240-176901d8.json) |
+|    RTMDet-s    | 640  |   8.89    |   14.8   |         1.22         |    44.6     |    45.8     |     [config](./rtmdet_s_syncbn_fast_8xb32-300e_coco.py)     |       [model](https://download.openmmlab.com/mmyolo/v0/rtmdet/rtmdet_s_syncbn_fast_8xb32-300e_coco/rtmdet_s_syncbn_fast_8xb32-300e_coco_20221230_182329-0a8c901a.pth) \| [log](https://download.openmmlab.com/mmyolo/v0/rtmdet/rtmdet_s_syncbn_fast_8xb32-300e_coco/rtmdet_s_syncbn_fast_8xb32-300e_coco_20221230_182329.log.json)        |
+|  RTMDet-s \*   | 640  |   8.89    |   14.8   |         1.22         | 45.7 (+1.1) | 47.3 (+1.5) |  [config](./distillation/kd_s_rtmdet_m_neck_300e_coco.py)   |       [model](https://download.openmmlab.com/mmrazor/v1/rtmdet_distillation/kd_s_rtmdet_m_neck_300e_coco/kd_s_rtmdet_m_neck_300e_coco_20230220_140647-446ff003.pth) \| [log](https://download.openmmlab.com/mmrazor/v1/rtmdet_distillation/kd_s_rtmdet_m_neck_300e_coco/kd_s_rtmdet_m_neck_300e_coco_20230220_140647-89862269.json)       |
+|    RTMDet-m    | 640  |   24.71   |  39.27   |         1.62         |    49.3     |    50.9     |     [config](./rtmdet_m_syncbn_fast_8xb32-300e_coco.py)     |       [model](https://download.openmmlab.com/mmyolo/v0/rtmdet/rtmdet_m_syncbn_fast_8xb32-300e_coco/rtmdet_m_syncbn_fast_8xb32-300e_coco_20230102_135952-40af4fe8.pth) \| [log](https://download.openmmlab.com/mmyolo/v0/rtmdet/rtmdet_m_syncbn_fast_8xb32-300e_coco/rtmdet_m_syncbn_fast_8xb32-300e_coco_20230102_135952.log.json)        |
+|  RTMDet-m \*   | 640  |   24.71   |  39.27   |         1.62         | 50.2 (+0.9) | 51.9 (+1.0) |  [config](./distillation/kd_m_rtmdet_l_neck_300e_coco.py)   |       [model](https://download.openmmlab.com/mmrazor/v1/rtmdet_distillation/kd_m_rtmdet_l_neck_300e_coco/kd_m_rtmdet_l_neck_300e_coco_20230220_141313-b806f503.pth) \| [log](https://download.openmmlab.com/mmrazor/v1/rtmdet_distillation/kd_m_rtmdet_l_neck_300e_coco/kd_m_rtmdet_l_neck_300e_coco_20230220_141313-bd028fd3.json)       |
+|    RTMDet-l    | 640  |   52.3    |  80.23   |         2.44         |    51.4     |    53.1     |     [config](./rtmdet_l_syncbn_fast_8xb32-300e_coco.py)     |       [model](https://download.openmmlab.com/mmyolo/v0/rtmdet/rtmdet_l_syncbn_fast_8xb32-300e_coco/rtmdet_l_syncbn_fast_8xb32-300e_coco_20230102_135928-ee3abdc4.pth) \| [log](https://download.openmmlab.com/mmyolo/v0/rtmdet/rtmdet_l_syncbn_fast_8xb32-300e_coco/rtmdet_l_syncbn_fast_8xb32-300e_coco_20230102_135928.log.json)        |
+|  RTMDet-l \*   | 640  |   52.3    |  80.23   |         2.44         | 52.3 (+0.9) | 53.7 (+0.6) |  [config](./distillation/kd_l_rtmdet_x_neck_300e_coco.py)   |       [model](https://download.openmmlab.com/mmrazor/v1/rtmdet_distillation/kd_l_rtmdet_x_neck_300e_coco/kd_l_rtmdet_x_neck_300e_coco_20230220_141912-c9979722.pth) \| [log](https://download.openmmlab.com/mmrazor/v1/rtmdet_distillation/kd_l_rtmdet_x_neck_300e_coco/kd_l_rtmdet_x_neck_300e_coco_20230220_141912-c5c4e17b.json)       |
+|    RTMDet-x    | 640  |   94.86   |  141.67  |         3.10         |    52.8     |    54.2     |     [config](./rtmdet_x_syncbn_fast_8xb32-300e_coco.py)     |       [model](https://download.openmmlab.com/mmyolo/v0/rtmdet/rtmdet_x_syncbn_fast_8xb32-300e_coco/rtmdet_x_syncbn_fast_8xb32-300e_coco_20221231_100345-b85cd476.pth) \| [log](https://download.openmmlab.com/mmyolo/v0/rtmdet/rtmdet_x_syncbn_fast_8xb32-300e_coco/rtmdet_x_syncbn_fast_8xb32-300e_coco_20221231_100345.log.json)        |
+
+**Note**:
+
+1. The inference speed of RTMDet is measured on an NVIDIA 3090 GPU with TensorRT 8.4.3, cuDNN 8.2.0, FP16, batch size=1, and without NMS.
+2. For a fair comparison, the config of bbox postprocessing is changed to be consistent with YOLOv5/6/7 after [PR#9494](https://github.com/open-mmlab/mmdetection/pull/9494), bringing about 0.1~0.3% AP improvement.
+3. `TTA` means that Test Time Augmentation. It's perform 3 multi-scaling transformations on the image, followed by 2 flipping transformations (flipping and not flipping). You only need to specify `--tta` when testing to enable.  see [TTA](https://github.com/open-mmlab/mmyolo/blob/dev/docs/en/common_usage/tta.md) for details.
+4. \* means checkpoints are trained with knowledge distillation. More details can be found in [RTMDet distillation](./distillation).
+
+### Rotated Object Detection
+
+RTMDet-R achieves state-of-the-art on various remote sensing datasets.
+
+|  Backbone   | pretrain | Epoch | Batch Size |       Aug       | mmAP  | mAP50 | mAP75 | Mem (GB) | Params(M) | FLOPS(G) | TRT-FP16-Latency(ms) |                                    Config                                    |                                                                                                                                                                             Download                                                                                                                                                                             |
+| :---------: | :------: | :---: | :--------: | :-------------: | :---: | :---: | :---: | :------: | :-------: | :------: | :------------------: | :--------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: |
+| RTMDet-tiny |    IN    |  36   |    1xb8    |       RR        | 46.94 | 75.07 | 50.11 |   12.7   |   4.88    |  20.45   |         4.40         |           [config](./rotated/rtmdet-r_tiny_fast_1xb8-36e_dota.py)            |                   [model](https://download.openmmlab.com/mmyolo/v0/rtmdet/rotated/rtmdet-r_tiny_fast_1xb8-36e_dota/rtmdet-r_tiny_fast_1xb8-36e_dota_20230228_162210-e8ccfb1c.pth) \| [log](https://download.openmmlab.com/mmyolo/v0/rtmdet/rotated/rtmdet-r_tiny_fast_1xb8-36e_dota/rtmdet-r_tiny_fast_1xb8-36e_dota_20230228_162210.log.json)                   |
+|  RTMDet-s   |    IN    |  36   |    1xb8    |       RR        | 48.99 | 77.33 | 52.65 |   16.6   |   8.86    |  37.62   |         4.86         |             [config](./rotated/rtmdet-r_s_fast_1xb8-36e_dota.py)             |                         [model](https://download.openmmlab.com/mmyolo/v0/rtmdet/rotated/rtmdet-r_s_fast_1xb8-36e_dota/rtmdet-r_s_fast_1xb8-36e_dota_20230224_110307-3946a5aa.pth) \| [log](https://download.openmmlab.com/mmyolo/v0/rtmdet/rotated/rtmdet-r_s_fast_1xb8-36e_dota/rtmdet-r_s_fast_1xb8-36e_dota_20230224_110307.log.json)                         |
+|  RTMDet-m   |    IN    |  36   |    2xb4    |       RR        | 50.38 | 78.43 | 54.28 |   10.9   |   24.67   |  99.76   |         7.82         |         [config](./rotated/rtmdet-r_m_syncbn_fast_2xb4-36e_dota.py)          |           [model](https://download.openmmlab.com/mmyolo/v0/rtmdet/rotated/rtmdet-r_m_syncbn_fast_2xb4-36e_dota/rtmdet-r_m_syncbn_fast_2xb4-36e_dota_20230224_124237-29ae1619.pth) \| [log](https://download.openmmlab.com/mmyolo/v0/rtmdet/rotated/rtmdet-r_m_syncbn_fast_2xb4-36e_dota/rtmdet-r_m_syncbn_fast_2xb4-36e_dota_20230224_124237.log.json)           |
+|  RTMDet-l   |    IN    |  36   |    2xb4    |       RR        | 50.61 | 78.66 | 54.95 |   16.1   |   52.27   |  204.21  |        10.82         |         [config](./rotated/rtmdet-r_l_syncbn_fast_2xb4-36e_dota.py)          |           [model](https://download.openmmlab.com/mmyolo/v0/rtmdet/rotated/rtmdet-r_l_syncbn_fast_2xb4-36e_dota/rtmdet-r_l_syncbn_fast_2xb4-36e_dota_20230224_124544-38bc5f08.pth) \| [log](https://download.openmmlab.com/mmyolo/v0/rtmdet/rotated/rtmdet-r_l_syncbn_fast_2xb4-36e_dota/rtmdet-r_l_syncbn_fast_2xb4-36e_dota_20230224_124544.log.json)           |
+| RTMDet-tiny |    IN    |  36   |    1xb8    |      MS+RR      |   -   |   -   |   -   |          |   4.88    |  20.45   |         4.40         |          [config](./rotated/rtmdet-r_tiny_fast_1xb8-36e_dota-ms.py)          |                                                                                                                                                                                \|                                                                                                                                                                                |
+|  RTMDet-s   |    IN    |  36   |    1xb8    |      MS+RR      |   -   |   -   |   -   |          |   8.86    |  37.62   |         4.86         |           [config](./rotated/rtmdet-r_s_fast_1xb8-36e_dota-ms.py)            |                                                                                                                                                                                \|                                                                                                                                                                                |
+|  RTMDet-m   |    IN    |  36   |    2xb4    |      MS+RR      |   -   |   -   |   -   |          |   24.67   |  99.76   |         7.82         |        [config](./rotated/rtmdet-r_m_syncbn_fast_2xb4-36e_dota-ms.py)        |                                                                                                                                                                                \|                                                                                                                                                                                |
+|  RTMDet-l   |    IN    |  36   |    2xb4    |      MS+RR      |   -   |   -   |   -   |          |   52.27   |  204.21  |        10.82         |        [config](./rotated/rtmdet-r_l_syncbn_fast_2xb4-36e_dota-ms.py)        |                                                                                                                                                                                \|                                                                                                                                                                                |
+|  RTMDet-l   |   COCO   |  36   |    2xb4    |      MS+RR      |   -   |   -   |   -   |          |   52.27   |  204.21  |        10.82         | [config](./rotated/rtmdet-r_l_syncbn_fast_coco-pretrain_2xb4-36e_dota-ms.py) |                                                                                                                                                                                \|                                                                                                                                                                                |
+|  RTMDet-l   |    IN    |  100  |    2xb4    | Mixup+Mosaic+RR | 55.05 | 80.14 | 61.32 |   19.6   |   52.27   |  204.21  |        10.82         |       [config](./rotated/rtmdet-r_l_syncbn_fast_2xb4-aug-100e_dota.py)       | [model](https://download.openmmlab.com/mmyolo/v0/rtmdet/rotated/rtmdet-r_l_syncbn_fast_2xb4-aug-100e_dota/rtmdet-r_l_syncbn_fast_2xb4-aug-100e_dota_20230224_124735-ed4ea966.pth) \| [log](https://download.openmmlab.com/mmyolo/v0/rtmdet/rotated/rtmdet-r_l_syncbn_fast_2xb4-aug-100e_dota/rtmdet-r_l_syncbn_fast_2xb4-aug-100e_dota_20230224_124735.log.json) |
+
+**Note**:
+
+1. Please follow doc to get start with rotated detection. [Rotated Object Detection](../../docs/zh_cn/tutorials/rotated_detection.md)
+2. We follow the latest metrics from the DOTA evaluation server, original voc format mAP is now mAP50.
+3. All models trained with image size 1024\*1024.
+4. `IN` means ImageNet pretrain, `COCO` means COCO pretrain.
+5. For Aug, RR means `RandomRotate`, MS means multi-scale augmentation in data prepare.
+6. The inference speed here is measured on an NVIDIA 2080Ti GPU with TensorRT 8.4.3, cuDNN 8.2.0, FP16, batch size=1, and with NMS.
+7. Currently, the training process of RTMDet-R tiny is unstable and may have 1% accuracy fluctuation, we will continue to investigate why.
+
+## Citation
+
+```latex
+@misc{lyu2022rtmdet,
+      title={RTMDet: An Empirical Study of Designing Real-Time Object Detectors},
+      author={Chengqi Lyu and Wenwei Zhang and Haian Huang and Yue Zhou and Yudong Wang and Yanyi Liu and Shilong Zhang and Kai Chen},
+      year={2022},
+      eprint={2212.07784},
+      archivePrefix={arXiv},
+      primaryClass={cs.CV}
+}
+```
diff --git a/mmdetection_practice/third_party/mmyolo/configs/rtmdet/cspnext_imagenet_pretrain/README.md b/mmdetection_practice/third_party/mmyolo/configs/rtmdet/cspnext_imagenet_pretrain/README.md
new file mode 100644
index 0000000..2db5a50
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/rtmdet/cspnext_imagenet_pretrain/README.md
@@ -0,0 +1,53 @@
+# CSPNeXt ImageNet Pre-training
+
+In this folder, we provide the imagenet pre-training config of RTMDet's backbone CSPNeXt.
+
+## Requirements
+
+To train with these configs, please install [MMClassification 1.x](https://github.com/open-mmlab/mmclassification/tree/1.x) first.
+
+Install by MIM:
+
+```shell
+mim install mmcls>=1.0.0rc0
+```
+
+or install by pip:
+
+```shell
+pip install mmcls>=1.0.0rc0
+```
+
+## Prepare Dataset
+
+To pre-train on ImageNet, you need to prepare the dataset first. Please refer to the [guide](https://mmclassification.readthedocs.io/en/1.x/user_guides/dataset_prepare.html#imagenet).
+
+## How to Train
+
+You can use the classification config in the same way as the detection config.
+
+For single-GPU training, run:
+
+```shell
+python tools/train.py \
+    ${CONFIG_FILE} \
+    [optional arguments]
+```
+
+For multi-GPU training, run:
+
+```shell
+bash ./tools/dist_train.sh \
+    ${CONFIG_FILE} \
+    ${GPU_NUM} \
+    [optional arguments]
+```
+
+More details can be found in [user guides](https://mmdetection.readthedocs.io/en/3.x/user_guides/train.html).
+
+## Results and Models
+
+|    Model     | resolution | Params(M) | Flops(G) | Top-1 (%) | Top-5 (%) |                                                      Download                                                       |
+| :----------: | :--------: | :-------: | :------: | :-------: | :-------: | :-----------------------------------------------------------------------------------------------------------------: |
+| CSPNeXt-tiny |  224x224   |   2.73    |  0.339   |   69.44   |   89.45   | [model](https://download.openmmlab.com/mmdetection/v3.0/rtmdet/cspnext_rsb_pretrain/cspnext-tiny_imagenet_600e.pth) |
+|  CSPNeXt-s   |  224x224   |   4.89    |  0.664   |   74.41   |   92.23   |  [model](https://download.openmmlab.com/mmdetection/v3.0/rtmdet/cspnext_rsb_pretrain/cspnext-s_imagenet_600e.pth)   |
diff --git a/mmdetection_practice/third_party/mmyolo/configs/rtmdet/cspnext_imagenet_pretrain/cspnext-s_8xb256-rsb-a1-600e_in1k.py b/mmdetection_practice/third_party/mmyolo/configs/rtmdet/cspnext_imagenet_pretrain/cspnext-s_8xb256-rsb-a1-600e_in1k.py
new file mode 100644
index 0000000..4281f9c
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/rtmdet/cspnext_imagenet_pretrain/cspnext-s_8xb256-rsb-a1-600e_in1k.py
@@ -0,0 +1,67 @@
+_base_ = [
+    'mmcls::_base_/datasets/imagenet_bs256_rsb_a12.py',
+    'mmcls::_base_/schedules/imagenet_bs2048_rsb.py',
+    'mmcls::_base_/default_runtime.py'
+]
+
+custom_imports = dict(
+    imports=['mmdet.models', 'mmyolo.models'], allow_failed_imports=False)
+
+model = dict(
+    type='ImageClassifier',
+    backbone=dict(
+        type='mmyolo.CSPNeXt',
+        arch='P5',
+        out_indices=(4, ),
+        expand_ratio=0.5,
+        deepen_factor=0.33,
+        widen_factor=0.5,
+        channel_attention=True,
+        norm_cfg=dict(type='BN'),
+        act_cfg=dict(type='mmyolo.SiLU')),
+    neck=dict(type='GlobalAveragePooling'),
+    head=dict(
+        type='LinearClsHead',
+        num_classes=1000,
+        in_channels=512,
+        loss=dict(
+            type='LabelSmoothLoss',
+            label_smooth_val=0.1,
+            mode='original',
+            loss_weight=1.0),
+        topk=(1, 5)),
+    train_cfg=dict(augments=[
+        dict(type='Mixup', alpha=0.2, num_classes=1000),
+        dict(type='CutMix', alpha=1.0, num_classes=1000)
+    ]))
+
+# dataset settings
+train_dataloader = dict(sampler=dict(type='RepeatAugSampler', shuffle=True))
+
+# schedule settings
+optim_wrapper = dict(
+    optimizer=dict(weight_decay=0.01),
+    paramwise_cfg=dict(bias_decay_mult=0., norm_decay_mult=0.),
+)
+
+param_scheduler = [
+    # warm up learning rate scheduler
+    dict(
+        type='LinearLR',
+        start_factor=0.0001,
+        by_epoch=True,
+        begin=0,
+        end=5,
+        # update by iter
+        convert_to_iter_based=True),
+    # main learning rate scheduler
+    dict(
+        type='CosineAnnealingLR',
+        T_max=595,
+        eta_min=1.0e-6,
+        by_epoch=True,
+        begin=5,
+        end=600)
+]
+
+train_cfg = dict(by_epoch=True, max_epochs=600)
diff --git a/mmdetection_practice/third_party/mmyolo/configs/rtmdet/cspnext_imagenet_pretrain/cspnext-tiny_8xb256-rsb-a1-600e_in1k.py b/mmdetection_practice/third_party/mmyolo/configs/rtmdet/cspnext_imagenet_pretrain/cspnext-tiny_8xb256-rsb-a1-600e_in1k.py
new file mode 100644
index 0000000..af3170b
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/rtmdet/cspnext_imagenet_pretrain/cspnext-tiny_8xb256-rsb-a1-600e_in1k.py
@@ -0,0 +1,5 @@
+_base_ = './cspnext-s_8xb256-rsb-a1-600e_in1k.py'
+
+model = dict(
+    backbone=dict(deepen_factor=0.167, widen_factor=0.375),
+    head=dict(in_channels=384))
diff --git a/mmdetection_practice/third_party/mmyolo/configs/rtmdet/distillation/README.md b/mmdetection_practice/third_party/mmyolo/configs/rtmdet/distillation/README.md
new file mode 100644
index 0000000..452a46c
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/rtmdet/distillation/README.md
@@ -0,0 +1,146 @@
+# Distill RTM Detectors Based on MMRazor
+
+## Description
+
+To further improve the model accuracy while not introducing much additional
+computation cost, we apply the feature-based distillation to the training phase
+of these RTM detectors. In summary, our distillation strategy are threefold:
+
+(1) Inspired by [PKD](https://arxiv.org/abs/2207.02039), we first normalize
+the intermediate feature maps to have zero mean and unit variances before calculating
+the distillation loss.
+
+(2) Inspired by [CWD](https://arxiv.org/abs/2011.13256), we adopt the channel-wise
+distillation paradigm, which can pay more attention to the most salient regions
+of each channel.
+
+(3) Inspired by [DAMO-YOLO](https://arxiv.org/abs/2211.15444), the distillation
+process is split into two stages. 1) The teacher distills the student at the
+first stage (280 epochs) on strong mosaic domain. 2) The student finetunes itself
+on no masaic domain at the second stage (20 epochs).
+
+## Results and Models
+
+| Location | Dataset |                                                      Teacher                                                      |                                                         Student                                                         |     mAP     | mAP(T) | mAP(S) |                    Config                    | Download                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
+| :------: | :-----: | :---------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------: | :---------: | :----: | :----: | :------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+|   FPN    |  COCO   | [RTMDet-s](https://github.com/open-mmlab/mmyolo/blob/main/configs/rtmdet/rtmdet_s_syncbn_fast_8xb32-300e_coco.py) | [RTMDet-tiny](https://github.com/open-mmlab/mmyolo/blob/main/configs/rtmdet/rtmdet_tiny_syncbn_fast_8xb32-300e_coco.py) | 41.8 (+0.8) |  44.6  |  41.0  | [config](kd_tiny_rtmdet_s_neck_300e_coco.py) | [teacher](https://download.openmmlab.com/mmyolo/v0/rtmdet/rtmdet_s_syncbn_fast_8xb32-300e_coco/rtmdet_s_syncbn_fast_8xb32-300e_coco_20221230_182329-0a8c901a.pth) \|[model](https://download.openmmlab.com/mmrazor/v1/rtmdet_distillation/kd_tiny_rtmdet_s_neck_300e_coco/kd_tiny_rtmdet_s_neck_300e_coco_20230213_104240-e1e4197c.pth) \| [log](https://download.openmmlab.com/mmrazor/v1/rtmdet_distillation/kd_tiny_rtmdet_s_neck_300e_coco/kd_tiny_rtmdet_s_neck_300e_coco_20230213_104240-176901d8.json) |
+|   FPN    |  COCO   | [RTMDet-m](https://github.com/open-mmlab/mmyolo/blob/main/configs/rtmdet/rtmdet_m_syncbn_fast_8xb32-300e_coco.py) |    [RTMDet-s](https://github.com/open-mmlab/mmyolo/blob/main/configs/rtmdet/rtmdet_s_syncbn_fast_8xb32-300e_coco.py)    | 45.7 (+1.1) |  49.3  |  44.6  |  [config](kd_s_rtmdet_m_neck_300e_coco.py)   | [teacher](https://download.openmmlab.com/mmyolo/v0/rtmdet/rtmdet_m_syncbn_fast_8xb32-300e_coco/rtmdet_m_syncbn_fast_8xb32-300e_coco_20230102_135952-40af4fe8.pth)         \|[model](https://download.openmmlab.com/mmrazor/v1/rtmdet_distillation/kd_s_rtmdet_m_neck_300e_coco/kd_s_rtmdet_m_neck_300e_coco_20230220_140647-446ff003.pth) \| [log](https://download.openmmlab.com/mmrazor/v1/rtmdet_distillation/kd_s_rtmdet_m_neck_300e_coco/kd_s_rtmdet_m_neck_300e_coco_20230220_140647-89862269.json)     |
+|   FPN    |  COCO   | [RTMDet-l](https://github.com/open-mmlab/mmyolo/blob/main/configs/rtmdet/rtmdet_l_syncbn_fast_8xb32-300e_coco.py) |    [RTMDet-m](https://github.com/open-mmlab/mmyolo/blob/main/configs/rtmdet/rtmdet_m_syncbn_fast_8xb32-300e_coco.py)    | 50.2 (+0.9) |  51.4  |  49.3  |  [config](kd_m_rtmdet_l_neck_300e_coco.py)   | [teacher](https://download.openmmlab.com/mmyolo/v0/rtmdet/rtmdet_l_syncbn_fast_8xb32-300e_coco/rtmdet_l_syncbn_fast_8xb32-300e_coco_20230102_135928-ee3abdc4.pth) \|[model](https://download.openmmlab.com/mmrazor/v1/rtmdet_distillation/kd_m_rtmdet_l_neck_300e_coco/kd_m_rtmdet_l_neck_300e_coco_20230220_141313-b806f503.pth) \| [log](https://download.openmmlab.com/mmrazor/v1/rtmdet_distillation/kd_m_rtmdet_l_neck_300e_coco/kd_m_rtmdet_l_neck_300e_coco_20230220_141313-bd028fd3.json)             |
+|   FPN    |  COCO   | [RTMDet-x](https://github.com/open-mmlab/mmyolo/blob/main/configs/rtmdet/rtmdet_x_syncbn_fast_8xb32-300e_coco.py) |    [RTMDet-l](https://github.com/open-mmlab/mmyolo/blob/main/configs/rtmdet/rtmdet_l_syncbn_fast_8xb32-300e_coco.py)    | 52.3 (+0.9) |  52.8  |  51.4  |  [config](kd_l_rtmdet_x_neck_300e_coco.py)   | [teacher](https://download.openmmlab.com/mmyolo/v0/rtmdet/rtmdet_x_syncbn_fast_8xb32-300e_coco/rtmdet_x_syncbn_fast_8xb32-300e_coco_20221231_100345-b85cd476.pth) \|[model](https://download.openmmlab.com/mmrazor/v1/rtmdet_distillation/kd_l_rtmdet_x_neck_300e_coco/kd_l_rtmdet_x_neck_300e_coco_20230220_141912-c9979722.pth) \| [log](https://download.openmmlab.com/mmrazor/v1/rtmdet_distillation/kd_l_rtmdet_x_neck_300e_coco/kd_l_rtmdet_x_neck_300e_coco_20230220_141912-c5c4e17b.json)             |
+
+## Usage
+
+### Prerequisites
+
+- [MMRazor dev-1.x](https://github.com/open-mmlab/mmrazor/tree/dev-1.x)
+
+Install MMRazor from source
+
+```
+git clone -b dev-1.x https://github.com/open-mmlab/mmrazor.git
+cd mmrazor
+# Install MMRazor
+mim install -v -e .
+```
+
+### Training commands
+
+In MMYOLO's root directory, run the following command to train the RTMDet-tiny
+with 8 GPUs, using RTMDet-s as the teacher:
+
+```bash
+CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 PORT=29500 ./tools/dist_train.sh configs/rtmdet/distillation/kd_tiny_rtmdet_s_neck_300e_coco.py
+```
+
+### Testing commands
+
+In MMYOLO's root directory, run the following command to test the model:
+
+```bash
+CUDA_VISIBLE_DEVICES=0 PORT=29500 ./tools/dist_test.sh configs/rtmdet/distillation/kd_tiny_rtmdet_s_neck_300e_coco.py ${CHECKPOINT_PATH}
+```
+
+### Getting student-only checkpoint
+
+After training, the checkpoint contains parameters for both student and teacher models.
+Run the following command to convert it to student-only checkpoint:
+
+```bash
+python ./tools/model_converters/convert_kd_ckpt_to_student.py ${CHECKPOINT_PATH} --out-path ${OUTPUT_CHECKPOINT_PATH}
+```
+
+## Configs
+
+Here we provide detection configs and models for MMRazor in MMYOLO. For clarify,
+we take `./kd_tiny_rtmdet_s_neck_300e_coco.py` as an example to show how to
+distill a RTM detector based on MMRazor.
+
+Here is the main part of `./kd_tiny_rtmdet_s_neck_300e_coco.py`.
+
+```shell
+norm_cfg = dict(type='BN', affine=False, track_running_stats=False)
+
+distiller=dict(
+    type='ConfigurableDistiller',
+    student_recorders=dict(
+        fpn0=dict(type='ModuleOutputs', source='neck.out_layers.0.conv'),
+        fpn1=dict(type='ModuleOutputs', source='neck.out_layers.1.conv'),
+        fpn2=dict(type='ModuleOutputs', source='neck.out_layers.2.conv'),
+    ),
+    teacher_recorders=dict(
+        fpn0=dict(type='ModuleOutputs', source='neck.out_layers.0.conv'),
+        fpn1=dict(type='ModuleOutputs', source='neck.out_layers.1.conv'),
+        fpn2=dict(type='ModuleOutputs', source='neck.out_layers.2.conv')),
+    connectors=dict(
+        fpn0_s=dict(type='ConvModuleConnector', in_channel=96,
+            out_channel=128, bias=False, norm_cfg=norm_cfg,
+            act_cfg=None),
+        fpn0_t=dict(
+            type='NormConnector', in_channels=128, norm_cfg=norm_cfg),
+        fpn1_s=dict(
+            type='ConvModuleConnector', in_channel=96,
+            out_channel=128, bias=False, norm_cfg=norm_cfg,
+            act_cfg=None),
+        fpn1_t=dict(
+            type='NormConnector', in_channels=128, norm_cfg=norm_cfg),
+        fpn2_s=dict(
+            type='ConvModuleConnector', in_channel=96,
+            out_channel=128, bias=False, norm_cfg=norm_cfg,
+            act_cfg=None),
+        fpn2_t=dict(
+            type='NormConnector', in_channels=128, norm_cfg=norm_cfg)),
+    distill_losses=dict(
+        loss_fpn0=dict(type='ChannelWiseDivergence', loss_weight=1),
+        loss_fpn1=dict(type='ChannelWiseDivergence', loss_weight=1),
+        loss_fpn2=dict(type='ChannelWiseDivergence', loss_weight=1)),
+    loss_forward_mappings=dict(
+        loss_fpn0=dict(
+            preds_S=dict(from_student=True, recorder='fpn0', connector='fpn0_s'),
+            preds_T=dict(from_student=False, recorder='fpn0', connector='fpn0_t')),
+        loss_fpn1=dict(
+            preds_S=dict(from_student=True, recorder='fpn1', connector='fpn1_s'),
+            preds_T=dict(from_student=False, recorder='fpn1', connector='fpn1_t')),
+        loss_fpn2=dict(
+            preds_S=dict(from_student=True, recorder='fpn2', connector='fpn2_s'),
+            preds_T=dict(from_student=False, recorder='fpn2', connector='fpn2_t'))))
+
+```
+
+`recorders` are used to record various intermediate results during the model forward.
+In this example, they can help record the output of 3 `nn.Module` of the teacher
+and the student. Details are list in [Recorder](https://github.com/open-mmlab/mmrazor/blob/dev-1.x/docs/en/advanced_guides/recorder.md) and [MMRazor Distillation](https://zhuanlan.zhihu.com/p/596582609) (if users can read Chinese).
+
+`connectors` are adaptive layers which usually map teacher's and students features
+to the same dimension.
+
+`distill_losses` are configs for multiple distill losses.
+
+`loss_forward_mappings` are mappings between distill loss forward arguments and records.
+
+In addition, the student finetunes itself on no masaic domain at the last 20 epochs,
+so we add a new hook named `StopDistillHook` to stop distillation on time.
+We need to add this hook to the `custom_hooks` list like this:
+
+```shell
+custom_hooks = [..., dict(type='mmrazor.StopDistillHook', detach_epoch=280)]
+```
diff --git a/mmdetection_practice/third_party/mmyolo/configs/rtmdet/distillation/kd_l_rtmdet_x_neck_300e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/rtmdet/distillation/kd_l_rtmdet_x_neck_300e_coco.py
new file mode 100644
index 0000000..2bab26a
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/rtmdet/distillation/kd_l_rtmdet_x_neck_300e_coco.py
@@ -0,0 +1,99 @@
+_base_ = '../rtmdet_l_syncbn_fast_8xb32-300e_coco.py'
+
+teacher_ckpt = 'https://download.openmmlab.com/mmyolo/v0/rtmdet/rtmdet_x_syncbn_fast_8xb32-300e_coco/rtmdet_x_syncbn_fast_8xb32-300e_coco_20221231_100345-b85cd476.pth'  # noqa: E501
+
+norm_cfg = dict(type='BN', affine=False, track_running_stats=False)
+
+model = dict(
+    _delete_=True,
+    _scope_='mmrazor',
+    type='FpnTeacherDistill',
+    architecture=dict(
+        cfg_path='mmyolo::rtmdet/rtmdet_l_syncbn_fast_8xb32-300e_coco.py'),
+    teacher=dict(
+        cfg_path='mmyolo::rtmdet/rtmdet_x_syncbn_fast_8xb32-300e_coco.py'),
+    teacher_ckpt=teacher_ckpt,
+    distiller=dict(
+        type='ConfigurableDistiller',
+        # `recorders` are used to record various intermediate results during
+        # the model forward.
+        student_recorders=dict(
+            fpn0=dict(type='ModuleOutputs', source='neck.out_layers.0.conv'),
+            fpn1=dict(type='ModuleOutputs', source='neck.out_layers.1.conv'),
+            fpn2=dict(type='ModuleOutputs', source='neck.out_layers.2.conv'),
+        ),
+        teacher_recorders=dict(
+            fpn0=dict(type='ModuleOutputs', source='neck.out_layers.0.conv'),
+            fpn1=dict(type='ModuleOutputs', source='neck.out_layers.1.conv'),
+            fpn2=dict(type='ModuleOutputs', source='neck.out_layers.2.conv')),
+        # `connectors` are adaptive layers which usually map teacher's and
+        # students features to the same dimension.
+        connectors=dict(
+            fpn0_s=dict(
+                type='ConvModuleConnector',
+                in_channel=256,
+                out_channel=320,
+                bias=False,
+                norm_cfg=norm_cfg,
+                act_cfg=None),
+            fpn0_t=dict(
+                type='NormConnector', in_channels=320, norm_cfg=norm_cfg),
+            fpn1_s=dict(
+                type='ConvModuleConnector',
+                in_channel=256,
+                out_channel=320,
+                bias=False,
+                norm_cfg=norm_cfg,
+                act_cfg=None),
+            fpn1_t=dict(
+                type='NormConnector', in_channels=320, norm_cfg=norm_cfg),
+            fpn2_s=dict(
+                type='ConvModuleConnector',
+                in_channel=256,
+                out_channel=320,
+                bias=False,
+                norm_cfg=norm_cfg,
+                act_cfg=None),
+            fpn2_t=dict(
+                type='NormConnector', in_channels=320, norm_cfg=norm_cfg)),
+        distill_losses=dict(
+            loss_fpn0=dict(type='ChannelWiseDivergence', loss_weight=1),
+            loss_fpn1=dict(type='ChannelWiseDivergence', loss_weight=1),
+            loss_fpn2=dict(type='ChannelWiseDivergence', loss_weight=1)),
+        # `loss_forward_mappings` are mappings between distill loss forward
+        # arguments and records.
+        loss_forward_mappings=dict(
+            loss_fpn0=dict(
+                preds_S=dict(
+                    from_student=True, recorder='fpn0', connector='fpn0_s'),
+                preds_T=dict(
+                    from_student=False, recorder='fpn0', connector='fpn0_t')),
+            loss_fpn1=dict(
+                preds_S=dict(
+                    from_student=True, recorder='fpn1', connector='fpn1_s'),
+                preds_T=dict(
+                    from_student=False, recorder='fpn1', connector='fpn1_t')),
+            loss_fpn2=dict(
+                preds_S=dict(
+                    from_student=True, recorder='fpn2', connector='fpn2_s'),
+                preds_T=dict(
+                    from_student=False, recorder='fpn2',
+                    connector='fpn2_t')))))
+
+find_unused_parameters = True
+
+custom_hooks = [
+    dict(
+        type='EMAHook',
+        ema_type='ExpMomentumEMA',
+        momentum=0.0002,
+        update_buffers=True,
+        strict_load=False,
+        priority=49),
+    dict(
+        type='mmdet.PipelineSwitchHook',
+        switch_epoch=_base_.max_epochs - _base_.num_epochs_stage2,
+        switch_pipeline=_base_.train_pipeline_stage2),
+    # stop distillation after the 280th epoch
+    dict(type='mmrazor.StopDistillHook', stop_epoch=280)
+]
diff --git a/mmdetection_practice/third_party/mmyolo/configs/rtmdet/distillation/kd_m_rtmdet_l_neck_300e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/rtmdet/distillation/kd_m_rtmdet_l_neck_300e_coco.py
new file mode 100644
index 0000000..f7d7f92
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/rtmdet/distillation/kd_m_rtmdet_l_neck_300e_coco.py
@@ -0,0 +1,99 @@
+_base_ = '../rtmdet_m_syncbn_fast_8xb32-300e_coco.py'
+
+teacher_ckpt = 'https://download.openmmlab.com/mmyolo/v0/rtmdet/rtmdet_l_syncbn_fast_8xb32-300e_coco/rtmdet_l_syncbn_fast_8xb32-300e_coco_20230102_135928-ee3abdc4.pth'  # noqa: E501
+
+norm_cfg = dict(type='BN', affine=False, track_running_stats=False)
+
+model = dict(
+    _delete_=True,
+    _scope_='mmrazor',
+    type='FpnTeacherDistill',
+    architecture=dict(
+        cfg_path='mmyolo::rtmdet/rtmdet_m_syncbn_fast_8xb32-300e_coco.py'),
+    teacher=dict(
+        cfg_path='mmyolo::rtmdet/rtmdet_l_syncbn_fast_8xb32-300e_coco.py'),
+    teacher_ckpt=teacher_ckpt,
+    distiller=dict(
+        type='ConfigurableDistiller',
+        # `recorders` are used to record various intermediate results during
+        # the model forward.
+        student_recorders=dict(
+            fpn0=dict(type='ModuleOutputs', source='neck.out_layers.0.conv'),
+            fpn1=dict(type='ModuleOutputs', source='neck.out_layers.1.conv'),
+            fpn2=dict(type='ModuleOutputs', source='neck.out_layers.2.conv'),
+        ),
+        teacher_recorders=dict(
+            fpn0=dict(type='ModuleOutputs', source='neck.out_layers.0.conv'),
+            fpn1=dict(type='ModuleOutputs', source='neck.out_layers.1.conv'),
+            fpn2=dict(type='ModuleOutputs', source='neck.out_layers.2.conv')),
+        # `connectors` are adaptive layers which usually map teacher's and
+        # students features to the same dimension.
+        connectors=dict(
+            fpn0_s=dict(
+                type='ConvModuleConnector',
+                in_channel=192,
+                out_channel=256,
+                bias=False,
+                norm_cfg=norm_cfg,
+                act_cfg=None),
+            fpn0_t=dict(
+                type='NormConnector', in_channels=256, norm_cfg=norm_cfg),
+            fpn1_s=dict(
+                type='ConvModuleConnector',
+                in_channel=192,
+                out_channel=256,
+                bias=False,
+                norm_cfg=norm_cfg,
+                act_cfg=None),
+            fpn1_t=dict(
+                type='NormConnector', in_channels=256, norm_cfg=norm_cfg),
+            fpn2_s=dict(
+                type='ConvModuleConnector',
+                in_channel=192,
+                out_channel=256,
+                bias=False,
+                norm_cfg=norm_cfg,
+                act_cfg=None),
+            fpn2_t=dict(
+                type='NormConnector', in_channels=256, norm_cfg=norm_cfg)),
+        distill_losses=dict(
+            loss_fpn0=dict(type='ChannelWiseDivergence', loss_weight=1),
+            loss_fpn1=dict(type='ChannelWiseDivergence', loss_weight=1),
+            loss_fpn2=dict(type='ChannelWiseDivergence', loss_weight=1)),
+        # `loss_forward_mappings` are mappings between distill loss forward
+        # arguments and records.
+        loss_forward_mappings=dict(
+            loss_fpn0=dict(
+                preds_S=dict(
+                    from_student=True, recorder='fpn0', connector='fpn0_s'),
+                preds_T=dict(
+                    from_student=False, recorder='fpn0', connector='fpn0_t')),
+            loss_fpn1=dict(
+                preds_S=dict(
+                    from_student=True, recorder='fpn1', connector='fpn1_s'),
+                preds_T=dict(
+                    from_student=False, recorder='fpn1', connector='fpn1_t')),
+            loss_fpn2=dict(
+                preds_S=dict(
+                    from_student=True, recorder='fpn2', connector='fpn2_s'),
+                preds_T=dict(
+                    from_student=False, recorder='fpn2',
+                    connector='fpn2_t')))))
+
+find_unused_parameters = True
+
+custom_hooks = [
+    dict(
+        type='EMAHook',
+        ema_type='ExpMomentumEMA',
+        momentum=0.0002,
+        update_buffers=True,
+        strict_load=False,
+        priority=49),
+    dict(
+        type='mmdet.PipelineSwitchHook',
+        switch_epoch=_base_.max_epochs - _base_.num_epochs_stage2,
+        switch_pipeline=_base_.train_pipeline_stage2),
+    # stop distillation after the 280th epoch
+    dict(type='mmrazor.StopDistillHook', stop_epoch=280)
+]
diff --git a/mmdetection_practice/third_party/mmyolo/configs/rtmdet/distillation/kd_s_rtmdet_m_neck_300e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/rtmdet/distillation/kd_s_rtmdet_m_neck_300e_coco.py
new file mode 100644
index 0000000..99b5dc5
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/rtmdet/distillation/kd_s_rtmdet_m_neck_300e_coco.py
@@ -0,0 +1,99 @@
+_base_ = '../rtmdet_s_syncbn_fast_8xb32-300e_coco.py'
+
+teacher_ckpt = 'https://download.openmmlab.com/mmyolo/v0/rtmdet/rtmdet_m_syncbn_fast_8xb32-300e_coco/rtmdet_m_syncbn_fast_8xb32-300e_coco_20230102_135952-40af4fe8.pth'  # noqa: E501
+
+norm_cfg = dict(type='BN', affine=False, track_running_stats=False)
+
+model = dict(
+    _delete_=True,
+    _scope_='mmrazor',
+    type='FpnTeacherDistill',
+    architecture=dict(
+        cfg_path='mmyolo::rtmdet/rtmdet_s_syncbn_fast_8xb32-300e_coco.py'),
+    teacher=dict(
+        cfg_path='mmyolo::rtmdet/rtmdet_m_syncbn_fast_8xb32-300e_coco.py'),
+    teacher_ckpt=teacher_ckpt,
+    distiller=dict(
+        type='ConfigurableDistiller',
+        # `recorders` are used to record various intermediate results during
+        # the model forward.
+        student_recorders=dict(
+            fpn0=dict(type='ModuleOutputs', source='neck.out_layers.0.conv'),
+            fpn1=dict(type='ModuleOutputs', source='neck.out_layers.1.conv'),
+            fpn2=dict(type='ModuleOutputs', source='neck.out_layers.2.conv'),
+        ),
+        teacher_recorders=dict(
+            fpn0=dict(type='ModuleOutputs', source='neck.out_layers.0.conv'),
+            fpn1=dict(type='ModuleOutputs', source='neck.out_layers.1.conv'),
+            fpn2=dict(type='ModuleOutputs', source='neck.out_layers.2.conv')),
+        # `connectors` are adaptive layers which usually map teacher's and
+        # students features to the same dimension.
+        connectors=dict(
+            fpn0_s=dict(
+                type='ConvModuleConnector',
+                in_channel=128,
+                out_channel=192,
+                bias=False,
+                norm_cfg=norm_cfg,
+                act_cfg=None),
+            fpn0_t=dict(
+                type='NormConnector', in_channels=192, norm_cfg=norm_cfg),
+            fpn1_s=dict(
+                type='ConvModuleConnector',
+                in_channel=128,
+                out_channel=192,
+                bias=False,
+                norm_cfg=norm_cfg,
+                act_cfg=None),
+            fpn1_t=dict(
+                type='NormConnector', in_channels=192, norm_cfg=norm_cfg),
+            fpn2_s=dict(
+                type='ConvModuleConnector',
+                in_channel=128,
+                out_channel=192,
+                bias=False,
+                norm_cfg=norm_cfg,
+                act_cfg=None),
+            fpn2_t=dict(
+                type='NormConnector', in_channels=192, norm_cfg=norm_cfg)),
+        distill_losses=dict(
+            loss_fpn0=dict(type='ChannelWiseDivergence', loss_weight=1),
+            loss_fpn1=dict(type='ChannelWiseDivergence', loss_weight=1),
+            loss_fpn2=dict(type='ChannelWiseDivergence', loss_weight=1)),
+        # `loss_forward_mappings` are mappings between distill loss forward
+        # arguments and records.
+        loss_forward_mappings=dict(
+            loss_fpn0=dict(
+                preds_S=dict(
+                    from_student=True, recorder='fpn0', connector='fpn0_s'),
+                preds_T=dict(
+                    from_student=False, recorder='fpn0', connector='fpn0_t')),
+            loss_fpn1=dict(
+                preds_S=dict(
+                    from_student=True, recorder='fpn1', connector='fpn1_s'),
+                preds_T=dict(
+                    from_student=False, recorder='fpn1', connector='fpn1_t')),
+            loss_fpn2=dict(
+                preds_S=dict(
+                    from_student=True, recorder='fpn2', connector='fpn2_s'),
+                preds_T=dict(
+                    from_student=False, recorder='fpn2',
+                    connector='fpn2_t')))))
+
+find_unused_parameters = True
+
+custom_hooks = [
+    dict(
+        type='EMAHook',
+        ema_type='ExpMomentumEMA',
+        momentum=0.0002,
+        update_buffers=True,
+        strict_load=False,
+        priority=49),
+    dict(
+        type='mmdet.PipelineSwitchHook',
+        switch_epoch=_base_.max_epochs - _base_.num_epochs_stage2,
+        switch_pipeline=_base_.train_pipeline_stage2),
+    # stop distillation after the 280th epoch
+    dict(type='mmrazor.StopDistillHook', stop_epoch=280)
+]
diff --git a/mmdetection_practice/third_party/mmyolo/configs/rtmdet/distillation/kd_tiny_rtmdet_s_neck_300e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/rtmdet/distillation/kd_tiny_rtmdet_s_neck_300e_coco.py
new file mode 100644
index 0000000..50c2358
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/rtmdet/distillation/kd_tiny_rtmdet_s_neck_300e_coco.py
@@ -0,0 +1,99 @@
+_base_ = '../rtmdet_tiny_syncbn_fast_8xb32-300e_coco.py'
+
+teacher_ckpt = 'https://download.openmmlab.com/mmyolo/v0/rtmdet/rtmdet_s_syncbn_fast_8xb32-300e_coco/rtmdet_s_syncbn_fast_8xb32-300e_coco_20221230_182329-0a8c901a.pth'  # noqa: E501
+
+norm_cfg = dict(type='BN', affine=False, track_running_stats=False)
+
+model = dict(
+    _delete_=True,
+    _scope_='mmrazor',
+    type='FpnTeacherDistill',
+    architecture=dict(
+        cfg_path='mmyolo::rtmdet/rtmdet_tiny_syncbn_fast_8xb32-300e_coco.py'),
+    teacher=dict(
+        cfg_path='mmyolo::rtmdet/rtmdet_s_syncbn_fast_8xb32-300e_coco.py'),
+    teacher_ckpt=teacher_ckpt,
+    distiller=dict(
+        type='ConfigurableDistiller',
+        # `recorders` are used to record various intermediate results during
+        # the model forward.
+        student_recorders=dict(
+            fpn0=dict(type='ModuleOutputs', source='neck.out_layers.0.conv'),
+            fpn1=dict(type='ModuleOutputs', source='neck.out_layers.1.conv'),
+            fpn2=dict(type='ModuleOutputs', source='neck.out_layers.2.conv'),
+        ),
+        teacher_recorders=dict(
+            fpn0=dict(type='ModuleOutputs', source='neck.out_layers.0.conv'),
+            fpn1=dict(type='ModuleOutputs', source='neck.out_layers.1.conv'),
+            fpn2=dict(type='ModuleOutputs', source='neck.out_layers.2.conv')),
+        # `connectors` are adaptive layers which usually map teacher's and
+        # students features to the same dimension.
+        connectors=dict(
+            fpn0_s=dict(
+                type='ConvModuleConnector',
+                in_channel=96,
+                out_channel=128,
+                bias=False,
+                norm_cfg=norm_cfg,
+                act_cfg=None),
+            fpn0_t=dict(
+                type='NormConnector', in_channels=128, norm_cfg=norm_cfg),
+            fpn1_s=dict(
+                type='ConvModuleConnector',
+                in_channel=96,
+                out_channel=128,
+                bias=False,
+                norm_cfg=norm_cfg,
+                act_cfg=None),
+            fpn1_t=dict(
+                type='NormConnector', in_channels=128, norm_cfg=norm_cfg),
+            fpn2_s=dict(
+                type='ConvModuleConnector',
+                in_channel=96,
+                out_channel=128,
+                bias=False,
+                norm_cfg=norm_cfg,
+                act_cfg=None),
+            fpn2_t=dict(
+                type='NormConnector', in_channels=128, norm_cfg=norm_cfg)),
+        distill_losses=dict(
+            loss_fpn0=dict(type='ChannelWiseDivergence', loss_weight=1),
+            loss_fpn1=dict(type='ChannelWiseDivergence', loss_weight=1),
+            loss_fpn2=dict(type='ChannelWiseDivergence', loss_weight=1)),
+        # `loss_forward_mappings` are mappings between distill loss forward
+        # arguments and records.
+        loss_forward_mappings=dict(
+            loss_fpn0=dict(
+                preds_S=dict(
+                    from_student=True, recorder='fpn0', connector='fpn0_s'),
+                preds_T=dict(
+                    from_student=False, recorder='fpn0', connector='fpn0_t')),
+            loss_fpn1=dict(
+                preds_S=dict(
+                    from_student=True, recorder='fpn1', connector='fpn1_s'),
+                preds_T=dict(
+                    from_student=False, recorder='fpn1', connector='fpn1_t')),
+            loss_fpn2=dict(
+                preds_S=dict(
+                    from_student=True, recorder='fpn2', connector='fpn2_s'),
+                preds_T=dict(
+                    from_student=False, recorder='fpn2',
+                    connector='fpn2_t')))))
+
+find_unused_parameters = True
+
+custom_hooks = [
+    dict(
+        type='EMAHook',
+        ema_type='ExpMomentumEMA',
+        momentum=0.0002,
+        update_buffers=True,
+        strict_load=False,
+        priority=49),
+    dict(
+        type='mmdet.PipelineSwitchHook',
+        switch_epoch=_base_.max_epochs - _base_.num_epochs_stage2,
+        switch_pipeline=_base_.train_pipeline_stage2),
+    # stop distillation after the 280th epoch
+    dict(type='mmrazor.StopDistillHook', stop_epoch=280)
+]
diff --git a/mmdetection_practice/third_party/mmyolo/configs/rtmdet/metafile.yml b/mmdetection_practice/third_party/mmyolo/configs/rtmdet/metafile.yml
new file mode 100644
index 0000000..704a44b
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/rtmdet/metafile.yml
@@ -0,0 +1,215 @@
+Collections:
+  - Name: RTMDet
+    Metadata:
+      Training Data: COCO
+      Training Techniques:
+        - AdamW
+        - Flat Cosine Annealing
+      Training Resources: 8x A100 GPUs
+      Architecture:
+        - CSPNeXt
+        - CSPNeXtPAFPN
+    README: configs/rtmdet/README.md
+    Code:
+      URL: https://github.com/open-mmlab/mmyolo/blob/main/mmyolo/models/detectors/yolo_detector.py#L12
+      Version: v0.1.1
+  - Name: Rotated_RTMDet
+    Metadata:
+      Training Data: DOTAv1.0
+      Training Techniques:
+        - AdamW
+        - Flat Cosine Annealing
+      Training Resources: 1x A100 GPUs
+      Architecture:
+        - CSPNeXt
+        - CSPNeXtPAFPN
+    README: configs/rtmdet/README.md
+    Code:
+      URL: https://github.com/open-mmlab/mmyolo/blob/main/mmyolo/models/detectors/yolo_detector.py#L12
+      Version: v0.1.1
+
+Models:
+  - Name: rtmdet_tiny_syncbn_fast_8xb32-300e_coco
+    In Collection: RTMDet
+    Config: configs/rtmdet/rtmdet_tiny_syncbn_fast_8xb32-300e_coco.py
+    Metadata:
+      Training Memory (GB): 11.7
+      Epochs: 300
+    Results:
+      - Task: Object Detection
+        Dataset: COCO
+        Metrics:
+          box AP: 41.0
+    Weights: https://download.openmmlab.com/mmyolo/v0/rtmdet/rtmdet_tiny_syncbn_fast_8xb32-300e_coco/rtmdet_tiny_syncbn_fast_8xb32-300e_coco_20230102_140117-dbb1dc83.pth
+
+  - Name: kd_tiny_rtmdet_s_neck_300e_coco
+    In Collection: RTMDet
+    Config: configs/rtmdet/distillation/kd_tiny_rtmdet_s_neck_300e_coco.py
+    Metadata:
+      Training Memory (GB): 11.9
+      Epochs: 300
+    Results:
+      - Task: Object Detection
+        Dataset: COCO
+        Metrics:
+          box AP: 41.8
+    Weights: https://download.openmmlab.com/mmrazor/v1/rtmdet_distillation/kd_tiny_rtmdet_s_neck_300e_coco/kd_tiny_rtmdet_s_neck_300e_coco_20230213_104240-e1e4197c.pth
+
+  - Name: rtmdet_s_syncbn_fast_8xb32-300e_coco
+    In Collection: RTMDet
+    Config: configs/rtmdet/rtmdet_s_syncbn_fast_8xb32-300e_coco.py
+    Metadata:
+      Training Memory (GB): 15.9
+      Epochs: 300
+    Results:
+      - Task: Object Detection
+        Dataset: COCO
+        Metrics:
+          box AP: 44.6
+    Weights: https://download.openmmlab.com/mmyolo/v0/rtmdet/rtmdet_s_syncbn_fast_8xb32-300e_coco/rtmdet_s_syncbn_fast_8xb32-300e_coco_20221230_182329-0a8c901a.pth
+
+  - Name: kd_s_rtmdet_m_neck_300e_coco
+    In Collection: RTMDet
+    Config: configs/rtmdet/distillation/kd_s_rtmdet_m_neck_300e_coco.py
+    Metadata:
+      Training Memory (GB): 16.3
+      Epochs: 300
+    Results:
+      - Task: Object Detection
+        Dataset: COCO
+        Metrics:
+          box AP: 45.7
+    Weights: https://download.openmmlab.com/mmrazor/v1/rtmdet_distillation/kd_s_rtmdet_m_neck_300e_coco/kd_s_rtmdet_m_neck_300e_coco_20230220_140647-446ff003.pth
+
+  - Name: rtmdet_m_syncbn_fast_8xb32-300e_coco
+    In Collection: RTMDet
+    Config: configs/rtmdet/rtmdet_m_syncbn_fast_8xb32-300e_coco.py
+    Metadata:
+      Training Memory (GB): 27.8
+      Epochs: 300
+    Results:
+      - Task: Object Detection
+        Dataset: COCO
+        Metrics:
+          box AP: 49.3
+    Weights: https://download.openmmlab.com/mmyolo/v0/rtmdet/rtmdet_m_syncbn_fast_8xb32-300e_coco/rtmdet_m_syncbn_fast_8xb32-300e_coco_20230102_135952-40af4fe8.pth
+
+  - Name: kd_m_rtmdet_l_neck_300e_coco
+    In Collection: RTMDet
+    Config: configs/rtmdet/distillation/kd_m_rtmdet_l_neck_300e_coco.py
+    Metadata:
+      Training Memory (GB): 29.0
+      Epochs: 300
+    Results:
+      - Task: Object Detection
+        Dataset: COCO
+        Metrics:
+          box AP: 50.2
+    Weights: https://download.openmmlab.com/mmrazor/v1/rtmdet_distillation/kd_m_rtmdet_l_neck_300e_coco/kd_m_rtmdet_l_neck_300e_coco_20230220_141313-b806f503.pth
+
+  - Name: rtmdet_l_syncbn_fast_8xb32-300e_coco
+    In Collection: RTMDet
+    Config: configs/rtmdet/rtmdet_l_syncbn_fast_8xb32-300e_coco.py
+    Metadata:
+      Training Memory (GB): 43.2
+      Epochs: 300
+    Results:
+      - Task: Object Detection
+        Dataset: COCO
+        Metrics:
+          box AP: 51.4
+    Weights: https://download.openmmlab.com/mmyolo/v0/rtmdet/rtmdet_l_syncbn_fast_8xb32-300e_coco/rtmdet_l_syncbn_fast_8xb32-300e_coco_20230102_135928-ee3abdc4.pth
+
+  - Name: kd_l_rtmdet_x_neck_300e_coco
+    In Collection: RTMDet
+    Config: configs/rtmdet/distillation/kd_l_rtmdet_x_neck_300e_coco.py
+    Metadata:
+      Training Memory (GB): 45.2
+      Epochs: 300
+    Results:
+      - Task: Object Detection
+        Dataset: COCO
+        Metrics:
+          box AP: 52.3
+    Weights: https://download.openmmlab.com/mmrazor/v1/rtmdet_distillation/kd_l_rtmdet_x_neck_300e_coco/kd_l_rtmdet_x_neck_300e_coco_20230220_141912-c9979722.pth
+
+  - Name: rtmdet_x_syncbn_fast_8xb32-300e_coco
+    In Collection: RTMDet
+    Config: configs/rtmdet/rtmdet_x_syncbn_fast_8xb32-300e_coco.py
+    Metadata:
+      Training Memory (GB): 63.4
+      Epochs: 300
+    Results:
+      - Task: Object Detection
+        Dataset: COCO
+        Metrics:
+          box AP: 52.8
+    Weights: https://download.openmmlab.com/mmyolo/v0/rtmdet/rtmdet_x_syncbn_fast_8xb32-300e_coco/rtmdet_x_syncbn_fast_8xb32-300e_coco_20221231_100345-b85cd476.pth
+
+  - Name: rtmdet-r_tiny_fast_1xb8-36e_dota
+    In Collection: Rotated_RTMDet
+    Config: configs/rtmdet/rotated/rtmdet-r_tiny_fast_1xb8-36e_dota.py
+    Metadata:
+      Training Memory (GB): 12.7
+      Epochs: 36
+    Results:
+      - Task: Oriented Object Detection
+        Dataset: DOTAv1.0
+        Metrics:
+          mAP: 75.07
+    Weights: https://download.openmmlab.com/mmyolo/v0/rtmdet/rotated/rtmdet-r_tiny_fast_1xb8-36e_dota/rtmdet-r_tiny_fast_1xb8-36e_dota_20230228_162210-e8ccfb1c.pth
+
+  - Name: rtmdet-r_s_fast_1xb8-36e_dota
+    In Collection: Rotated_RTMDet
+    Config: configs/rtmdet/rotated/rtmdet-r_s_fast_1xb8-36e_dota.py
+    Metadata:
+      Training Memory (GB): 16.6
+      Epochs: 36
+    Results:
+      - Task: Oriented Object Detection
+        Dataset: DOTAv1.0
+        Metrics:
+          mAP: 77.33
+    Weights: https://download.openmmlab.com/mmyolo/v0/rtmdet/rotated/rtmdet-r_s_fast_1xb8-36e_dota/rtmdet-r_s_fast_1xb8-36e_dota_20230224_110307-3946a5aa.pth
+
+  - Name: rtmdet-r_m_syncbn_fast_2xb4-36e_dota
+    In Collection: Rotated_RTMDet
+    Config: configs/rtmdet/rotated/rtmdet-r_m_syncbn_fast_2xb4-36e_dota.py
+    Metadata:
+      Training Resources: 2x A100 GPUs
+      Training Memory (GB): 10.9
+      Epochs: 36
+    Results:
+      - Task: Oriented Object Detection
+        Dataset: DOTAv1.0
+        Metrics:
+          mAP: 78.43
+    Weights: https://download.openmmlab.com/mmyolo/v0/rtmdet/rotated/rtmdet-r_m_syncbn_fast_2xb4-36e_dota/rtmdet-r_m_syncbn_fast_2xb4-36e_dota_20230224_124237-29ae1619.pth
+
+  - Name: rtmdet-r_l_syncbn_fast_2xb4-36e_dota
+    In Collection: Rotated_RTMDet
+    Config: configs/rtmdet/rotated/rtmdet-r_l_syncbn_fast_2xb4-36e_dota.py
+    Metadata:
+      Training Resources: 2x A100 GPUs
+      Training Memory (GB): 16.1
+      Epochs: 36
+    Results:
+      - Task: Oriented Object Detection
+        Dataset: DOTAv1.0
+        Metrics:
+          mAP: 78.66
+    Weights: https://download.openmmlab.com/mmyolo/v0/rtmdet/rotated/rtmdet-r_l_syncbn_fast_2xb4-36e_dota/rtmdet-r_l_syncbn_fast_2xb4-36e_dota_20230224_124544-38bc5f08.pth
+
+  - Name: rtmdet-r_l_syncbn_fast_2xb4-aug-100e_dota
+    In Collection: Rotated_RTMDet
+    Config: configs/rtmdet/rotated/rtmdet-r_l_syncbn_fast_2xb4-aug-100e_dota.py
+    Metadata:
+      Training Resources: 2x A100 GPUs
+      Training Memory (GB): 19.6
+      Epochs: 100
+    Results:
+      - Task: Oriented Object Detection
+        Dataset: DOTAv1.0
+        Metrics:
+          mAP: 80.14
+    Weights: https://download.openmmlab.com/mmyolo/v0/rtmdet/rotated/rtmdet-r_l_syncbn_fast_2xb4-aug-100e_dota/rtmdet-r_l_syncbn_fast_2xb4-aug-100e_dota_20230224_124735-ed4ea966.pth
diff --git a/mmdetection_practice/third_party/mmyolo/configs/rtmdet/rotated/rtmdet-r_l_syncbn_fast_2xb4-36e_dota-ms.py b/mmdetection_practice/third_party/mmyolo/configs/rtmdet/rotated/rtmdet-r_l_syncbn_fast_2xb4-36e_dota-ms.py
new file mode 100644
index 0000000..ef29a1d
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/rtmdet/rotated/rtmdet-r_l_syncbn_fast_2xb4-36e_dota-ms.py
@@ -0,0 +1,30 @@
+_base_ = './rtmdet-r_l_syncbn_fast_2xb4-36e_dota.py'
+
+# ========================modified parameters======================
+data_root = 'data/split_ms_dota/'
+# Path of test images folder
+test_data_prefix = 'test/images/'
+# Submission dir for result submit
+submission_dir = './work_dirs/{{fileBasenameNoExtension}}/submission'
+
+# =======================Unmodified in most cases==================
+train_dataloader = dict(dataset=dict(data_root=data_root))
+
+val_dataloader = dict(dataset=dict(data_root=data_root))
+
+# Inference on val dataset
+test_dataloader = val_dataloader
+
+# Inference on test dataset and format the output results
+# for submission. Note: the test set has no annotation.
+# test_dataloader = dict(
+#     dataset=dict(
+#         data_root=data_root,
+#         ann_file='', # test set has no annotation
+#         data_prefix=dict(img_path=test_data_prefix),
+#         pipeline=_base_.test_pipeline))
+# test_evaluator = dict(
+#     type='mmrotate.DOTAMetric',
+#     format_only=True,
+#     merge_patches=True,
+#     outfile_prefix=submission_dir)
diff --git a/mmdetection_practice/third_party/mmyolo/configs/rtmdet/rotated/rtmdet-r_l_syncbn_fast_2xb4-36e_dota.py b/mmdetection_practice/third_party/mmyolo/configs/rtmdet/rotated/rtmdet-r_l_syncbn_fast_2xb4-36e_dota.py
new file mode 100644
index 0000000..cbb2ae7
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/rtmdet/rotated/rtmdet-r_l_syncbn_fast_2xb4-36e_dota.py
@@ -0,0 +1,331 @@
+_base_ = '../../_base_/default_runtime.py'
+
+checkpoint = 'https://download.openmmlab.com/mmdetection/v3.0/rtmdet/cspnext_rsb_pretrain/cspnext-l_8xb256-rsb-a1-600e_in1k-6a760974.pth'  # noqa
+
+# ========================Frequently modified parameters======================
+# -----data related-----
+data_root = 'data/split_ss_dota/'
+# Path of train annotation folder
+train_ann_file = 'trainval/annfiles/'
+train_data_prefix = 'trainval/images/'  # Prefix of train image path
+# Path of val annotation folder
+val_ann_file = 'trainval/annfiles/'
+val_data_prefix = 'trainval/images/'  # Prefix of val image path
+# Path of test images folder
+test_data_prefix = 'test/images/'
+
+# Submission dir for result submit
+submission_dir = './work_dirs/{{fileBasenameNoExtension}}/submission'
+
+num_classes = 15  # Number of classes for classification
+# Batch size of a single GPU during training
+train_batch_size_per_gpu = 4
+# Worker to pre-fetch data for each single GPU during training
+train_num_workers = 8
+# persistent_workers must be False if num_workers is 0.
+persistent_workers = True
+
+# -----train val related-----
+# Base learning rate for optim_wrapper. Corresponding to 1xb8=8 bs
+base_lr = 0.00025  # 0.004 / 16
+max_epochs = 36  # Maximum training epochs
+
+model_test_cfg = dict(
+    # The config of multi-label for multi-class prediction.
+    multi_label=True,
+    # Decode rbox with angle, For RTMDet-R, Defaults to True.
+    # When set to True, use rbox coder such as DistanceAnglePointCoder
+    # When set to False, use hbox coder such as DistancePointBBoxCoder
+    # different setting lead to different AP.
+    decode_with_angle=True,
+    # The number of boxes before NMS
+    nms_pre=30000,
+    score_thr=0.05,  # Threshold to filter out boxes.
+    nms=dict(type='nms_rotated', iou_threshold=0.1),  # NMS type and threshold
+    max_per_img=2000)  # Max number of detections of each image
+
+# ========================Possible modified parameters========================
+# -----data related-----
+img_scale = (1024, 1024)  # width, height
+# ratio for random rotate
+random_rotate_ratio = 0.5
+# label ids for rect objs
+rotate_rect_obj_labels = [9, 11]
+# Dataset type, this will be used to define the dataset
+dataset_type = 'YOLOv5DOTADataset'
+# Batch size of a single GPU during validation
+val_batch_size_per_gpu = 8
+# Worker to pre-fetch data for each single GPU during validation
+val_num_workers = 8
+
+# Config of batch shapes. Only on val. Not use in RTMDet-R
+batch_shapes_cfg = None
+
+# -----model related-----
+# The scaling factor that controls the depth of the network structure
+deepen_factor = 1.0
+# The scaling factor that controls the width of the network structure
+widen_factor = 1.0
+# Strides of multi-scale prior box
+strides = [8, 16, 32]
+# The angle definition for model
+angle_version = 'le90'  # le90, le135, oc are available options
+
+norm_cfg = dict(type='BN')  # Normalization config
+
+# -----train val related-----
+lr_start_factor = 1.0e-5
+dsl_topk = 13  # Number of bbox selected in each level
+loss_cls_weight = 1.0
+loss_bbox_weight = 2.0
+qfl_beta = 2.0  # beta of QualityFocalLoss
+weight_decay = 0.05
+
+# Save model checkpoint and validation intervals
+save_checkpoint_intervals = 1
+# The maximum checkpoints to keep.
+max_keep_ckpts = 3
+# single-scale training is recommended to
+# be turned on, which can speed up training.
+env_cfg = dict(cudnn_benchmark=True)
+
+# ===============================Unmodified in most cases====================
+model = dict(
+    type='YOLODetector',
+    data_preprocessor=dict(
+        type='YOLOv5DetDataPreprocessor',
+        mean=[103.53, 116.28, 123.675],
+        std=[57.375, 57.12, 58.395],
+        bgr_to_rgb=False),
+    backbone=dict(
+        type='CSPNeXt',
+        arch='P5',
+        expand_ratio=0.5,
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+        channel_attention=True,
+        norm_cfg=norm_cfg,
+        act_cfg=dict(type='SiLU', inplace=True),
+        init_cfg=dict(
+            type='Pretrained', prefix='backbone.', checkpoint=checkpoint)),
+    neck=dict(
+        type='CSPNeXtPAFPN',
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+        in_channels=[256, 512, 1024],
+        out_channels=256,
+        num_csp_blocks=3,
+        expand_ratio=0.5,
+        norm_cfg=norm_cfg,
+        act_cfg=dict(type='SiLU', inplace=True)),
+    bbox_head=dict(
+        type='RTMDetRotatedHead',
+        head_module=dict(
+            type='RTMDetRotatedSepBNHeadModule',
+            num_classes=num_classes,
+            widen_factor=widen_factor,
+            in_channels=256,
+            stacked_convs=2,
+            feat_channels=256,
+            norm_cfg=norm_cfg,
+            act_cfg=dict(type='SiLU', inplace=True),
+            share_conv=True,
+            pred_kernel_size=1,
+            featmap_strides=strides),
+        prior_generator=dict(
+            type='mmdet.MlvlPointGenerator', offset=0, strides=strides),
+        bbox_coder=dict(
+            type='DistanceAnglePointCoder', angle_version=angle_version),
+        loss_cls=dict(
+            type='mmdet.QualityFocalLoss',
+            use_sigmoid=True,
+            beta=qfl_beta,
+            loss_weight=loss_cls_weight),
+        loss_bbox=dict(
+            type='mmrotate.RotatedIoULoss',
+            mode='linear',
+            loss_weight=loss_bbox_weight),
+        angle_version=angle_version,
+        # Used for angle encode and decode, similar to bbox coder
+        angle_coder=dict(type='mmrotate.PseudoAngleCoder'),
+        # If true, it will apply loss_bbox on horizontal box, and angle_loss
+        # needs to be specified. In this case the loss_bbox should use
+        # horizontal box loss e.g. IoULoss. Arg details can be seen in
+        # `docs/zh_cn/tutorials/rotated_detection.md`
+        use_hbbox_loss=False,
+        loss_angle=None),
+    train_cfg=dict(
+        assigner=dict(
+            type='BatchDynamicSoftLabelAssigner',
+            num_classes=num_classes,
+            topk=dsl_topk,
+            iou_calculator=dict(type='mmrotate.RBboxOverlaps2D'),
+            # RBboxOverlaps2D doesn't support batch input, use loop instead.
+            batch_iou=False),
+        allowed_border=-1,
+        pos_weight=-1,
+        debug=False),
+    test_cfg=model_test_cfg,
+)
+
+train_pipeline = [
+    dict(type='LoadImageFromFile', backend_args=_base_.backend_args),
+    dict(type='LoadAnnotations', with_bbox=True, box_type='qbox'),
+    dict(
+        type='mmrotate.ConvertBoxType',
+        box_type_mapping=dict(gt_bboxes='rbox')),
+    dict(type='mmdet.Resize', scale=img_scale, keep_ratio=True),
+    dict(
+        type='mmdet.RandomFlip',
+        prob=0.75,
+        direction=['horizontal', 'vertical', 'diagonal']),
+    dict(
+        type='mmrotate.RandomRotate',
+        prob=random_rotate_ratio,
+        angle_range=180,
+        rotate_type='mmrotate.Rotate',
+        rect_obj_labels=rotate_rect_obj_labels),
+    dict(type='mmdet.Pad', size=img_scale, pad_val=dict(img=(114, 114, 114))),
+    dict(type='RegularizeRotatedBox', angle_version=angle_version),
+    dict(type='mmdet.PackDetInputs')
+]
+
+val_pipeline = [
+    dict(type='LoadImageFromFile', backend_args=_base_.backend_args),
+    dict(type='mmdet.Resize', scale=img_scale, keep_ratio=True),
+    dict(type='mmdet.Pad', size=img_scale, pad_val=dict(img=(114, 114, 114))),
+    dict(
+        type='LoadAnnotations',
+        with_bbox=True,
+        box_type='qbox',
+        _scope_='mmdet'),
+    dict(
+        type='mmrotate.ConvertBoxType',
+        box_type_mapping=dict(gt_bboxes='rbox')),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                   'scale_factor'))
+]
+
+test_pipeline = [
+    dict(type='LoadImageFromFile', backend_args=_base_.backend_args),
+    dict(type='mmdet.Resize', scale=img_scale, keep_ratio=True),
+    dict(type='mmdet.Pad', size=img_scale, pad_val=dict(img=(114, 114, 114))),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                   'scale_factor'))
+]
+
+train_dataloader = dict(
+    batch_size=train_batch_size_per_gpu,
+    num_workers=train_num_workers,
+    persistent_workers=persistent_workers,
+    pin_memory=True,
+    collate_fn=dict(type='yolov5_collate'),
+    sampler=dict(type='DefaultSampler', shuffle=True),
+    dataset=dict(
+        type=dataset_type,
+        data_root=data_root,
+        ann_file=train_ann_file,
+        data_prefix=dict(img_path=train_data_prefix),
+        filter_cfg=dict(filter_empty_gt=True),
+        pipeline=train_pipeline))
+
+val_dataloader = dict(
+    batch_size=val_batch_size_per_gpu,
+    num_workers=val_num_workers,
+    persistent_workers=persistent_workers,
+    pin_memory=True,
+    drop_last=False,
+    sampler=dict(type='DefaultSampler', shuffle=False),
+    dataset=dict(
+        type=dataset_type,
+        data_root=data_root,
+        ann_file=val_ann_file,
+        data_prefix=dict(img_path=val_data_prefix),
+        test_mode=True,
+        batch_shapes_cfg=batch_shapes_cfg,
+        pipeline=val_pipeline))
+
+val_evaluator = dict(type='mmrotate.DOTAMetric', metric='mAP')
+
+# Inference on val dataset
+test_dataloader = val_dataloader
+test_evaluator = val_evaluator
+
+# Inference on test dataset and format the output results
+# for submission. Note: the test set has no annotation.
+# test_dataloader = dict(
+#     batch_size=val_batch_size_per_gpu,
+#     num_workers=val_num_workers,
+#     persistent_workers=True,
+#     drop_last=False,
+#     sampler=dict(type='DefaultSampler', shuffle=False),
+#     dataset=dict(
+#         type=dataset_type,
+#         data_root=data_root,
+#         data_prefix=dict(img_path=test_data_prefix),
+#         test_mode=True,
+#         batch_shapes_cfg=batch_shapes_cfg,
+#         pipeline=test_pipeline))
+# test_evaluator = dict(
+#     type='mmrotate.DOTAMetric',
+#     format_only=True,
+#     merge_patches=True,
+#     outfile_prefix=submission_dir)
+
+# optimizer
+optim_wrapper = dict(
+    type='OptimWrapper',
+    optimizer=dict(type='AdamW', lr=base_lr, weight_decay=weight_decay),
+    paramwise_cfg=dict(
+        norm_decay_mult=0, bias_decay_mult=0, bypass_duplicate=True))
+
+# learning rate
+param_scheduler = [
+    dict(
+        type='LinearLR',
+        start_factor=lr_start_factor,
+        by_epoch=False,
+        begin=0,
+        end=1000),
+    dict(
+        # use cosine lr from 150 to 300 epoch
+        type='CosineAnnealingLR',
+        eta_min=base_lr * 0.05,
+        begin=max_epochs // 2,
+        end=max_epochs,
+        T_max=max_epochs // 2,
+        by_epoch=True,
+        convert_to_iter_based=True),
+]
+
+# hooks
+default_hooks = dict(
+    checkpoint=dict(
+        type='CheckpointHook',
+        interval=save_checkpoint_intervals,
+        max_keep_ckpts=max_keep_ckpts,  # only keep latest 3 checkpoints
+        save_best='auto'))
+
+custom_hooks = [
+    dict(
+        type='EMAHook',
+        ema_type='ExpMomentumEMA',
+        momentum=0.0002,
+        update_buffers=True,
+        strict_load=False,
+        priority=49)
+]
+
+train_cfg = dict(
+    type='EpochBasedTrainLoop',
+    max_epochs=max_epochs,
+    val_interval=save_checkpoint_intervals)
+
+val_cfg = dict(type='ValLoop')
+test_cfg = dict(type='TestLoop')
+
+visualizer = dict(type='mmrotate.RotLocalVisualizer')
diff --git a/mmdetection_practice/third_party/mmyolo/configs/rtmdet/rotated/rtmdet-r_l_syncbn_fast_2xb4-aug-100e_dota.py b/mmdetection_practice/third_party/mmyolo/configs/rtmdet/rotated/rtmdet-r_l_syncbn_fast_2xb4-aug-100e_dota.py
new file mode 100644
index 0000000..dcafa55
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/rtmdet/rotated/rtmdet-r_l_syncbn_fast_2xb4-aug-100e_dota.py
@@ -0,0 +1,168 @@
+_base_ = './rtmdet-r_l_syncbn_fast_2xb4-36e_dota.py'
+
+# This config use longer schedule with Mixup, Mosaic and Random Rotate.
+
+checkpoint = 'https://download.openmmlab.com/mmdetection/v3.0/rtmdet/cspnext_rsb_pretrain/cspnext-l_8xb256-rsb-a1-600e_in1k-6a760974.pth'  # noqa
+
+# ========================modified parameters======================
+
+# Base learning rate for optim_wrapper. Corresponding to 1xb8=8 bs
+base_lr = 0.00025  # 0.004 / 16
+lr_start_factor = 1.0e-5
+max_epochs = 100  # Maximum training epochs
+# Change train_pipeline for final 10 epochs (stage 2)
+num_epochs_stage2 = 10
+
+img_scale = (1024, 1024)  # width, height
+# ratio range for random resize
+random_resize_ratio_range = (0.1, 2.0)
+# Cached images number in mosaic
+mosaic_max_cached_images = 40
+# Number of cached images in mixup
+mixup_max_cached_images = 20
+# ratio for random rotate
+random_rotate_ratio = 0.5
+# label ids for rect objs
+rotate_rect_obj_labels = [9, 11]
+
+# Save model checkpoint and validation intervals
+save_checkpoint_intervals = 1
+# validation intervals in stage 2
+val_interval_stage2 = 1
+# The maximum checkpoints to keep.
+max_keep_ckpts = 3
+
+# Submission dir for result submit
+submission_dir = './work_dirs/{{fileBasenameNoExtension}}/submission'
+
+# =======================Unmodified in most cases==================
+
+train_pipeline = [
+    dict(type='LoadImageFromFile', backend_args=_base_.backend_args),
+    dict(type='LoadAnnotations', with_bbox=True, box_type='qbox'),
+    dict(
+        type='mmrotate.ConvertBoxType',
+        box_type_mapping=dict(gt_bboxes='rbox')),
+    dict(
+        type='Mosaic',
+        img_scale=img_scale,
+        use_cached=True,
+        max_cached_images=mosaic_max_cached_images,
+        pad_val=114.0),
+    dict(
+        type='mmdet.RandomResize',
+        # img_scale is (width, height)
+        scale=(img_scale[0] * 2, img_scale[1] * 2),
+        ratio_range=random_resize_ratio_range,
+        resize_type='mmdet.Resize',
+        keep_ratio=True),
+    dict(
+        type='mmrotate.RandomRotate',
+        prob=random_rotate_ratio,
+        angle_range=180,
+        rotate_type='mmrotate.Rotate',
+        rect_obj_labels=rotate_rect_obj_labels),
+    dict(type='mmdet.RandomCrop', crop_size=img_scale),
+    dict(type='mmdet.YOLOXHSVRandomAug'),
+    dict(
+        type='mmdet.RandomFlip',
+        prob=0.75,
+        direction=['horizontal', 'vertical', 'diagonal']),
+    dict(type='mmdet.Pad', size=img_scale, pad_val=dict(img=(114, 114, 114))),
+    dict(
+        type='YOLOv5MixUp',
+        use_cached=True,
+        max_cached_images=mixup_max_cached_images),
+    dict(type='mmdet.PackDetInputs')
+]
+
+train_pipeline_stage2 = [
+    dict(type='LoadImageFromFile', backend_args=_base_.backend_args),
+    dict(type='LoadAnnotations', with_bbox=True, box_type='qbox'),
+    dict(
+        type='mmrotate.ConvertBoxType',
+        box_type_mapping=dict(gt_bboxes='rbox')),
+    dict(
+        type='mmdet.RandomResize',
+        scale=img_scale,
+        ratio_range=random_resize_ratio_range,
+        resize_type='mmdet.Resize',
+        keep_ratio=True),
+    dict(
+        type='mmrotate.RandomRotate',
+        prob=random_rotate_ratio,
+        angle_range=180,
+        rotate_type='mmrotate.Rotate',
+        rect_obj_labels=rotate_rect_obj_labels),
+    dict(type='mmdet.RandomCrop', crop_size=img_scale),
+    dict(type='mmdet.YOLOXHSVRandomAug'),
+    dict(
+        type='mmdet.RandomFlip',
+        prob=0.75,
+        direction=['horizontal', 'vertical', 'diagonal']),
+    dict(type='mmdet.Pad', size=img_scale, pad_val=dict(img=(114, 114, 114))),
+    dict(type='mmdet.PackDetInputs')
+]
+
+train_dataloader = dict(dataset=dict(pipeline=train_pipeline))
+
+# learning rate
+param_scheduler = [
+    dict(
+        type='LinearLR',
+        start_factor=lr_start_factor,
+        by_epoch=False,
+        begin=0,
+        end=1000),
+    dict(
+        # use cosine lr from 150 to 300 epoch
+        type='CosineAnnealingLR',
+        eta_min=base_lr * 0.05,
+        begin=max_epochs // 2,
+        end=max_epochs,
+        T_max=max_epochs // 2,
+        by_epoch=True,
+        convert_to_iter_based=True),
+]
+
+# hooks
+default_hooks = dict(
+    checkpoint=dict(
+        type='CheckpointHook',
+        interval=save_checkpoint_intervals,
+        max_keep_ckpts=max_keep_ckpts,  # only keep latest 3 checkpoints
+        save_best='auto'))
+
+custom_hooks = [
+    dict(
+        type='EMAHook',
+        ema_type='ExpMomentumEMA',
+        momentum=0.0002,
+        update_buffers=True,
+        strict_load=False,
+        priority=49),
+    dict(
+        type='mmdet.PipelineSwitchHook',
+        switch_epoch=max_epochs - num_epochs_stage2,
+        switch_pipeline=train_pipeline_stage2)
+]
+
+train_cfg = dict(
+    type='EpochBasedTrainLoop',
+    max_epochs=max_epochs,
+    val_interval=save_checkpoint_intervals,
+    dynamic_intervals=[(max_epochs - num_epochs_stage2, val_interval_stage2)])
+
+# Inference on test dataset and format the output results
+# for submission. Note: the test set has no annotation.
+# test_dataloader = dict(
+#     dataset=dict(
+#         data_root=_base_.data_root,
+#         ann_file='', # test set has no annotation
+#         data_prefix=dict(img_path=_base_.test_data_prefix),
+#         pipeline=_base_.test_pipeline))
+# test_evaluator = dict(
+#     type='mmrotate.DOTAMetric',
+#     format_only=True,
+#     merge_patches=True,
+#     outfile_prefix=submission_dir)
diff --git a/mmdetection_practice/third_party/mmyolo/configs/rtmdet/rotated/rtmdet-r_l_syncbn_fast_coco-pretrain_2xb4-36e_dota-ms.py b/mmdetection_practice/third_party/mmyolo/configs/rtmdet/rotated/rtmdet-r_l_syncbn_fast_coco-pretrain_2xb4-36e_dota-ms.py
new file mode 100644
index 0000000..1a9f50c
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/rtmdet/rotated/rtmdet-r_l_syncbn_fast_coco-pretrain_2xb4-36e_dota-ms.py
@@ -0,0 +1,20 @@
+_base_ = './rtmdet-r_l_syncbn_fast_2xb4-36e_dota-ms.py'
+
+load_from = 'https://download.openmmlab.com/mmyolo/v0/rtmdet/rtmdet_l_syncbn_fast_8xb32-300e_coco/rtmdet_l_syncbn_fast_8xb32-300e_coco_20230102_135928-ee3abdc4.pth'  # noqa
+
+# Submission dir for result submit
+submission_dir = './work_dirs/{{fileBasenameNoExtension}}/submission'
+
+# Inference on test dataset and format the output results
+# for submission. Note: the test set has no annotation.
+# test_dataloader = dict(
+#     dataset=dict(
+#         data_root=_base_.data_root,
+#         ann_file='', # test set has no annotation
+#         data_prefix=dict(img_path=_base_.test_data_prefix),
+#         pipeline=_base_.test_pipeline))
+# test_evaluator = dict(
+#     type='mmrotate.DOTAMetric',
+#     format_only=True,
+#     merge_patches=True,
+#     outfile_prefix=submission_dir)
diff --git a/mmdetection_practice/third_party/mmyolo/configs/rtmdet/rotated/rtmdet-r_m_syncbn_fast_2xb4-36e_dota-ms.py b/mmdetection_practice/third_party/mmyolo/configs/rtmdet/rotated/rtmdet-r_m_syncbn_fast_2xb4-36e_dota-ms.py
new file mode 100644
index 0000000..4be8605
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/rtmdet/rotated/rtmdet-r_m_syncbn_fast_2xb4-36e_dota-ms.py
@@ -0,0 +1,33 @@
+_base_ = './rtmdet-r_l_syncbn_fast_2xb4-36e_dota-ms.py'
+
+checkpoint = 'https://download.openmmlab.com/mmdetection/v3.0/rtmdet/cspnext_rsb_pretrain/cspnext-m_8xb256-rsb-a1-600e_in1k-ecb3bbd9.pth'  # noqa
+
+# ========================modified parameters======================
+deepen_factor = 0.67
+widen_factor = 0.75
+
+# Submission dir for result submit
+submission_dir = './work_dirs/{{fileBasenameNoExtension}}/submission'
+
+# =======================Unmodified in most cases==================
+model = dict(
+    backbone=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+        init_cfg=dict(checkpoint=checkpoint)),
+    neck=dict(deepen_factor=deepen_factor, widen_factor=widen_factor),
+    bbox_head=dict(head_module=dict(widen_factor=widen_factor)))
+
+# Inference on test dataset and format the output results
+# for submission. Note: the test set has no annotation.
+# test_dataloader = dict(
+#     dataset=dict(
+#         data_root=_base_.data_root,
+#         ann_file='', # test set has no annotation
+#         data_prefix=dict(img_path=_base_.test_data_prefix),
+#         pipeline=_base_.test_pipeline))
+# test_evaluator = dict(
+#     type='mmrotate.DOTAMetric',
+#     format_only=True,
+#     merge_patches=True,
+#     outfile_prefix=submission_dir)
diff --git a/mmdetection_practice/third_party/mmyolo/configs/rtmdet/rotated/rtmdet-r_m_syncbn_fast_2xb4-36e_dota.py b/mmdetection_practice/third_party/mmyolo/configs/rtmdet/rotated/rtmdet-r_m_syncbn_fast_2xb4-36e_dota.py
new file mode 100644
index 0000000..8df61cf
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/rtmdet/rotated/rtmdet-r_m_syncbn_fast_2xb4-36e_dota.py
@@ -0,0 +1,33 @@
+_base_ = './rtmdet-r_l_syncbn_fast_2xb4-36e_dota.py'
+
+checkpoint = 'https://download.openmmlab.com/mmdetection/v3.0/rtmdet/cspnext_rsb_pretrain/cspnext-m_8xb256-rsb-a1-600e_in1k-ecb3bbd9.pth'  # noqa
+
+# ========================modified parameters======================
+deepen_factor = 0.67
+widen_factor = 0.75
+
+# Submission dir for result submit
+submission_dir = './work_dirs/{{fileBasenameNoExtension}}/submission'
+
+# =======================Unmodified in most cases==================
+model = dict(
+    backbone=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+        init_cfg=dict(checkpoint=checkpoint)),
+    neck=dict(deepen_factor=deepen_factor, widen_factor=widen_factor),
+    bbox_head=dict(head_module=dict(widen_factor=widen_factor)))
+
+# Inference on test dataset and format the output results
+# for submission. Note: the test set has no annotation.
+# test_dataloader = dict(
+#     dataset=dict(
+#         data_root=_base_.data_root,
+#         ann_file='', # test set has no annotation
+#         data_prefix=dict(img_path=_base_.test_data_prefix),
+#         pipeline=_base_.test_pipeline))
+# test_evaluator = dict(
+#     type='mmrotate.DOTAMetric',
+#     format_only=True,
+#     merge_patches=True,
+#     outfile_prefix=submission_dir)
diff --git a/mmdetection_practice/third_party/mmyolo/configs/rtmdet/rotated/rtmdet-r_s_fast_1xb8-36e_dota-ms.py b/mmdetection_practice/third_party/mmyolo/configs/rtmdet/rotated/rtmdet-r_s_fast_1xb8-36e_dota-ms.py
new file mode 100644
index 0000000..2b7b0b6
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/rtmdet/rotated/rtmdet-r_s_fast_1xb8-36e_dota-ms.py
@@ -0,0 +1,38 @@
+_base_ = './rtmdet-r_l_syncbn_fast_2xb4-36e_dota-ms.py'
+
+checkpoint = 'https://download.openmmlab.com/mmdetection/v3.0/rtmdet/cspnext_rsb_pretrain/cspnext-s_imagenet_600e.pth'  # noqa
+
+# ========================modified parameters======================
+deepen_factor = 0.33
+widen_factor = 0.5
+
+# Batch size of a single GPU during training
+train_batch_size_per_gpu = 8
+
+# Submission dir for result submit
+submission_dir = './work_dirs/{{fileBasenameNoExtension}}/submission'
+
+# =======================Unmodified in most cases==================
+model = dict(
+    backbone=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+        init_cfg=dict(checkpoint=checkpoint)),
+    neck=dict(deepen_factor=deepen_factor, widen_factor=widen_factor),
+    bbox_head=dict(head_module=dict(widen_factor=widen_factor)))
+
+train_dataloader = dict(batch_size=train_batch_size_per_gpu)
+
+# Inference on test dataset and format the output results
+# for submission. Note: the test set has no annotation.
+# test_dataloader = dict(
+#     dataset=dict(
+#         data_root=_base_.data_root,
+#         ann_file='', # test set has no annotation
+#         data_prefix=dict(img_path=_base_.test_data_prefix),
+#         pipeline=_base_.test_pipeline))
+# test_evaluator = dict(
+#     type='mmrotate.DOTAMetric',
+#     format_only=True,
+#     merge_patches=True,
+#     outfile_prefix=submission_dir)
diff --git a/mmdetection_practice/third_party/mmyolo/configs/rtmdet/rotated/rtmdet-r_s_fast_1xb8-36e_dota.py b/mmdetection_practice/third_party/mmyolo/configs/rtmdet/rotated/rtmdet-r_s_fast_1xb8-36e_dota.py
new file mode 100644
index 0000000..d200dd7
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/rtmdet/rotated/rtmdet-r_s_fast_1xb8-36e_dota.py
@@ -0,0 +1,38 @@
+_base_ = './rtmdet-r_l_syncbn_fast_2xb4-36e_dota.py'
+
+checkpoint = 'https://download.openmmlab.com/mmdetection/v3.0/rtmdet/cspnext_rsb_pretrain/cspnext-s_imagenet_600e.pth'  # noqa
+
+# ========================modified parameters======================
+deepen_factor = 0.33
+widen_factor = 0.5
+
+# Batch size of a single GPU during training
+train_batch_size_per_gpu = 8
+
+# Submission dir for result submit
+submission_dir = './work_dirs/{{fileBasenameNoExtension}}/submission'
+
+# =======================Unmodified in most cases==================
+model = dict(
+    backbone=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+        init_cfg=dict(checkpoint=checkpoint)),
+    neck=dict(deepen_factor=deepen_factor, widen_factor=widen_factor),
+    bbox_head=dict(head_module=dict(widen_factor=widen_factor)))
+
+train_dataloader = dict(batch_size=train_batch_size_per_gpu)
+
+# Inference on test dataset and format the output results
+# for submission. Note: the test set has no annotation.
+# test_dataloader = dict(
+#     dataset=dict(
+#         data_root=_base_.data_root,
+#         ann_file='', # test set has no annotation
+#         data_prefix=dict(img_path=_base_.test_data_prefix),
+#         pipeline=_base_.test_pipeline))
+# test_evaluator = dict(
+#     type='mmrotate.DOTAMetric',
+#     format_only=True,
+#     merge_patches=True,
+#     outfile_prefix=submission_dir)
diff --git a/mmdetection_practice/third_party/mmyolo/configs/rtmdet/rotated/rtmdet-r_tiny_fast_1xb8-36e_dota-ms.py b/mmdetection_practice/third_party/mmyolo/configs/rtmdet/rotated/rtmdet-r_tiny_fast_1xb8-36e_dota-ms.py
new file mode 100644
index 0000000..56bf038
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/rtmdet/rotated/rtmdet-r_tiny_fast_1xb8-36e_dota-ms.py
@@ -0,0 +1,38 @@
+_base_ = './rtmdet-r_l_syncbn_fast_2xb4-36e_dota-ms.py'
+
+checkpoint = 'https://download.openmmlab.com/mmdetection/v3.0/rtmdet/cspnext_rsb_pretrain/cspnext-tiny_imagenet_600e.pth'  # noqa
+
+# ========================modified parameters======================
+deepen_factor = 0.167
+widen_factor = 0.375
+
+# Batch size of a single GPU during training
+train_batch_size_per_gpu = 8
+
+# Submission dir for result submit
+submission_dir = './work_dirs/{{fileBasenameNoExtension}}/submission'
+
+# =======================Unmodified in most cases==================
+model = dict(
+    backbone=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+        init_cfg=dict(checkpoint=checkpoint)),
+    neck=dict(deepen_factor=deepen_factor, widen_factor=widen_factor),
+    bbox_head=dict(head_module=dict(widen_factor=widen_factor)))
+
+train_dataloader = dict(batch_size=train_batch_size_per_gpu)
+
+# Inference on test dataset and format the output results
+# for submission. Note: the test set has no annotation.
+# test_dataloader = dict(
+#     dataset=dict(
+#         data_root=_base_.data_root,
+#         ann_file='', # test set has no annotation
+#         data_prefix=dict(img_path=_base_.test_data_prefix),
+#         pipeline=_base_.test_pipeline))
+# test_evaluator = dict(
+#     type='mmrotate.DOTAMetric',
+#     format_only=True,
+#     merge_patches=True,
+#     outfile_prefix=submission_dir)
diff --git a/mmdetection_practice/third_party/mmyolo/configs/rtmdet/rotated/rtmdet-r_tiny_fast_1xb8-36e_dota.py b/mmdetection_practice/third_party/mmyolo/configs/rtmdet/rotated/rtmdet-r_tiny_fast_1xb8-36e_dota.py
new file mode 100644
index 0000000..739a2de
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/rtmdet/rotated/rtmdet-r_tiny_fast_1xb8-36e_dota.py
@@ -0,0 +1,38 @@
+_base_ = './rtmdet-r_l_syncbn_fast_2xb4-36e_dota.py'
+
+checkpoint = 'https://download.openmmlab.com/mmdetection/v3.0/rtmdet/cspnext_rsb_pretrain/cspnext-tiny_imagenet_600e.pth'  # noqa
+
+# ========================modified parameters======================
+deepen_factor = 0.167
+widen_factor = 0.375
+
+# Batch size of a single GPU during training
+train_batch_size_per_gpu = 8
+
+# Submission dir for result submit
+submission_dir = './work_dirs/{{fileBasenameNoExtension}}/submission'
+
+# =======================Unmodified in most cases==================
+model = dict(
+    backbone=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+        init_cfg=dict(checkpoint=checkpoint)),
+    neck=dict(deepen_factor=deepen_factor, widen_factor=widen_factor),
+    bbox_head=dict(head_module=dict(widen_factor=widen_factor)))
+
+train_dataloader = dict(batch_size=train_batch_size_per_gpu)
+
+# Inference on test dataset and format the output results
+# for submission. Note: the test set has no annotation.
+# test_dataloader = dict(
+#     dataset=dict(
+#         data_root=_base_.data_root,
+#         ann_file='', # test set has no annotation
+#         data_prefix=dict(img_path=_base_.test_data_prefix),
+#         pipeline=_base_.test_pipeline))
+# test_evaluator = dict(
+#     type='mmrotate.DOTAMetric',
+#     format_only=True,
+#     merge_patches=True,
+#     outfile_prefix=submission_dir)
diff --git a/mmdetection_practice/third_party/mmyolo/configs/rtmdet/rtmdet-ins_s_syncbn_fast_8xb32-300e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/rtmdet/rtmdet-ins_s_syncbn_fast_8xb32-300e_coco.py
new file mode 100644
index 0000000..279a799
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/rtmdet/rtmdet-ins_s_syncbn_fast_8xb32-300e_coco.py
@@ -0,0 +1,31 @@
+_base_ = './rtmdet_s_syncbn_fast_8xb32-300e_coco.py'
+
+widen_factor = 0.5
+
+model = dict(
+    bbox_head=dict(
+        type='RTMDetInsSepBNHead',
+        head_module=dict(
+            type='RTMDetInsSepBNHeadModule',
+            use_sigmoid_cls=True,
+            widen_factor=widen_factor),
+        loss_mask=dict(
+            type='mmdet.DiceLoss', loss_weight=2.0, eps=5e-6,
+            reduction='mean')),
+    test_cfg=dict(
+        multi_label=True,
+        nms_pre=1000,
+        min_bbox_size=0,
+        score_thr=0.05,
+        nms=dict(type='nms', iou_threshold=0.6),
+        max_per_img=100,
+        mask_thr_binary=0.5))
+
+_base_.test_pipeline[-2] = dict(
+    type='LoadAnnotations', with_bbox=True, with_mask=True, _scope_='mmdet')
+
+val_dataloader = dict(dataset=dict(pipeline=_base_.test_pipeline))
+test_dataloader = val_dataloader
+
+val_evaluator = dict(metric=['bbox', 'segm'])
+test_evaluator = val_evaluator
diff --git a/mmdetection_practice/third_party/mmyolo/configs/rtmdet/rtmdet_l_syncbn_fast_8xb32-300e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/rtmdet/rtmdet_l_syncbn_fast_8xb32-300e_coco.py
new file mode 100644
index 0000000..c36ac38
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/rtmdet/rtmdet_l_syncbn_fast_8xb32-300e_coco.py
@@ -0,0 +1,304 @@
+_base_ = ['../_base_/default_runtime.py', '../_base_/det_p5_tta.py']
+
+# ========================Frequently modified parameters======================
+# -----data related-----
+data_root = 'data/coco/'
+# Path of train annotation file
+train_ann_file = 'annotations/instances_train2017.json'
+train_data_prefix = 'train2017/'  # Prefix of train image path
+# Path of val annotation file
+val_ann_file = 'annotations/instances_val2017.json'
+val_data_prefix = 'val2017/'  # Prefix of val image path
+
+num_classes = 80  # Number of classes for classification
+# Batch size of a single GPU during training
+train_batch_size_per_gpu = 32
+# Worker to pre-fetch data for each single GPU during training
+train_num_workers = 10
+# persistent_workers must be False if num_workers is 0.
+persistent_workers = True
+
+# -----train val related-----
+# Base learning rate for optim_wrapper. Corresponding to 8xb16=64 bs
+base_lr = 0.004
+max_epochs = 300  # Maximum training epochs
+# Change train_pipeline for final 20 epochs (stage 2)
+num_epochs_stage2 = 20
+
+model_test_cfg = dict(
+    # The config of multi-label for multi-class prediction.
+    multi_label=True,
+    # The number of boxes before NMS
+    nms_pre=30000,
+    score_thr=0.001,  # Threshold to filter out boxes.
+    nms=dict(type='nms', iou_threshold=0.65),  # NMS type and threshold
+    max_per_img=300)  # Max number of detections of each image
+
+# ========================Possible modified parameters========================
+# -----data related-----
+img_scale = (640, 640)  # width, height
+# ratio range for random resize
+random_resize_ratio_range = (0.1, 2.0)
+# Cached images number in mosaic
+mosaic_max_cached_images = 40
+# Number of cached images in mixup
+mixup_max_cached_images = 20
+# Dataset type, this will be used to define the dataset
+dataset_type = 'YOLOv5CocoDataset'
+# Batch size of a single GPU during validation
+val_batch_size_per_gpu = 32
+# Worker to pre-fetch data for each single GPU during validation
+val_num_workers = 10
+
+# Config of batch shapes. Only on val.
+batch_shapes_cfg = dict(
+    type='BatchShapePolicy',
+    batch_size=val_batch_size_per_gpu,
+    img_size=img_scale[0],
+    size_divisor=32,
+    extra_pad_ratio=0.5)
+
+# -----model related-----
+# The scaling factor that controls the depth of the network structure
+deepen_factor = 1.0
+# The scaling factor that controls the width of the network structure
+widen_factor = 1.0
+# Strides of multi-scale prior box
+strides = [8, 16, 32]
+
+norm_cfg = dict(type='BN')  # Normalization config
+
+# -----train val related-----
+lr_start_factor = 1.0e-5
+dsl_topk = 13  # Number of bbox selected in each level
+loss_cls_weight = 1.0
+loss_bbox_weight = 2.0
+qfl_beta = 2.0  # beta of QualityFocalLoss
+weight_decay = 0.05
+
+# Save model checkpoint and validation intervals
+save_checkpoint_intervals = 10
+# validation intervals in stage 2
+val_interval_stage2 = 1
+# The maximum checkpoints to keep.
+max_keep_ckpts = 3
+# single-scale training is recommended to
+# be turned on, which can speed up training.
+env_cfg = dict(cudnn_benchmark=True)
+
+# ===============================Unmodified in most cases====================
+model = dict(
+    type='YOLODetector',
+    data_preprocessor=dict(
+        type='YOLOv5DetDataPreprocessor',
+        mean=[103.53, 116.28, 123.675],
+        std=[57.375, 57.12, 58.395],
+        bgr_to_rgb=False),
+    backbone=dict(
+        type='CSPNeXt',
+        arch='P5',
+        expand_ratio=0.5,
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+        channel_attention=True,
+        norm_cfg=norm_cfg,
+        act_cfg=dict(type='SiLU', inplace=True)),
+    neck=dict(
+        type='CSPNeXtPAFPN',
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+        in_channels=[256, 512, 1024],
+        out_channels=256,
+        num_csp_blocks=3,
+        expand_ratio=0.5,
+        norm_cfg=norm_cfg,
+        act_cfg=dict(type='SiLU', inplace=True)),
+    bbox_head=dict(
+        type='RTMDetHead',
+        head_module=dict(
+            type='RTMDetSepBNHeadModule',
+            num_classes=num_classes,
+            in_channels=256,
+            stacked_convs=2,
+            feat_channels=256,
+            norm_cfg=norm_cfg,
+            act_cfg=dict(type='SiLU', inplace=True),
+            share_conv=True,
+            pred_kernel_size=1,
+            featmap_strides=strides),
+        prior_generator=dict(
+            type='mmdet.MlvlPointGenerator', offset=0, strides=strides),
+        bbox_coder=dict(type='DistancePointBBoxCoder'),
+        loss_cls=dict(
+            type='mmdet.QualityFocalLoss',
+            use_sigmoid=True,
+            beta=qfl_beta,
+            loss_weight=loss_cls_weight),
+        loss_bbox=dict(type='mmdet.GIoULoss', loss_weight=loss_bbox_weight)),
+    train_cfg=dict(
+        assigner=dict(
+            type='BatchDynamicSoftLabelAssigner',
+            num_classes=num_classes,
+            topk=dsl_topk,
+            iou_calculator=dict(type='mmdet.BboxOverlaps2D')),
+        allowed_border=-1,
+        pos_weight=-1,
+        debug=False),
+    test_cfg=model_test_cfg,
+)
+
+train_pipeline = [
+    dict(type='LoadImageFromFile', backend_args=_base_.backend_args),
+    dict(type='LoadAnnotations', with_bbox=True),
+    dict(
+        type='Mosaic',
+        img_scale=img_scale,
+        use_cached=True,
+        max_cached_images=mosaic_max_cached_images,
+        pad_val=114.0),
+    dict(
+        type='mmdet.RandomResize',
+        # img_scale is (width, height)
+        scale=(img_scale[0] * 2, img_scale[1] * 2),
+        ratio_range=random_resize_ratio_range,
+        resize_type='mmdet.Resize',
+        keep_ratio=True),
+    dict(type='mmdet.RandomCrop', crop_size=img_scale),
+    dict(type='mmdet.YOLOXHSVRandomAug'),
+    dict(type='mmdet.RandomFlip', prob=0.5),
+    dict(type='mmdet.Pad', size=img_scale, pad_val=dict(img=(114, 114, 114))),
+    dict(
+        type='YOLOv5MixUp',
+        use_cached=True,
+        max_cached_images=mixup_max_cached_images),
+    dict(type='mmdet.PackDetInputs')
+]
+
+train_pipeline_stage2 = [
+    dict(type='LoadImageFromFile', backend_args=_base_.backend_args),
+    dict(type='LoadAnnotations', with_bbox=True),
+    dict(
+        type='mmdet.RandomResize',
+        scale=img_scale,
+        ratio_range=random_resize_ratio_range,
+        resize_type='mmdet.Resize',
+        keep_ratio=True),
+    dict(type='mmdet.RandomCrop', crop_size=img_scale),
+    dict(type='mmdet.YOLOXHSVRandomAug'),
+    dict(type='mmdet.RandomFlip', prob=0.5),
+    dict(type='mmdet.Pad', size=img_scale, pad_val=dict(img=(114, 114, 114))),
+    dict(type='mmdet.PackDetInputs')
+]
+
+test_pipeline = [
+    dict(type='LoadImageFromFile', backend_args=_base_.backend_args),
+    dict(type='YOLOv5KeepRatioResize', scale=img_scale),
+    dict(
+        type='LetterResize',
+        scale=img_scale,
+        allow_scale_up=False,
+        pad_val=dict(img=114)),
+    dict(type='LoadAnnotations', with_bbox=True, _scope_='mmdet'),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                   'scale_factor', 'pad_param'))
+]
+
+train_dataloader = dict(
+    batch_size=train_batch_size_per_gpu,
+    num_workers=train_num_workers,
+    persistent_workers=persistent_workers,
+    pin_memory=True,
+    collate_fn=dict(type='yolov5_collate'),
+    sampler=dict(type='DefaultSampler', shuffle=True),
+    dataset=dict(
+        type=dataset_type,
+        data_root=data_root,
+        ann_file=train_ann_file,
+        data_prefix=dict(img=train_data_prefix),
+        filter_cfg=dict(filter_empty_gt=True, min_size=32),
+        pipeline=train_pipeline))
+
+val_dataloader = dict(
+    batch_size=val_batch_size_per_gpu,
+    num_workers=val_num_workers,
+    persistent_workers=persistent_workers,
+    pin_memory=True,
+    drop_last=False,
+    sampler=dict(type='DefaultSampler', shuffle=False),
+    dataset=dict(
+        type=dataset_type,
+        data_root=data_root,
+        ann_file=val_ann_file,
+        data_prefix=dict(img=val_data_prefix),
+        test_mode=True,
+        batch_shapes_cfg=batch_shapes_cfg,
+        pipeline=test_pipeline))
+
+test_dataloader = val_dataloader
+
+# Reduce evaluation time
+val_evaluator = dict(
+    type='mmdet.CocoMetric',
+    proposal_nums=(100, 1, 10),
+    ann_file=data_root + val_ann_file,
+    metric='bbox')
+test_evaluator = val_evaluator
+
+# optimizer
+optim_wrapper = dict(
+    type='OptimWrapper',
+    optimizer=dict(type='AdamW', lr=base_lr, weight_decay=weight_decay),
+    paramwise_cfg=dict(
+        norm_decay_mult=0, bias_decay_mult=0, bypass_duplicate=True))
+
+# learning rate
+param_scheduler = [
+    dict(
+        type='LinearLR',
+        start_factor=lr_start_factor,
+        by_epoch=False,
+        begin=0,
+        end=1000),
+    dict(
+        # use cosine lr from 150 to 300 epoch
+        type='CosineAnnealingLR',
+        eta_min=base_lr * 0.05,
+        begin=max_epochs // 2,
+        end=max_epochs,
+        T_max=max_epochs // 2,
+        by_epoch=True,
+        convert_to_iter_based=True),
+]
+
+# hooks
+default_hooks = dict(
+    checkpoint=dict(
+        type='CheckpointHook',
+        interval=save_checkpoint_intervals,
+        max_keep_ckpts=max_keep_ckpts  # only keep latest 3 checkpoints
+    ))
+
+custom_hooks = [
+    dict(
+        type='EMAHook',
+        ema_type='ExpMomentumEMA',
+        momentum=0.0002,
+        update_buffers=True,
+        strict_load=False,
+        priority=49),
+    dict(
+        type='mmdet.PipelineSwitchHook',
+        switch_epoch=max_epochs - num_epochs_stage2,
+        switch_pipeline=train_pipeline_stage2)
+]
+
+train_cfg = dict(
+    type='EpochBasedTrainLoop',
+    max_epochs=max_epochs,
+    val_interval=save_checkpoint_intervals,
+    dynamic_intervals=[(max_epochs - num_epochs_stage2, val_interval_stage2)])
+
+val_cfg = dict(type='ValLoop')
+test_cfg = dict(type='TestLoop')
diff --git a/mmdetection_practice/third_party/mmyolo/configs/rtmdet/rtmdet_m_syncbn_fast_8xb32-300e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/rtmdet/rtmdet_m_syncbn_fast_8xb32-300e_coco.py
new file mode 100644
index 0000000..52576bf
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/rtmdet/rtmdet_m_syncbn_fast_8xb32-300e_coco.py
@@ -0,0 +1,11 @@
+_base_ = './rtmdet_l_syncbn_fast_8xb32-300e_coco.py'
+
+# ========================modified parameters======================
+deepen_factor = 0.67
+widen_factor = 0.75
+
+# =======================Unmodified in most cases==================
+model = dict(
+    backbone=dict(deepen_factor=deepen_factor, widen_factor=widen_factor),
+    neck=dict(deepen_factor=deepen_factor, widen_factor=widen_factor),
+    bbox_head=dict(head_module=dict(widen_factor=widen_factor)))
diff --git a/mmdetection_practice/third_party/mmyolo/configs/rtmdet/rtmdet_s_syncbn_fast_8xb32-300e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/rtmdet/rtmdet_s_syncbn_fast_8xb32-300e_coco.py
new file mode 100644
index 0000000..8cead78
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/rtmdet/rtmdet_s_syncbn_fast_8xb32-300e_coco.py
@@ -0,0 +1,92 @@
+_base_ = './rtmdet_l_syncbn_fast_8xb32-300e_coco.py'
+checkpoint = 'https://download.openmmlab.com/mmdetection/v3.0/rtmdet/cspnext_rsb_pretrain/cspnext-s_imagenet_600e.pth'  # noqa
+
+# ========================modified parameters======================
+deepen_factor = 0.33
+widen_factor = 0.5
+img_scale = _base_.img_scale
+
+# ratio range for random resize
+random_resize_ratio_range = (0.5, 2.0)
+# Number of cached images in mosaic
+mosaic_max_cached_images = 40
+# Number of cached images in mixup
+mixup_max_cached_images = 20
+
+# =======================Unmodified in most cases==================
+model = dict(
+    backbone=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+        # Since the checkpoint includes CUDA:0 data,
+        # it must be forced to set map_location.
+        # Once checkpoint is fixed, it can be removed.
+        init_cfg=dict(
+            type='Pretrained',
+            prefix='backbone.',
+            checkpoint=checkpoint,
+            map_location='cpu')),
+    neck=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+    ),
+    bbox_head=dict(head_module=dict(widen_factor=widen_factor)))
+
+train_pipeline = [
+    dict(type='LoadImageFromFile', backend_args=_base_.backend_args),
+    dict(type='LoadAnnotations', with_bbox=True),
+    dict(
+        type='Mosaic',
+        img_scale=img_scale,
+        use_cached=True,
+        max_cached_images=mosaic_max_cached_images,
+        pad_val=114.0),
+    dict(
+        type='mmdet.RandomResize',
+        # img_scale is (width, height)
+        scale=(img_scale[0] * 2, img_scale[1] * 2),
+        ratio_range=random_resize_ratio_range,  # note
+        resize_type='mmdet.Resize',
+        keep_ratio=True),
+    dict(type='mmdet.RandomCrop', crop_size=img_scale),
+    dict(type='mmdet.YOLOXHSVRandomAug'),
+    dict(type='mmdet.RandomFlip', prob=0.5),
+    dict(type='mmdet.Pad', size=img_scale, pad_val=dict(img=(114, 114, 114))),
+    dict(
+        type='YOLOv5MixUp',
+        use_cached=True,
+        max_cached_images=mixup_max_cached_images),
+    dict(type='mmdet.PackDetInputs')
+]
+
+train_pipeline_stage2 = [
+    dict(type='LoadImageFromFile', backend_args=_base_.backend_args),
+    dict(type='LoadAnnotations', with_bbox=True),
+    dict(
+        type='mmdet.RandomResize',
+        scale=img_scale,
+        ratio_range=random_resize_ratio_range,  # note
+        resize_type='mmdet.Resize',
+        keep_ratio=True),
+    dict(type='mmdet.RandomCrop', crop_size=img_scale),
+    dict(type='mmdet.YOLOXHSVRandomAug'),
+    dict(type='mmdet.RandomFlip', prob=0.5),
+    dict(type='mmdet.Pad', size=img_scale, pad_val=dict(img=(114, 114, 114))),
+    dict(type='mmdet.PackDetInputs')
+]
+
+train_dataloader = dict(dataset=dict(pipeline=train_pipeline))
+
+custom_hooks = [
+    dict(
+        type='EMAHook',
+        ema_type='ExpMomentumEMA',
+        momentum=0.0002,
+        update_buffers=True,
+        strict_load=False,
+        priority=49),
+    dict(
+        type='mmdet.PipelineSwitchHook',
+        switch_epoch=_base_.max_epochs - _base_.num_epochs_stage2,
+        switch_pipeline=train_pipeline_stage2)
+]
diff --git a/mmdetection_practice/third_party/mmyolo/configs/rtmdet/rtmdet_tiny_fast_1xb12-40e_cat.py b/mmdetection_practice/third_party/mmyolo/configs/rtmdet/rtmdet_tiny_fast_1xb12-40e_cat.py
new file mode 100644
index 0000000..8d1182c
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/rtmdet/rtmdet_tiny_fast_1xb12-40e_cat.py
@@ -0,0 +1,70 @@
+_base_ = 'rtmdet_tiny_syncbn_fast_8xb32-300e_coco.py'
+
+data_root = './data/cat/'
+class_name = ('cat', )
+num_classes = len(class_name)
+metainfo = dict(classes=class_name, palette=[(20, 220, 60)])
+
+num_epochs_stage2 = 5
+
+max_epochs = 40
+train_batch_size_per_gpu = 12
+train_num_workers = 4
+val_batch_size_per_gpu = 1
+val_num_workers = 2
+
+load_from = 'https://download.openmmlab.com/mmyolo/v0/rtmdet/rtmdet_tiny_syncbn_fast_8xb32-300e_coco/rtmdet_tiny_syncbn_fast_8xb32-300e_coco_20230102_140117-dbb1dc83.pth'  # noqa
+
+model = dict(
+    backbone=dict(frozen_stages=4),
+    bbox_head=dict(head_module=dict(num_classes=num_classes)),
+    train_cfg=dict(assigner=dict(num_classes=num_classes)))
+
+train_dataloader = dict(
+    batch_size=train_batch_size_per_gpu,
+    num_workers=train_num_workers,
+    dataset=dict(
+        data_root=data_root,
+        metainfo=metainfo,
+        ann_file='annotations/trainval.json',
+        data_prefix=dict(img='images/')))
+
+val_dataloader = dict(
+    batch_size=val_batch_size_per_gpu,
+    num_workers=val_num_workers,
+    dataset=dict(
+        metainfo=metainfo,
+        data_root=data_root,
+        ann_file='annotations/test.json',
+        data_prefix=dict(img='images/')))
+
+test_dataloader = val_dataloader
+
+param_scheduler = [
+    dict(
+        type='LinearLR',
+        start_factor=_base_.lr_start_factor,
+        by_epoch=False,
+        begin=0,
+        end=30),
+    dict(
+        # use cosine lr from 150 to 300 epoch
+        type='CosineAnnealingLR',
+        eta_min=_base_.base_lr * 0.05,
+        begin=max_epochs // 2,
+        end=max_epochs,
+        T_max=max_epochs // 2,
+        by_epoch=True,
+        convert_to_iter_based=True),
+]
+
+_base_.custom_hooks[1].switch_epoch = max_epochs - num_epochs_stage2
+
+val_evaluator = dict(ann_file=data_root + 'annotations/test.json')
+test_evaluator = val_evaluator
+
+default_hooks = dict(
+    checkpoint=dict(interval=10, max_keep_ckpts=2, save_best='auto'),
+    logger=dict(type='LoggerHook', interval=5))
+train_cfg = dict(max_epochs=max_epochs, val_interval=10)
+# visualizer = dict(vis_backends = [dict(type='LocalVisBackend'), dict(type='WandbVisBackend')]) # noqa
diff --git a/mmdetection_practice/third_party/mmyolo/configs/rtmdet/rtmdet_tiny_syncbn_fast_8xb32-300e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/rtmdet/rtmdet_tiny_syncbn_fast_8xb32-300e_coco.py
new file mode 100644
index 0000000..257110d
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/rtmdet/rtmdet_tiny_syncbn_fast_8xb32-300e_coco.py
@@ -0,0 +1,58 @@
+_base_ = './rtmdet_s_syncbn_fast_8xb32-300e_coco.py'
+checkpoint = 'https://download.openmmlab.com/mmdetection/v3.0/rtmdet/cspnext_rsb_pretrain/cspnext-tiny_imagenet_600e.pth'  # noqa
+
+# ========================modified parameters======================
+deepen_factor = 0.167
+widen_factor = 0.375
+img_scale = _base_.img_scale
+
+# ratio range for random resize
+random_resize_ratio_range = (0.5, 2.0)
+# Number of cached images in mosaic
+mosaic_max_cached_images = 20
+# Number of cached images in mixup
+mixup_max_cached_images = 10
+
+# =======================Unmodified in most cases==================
+model = dict(
+    backbone=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+        init_cfg=dict(checkpoint=checkpoint)),
+    neck=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+    ),
+    bbox_head=dict(head_module=dict(widen_factor=widen_factor)))
+
+train_pipeline = [
+    dict(type='LoadImageFromFile', backend_args=_base_.backend_args),
+    dict(type='LoadAnnotations', with_bbox=True),
+    dict(
+        type='Mosaic',
+        img_scale=img_scale,
+        use_cached=True,
+        max_cached_images=mosaic_max_cached_images,  # note
+        random_pop=False,  # note
+        pad_val=114.0),
+    dict(
+        type='mmdet.RandomResize',
+        # img_scale is (width, height)
+        scale=(img_scale[0] * 2, img_scale[1] * 2),
+        ratio_range=random_resize_ratio_range,
+        resize_type='mmdet.Resize',
+        keep_ratio=True),
+    dict(type='mmdet.RandomCrop', crop_size=img_scale),
+    dict(type='mmdet.YOLOXHSVRandomAug'),
+    dict(type='mmdet.RandomFlip', prob=0.5),
+    dict(type='mmdet.Pad', size=img_scale, pad_val=dict(img=(114, 114, 114))),
+    dict(
+        type='YOLOv5MixUp',
+        use_cached=True,
+        random_pop=False,
+        max_cached_images=mixup_max_cached_images,
+        prob=0.5),
+    dict(type='mmdet.PackDetInputs')
+]
+
+train_dataloader = dict(dataset=dict(pipeline=train_pipeline))
diff --git a/mmdetection_practice/third_party/mmyolo/configs/rtmdet/rtmdet_x_syncbn_fast_8xb32-300e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/rtmdet/rtmdet_x_syncbn_fast_8xb32-300e_coco.py
new file mode 100644
index 0000000..7fc9001
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/rtmdet/rtmdet_x_syncbn_fast_8xb32-300e_coco.py
@@ -0,0 +1,11 @@
+_base_ = './rtmdet_l_syncbn_fast_8xb32-300e_coco.py'
+
+# ========================modified parameters======================
+deepen_factor = 1.33
+widen_factor = 1.25
+
+# =======================Unmodified in most cases==================
+model = dict(
+    backbone=dict(deepen_factor=deepen_factor, widen_factor=widen_factor),
+    neck=dict(deepen_factor=deepen_factor, widen_factor=widen_factor),
+    bbox_head=dict(head_module=dict(widen_factor=widen_factor)))
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov5/README.md b/mmdetection_practice/third_party/mmyolo/configs/yolov5/README.md
new file mode 100644
index 0000000..bd33e83
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov5/README.md
@@ -0,0 +1,146 @@
+# YOLOv5
+
+<!-- [ALGORITHM] -->
+
+## Abstract
+
+YOLOv5 is a family of object detection architectures and models pretrained on the COCO dataset, and represents Ultralytics open-source research into future vision AI methods, incorporating lessons learned and best practices evolved over thousands of hours of research and development.
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/27466624/200000324-70ae078f-cea7-4189-8baa-440656797dad.jpg"/>
+YOLOv5-l-P5 model structure
+</div>
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/27466624/211143533-1725c1b2-6189-4c3a-a046-ad968e03cb9d.jpg"/>
+YOLOv5-l-P6 model structure
+</div>
+
+## Results and models
+
+### COCO
+
+| Backbone  | Arch | size | Mask Refine | SyncBN | AMP | Mem (GB) |   box AP    | TTA box AP |                                     Config                                      |                                                                                                                                                                                                       Download                                                                                                                                                                                                       |
+| :-------: | :--: | :--: | :---------: | :----: | :-: | :------: | :---------: | :--------: | :-----------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: |
+| YOLOv5-n  |  P5  | 640  |     No      |  Yes   | Yes |   1.5    |    28.0     |    30.7    |             [config](./yolov5_n-v61_syncbn_fast_8xb16-300e_coco.py)             |                                     [model](https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_n-v61_syncbn_fast_8xb16-300e_coco/yolov5_n-v61_syncbn_fast_8xb16-300e_coco_20220919_090739-b804c1ad.pth) \| [log](https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_n-v61_syncbn_fast_8xb16-300e_coco/yolov5_n-v61_syncbn_fast_8xb16-300e_coco_20220919_090739.log.json)                                     |
+| YOLOv5-n  |  P5  | 640  |     Yes     |  Yes   | Yes |   1.5    |    28.0     |            | [config](./mask_refine/yolov5_n_mask-refine-v61_syncbn_fast_8xb16-300e_coco.py) | [model](https://download.openmmlab.com/mmyolo/v0/yolov5/mask_refine/yolov5_n_mask-refine-v61_syncbn_fast_8xb16-300e_coco/yolov5_n_mask-refine-v61_syncbn_fast_8xb16-300e_coco_20230305_152706-712fb1b2.pth) \| [log](https://download.openmmlab.com/mmyolo/v0/yolov5/mask_refine/yolov5_n_mask-refine-v61_syncbn_fast_8xb16-300e_coco/yolov5_n_mask-refine-v61_syncbn_fast_8xb16-300e_coco_20230305_152706.log.json) |
+| YOLOv5u-n |  P5  | 640  |     Yes     |  Yes   | Yes |          |             |            | [config](./yolov5/yolov5u/yolov5_n_mask-refine_syncbn_fast_8xb16-300e_coco.py)  |                                                                                                                                                                                               [model](<>) \| [log](<>)                                                                                                                                                                                               |
+| YOLOv5-s  |  P5  | 640  |     No      |  Yes   | Yes |   2.7    |    37.7     |    40.2    |             [config](./yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py)             |                                     [model](https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth) \| [log](https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700.log.json)                                     |
+| YOLOv5-s  |  P5  | 640  |     Yes     |  Yes   | Yes |   2.7    | 38.0 (+0.3) |            | [config](./mask_refine/yolov5_s_mask-refine-v61_syncbn_fast_8xb16-300e_coco.py) | [model](https://download.openmmlab.com/mmyolo/v0/yolov5/mask_refine/yolov5_s_mask-refine-v61_syncbn_fast_8xb16-300e_coco/yolov5_s_mask-refine-v61_syncbn_fast_8xb16-300e_coco_20230304_033134-8e0cd271.pth) \| [log](https://download.openmmlab.com/mmyolo/v0/yolov5/mask_refine/yolov5_s_mask-refine-v61_syncbn_fast_8xb16-300e_coco/yolov5_s_mask-refine-v61_syncbn_fast_8xb16-300e_coco_20230304_033134.log.json) |
+| YOLOv5u-s |  P5  | 640  |     Yes     |  Yes   | Yes |          |             |            | [config](./yolov5/yolov5u/yolov5_s_mask-refine_syncbn_fast_8xb16-300e_coco.py)  |                                                                                                                                                                                               [model](<>) \| [log](<>)                                                                                                                                                                                               |
+| YOLOv5-m  |  P5  | 640  |     No      |  Yes   | Yes |   5.0    |    45.3     |    46.9    |             [config](./yolov5_m-v61_syncbn_fast_8xb16-300e_coco.py)             |                                     [model](https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_m-v61_syncbn_fast_8xb16-300e_coco/yolov5_m-v61_syncbn_fast_8xb16-300e_coco_20220917_204944-516a710f.pth) \| [log](https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_m-v61_syncbn_fast_8xb16-300e_coco/yolov5_m-v61_syncbn_fast_8xb16-300e_coco_20220917_204944.log.json)                                     |
+| YOLOv5-m  |  P5  | 640  |     Yes     |  Yes   | Yes |   5.0    |    45.3     |            | [config](./mask_refine/yolov5_m_mask-refine-v61_syncbn_fast_8xb16-300e_coco.py) | [model](https://download.openmmlab.com/mmyolo/v0/yolov5/mask_refine/yolov5_m_mask-refine-v61_syncbn_fast_8xb16-300e_coco/yolov5_m_mask-refine-v61_syncbn_fast_8xb16-300e_coco_20230305_153946-44e96155.pth) \| [log](https://download.openmmlab.com/mmyolo/v0/yolov5/mask_refine/yolov5_m_mask-refine-v61_syncbn_fast_8xb16-300e_coco/yolov5_m_mask-refine-v61_syncbn_fast_8xb16-300e_coco_20230305_153946.log.json) |
+| YOLOv5u-m |  P5  | 640  |     Yes     |  Yes   | Yes |          |             |            | [config](./yolov5/yolov5u/yolov5_m_mask-refine_syncbn_fast_8xb16-300e_coco.py)  |                                                                                                                                                                                               [model](<>) \| [log](<>)                                                                                                                                                                                               |
+| YOLOv5-l  |  P5  | 640  |     No      |  Yes   | Yes |   8.1    |    48.8     |    49.9    |             [config](./yolov5_l-v61_syncbn_fast_8xb16-300e_coco.py)             |                                     [model](https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_l-v61_syncbn_fast_8xb16-300e_coco/yolov5_l-v61_syncbn_fast_8xb16-300e_coco_20220917_031007-096ef0eb.pth) \| [log](https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_l-v61_syncbn_fast_8xb16-300e_coco/yolov5_l-v61_syncbn_fast_8xb16-300e_coco_20220917_031007.log.json)                                     |
+| YOLOv5-l  |  P5  | 640  |     Yes     |  Yes   | Yes |   8.1    | 49.3 (+0.5) |            | [config](./mask_refine/yolov5_l_mask-refine-v61_syncbn_fast_8xb16-300e_coco.py) | [model](https://download.openmmlab.com/mmyolo/v0/yolov5/mask_refine/yolov5_l_mask-refine-v61_syncbn_fast_8xb16-300e_coco/yolov5_l_mask-refine-v61_syncbn_fast_8xb16-300e_coco_20230305_154301-2c1d912a.pth) \| [log](https://download.openmmlab.com/mmyolo/v0/yolov5/mask_refine/yolov5_l_mask-refine-v61_syncbn_fast_8xb16-300e_coco/yolov5_l_mask-refine-v61_syncbn_fast_8xb16-300e_coco_20230305_154301.log.json) |
+| YOLOv5u-l |  P5  | 640  |     Yes     |  Yes   | Yes |          |             |            | [config](./yolov5/yolov5u/yolov5_l_mask-refine_syncbn_fast_8xb16-300e_coco.py)  |                                                                                                                                                                                               [model](<>) \| [log](<>)                                                                                                                                                                                               |
+| YOLOv5-x  |  P5  | 640  |     No      |  Yes   | Yes |   12.2   |    50.2     |            |             [config](./yolov5_x-v61_syncbn_fast_8xb16-300e_coco.py)             |                                     [model](https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_x-v61_syncbn_fast_8xb16-300e_coco/yolov5_x-v61_syncbn_fast_8xb16-300e_coco_20230305_152943-00776a4b.pth) \| [log](https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_x-v61_syncbn_fast_8xb16-300e_coco/yolov5_x-v61_syncbn_fast_8xb16-300e_coco_20230305_152943.log.json)                                     |
+| YOLOv5-x  |  P5  | 640  |     Yes     |  Yes   | Yes |   12.2   | 50.9 (+0.7) |            | [config](./mask_refine/yolov5_x_mask-refine-v61_syncbn_fast_8xb16-300e_coco.py) | [model](https://download.openmmlab.com/mmyolo/v0/yolov5/mask_refine/yolov5_x_mask-refine-v61_syncbn_fast_8xb16-300e_coco/yolov5_x_mask-refine-v61_syncbn_fast_8xb16-300e_coco_20230305_154321-07edeb62.pth) \| [log](https://download.openmmlab.com/mmyolo/v0/yolov5/mask_refine/yolov5_x_mask-refine-v61_syncbn_fast_8xb16-300e_coco/yolov5_x_mask-refine-v61_syncbn_fast_8xb16-300e_coco_20230305_154321.log.json) |
+| YOLOv5u-x |  P5  | 640  |     Yes     |  Yes   | Yes |          |             |            | [config](./yolov5/yolov5u/yolov5_x_mask-refine_syncbn_fast_8xb16-300e_coco.py)  |                                                                                                                                                                                               [model](<>) \| [log](<>)                                                                                                                                                                                               |
+| YOLOv5-n  |  P6  | 1280 |     No      |  Yes   | Yes |   5.8    |    35.9     |            |           [config](./yolov5_n-p6-v62_syncbn_fast_8xb16-300e_coco.py)            |                               [model](https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_n-p6-v62_syncbn_fast_8xb16-300e_coco/yolov5_n-p6-v62_syncbn_fast_8xb16-300e_coco_20221027_224705-d493c5f3.pth) \| [log](https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_n-p6-v62_syncbn_fast_8xb16-300e_coco/yolov5_n-p6-v62_syncbn_fast_8xb16-300e_coco_20221027_224705.log.json)                               |
+| YOLOv5-s  |  P6  | 1280 |     No      |  Yes   | Yes |   10.5   |    44.4     |            |           [config](./yolov5_s-p6-v62_syncbn_fast_8xb16-300e_coco.py)            |                               [model](https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_s-p6-v62_syncbn_fast_8xb16-300e_coco/yolov5_s-p6-v62_syncbn_fast_8xb16-300e_coco_20221027_215044-58865c19.pth) \| [log](https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_s-p6-v62_syncbn_fast_8xb16-300e_coco/yolov5_s-p6-v62_syncbn_fast_8xb16-300e_coco_20221027_215044.log.json)                               |
+| YOLOv5-m  |  P6  | 1280 |     No      |  Yes   | Yes |   19.1   |    51.3     |            |           [config](./yolov5_m-p6-v62_syncbn_fast_8xb16-300e_coco.py)            |                               [model](https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_m-p6-v62_syncbn_fast_8xb16-300e_coco/yolov5_m-p6-v62_syncbn_fast_8xb16-300e_coco_20221027_230453-49564d58.pth) \| [log](https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_m-p6-v62_syncbn_fast_8xb16-300e_coco/yolov5_m-p6-v62_syncbn_fast_8xb16-300e_coco_20221027_230453.log.json)                               |
+| YOLOv5-l  |  P6  | 1280 |     No      |  Yes   | Yes |   30.5   |    53.7     |            |           [config](./yolov5_l-p6-v62_syncbn_fast_8xb16-300e_coco.py)            |                               [model](https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_l-p6-v62_syncbn_fast_8xb16-300e_coco/yolov5_l-p6-v62_syncbn_fast_8xb16-300e_coco_20221027_234308-7a2ba6bf.pth) \| [log](https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_l-p6-v62_syncbn_fast_8xb16-300e_coco/yolov5_l-p6-v62_syncbn_fast_8xb16-300e_coco_20221027_234308.log.json)                               |
+
+**Note**:
+
+1. `fast` means that `YOLOv5DetDataPreprocessor` and `yolov5_collate` are used for data preprocessing, which is faster for training, but less flexible for multitasking. Recommended to use fast version config if you only care about object detection.
+2. `detect` means that the network input is fixed to `640x640` and the post-processing thresholds is modified.
+3. `SyncBN` means use SyncBN, `AMP` indicates training with mixed precision.
+4. We use 8x A100 for training, and the single-GPU batch size is 16. This is different from the official code.
+5. The performance is unstable and may fluctuate by about 0.4 mAP and the highest performance weight in `COCO` training in `YOLOv5` may not be the last epoch.
+6. `TTA` means that Test Time Augmentation. It's perform 3 multi-scaling transformations on the image, followed by 2 flipping transformations (flipping and not flipping). You only need to specify `--tta` when testing to enable.  see [TTA](https://github.com/open-mmlab/mmyolo/blob/dev/docs/en/common_usage/tta.md) for details.
+7. The performance of `Mask Refine` training is for the weight performance officially released by YOLOv5. `Mask Refine` means refining bbox by mask while loading annotations and transforming after `YOLOv5RandomAffine`, `Copy Paste` means using `YOLOv5CopyPaste`.
+8. `YOLOv5u` models use the same loss functions and split Detect head as `YOLOv8` models for improved performance, but only requires 300 epochs.
+
+### COCO Instance segmentation
+
+|       Backbone        | Arch | size | SyncBN | AMP | Mem (GB) | Box AP | Mask AP |                                          Config                                          |                                                                                                                                                                                                                             Download                                                                                                                                                                                                                             |
+| :-------------------: | :--: | :--: | :----: | :-: | :------: | :----: | :-----: | :--------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: |
+|       YOLOv5-n        |  P5  | 640  |  Yes   | Yes |   3.3    |  27.9  |  23.7   |       [config](./ins_seg/yolov5_ins_n-v61_syncbn_fast_8xb16-300e_coco_instance.py)       |                         [model](https://download.openmmlab.com/mmyolo/v0/yolov5/ins_seg/yolov5_ins_n-v61_syncbn_fast_8xb16-300e_coco_instance/yolov5_ins_n-v61_syncbn_fast_8xb16-300e_coco_instance_20230424_104807-84cc9240.pth) \| [log](https://download.openmmlab.com/mmyolo/v0/yolov5/ins_seg/yolov5_ins_n-v61_syncbn_fast_8xb16-300e_coco_instance/yolov5_ins_n-v61_syncbn_fast_8xb16-300e_coco_instance_20230424_104807.log.json)                         |
+|       YOLOv5-s        |  P5  | 640  |  Yes   | Yes |   4.8    |  38.1  |  32.0   |       [config](./ins_seg/yolov5_ins_s-v61_syncbn_fast_8xb16-300e_coco_instance.py)       |                         [model](https://download.openmmlab.com/mmyolo/v0/yolov5/ins_seg/yolov5_ins_s-v61_syncbn_fast_8xb16-300e_coco_instance/yolov5_ins_s-v61_syncbn_fast_8xb16-300e_coco_instance_20230426_012542-3e570436.pth) \| [log](https://download.openmmlab.com/mmyolo/v0/yolov5/ins_seg/yolov5_ins_s-v61_syncbn_fast_8xb16-300e_coco_instance/yolov5_ins_s-v61_syncbn_fast_8xb16-300e_coco_instance_20230426_012542.log.json)                         |
+| YOLOv5-s(non-overlap) |  P5  | 640  |  Yes   | Yes |   4.8    |  38.0  |  32.1   | [config](./ins_seg/yolov5_ins_s-v61_syncbn_fast_non_overlap_8xb16-300e_coco_instance.py) | [model](https://download.openmmlab.com/mmyolo/v0/yolov5/ins_seg/yolov5_ins_s-v61_syncbn_fast_non_overlap_8xb16-300e_coco_instance/yolov5_ins_s-v61_syncbn_fast_non_overlap_8xb16-300e_coco_instance_20230424_104642-6780d34e.pth) \| [log](https://download.openmmlab.com/mmyolo/v0/yolov5/ins_seg/yolov5_ins_s-v61_syncbn_fast_non_overlap_8xb16-300e_coco_instance/yolov5_ins_s-v61_syncbn_fast_non_overlap_8xb16-300e_coco_instance_20230424_104642.log.json) |
+|       YOLOv5-m        |  P5  | 640  |  Yes   | Yes |   7.3    |  45.1  |  37.3   |       [config](./ins_seg/yolov5_ins_m-v61_syncbn_fast_8xb16-300e_coco_instance.py)       |                         [model](https://download.openmmlab.com/mmyolo/v0/yolov5/ins_seg/yolov5_ins_m-v61_syncbn_fast_8xb16-300e_coco_instance/yolov5_ins_m-v61_syncbn_fast_8xb16-300e_coco_instance_20230424_111529-ef5ba1a9.pth) \| [log](https://download.openmmlab.com/mmyolo/v0/yolov5/ins_seg/yolov5_ins_m-v61_syncbn_fast_8xb16-300e_coco_instance/yolov5_ins_m-v61_syncbn_fast_8xb16-300e_coco_instance_20230424_111529.log.json)                         |
+|       YOLOv5-l        |  P5  | 640  |  Yes   | Yes |   10.7   |  48.8  |  39.9   |       [config](./ins_seg/yolov5_ins_l-v61_syncbn_fast_8xb16-300e_coco_instance.py)       |                         [model](https://download.openmmlab.com/mmyolo/v0/yolov5/ins_seg/yolov5_ins_l-v61_syncbn_fast_8xb16-300e_coco_instance/yolov5_ins_l-v61_syncbn_fast_8xb16-300e_coco_instance_20230508_104049-daa09f70.pth) \| [log](https://download.openmmlab.com/mmyolo/v0/yolov5/ins_seg/yolov5_ins_l-v61_syncbn_fast_8xb16-300e_coco_instance/yolov5_ins_l-v61_syncbn_fast_8xb16-300e_coco_instance_20230508_104049.log.json)                         |
+|       YOLOv5-x        |  P5  | 640  |  Yes   | Yes |   15.0   |  50.6  |  41.4   |       [config](./ins_seg/yolov5_ins_x-v61_syncbn_fast_8xb16-300e_coco_instance.py)       |                         [model](https://download.openmmlab.com/mmyolo/v0/yolov5/ins_seg/yolov5_ins_x-v61_syncbn_fast_8xb16-300e_coco_instance/yolov5_ins_x-v61_syncbn_fast_8xb16-300e_coco_instance_20230508_103925-a260c798.pth) \| [log](https://download.openmmlab.com/mmyolo/v0/yolov5/ins_seg/yolov5_ins_x-v61_syncbn_fast_8xb16-300e_coco_instance/yolov5_ins_x-v61_syncbn_fast_8xb16-300e_coco_instance_20230508_103925.log.json)                         |
+
+**Note**:
+
+1. `Non-overlap` refers to the instance-level masks being stored in the format (num_instances, h, w) instead of (h, w). Storing masks in overlap format consumes less memory and GPU memory.
+2. For the M model, the `affine_scale` parameter should be 0.9, but due to some reason, we set it to 0.5 and found that the mAP did not change. Therefore, the released M model has an `affine_scale` parameter of 0.5, which is inconsistent with the value of 0.9 in the configuration.
+
+### VOC
+
+| Backbone | size | Batchsize | AMP | Mem (GB) | box AP(COCO metric) |                          Config                           |                                                                                                                                                 Download                                                                                                                                                 |
+| :------: | :--: | :-------: | :-: | :------: | :-----------------: | :-------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: |
+| YOLOv5-n | 512  |    64     | Yes |   3.5    |        51.2         | [config](./yolov5/voc/yolov5_n-v61_fast_1xb64-50e_voc.py) | [model](https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_n-v61_fast_1xb64-50e_voc/yolov5_n-v61_fast_1xb64-50e_voc_20221017_234254-f1493430.pth) \| [log](https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_n-v61_fast_1xb64-50e_voc/yolov5_n-v61_fast_1xb64-50e_voc_20221017_234254.log.json) |
+| YOLOv5-s | 512  |    64     | Yes |   6.5    |        62.7         | [config](./yolov5/voc/yolov5_s-v61_fast_1xb64-50e_voc.py) | [model](https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_s-v61_fast_1xb64-50e_voc/yolov5_s-v61_fast_1xb64-50e_voc_20221017_234156-0009b33e.pth) \| [log](https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_s-v61_fast_1xb64-50e_voc/yolov5_s-v61_fast_1xb64-50e_voc_20221017_234156.log.json) |
+| YOLOv5-m | 512  |    64     | Yes |   12.0   |        70.1         | [config](./yolov5/voc/yolov5_m-v61_fast_1xb64-50e_voc.py) | [model](https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_m-v61_fast_1xb64-50e_voc/yolov5_m-v61_fast_1xb64-50e_voc_20221017_114138-815c143a.pth) \| [log](https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_m-v61_fast_1xb64-50e_voc/yolov5_m-v61_fast_1xb64-50e_voc_20221017_114138.log.json) |
+| YOLOv5-l | 512  |    32     | Yes |   10.0   |        73.1         | [config](./yolov5/voc/yolov5_l-v61_fast_1xb32-50e_voc.py) | [model](https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_l-v61_fast_1xb32-50e_voc/yolov5_l-v61_fast_1xb32-50e_voc_20221017_045500-edc7e0d8.pth) \| [log](https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_l-v61_fast_1xb32-50e_voc/yolov5_l-v61_fast_1xb32-50e_voc_20221017_045500.log.json) |
+
+**Note**:
+
+1. Training on VOC dataset need pretrained model which trained on COCO.
+2. The performance is unstable and may fluctuate by about 0.4 mAP.
+3. Official YOLOv5 use COCO metric, while training VOC dataset.
+4. We converted the VOC test dataset to COCO format offline, while reproducing mAP result as shown above. We will support to use COCO metric while training VOC dataset in later version.
+5. Hyperparameter reference from `https://wandb.ai/glenn-jocher/YOLOv5_VOC_official`.
+
+### CrowdHuman
+
+Since the `iscrowd` annotation of the COCO dataset is not equivalent to `ignore`, we use the CrowdHuman dataset to verify that the YOLOv5 ignore logic is correct.
+
+| Backbone | size | SyncBN | AMP | Mem (GB) | ignore_iof_thr | box AP50(CrowDHuman Metric) |  MR  |  JI   |                                   Config                                   | Download |
+| :------: | :--: | :----: | :-: | :------: | :------------: | :-------------------------: | :--: | :---: | :------------------------------------------------------------------------: | :------: |
+| YOLOv5-s | 640  |  Yes   | Yes |   2.6    |       -1       |            85.79            | 48.7 | 75.33 |  [config](./yolov5/crowdhuman/yolov5_s-v61_fast_8xb16-300e_crowdhuman.py)  |          |
+| YOLOv5-s | 640  |  Yes   | Yes |   2.6    |      0.5       |            86.17            | 48.8 | 75.87 | [config](./yolov5/crowdhuman/yolov5_s-v61_8xb16-300e_ignore_crowdhuman.py) |          |
+
+**Note**:
+
+1. `ignore_iof_thr` is -1 indicating that the ignore tag is not considered. We adjusted with `ignore_iof_thr` thresholds of 0.5, 0.8, 0.9, and the results show that 0.5 has the best performance.
+2. The above table shows the performance of the model with the best performance on the validation set. The best performing models are around 160+ epoch which means that there is no need to train so many epochs.
+3. This is a very simple implementation that simply replaces COCO's anchor with the `tools/analysis_tools/optimize_anchors.py` script. We'll adjust other parameters later to improve performance.
+
+## Citation
+
+```latex
+@software{glenn_jocher_2022_7002879,
+  author       = {Glenn Jocher and
+                  Ayush Chaurasia and
+                  Alex Stoken and
+                  Jirka Borovec and
+                  NanoCode012 and
+                  Yonghye Kwon and
+                  TaoXie and
+                  Kalen Michael and
+                  Jiacong Fang and
+                  imyhxy and
+                  Lorna and
+                  Colin Wong and
+                  曾逸夫(Zeng Yifu) and
+                  Abhiram V and
+                  Diego Montes and
+                  Zhiqiang Wang and
+                  Cristi Fati and
+                  Jebastin Nadar and
+                  Laughing and
+                  UnglvKitDe and
+                  tkianai and
+                  yxNONG and
+                  Piotr Skalski and
+                  Adam Hogan and
+                  Max Strobel and
+                  Mrinal Jain and
+                  Lorenzo Mammana and
+                  xylieong},
+  title        = {{ultralytics/yolov5: v6.2 - YOLOv5 Classification
+                   Models, Apple M1, Reproducibility, ClearML and
+                   Deci.ai integrations}},
+  month        = aug,
+  year         = 2022,
+  publisher    = {Zenodo},
+  version      = {v6.2},
+  doi          = {10.5281/zenodo.7002879},
+  url          = {https://doi.org/10.5281/zenodo.7002879}
+}
+```
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov5/crowdhuman/yolov5_s-v61_8xb16-300e_ignore_crowdhuman.py b/mmdetection_practice/third_party/mmyolo/configs/yolov5/crowdhuman/yolov5_s-v61_8xb16-300e_ignore_crowdhuman.py
new file mode 100644
index 0000000..85b3719
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov5/crowdhuman/yolov5_s-v61_8xb16-300e_ignore_crowdhuman.py
@@ -0,0 +1,63 @@
+_base_ = 'yolov5_s-v61_fast_8xb16-300e_crowdhuman.py'
+
+model = dict(
+    data_preprocessor=dict(
+        _delete_=True,
+        type='mmdet.DetDataPreprocessor',
+        mean=[0., 0., 0.],
+        std=[255., 255., 255.],
+        bgr_to_rgb=True),
+    bbox_head=dict(ignore_iof_thr=0.5))
+
+img_scale = _base_.img_scale
+
+albu_train_transforms = [
+    dict(type='Blur', p=0.01),
+    dict(type='MedianBlur', p=0.01),
+    dict(type='ToGray', p=0.01),
+    dict(type='CLAHE', p=0.01)
+]
+
+pre_transform = [
+    dict(type='LoadImageFromFile', backend_args=_base_.backend_args),
+    # only change this
+    dict(type='mmdet.LoadAnnotations', with_bbox=True)
+]
+
+train_pipeline = [
+    *pre_transform,
+    dict(
+        type='Mosaic',
+        img_scale=img_scale,
+        pad_val=114.0,
+        pre_transform=pre_transform),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        scaling_ratio_range=(0.5, 1.5),
+        # img_scale is (width, height)
+        border=(-img_scale[0] // 2, -img_scale[1] // 2),
+        border_val=(114, 114, 114)),
+    dict(
+        type='mmdet.Albu',
+        transforms=albu_train_transforms,
+        bbox_params=dict(
+            type='BboxParams',
+            format='pascal_voc',
+            label_fields=['gt_bboxes_labels', 'gt_ignore_flags']),
+        keymap={
+            'img': 'image',
+            'gt_bboxes': 'bboxes'
+        }),
+    dict(type='YOLOv5HSVRandomAug'),
+    dict(type='mmdet.RandomFlip', prob=0.5),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                   'flip_direction'))
+]
+
+train_dataloader = dict(
+    collate_fn=dict(type='pseudo_collate'),
+    dataset=dict(pipeline=train_pipeline))
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov5/crowdhuman/yolov5_s-v61_fast_8xb16-300e_crowdhuman.py b/mmdetection_practice/third_party/mmyolo/configs/yolov5/crowdhuman/yolov5_s-v61_fast_8xb16-300e_crowdhuman.py
new file mode 100644
index 0000000..a61859f
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov5/crowdhuman/yolov5_s-v61_fast_8xb16-300e_crowdhuman.py
@@ -0,0 +1,47 @@
+_base_ = '../yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py'
+
+# Use the model trained on the COCO as the pretrained model
+load_from = 'https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth'  # noqa
+
+# dataset settings
+data_root = 'data/CrowdHuman/'
+dataset_type = 'YOLOv5CrowdHumanDataset'
+
+# parameters that often need to be modified
+num_classes = 1
+
+anchors = [
+    [(6, 14), (12, 28), (19, 48)],  # P3/8
+    [(29, 79), (46, 124), (142, 54)],  # P4/16
+    [(73, 198), (124, 330), (255, 504)]  # P5/32
+]
+
+model = dict(
+    bbox_head=dict(
+        head_module=dict(num_classes=num_classes),
+        prior_generator=dict(base_sizes=anchors)))
+
+train_dataloader = dict(
+    dataset=dict(
+        type=dataset_type,
+        data_root=data_root,
+        ann_file='annotation_train.odgt',
+        data_prefix=dict(img='Images/')))
+
+val_dataloader = dict(
+    dataset=dict(
+        type=dataset_type,
+        data_root=data_root,
+        ann_file='annotation_val.odgt',
+        data_prefix=dict(img='Images/'),
+        # CrowdHumanMetric does not support out-of-order output images
+        # for the time being. batch_shapes_cfg does not support.
+        batch_shapes_cfg=None))
+test_dataloader = val_dataloader
+
+val_evaluator = dict(
+    _delete_=True,
+    type='mmdet.CrowdHumanMetric',
+    ann_file=data_root + 'annotation_val.odgt',
+    metric=['AP', 'MR', 'JI'])
+test_evaluator = val_evaluator
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov5/ins_seg/yolov5_ins_l-v61_syncbn_fast_8xb16-300e_coco_instance.py b/mmdetection_practice/third_party/mmyolo/configs/yolov5/ins_seg/yolov5_ins_l-v61_syncbn_fast_8xb16-300e_coco_instance.py
new file mode 100644
index 0000000..6b27c76
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov5/ins_seg/yolov5_ins_l-v61_syncbn_fast_8xb16-300e_coco_instance.py
@@ -0,0 +1,81 @@
+_base_ = './yolov5_ins_m-v61_syncbn_fast_8xb16-300e_coco_instance.py'  # noqa
+
+# This config use refining bbox and `YOLOv5CopyPaste`.
+# Refining bbox means refining bbox by mask while loading annotations and
+# transforming after `YOLOv5RandomAffine`
+# ========================modified parameters======================
+deepen_factor = 1.0
+widen_factor = 1.0
+
+mixup_prob = 0.1
+copypaste_prob = 0.1
+
+# =======================Unmodified in most cases==================
+img_scale = _base_.img_scale
+
+model = dict(
+    backbone=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+    ),
+    neck=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+    ),
+    bbox_head=dict(head_module=dict(widen_factor=widen_factor)))
+
+pre_transform = _base_.pre_transform
+albu_train_transforms = _base_.albu_train_transforms
+mosaic_affine_pipeline = [
+    dict(
+        type='Mosaic',
+        img_scale=img_scale,
+        pad_val=114.0,
+        pre_transform=pre_transform),
+    dict(type='YOLOv5CopyPaste', prob=copypaste_prob),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        scaling_ratio_range=(1 - _base_.affine_scale, 1 + _base_.affine_scale),
+        border=(-img_scale[0] // 2, -img_scale[1] // 2),
+        border_val=(114, 114, 114),
+        min_area_ratio=_base_.min_area_ratio,
+        max_aspect_ratio=_base_.max_aspect_ratio,
+        use_mask_refine=_base_.use_mask2refine),
+]
+
+# enable mixup
+train_pipeline = [
+    *pre_transform,
+    *mosaic_affine_pipeline,
+    dict(
+        type='YOLOv5MixUp',
+        prob=mixup_prob,
+        pre_transform=[*pre_transform, *mosaic_affine_pipeline]),
+    # TODO: support mask transform in albu
+    # Geometric transformations are not supported in albu now.
+    dict(
+        type='mmdet.Albu',
+        transforms=albu_train_transforms,
+        bbox_params=dict(
+            type='BboxParams',
+            format='pascal_voc',
+            label_fields=['gt_bboxes_labels', 'gt_ignore_flags']),
+        keymap={
+            'img': 'image',
+            'gt_bboxes': 'bboxes'
+        }),
+    dict(type='YOLOv5HSVRandomAug'),
+    dict(type='mmdet.RandomFlip', prob=0.5),
+    dict(
+        type='Polygon2Mask',
+        downsample_ratio=_base_.downsample_ratio,
+        mask_overlap=_base_.mask_overlap),
+    dict(
+        type='PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                   'flip_direction'))
+]
+
+train_dataloader = dict(dataset=dict(pipeline=train_pipeline))
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov5/ins_seg/yolov5_ins_m-v61_syncbn_fast_8xb16-300e_coco_instance.py b/mmdetection_practice/third_party/mmyolo/configs/yolov5/ins_seg/yolov5_ins_m-v61_syncbn_fast_8xb16-300e_coco_instance.py
new file mode 100644
index 0000000..831e815
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov5/ins_seg/yolov5_ins_m-v61_syncbn_fast_8xb16-300e_coco_instance.py
@@ -0,0 +1,89 @@
+_base_ = './yolov5_ins_s-v61_syncbn_fast_8xb16-300e_coco_instance.py'  # noqa
+
+# ========================modified parameters======================
+deepen_factor = 0.67
+widen_factor = 0.75
+lr_factor = 0.1
+loss_cls_weight = 0.3
+loss_obj_weight = 0.7
+
+affine_scale = 0.9
+mixup_prob = 0.1
+
+# =======================Unmodified in most cases==================
+num_classes = _base_.num_classes
+num_det_layers = _base_.num_det_layers
+img_scale = _base_.img_scale
+
+model = dict(
+    backbone=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+    ),
+    neck=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+    ),
+    bbox_head=dict(
+        head_module=dict(widen_factor=widen_factor),
+        loss_cls=dict(loss_weight=loss_cls_weight *
+                      (num_classes / 80 * 3 / num_det_layers)),
+        loss_obj=dict(loss_weight=loss_obj_weight *
+                      ((img_scale[0] / 640)**2 * 3 / num_det_layers))))
+
+pre_transform = _base_.pre_transform
+albu_train_transforms = _base_.albu_train_transforms
+
+mosaic_affine_pipeline = [
+    dict(
+        type='Mosaic',
+        img_scale=img_scale,
+        pad_val=114.0,
+        pre_transform=pre_transform),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        scaling_ratio_range=(1 - affine_scale, 1 + affine_scale),
+        border=(-img_scale[0] // 2, -img_scale[1] // 2),
+        border_val=(114, 114, 114),
+        min_area_ratio=_base_.min_area_ratio,
+        max_aspect_ratio=_base_.max_aspect_ratio,
+        use_mask_refine=_base_.use_mask2refine),
+]
+
+# enable mixup
+train_pipeline = [
+    *pre_transform,
+    *mosaic_affine_pipeline,
+    dict(
+        type='YOLOv5MixUp',
+        prob=mixup_prob,
+        pre_transform=[*pre_transform, *mosaic_affine_pipeline]),
+    # TODO: support mask transform in albu
+    # Geometric transformations are not supported in albu now.
+    dict(
+        type='mmdet.Albu',
+        transforms=albu_train_transforms,
+        bbox_params=dict(
+            type='BboxParams',
+            format='pascal_voc',
+            label_fields=['gt_bboxes_labels', 'gt_ignore_flags']),
+        keymap={
+            'img': 'image',
+            'gt_bboxes': 'bboxes'
+        }),
+    dict(type='YOLOv5HSVRandomAug'),
+    dict(type='mmdet.RandomFlip', prob=0.5),
+    dict(
+        type='Polygon2Mask',
+        downsample_ratio=_base_.downsample_ratio,
+        mask_overlap=_base_.mask_overlap),
+    dict(
+        type='PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                   'flip_direction'))
+]
+
+train_dataloader = dict(dataset=dict(pipeline=train_pipeline))
+default_hooks = dict(param_scheduler=dict(lr_factor=lr_factor))
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov5/ins_seg/yolov5_ins_n-v61_syncbn_fast_8xb16-300e_coco_instance.py b/mmdetection_practice/third_party/mmyolo/configs/yolov5/ins_seg/yolov5_ins_n-v61_syncbn_fast_8xb16-300e_coco_instance.py
new file mode 100644
index 0000000..e06130b
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov5/ins_seg/yolov5_ins_n-v61_syncbn_fast_8xb16-300e_coco_instance.py
@@ -0,0 +1,15 @@
+_base_ = './yolov5_ins_s-v61_syncbn_fast_8xb16-300e_coco_instance.py'  # noqa
+
+deepen_factor = 0.33
+widen_factor = 0.25
+
+model = dict(
+    backbone=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+    ),
+    neck=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+    ),
+    bbox_head=dict(head_module=dict(widen_factor=widen_factor)))
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov5/ins_seg/yolov5_ins_s-v61_syncbn_fast_8xb16-300e_balloon_instance.py b/mmdetection_practice/third_party/mmyolo/configs/yolov5/ins_seg/yolov5_ins_s-v61_syncbn_fast_8xb16-300e_balloon_instance.py
new file mode 100644
index 0000000..82e2ae6
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov5/ins_seg/yolov5_ins_s-v61_syncbn_fast_8xb16-300e_balloon_instance.py
@@ -0,0 +1,42 @@
+_base_ = './yolov5_ins_s-v61_syncbn_fast_8xb16-300e_coco_instance.py'  # noqa
+
+data_root = 'data/balloon/'
+# Path of train annotation file
+train_ann_file = 'train.json'
+train_data_prefix = 'train/'  # Prefix of train image path
+# Path of val annotation file
+val_ann_file = 'val.json'
+val_data_prefix = 'val/'  # Prefix of val image path
+metainfo = {
+    'classes': ('balloon', ),
+    'palette': [
+        (220, 20, 60),
+    ]
+}
+num_classes = 1
+
+train_batch_size_per_gpu = 4
+train_num_workers = 2
+log_interval = 1
+#####################
+train_dataloader = dict(
+    batch_size=train_batch_size_per_gpu,
+    num_workers=train_num_workers,
+    dataset=dict(
+        data_root=data_root,
+        metainfo=metainfo,
+        data_prefix=dict(img=train_data_prefix),
+        ann_file=train_ann_file))
+val_dataloader = dict(
+    dataset=dict(
+        data_root=data_root,
+        metainfo=metainfo,
+        data_prefix=dict(img=val_data_prefix),
+        ann_file=val_ann_file))
+test_dataloader = val_dataloader
+val_evaluator = dict(ann_file=data_root + val_ann_file)
+test_evaluator = val_evaluator
+default_hooks = dict(logger=dict(interval=log_interval))
+#####################
+
+model = dict(bbox_head=dict(head_module=dict(num_classes=num_classes)))
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov5/ins_seg/yolov5_ins_s-v61_syncbn_fast_8xb16-300e_coco_instance.py b/mmdetection_practice/third_party/mmyolo/configs/yolov5/ins_seg/yolov5_ins_s-v61_syncbn_fast_8xb16-300e_coco_instance.py
new file mode 100644
index 0000000..0ab980c
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov5/ins_seg/yolov5_ins_s-v61_syncbn_fast_8xb16-300e_coco_instance.py
@@ -0,0 +1,126 @@
+_base_ = '../yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py'  # noqa
+
+# ========================modified parameters======================
+# YOLOv5RandomAffine
+use_mask2refine = True
+max_aspect_ratio = 100
+min_area_ratio = 0.01
+# Polygon2Mask
+downsample_ratio = 4
+mask_overlap = True
+# LeterResize
+# half_pad_param: if set to True, left and right pad_param will
+# be given by dividing padding_h by 2. If set to False, pad_param is
+# in int format. We recommend setting this to False for object
+# detection tasks, and True for instance segmentation tasks.
+# Default to False.
+half_pad_param = True
+
+# Testing take a long time due to model_test_cfg.
+# If you want to speed it up, you can increase score_thr
+# or decraese nms_pre and max_per_img
+model_test_cfg = dict(
+    multi_label=True,
+    nms_pre=30000,
+    min_bbox_size=0,
+    score_thr=0.001,
+    nms=dict(type='nms', iou_threshold=0.6),
+    max_per_img=300,
+    mask_thr_binary=0.5,
+    # fast_test: Whether to use fast test methods. When set
+    # to False, the implementation here is the same as the
+    # official, with higher mAP. If set to True, mask will first
+    # be upsampled to origin image shape through Pytorch, and
+    # then use mask_thr_binary to determine which pixels belong
+    # to the object. If set to False, will first use
+    # mask_thr_binary to determine which pixels belong to the
+    # object , and then use opencv to upsample mask to origin
+    # image shape. Default to False.
+    fast_test=True)
+
+# ===============================Unmodified in most cases====================
+model = dict(
+    type='YOLODetector',
+    bbox_head=dict(
+        type='YOLOv5InsHead',
+        head_module=dict(
+            type='YOLOv5InsHeadModule', mask_channels=32, proto_channels=256),
+        mask_overlap=mask_overlap,
+        loss_mask=dict(
+            type='mmdet.CrossEntropyLoss', use_sigmoid=True, reduction='none'),
+        loss_mask_weight=0.05),
+    test_cfg=model_test_cfg)
+
+pre_transform = [
+    dict(type='LoadImageFromFile', backend_args=_base_.backend_args),
+    dict(
+        type='LoadAnnotations',
+        with_bbox=True,
+        with_mask=True,
+        mask2bbox=use_mask2refine)
+]
+
+train_pipeline = [
+    *pre_transform,
+    dict(
+        type='Mosaic',
+        img_scale=_base_.img_scale,
+        pad_val=114.0,
+        pre_transform=pre_transform),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        scaling_ratio_range=(1 - _base_.affine_scale, 1 + _base_.affine_scale),
+        border=(-_base_.img_scale[0] // 2, -_base_.img_scale[1] // 2),
+        border_val=(114, 114, 114),
+        min_area_ratio=min_area_ratio,
+        max_aspect_ratio=max_aspect_ratio,
+        use_mask_refine=use_mask2refine),
+    # TODO: support mask transform in albu
+    # Geometric transformations are not supported in albu now.
+    dict(
+        type='mmdet.Albu',
+        transforms=_base_.albu_train_transforms,
+        bbox_params=dict(
+            type='BboxParams',
+            format='pascal_voc',
+            label_fields=['gt_bboxes_labels', 'gt_ignore_flags']),
+        keymap={
+            'img': 'image',
+            'gt_bboxes': 'bboxes'
+        }),
+    dict(type='YOLOv5HSVRandomAug'),
+    dict(type='mmdet.RandomFlip', prob=0.5),
+    dict(
+        type='Polygon2Mask',
+        downsample_ratio=downsample_ratio,
+        mask_overlap=mask_overlap),
+    dict(
+        type='PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                   'flip_direction'))
+]
+
+test_pipeline = [
+    dict(type='LoadImageFromFile', backend_args=_base_.backend_args),
+    dict(type='YOLOv5KeepRatioResize', scale=_base_.img_scale),
+    dict(
+        type='LetterResize',
+        scale=_base_.img_scale,
+        allow_scale_up=False,
+        half_pad_param=half_pad_param,
+        pad_val=dict(img=114)),
+    dict(type='LoadAnnotations', with_bbox=True, _scope_='mmdet'),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                   'scale_factor', 'pad_param'))
+]
+
+train_dataloader = dict(dataset=dict(pipeline=train_pipeline))
+val_dataloader = dict(dataset=dict(pipeline=test_pipeline))
+test_dataloader = val_dataloader
+
+val_evaluator = dict(metric=['bbox', 'segm'])
+test_evaluator = val_evaluator
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov5/ins_seg/yolov5_ins_s-v61_syncbn_fast_non_overlap_8xb16-300e_coco_instance.py b/mmdetection_practice/third_party/mmyolo/configs/yolov5/ins_seg/yolov5_ins_s-v61_syncbn_fast_non_overlap_8xb16-300e_coco_instance.py
new file mode 100644
index 0000000..83b48ca
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov5/ins_seg/yolov5_ins_s-v61_syncbn_fast_non_overlap_8xb16-300e_coco_instance.py
@@ -0,0 +1,49 @@
+_base_ = './yolov5_ins_s-v61_syncbn_fast_8xb16-300e_coco_instance.py'  # noqa
+
+# ========================modified parameters======================
+mask_overlap = False  # Polygon2Mask
+
+# ===============================Unmodified in most cases====================
+model = dict(bbox_head=dict(mask_overlap=mask_overlap))
+
+train_pipeline = [
+    *_base_.pre_transform,
+    dict(
+        type='Mosaic',
+        img_scale=_base_.img_scale,
+        pad_val=114.0,
+        pre_transform=_base_.pre_transform),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        scaling_ratio_range=(1 - _base_.affine_scale, 1 + _base_.affine_scale),
+        border=(-_base_.img_scale[0] // 2, -_base_.img_scale[1] // 2),
+        border_val=(114, 114, 114),
+        min_area_ratio=_base_.min_area_ratio,
+        max_aspect_ratio=_base_.max_aspect_ratio,
+        use_mask_refine=True),
+    dict(
+        type='mmdet.Albu',
+        transforms=_base_.albu_train_transforms,
+        bbox_params=dict(
+            type='BboxParams',
+            format='pascal_voc',
+            label_fields=['gt_bboxes_labels', 'gt_ignore_flags']),
+        keymap={
+            'img': 'image',
+            'gt_bboxes': 'bboxes',
+        }),
+    dict(type='YOLOv5HSVRandomAug'),
+    dict(type='mmdet.RandomFlip', prob=0.5),
+    dict(
+        type='Polygon2Mask',
+        downsample_ratio=_base_.downsample_ratio,
+        mask_overlap=mask_overlap),
+    dict(
+        type='PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                   'flip_direction'))
+]
+
+train_dataloader = dict(dataset=dict(pipeline=train_pipeline))
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov5/ins_seg/yolov5_ins_x-v61_syncbn_fast_8xb16-300e_coco_instance.py b/mmdetection_practice/third_party/mmyolo/configs/yolov5/ins_seg/yolov5_ins_x-v61_syncbn_fast_8xb16-300e_coco_instance.py
new file mode 100644
index 0000000..a18170c
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov5/ins_seg/yolov5_ins_x-v61_syncbn_fast_8xb16-300e_coco_instance.py
@@ -0,0 +1,15 @@
+_base_ = './yolov5_ins_l-v61_syncbn_fast_8xb16-300e_coco_instance.py'  # noqa
+
+deepen_factor = 1.33
+widen_factor = 1.25
+
+model = dict(
+    backbone=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+    ),
+    neck=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+    ),
+    bbox_head=dict(head_module=dict(widen_factor=widen_factor)))
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov5/mask_refine/yolov5_l_mask-refine-v61_syncbn_fast_8xb16-300e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/yolov5/mask_refine/yolov5_l_mask-refine-v61_syncbn_fast_8xb16-300e_coco.py
new file mode 100644
index 0000000..206eec3
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov5/mask_refine/yolov5_l_mask-refine-v61_syncbn_fast_8xb16-300e_coco.py
@@ -0,0 +1,77 @@
+_base_ = './yolov5_m_mask-refine-v61_syncbn_fast_8xb16-300e_coco.py'
+
+# This config use refining bbox and `YOLOv5CopyPaste`.
+# Refining bbox means refining bbox by mask while loading annotations and
+# transforming after `YOLOv5RandomAffine`
+
+# ========================modified parameters======================
+deepen_factor = 1.0
+widen_factor = 1.0
+
+mixup_prob = 0.1
+copypaste_prob = 0.1
+
+# =======================Unmodified in most cases==================
+img_scale = _base_.img_scale
+
+model = dict(
+    backbone=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+    ),
+    neck=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+    ),
+    bbox_head=dict(head_module=dict(widen_factor=widen_factor)))
+
+pre_transform = _base_.pre_transform
+albu_train_transforms = _base_.albu_train_transforms
+
+mosaic_affine_pipeline = [
+    dict(
+        type='Mosaic',
+        img_scale=img_scale,
+        pad_val=114.0,
+        pre_transform=pre_transform),
+    dict(type='YOLOv5CopyPaste', prob=copypaste_prob),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        scaling_ratio_range=(1 - _base_.affine_scale, 1 + _base_.affine_scale),
+        # img_scale is (width, height)
+        border=(-img_scale[0] // 2, -img_scale[1] // 2),
+        border_val=(114, 114, 114),
+        min_area_ratio=_base_.min_area_ratio,
+        use_mask_refine=_base_.use_mask2refine),
+    dict(type='RemoveDataElement', keys=['gt_masks'])
+]
+
+# enable mixup and copypaste
+train_pipeline = [
+    *pre_transform, *mosaic_affine_pipeline,
+    dict(
+        type='YOLOv5MixUp',
+        prob=mixup_prob,
+        pre_transform=[*pre_transform, *mosaic_affine_pipeline]),
+    dict(
+        type='mmdet.Albu',
+        transforms=albu_train_transforms,
+        bbox_params=dict(
+            type='BboxParams',
+            format='pascal_voc',
+            label_fields=['gt_bboxes_labels', 'gt_ignore_flags']),
+        keymap={
+            'img': 'image',
+            'gt_bboxes': 'bboxes'
+        }),
+    dict(type='YOLOv5HSVRandomAug'),
+    dict(type='mmdet.RandomFlip', prob=0.5),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                   'flip_direction'))
+]
+
+train_dataloader = dict(dataset=dict(pipeline=train_pipeline))
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov5/mask_refine/yolov5_m_mask-refine-v61_syncbn_fast_8xb16-300e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/yolov5/mask_refine/yolov5_m_mask-refine-v61_syncbn_fast_8xb16-300e_coco.py
new file mode 100644
index 0000000..4af27a9
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov5/mask_refine/yolov5_m_mask-refine-v61_syncbn_fast_8xb16-300e_coco.py
@@ -0,0 +1,86 @@
+_base_ = './yolov5_s_mask-refine-v61_syncbn_fast_8xb16-300e_coco.py'
+
+# This config will refine bbox by mask while loading annotations and
+# transforming after `YOLOv5RandomAffine`
+
+# ========================modified parameters======================
+deepen_factor = 0.67
+widen_factor = 0.75
+lr_factor = 0.1
+loss_cls_weight = 0.3
+loss_obj_weight = 0.7
+
+affine_scale = 0.9
+mixup_prob = 0.1
+
+# =======================Unmodified in most cases==================
+num_classes = _base_.num_classes
+num_det_layers = _base_.num_det_layers
+img_scale = _base_.img_scale
+
+model = dict(
+    backbone=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+    ),
+    neck=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+    ),
+    bbox_head=dict(
+        head_module=dict(widen_factor=widen_factor),
+        loss_cls=dict(loss_weight=loss_cls_weight *
+                      (num_classes / 80 * 3 / num_det_layers)),
+        loss_obj=dict(loss_weight=loss_obj_weight *
+                      ((img_scale[0] / 640)**2 * 3 / num_det_layers))))
+
+pre_transform = _base_.pre_transform
+albu_train_transforms = _base_.albu_train_transforms
+
+mosaic_affine_pipeline = [
+    dict(
+        type='Mosaic',
+        img_scale=img_scale,
+        pad_val=114.0,
+        pre_transform=pre_transform),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        scaling_ratio_range=(1 - affine_scale, 1 + affine_scale),
+        # img_scale is (width, height)
+        border=(-img_scale[0] // 2, -img_scale[1] // 2),
+        border_val=(114, 114, 114),
+        min_area_ratio=_base_.min_area_ratio,
+        use_mask_refine=_base_.use_mask2refine),
+    dict(type='RemoveDataElement', keys=['gt_masks'])
+]
+
+# enable mixup
+train_pipeline = [
+    *pre_transform, *mosaic_affine_pipeline,
+    dict(
+        type='YOLOv5MixUp',
+        prob=mixup_prob,
+        pre_transform=[*pre_transform, *mosaic_affine_pipeline]),
+    dict(
+        type='mmdet.Albu',
+        transforms=albu_train_transforms,
+        bbox_params=dict(
+            type='BboxParams',
+            format='pascal_voc',
+            label_fields=['gt_bboxes_labels', 'gt_ignore_flags']),
+        keymap={
+            'img': 'image',
+            'gt_bboxes': 'bboxes'
+        }),
+    dict(type='YOLOv5HSVRandomAug'),
+    dict(type='mmdet.RandomFlip', prob=0.5),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                   'flip_direction'))
+]
+
+train_dataloader = dict(dataset=dict(pipeline=train_pipeline))
+default_hooks = dict(param_scheduler=dict(lr_factor=lr_factor))
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov5/mask_refine/yolov5_n_mask-refine-v61_syncbn_fast_8xb16-300e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/yolov5/mask_refine/yolov5_n_mask-refine-v61_syncbn_fast_8xb16-300e_coco.py
new file mode 100644
index 0000000..3fe8dc3
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov5/mask_refine/yolov5_n_mask-refine-v61_syncbn_fast_8xb16-300e_coco.py
@@ -0,0 +1,20 @@
+_base_ = './yolov5_s_mask-refine-v61_syncbn_fast_8xb16-300e_coco.py'
+
+# This config will refine bbox by mask while loading annotations and
+# transforming after `YOLOv5RandomAffine`
+
+# ========================modified parameters======================
+deepen_factor = 0.33
+widen_factor = 0.25
+
+# ===============================Unmodified in most cases====================
+model = dict(
+    backbone=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+    ),
+    neck=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+    ),
+    bbox_head=dict(head_module=dict(widen_factor=widen_factor)))
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov5/mask_refine/yolov5_s_mask-refine-v61_syncbn_fast_8xb16-300e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/yolov5/mask_refine/yolov5_s_mask-refine-v61_syncbn_fast_8xb16-300e_coco.py
new file mode 100644
index 0000000..74febbb
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov5/mask_refine/yolov5_s_mask-refine-v61_syncbn_fast_8xb16-300e_coco.py
@@ -0,0 +1,62 @@
+_base_ = '../yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py'
+
+# This config will refine bbox by mask while loading annotations and
+# transforming after `YOLOv5RandomAffine`
+
+# ========================modified parameters======================
+use_mask2refine = True
+min_area_ratio = 0.01  # YOLOv5RandomAffine
+
+# ===============================Unmodified in most cases====================
+pre_transform = [
+    dict(type='LoadImageFromFile', backend_args=_base_.backend_args),
+    dict(
+        type='LoadAnnotations',
+        with_bbox=True,
+        with_mask=True,
+        mask2bbox=use_mask2refine)
+]
+
+last_transform = [
+    # Delete gt_masks to avoid more computation
+    dict(type='RemoveDataElement', keys=['gt_masks']),
+    dict(
+        type='mmdet.Albu',
+        transforms=_base_.albu_train_transforms,
+        bbox_params=dict(
+            type='BboxParams',
+            format='pascal_voc',
+            label_fields=['gt_bboxes_labels', 'gt_ignore_flags']),
+        keymap={
+            'img': 'image',
+            'gt_bboxes': 'bboxes'
+        }),
+    dict(type='YOLOv5HSVRandomAug'),
+    dict(type='mmdet.RandomFlip', prob=0.5),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                   'flip_direction'))
+]
+
+train_pipeline = [
+    *pre_transform,
+    dict(
+        type='Mosaic',
+        img_scale=_base_.img_scale,
+        pad_val=114.0,
+        pre_transform=pre_transform),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        scaling_ratio_range=(1 - _base_.affine_scale, 1 + _base_.affine_scale),
+        # img_scale is (width, height)
+        border=(-_base_.img_scale[0] // 2, -_base_.img_scale[1] // 2),
+        border_val=(114, 114, 114),
+        min_area_ratio=min_area_ratio,
+        use_mask_refine=use_mask2refine),
+    *last_transform
+]
+
+train_dataloader = dict(dataset=dict(pipeline=train_pipeline))
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov5/mask_refine/yolov5_x_mask-refine-v61_syncbn_fast_8xb16-300e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/yolov5/mask_refine/yolov5_x_mask-refine-v61_syncbn_fast_8xb16-300e_coco.py
new file mode 100644
index 0000000..fb76f10
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov5/mask_refine/yolov5_x_mask-refine-v61_syncbn_fast_8xb16-300e_coco.py
@@ -0,0 +1,21 @@
+_base_ = './yolov5_l_mask-refine-v61_syncbn_fast_8xb16-300e_coco.py'
+
+# This config use refining bbox and `YOLOv5CopyPaste`.
+# Refining bbox means refining bbox by mask while loading annotations and
+# transforming after `YOLOv5RandomAffine`
+
+# ========================modified parameters======================
+deepen_factor = 1.33
+widen_factor = 1.25
+
+# ===============================Unmodified in most cases====================
+model = dict(
+    backbone=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+    ),
+    neck=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+    ),
+    bbox_head=dict(head_module=dict(widen_factor=widen_factor)))
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov5/metafile.yml b/mmdetection_practice/third_party/mmyolo/configs/yolov5/metafile.yml
new file mode 100644
index 0000000..bfe5add
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov5/metafile.yml
@@ -0,0 +1,346 @@
+Collections:
+  - Name: YOLOv5
+    Metadata:
+      Training Data: COCO
+      Training Techniques:
+        - SGD with Nesterov
+        - Weight Decay
+        - AMP
+        - Synchronize BN
+      Training Resources: 8x A100 GPUs
+      Architecture:
+        - CSPDarkNet
+        - PAFPN
+    README: configs/yolov5/README.md
+    Code:
+      URL: https://github.com/open-mmlab/mmyolo/blob/v0.1.0/mmyolo/models/detectors/yolo_detector.py#L12
+      Version: v0.1.0
+  - Name: YOLOv5_VOC
+    Metadata:
+      Training Data: VOC
+      Training Techniques:
+        - SGD with Nesterov
+        - Weight Decay
+        - AMP
+      Training Resources: 1x A100 GPU
+      Architecture:
+        - CSPDarkNet
+        - PAFPN
+    README: configs/yolov5/README.md
+    Code:
+      URL: https://github.com/open-mmlab/mmyolo/blob/v0.1.0/mmyolo/models/detectors/yolo_detector.py#L12
+      Version: v0.1.0
+
+Models:
+  - Name: yolov5_n-v61_syncbn_fast_8xb16-300e_coco
+    In Collection: YOLOv5
+    Config: configs/yolov5/yolov5_n-v61_syncbn_fast_8xb16-300e_coco.py
+    Metadata:
+      Training Memory (GB): 1.5
+      Epochs: 300
+    Results:
+      - Task: Object Detection
+        Dataset: COCO
+        Metrics:
+          box AP: 28.0
+    Weights: https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_n-v61_syncbn_fast_8xb16-300e_coco/yolov5_n-v61_syncbn_fast_8xb16-300e_coco_20220919_090739-b804c1ad.pth
+  - Name: yolov5_s-v61_syncbn_fast_8xb16-300e_coco
+    In Collection: YOLOv5
+    Config: configs/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py
+    Metadata:
+      Training Memory (GB): 2.7
+      Epochs: 300
+    Results:
+      - Task: Object Detection
+        Dataset: COCO
+        Metrics:
+          box AP: 37.7
+    Weights: https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth
+  - Name: yolov5_m-v61_syncbn_fast_8xb16-300e_coco
+    In Collection: YOLOv5
+    Config: configs/yolov5/yolov5_m-v61_syncbn_fast_8xb16-300e_coco.py
+    Metadata:
+      Training Memory (GB): 5.0
+      Epochs: 300
+    Results:
+      - Task: Object Detection
+        Dataset: COCO
+        Metrics:
+          box AP: 45.3
+    Weights: https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_m-v61_syncbn_fast_8xb16-300e_coco/yolov5_m-v61_syncbn_fast_8xb16-300e_coco_20220917_204944-516a710f.pth
+  - Name: yolov5_l-v61_syncbn_fast_8xb16-300e_coco
+    In Collection: YOLOv5
+    Config: configs/yolov5/yolov5_l-v61_syncbn_fast_8xb16-300e_coco.py
+    Metadata:
+      Training Memory (GB): 8.1
+      Epochs: 300
+    Results:
+      - Task: Object Detection
+        Dataset: COCO
+        Metrics:
+          box AP: 48.8
+    Weights: https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_l-v61_syncbn_fast_8xb16-300e_coco/yolov5_l-v61_syncbn_fast_8xb16-300e_coco_20220917_031007-096ef0eb.pth
+  - Name: yolov5_x-v61_syncbn_fast_8xb16-300e_coco
+    In Collection: YOLOv5
+    Config: configs/yolov5/yolov5_x-v61_syncbn_fast_8xb16-300e_coco.py
+    Metadata:
+      Training Memory (GB): 12.2
+      Epochs: 300
+    Results:
+      - Task: Object Detection
+        Dataset: COCO
+        Metrics:
+          box AP: 50.2
+    Weights: https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_x-v61_syncbn_fast_8xb16-300e_coco/yolov5_x-v61_syncbn_fast_8xb16-300e_coco_20230305_152943-00776a4b.pth
+  - Name: yolov5_n-p6-v62_syncbn_fast_8xb16-300e_coco
+    In Collection: YOLOv5
+    Config: configs/yolov5/yolov5_n-p6-v62_syncbn_fast_8xb16-300e_coco.py
+    Metadata:
+      Training Memory (GB): 5.8
+      Epochs: 300
+    Results:
+      - Task: Object Detection
+        Dataset: COCO
+        Metrics:
+          box AP: 35.9
+    Weights: https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_n-p6-v62_syncbn_fast_8xb16-300e_coco/yolov5_n-p6-v62_syncbn_fast_8xb16-300e_coco_20221027_224705-d493c5f3.pth
+  - Name: yolov5_s-p6-v62_syncbn_fast_8xb16-300e_coco
+    In Collection: YOLOv5
+    Config: configs/yolov5/yolov5_s-p6-v62_syncbn_fast_8xb16-300e_coco.py
+    Metadata:
+      Training Memory (GB): 10.5
+      Epochs: 300
+    Results:
+      - Task: Object Detection
+        Dataset: COCO
+        Metrics:
+          box AP: 44.4
+    Weights: https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_s-p6-v62_syncbn_fast_8xb16-300e_coco/yolov5_s-p6-v62_syncbn_fast_8xb16-300e_coco_20221027_215044-58865c19.pth
+  - Name: yolov5_m-p6-v62_syncbn_fast_8xb16-300e_coco
+    In Collection: YOLOv5
+    Config: configs/yolov5/yolov5_m-p6-v62_syncbn_fast_8xb16-300e_coco.py
+    Metadata:
+      Training Memory (GB): 19.1
+      Epochs: 300
+    Results:
+      - Task: Object Detection
+        Dataset: COCO
+        Metrics:
+          box AP: 51.3
+    Weights: https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_m-p6-v62_syncbn_fast_8xb16-300e_coco/yolov5_m-p6-v62_syncbn_fast_8xb16-300e_coco_20221027_230453-49564d58.pth
+  - Name: yolov5_l-p6-v62_syncbn_fast_8xb16-300e_coco
+    In Collection: YOLOv5
+    Config: configs/yolov5/yolov5_l-p6-v62_syncbn_fast_8xb16-300e_coco.py
+    Metadata:
+      Training Memory (GB): 30.5
+      Epochs: 300
+    Results:
+      - Task: Object Detection
+        Dataset: COCO
+        Metrics:
+          box AP: 53.7
+    Weights: https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_l-p6-v62_syncbn_fast_8xb16-300e_coco/yolov5_l-p6-v62_syncbn_fast_8xb16-300e_coco_20221027_234308-7a2ba6bf.pth
+  - Name: yolov5_n-v61_fast_1xb64-50e_voc
+    In Collection: YOLOv5_VOC
+    Config: configs/yolov5/voc/yolov5_n-v61_fast_1xb64-50e_voc.py
+    Metadata:
+      Training Memory (GB): 3.5
+      Epochs: 50
+    Results:
+      - Task: Object Detection
+        Dataset: COCO
+        Metrics:
+          box AP: 51.2
+    Weights: https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_n-v61_fast_1xb64-50e_voc/yolov5_n-v61_fast_1xb64-50e_voc_20221017_234254-f1493430.pth
+  - Name: yolov5_s-v61_fast_1xb64-50e_voc
+    In Collection: YOLOv5_VOC
+    Config: configs/yolov5/voc/yolov5_s-v61_fast_1xb64-50e_voc.py
+    Metadata:
+      Training Memory (GB): 6.5
+      Epochs: 50
+    Results:
+      - Task: Object Detection
+        Dataset: COCO
+        Metrics:
+          box AP: 62.7
+    Weights: https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_s-v61_fast_1xb64-50e_voc/yolov5_s-v61_fast_1xb64-50e_voc_20221017_234156-0009b33e.pth
+  - Name: yolov5_m-v61_fast_1xb64-50e_voc
+    In Collection: YOLOv5_VOC
+    Config: configs/yolov5/voc/yolov5_m-v61_fast_1xb64-50e_voc.py
+    Metadata:
+      Training Memory (GB): 12.0
+      Epochs: 50
+    Results:
+      - Task: Object Detection
+        Dataset: COCO
+        Metrics:
+          box AP: 70.1
+    Weights: https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_m-v61_fast_1xb64-50e_voc/yolov5_m-v61_fast_1xb64-50e_voc_20221017_114138-815c143a.pth
+  - Name: yolov5_l-v61_fast_1xb32-50e_voc
+    In Collection: YOLOv5_VOC
+    Config: configs/yolov5/voc/yolov5_l-v61_fast_1xb32-50e_voc.py
+    Metadata:
+      Training Memory (GB): 10.0
+      Epochs: 50
+    Results:
+      - Task: Object Detection
+        Dataset: COCO
+        Metrics:
+          box AP: 73.1
+    Weights: https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_l-v61_fast_1xb32-50e_voc/yolov5_l-v61_fast_1xb32-50e_voc_20221017_045500-edc7e0d8.pth
+  - Name: yolov5_n_mask-refine-v61_syncbn_fast_8xb16-300e_coco
+    In Collection: YOLOv5
+    Config: configs/yolov5/mask_refine/yolov5_n_mask-refine-v61_syncbn_fast_8xb16-300e_coco.py
+    Metadata:
+      Training Memory (GB): 1.5
+      Epochs: 300
+    Results:
+      - Task: Object Detection
+        Dataset: COCO
+        Metrics:
+          box AP: 28.0
+    Weights: https://download.openmmlab.com/mmyolo/v0/yolov5/mask_refine/yolov5_n_mask-refine-v61_syncbn_fast_8xb16-300e_coco/yolov5_n_mask-refine-v61_syncbn_fast_8xb16-300e_coco_20230305_152706-712fb1b2.pth
+  - Name: yolov5_s_mask-refine-v61_syncbn_fast_8xb16-300e_coco
+    In Collection: YOLOv5
+    Config: configs/yolov5/mask_refine/yolov5_s_mask-refine-v61_syncbn_fast_8xb16-300e_coco.py
+    Metadata:
+      Training Memory (GB): 2.7
+      Epochs: 300
+    Results:
+      - Task: Object Detection
+        Dataset: COCO
+        Metrics:
+          box AP: 38.0
+    Weights: https://download.openmmlab.com/mmyolo/v0/yolov5/mask_refine/yolov5_s_mask-refine-v61_syncbn_fast_8xb16-300e_coco/yolov5_s_mask-refine-v61_syncbn_fast_8xb16-300e_coco_20230304_033134-8e0cd271.pth
+  - Name: yolov5_m_mask-refine-v61_syncbn_fast_8xb16-300e_coco
+    In Collection: YOLOv5
+    Config: configs/yolov5/mask_refine/yolov5_m_mask-refine-v61_syncbn_fast_8xb16-300e_coco.py
+    Metadata:
+      Training Memory (GB): 5.0
+      Epochs: 300
+    Results:
+      - Task: Object Detection
+        Dataset: COCO
+        Metrics:
+          box AP: 45.3
+    Weights: https://download.openmmlab.com/mmyolo/v0/yolov5/mask_refine/yolov5_m_mask-refine-v61_syncbn_fast_8xb16-300e_coco/yolov5_m_mask-refine-v61_syncbn_fast_8xb16-300e_coco_20230305_153946-44e96155.pth
+  - Name: yolov5_l_mask-refine-v61_syncbn_fast_8xb16-300e_coco
+    In Collection: YOLOv5
+    Config: configs/yolov5/mask_refine/yolov5_l_mask-refine-v61_syncbn_fast_8xb16-300e_coco.py
+    Metadata:
+      Training Memory (GB): 8.1
+      Epochs: 300
+    Results:
+      - Task: Object Detection
+        Dataset: COCO
+        Metrics:
+          box AP: 49.3
+    Weights: https://download.openmmlab.com/mmyolo/v0/yolov5/mask_refine/yolov5_l_mask-refine-v61_syncbn_fast_8xb16-300e_coco/yolov5_l_mask-refine-v61_syncbn_fast_8xb16-300e_coco_20230305_154301-2c1d912a.pth
+  - Name: yolov5_x_mask-refine-v61_syncbn_fast_8xb16-300e_coco
+    In Collection: YOLOv5
+    Config: configs/yolov5/mask_refine/yolov5_x_mask-refine-v61_syncbn_fast_8xb16-300e_coco.py
+    Metadata:
+      Training Memory (GB): 12.2
+      Epochs: 300
+    Results:
+      - Task: Object Detection
+        Dataset: COCO
+        Metrics:
+          box AP: 50.9
+    Weights: https://download.openmmlab.com/mmyolo/v0/yolov5/mask_refine/yolov5_x_mask-refine-v61_syncbn_fast_8xb16-300e_coco/yolov5_x_mask-refine-v61_syncbn_fast_8xb16-300e_coco_20230305_154321-07edeb62.pth
+  - Name: yolov5_ins_n-v61_syncbn_fast_8xb16-300e_coco_instance
+    In Collection: YOLOv5
+    Config: configs/yolov5/ins_seg/yolov5_ins_n-v61_syncbn_fast_8xb16-300e_coco_instance.py
+    Metadata:
+      Training Memory (GB): 3.3
+      Epochs: 300
+    Results:
+      - Task: Object Detection
+        Dataset: COCO
+        Metrics:
+          box AP: 27.9
+      - Task: Instance Segmentation
+        Dataset: COCO
+        Metrics:
+          mask AP: 23.7
+    Weights: https://download.openmmlab.com/mmyolo/v0/yolov5/ins_seg/yolov5_ins_n-v61_syncbn_fast_8xb16-300e_coco_instance/yolov5_ins_n-v61_syncbn_fast_8xb16-300e_coco_instance_20230424_104807-84cc9240.pth
+  - Name: yolov5_ins_s-v61_syncbn_fast_8xb16-300e_coco_instance
+    In Collection: YOLOv5
+    Config: configs/yolov5/ins_seg/yolov5_ins_s-v61_syncbn_fast_8xb16-300e_coco_instance.py
+    Metadata:
+      Training Memory (GB): 4.8
+      Epochs: 300
+    Results:
+      - Task: Object Detection
+        Dataset: COCO
+        Metrics:
+          box AP: 38.1
+      - Task: Instance Segmentation
+        Dataset: COCO
+        Metrics:
+          mask AP: 32.0
+    Weights: https://download.openmmlab.com/mmyolo/v0/yolov5/ins_seg/yolov5_ins_s-v61_syncbn_fast_8xb16-300e_coco_instance/yolov5_ins_s-v61_syncbn_fast_8xb16-300e_coco_instance_20230426_012542-3e570436.pth
+  - Name: yolov5_ins_s-v61_syncbn_fast_non_overlap_8xb16-300e_coco_instance
+    In Collection: YOLOv5
+    Config: configs/yolov5/ins_seg/yolov5_ins_s-v61_syncbn_fast_non_overlap_8xb16-300e_coco_instance.py
+    Metadata:
+      Training Memory (GB): 4.8
+      Epochs: 300
+    Results:
+      - Task: Object Detection
+        Dataset: COCO
+        Metrics:
+          box AP: 38.0
+      - Task: Instance Segmentation
+        Dataset: COCO
+        Metrics:
+          mask AP: 32.1
+    Weights: https://download.openmmlab.com/mmyolo/v0/yolov5/ins_seg/yolov5_ins_s-v61_syncbn_fast_non_overlap_8xb16-300e_coco_instance/yolov5_ins_s-v61_syncbn_fast_non_overlap_8xb16-300e_coco_instance_20230424_104642-6780d34e.pth
+  - Name: yolov5_ins_m-v61_syncbn_fast_8xb16-300e_coco_instance
+    In Collection: YOLOv5
+    Config: configs/yolov5/ins_seg/yolov5_ins_m-v61_syncbn_fast_8xb16-300e_coco_instance.py
+    Metadata:
+      Training Memory (GB): 7.3
+      Epochs: 300
+    Results:
+      - Task: Object Detection
+        Dataset: COCO
+        Metrics:
+          box AP: 45.1
+      - Task: Instance Segmentation
+        Dataset: COCO
+        Metrics:
+          mask AP: 37.3
+    Weights: https://download.openmmlab.com/mmyolo/v0/yolov5/ins_seg/yolov5_ins_m-v61_syncbn_fast_8xb16-300e_coco_instance/yolov5_ins_m-v61_syncbn_fast_8xb16-300e_coco_instance_20230424_111529-ef5ba1a9.pth
+  - Name: yolov5_ins_l-v61_syncbn_fast_8xb16-300e_coco_instance
+    In Collection: YOLOv5
+    Config: configs/yolov5/ins_seg/yolov5_ins_l-v61_syncbn_fast_8xb16-300e_coco_instance.py
+    Metadata:
+      Training Memory (GB): 10.7
+      Epochs: 300
+    Results:
+      - Task: Object Detection
+        Dataset: COCO
+        Metrics:
+          box AP: 48.8
+      - Task: Instance Segmentation
+        Dataset: COCO
+        Metrics:
+          mask AP: 39.9
+    Weights: https://download.openmmlab.com/mmyolo/v0/yolov5/ins_seg/yolov5_ins_l-v61_syncbn_fast_8xb16-300e_coco_instance/yolov5_ins_l-v61_syncbn_fast_8xb16-300e_coco_instance_20230508_104049-daa09f70.pth
+  - Name: yolov5_ins_x-v61_syncbn_fast_8xb16-300e_coco_instance
+    In Collection: YOLOv5
+    Config: configs/yolov5/ins_seg/yolov5_ins_x-v61_syncbn_fast_8xb16-300e_coco_instance.py
+    Metadata:
+      Training Memory (GB): 15.0
+      Epochs: 300
+    Results:
+      - Task: Object Detection
+        Dataset: COCO
+        Metrics:
+          box AP: 50.6
+      - Task: Instance Segmentation
+        Dataset: COCO
+        Metrics:
+          mask AP: 41.4
+    Weights: https://download.openmmlab.com/mmyolo/v0/yolov5/ins_seg/yolov5_ins_x-v61_syncbn_fast_8xb16-300e_coco_instance/yolov5_ins_x-v61_syncbn_fast_8xb16-300e_coco_instance_20230508_103925-a260c798.pth
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov5/voc/yolov5_l-v61_fast_1xb32-50e_voc.py b/mmdetection_practice/third_party/mmyolo/configs/yolov5/voc/yolov5_l-v61_fast_1xb32-50e_voc.py
new file mode 100644
index 0000000..4b47097
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov5/voc/yolov5_l-v61_fast_1xb32-50e_voc.py
@@ -0,0 +1,25 @@
+_base_ = './yolov5_s-v61_fast_1xb64-50e_voc.py'
+
+deepen_factor = 1.0
+widen_factor = 1.0
+train_batch_size_per_gpu = 32
+train_num_workers = 8
+
+load_from = 'https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_l-v61_syncbn_fast_8xb16-300e_coco/yolov5_l-v61_syncbn_fast_8xb16-300e_coco_20220917_031007-096ef0eb.pth'  # noqa
+
+model = dict(
+    backbone=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+    ),
+    neck=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+    ),
+    bbox_head=dict(head_module=dict(widen_factor=widen_factor)))
+
+train_dataloader = dict(
+    batch_size=train_batch_size_per_gpu, num_workers=train_num_workers)
+
+optim_wrapper = dict(
+    optimizer=dict(batch_size_per_gpu=train_batch_size_per_gpu))
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov5/voc/yolov5_m-v61_fast_1xb64-50e_voc.py b/mmdetection_practice/third_party/mmyolo/configs/yolov5/voc/yolov5_m-v61_fast_1xb64-50e_voc.py
new file mode 100644
index 0000000..2ed2127
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov5/voc/yolov5_m-v61_fast_1xb64-50e_voc.py
@@ -0,0 +1,17 @@
+_base_ = './yolov5_s-v61_fast_1xb64-50e_voc.py'
+
+deepen_factor = 0.67
+widen_factor = 0.75
+
+load_from = 'https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_m-v61_syncbn_fast_8xb16-300e_coco/yolov5_m-v61_syncbn_fast_8xb16-300e_coco_20220917_204944-516a710f.pth'  # noqa
+
+model = dict(
+    backbone=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+    ),
+    neck=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+    ),
+    bbox_head=dict(head_module=dict(widen_factor=widen_factor)))
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov5/voc/yolov5_n-v61_fast_1xb64-50e_voc.py b/mmdetection_practice/third_party/mmyolo/configs/yolov5/voc/yolov5_n-v61_fast_1xb64-50e_voc.py
new file mode 100644
index 0000000..041f653
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov5/voc/yolov5_n-v61_fast_1xb64-50e_voc.py
@@ -0,0 +1,17 @@
+_base_ = './yolov5_s-v61_fast_1xb64-50e_voc.py'
+
+deepen_factor = 0.33
+widen_factor = 0.25
+
+load_from = 'https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_n-v61_syncbn_fast_8xb16-300e_coco/yolov5_n-v61_syncbn_fast_8xb16-300e_coco_20220919_090739-b804c1ad.pth'  # noqa
+
+model = dict(
+    backbone=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+    ),
+    neck=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+    ),
+    bbox_head=dict(head_module=dict(widen_factor=widen_factor)))
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov5/voc/yolov5_s-v61_fast_1xb64-50e_voc.py b/mmdetection_practice/third_party/mmyolo/configs/yolov5/voc/yolov5_s-v61_fast_1xb64-50e_voc.py
new file mode 100644
index 0000000..f777fff
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov5/voc/yolov5_s-v61_fast_1xb64-50e_voc.py
@@ -0,0 +1,270 @@
+_base_ = '../yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py'
+
+# dataset settings
+data_root = 'data/VOCdevkit/'
+dataset_type = 'YOLOv5VOCDataset'
+
+# parameters that often need to be modified
+num_classes = 20
+img_scale = (512, 512)  # width, height
+max_epochs = 50
+train_batch_size_per_gpu = 64
+train_num_workers = 8
+val_batch_size_per_gpu = 1
+val_num_workers = 2
+
+# persistent_workers must be False if num_workers is 0.
+persistent_workers = True
+
+lr_factor = 0.15135
+affine_scale = 0.75544
+
+# only on Val
+batch_shapes_cfg = dict(img_size=img_scale[0])
+
+anchors = [[(26, 44), (67, 57), (61, 130)], [(121, 118), (120, 239),
+                                             (206, 182)],
+           [(376, 161), (234, 324), (428, 322)]]
+num_det_layers = 3
+
+load_from = 'https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth'  # noqa
+
+tta_img_scales = [img_scale, (416, 416), (640, 640)]
+
+# Hyperparameter reference from:
+# https://github.com/ultralytics/yolov5/blob/master/data/hyps/hyp.VOC.yaml
+model = dict(
+    bbox_head=dict(
+        head_module=dict(num_classes=num_classes),
+        prior_generator=dict(base_sizes=anchors),
+        loss_cls=dict(
+            loss_weight=0.21638 * (num_classes / 80 * 3 / num_det_layers),
+            class_weight=0.5),
+        loss_bbox=dict(loss_weight=0.02 * (3 / num_det_layers)),
+        loss_obj=dict(
+            loss_weight=0.51728 *
+            ((img_scale[0] / 640)**2 * 3 / num_det_layers),
+            class_weight=0.67198),
+        # Different from COCO
+        prior_match_thr=3.3744),
+    test_cfg=dict(nms=dict(iou_threshold=0.6)))
+
+albu_train_transforms = _base_.albu_train_transforms
+pre_transform = _base_.pre_transform
+
+with_mosiac_pipeline = [
+    dict(
+        type='Mosaic',
+        img_scale=img_scale,
+        pad_val=114.0,
+        pre_transform=pre_transform),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_translate_ratio=0.04591,
+        max_shear_degree=0.0,
+        scaling_ratio_range=(1 - affine_scale, 1 + affine_scale),
+        # img_scale is (width, height)
+        border=(-img_scale[0] // 2, -img_scale[1] // 2),
+        border_val=(114, 114, 114)),
+    dict(
+        type='YOLOv5MixUp',
+        prob=0.04266,
+        pre_transform=[
+            *pre_transform,
+            dict(
+                type='Mosaic',
+                img_scale=img_scale,
+                pad_val=114.0,
+                pre_transform=pre_transform),
+            dict(
+                type='YOLOv5RandomAffine',
+                max_rotate_degree=0.0,
+                max_translate_ratio=0.04591,
+                max_shear_degree=0.0,
+                scaling_ratio_range=(1 - affine_scale, 1 + affine_scale),
+                # img_scale is (width, height)
+                border=(-img_scale[0] // 2, -img_scale[1] // 2),
+                border_val=(114, 114, 114))
+        ])
+]
+
+without_mosaic_pipeline = [
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_translate_ratio=0.04591,
+        max_shear_degree=0.0,
+        scaling_ratio_range=(1 - affine_scale, 1 + affine_scale),
+        border=(0, 0),
+        border_val=(114, 114, 114)),
+    dict(
+        type='LetterResize',
+        scale=img_scale,
+        allow_scale_up=True,
+        pad_val=dict(img=114))
+]
+
+# Because the border parameter is inconsistent when
+# using mosaic or not, `RandomChoice` is used here.
+randchoice_mosaic_pipeline = dict(
+    type='RandomChoice',
+    transforms=[with_mosiac_pipeline, without_mosaic_pipeline],
+    prob=[0.85834, 0.14166])
+
+train_pipeline = [
+    *pre_transform, randchoice_mosaic_pipeline,
+    dict(
+        type='mmdet.Albu',
+        transforms=albu_train_transforms,
+        bbox_params=dict(
+            type='BboxParams',
+            format='pascal_voc',
+            label_fields=['gt_bboxes_labels', 'gt_ignore_flags']),
+        keymap={
+            'img': 'image',
+            'gt_bboxes': 'bboxes'
+        }),
+    dict(
+        type='YOLOv5HSVRandomAug',
+        hue_delta=0.01041,
+        saturation_delta=0.54703,
+        value_delta=0.27739),
+    dict(type='mmdet.RandomFlip', prob=0.5),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                   'flip_direction'))
+]
+
+train_dataloader = dict(
+    _delete_=True,
+    batch_size=train_batch_size_per_gpu,
+    num_workers=train_num_workers,
+    persistent_workers=persistent_workers,
+    pin_memory=True,
+    sampler=dict(type='DefaultSampler', shuffle=True),
+    dataset=dict(
+        type='ConcatDataset',
+        datasets=[
+            dict(
+                type=dataset_type,
+                data_root=data_root,
+                ann_file='VOC2007/ImageSets/Main/trainval.txt',
+                data_prefix=dict(sub_data_root='VOC2007/'),
+                filter_cfg=dict(filter_empty_gt=False, min_size=32),
+                pipeline=train_pipeline),
+            dict(
+                type=dataset_type,
+                data_root=data_root,
+                ann_file='VOC2012/ImageSets/Main/trainval.txt',
+                data_prefix=dict(sub_data_root='VOC2012/'),
+                filter_cfg=dict(filter_empty_gt=False, min_size=32),
+                pipeline=train_pipeline)
+        ],
+        # Use ignore_keys to avoid judging metainfo is
+        # not equal in `ConcatDataset`.
+        ignore_keys='dataset_type'),
+    collate_fn=dict(type='yolov5_collate'))
+
+test_pipeline = [
+    dict(type='LoadImageFromFile', backend_args=_base_.backend_args),
+    dict(type='YOLOv5KeepRatioResize', scale=img_scale),
+    dict(
+        type='LetterResize',
+        scale=img_scale,
+        allow_scale_up=False,
+        pad_val=dict(img=114)),
+    dict(type='LoadAnnotations', with_bbox=True, _scope_='mmdet'),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                   'scale_factor', 'pad_param'))
+]
+
+val_dataloader = dict(
+    batch_size=val_batch_size_per_gpu,
+    num_workers=val_num_workers,
+    persistent_workers=persistent_workers,
+    pin_memory=True,
+    drop_last=False,
+    sampler=dict(type='DefaultSampler', shuffle=False),
+    dataset=dict(
+        type=dataset_type,
+        data_root=data_root,
+        ann_file='VOC2007/ImageSets/Main/test.txt',
+        data_prefix=dict(sub_data_root='VOC2007/'),
+        test_mode=True,
+        pipeline=test_pipeline,
+        batch_shapes_cfg=batch_shapes_cfg))
+
+test_dataloader = val_dataloader
+
+param_scheduler = None
+optim_wrapper = dict(
+    optimizer=dict(
+        lr=0.00334,
+        momentum=0.74832,
+        weight_decay=0.00025,
+        batch_size_per_gpu=train_batch_size_per_gpu))
+
+default_hooks = dict(
+    param_scheduler=dict(
+        lr_factor=lr_factor,
+        max_epochs=max_epochs,
+        warmup_epochs=3.3835,
+        warmup_momentum=0.59462,
+        warmup_bias_lr=0.18657))
+
+custom_hooks = [
+    dict(
+        type='EMAHook',
+        ema_type='ExpMomentumEMA',
+        momentum=0.0001,
+        update_buffers=True,
+        # To load COCO pretrained model, need to set `strict_load=False`
+        strict_load=False,
+        priority=49)
+]
+
+# TODO: Support using coco metric in voc dataset
+val_evaluator = dict(
+    _delete_=True, type='mmdet.VOCMetric', metric='mAP', eval_mode='area')
+
+test_evaluator = val_evaluator
+
+train_cfg = dict(max_epochs=max_epochs)
+
+# Config for Test Time Augmentation. (TTA)
+_multiscale_resize_transforms = [
+    dict(
+        type='Compose',
+        transforms=[
+            dict(type='YOLOv5KeepRatioResize', scale=s),
+            dict(
+                type='LetterResize',
+                scale=s,
+                allow_scale_up=False,
+                pad_val=dict(img=114))
+        ]) for s in tta_img_scales
+]
+
+tta_pipeline = [
+    dict(type='LoadImageFromFile', backend_args=_base_.backend_args),
+    dict(
+        type='TestTimeAug',
+        transforms=[
+            _multiscale_resize_transforms,
+            [
+                dict(type='mmdet.RandomFlip', prob=1.),
+                dict(type='mmdet.RandomFlip', prob=0.)
+            ], [dict(type='mmdet.LoadAnnotations', with_bbox=True)],
+            [
+                dict(
+                    type='mmdet.PackDetInputs',
+                    meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                               'scale_factor', 'pad_param', 'flip',
+                               'flip_direction'))
+            ]
+        ])
+]
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov5/voc/yolov5_x-v61_fast_1xb32-50e_voc.py b/mmdetection_practice/third_party/mmyolo/configs/yolov5/voc/yolov5_x-v61_fast_1xb32-50e_voc.py
new file mode 100644
index 0000000..2fc4d79
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov5/voc/yolov5_x-v61_fast_1xb32-50e_voc.py
@@ -0,0 +1,26 @@
+_base_ = './yolov5_s-v61_fast_1xb64-50e_voc.py'
+
+deepen_factor = 1.33
+widen_factor = 1.25
+train_batch_size_per_gpu = 32
+train_num_workers = 8
+
+# TODO: need to add pretrained_model
+load_from = None
+
+model = dict(
+    backbone=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+    ),
+    neck=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+    ),
+    bbox_head=dict(head_module=dict(widen_factor=widen_factor)))
+
+train_dataloader = dict(
+    batch_size=train_batch_size_per_gpu, num_workers=train_num_workers)
+
+optim_wrapper = dict(
+    optimizer=dict(batch_size_per_gpu=train_batch_size_per_gpu))
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5_l-p6-v62_syncbn_fast_8xb16-300e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5_l-p6-v62_syncbn_fast_8xb16-300e_coco.py
new file mode 100644
index 0000000..6a84fdb
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5_l-p6-v62_syncbn_fast_8xb16-300e_coco.py
@@ -0,0 +1,15 @@
+_base_ = './yolov5_m-p6-v62_syncbn_fast_8xb16-300e_coco.py'
+
+deepen_factor = 1.0
+widen_factor = 1.0
+
+model = dict(
+    backbone=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+    ),
+    neck=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+    ),
+    bbox_head=dict(head_module=dict(widen_factor=widen_factor)))
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5_l-v61_syncbn_fast_8xb16-300e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5_l-v61_syncbn_fast_8xb16-300e_coco.py
new file mode 100644
index 0000000..60a11a3
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5_l-v61_syncbn_fast_8xb16-300e_coco.py
@@ -0,0 +1,15 @@
+_base_ = './yolov5_m-v61_syncbn_fast_8xb16-300e_coco.py'
+
+deepen_factor = 1.0
+widen_factor = 1.0
+
+model = dict(
+    backbone=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+    ),
+    neck=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+    ),
+    bbox_head=dict(head_module=dict(widen_factor=widen_factor)))
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5_m-p6-v62_syncbn_fast_8xb16-300e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5_m-p6-v62_syncbn_fast_8xb16-300e_coco.py
new file mode 100644
index 0000000..f593e37
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5_m-p6-v62_syncbn_fast_8xb16-300e_coco.py
@@ -0,0 +1,79 @@
+_base_ = './yolov5_s-p6-v62_syncbn_fast_8xb16-300e_coco.py'
+
+# ========================modified parameters======================
+deepen_factor = 0.67
+widen_factor = 0.75
+lr_factor = 0.1
+affine_scale = 0.9
+loss_cls_weight = 0.3
+loss_obj_weight = 0.7
+mixup_prob = 0.1
+
+# =======================Unmodified in most cases==================
+num_classes = _base_.num_classes
+num_det_layers = _base_.num_det_layers
+img_scale = _base_.img_scale
+
+model = dict(
+    backbone=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+    ),
+    neck=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+    ),
+    bbox_head=dict(
+        head_module=dict(widen_factor=widen_factor),
+        loss_cls=dict(loss_weight=loss_cls_weight *
+                      (num_classes / 80 * 3 / num_det_layers)),
+        loss_obj=dict(loss_weight=loss_obj_weight *
+                      ((img_scale[0] / 640)**2 * 3 / num_det_layers))))
+
+pre_transform = _base_.pre_transform
+albu_train_transforms = _base_.albu_train_transforms
+
+mosaic_affine_pipeline = [
+    dict(
+        type='Mosaic',
+        img_scale=img_scale,
+        pad_val=114.0,
+        pre_transform=pre_transform),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        scaling_ratio_range=(1 - affine_scale, 1 + affine_scale),
+        # img_scale is (width, height)
+        border=(-img_scale[0] // 2, -img_scale[1] // 2),
+        border_val=(114, 114, 114))
+]
+
+# enable mixup
+train_pipeline = [
+    *pre_transform, *mosaic_affine_pipeline,
+    dict(
+        type='YOLOv5MixUp',
+        prob=mixup_prob,
+        pre_transform=[*pre_transform, *mosaic_affine_pipeline]),
+    dict(
+        type='mmdet.Albu',
+        transforms=albu_train_transforms,
+        bbox_params=dict(
+            type='BboxParams',
+            format='pascal_voc',
+            label_fields=['gt_bboxes_labels', 'gt_ignore_flags']),
+        keymap={
+            'img': 'image',
+            'gt_bboxes': 'bboxes'
+        }),
+    dict(type='YOLOv5HSVRandomAug'),
+    dict(type='mmdet.RandomFlip', prob=0.5),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                   'flip_direction'))
+]
+
+train_dataloader = dict(dataset=dict(pipeline=train_pipeline))
+default_hooks = dict(param_scheduler=dict(lr_factor=lr_factor))
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5_m-v61_syncbn_fast_8xb16-300e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5_m-v61_syncbn_fast_8xb16-300e_coco.py
new file mode 100644
index 0000000..d2ef324
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5_m-v61_syncbn_fast_8xb16-300e_coco.py
@@ -0,0 +1,79 @@
+_base_ = './yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py'
+
+# ========================modified parameters======================
+deepen_factor = 0.67
+widen_factor = 0.75
+lr_factor = 0.1
+affine_scale = 0.9
+loss_cls_weight = 0.3
+loss_obj_weight = 0.7
+mixup_prob = 0.1
+
+# =======================Unmodified in most cases==================
+num_classes = _base_.num_classes
+num_det_layers = _base_.num_det_layers
+img_scale = _base_.img_scale
+
+model = dict(
+    backbone=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+    ),
+    neck=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+    ),
+    bbox_head=dict(
+        head_module=dict(widen_factor=widen_factor),
+        loss_cls=dict(loss_weight=loss_cls_weight *
+                      (num_classes / 80 * 3 / num_det_layers)),
+        loss_obj=dict(loss_weight=loss_obj_weight *
+                      ((img_scale[0] / 640)**2 * 3 / num_det_layers))))
+
+pre_transform = _base_.pre_transform
+albu_train_transforms = _base_.albu_train_transforms
+
+mosaic_affine_pipeline = [
+    dict(
+        type='Mosaic',
+        img_scale=img_scale,
+        pad_val=114.0,
+        pre_transform=pre_transform),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        scaling_ratio_range=(1 - affine_scale, 1 + affine_scale),
+        # img_scale is (width, height)
+        border=(-img_scale[0] // 2, -img_scale[1] // 2),
+        border_val=(114, 114, 114))
+]
+
+# enable mixup
+train_pipeline = [
+    *pre_transform, *mosaic_affine_pipeline,
+    dict(
+        type='YOLOv5MixUp',
+        prob=mixup_prob,
+        pre_transform=[*pre_transform, *mosaic_affine_pipeline]),
+    dict(
+        type='mmdet.Albu',
+        transforms=albu_train_transforms,
+        bbox_params=dict(
+            type='BboxParams',
+            format='pascal_voc',
+            label_fields=['gt_bboxes_labels', 'gt_ignore_flags']),
+        keymap={
+            'img': 'image',
+            'gt_bboxes': 'bboxes'
+        }),
+    dict(type='YOLOv5HSVRandomAug'),
+    dict(type='mmdet.RandomFlip', prob=0.5),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                   'flip_direction'))
+]
+
+train_dataloader = dict(dataset=dict(pipeline=train_pipeline))
+default_hooks = dict(param_scheduler=dict(lr_factor=lr_factor))
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5_n-p6-v62_syncbn_fast_8xb16-300e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5_n-p6-v62_syncbn_fast_8xb16-300e_coco.py
new file mode 100644
index 0000000..3cd2d6b
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5_n-p6-v62_syncbn_fast_8xb16-300e_coco.py
@@ -0,0 +1,15 @@
+_base_ = 'yolov5_s-p6-v62_syncbn_fast_8xb16-300e_coco.py'
+
+deepen_factor = 0.33
+widen_factor = 0.25
+
+model = dict(
+    backbone=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+    ),
+    neck=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+    ),
+    bbox_head=dict(head_module=dict(widen_factor=widen_factor)))
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5_n-v61_syncbn_fast_8xb16-300e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5_n-v61_syncbn_fast_8xb16-300e_coco.py
new file mode 100644
index 0000000..b6f9342
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5_n-v61_syncbn_fast_8xb16-300e_coco.py
@@ -0,0 +1,15 @@
+_base_ = './yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py'
+
+deepen_factor = 0.33
+widen_factor = 0.25
+
+model = dict(
+    backbone=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+    ),
+    neck=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+    ),
+    bbox_head=dict(head_module=dict(widen_factor=widen_factor)))
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5_s-p6-v62_syncbn_fast_8xb16-300e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5_s-p6-v62_syncbn_fast_8xb16-300e_coco.py
new file mode 100644
index 0000000..f64df69
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5_s-p6-v62_syncbn_fast_8xb16-300e_coco.py
@@ -0,0 +1,138 @@
+_base_ = 'yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py'
+
+# ========================modified parameters======================
+img_scale = (1280, 1280)  # width, height
+num_classes = 80  # Number of classes for classification
+# Config of batch shapes. Only on val.
+# It means not used if batch_shapes_cfg is None.
+batch_shapes_cfg = dict(
+    img_size=img_scale[0],
+    # The image scale of padding should be divided by pad_size_divisor
+    size_divisor=64)
+# Basic size of multi-scale prior box
+anchors = [
+    [(19, 27), (44, 40), (38, 94)],  # P3/8
+    [(96, 68), (86, 152), (180, 137)],  # P4/16
+    [(140, 301), (303, 264), (238, 542)],  # P5/32
+    [(436, 615), (739, 380), (925, 792)]  # P6/64
+]
+# Strides of multi-scale prior box
+strides = [8, 16, 32, 64]
+num_det_layers = 4  # The number of model output scales
+loss_cls_weight = 0.5
+loss_bbox_weight = 0.05
+loss_obj_weight = 1.0
+# The obj loss weights of the three output layers
+obj_level_weights = [4.0, 1.0, 0.25, 0.06]
+affine_scale = 0.5  # YOLOv5RandomAffine scaling ratio
+
+tta_img_scales = [(1280, 1280), (1024, 1024), (1536, 1536)]
+# =======================Unmodified in most cases==================
+model = dict(
+    backbone=dict(arch='P6', out_indices=(2, 3, 4, 5)),
+    neck=dict(
+        in_channels=[256, 512, 768, 1024], out_channels=[256, 512, 768, 1024]),
+    bbox_head=dict(
+        head_module=dict(
+            in_channels=[256, 512, 768, 1024], featmap_strides=strides),
+        prior_generator=dict(base_sizes=anchors, strides=strides),
+        # scaled based on number of detection layers
+        loss_cls=dict(loss_weight=loss_cls_weight *
+                      (num_classes / 80 * 3 / num_det_layers)),
+        loss_bbox=dict(loss_weight=loss_bbox_weight * (3 / num_det_layers)),
+        loss_obj=dict(loss_weight=loss_obj_weight *
+                      ((img_scale[0] / 640)**2 * 3 / num_det_layers)),
+        obj_level_weights=obj_level_weights))
+
+pre_transform = _base_.pre_transform
+albu_train_transforms = _base_.albu_train_transforms
+
+train_pipeline = [
+    *pre_transform,
+    dict(
+        type='Mosaic',
+        img_scale=img_scale,
+        pad_val=114.0,
+        pre_transform=pre_transform),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        scaling_ratio_range=(1 - affine_scale, 1 + affine_scale),
+        # img_scale is (width, height)
+        border=(-img_scale[0] // 2, -img_scale[1] // 2),
+        border_val=(114, 114, 114)),
+    dict(
+        type='mmdet.Albu',
+        transforms=albu_train_transforms,
+        bbox_params=dict(
+            type='BboxParams',
+            format='pascal_voc',
+            label_fields=['gt_bboxes_labels', 'gt_ignore_flags']),
+        keymap={
+            'img': 'image',
+            'gt_bboxes': 'bboxes'
+        }),
+    dict(type='YOLOv5HSVRandomAug'),
+    dict(type='mmdet.RandomFlip', prob=0.5),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                   'flip_direction'))
+]
+
+train_dataloader = dict(dataset=dict(pipeline=train_pipeline))
+
+test_pipeline = [
+    dict(type='LoadImageFromFile', backend_args=_base_.backend_args),
+    dict(type='YOLOv5KeepRatioResize', scale=img_scale),
+    dict(
+        type='LetterResize',
+        scale=img_scale,
+        allow_scale_up=False,
+        pad_val=dict(img=114)),
+    dict(type='LoadAnnotations', with_bbox=True, _scope_='mmdet'),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                   'scale_factor', 'pad_param'))
+]
+
+val_dataloader = dict(
+    dataset=dict(pipeline=test_pipeline, batch_shapes_cfg=batch_shapes_cfg))
+
+test_dataloader = val_dataloader
+
+# Config for Test Time Augmentation. (TTA)
+_multiscale_resize_transforms = [
+    dict(
+        type='Compose',
+        transforms=[
+            dict(type='YOLOv5KeepRatioResize', scale=s),
+            dict(
+                type='LetterResize',
+                scale=s,
+                allow_scale_up=False,
+                pad_val=dict(img=114))
+        ]) for s in tta_img_scales
+]
+
+tta_pipeline = [
+    dict(type='LoadImageFromFile', backend_args=_base_.backend_args),
+    dict(
+        type='TestTimeAug',
+        transforms=[
+            _multiscale_resize_transforms,
+            [
+                dict(type='mmdet.RandomFlip', prob=1.),
+                dict(type='mmdet.RandomFlip', prob=0.)
+            ], [dict(type='mmdet.LoadAnnotations', with_bbox=True)],
+            [
+                dict(
+                    type='mmdet.PackDetInputs',
+                    meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                               'scale_factor', 'pad_param', 'flip',
+                               'flip_direction'))
+            ]
+        ])
+]
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5_s-v61_fast_1xb12-40e_608x352_cat.py b/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5_s-v61_fast_1xb12-40e_608x352_cat.py
new file mode 100644
index 0000000..5bbd13e
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5_s-v61_fast_1xb12-40e_608x352_cat.py
@@ -0,0 +1,70 @@
+_base_ = 'yolov5_s-v61_fast_1xb12-40e_cat.py'
+
+# This configuration is used to provide non-square training examples
+# Must be a multiple of 32
+img_scale = (608, 352)  # w h
+
+anchors = [
+    [(65, 35), (159, 45), (119, 80)],  # P3/8
+    [(215, 77), (224, 116), (170, 166)],  # P4/16
+    [(376, 108), (339, 176), (483, 190)]  # P5/32
+]
+
+# ===============================Unmodified in most cases====================
+_base_.model.bbox_head.loss_obj.loss_weight = 1.0 * ((img_scale[1] / 640)**2)
+_base_.model.bbox_head.prior_generator.base_sizes = anchors
+
+train_pipeline = [
+    *_base_.pre_transform,
+    dict(
+        type='Mosaic',
+        img_scale=img_scale,
+        pad_val=114.0,
+        pre_transform=_base_.pre_transform),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        scaling_ratio_range=(1 - _base_.affine_scale, 1 + _base_.affine_scale),
+        # img_scale is (width, height)
+        border=(-img_scale[0] // 2, -img_scale[1] // 2),
+        border_val=(114, 114, 114)),
+    dict(
+        type='mmdet.Albu',
+        transforms=_base_.albu_train_transforms,
+        bbox_params=dict(
+            type='BboxParams',
+            format='pascal_voc',
+            label_fields=['gt_bboxes_labels', 'gt_ignore_flags']),
+        keymap={
+            'img': 'image',
+            'gt_bboxes': 'bboxes'
+        }),
+    dict(type='YOLOv5HSVRandomAug'),
+    dict(type='mmdet.RandomFlip', prob=0.5),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                   'flip_direction'))
+]
+
+_base_.train_dataloader.dataset.pipeline = train_pipeline
+
+test_pipeline = [
+    dict(type='LoadImageFromFile', backend_args=_base_.backend_args),
+    dict(type='YOLOv5KeepRatioResize', scale=img_scale),
+    dict(
+        type='LetterResize',
+        scale=img_scale,
+        allow_scale_up=False,
+        pad_val=dict(img=114)),
+    dict(type='mmdet.LoadAnnotations', with_bbox=True),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                   'scale_factor', 'pad_param'))
+]
+
+val_dataloader = dict(
+    dataset=dict(pipeline=test_pipeline, batch_shapes_cfg=None))
+test_dataloader = val_dataloader
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5_s-v61_fast_1xb12-40e_cat.py b/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5_s-v61_fast_1xb12-40e_cat.py
new file mode 100644
index 0000000..7b7e4f2
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5_s-v61_fast_1xb12-40e_cat.py
@@ -0,0 +1,56 @@
+_base_ = 'yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py'
+
+data_root = './data/cat/'
+class_name = ('cat', )
+num_classes = len(class_name)
+metainfo = dict(classes=class_name, palette=[(20, 220, 60)])
+
+anchors = [
+    [(68, 69), (154, 91), (143, 162)],  # P3/8
+    [(242, 160), (189, 287), (391, 207)],  # P4/16
+    [(353, 337), (539, 341), (443, 432)]  # P5/32
+]
+
+max_epochs = 40
+train_batch_size_per_gpu = 12
+train_num_workers = 4
+
+load_from = 'https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth'  # noqa
+
+model = dict(
+    backbone=dict(frozen_stages=4),
+    bbox_head=dict(
+        head_module=dict(num_classes=num_classes),
+        prior_generator=dict(base_sizes=anchors)))
+
+train_dataloader = dict(
+    batch_size=train_batch_size_per_gpu,
+    num_workers=train_num_workers,
+    dataset=dict(
+        data_root=data_root,
+        metainfo=metainfo,
+        ann_file='annotations/trainval.json',
+        data_prefix=dict(img='images/')))
+
+val_dataloader = dict(
+    dataset=dict(
+        metainfo=metainfo,
+        data_root=data_root,
+        ann_file='annotations/test.json',
+        data_prefix=dict(img='images/')))
+
+test_dataloader = val_dataloader
+
+_base_.optim_wrapper.optimizer.batch_size_per_gpu = train_batch_size_per_gpu
+
+val_evaluator = dict(ann_file=data_root + 'annotations/test.json')
+test_evaluator = val_evaluator
+
+default_hooks = dict(
+    checkpoint=dict(interval=10, max_keep_ckpts=2, save_best='auto'),
+    # The warmup_mim_iter parameter is critical.
+    # The default value is 1000 which is not suitable for cat datasets.
+    param_scheduler=dict(max_epochs=max_epochs, warmup_mim_iter=10),
+    logger=dict(type='LoggerHook', interval=5))
+train_cfg = dict(max_epochs=max_epochs, val_interval=10)
+# visualizer = dict(vis_backends = [dict(type='LocalVisBackend'), dict(type='WandbVisBackend')]) # noqa
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5_s-v61_fast_1xb12-ms-40e_cat.py b/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5_s-v61_fast_1xb12-ms-40e_cat.py
new file mode 100644
index 0000000..dc460fa
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5_s-v61_fast_1xb12-ms-40e_cat.py
@@ -0,0 +1,13 @@
+_base_ = 'yolov5_s-v61_fast_1xb12-40e_cat.py'
+
+model = dict(
+    data_preprocessor=dict(
+        type='YOLOv5DetDataPreprocessor',
+        pad_size_divisor=32,
+        batch_augments=[
+            dict(
+                type='YOLOXBatchSyncRandomResize',
+                random_size_range=(480, 800),
+                size_divisor=32,
+                interval=1)
+        ]))
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5_s-v61_syncbn-detect_8xb16-300e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5_s-v61_syncbn-detect_8xb16-300e_coco.py
new file mode 100644
index 0000000..d8238c1
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5_s-v61_syncbn-detect_8xb16-300e_coco.py
@@ -0,0 +1,23 @@
+_base_ = 'yolov5_s-v61_syncbn_8xb16-300e_coco.py'
+
+test_pipeline = [
+    dict(type='LoadImageFromFile', backend_args=_base_.backend_args),
+    dict(
+        type='LetterResize',
+        scale=_base_.img_scale,
+        allow_scale_up=True,
+        use_mini_pad=True),
+    dict(type='LoadAnnotations', with_bbox=True),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                   'scale_factor', 'pad_param'))
+]
+
+val_dataloader = dict(
+    dataset=dict(pipeline=test_pipeline, batch_shapes_cfg=None))
+test_dataloader = val_dataloader
+
+model = dict(
+    test_cfg=dict(
+        multi_label=False, score_thr=0.25, nms=dict(iou_threshold=0.45)))
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py
new file mode 100644
index 0000000..7e81a03
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py
@@ -0,0 +1,292 @@
+_base_ = ['../_base_/default_runtime.py', '../_base_/det_p5_tta.py']
+
+# ========================Frequently modified parameters======================
+# -----data related-----
+data_root = 'data/coco/'  # Root path of data
+# Path of train annotation file
+train_ann_file = 'annotations/instances_train2017.json'
+train_data_prefix = 'train2017/'  # Prefix of train image path
+# Path of val annotation file
+val_ann_file = 'annotations/instances_val2017.json'
+val_data_prefix = 'val2017/'  # Prefix of val image path
+
+num_classes = 80  # Number of classes for classification
+# Batch size of a single GPU during training
+train_batch_size_per_gpu = 16
+# Worker to pre-fetch data for each single GPU during training
+train_num_workers = 8
+# persistent_workers must be False if num_workers is 0
+persistent_workers = True
+
+# -----model related-----
+# Basic size of multi-scale prior box
+anchors = [
+    [(10, 13), (16, 30), (33, 23)],  # P3/8
+    [(30, 61), (62, 45), (59, 119)],  # P4/16
+    [(116, 90), (156, 198), (373, 326)]  # P5/32
+]
+
+# -----train val related-----
+# Base learning rate for optim_wrapper. Corresponding to 8xb16=128 bs
+base_lr = 0.01
+max_epochs = 300  # Maximum training epochs
+
+model_test_cfg = dict(
+    # The config of multi-label for multi-class prediction.
+    multi_label=True,
+    # The number of boxes before NMS
+    nms_pre=30000,
+    score_thr=0.001,  # Threshold to filter out boxes.
+    nms=dict(type='nms', iou_threshold=0.65),  # NMS type and threshold
+    max_per_img=300)  # Max number of detections of each image
+
+# ========================Possible modified parameters========================
+# -----data related-----
+img_scale = (640, 640)  # width, height
+# Dataset type, this will be used to define the dataset
+dataset_type = 'YOLOv5CocoDataset'
+# Batch size of a single GPU during validation
+val_batch_size_per_gpu = 1
+# Worker to pre-fetch data for each single GPU during validation
+val_num_workers = 2
+
+# Config of batch shapes. Only on val.
+# It means not used if batch_shapes_cfg is None.
+batch_shapes_cfg = dict(
+    type='BatchShapePolicy',
+    batch_size=val_batch_size_per_gpu,
+    img_size=img_scale[0],
+    # The image scale of padding should be divided by pad_size_divisor
+    size_divisor=32,
+    # Additional paddings for pixel scale
+    extra_pad_ratio=0.5)
+
+# -----model related-----
+# The scaling factor that controls the depth of the network structure
+deepen_factor = 0.33
+# The scaling factor that controls the width of the network structure
+widen_factor = 0.5
+# Strides of multi-scale prior box
+strides = [8, 16, 32]
+num_det_layers = 3  # The number of model output scales
+norm_cfg = dict(type='BN', momentum=0.03, eps=0.001)  # Normalization config
+
+# -----train val related-----
+affine_scale = 0.5  # YOLOv5RandomAffine scaling ratio
+loss_cls_weight = 0.5
+loss_bbox_weight = 0.05
+loss_obj_weight = 1.0
+prior_match_thr = 4.  # Priori box matching threshold
+# The obj loss weights of the three output layers
+obj_level_weights = [4., 1., 0.4]
+lr_factor = 0.01  # Learning rate scaling factor
+weight_decay = 0.0005
+# Save model checkpoint and validation intervals
+save_checkpoint_intervals = 10
+# The maximum checkpoints to keep.
+max_keep_ckpts = 3
+# Single-scale training is recommended to
+# be turned on, which can speed up training.
+env_cfg = dict(cudnn_benchmark=True)
+
+# ===============================Unmodified in most cases====================
+model = dict(
+    type='YOLODetector',
+    data_preprocessor=dict(
+        type='mmdet.DetDataPreprocessor',
+        mean=[0., 0., 0.],
+        std=[255., 255., 255.],
+        bgr_to_rgb=True),
+    backbone=dict(
+        type='YOLOv5CSPDarknet',
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+        norm_cfg=norm_cfg,
+        act_cfg=dict(type='SiLU', inplace=True)),
+    neck=dict(
+        type='YOLOv5PAFPN',
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+        in_channels=[256, 512, 1024],
+        out_channels=[256, 512, 1024],
+        num_csp_blocks=3,
+        norm_cfg=norm_cfg,
+        act_cfg=dict(type='SiLU', inplace=True)),
+    bbox_head=dict(
+        type='YOLOv5Head',
+        head_module=dict(
+            type='YOLOv5HeadModule',
+            num_classes=num_classes,
+            in_channels=[256, 512, 1024],
+            widen_factor=widen_factor,
+            featmap_strides=strides,
+            num_base_priors=3),
+        prior_generator=dict(
+            type='mmdet.YOLOAnchorGenerator',
+            base_sizes=anchors,
+            strides=strides),
+        # scaled based on number of detection layers
+        loss_cls=dict(
+            type='mmdet.CrossEntropyLoss',
+            use_sigmoid=True,
+            reduction='mean',
+            loss_weight=loss_cls_weight *
+            (num_classes / 80 * 3 / num_det_layers)),
+        loss_bbox=dict(
+            type='IoULoss',
+            iou_mode='ciou',
+            bbox_format='xywh',
+            eps=1e-7,
+            reduction='mean',
+            loss_weight=loss_bbox_weight * (3 / num_det_layers),
+            return_iou=True),
+        loss_obj=dict(
+            type='mmdet.CrossEntropyLoss',
+            use_sigmoid=True,
+            reduction='mean',
+            loss_weight=loss_obj_weight *
+            ((img_scale[0] / 640)**2 * 3 / num_det_layers)),
+        prior_match_thr=prior_match_thr,
+        obj_level_weights=obj_level_weights),
+    test_cfg=model_test_cfg)
+
+albu_train_transforms = [
+    dict(type='Blur', p=0.01),
+    dict(type='MedianBlur', p=0.01),
+    dict(type='ToGray', p=0.01),
+    dict(type='CLAHE', p=0.01)
+]
+
+pre_transform = [
+    dict(type='LoadImageFromFile', backend_args=_base_.backend_args),
+    dict(type='LoadAnnotations', with_bbox=True)
+]
+
+train_pipeline = [
+    *pre_transform,
+    dict(
+        type='Mosaic',
+        img_scale=img_scale,
+        pad_val=114.0,
+        pre_transform=pre_transform),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        scaling_ratio_range=(1 - affine_scale, 1 + affine_scale),
+        # img_scale is (width, height)
+        border=(-img_scale[0] // 2, -img_scale[1] // 2),
+        border_val=(114, 114, 114)),
+    dict(
+        type='mmdet.Albu',
+        transforms=albu_train_transforms,
+        bbox_params=dict(
+            type='BboxParams',
+            format='pascal_voc',
+            label_fields=['gt_bboxes_labels', 'gt_ignore_flags']),
+        keymap={
+            'img': 'image',
+            'gt_bboxes': 'bboxes'
+        }),
+    dict(type='YOLOv5HSVRandomAug'),
+    dict(type='mmdet.RandomFlip', prob=0.5),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                   'flip_direction'))
+]
+
+train_dataloader = dict(
+    batch_size=train_batch_size_per_gpu,
+    num_workers=train_num_workers,
+    persistent_workers=persistent_workers,
+    pin_memory=True,
+    sampler=dict(type='DefaultSampler', shuffle=True),
+    dataset=dict(
+        type=dataset_type,
+        data_root=data_root,
+        ann_file=train_ann_file,
+        data_prefix=dict(img=train_data_prefix),
+        filter_cfg=dict(filter_empty_gt=False, min_size=32),
+        pipeline=train_pipeline))
+
+test_pipeline = [
+    dict(type='LoadImageFromFile', backend_args=_base_.backend_args),
+    dict(type='YOLOv5KeepRatioResize', scale=img_scale),
+    dict(
+        type='LetterResize',
+        scale=img_scale,
+        allow_scale_up=False,
+        pad_val=dict(img=114)),
+    dict(type='LoadAnnotations', with_bbox=True, _scope_='mmdet'),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                   'scale_factor', 'pad_param'))
+]
+
+val_dataloader = dict(
+    batch_size=val_batch_size_per_gpu,
+    num_workers=val_num_workers,
+    persistent_workers=persistent_workers,
+    pin_memory=True,
+    drop_last=False,
+    sampler=dict(type='DefaultSampler', shuffle=False),
+    dataset=dict(
+        type=dataset_type,
+        data_root=data_root,
+        test_mode=True,
+        data_prefix=dict(img=val_data_prefix),
+        ann_file=val_ann_file,
+        pipeline=test_pipeline,
+        batch_shapes_cfg=batch_shapes_cfg))
+
+test_dataloader = val_dataloader
+
+param_scheduler = None
+optim_wrapper = dict(
+    type='OptimWrapper',
+    optimizer=dict(
+        type='SGD',
+        lr=base_lr,
+        momentum=0.937,
+        weight_decay=weight_decay,
+        nesterov=True,
+        batch_size_per_gpu=train_batch_size_per_gpu),
+    constructor='YOLOv5OptimizerConstructor')
+
+default_hooks = dict(
+    param_scheduler=dict(
+        type='YOLOv5ParamSchedulerHook',
+        scheduler_type='linear',
+        lr_factor=lr_factor,
+        max_epochs=max_epochs),
+    checkpoint=dict(
+        type='CheckpointHook',
+        interval=save_checkpoint_intervals,
+        save_best='auto',
+        max_keep_ckpts=max_keep_ckpts))
+
+custom_hooks = [
+    dict(
+        type='EMAHook',
+        ema_type='ExpMomentumEMA',
+        momentum=0.0001,
+        update_buffers=True,
+        strict_load=False,
+        priority=49)
+]
+
+val_evaluator = dict(
+    type='mmdet.CocoMetric',
+    proposal_nums=(100, 1, 10),
+    ann_file=data_root + val_ann_file,
+    metric='bbox')
+test_evaluator = val_evaluator
+
+train_cfg = dict(
+    type='EpochBasedTrainLoop',
+    max_epochs=max_epochs,
+    val_interval=save_checkpoint_intervals)
+val_cfg = dict(type='ValLoop')
+test_cfg = dict(type='TestLoop')
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5_s-v61_syncbn_fast_1xb4-300e_balloon.py b/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5_s-v61_syncbn_fast_1xb4-300e_balloon.py
new file mode 100644
index 0000000..2c585ce
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5_s-v61_syncbn_fast_1xb4-300e_balloon.py
@@ -0,0 +1,42 @@
+_base_ = './yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py'
+
+# ========================modified parameters======================
+data_root = 'data/balloon/'
+# Path of train annotation file
+train_ann_file = 'train.json'
+train_data_prefix = 'train/'  # Prefix of train image path
+# Path of val annotation file
+val_ann_file = 'val.json'
+val_data_prefix = 'val/'  # Prefix of val image path
+metainfo = {
+    'classes': ('balloon', ),
+    'palette': [
+        (220, 20, 60),
+    ]
+}
+num_classes = 1
+
+train_batch_size_per_gpu = 4
+train_num_workers = 2
+log_interval = 1
+
+# =======================Unmodified in most cases==================
+train_dataloader = dict(
+    batch_size=train_batch_size_per_gpu,
+    num_workers=train_num_workers,
+    dataset=dict(
+        data_root=data_root,
+        metainfo=metainfo,
+        data_prefix=dict(img=train_data_prefix),
+        ann_file=train_ann_file))
+val_dataloader = dict(
+    dataset=dict(
+        data_root=data_root,
+        metainfo=metainfo,
+        data_prefix=dict(img=val_data_prefix),
+        ann_file=val_ann_file))
+test_dataloader = val_dataloader
+val_evaluator = dict(ann_file=data_root + val_ann_file)
+test_evaluator = val_evaluator
+model = dict(bbox_head=dict(head_module=dict(num_classes=num_classes)))
+default_hooks = dict(logger=dict(interval=log_interval))
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py
new file mode 100644
index 0000000..17b4a73
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py
@@ -0,0 +1,12 @@
+_base_ = 'yolov5_s-v61_syncbn_8xb16-300e_coco.py'
+
+# fast means faster training speed,
+# but less flexibility for multitasking
+model = dict(
+    data_preprocessor=dict(
+        type='YOLOv5DetDataPreprocessor',
+        mean=[0., 0., 0.],
+        std=[255., 255., 255.],
+        bgr_to_rgb=True))
+
+train_dataloader = dict(collate_fn=dict(type='yolov5_collate'))
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5_x-p6-v62_syncbn_fast_8xb16-300e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5_x-p6-v62_syncbn_fast_8xb16-300e_coco.py
new file mode 100644
index 0000000..9fe5c01
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5_x-p6-v62_syncbn_fast_8xb16-300e_coco.py
@@ -0,0 +1,14 @@
+_base_ = './yolov5_m-p6-v62_syncbn_fast_8xb16-300e_coco.py'
+deepen_factor = 1.33
+widen_factor = 1.25
+
+model = dict(
+    backbone=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+    ),
+    neck=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+    ),
+    bbox_head=dict(head_module=dict(widen_factor=widen_factor)))
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5_x-v61_syncbn_fast_8xb16-300e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5_x-v61_syncbn_fast_8xb16-300e_coco.py
new file mode 100644
index 0000000..8782eed
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5_x-v61_syncbn_fast_8xb16-300e_coco.py
@@ -0,0 +1,14 @@
+_base_ = './yolov5_m-v61_syncbn_fast_8xb16-300e_coco.py'
+deepen_factor = 1.33
+widen_factor = 1.25
+
+model = dict(
+    backbone=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+    ),
+    neck=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+    ),
+    bbox_head=dict(head_module=dict(widen_factor=widen_factor)))
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5u/yolov5u_l_mask-refine_syncbn_fast_8xb16-300e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5u/yolov5u_l_mask-refine_syncbn_fast_8xb16-300e_coco.py
new file mode 100644
index 0000000..60c11fe
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5u/yolov5u_l_mask-refine_syncbn_fast_8xb16-300e_coco.py
@@ -0,0 +1,59 @@
+_base_ = './yolov5u_m_mask-refine_syncbn_fast_8xb16-300e_coco.py'
+
+# This config will refine bbox by mask while loading annotations and
+# transforming after `YOLOv5RandomAffine`
+
+# ========================modified parameters======================
+deepen_factor = 1.00
+widen_factor = 1.00
+
+mixup_prob = 0.15
+copypaste_prob = 0.3
+
+# =======================Unmodified in most cases==================
+img_scale = _base_.img_scale
+pre_transform = _base_.pre_transform
+last_transform = _base_.last_transform
+affine_scale = _base_.affine_scale
+
+model = dict(
+    backbone=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+    ),
+    neck=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+    ),
+    bbox_head=dict(head_module=dict(widen_factor=widen_factor)))
+
+mosaic_affine_transform = [
+    dict(
+        type='Mosaic',
+        img_scale=img_scale,
+        pad_val=114.0,
+        pre_transform=pre_transform),
+    dict(type='YOLOv5CopyPaste', prob=copypaste_prob),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        max_aspect_ratio=100.,
+        scaling_ratio_range=(1 - affine_scale, 1 + affine_scale),
+        # img_scale is (width, height)
+        border=(-img_scale[0] // 2, -img_scale[1] // 2),
+        border_val=(114, 114, 114),
+        min_area_ratio=_base_.min_area_ratio,
+        use_mask_refine=_base_.use_mask2refine)
+]
+
+train_pipeline = [
+    *pre_transform, *mosaic_affine_transform,
+    dict(
+        type='YOLOv5MixUp',
+        prob=mixup_prob,
+        pre_transform=[*pre_transform, *mosaic_affine_transform]),
+    *last_transform
+]
+
+train_dataloader = dict(dataset=dict(pipeline=train_pipeline))
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5u/yolov5u_l_syncbn_fast_8xb16-300e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5u/yolov5u_l_syncbn_fast_8xb16-300e_coco.py
new file mode 100644
index 0000000..22b9e88
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5u/yolov5u_l_syncbn_fast_8xb16-300e_coco.py
@@ -0,0 +1,18 @@
+_base_ = './yolov5u_s_syncbn_fast_8xb16-300e_coco.py'
+
+# ========================modified parameters======================
+# TODO: Update the training hyperparameters
+deepen_factor = 1.0
+widen_factor = 1.0
+
+# =======================Unmodified in most cases==================
+model = dict(
+    backbone=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+    ),
+    neck=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+    ),
+    bbox_head=dict(head_module=dict(widen_factor=widen_factor)))
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5u/yolov5u_m_mask-refine_syncbn_fast_8xb16-300e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5u/yolov5u_m_mask-refine_syncbn_fast_8xb16-300e_coco.py
new file mode 100644
index 0000000..ecc86fd
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5u/yolov5u_m_mask-refine_syncbn_fast_8xb16-300e_coco.py
@@ -0,0 +1,79 @@
+_base_ = './yolov5u_s_mask-refine_syncbn_fast_8xb16-300e_coco.py'
+
+# This config will refine bbox by mask while loading annotations and
+# transforming after `YOLOv5RandomAffine`
+
+# ========================modified parameters======================
+deepen_factor = 0.67
+widen_factor = 0.75
+
+affine_scale = 0.9
+mixup_prob = 0.1
+copypaste_prob = 0.1
+
+# =======================Unmodified in most cases==================
+img_scale = _base_.img_scale
+pre_transform = _base_.pre_transform
+last_transform = _base_.last_transform
+
+model = dict(
+    backbone=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+    ),
+    neck=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+    ),
+    bbox_head=dict(head_module=dict(widen_factor=widen_factor)))
+
+mosaic_affine_transform = [
+    dict(
+        type='Mosaic',
+        img_scale=img_scale,
+        pad_val=114.0,
+        pre_transform=pre_transform),
+    dict(type='YOLOv5CopyPaste', prob=copypaste_prob),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        max_aspect_ratio=100.,
+        scaling_ratio_range=(1 - affine_scale, 1 + affine_scale),
+        # img_scale is (width, height)
+        border=(-img_scale[0] // 2, -img_scale[1] // 2),
+        border_val=(114, 114, 114),
+        min_area_ratio=_base_.min_area_ratio,
+        use_mask_refine=_base_.use_mask2refine)
+]
+
+train_pipeline = [
+    *pre_transform, *mosaic_affine_transform,
+    dict(
+        type='YOLOv5MixUp',
+        prob=mixup_prob,
+        pre_transform=[*pre_transform, *mosaic_affine_transform]),
+    *last_transform
+]
+
+train_pipeline_stage2 = [
+    *pre_transform,
+    dict(type='YOLOv5KeepRatioResize', scale=img_scale),
+    dict(
+        type='LetterResize',
+        scale=img_scale,
+        allow_scale_up=True,
+        pad_val=dict(img=114.0)),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        scaling_ratio_range=(1 - affine_scale, 1 + affine_scale),
+        max_aspect_ratio=_base_.max_aspect_ratio,
+        border_val=(114, 114, 114),
+        min_area_ratio=_base_.min_area_ratio,
+        use_mask_refine=_base_.use_mask2refine), *last_transform
+]
+
+train_dataloader = dict(dataset=dict(pipeline=train_pipeline))
+_base_.custom_hooks[1].switch_pipeline = train_pipeline_stage2
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5u/yolov5u_m_syncbn_fast_8xb16-300e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5u/yolov5u_m_syncbn_fast_8xb16-300e_coco.py
new file mode 100644
index 0000000..0cfb332
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5u/yolov5u_m_syncbn_fast_8xb16-300e_coco.py
@@ -0,0 +1,18 @@
+_base_ = './yolov5u_s_syncbn_fast_8xb16-300e_coco.py'
+
+# ========================modified parameters======================
+# TODO: Update the training hyperparameters
+deepen_factor = 0.67
+widen_factor = 0.75
+
+# =======================Unmodified in most cases==================
+model = dict(
+    backbone=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+    ),
+    neck=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+    ),
+    bbox_head=dict(head_module=dict(widen_factor=widen_factor)))
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5u/yolov5u_n_mask-refine_syncbn_fast_8xb16-300e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5u/yolov5u_n_mask-refine_syncbn_fast_8xb16-300e_coco.py
new file mode 100644
index 0000000..1ca21b6
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5u/yolov5u_n_mask-refine_syncbn_fast_8xb16-300e_coco.py
@@ -0,0 +1,20 @@
+_base_ = './yolov5u_s_mask-refine_syncbn_fast_8xb16-300e_coco.py'
+
+# This config will refine bbox by mask while loading annotations and
+# transforming after `YOLOv5RandomAffine`
+
+# ========================modified parameters======================
+deepen_factor = 0.33
+widen_factor = 0.25
+
+# ===============================Unmodified in most cases====================
+model = dict(
+    backbone=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+    ),
+    neck=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+    ),
+    bbox_head=dict(head_module=dict(widen_factor=widen_factor)))
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5u/yolov5u_n_syncbn_fast_8xb16-300e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5u/yolov5u_n_syncbn_fast_8xb16-300e_coco.py
new file mode 100644
index 0000000..ad6a9f2
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5u/yolov5u_n_syncbn_fast_8xb16-300e_coco.py
@@ -0,0 +1,17 @@
+_base_ = './yolov5u_s_syncbn_fast_8xb16-300e_coco.py'
+
+# ========================modified parameters======================
+deepen_factor = 0.33
+widen_factor = 0.25
+
+# =======================Unmodified in most cases==================
+model = dict(
+    backbone=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+    ),
+    neck=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+    ),
+    bbox_head=dict(head_module=dict(widen_factor=widen_factor)))
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5u/yolov5u_s_mask-refine_syncbn_fast_8xb16-300e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5u/yolov5u_s_mask-refine_syncbn_fast_8xb16-300e_coco.py
new file mode 100644
index 0000000..d6840bc
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5u/yolov5u_s_mask-refine_syncbn_fast_8xb16-300e_coco.py
@@ -0,0 +1,80 @@
+_base_ = './yolov5u_s_syncbn_fast_8xb16-300e_coco.py'
+
+# This config will refine bbox by mask while loading annotations and
+# transforming after `YOLOv5RandomAffine`
+
+# ========================modified parameters======================
+use_mask2refine = True
+min_area_ratio = 0.01  # YOLOv5RandomAffine
+
+# ===============================Unmodified in most cases====================
+pre_transform = [
+    dict(type='LoadImageFromFile', backend_args=_base_.backend_args),
+    dict(
+        type='LoadAnnotations',
+        with_bbox=True,
+        with_mask=True,
+        mask2bbox=use_mask2refine)
+]
+
+last_transform = [
+    # Delete gt_masks to avoid more computation
+    dict(type='RemoveDataElement', keys=['gt_masks']),
+    dict(
+        type='mmdet.Albu',
+        transforms=_base_.albu_train_transforms,
+        bbox_params=dict(
+            type='BboxParams',
+            format='pascal_voc',
+            label_fields=['gt_bboxes_labels', 'gt_ignore_flags']),
+        keymap={
+            'img': 'image',
+            'gt_bboxes': 'bboxes'
+        }),
+    dict(type='YOLOv5HSVRandomAug'),
+    dict(type='mmdet.RandomFlip', prob=0.5),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                   'flip_direction'))
+]
+
+train_pipeline = [
+    *pre_transform,
+    dict(
+        type='Mosaic',
+        img_scale=_base_.img_scale,
+        pad_val=114.0,
+        pre_transform=pre_transform),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        scaling_ratio_range=(1 - _base_.affine_scale, 1 + _base_.affine_scale),
+        # img_scale is (width, height)
+        border=(-_base_.img_scale[0] // 2, -_base_.img_scale[1] // 2),
+        border_val=(114, 114, 114),
+        min_area_ratio=min_area_ratio,
+        use_mask_refine=use_mask2refine),
+    *last_transform
+]
+
+train_pipeline_stage2 = [
+    *pre_transform,
+    dict(type='YOLOv5KeepRatioResize', scale=_base_.img_scale),
+    dict(
+        type='LetterResize',
+        scale=_base_.img_scale,
+        allow_scale_up=True,
+        pad_val=dict(img=114.0)),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        scaling_ratio_range=(1 - _base_.affine_scale, 1 + _base_.affine_scale),
+        max_aspect_ratio=_base_.max_aspect_ratio,
+        border_val=(114, 114, 114)), *last_transform
+]
+
+train_dataloader = dict(dataset=dict(pipeline=train_pipeline))
+_base_.custom_hooks[1].switch_pipeline = train_pipeline_stage2
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5u/yolov5u_s_syncbn_fast_8xb16-300e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5u/yolov5u_s_syncbn_fast_8xb16-300e_coco.py
new file mode 100644
index 0000000..81d3a98
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5u/yolov5u_s_syncbn_fast_8xb16-300e_coco.py
@@ -0,0 +1,326 @@
+_base_ = ['../../_base_/default_runtime.py', '../../_base_/det_p5_tta.py']
+
+# ========================Frequently modified parameters======================
+# -----data related-----
+data_root = 'data/coco/'  # Root path of data
+# Path of train annotation file
+train_ann_file = 'annotations/instances_train2017.json'
+train_data_prefix = 'train2017/'  # Prefix of train image path
+# Path of val annotation file
+val_ann_file = 'annotations/instances_val2017.json'
+val_data_prefix = 'val2017/'  # Prefix of val image path
+
+num_classes = 80  # Number of classes for classification
+# Batch size of a single GPU during training
+train_batch_size_per_gpu = 16
+# Worker to pre-fetch data for each single GPU during training
+train_num_workers = 8
+# persistent_workers must be False if num_workers is 0
+persistent_workers = True
+
+# -----train val related-----
+# Base learning rate for optim_wrapper. Corresponding to 8xb16=128 bs
+base_lr = 0.01
+max_epochs = 300  # Maximum training epochs
+# Disable mosaic augmentation for final 10 epochs (stage 2)
+close_mosaic_epochs = 10
+
+model_test_cfg = dict(
+    # The config of multi-label for multi-class prediction.
+    multi_label=True,
+    # The number of boxes before NMS
+    nms_pre=30000,
+    score_thr=0.001,  # Threshold to filter out boxes.
+    nms=dict(type='nms', iou_threshold=0.7),  # NMS type and threshold
+    max_per_img=300)  # Max number of detections of each image
+
+# ========================Possible modified parameters========================
+# -----data related-----
+img_scale = (640, 640)  # width, height
+# Dataset type, this will be used to define the dataset
+dataset_type = 'YOLOv5CocoDataset'
+# Batch size of a single GPU during validation
+val_batch_size_per_gpu = 1
+# Worker to pre-fetch data for each single GPU during validation
+val_num_workers = 2
+
+# Config of batch shapes. Only on val.
+# It means not used if batch_shapes_cfg is None.
+batch_shapes_cfg = dict(
+    type='BatchShapePolicy',
+    batch_size=val_batch_size_per_gpu,
+    img_size=img_scale[0],
+    # The image scale of padding should be divided by pad_size_divisor
+    size_divisor=32,
+    # Additional paddings for pixel scale
+    extra_pad_ratio=0.5)
+
+# -----model related-----
+# The scaling factor that controls the depth of the network structure
+deepen_factor = 0.33
+# The scaling factor that controls the width of the network structure
+widen_factor = 0.5
+# Strides of multi-scale prior box
+strides = [8, 16, 32]
+num_det_layers = 3  # The number of model output scales
+norm_cfg = dict(type='BN', momentum=0.03, eps=0.001)  # Normalization config
+
+# -----train val related-----
+tal_topk = 10  # Number of bbox selected in each level
+tal_alpha = 0.5  # A Hyper-parameter related to alignment_metrics
+tal_beta = 6.0  # A Hyper-parameter related to alignment_metrics
+
+affine_scale = 0.5  # YOLOv5RandomAffine scaling ratio
+# YOLOv5RandomAffine aspect ratio of width and height thres to filter bboxes
+max_aspect_ratio = 100
+# TODO: Automatically scale loss_weight based on number of detection layers
+loss_cls_weight = 0.5
+loss_bbox_weight = 7.5
+# Since the dfloss is implemented differently in the official
+# and mmdet, we're going to divide loss_weight by 4.
+loss_dfl_weight = 1.5 / 4
+lr_factor = 0.01  # Learning rate scaling factor
+weight_decay = 0.001
+# Save model checkpoint and validation intervals
+save_checkpoint_intervals = 10
+# The maximum checkpoints to keep.
+max_keep_ckpts = 3
+# Single-scale training is recommended to
+# be turned on, which can speed up training.
+env_cfg = dict(cudnn_benchmark=True)
+
+# ===============================Unmodified in most cases====================
+model = dict(
+    type='YOLODetector',
+    data_preprocessor=dict(
+        type='YOLOv5DetDataPreprocessor',
+        mean=[0., 0., 0.],
+        std=[255., 255., 255.],
+        bgr_to_rgb=True),
+    backbone=dict(
+        type='YOLOv5CSPDarknet',
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+        norm_cfg=norm_cfg,
+        act_cfg=dict(type='SiLU', inplace=True)),
+    neck=dict(
+        type='YOLOv5PAFPN',
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+        in_channels=[256, 512, 1024],
+        out_channels=[256, 512, 1024],
+        num_csp_blocks=3,
+        norm_cfg=norm_cfg,
+        act_cfg=dict(type='SiLU', inplace=True)),
+    bbox_head=dict(
+        type='YOLOv8Head',
+        head_module=dict(
+            type='YOLOv8HeadModule',
+            num_classes=num_classes,
+            in_channels=[256, 512, 1024],
+            widen_factor=widen_factor,
+            reg_max=16,
+            norm_cfg=norm_cfg,
+            act_cfg=dict(type='SiLU', inplace=True),
+            featmap_strides=strides),
+        prior_generator=dict(
+            type='mmdet.MlvlPointGenerator', offset=0.5, strides=strides),
+        bbox_coder=dict(type='DistancePointBBoxCoder'),
+        # scaled based on number of detection layers
+        loss_cls=dict(
+            type='mmdet.CrossEntropyLoss',
+            use_sigmoid=True,
+            reduction='none',
+            loss_weight=loss_cls_weight),
+        loss_bbox=dict(
+            type='IoULoss',
+            iou_mode='ciou',
+            bbox_format='xyxy',
+            reduction='sum',
+            loss_weight=loss_bbox_weight,
+            return_iou=False),
+        loss_dfl=dict(
+            type='mmdet.DistributionFocalLoss',
+            reduction='mean',
+            loss_weight=loss_dfl_weight)),
+    train_cfg=dict(
+        assigner=dict(
+            type='BatchTaskAlignedAssigner',
+            num_classes=num_classes,
+            use_ciou=True,
+            topk=tal_topk,
+            alpha=tal_alpha,
+            beta=tal_beta,
+            eps=1e-9)),
+    test_cfg=model_test_cfg)
+
+albu_train_transforms = [
+    dict(type='Blur', p=0.01),
+    dict(type='MedianBlur', p=0.01),
+    dict(type='ToGray', p=0.01),
+    dict(type='CLAHE', p=0.01)
+]
+
+pre_transform = [
+    dict(type='LoadImageFromFile', backend_args=_base_.backend_args),
+    dict(type='LoadAnnotations', with_bbox=True)
+]
+
+last_transform = [
+    dict(
+        type='mmdet.Albu',
+        transforms=albu_train_transforms,
+        bbox_params=dict(
+            type='BboxParams',
+            format='pascal_voc',
+            label_fields=['gt_bboxes_labels', 'gt_ignore_flags']),
+        keymap={
+            'img': 'image',
+            'gt_bboxes': 'bboxes'
+        }),
+    dict(type='YOLOv5HSVRandomAug'),
+    dict(type='mmdet.RandomFlip', prob=0.5),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                   'flip_direction'))
+]
+
+train_pipeline = [
+    *pre_transform,
+    dict(
+        type='Mosaic',
+        img_scale=img_scale,
+        pad_val=114.0,
+        pre_transform=pre_transform),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        scaling_ratio_range=(1 - affine_scale, 1 + affine_scale),
+        max_aspect_ratio=max_aspect_ratio,
+        # img_scale is (width, height)
+        border=(-img_scale[0] // 2, -img_scale[1] // 2),
+        border_val=(114, 114, 114)),
+    *last_transform
+]
+
+train_pipeline_stage2 = [
+    *pre_transform,
+    dict(type='YOLOv5KeepRatioResize', scale=img_scale),
+    dict(
+        type='LetterResize',
+        scale=img_scale,
+        allow_scale_up=True,
+        pad_val=dict(img=114.0)),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        scaling_ratio_range=(1 - affine_scale, 1 + affine_scale),
+        max_aspect_ratio=max_aspect_ratio,
+        border_val=(114, 114, 114)), *last_transform
+]
+
+train_dataloader = dict(
+    batch_size=train_batch_size_per_gpu,
+    num_workers=train_num_workers,
+    persistent_workers=persistent_workers,
+    pin_memory=True,
+    sampler=dict(type='DefaultSampler', shuffle=True),
+    collate_fn=dict(type='yolov5_collate'),
+    dataset=dict(
+        type=dataset_type,
+        data_root=data_root,
+        ann_file=train_ann_file,
+        data_prefix=dict(img=train_data_prefix),
+        filter_cfg=dict(filter_empty_gt=False, min_size=32),
+        pipeline=train_pipeline))
+
+test_pipeline = [
+    dict(type='LoadImageFromFile', backend_args=_base_.backend_args),
+    dict(type='YOLOv5KeepRatioResize', scale=img_scale),
+    dict(
+        type='LetterResize',
+        scale=img_scale,
+        allow_scale_up=False,
+        pad_val=dict(img=114)),
+    dict(type='LoadAnnotations', with_bbox=True, _scope_='mmdet'),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                   'scale_factor', 'pad_param'))
+]
+
+val_dataloader = dict(
+    batch_size=val_batch_size_per_gpu,
+    num_workers=val_num_workers,
+    persistent_workers=persistent_workers,
+    pin_memory=True,
+    drop_last=False,
+    sampler=dict(type='DefaultSampler', shuffle=False),
+    dataset=dict(
+        type=dataset_type,
+        data_root=data_root,
+        test_mode=True,
+        data_prefix=dict(img=val_data_prefix),
+        ann_file=val_ann_file,
+        pipeline=test_pipeline,
+        batch_shapes_cfg=batch_shapes_cfg))
+
+test_dataloader = val_dataloader
+
+param_scheduler = None
+optim_wrapper = dict(
+    type='OptimWrapper',
+    optimizer=dict(
+        type='SGD',
+        lr=base_lr,
+        momentum=0.937,
+        weight_decay=weight_decay,
+        nesterov=True,
+        batch_size_per_gpu=train_batch_size_per_gpu),
+    constructor='YOLOv5OptimizerConstructor')
+
+default_hooks = dict(
+    param_scheduler=dict(
+        type='YOLOv5ParamSchedulerHook',
+        scheduler_type='linear',
+        lr_factor=lr_factor,
+        max_epochs=max_epochs,
+        warmup_epochs=3.0,
+        warmup_momentum=0.8,
+        warmup_bias_lr=0.1),
+    checkpoint=dict(
+        type='CheckpointHook',
+        interval=save_checkpoint_intervals,
+        save_best='auto',
+        max_keep_ckpts=max_keep_ckpts))
+
+custom_hooks = [
+    dict(
+        type='EMAHook',
+        ema_type='ExpMomentumEMA',
+        momentum=0.0001,
+        update_buffers=True,
+        strict_load=False,
+        priority=49),
+    dict(
+        type='mmdet.PipelineSwitchHook',
+        switch_epoch=max_epochs - close_mosaic_epochs,
+        switch_pipeline=train_pipeline_stage2)
+]
+
+val_evaluator = dict(
+    type='mmdet.CocoMetric',
+    proposal_nums=(100, 1, 10),
+    ann_file=data_root + val_ann_file,
+    metric='bbox')
+test_evaluator = val_evaluator
+
+train_cfg = dict(
+    type='EpochBasedTrainLoop',
+    max_epochs=max_epochs,
+    val_interval=save_checkpoint_intervals)
+val_cfg = dict(type='ValLoop')
+test_cfg = dict(type='TestLoop')
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5u/yolov5u_x_mask-refine_syncbn_fast_8xb16-300e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5u/yolov5u_x_mask-refine_syncbn_fast_8xb16-300e_coco.py
new file mode 100644
index 0000000..33092aa
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5u/yolov5u_x_mask-refine_syncbn_fast_8xb16-300e_coco.py
@@ -0,0 +1,17 @@
+_base_ = './yolov5u_l_mask-refine_syncbn_fast_8xb16-300e_coco.py'
+
+# ========================modified parameters======================
+deepen_factor = 1.33
+widen_factor = 1.25
+
+# =======================Unmodified in most cases==================
+model = dict(
+    backbone=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+    ),
+    neck=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+    ),
+    bbox_head=dict(head_module=dict(widen_factor=widen_factor)))
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5u/yolov5u_x_syncbn_fast_8xb16-300e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5u/yolov5u_x_syncbn_fast_8xb16-300e_coco.py
new file mode 100644
index 0000000..fd471fd
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov5/yolov5u/yolov5u_x_syncbn_fast_8xb16-300e_coco.py
@@ -0,0 +1,18 @@
+_base_ = './yolov5u_l_syncbn_fast_8xb16-300e_coco.py'
+
+# ========================modified parameters======================
+# TODO: Update the training hyperparameters
+deepen_factor = 1.33
+widen_factor = 1.25
+
+# =======================Unmodified in most cases==================
+model = dict(
+    backbone=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+    ),
+    neck=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+    ),
+    bbox_head=dict(head_module=dict(widen_factor=widen_factor)))
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov6/README.md b/mmdetection_practice/third_party/mmyolo/configs/yolov6/README.md
new file mode 100644
index 0000000..7ecda27
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov6/README.md
@@ -0,0 +1,53 @@
+# YOLOv6
+
+> [YOLOv6: A Single-Stage Object Detection Framework for Industrial Applications](https://arxiv.org/abs/2209.02976)
+
+<!-- [ALGORITHM] -->
+
+## Abstract
+
+For years, YOLO series have been de facto industry-level standard for efficient object detection. The YOLO community has prospered overwhelmingly to enrich its use in a multitude of hardware platforms and abundant scenarios. In this technical report, we strive to push its limits to the next level, stepping forward with an unwavering mindset for industry application. Considering the diverse requirements for speed and accuracy in the real environment, we extensively examine the up-to-date object detection advancements either from industry or academy. Specifically, we heavily assimilate ideas from recent network design, training strategies, testing techniques, quantization and optimization methods. On top of this, we integrate our thoughts and practice to build a suite of deployment-ready networks at various scales to accommodate diversified use cases. With the generous permission of YOLO authors, we name it YOLOv6. We also express our warm welcome to users and contributors for further enhancement. For a glimpse of performance, our YOLOv6-N hits 35.9% AP on COCO dataset at a throughput of 1234 FPS on an NVIDIA Tesla T4 GPU. YOLOv6-S strikes 43.5% AP at 495 FPS, outperforming other mainstream detectors at the same scale (YOLOv5-S, YOLOX-S and PPYOLOE-S). Our quantized version of YOLOv6-S even brings a new state-of-the-art 43.3% AP at 869 FPS. Furthermore, YOLOv6-M/L also achieves better accuracy performance (i.e., 49.5%/52.3%) than other detectors with the similar inference speed. We carefully conducted experiments to validate the effectiveness of each component.
+
+<div align=center>
+<img src="https://github.com/meituan/YOLOv6/raw/main/assets/speed_comparision_v2.png"/>
+</div>
+
+<div align=center >
+<img alt="YOLOv6-s" src="https://user-images.githubusercontent.com/58845482/209790152-21c29d42-30cc-4c48-a723-39b198286c4d.png"/>
+YOLOv6-s model structure
+</div>
+
+<div align=center >
+<img alt="YOLOv6-l" src="https://user-images.githubusercontent.com/58845482/209787949-d57691c0-a2ea-4a0a-829f-e8a64ac29c7e.png"/>
+YOLOv6-l model structure
+</div>
+
+## Results and models
+
+### COCO
+
+| Backbone | Arch | Size | Epoch | SyncBN | AMP | Mem (GB) | Box AP |                       Config                        |                                                                                                                                                           Download                                                                                                                                                           |
+| :------: | :--: | :--: | :---: | :----: | :-: | :------: | :----: | :-------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: |
+| YOLOv6-n |  P5  | 640  |  400  |  Yes   | Yes |   6.04   |  36.2  | [config](./yolov6_n_syncbn_fast_8xb32-400e_coco.py) | [model](https://download.openmmlab.com/mmyolo/v0/yolov6/yolov6_n_syncbn_fast_8xb32-400e_coco/yolov6_n_syncbn_fast_8xb32-400e_coco_20221030_202726-d99b2e82.pth) \| [log](https://download.openmmlab.com/mmyolo/v0/yolov6/yolov6_n_syncbn_fast_8xb32-400e_coco/yolov6_n_syncbn_fast_8xb32-400e_coco_20221030_202726.log.json) |
+| YOLOv6-t |  P5  | 640  |  400  |  Yes   | Yes |   8.13   |  41.0  | [config](./yolov6_t_syncbn_fast_8xb32-400e_coco.py) | [model](https://download.openmmlab.com/mmyolo/v0/yolov6/yolov6_t_syncbn_fast_8xb32-400e_coco/yolov6_t_syncbn_fast_8xb32-400e_coco_20221030_143755-cf0d278f.pth) \| [log](https://download.openmmlab.com/mmyolo/v0/yolov6/yolov6_t_syncbn_fast_8xb32-400e_coco/yolov6_t_syncbn_fast_8xb32-400e_coco_20221030_143755.log.json) |
+| YOLOv6-s |  P5  | 640  |  400  |  Yes   | Yes |   8.88   |  44.0  | [config](./yolov6_s_syncbn_fast_8xb32-400e_coco.py) | [model](https://download.openmmlab.com/mmyolo/v0/yolov6/yolov6_s_syncbn_fast_8xb32-400e_coco/yolov6_s_syncbn_fast_8xb32-400e_coco_20221102_203035-932e1d91.pth) \| [log](https://download.openmmlab.com/mmyolo/v0/yolov6/yolov6_s_syncbn_fast_8xb32-400e_coco/yolov6_s_syncbn_fast_8xb32-400e_coco_20221102_203035.log.json) |
+| YOLOv6-m |  P5  | 640  |  300  |  Yes   | Yes |  16.69   |  48.4  | [config](./yolov6_m_syncbn_fast_8xb32-300e_coco.py) | [model](https://download.openmmlab.com/mmyolo/v0/yolov6/yolov6_m_syncbn_fast_8xb32-300e_coco/yolov6_m_syncbn_fast_8xb32-300e_coco_20221109_182658-85bda3f4.pth) \| [log](https://download.openmmlab.com/mmyolo/v0/yolov6/yolov6_m_syncbn_fast_8xb32-300e_coco/yolov6_m_syncbn_fast_8xb32-300e_coco_20221109_182658.log.json) |
+| YOLOv6-l |  P5  | 640  |  300  |  Yes   | Yes |  20.86   |  51.0  | [config](./yolov6_l_syncbn_fast_8xb32-300e_coco.py) | [model](https://download.openmmlab.com/mmyolo/v0/yolov6/yolov6_l_syncbn_fast_8xb32-300e_coco/yolov6_l_syncbn_fast_8xb32-300e_coco_20221109_183156-91e3c447.pth) \| [log](https://download.openmmlab.com/mmyolo/v0/yolov6/yolov6_l_syncbn_fast_8xb32-300e_coco/yolov6_l_syncbn_fast_8xb32-300e_coco_20221109_183156.log.json) |
+
+**Note**:
+
+1. The official m and l models use knowledge distillation, but our version does not support it, which will be implemented in [MMRazor](https://github.com/open-mmlab/mmrazor) in the future.
+2. The performance is unstable and may fluctuate by about 0.3 mAP.
+3. If users need the weight of 300 epoch for nano, tiny and small model, they can train according to the configs of 300 epoch provided by us, or convert the official weight according to the [converter script](../../tools/model_converters/).
+4. We have observed that the [base model](https://github.com/meituan/YOLOv6/tree/main/configs/base) has been officially released in v6 recently. Although the accuracy has decreased, it is more efficient. We will also provide the base model configuration in the future.
+
+## Citation
+
+```latex
+@article{li2022yolov6,
+  title={YOLOv6: A Single-Stage Object Detection Framework for Industrial Applications},
+  author={Li, Chuyi and Li, Lulu and Jiang, Hongliang and Weng, Kaiheng and Geng, Yifei and Li, Liang and Ke, Zaidan and Li, Qingyuan and Cheng, Meng and Nie, Weiqiang and others},
+  journal={arXiv preprint arXiv:2209.02976},
+  year={2022}
+}
+```
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov6/metafile.yml b/mmdetection_practice/third_party/mmyolo/configs/yolov6/metafile.yml
new file mode 100644
index 0000000..df45152
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov6/metafile.yml
@@ -0,0 +1,83 @@
+Collections:
+  - Name: YOLOv6
+    Metadata:
+      Training Data: COCO
+      Training Techniques:
+        - SGD with Nesterov
+        - Weight Decay
+        - AMP
+        - Synchronize BN
+      Training Resources: 8x A100 GPUs
+      Architecture:
+        - CSPDarkNet
+        - PAFPN
+        - RepVGG
+    Paper:
+      URL: https://arxiv.org/abs/2209.02976
+      Title: 'YOLOv6: A Single-Stage Object Detection Framework for Industrial Applications'
+    README: configs/yolov6/README.md
+    Code:
+      URL: https://github.com/open-mmlab/mmyolo/blob/v0.0.1/mmyolo/models/detectors/yolo_detector.py#L12
+      Version: v0.0.1
+
+Models:
+  - Name: yolov6_s_syncbn_fast_8xb32-400e_coco
+    In Collection: YOLOv6
+    Config: configs/yolov6/yolov6_s_syncbn_fast_8xb32-400e_coco.py
+    Metadata:
+      Training Memory (GB): 8.88
+      Epochs: 400
+    Results:
+      - Task: Object Detection
+        Dataset: COCO
+        Metrics:
+          box AP: 44.0
+    Weights: https://download.openmmlab.com/mmyolo/v0/yolov6/yolov6_s_syncbn_fast_8xb32-400e_coco/yolov6_s_syncbn_fast_8xb32-400e_coco_20221102_203035-932e1d91.pth
+  - Name: yolov6_n_syncbn_fast_8xb32-400e_coco
+    In Collection: YOLOv6
+    Config: configs/yolov6/yolov6_n_syncbn_fast_8xb32-400e_coco.py
+    Metadata:
+      Training Memory (GB): 6.04
+      Epochs: 400
+    Results:
+      - Task: Object Detection
+        Dataset: COCO
+        Metrics:
+          box AP: 36.2
+    Weights: https://download.openmmlab.com/mmyolo/v0/yolov6/yolov6_n_syncbn_fast_8xb32-400e_coco/yolov6_n_syncbn_fast_8xb32-400e_coco_20221030_202726-d99b2e82.pth
+  - Name: yolov6_t_syncbn_fast_8xb32-400e_coco
+    In Collection: YOLOv6
+    Config: configs/yolov6/yolov6_t_syncbn_fast_8xb32-400e_coco.py
+    Metadata:
+      Training Memory (GB): 8.13
+      Epochs: 400
+    Results:
+      - Task: Object Detection
+        Dataset: COCO
+        Metrics:
+          box AP: 41.0
+    Weights: https://download.openmmlab.com/mmyolo/v0/yolov6/yolov6_t_syncbn_fast_8xb32-400e_coco/yolov6_t_syncbn_fast_8xb32-400e_coco_20221030_143755-cf0d278f.pth
+  - Name: yolov6_m_syncbn_fast_8xb32-300e_coco
+    In Collection: YOLOv6
+    Config: configs/yolov6/yolov6_m_syncbn_fast_8xb32-300e_coco.py
+    Metadata:
+      Training Memory (GB): 16.69
+      Epochs: 300
+    Results:
+      - Task: Object Detection
+        Dataset: COCO
+        Metrics:
+          box AP: 48.4
+    Weights: https://download.openmmlab.com/mmyolo/v0/yolov6/yolov6_m_syncbn_fast_8xb32-300e_coco/yolov6_m_syncbn_fast_8xb32-300e_coco_20221109_182658-85bda3f4.pth
+  - Name: yolov6_l_syncbn_fast_8xb32-300e_coco
+    In Collection: YOLOv6
+    Config: configs/yolov6/yolov6_l_syncbn_fast_8xb32-300e_coco.py
+    Metadata:
+      Training Memory (GB): 20.86
+      Epochs: 300
+    Results:
+      - Task: Object Detection
+        Dataset: COCO
+        Metrics:
+          box AP: 51.0
+    Weights: https://download.openmmlab.com/mmyolo/v0/yolov6/yolov6_l_syncbn_fast_8xb32-300e_coco/yolov6_l_syncbn_fast_8xb32-300e_coco_20221109_183156-91e3c447.pth
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov6/yolov6_l_syncbn_fast_8xb32-300e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/yolov6/yolov6_l_syncbn_fast_8xb32-300e_coco.py
new file mode 100644
index 0000000..ad5ecf3
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov6/yolov6_l_syncbn_fast_8xb32-300e_coco.py
@@ -0,0 +1,28 @@
+_base_ = './yolov6_m_syncbn_fast_8xb32-300e_coco.py'
+
+# ======================= Possible modified parameters =======================
+# -----model related-----
+# The scaling factor that controls the depth of the network structure
+deepen_factor = 1
+# The scaling factor that controls the width of the network structure
+widen_factor = 1
+
+# ============================== Unmodified in most cases ===================
+model = dict(
+    backbone=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+        hidden_ratio=1. / 2,
+        block_cfg=dict(
+            type='ConvWrapper',
+            norm_cfg=dict(type='BN', momentum=0.03, eps=0.001)),
+        act_cfg=dict(type='SiLU', inplace=True)),
+    neck=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+        hidden_ratio=1. / 2,
+        block_cfg=dict(
+            type='ConvWrapper',
+            norm_cfg=dict(type='BN', momentum=0.03, eps=0.001)),
+        block_act_cfg=dict(type='SiLU', inplace=True)),
+    bbox_head=dict(head_module=dict(widen_factor=widen_factor)))
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov6/yolov6_m_syncbn_fast_8xb32-300e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/yolov6/yolov6_m_syncbn_fast_8xb32-300e_coco.py
new file mode 100644
index 0000000..09811c8
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov6/yolov6_m_syncbn_fast_8xb32-300e_coco.py
@@ -0,0 +1,62 @@
+_base_ = './yolov6_s_syncbn_fast_8xb32-300e_coco.py'
+
+# ======================= Possible modified parameters =======================
+# -----model related-----
+# The scaling factor that controls the depth of the network structure
+deepen_factor = 0.6
+# The scaling factor that controls the width of the network structure
+widen_factor = 0.75
+
+# -----train val related-----
+affine_scale = 0.9  # YOLOv5RandomAffine scaling ratio
+
+# ============================== Unmodified in most cases ===================
+model = dict(
+    backbone=dict(
+        type='YOLOv6CSPBep',
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+        hidden_ratio=2. / 3,
+        block_cfg=dict(type='RepVGGBlock'),
+        act_cfg=dict(type='ReLU', inplace=True)),
+    neck=dict(
+        type='YOLOv6CSPRepPAFPN',
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+        block_cfg=dict(type='RepVGGBlock'),
+        hidden_ratio=2. / 3,
+        block_act_cfg=dict(type='ReLU', inplace=True)),
+    bbox_head=dict(
+        type='YOLOv6Head', head_module=dict(widen_factor=widen_factor)))
+
+mosaic_affine_pipeline = [
+    dict(
+        type='Mosaic',
+        img_scale=_base_.img_scale,
+        pad_val=114.0,
+        pre_transform=_base_.pre_transform),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        scaling_ratio_range=(1 - affine_scale, 1 + affine_scale),
+        # img_scale is (width, height)
+        border=(-_base_.img_scale[0] // 2, -_base_.img_scale[1] // 2),
+        border_val=(114, 114, 114))
+]
+
+train_pipeline = [
+    *_base_.pre_transform, *mosaic_affine_pipeline,
+    dict(
+        type='YOLOv5MixUp',
+        prob=0.1,
+        pre_transform=[*_base_.pre_transform, *mosaic_affine_pipeline]),
+    dict(type='YOLOv5HSVRandomAug'),
+    dict(type='mmdet.RandomFlip', prob=0.5),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                   'flip_direction'))
+]
+
+train_dataloader = dict(dataset=dict(pipeline=train_pipeline))
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov6/yolov6_n_syncbn_fast_8xb32-300e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/yolov6/yolov6_n_syncbn_fast_8xb32-300e_coco.py
new file mode 100644
index 0000000..bc2db4b
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov6/yolov6_n_syncbn_fast_8xb32-300e_coco.py
@@ -0,0 +1,21 @@
+_base_ = './yolov6_s_syncbn_fast_8xb32-300e_coco.py'
+
+# ======================= Possible modified parameters =======================
+# -----model related-----
+# The scaling factor that controls the depth of the network structure
+deepen_factor = 0.33
+# The scaling factor that controls the width of the network structure
+widen_factor = 0.25
+
+# -----train val related-----
+lr_factor = 0.02  # Learning rate scaling factor
+
+# ============================== Unmodified in most cases ===================
+model = dict(
+    backbone=dict(deepen_factor=deepen_factor, widen_factor=widen_factor),
+    neck=dict(deepen_factor=deepen_factor, widen_factor=widen_factor),
+    bbox_head=dict(
+        head_module=dict(widen_factor=widen_factor),
+        loss_bbox=dict(iou_mode='siou')))
+
+default_hooks = dict(param_scheduler=dict(lr_factor=lr_factor))
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov6/yolov6_n_syncbn_fast_8xb32-400e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/yolov6/yolov6_n_syncbn_fast_8xb32-400e_coco.py
new file mode 100644
index 0000000..f66aa15
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov6/yolov6_n_syncbn_fast_8xb32-400e_coco.py
@@ -0,0 +1,21 @@
+_base_ = './yolov6_s_syncbn_fast_8xb32-400e_coco.py'
+
+# ======================= Possible modified parameters =======================
+# -----model related-----
+# The scaling factor that controls the depth of the network structure
+deepen_factor = 0.33
+# The scaling factor that controls the width of the network structure
+widen_factor = 0.25
+
+# -----train val related-----
+lr_factor = 0.02  # Learning rate scaling factor
+
+# ============================== Unmodified in most cases ===================
+model = dict(
+    backbone=dict(deepen_factor=deepen_factor, widen_factor=widen_factor),
+    neck=dict(deepen_factor=deepen_factor, widen_factor=widen_factor),
+    bbox_head=dict(
+        head_module=dict(widen_factor=widen_factor),
+        loss_bbox=dict(iou_mode='siou')))
+
+default_hooks = dict(param_scheduler=dict(lr_factor=lr_factor))
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov6/yolov6_s_fast_1xb12-40e_cat.py b/mmdetection_practice/third_party/mmyolo/configs/yolov6/yolov6_s_fast_1xb12-40e_cat.py
new file mode 100644
index 0000000..82578fc
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov6/yolov6_s_fast_1xb12-40e_cat.py
@@ -0,0 +1,56 @@
+_base_ = './yolov6_s_syncbn_fast_8xb32-400e_coco.py'
+
+data_root = './data/cat/'
+class_name = ('cat', )
+num_classes = len(class_name)
+metainfo = dict(classes=class_name, palette=[(20, 220, 60)])
+
+max_epochs = 40
+train_batch_size_per_gpu = 12
+train_num_workers = 4
+num_last_epochs = 5
+
+load_from = 'https://download.openmmlab.com/mmyolo/v0/yolov6/yolov6_s_syncbn_fast_8xb32-400e_coco/yolov6_s_syncbn_fast_8xb32-400e_coco_20221102_203035-932e1d91.pth'  # noqa
+
+model = dict(
+    backbone=dict(frozen_stages=4),
+    bbox_head=dict(head_module=dict(num_classes=num_classes)),
+    train_cfg=dict(
+        initial_assigner=dict(num_classes=num_classes),
+        assigner=dict(num_classes=num_classes)))
+
+train_dataloader = dict(
+    batch_size=train_batch_size_per_gpu,
+    num_workers=train_num_workers,
+    dataset=dict(
+        data_root=data_root,
+        metainfo=metainfo,
+        ann_file='annotations/trainval.json',
+        data_prefix=dict(img='images/')))
+
+val_dataloader = dict(
+    dataset=dict(
+        metainfo=metainfo,
+        data_root=data_root,
+        ann_file='annotations/test.json',
+        data_prefix=dict(img='images/')))
+
+test_dataloader = val_dataloader
+
+val_evaluator = dict(ann_file=data_root + 'annotations/test.json')
+test_evaluator = val_evaluator
+
+_base_.optim_wrapper.optimizer.batch_size_per_gpu = train_batch_size_per_gpu
+_base_.custom_hooks[1].switch_epoch = max_epochs - num_last_epochs
+
+default_hooks = dict(
+    checkpoint=dict(interval=10, max_keep_ckpts=2, save_best='auto'),
+    # The warmup_mim_iter parameter is critical.
+    # The default value is 1000 which is not suitable for cat datasets.
+    param_scheduler=dict(max_epochs=max_epochs, warmup_mim_iter=10),
+    logger=dict(type='LoggerHook', interval=5))
+train_cfg = dict(
+    max_epochs=max_epochs,
+    val_interval=10,
+    dynamic_intervals=[(max_epochs - num_last_epochs, 1)])
+# visualizer = dict(vis_backends = [dict(type='LocalVisBackend'), dict(type='WandbVisBackend')]) # noqa
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov6/yolov6_s_syncbn_fast_8xb32-300e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/yolov6/yolov6_s_syncbn_fast_8xb32-300e_coco.py
new file mode 100644
index 0000000..dbffaeb
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov6/yolov6_s_syncbn_fast_8xb32-300e_coco.py
@@ -0,0 +1,33 @@
+_base_ = './yolov6_s_syncbn_fast_8xb32-400e_coco.py'
+
+# ======================= Frequently modified parameters =====================
+# -----train val related-----
+# Base learning rate for optim_wrapper
+max_epochs = 300  # Maximum training epochs
+num_last_epochs = 15  # Last epoch number to switch training pipeline
+
+# ============================== Unmodified in most cases ===================
+default_hooks = dict(
+    param_scheduler=dict(
+        type='YOLOv5ParamSchedulerHook',
+        scheduler_type='cosine',
+        lr_factor=0.01,
+        max_epochs=max_epochs))
+
+custom_hooks = [
+    dict(
+        type='EMAHook',
+        ema_type='ExpMomentumEMA',
+        momentum=0.0001,
+        update_buffers=True,
+        strict_load=False,
+        priority=49),
+    dict(
+        type='mmdet.PipelineSwitchHook',
+        switch_epoch=max_epochs - num_last_epochs,
+        switch_pipeline=_base_.train_pipeline_stage2)
+]
+
+train_cfg = dict(
+    max_epochs=max_epochs,
+    dynamic_intervals=[(max_epochs - num_last_epochs, 1)])
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov6/yolov6_s_syncbn_fast_8xb32-400e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/yolov6/yolov6_s_syncbn_fast_8xb32-400e_coco.py
new file mode 100644
index 0000000..eb564c0
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov6/yolov6_s_syncbn_fast_8xb32-400e_coco.py
@@ -0,0 +1,280 @@
+_base_ = ['../_base_/default_runtime.py', '../_base_/det_p5_tta.py']
+
+# ======================= Frequently modified parameters =====================
+# -----data related-----
+data_root = 'data/coco/'  # Root path of data
+# Path of train annotation file
+train_ann_file = 'annotations/instances_train2017.json'
+train_data_prefix = 'train2017/'  # Prefix of train image path
+# Path of val annotation file
+val_ann_file = 'annotations/instances_val2017.json'
+val_data_prefix = 'val2017/'  # Prefix of val image path
+
+num_classes = 80  # Number of classes for classification
+# Batch size of a single GPU during training
+train_batch_size_per_gpu = 32
+# Worker to pre-fetch data for each single GPU during training
+train_num_workers = 8
+# persistent_workers must be False if num_workers is 0
+persistent_workers = True
+
+# -----train val related-----
+# Base learning rate for optim_wrapper
+base_lr = 0.01
+max_epochs = 400  # Maximum training epochs
+num_last_epochs = 15  # Last epoch number to switch training pipeline
+
+# ======================= Possible modified parameters =======================
+# -----data related-----
+img_scale = (640, 640)  # width, height
+# Dataset type, this will be used to define the dataset
+dataset_type = 'YOLOv5CocoDataset'
+# Batch size of a single GPU during validation
+val_batch_size_per_gpu = 1
+# Worker to pre-fetch data for each single GPU during validation
+val_num_workers = 2
+
+# Config of batch shapes. Only on val.
+# It means not used if batch_shapes_cfg is None.
+batch_shapes_cfg = dict(
+    type='BatchShapePolicy',
+    batch_size=val_batch_size_per_gpu,
+    img_size=img_scale[0],
+    size_divisor=32,
+    extra_pad_ratio=0.5)
+
+# -----model related-----
+# The scaling factor that controls the depth of the network structure
+deepen_factor = 0.33
+# The scaling factor that controls the width of the network structure
+widen_factor = 0.5
+
+# -----train val related-----
+affine_scale = 0.5  # YOLOv5RandomAffine scaling ratio
+lr_factor = 0.01  # Learning rate scaling factor
+weight_decay = 0.0005
+# Save model checkpoint and validation intervals
+save_epoch_intervals = 10
+# The maximum checkpoints to keep.
+max_keep_ckpts = 3
+# Single-scale training is recommended to
+# be turned on, which can speed up training.
+env_cfg = dict(cudnn_benchmark=True)
+
+# ============================== Unmodified in most cases ===================
+model = dict(
+    type='YOLODetector',
+    data_preprocessor=dict(
+        type='YOLOv5DetDataPreprocessor',
+        mean=[0., 0., 0.],
+        std=[255., 255., 255.],
+        bgr_to_rgb=True),
+    backbone=dict(
+        type='YOLOv6EfficientRep',
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+        norm_cfg=dict(type='BN', momentum=0.03, eps=0.001),
+        act_cfg=dict(type='ReLU', inplace=True)),
+    neck=dict(
+        type='YOLOv6RepPAFPN',
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+        in_channels=[256, 512, 1024],
+        out_channels=[128, 256, 512],
+        num_csp_blocks=12,
+        norm_cfg=dict(type='BN', momentum=0.03, eps=0.001),
+        act_cfg=dict(type='ReLU', inplace=True),
+    ),
+    bbox_head=dict(
+        type='YOLOv6Head',
+        head_module=dict(
+            type='YOLOv6HeadModule',
+            num_classes=num_classes,
+            in_channels=[128, 256, 512],
+            widen_factor=widen_factor,
+            norm_cfg=dict(type='BN', momentum=0.03, eps=0.001),
+            act_cfg=dict(type='SiLU', inplace=True),
+            featmap_strides=[8, 16, 32]),
+        loss_bbox=dict(
+            type='IoULoss',
+            iou_mode='giou',
+            bbox_format='xyxy',
+            reduction='mean',
+            loss_weight=2.5,
+            return_iou=False)),
+    train_cfg=dict(
+        initial_epoch=4,
+        initial_assigner=dict(
+            type='BatchATSSAssigner',
+            num_classes=num_classes,
+            topk=9,
+            iou_calculator=dict(type='mmdet.BboxOverlaps2D')),
+        assigner=dict(
+            type='BatchTaskAlignedAssigner',
+            num_classes=num_classes,
+            topk=13,
+            alpha=1,
+            beta=6),
+    ),
+    test_cfg=dict(
+        multi_label=True,
+        nms_pre=30000,
+        score_thr=0.001,
+        nms=dict(type='nms', iou_threshold=0.65),
+        max_per_img=300))
+
+# The training pipeline of YOLOv6 is basically the same as YOLOv5.
+# The difference is that Mosaic and RandomAffine will be closed in the last 15 epochs. # noqa
+pre_transform = [
+    dict(type='LoadImageFromFile', backend_args=_base_.backend_args),
+    dict(type='LoadAnnotations', with_bbox=True)
+]
+
+train_pipeline = [
+    *pre_transform,
+    dict(
+        type='Mosaic',
+        img_scale=img_scale,
+        pad_val=114.0,
+        pre_transform=pre_transform),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_translate_ratio=0.1,
+        scaling_ratio_range=(1 - affine_scale, 1 + affine_scale),
+        # img_scale is (width, height)
+        border=(-img_scale[0] // 2, -img_scale[1] // 2),
+        border_val=(114, 114, 114),
+        max_shear_degree=0.0),
+    dict(type='YOLOv5HSVRandomAug'),
+    dict(type='mmdet.RandomFlip', prob=0.5),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                   'flip_direction'))
+]
+
+train_pipeline_stage2 = [
+    *pre_transform,
+    dict(type='YOLOv5KeepRatioResize', scale=img_scale),
+    dict(
+        type='LetterResize',
+        scale=img_scale,
+        allow_scale_up=True,
+        pad_val=dict(img=114)),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_translate_ratio=0.1,
+        scaling_ratio_range=(1 - affine_scale, 1 + affine_scale),
+        max_shear_degree=0.0,
+    ),
+    dict(type='YOLOv5HSVRandomAug'),
+    dict(type='mmdet.RandomFlip', prob=0.5),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                   'flip_direction'))
+]
+
+train_dataloader = dict(
+    batch_size=train_batch_size_per_gpu,
+    num_workers=train_num_workers,
+    collate_fn=dict(type='yolov5_collate'),
+    persistent_workers=persistent_workers,
+    pin_memory=True,
+    sampler=dict(type='DefaultSampler', shuffle=True),
+    dataset=dict(
+        type=dataset_type,
+        data_root=data_root,
+        ann_file=train_ann_file,
+        data_prefix=dict(img=train_data_prefix),
+        filter_cfg=dict(filter_empty_gt=False, min_size=32),
+        pipeline=train_pipeline))
+
+test_pipeline = [
+    dict(type='LoadImageFromFile', backend_args=_base_.backend_args),
+    dict(type='YOLOv5KeepRatioResize', scale=img_scale),
+    dict(
+        type='LetterResize',
+        scale=img_scale,
+        allow_scale_up=False,
+        pad_val=dict(img=114)),
+    dict(type='LoadAnnotations', with_bbox=True, _scope_='mmdet'),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                   'scale_factor', 'pad_param'))
+]
+
+val_dataloader = dict(
+    batch_size=val_batch_size_per_gpu,
+    num_workers=val_num_workers,
+    persistent_workers=persistent_workers,
+    pin_memory=True,
+    drop_last=False,
+    sampler=dict(type='DefaultSampler', shuffle=False),
+    dataset=dict(
+        type=dataset_type,
+        data_root=data_root,
+        test_mode=True,
+        data_prefix=dict(img=val_data_prefix),
+        ann_file=val_ann_file,
+        pipeline=test_pipeline,
+        batch_shapes_cfg=batch_shapes_cfg))
+
+test_dataloader = val_dataloader
+
+# Optimizer and learning rate scheduler of YOLOv6 are basically the same as YOLOv5. # noqa
+# The difference is that the scheduler_type of YOLOv6 is cosine.
+optim_wrapper = dict(
+    type='OptimWrapper',
+    optimizer=dict(
+        type='SGD',
+        lr=base_lr,
+        momentum=0.937,
+        weight_decay=weight_decay,
+        nesterov=True,
+        batch_size_per_gpu=train_batch_size_per_gpu),
+    constructor='YOLOv5OptimizerConstructor')
+
+default_hooks = dict(
+    param_scheduler=dict(
+        type='YOLOv5ParamSchedulerHook',
+        scheduler_type='cosine',
+        lr_factor=lr_factor,
+        max_epochs=max_epochs),
+    checkpoint=dict(
+        type='CheckpointHook',
+        interval=save_epoch_intervals,
+        max_keep_ckpts=max_keep_ckpts,
+        save_best='auto'))
+
+custom_hooks = [
+    dict(
+        type='EMAHook',
+        ema_type='ExpMomentumEMA',
+        momentum=0.0001,
+        update_buffers=True,
+        strict_load=False,
+        priority=49),
+    dict(
+        type='mmdet.PipelineSwitchHook',
+        switch_epoch=max_epochs - num_last_epochs,
+        switch_pipeline=train_pipeline_stage2)
+]
+
+val_evaluator = dict(
+    type='mmdet.CocoMetric',
+    proposal_nums=(100, 1, 10),
+    ann_file=data_root + val_ann_file,
+    metric='bbox')
+test_evaluator = val_evaluator
+
+train_cfg = dict(
+    type='EpochBasedTrainLoop',
+    max_epochs=max_epochs,
+    val_interval=save_epoch_intervals,
+    dynamic_intervals=[(max_epochs - num_last_epochs, 1)])
+val_cfg = dict(type='ValLoop')
+test_cfg = dict(type='TestLoop')
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov6/yolov6_t_syncbn_fast_8xb32-300e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/yolov6/yolov6_t_syncbn_fast_8xb32-300e_coco.py
new file mode 100644
index 0000000..aa9da63
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov6/yolov6_t_syncbn_fast_8xb32-300e_coco.py
@@ -0,0 +1,17 @@
+_base_ = './yolov6_s_syncbn_fast_8xb32-300e_coco.py'
+
+# ======================= Possible modified parameters =======================
+# -----model related-----
+# The scaling factor that controls the depth of the network structure
+deepen_factor = 0.33
+# The scaling factor that controls the width of the network structure
+widen_factor = 0.375
+
+# ============================== Unmodified in most cases ===================
+model = dict(
+    backbone=dict(deepen_factor=deepen_factor, widen_factor=widen_factor),
+    neck=dict(deepen_factor=deepen_factor, widen_factor=widen_factor),
+    bbox_head=dict(
+        type='YOLOv6Head',
+        head_module=dict(widen_factor=widen_factor),
+        loss_bbox=dict(iou_mode='siou')))
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov6/yolov6_t_syncbn_fast_8xb32-400e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/yolov6/yolov6_t_syncbn_fast_8xb32-400e_coco.py
new file mode 100644
index 0000000..7575555
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov6/yolov6_t_syncbn_fast_8xb32-400e_coco.py
@@ -0,0 +1,17 @@
+_base_ = './yolov6_s_syncbn_fast_8xb32-400e_coco.py'
+
+# ======================= Possible modified parameters =======================
+# -----model related-----
+# The scaling factor that controls the depth of the network structure
+deepen_factor = 0.33
+# The scaling factor that controls the width of the network structure
+widen_factor = 0.375
+
+# ============================== Unmodified in most cases ===================
+model = dict(
+    backbone=dict(deepen_factor=deepen_factor, widen_factor=widen_factor),
+    neck=dict(deepen_factor=deepen_factor, widen_factor=widen_factor),
+    bbox_head=dict(
+        type='YOLOv6Head',
+        head_module=dict(widen_factor=widen_factor),
+        loss_bbox=dict(iou_mode='siou')))
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov6/yolov6_v3_l_syncbn_fast_8xb32-300e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/yolov6/yolov6_v3_l_syncbn_fast_8xb32-300e_coco.py
new file mode 100644
index 0000000..7ed4b05
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov6/yolov6_v3_l_syncbn_fast_8xb32-300e_coco.py
@@ -0,0 +1,28 @@
+_base_ = './yolov6_v3_m_syncbn_fast_8xb32-300e_coco.py'
+
+# ======================= Possible modified parameters =======================
+# -----model related-----
+# The scaling factor that controls the depth of the network structure
+deepen_factor = 1
+# The scaling factor that controls the width of the network structure
+widen_factor = 1
+
+# ============================== Unmodified in most cases ===================
+model = dict(
+    backbone=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+        hidden_ratio=1. / 2,
+        block_cfg=dict(
+            type='ConvWrapper',
+            norm_cfg=dict(type='BN', momentum=0.03, eps=0.001)),
+        act_cfg=dict(type='SiLU', inplace=True)),
+    neck=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+        hidden_ratio=1. / 2,
+        block_cfg=dict(
+            type='ConvWrapper',
+            norm_cfg=dict(type='BN', momentum=0.03, eps=0.001)),
+        block_act_cfg=dict(type='SiLU', inplace=True)),
+    bbox_head=dict(head_module=dict(widen_factor=widen_factor)))
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov6/yolov6_v3_m_syncbn_fast_8xb32-300e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/yolov6/yolov6_v3_m_syncbn_fast_8xb32-300e_coco.py
new file mode 100644
index 0000000..982b0c8
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov6/yolov6_v3_m_syncbn_fast_8xb32-300e_coco.py
@@ -0,0 +1,63 @@
+_base_ = './yolov6_v3_s_syncbn_fast_8xb32-300e_coco.py'
+
+# ======================= Possible modified parameters =======================
+# -----model related-----
+# The scaling factor that controls the depth of the network structure
+deepen_factor = 0.6
+# The scaling factor that controls the width of the network structure
+widen_factor = 0.75
+
+# -----train val related-----
+affine_scale = 0.9  # YOLOv5RandomAffine scaling ratio
+
+# ============================== Unmodified in most cases ===================
+model = dict(
+    backbone=dict(
+        type='YOLOv6CSPBep',
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+        hidden_ratio=2. / 3,
+        block_cfg=dict(type='RepVGGBlock'),
+        act_cfg=dict(type='ReLU', inplace=True)),
+    neck=dict(
+        type='YOLOv6CSPRepBiPAFPN',
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+        block_cfg=dict(type='RepVGGBlock'),
+        hidden_ratio=2. / 3,
+        block_act_cfg=dict(type='ReLU', inplace=True)),
+    bbox_head=dict(
+        type='YOLOv6Head',
+        head_module=dict(reg_max=16, widen_factor=widen_factor)))
+
+mosaic_affine_pipeline = [
+    dict(
+        type='Mosaic',
+        img_scale=_base_.img_scale,
+        pad_val=114.0,
+        pre_transform=_base_.pre_transform),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        scaling_ratio_range=(1 - affine_scale, 1 + affine_scale),
+        # img_scale is (width, height)
+        border=(-_base_.img_scale[0] // 2, -_base_.img_scale[1] // 2),
+        border_val=(114, 114, 114))
+]
+
+train_pipeline = [
+    *_base_.pre_transform, *mosaic_affine_pipeline,
+    dict(
+        type='YOLOv5MixUp',
+        prob=0.1,
+        pre_transform=[*_base_.pre_transform, *mosaic_affine_pipeline]),
+    dict(type='YOLOv5HSVRandomAug'),
+    dict(type='mmdet.RandomFlip', prob=0.5),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                   'flip_direction'))
+]
+
+train_dataloader = dict(dataset=dict(pipeline=train_pipeline))
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov6/yolov6_v3_n_syncbn_fast_8xb32-300e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/yolov6/yolov6_v3_n_syncbn_fast_8xb32-300e_coco.py
new file mode 100644
index 0000000..96469f0
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov6/yolov6_v3_n_syncbn_fast_8xb32-300e_coco.py
@@ -0,0 +1,21 @@
+_base_ = './yolov6_v3_s_syncbn_fast_8xb32-300e_coco.py'
+
+# ======================= Possible modified parameters =======================
+# -----model related-----
+# The scaling factor that controls the depth of the network structure
+deepen_factor = 0.33
+# The scaling factor that controls the width of the network structure
+widen_factor = 0.25
+
+# -----train val related-----
+lr_factor = 0.02  # Learning rate scaling factor
+
+# ============================== Unmodified in most cases ===================
+model = dict(
+    backbone=dict(deepen_factor=deepen_factor, widen_factor=widen_factor),
+    neck=dict(deepen_factor=deepen_factor, widen_factor=widen_factor),
+    bbox_head=dict(
+        head_module=dict(widen_factor=widen_factor),
+        loss_bbox=dict(iou_mode='siou')))
+
+default_hooks = dict(param_scheduler=dict(lr_factor=lr_factor))
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov6/yolov6_v3_s_syncbn_fast_8xb32-300e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/yolov6/yolov6_v3_s_syncbn_fast_8xb32-300e_coco.py
new file mode 100644
index 0000000..8b0ad19
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov6/yolov6_v3_s_syncbn_fast_8xb32-300e_coco.py
@@ -0,0 +1,282 @@
+_base_ = ['../_base_/default_runtime.py', '../_base_/det_p5_tta.py']
+
+# ======================= Frequently modified parameters =====================
+# -----data related-----
+data_root = 'data/coco/'  # Root path of data
+# Path of train annotation file
+train_ann_file = 'annotations/instances_train2017.json'
+train_data_prefix = 'train2017/'  # Prefix of train image path
+# Path of val annotation file
+val_ann_file = 'annotations/instances_val2017.json'
+val_data_prefix = 'val2017/'  # Prefix of val image path
+
+num_classes = 80  # Number of classes for classification
+# Batch size of a single GPU during training
+train_batch_size_per_gpu = 32
+# Worker to pre-fetch data for each single GPU during training
+train_num_workers = 8
+# persistent_workers must be False if num_workers is 0
+persistent_workers = True
+
+# -----train val related-----
+# Base learning rate for optim_wrapper
+base_lr = 0.01
+max_epochs = 300  # Maximum training epochs
+num_last_epochs = 15  # Last epoch number to switch training pipeline
+
+# ======================= Possible modified parameters =======================
+# -----data related-----
+img_scale = (640, 640)  # width, height
+# Dataset type, this will be used to define the dataset
+dataset_type = 'YOLOv5CocoDataset'
+# Batch size of a single GPU during validation
+val_batch_size_per_gpu = 1
+# Worker to pre-fetch data for each single GPU during validation
+val_num_workers = 2
+
+# Config of batch shapes. Only on val.
+# It means not used if batch_shapes_cfg is None.
+batch_shapes_cfg = dict(
+    type='BatchShapePolicy',
+    batch_size=val_batch_size_per_gpu,
+    img_size=img_scale[0],
+    size_divisor=32,
+    extra_pad_ratio=0.5)
+
+# -----model related-----
+# The scaling factor that controls the depth of the network structure
+deepen_factor = 0.33
+# The scaling factor that controls the width of the network structure
+widen_factor = 0.5
+
+# -----train val related-----
+affine_scale = 0.5  # YOLOv5RandomAffine scaling ratio
+lr_factor = 0.01  # Learning rate scaling factor
+weight_decay = 0.0005
+# Save model checkpoint and validation intervals
+save_epoch_intervals = 10
+# The maximum checkpoints to keep.
+max_keep_ckpts = 3
+# Single-scale training is recommended to
+# be turned on, which can speed up training.
+env_cfg = dict(cudnn_benchmark=True)
+
+# ============================== Unmodified in most cases ===================
+model = dict(
+    type='YOLODetector',
+    data_preprocessor=dict(
+        type='YOLOv5DetDataPreprocessor',
+        mean=[0., 0., 0.],
+        std=[255., 255., 255.],
+        bgr_to_rgb=True),
+    backbone=dict(
+        type='YOLOv6EfficientRep',
+        out_indices=[1, 2, 3, 4],
+        use_cspsppf=True,
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+        norm_cfg=dict(type='BN', momentum=0.03, eps=0.001),
+        act_cfg=dict(type='ReLU', inplace=True)),
+    neck=dict(
+        type='YOLOv6RepBiPAFPN',
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+        in_channels=[128, 256, 512, 1024],
+        out_channels=[128, 256, 512],
+        num_csp_blocks=12,
+        norm_cfg=dict(type='BN', momentum=0.03, eps=0.001),
+        act_cfg=dict(type='ReLU', inplace=True),
+    ),
+    bbox_head=dict(
+        type='YOLOv6Head',
+        head_module=dict(
+            type='YOLOv6HeadModule',
+            num_classes=num_classes,
+            in_channels=[128, 256, 512],
+            widen_factor=widen_factor,
+            norm_cfg=dict(type='BN', momentum=0.03, eps=0.001),
+            act_cfg=dict(type='SiLU', inplace=True),
+            featmap_strides=[8, 16, 32]),
+        loss_bbox=dict(
+            type='IoULoss',
+            iou_mode='giou',
+            bbox_format='xyxy',
+            reduction='mean',
+            loss_weight=2.5,
+            return_iou=False)),
+    train_cfg=dict(
+        initial_epoch=4,
+        initial_assigner=dict(
+            type='BatchATSSAssigner',
+            num_classes=num_classes,
+            topk=9,
+            iou_calculator=dict(type='mmdet.BboxOverlaps2D')),
+        assigner=dict(
+            type='BatchTaskAlignedAssigner',
+            num_classes=num_classes,
+            topk=13,
+            alpha=1,
+            beta=6),
+    ),
+    test_cfg=dict(
+        multi_label=True,
+        nms_pre=30000,
+        score_thr=0.001,
+        nms=dict(type='nms', iou_threshold=0.65),
+        max_per_img=300))
+
+# The training pipeline of YOLOv6 is basically the same as YOLOv5.
+# The difference is that Mosaic and RandomAffine will be closed in the last 15 epochs. # noqa
+pre_transform = [
+    dict(type='LoadImageFromFile', backend_args=_base_.backend_args),
+    dict(type='LoadAnnotations', with_bbox=True)
+]
+
+train_pipeline = [
+    *pre_transform,
+    dict(
+        type='Mosaic',
+        img_scale=img_scale,
+        pad_val=114.0,
+        pre_transform=pre_transform),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_translate_ratio=0.1,
+        scaling_ratio_range=(1 - affine_scale, 1 + affine_scale),
+        # img_scale is (width, height)
+        border=(-img_scale[0] // 2, -img_scale[1] // 2),
+        border_val=(114, 114, 114),
+        max_shear_degree=0.0),
+    dict(type='YOLOv5HSVRandomAug'),
+    dict(type='mmdet.RandomFlip', prob=0.5),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                   'flip_direction'))
+]
+
+train_pipeline_stage2 = [
+    *pre_transform,
+    dict(type='YOLOv5KeepRatioResize', scale=img_scale),
+    dict(
+        type='LetterResize',
+        scale=img_scale,
+        allow_scale_up=True,
+        pad_val=dict(img=114)),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_translate_ratio=0.1,
+        scaling_ratio_range=(1 - affine_scale, 1 + affine_scale),
+        max_shear_degree=0.0,
+    ),
+    dict(type='YOLOv5HSVRandomAug'),
+    dict(type='mmdet.RandomFlip', prob=0.5),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                   'flip_direction'))
+]
+
+train_dataloader = dict(
+    batch_size=train_batch_size_per_gpu,
+    num_workers=train_num_workers,
+    collate_fn=dict(type='yolov5_collate'),
+    persistent_workers=persistent_workers,
+    pin_memory=True,
+    sampler=dict(type='DefaultSampler', shuffle=True),
+    dataset=dict(
+        type=dataset_type,
+        data_root=data_root,
+        ann_file=train_ann_file,
+        data_prefix=dict(img=train_data_prefix),
+        filter_cfg=dict(filter_empty_gt=False, min_size=32),
+        pipeline=train_pipeline))
+
+test_pipeline = [
+    dict(type='LoadImageFromFile', backend_args=_base_.backend_args),
+    dict(type='YOLOv5KeepRatioResize', scale=img_scale),
+    dict(
+        type='LetterResize',
+        scale=img_scale,
+        allow_scale_up=False,
+        pad_val=dict(img=114)),
+    dict(type='LoadAnnotations', with_bbox=True, _scope_='mmdet'),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                   'scale_factor', 'pad_param'))
+]
+
+val_dataloader = dict(
+    batch_size=val_batch_size_per_gpu,
+    num_workers=val_num_workers,
+    persistent_workers=persistent_workers,
+    pin_memory=True,
+    drop_last=False,
+    sampler=dict(type='DefaultSampler', shuffle=False),
+    dataset=dict(
+        type=dataset_type,
+        data_root=data_root,
+        test_mode=True,
+        data_prefix=dict(img=val_data_prefix),
+        ann_file=val_ann_file,
+        pipeline=test_pipeline,
+        batch_shapes_cfg=batch_shapes_cfg))
+
+test_dataloader = val_dataloader
+
+# Optimizer and learning rate scheduler of YOLOv6 are basically the same as YOLOv5. # noqa
+# The difference is that the scheduler_type of YOLOv6 is cosine.
+optim_wrapper = dict(
+    type='OptimWrapper',
+    optimizer=dict(
+        type='SGD',
+        lr=base_lr,
+        momentum=0.937,
+        weight_decay=weight_decay,
+        nesterov=True,
+        batch_size_per_gpu=train_batch_size_per_gpu),
+    constructor='YOLOv5OptimizerConstructor')
+
+default_hooks = dict(
+    param_scheduler=dict(
+        type='YOLOv5ParamSchedulerHook',
+        scheduler_type='cosine',
+        lr_factor=lr_factor,
+        max_epochs=max_epochs),
+    checkpoint=dict(
+        type='CheckpointHook',
+        interval=save_epoch_intervals,
+        max_keep_ckpts=max_keep_ckpts,
+        save_best='auto'))
+
+custom_hooks = [
+    dict(
+        type='EMAHook',
+        ema_type='ExpMomentumEMA',
+        momentum=0.0001,
+        update_buffers=True,
+        strict_load=False,
+        priority=49),
+    dict(
+        type='mmdet.PipelineSwitchHook',
+        switch_epoch=max_epochs - num_last_epochs,
+        switch_pipeline=train_pipeline_stage2)
+]
+
+val_evaluator = dict(
+    type='mmdet.CocoMetric',
+    proposal_nums=(100, 1, 10),
+    ann_file=data_root + val_ann_file,
+    metric='bbox')
+test_evaluator = val_evaluator
+
+train_cfg = dict(
+    type='EpochBasedTrainLoop',
+    max_epochs=max_epochs,
+    val_interval=save_epoch_intervals,
+    dynamic_intervals=[(max_epochs - num_last_epochs, 1)])
+val_cfg = dict(type='ValLoop')
+test_cfg = dict(type='TestLoop')
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov6/yolov6_v3_t_syncbn_fast_8xb32-300e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/yolov6/yolov6_v3_t_syncbn_fast_8xb32-300e_coco.py
new file mode 100644
index 0000000..d088b6b
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov6/yolov6_v3_t_syncbn_fast_8xb32-300e_coco.py
@@ -0,0 +1,17 @@
+_base_ = './yolov6_v3_s_syncbn_fast_8xb32-300e_coco.py'
+
+# ======================= Possible modified parameters =======================
+# -----model related-----
+# The scaling factor that controls the depth of the network structure
+deepen_factor = 0.33
+# The scaling factor that controls the width of the network structure
+widen_factor = 0.375
+
+# ============================== Unmodified in most cases ===================
+model = dict(
+    backbone=dict(deepen_factor=deepen_factor, widen_factor=widen_factor),
+    neck=dict(deepen_factor=deepen_factor, widen_factor=widen_factor),
+    bbox_head=dict(
+        type='YOLOv6Head',
+        head_module=dict(widen_factor=widen_factor),
+        loss_bbox=dict(iou_mode='siou')))
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov7/README.md b/mmdetection_practice/third_party/mmyolo/configs/yolov7/README.md
new file mode 100644
index 0000000..f8f87f8
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov7/README.md
@@ -0,0 +1,50 @@
+# YOLOv7
+
+> [YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object detectors](https://arxiv.org/abs/2207.02696)
+
+<!-- [ALGORITHM] -->
+
+## Abstract
+
+YOLOv7 surpasses all known object detectors in both speed and accuracy in the range from 5 FPS to 160 FPS and has the highest accuracy 56.8% AP among all known real-time object detectors with 30 FPS or higher on GPU V100. YOLOv7-E6 object detector (56 FPS V100, 55.9% AP) outperforms both transformer-based detector SWIN-L Cascade-Mask R-CNN (9.2 FPS A100, 53.9% AP) by 509% in speed and 2% in accuracy, and convolutional-based detector ConvNeXt-XL Cascade-Mask R-CNN (8.6 FPS A100, 55.2% AP) by 551% in speed and 0.7% AP in accuracy, as well as YOLOv7 outperforms: YOLOR, YOLOX, Scaled-YOLOv4, YOLOv5, DETR, Deformable DETR, DINO-5scale-R50, ViT-Adapter-B and many other object detectors in speed and accuracy. Moreover, we train YOLOv7 only on MS COCO dataset from scratch without using any other datasets or pre-trained weights. Source code is released in [this https URL](https://github.com/WongKinYiu/yolov7).
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/17425982/204231759-cc5c77a9-38c6-4a41-85be-eb97e4b2bcbb.png"/>
+</div>
+
+<div align=center>
+<img alt="YOLOv7-l" src="https://user-images.githubusercontent.com/27466624/228872754-d78be729-2977-47e6-92c1-721535781776.jpg" width = 95.5%/>
+YOLOv7-l-P5 model structure
+</div>
+
+## Results and models
+
+### COCO
+
+|  Backbone   | Arch | Size | SyncBN | AMP | Mem (GB) | Box AP |                         Config                         |                                                                                                                                                                 Download                                                                                                                                                                 |
+| :---------: | :--: | :--: | :----: | :-: | :------: | :----: | :----------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: |
+| YOLOv7-tiny |  P5  | 640  |  Yes   | Yes |   2.7    |  37.5  | [config](./yolov7_tiny_syncbn_fast_8x16b-300e_coco.py) | [model](https://download.openmmlab.com/mmyolo/v0/yolov7/yolov7_tiny_syncbn_fast_8x16b-300e_coco/yolov7_tiny_syncbn_fast_8x16b-300e_coco_20221126_102719-0ee5bbdf.pth) \| [log](https://download.openmmlab.com/mmyolo/v0/yolov7/yolov7_tiny_syncbn_fast_8x16b-300e_coco/yolov7_tiny_syncbn_fast_8x16b-300e_coco_20221126_102719.log.json) |
+|  YOLOv7-l   |  P5  | 640  |  Yes   | Yes |   10.3   |  50.9  |  [config](./yolov7_l_syncbn_fast_8x16b-300e_coco.py)   |       [model](https://download.openmmlab.com/mmyolo/v0/yolov7/yolov7_l_syncbn_fast_8x16b-300e_coco/yolov7_l_syncbn_fast_8x16b-300e_coco_20221123_023601-8113c0eb.pth) \| [log](https://download.openmmlab.com/mmyolo/v0/yolov7/yolov7_l_syncbn_fast_8x16b-300e_coco/yolov7_l_syncbn_fast_8x16b-300e_coco_20221123_023601.log.json)       |
+|  YOLOv7-x   |  P5  | 640  |  Yes   | Yes |   13.7   |  52.8  |  [config](./yolov7_x_syncbn_fast_8x16b-300e_coco.py)   |       [model](https://download.openmmlab.com/mmyolo/v0/yolov7/yolov7_x_syncbn_fast_8x16b-300e_coco/yolov7_x_syncbn_fast_8x16b-300e_coco_20221124_215331-ef949a68.pth) \| [log](https://download.openmmlab.com/mmyolo/v0/yolov7/yolov7_x_syncbn_fast_8x16b-300e_coco/yolov7_x_syncbn_fast_8x16b-300e_coco_20221124_215331.log.json)       |
+|  YOLOv7-w   |  P6  | 1280 |  Yes   | Yes |   27.0   |  54.1  | [config](./yolov7_w-p6_syncbn_fast_8x16b-300e_coco.py) | [model](https://download.openmmlab.com/mmyolo/v0/yolov7/yolov7_w-p6_syncbn_fast_8x16b-300e_coco/yolov7_w-p6_syncbn_fast_8x16b-300e_coco_20221123_053031-a68ef9d2.pth) \| [log](https://download.openmmlab.com/mmyolo/v0/yolov7/yolov7_w-p6_syncbn_fast_8x16b-300e_coco/yolov7_w-p6_syncbn_fast_8x16b-300e_coco_20221123_053031.log.json) |
+|  YOLOv7-e   |  P6  | 1280 |  Yes   | Yes |   42.5   |  55.1  | [config](./yolov7_e-p6_syncbn_fast_8x16b-300e_coco.py) | [model](https://download.openmmlab.com/mmyolo/v0/yolov7/yolov7_e-p6_syncbn_fast_8x16b-300e_coco/yolov7_e-p6_syncbn_fast_8x16b-300e_coco_20221126_102636-34425033.pth) \| [log](https://download.openmmlab.com/mmyolo/v0/yolov7/yolov7_e-p6_syncbn_fast_8x16b-300e_coco/yolov7_e-p6_syncbn_fast_8x16b-300e_coco_20221126_102636.log.json) |
+
+**Note**:
+In the official YOLOv7 code, the `random_perspective` data augmentation in COCO object detection task training uses mask annotation information, which leads to higher performance. Object detection should not use mask annotation, so only box annotation information is used in `MMYOLO`. We will use the mask annotation information in the instance segmentation task.
+
+1. The performance is unstable and may fluctuate by about 0.3 mAP. The performance shown above is the best model.
+2. If users need the weight of `YOLOv7-e2e`, they can train according to the configs provided by us, or convert the official weight according to the [converter script](https://github.com/open-mmlab/mmyolo/blob/main/tools/model_converters/yolov7_to_mmyolo.py).
+3. `fast` means that `YOLOv5DetDataPreprocessor` and `yolov5_collate` are used for data preprocessing, which is faster for training, but less flexible for multitasking. Recommended to use fast version config if you only care about object detection.
+4. `SyncBN` means use SyncBN, `AMP` indicates training with mixed precision.
+5. We use 8x A100 for training, and the single-GPU batch size is 16. This is different from the official code.
+
+## Citation
+
+```latex
+@article{wang2022yolov7,
+  title={{YOLOv7}: Trainable bag-of-freebies sets new state-of-the-art for real-time object detectors},
+  author={Wang, Chien-Yao and Bochkovskiy, Alexey and Liao, Hong-Yuan Mark},
+  journal={arXiv preprint arXiv:2207.02696},
+  year={2022}
+}
+```
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov7/metafile.yml b/mmdetection_practice/third_party/mmyolo/configs/yolov7/metafile.yml
new file mode 100644
index 0000000..067ec6b
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov7/metafile.yml
@@ -0,0 +1,83 @@
+Collections:
+  - Name: YOLOv7
+    Metadata:
+      Training Data: COCO
+      Training Techniques:
+        - SGD with Nesterov
+        - Weight Decay
+        - AMP
+        - Synchronize BN
+      Training Resources: 8x A100 GPUs
+      Architecture:
+        - EELAN
+        - PAFPN
+        - RepVGG
+    Paper:
+      URL: https://arxiv.org/abs/2207.02696
+      Title: 'YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object detectors'
+    README: configs/yolov7/README.md
+    Code:
+      URL: https://github.com/open-mmlab/mmyolo/blob/v0.0.1/mmyolo/models/detectors/yolo_detector.py#L12
+      Version: v0.0.1
+
+Models:
+  - Name: yolov7_tiny_syncbn_fast_8x16b-300e_coco
+    In Collection: YOLOv7
+    Config: configs/yolov7/yolov7_tiny_syncbn_fast_8x16b-300e_coco.py
+    Metadata:
+      Training Memory (GB): 2.7
+      Epochs: 300
+    Results:
+      - Task: Object Detection
+        Dataset: COCO
+        Metrics:
+          box AP: 37.5
+    Weights: https://download.openmmlab.com/mmyolo/v0/yolov7/yolov7_tiny_syncbn_fast_8x16b-300e_coco/yolov7_tiny_syncbn_fast_8x16b-300e_coco_20221126_102719-0ee5bbdf.pth
+  - Name: yolov7_l_syncbn_fast_8x16b-300e_coco
+    In Collection: YOLOv7
+    Config: configs/yolov7/yolov7_l_syncbn_fast_8x16b-300e_coco.py
+    Metadata:
+      Training Memory (GB): 10.3
+      Epochs: 300
+    Results:
+      - Task: Object Detection
+        Dataset: COCO
+        Metrics:
+          box AP: 50.9
+    Weights: https://download.openmmlab.com/mmyolo/v0/yolov7/yolov7_l_syncbn_fast_8x16b-300e_coco/yolov7_l_syncbn_fast_8x16b-300e_coco_20221123_023601-8113c0eb.pth
+  - Name: yolov7_x_syncbn_fast_8x16b-300e_coco
+    In Collection: YOLOv7
+    Config: configs/yolov7/yolov7_x_syncbn_fast_8x16b-300e_coco.py
+    Metadata:
+      Training Memory (GB): 13.7
+      Epochs: 300
+    Results:
+      - Task: Object Detection
+        Dataset: COCO
+        Metrics:
+          box AP: 52.8
+    Weights: https://download.openmmlab.com/mmyolo/v0/yolov7/yolov7_x_syncbn_fast_8x16b-300e_coco/yolov7_x_syncbn_fast_8x16b-300e_coco_20221124_215331-ef949a68.pth
+  - Name: yolov7_w-p6_syncbn_fast_8x16b-300e_coco
+    In Collection: YOLOv7
+    Config: configs/yolov7/yolov7_w-p6_syncbn_fast_8x16b-300e_coco.py
+    Metadata:
+      Training Memory (GB): 27.0
+      Epochs: 300
+    Results:
+      - Task: Object Detection
+        Dataset: COCO
+        Metrics:
+          box AP: 54.1
+    Weights: https://download.openmmlab.com/mmyolo/v0/yolov7/yolov7_w-p6_syncbn_fast_8x16b-300e_coco/yolov7_w-p6_syncbn_fast_8x16b-300e_coco_20221123_053031-a68ef9d2.pth
+  - Name: yolov7_e-p6_syncbn_fast_8x16b-300e_coco
+    In Collection: YOLOv7
+    Config: configs/yolov7/yolov7_e-p6_syncbn_fast_8x16b-300e_coco.py
+    Metadata:
+      Training Memory (GB): 42.5
+      Epochs: 300
+    Results:
+      - Task: Object Detection
+        Dataset: COCO
+        Metrics:
+          box AP: 55.1
+    Weights: https://download.openmmlab.com/mmyolo/v0/yolov7/yolov7_e-p6_syncbn_fast_8x16b-300e_coco/yolov7_e-p6_syncbn_fast_8x16b-300e_coco_20221126_102636-34425033.pth
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov7/yolov7_d-p6_syncbn_fast_8x16b-300e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/yolov7/yolov7_d-p6_syncbn_fast_8x16b-300e_coco.py
new file mode 100644
index 0000000..a687152
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov7/yolov7_d-p6_syncbn_fast_8x16b-300e_coco.py
@@ -0,0 +1,21 @@
+_base_ = './yolov7_w-p6_syncbn_fast_8x16b-300e_coco.py'
+
+model = dict(
+    backbone=dict(arch='D'),
+    neck=dict(
+        use_maxpool_in_downsample=True,
+        use_in_channels_in_downsample=True,
+        block_cfg=dict(
+            type='ELANBlock',
+            middle_ratio=0.4,
+            block_ratio=0.2,
+            num_blocks=6,
+            num_convs_in_block=1),
+        in_channels=[384, 768, 1152, 1536],
+        out_channels=[192, 384, 576, 768]),
+    bbox_head=dict(
+        head_module=dict(
+            in_channels=[192, 384, 576, 768],
+            main_out_channels=[384, 768, 1152, 1536],
+            aux_out_channels=[384, 768, 1152, 1536],
+        )))
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov7/yolov7_e-p6_syncbn_fast_8x16b-300e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/yolov7/yolov7_e-p6_syncbn_fast_8x16b-300e_coco.py
new file mode 100644
index 0000000..3d1463d
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov7/yolov7_e-p6_syncbn_fast_8x16b-300e_coco.py
@@ -0,0 +1,19 @@
+_base_ = './yolov7_w-p6_syncbn_fast_8x16b-300e_coco.py'
+
+model = dict(
+    backbone=dict(arch='E'),
+    neck=dict(
+        use_maxpool_in_downsample=True,
+        use_in_channels_in_downsample=True,
+        block_cfg=dict(
+            type='ELANBlock',
+            middle_ratio=0.4,
+            block_ratio=0.2,
+            num_blocks=6,
+            num_convs_in_block=1),
+        in_channels=[320, 640, 960, 1280],
+        out_channels=[160, 320, 480, 640]),
+    bbox_head=dict(
+        head_module=dict(
+            in_channels=[160, 320, 480, 640],
+            main_out_channels=[320, 640, 960, 1280])))
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov7/yolov7_e2e-p6_syncbn_fast_8x16b-300e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/yolov7/yolov7_e2e-p6_syncbn_fast_8x16b-300e_coco.py
new file mode 100644
index 0000000..6af8105
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov7/yolov7_e2e-p6_syncbn_fast_8x16b-300e_coco.py
@@ -0,0 +1,20 @@
+_base_ = './yolov7_w-p6_syncbn_fast_8x16b-300e_coco.py'
+
+model = dict(
+    backbone=dict(arch='E2E'),
+    neck=dict(
+        use_maxpool_in_downsample=True,
+        use_in_channels_in_downsample=True,
+        block_cfg=dict(
+            type='EELANBlock',
+            num_elan_block=2,
+            middle_ratio=0.4,
+            block_ratio=0.2,
+            num_blocks=6,
+            num_convs_in_block=1),
+        in_channels=[320, 640, 960, 1280],
+        out_channels=[160, 320, 480, 640]),
+    bbox_head=dict(
+        head_module=dict(
+            in_channels=[160, 320, 480, 640],
+            main_out_channels=[320, 640, 960, 1280])))
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov7/yolov7_l_syncbn_fast_8x16b-300e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/yolov7/yolov7_l_syncbn_fast_8x16b-300e_coco.py
new file mode 100644
index 0000000..e8a756c
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov7/yolov7_l_syncbn_fast_8x16b-300e_coco.py
@@ -0,0 +1,324 @@
+_base_ = ['../_base_/default_runtime.py', '../_base_/det_p5_tta.py']
+
+# ========================Frequently modified parameters======================
+# -----data related-----
+data_root = 'data/coco/'  # Root path of data
+# Path of train annotation file
+train_ann_file = 'annotations/instances_train2017.json'
+train_data_prefix = 'train2017/'  # Prefix of train image path
+# Path of val annotation file
+val_ann_file = 'annotations/instances_val2017.json'
+val_data_prefix = 'val2017/'  # Prefix of val image path
+
+num_classes = 80  # Number of classes for classification
+# Batch size of a single GPU during training
+train_batch_size_per_gpu = 16
+# Worker to pre-fetch data for each single GPU during training
+train_num_workers = 8
+# persistent_workers must be False if num_workers is 0
+persistent_workers = True
+
+# -----model related-----
+# Basic size of multi-scale prior box
+anchors = [
+    [(12, 16), (19, 36), (40, 28)],  # P3/8
+    [(36, 75), (76, 55), (72, 146)],  # P4/16
+    [(142, 110), (192, 243), (459, 401)]  # P5/32
+]
+# -----train val related-----
+# Base learning rate for optim_wrapper. Corresponding to 8xb16=128 bs
+base_lr = 0.01
+max_epochs = 300  # Maximum training epochs
+
+num_epoch_stage2 = 30  # The last 30 epochs switch evaluation interval
+val_interval_stage2 = 1  # Evaluation interval
+
+model_test_cfg = dict(
+    # The config of multi-label for multi-class prediction.
+    multi_label=True,
+    # The number of boxes before NMS.
+    nms_pre=30000,
+    score_thr=0.001,  # Threshold to filter out boxes.
+    nms=dict(type='nms', iou_threshold=0.65),  # NMS type and threshold
+    max_per_img=300)  # Max number of detections of each image
+
+# ========================Possible modified parameters========================
+# -----data related-----
+img_scale = (640, 640)  # width, height
+# Dataset type, this will be used to define the dataset
+dataset_type = 'YOLOv5CocoDataset'
+# Batch size of a single GPU during validation
+val_batch_size_per_gpu = 1
+# Worker to pre-fetch data for each single GPU during validation
+val_num_workers = 2
+
+# Config of batch shapes. Only on val.
+# It means not used if batch_shapes_cfg is None.
+batch_shapes_cfg = dict(
+    type='BatchShapePolicy',
+    batch_size=val_batch_size_per_gpu,
+    img_size=img_scale[0],
+    # The image scale of padding should be divided by pad_size_divisor
+    size_divisor=32,
+    # Additional paddings for pixel scale
+    extra_pad_ratio=0.5)
+
+# -----model related-----
+strides = [8, 16, 32]  # Strides of multi-scale prior box
+num_det_layers = 3  # The number of model output scales
+norm_cfg = dict(type='BN', momentum=0.03, eps=0.001)
+
+# Data augmentation
+max_translate_ratio = 0.2  # YOLOv5RandomAffine
+scaling_ratio_range = (0.1, 2.0)  # YOLOv5RandomAffine
+mixup_prob = 0.15  # YOLOv5MixUp
+randchoice_mosaic_prob = [0.8, 0.2]
+mixup_alpha = 8.0  # YOLOv5MixUp
+mixup_beta = 8.0  # YOLOv5MixUp
+
+# -----train val related-----
+loss_cls_weight = 0.3
+loss_bbox_weight = 0.05
+loss_obj_weight = 0.7
+# BatchYOLOv7Assigner params
+simota_candidate_topk = 10
+simota_iou_weight = 3.0
+simota_cls_weight = 1.0
+prior_match_thr = 4.  # Priori box matching threshold
+obj_level_weights = [4., 1.,
+                     0.4]  # The obj loss weights of the three output layers
+
+lr_factor = 0.1  # Learning rate scaling factor
+weight_decay = 0.0005
+save_epoch_intervals = 1  # Save model checkpoint and validation intervals
+max_keep_ckpts = 3  # The maximum checkpoints to keep.
+
+# Single-scale training is recommended to
+# be turned on, which can speed up training.
+env_cfg = dict(cudnn_benchmark=True)
+
+# ===============================Unmodified in most cases====================
+model = dict(
+    type='YOLODetector',
+    data_preprocessor=dict(
+        type='YOLOv5DetDataPreprocessor',
+        mean=[0., 0., 0.],
+        std=[255., 255., 255.],
+        bgr_to_rgb=True),
+    backbone=dict(
+        type='YOLOv7Backbone',
+        arch='L',
+        norm_cfg=norm_cfg,
+        act_cfg=dict(type='SiLU', inplace=True)),
+    neck=dict(
+        type='YOLOv7PAFPN',
+        block_cfg=dict(
+            type='ELANBlock',
+            middle_ratio=0.5,
+            block_ratio=0.25,
+            num_blocks=4,
+            num_convs_in_block=1),
+        upsample_feats_cat_first=False,
+        in_channels=[512, 1024, 1024],
+        # The real output channel will be multiplied by 2
+        out_channels=[128, 256, 512],
+        norm_cfg=norm_cfg,
+        act_cfg=dict(type='SiLU', inplace=True)),
+    bbox_head=dict(
+        type='YOLOv7Head',
+        head_module=dict(
+            type='YOLOv7HeadModule',
+            num_classes=num_classes,
+            in_channels=[256, 512, 1024],
+            featmap_strides=strides,
+            num_base_priors=3),
+        prior_generator=dict(
+            type='mmdet.YOLOAnchorGenerator',
+            base_sizes=anchors,
+            strides=strides),
+        # scaled based on number of detection layers
+        loss_cls=dict(
+            type='mmdet.CrossEntropyLoss',
+            use_sigmoid=True,
+            reduction='mean',
+            loss_weight=loss_cls_weight *
+            (num_classes / 80 * 3 / num_det_layers)),
+        loss_bbox=dict(
+            type='IoULoss',
+            iou_mode='ciou',
+            bbox_format='xywh',
+            reduction='mean',
+            loss_weight=loss_bbox_weight * (3 / num_det_layers),
+            return_iou=True),
+        loss_obj=dict(
+            type='mmdet.CrossEntropyLoss',
+            use_sigmoid=True,
+            reduction='mean',
+            loss_weight=loss_obj_weight *
+            ((img_scale[0] / 640)**2 * 3 / num_det_layers)),
+        prior_match_thr=prior_match_thr,
+        obj_level_weights=obj_level_weights,
+        # BatchYOLOv7Assigner params
+        simota_candidate_topk=simota_candidate_topk,
+        simota_iou_weight=simota_iou_weight,
+        simota_cls_weight=simota_cls_weight),
+    test_cfg=model_test_cfg)
+
+pre_transform = [
+    dict(type='LoadImageFromFile', backend_args=_base_.backend_args),
+    dict(type='LoadAnnotations', with_bbox=True)
+]
+
+mosiac4_pipeline = [
+    dict(
+        type='Mosaic',
+        img_scale=img_scale,
+        pad_val=114.0,
+        pre_transform=pre_transform),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        max_translate_ratio=max_translate_ratio,  # note
+        scaling_ratio_range=scaling_ratio_range,  # note
+        # img_scale is (width, height)
+        border=(-img_scale[0] // 2, -img_scale[1] // 2),
+        border_val=(114, 114, 114)),
+]
+
+mosiac9_pipeline = [
+    dict(
+        type='Mosaic9',
+        img_scale=img_scale,
+        pad_val=114.0,
+        pre_transform=pre_transform),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        max_translate_ratio=max_translate_ratio,  # note
+        scaling_ratio_range=scaling_ratio_range,  # note
+        # img_scale is (width, height)
+        border=(-img_scale[0] // 2, -img_scale[1] // 2),
+        border_val=(114, 114, 114)),
+]
+
+randchoice_mosaic_pipeline = dict(
+    type='RandomChoice',
+    transforms=[mosiac4_pipeline, mosiac9_pipeline],
+    prob=randchoice_mosaic_prob)
+
+train_pipeline = [
+    *pre_transform,
+    randchoice_mosaic_pipeline,
+    dict(
+        type='YOLOv5MixUp',
+        alpha=mixup_alpha,  # note
+        beta=mixup_beta,  # note
+        prob=mixup_prob,
+        pre_transform=[*pre_transform, randchoice_mosaic_pipeline]),
+    dict(type='YOLOv5HSVRandomAug'),
+    dict(type='mmdet.RandomFlip', prob=0.5),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                   'flip_direction'))
+]
+
+train_dataloader = dict(
+    batch_size=train_batch_size_per_gpu,
+    num_workers=train_num_workers,
+    persistent_workers=persistent_workers,
+    pin_memory=True,
+    sampler=dict(type='DefaultSampler', shuffle=True),
+    collate_fn=dict(type='yolov5_collate'),  # FASTER
+    dataset=dict(
+        type=dataset_type,
+        data_root=data_root,
+        ann_file=train_ann_file,
+        data_prefix=dict(img=train_data_prefix),
+        filter_cfg=dict(filter_empty_gt=False, min_size=32),
+        pipeline=train_pipeline))
+
+test_pipeline = [
+    dict(type='LoadImageFromFile', backend_args=_base_.backend_args),
+    dict(type='YOLOv5KeepRatioResize', scale=img_scale),
+    dict(
+        type='LetterResize',
+        scale=img_scale,
+        allow_scale_up=False,
+        pad_val=dict(img=114)),
+    dict(type='LoadAnnotations', with_bbox=True, _scope_='mmdet'),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                   'scale_factor', 'pad_param'))
+]
+
+val_dataloader = dict(
+    batch_size=val_batch_size_per_gpu,
+    num_workers=val_num_workers,
+    persistent_workers=persistent_workers,
+    pin_memory=True,
+    drop_last=False,
+    sampler=dict(type='DefaultSampler', shuffle=False),
+    dataset=dict(
+        type=dataset_type,
+        data_root=data_root,
+        test_mode=True,
+        data_prefix=dict(img=val_data_prefix),
+        ann_file=val_ann_file,
+        pipeline=test_pipeline,
+        batch_shapes_cfg=batch_shapes_cfg))
+
+test_dataloader = val_dataloader
+
+param_scheduler = None
+optim_wrapper = dict(
+    type='OptimWrapper',
+    optimizer=dict(
+        type='SGD',
+        lr=base_lr,
+        momentum=0.937,
+        weight_decay=weight_decay,
+        nesterov=True,
+        batch_size_per_gpu=train_batch_size_per_gpu),
+    constructor='YOLOv7OptimWrapperConstructor')
+
+default_hooks = dict(
+    param_scheduler=dict(
+        type='YOLOv5ParamSchedulerHook',
+        scheduler_type='cosine',
+        lr_factor=lr_factor,  # note
+        max_epochs=max_epochs),
+    checkpoint=dict(
+        type='CheckpointHook',
+        save_param_scheduler=False,
+        interval=save_epoch_intervals,
+        save_best='auto',
+        max_keep_ckpts=max_keep_ckpts))
+
+custom_hooks = [
+    dict(
+        type='EMAHook',
+        ema_type='ExpMomentumEMA',
+        momentum=0.0001,
+        update_buffers=True,
+        strict_load=False,
+        priority=49)
+]
+
+val_evaluator = dict(
+    type='mmdet.CocoMetric',
+    proposal_nums=(100, 1, 10),  # Can be accelerated
+    ann_file=data_root + val_ann_file,
+    metric='bbox')
+test_evaluator = val_evaluator
+
+train_cfg = dict(
+    type='EpochBasedTrainLoop',
+    max_epochs=max_epochs,
+    val_interval=save_epoch_intervals,
+    dynamic_intervals=[(max_epochs - num_epoch_stage2, val_interval_stage2)])
+val_cfg = dict(type='ValLoop')
+test_cfg = dict(type='TestLoop')
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov7/yolov7_tiny_fast_1xb12-40e_cat.py b/mmdetection_practice/third_party/mmyolo/configs/yolov7/yolov7_tiny_fast_1xb12-40e_cat.py
new file mode 100644
index 0000000..eb04467
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov7/yolov7_tiny_fast_1xb12-40e_cat.py
@@ -0,0 +1,56 @@
+_base_ = 'yolov7_tiny_syncbn_fast_8x16b-300e_coco.py'
+
+data_root = './data/cat/'
+class_name = ('cat', )
+num_classes = len(class_name)
+metainfo = dict(classes=class_name, palette=[(20, 220, 60)])
+
+anchors = [
+    [(68, 69), (154, 91), (143, 162)],  # P3/8
+    [(242, 160), (189, 287), (391, 207)],  # P4/16
+    [(353, 337), (539, 341), (443, 432)]  # P5/32
+]
+
+max_epochs = 40
+train_batch_size_per_gpu = 12
+train_num_workers = 4
+
+load_from = 'https://download.openmmlab.com/mmyolo/v0/yolov7/yolov7_tiny_syncbn_fast_8x16b-300e_coco/yolov7_tiny_syncbn_fast_8x16b-300e_coco_20221126_102719-0ee5bbdf.pth'  # noqa
+
+model = dict(
+    backbone=dict(frozen_stages=4),
+    bbox_head=dict(
+        head_module=dict(num_classes=num_classes),
+        prior_generator=dict(base_sizes=anchors)))
+
+train_dataloader = dict(
+    batch_size=train_batch_size_per_gpu,
+    num_workers=train_num_workers,
+    dataset=dict(
+        data_root=data_root,
+        metainfo=metainfo,
+        ann_file='annotations/trainval.json',
+        data_prefix=dict(img='images/')))
+
+val_dataloader = dict(
+    dataset=dict(
+        metainfo=metainfo,
+        data_root=data_root,
+        ann_file='annotations/test.json',
+        data_prefix=dict(img='images/')))
+
+test_dataloader = val_dataloader
+
+_base_.optim_wrapper.optimizer.batch_size_per_gpu = train_batch_size_per_gpu
+
+val_evaluator = dict(ann_file=data_root + 'annotations/test.json')
+test_evaluator = val_evaluator
+
+default_hooks = dict(
+    checkpoint=dict(interval=10, max_keep_ckpts=2, save_best='auto'),
+    # The warmup_mim_iter parameter is critical.
+    # The default value is 1000 which is not suitable for cat datasets.
+    param_scheduler=dict(max_epochs=max_epochs, warmup_mim_iter=10),
+    logger=dict(type='LoggerHook', interval=5))
+train_cfg = dict(max_epochs=max_epochs, val_interval=10)
+# visualizer = dict(vis_backends = [dict(type='LocalVisBackend'), dict(type='WandbVisBackend')]) # noqa
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov7/yolov7_tiny_syncbn_fast_8x16b-300e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/yolov7/yolov7_tiny_syncbn_fast_8x16b-300e_coco.py
new file mode 100644
index 0000000..b9e9f10
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov7/yolov7_tiny_syncbn_fast_8x16b-300e_coco.py
@@ -0,0 +1,98 @@
+_base_ = './yolov7_l_syncbn_fast_8x16b-300e_coco.py'
+
+# ========================modified parameters========================
+
+# -----model related-----
+# Data augmentation
+max_translate_ratio = 0.1  # YOLOv5RandomAffine
+scaling_ratio_range = (0.5, 1.6)  # YOLOv5RandomAffine
+mixup_prob = 0.05  # YOLOv5MixUp
+randchoice_mosaic_prob = [0.8, 0.2]
+mixup_alpha = 8.0  # YOLOv5MixUp
+mixup_beta = 8.0  # YOLOv5MixUp
+
+# -----train val related-----
+loss_cls_weight = 0.5
+loss_obj_weight = 1.0
+
+lr_factor = 0.01  # Learning rate scaling factor
+# ===============================Unmodified in most cases====================
+num_classes = _base_.num_classes
+num_det_layers = _base_.num_det_layers
+img_scale = _base_.img_scale
+pre_transform = _base_.pre_transform
+model = dict(
+    backbone=dict(
+        arch='Tiny', act_cfg=dict(type='LeakyReLU', negative_slope=0.1)),
+    neck=dict(
+        is_tiny_version=True,
+        in_channels=[128, 256, 512],
+        out_channels=[64, 128, 256],
+        block_cfg=dict(
+            _delete_=True, type='TinyDownSampleBlock', middle_ratio=0.25),
+        act_cfg=dict(type='LeakyReLU', negative_slope=0.1),
+        use_repconv_outs=False),
+    bbox_head=dict(
+        head_module=dict(in_channels=[128, 256, 512]),
+        loss_cls=dict(loss_weight=loss_cls_weight *
+                      (num_classes / 80 * 3 / num_det_layers)),
+        loss_obj=dict(loss_weight=loss_obj_weight *
+                      ((img_scale[0] / 640)**2 * 3 / num_det_layers))))
+
+mosiac4_pipeline = [
+    dict(
+        type='Mosaic',
+        img_scale=img_scale,
+        pad_val=114.0,
+        pre_transform=pre_transform),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        max_translate_ratio=max_translate_ratio,  # change
+        scaling_ratio_range=scaling_ratio_range,  # change
+        # img_scale is (width, height)
+        border=(-img_scale[0] // 2, -img_scale[1] // 2),
+        border_val=(114, 114, 114)),
+]
+
+mosiac9_pipeline = [
+    dict(
+        type='Mosaic9',
+        img_scale=img_scale,
+        pad_val=114.0,
+        pre_transform=pre_transform),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        max_translate_ratio=max_translate_ratio,  # change
+        scaling_ratio_range=scaling_ratio_range,  # change
+        border=(-img_scale[0] // 2, -img_scale[1] // 2),
+        border_val=(114, 114, 114)),
+]
+
+randchoice_mosaic_pipeline = dict(
+    type='RandomChoice',
+    transforms=[mosiac4_pipeline, mosiac9_pipeline],
+    prob=randchoice_mosaic_prob)
+
+train_pipeline = [
+    *pre_transform,
+    randchoice_mosaic_pipeline,
+    dict(
+        type='YOLOv5MixUp',
+        alpha=mixup_alpha,
+        beta=mixup_beta,
+        prob=mixup_prob,  # change
+        pre_transform=[*pre_transform, randchoice_mosaic_pipeline]),
+    dict(type='YOLOv5HSVRandomAug'),
+    dict(type='mmdet.RandomFlip', prob=0.5),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                   'flip_direction'))
+]
+
+train_dataloader = dict(dataset=dict(pipeline=train_pipeline))
+default_hooks = dict(param_scheduler=dict(lr_factor=lr_factor))
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov7/yolov7_w-p6_syncbn_fast_8x16b-300e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/yolov7/yolov7_w-p6_syncbn_fast_8x16b-300e_coco.py
new file mode 100644
index 0000000..9758b87
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov7/yolov7_w-p6_syncbn_fast_8x16b-300e_coco.py
@@ -0,0 +1,182 @@
+_base_ = './yolov7_l_syncbn_fast_8x16b-300e_coco.py'
+
+# ========================modified parameters========================
+# -----data related-----
+img_scale = (1280, 1280)  # height, width
+num_classes = 80  # Number of classes for classification
+# Config of batch shapes. Only on val
+# It means not used if batch_shapes_cfg is None.
+batch_shapes_cfg = dict(
+    img_size=img_scale[
+        0],  # The image scale of padding should be divided by pad_size_divisor
+    size_divisor=64)  # Additional paddings for pixel scale
+tta_img_scales = [(1280, 1280), (1024, 1024), (1536, 1536)]
+
+# -----model related-----
+# Basic size of multi-scale prior box
+anchors = [
+    [(19, 27), (44, 40), (38, 94)],  # P3/8
+    [(96, 68), (86, 152), (180, 137)],  # P4/16
+    [(140, 301), (303, 264), (238, 542)],  # P5/32
+    [(436, 615), (739, 380), (925, 792)]  # P6/64
+]
+strides = [8, 16, 32, 64]  # Strides of multi-scale prior box
+num_det_layers = 4  # # The number of model output scales
+norm_cfg = dict(type='BN', momentum=0.03, eps=0.001)
+
+# Data augmentation
+max_translate_ratio = 0.2  # YOLOv5RandomAffine
+scaling_ratio_range = (0.1, 2.0)  # YOLOv5RandomAffine
+mixup_prob = 0.15  # YOLOv5MixUp
+randchoice_mosaic_prob = [0.8, 0.2]
+mixup_alpha = 8.0  # YOLOv5MixUp
+mixup_beta = 8.0  # YOLOv5MixUp
+
+# -----train val related-----
+loss_cls_weight = 0.3
+loss_bbox_weight = 0.05
+loss_obj_weight = 0.7
+obj_level_weights = [4.0, 1.0, 0.25, 0.06]
+simota_candidate_topk = 20
+
+# The only difference between P6 and P5 in terms of
+# hyperparameters is lr_factor
+lr_factor = 0.2
+
+# ===============================Unmodified in most cases====================
+pre_transform = _base_.pre_transform
+
+model = dict(
+    backbone=dict(arch='W', out_indices=(2, 3, 4, 5)),
+    neck=dict(
+        in_channels=[256, 512, 768, 1024],
+        out_channels=[128, 256, 384, 512],
+        use_maxpool_in_downsample=False,
+        use_repconv_outs=False),
+    bbox_head=dict(
+        head_module=dict(
+            type='YOLOv7p6HeadModule',
+            in_channels=[128, 256, 384, 512],
+            featmap_strides=strides,
+            norm_cfg=norm_cfg,
+            act_cfg=dict(type='SiLU', inplace=True)),
+        prior_generator=dict(base_sizes=anchors, strides=strides),
+        simota_candidate_topk=simota_candidate_topk,  # note
+        # scaled based on number of detection layers
+        loss_cls=dict(loss_weight=loss_cls_weight *
+                      (num_classes / 80 * 3 / num_det_layers)),
+        loss_bbox=dict(loss_weight=loss_bbox_weight * (3 / num_det_layers)),
+        loss_obj=dict(loss_weight=loss_obj_weight *
+                      ((img_scale[0] / 640)**2 * 3 / num_det_layers)),
+        obj_level_weights=obj_level_weights))
+
+mosiac4_pipeline = [
+    dict(
+        type='Mosaic',
+        img_scale=img_scale,
+        pad_val=114.0,
+        pre_transform=pre_transform),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        max_translate_ratio=max_translate_ratio,  # note
+        scaling_ratio_range=scaling_ratio_range,  # note
+        # img_scale is (width, height)
+        border=(-img_scale[0] // 2, -img_scale[1] // 2),
+        border_val=(114, 114, 114)),
+]
+
+mosiac9_pipeline = [
+    dict(
+        type='Mosaic9',
+        img_scale=img_scale,
+        pad_val=114.0,
+        pre_transform=pre_transform),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        max_translate_ratio=max_translate_ratio,  # note
+        scaling_ratio_range=scaling_ratio_range,  # note
+        # img_scale is (width, height)
+        border=(-img_scale[0] // 2, -img_scale[1] // 2),
+        border_val=(114, 114, 114)),
+]
+
+randchoice_mosaic_pipeline = dict(
+    type='RandomChoice',
+    transforms=[mosiac4_pipeline, mosiac9_pipeline],
+    prob=randchoice_mosaic_prob)
+
+train_pipeline = [
+    *pre_transform,
+    randchoice_mosaic_pipeline,
+    dict(
+        type='YOLOv5MixUp',
+        alpha=mixup_alpha,  # note
+        beta=mixup_beta,  # note
+        prob=mixup_prob,
+        pre_transform=[*pre_transform, randchoice_mosaic_pipeline]),
+    dict(type='YOLOv5HSVRandomAug'),
+    dict(type='mmdet.RandomFlip', prob=0.5),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                   'flip_direction'))
+]
+train_dataloader = dict(dataset=dict(pipeline=train_pipeline))
+
+test_pipeline = [
+    dict(type='LoadImageFromFile', backend_args=_base_.backend_args),
+    dict(type='YOLOv5KeepRatioResize', scale=img_scale),
+    dict(
+        type='LetterResize',
+        scale=img_scale,
+        allow_scale_up=False,
+        pad_val=dict(img=114)),
+    dict(type='LoadAnnotations', with_bbox=True, _scope_='mmdet'),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                   'scale_factor', 'pad_param'))
+]
+val_dataloader = dict(
+    dataset=dict(pipeline=test_pipeline, batch_shapes_cfg=batch_shapes_cfg))
+test_dataloader = val_dataloader
+
+default_hooks = dict(param_scheduler=dict(lr_factor=lr_factor))
+
+# Config for Test Time Augmentation. (TTA)
+_multiscale_resize_transforms = [
+    dict(
+        type='Compose',
+        transforms=[
+            dict(type='YOLOv5KeepRatioResize', scale=s),
+            dict(
+                type='LetterResize',
+                scale=s,
+                allow_scale_up=False,
+                pad_val=dict(img=114))
+        ]) for s in tta_img_scales
+]
+
+tta_pipeline = [
+    dict(type='LoadImageFromFile', backend_args=_base_.backend_args),
+    dict(
+        type='TestTimeAug',
+        transforms=[
+            _multiscale_resize_transforms,
+            [
+                dict(type='mmdet.RandomFlip', prob=1.),
+                dict(type='mmdet.RandomFlip', prob=0.)
+            ], [dict(type='mmdet.LoadAnnotations', with_bbox=True)],
+            [
+                dict(
+                    type='mmdet.PackDetInputs',
+                    meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                               'scale_factor', 'pad_param', 'flip',
+                               'flip_direction'))
+            ]
+        ])
+]
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov7/yolov7_x_syncbn_fast_8x16b-300e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/yolov7/yolov7_x_syncbn_fast_8x16b-300e_coco.py
new file mode 100644
index 0000000..9929705
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov7/yolov7_x_syncbn_fast_8x16b-300e_coco.py
@@ -0,0 +1,15 @@
+_base_ = './yolov7_l_syncbn_fast_8x16b-300e_coco.py'
+
+model = dict(
+    backbone=dict(arch='X'),
+    neck=dict(
+        in_channels=[640, 1280, 1280],
+        out_channels=[160, 320, 640],
+        block_cfg=dict(
+            type='ELANBlock',
+            middle_ratio=0.4,
+            block_ratio=0.4,
+            num_blocks=3,
+            num_convs_in_block=2),
+        use_repconv_outs=False),
+    bbox_head=dict(head_module=dict(in_channels=[320, 640, 1280])))
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov8/README.md b/mmdetection_practice/third_party/mmyolo/configs/yolov8/README.md
new file mode 100644
index 0000000..766aa99
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov8/README.md
@@ -0,0 +1,45 @@
+# YOLOv8
+
+<!-- [ALGORITHM] -->
+
+## Abstract
+
+Ultralytics YOLOv8, developed by Ultralytics, is a cutting-edge, state-of-the-art (SOTA) model that builds upon the success of previous YOLO versions and introduces new features and improvements to further boost performance and flexibility. YOLOv8 is designed to be fast, accurate, and easy to use, making it an excellent choice for a wide range of object detection, image segmentation and image classification tasks.
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/17425982/212812246-51dc029c-e892-455d-86b4-946b5d03957a.png"/>
+YOLOv8 performance
+</div>
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/27466624/222869864-1955f054-aa6d-4a80-aed3-92f30af28849.jpg"/>
+YOLOv8-P5 model structure
+</div>
+
+## Results and models
+
+### COCO
+
+| Backbone | Arch | size | Mask Refine | SyncBN | AMP | Mem (GB) |   box AP    | TTA box AP |                             Config                              |                                                                                                                                                                                   Download                                                                                                                                                                                   |
+| :------: | :--: | :--: | :---------: | :----: | :-: | :------: | :---------: | :--------: | :-------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: |
+| YOLOv8-n |  P5  | 640  |     No      |  Yes   | Yes |   2.8    |    37.2     |            |       [config](./yolov8_n_syncbn_fast_8xb16-500e_coco.py)       |                         [model](https://download.openmmlab.com/mmyolo/v0/yolov8/yolov8_n_syncbn_fast_8xb16-500e_coco/yolov8_n_syncbn_fast_8xb16-500e_coco_20230114_131804-88c11cdb.pth) \| [log](https://download.openmmlab.com/mmyolo/v0/yolov8/yolov8_n_syncbn_fast_8xb16-500e_coco/yolov8_n_syncbn_fast_8xb16-500e_coco_20230114_131804.log.json)                         |
+| YOLOv8-n |  P5  | 640  |     Yes     |  Yes   | Yes |   2.5    | 37.4 (+0.2) |    39.9    | [config](./yolov8_n_mask-refine_syncbn_fast_8xb16-500e_coco.py) | [model](https://download.openmmlab.com/mmyolo/v0/yolov8/yolov8_n_mask-refine_syncbn_fast_8xb16-500e_coco/yolov8_n_mask-refine_syncbn_fast_8xb16-500e_coco_20230216_101206-b975b1cd.pth) \| [log](https://download.openmmlab.com/mmyolo/v0/yolov8/yolov8_n_mask-refine_syncbn_fast_8xb16-500e_coco/yolov8_n_mask-refine_syncbn_fast_8xb16-500e_coco_20230216_101206.log.json) |
+| YOLOv8-s |  P5  | 640  |     No      |  Yes   | Yes |   4.0    |    44.2     |            |       [config](./yolov8_s_syncbn_fast_8xb16-500e_coco.py)       |                         [model](https://download.openmmlab.com/mmyolo/v0/yolov8/yolov8_s_syncbn_fast_8xb16-500e_coco/yolov8_s_syncbn_fast_8xb16-500e_coco_20230117_180101-5aa5f0f1.pth) \| [log](https://download.openmmlab.com/mmyolo/v0/yolov8/yolov8_s_syncbn_fast_8xb16-500e_coco/yolov8_s_syncbn_fast_8xb16-500e_coco_20230117_180101.log.json)                         |
+| YOLOv8-s |  P5  | 640  |     Yes     |  Yes   | Yes |   4.0    | 45.1 (+0.9) |    46.8    | [config](./yolov8_s_mask-refine_syncbn_fast_8xb16-500e_coco.py) | [model](https://download.openmmlab.com/mmyolo/v0/yolov8/yolov8_s_mask-refine_syncbn_fast_8xb16-500e_coco/yolov8_s_mask-refine_syncbn_fast_8xb16-500e_coco_20230216_095938-ce3c1b3f.pth) \| [log](https://download.openmmlab.com/mmyolo/v0/yolov8/yolov8_s_mask-refine_syncbn_fast_8xb16-500e_coco/yolov8_s_mask-refine_syncbn_fast_8xb16-500e_coco_20230216_095938.log.json) |
+| YOLOv8-m |  P5  | 640  |     No      |  Yes   | Yes |   7.2    |    49.8     |            |       [config](./yolov8_m_syncbn_fast_8xb16-500e_coco.py)       |                         [model](https://download.openmmlab.com/mmyolo/v0/yolov8/yolov8_m_syncbn_fast_8xb16-500e_coco/yolov8_m_syncbn_fast_8xb16-500e_coco_20230115_192200-c22e560a.pth) \| [log](https://download.openmmlab.com/mmyolo/v0/yolov8/yolov8_m_syncbn_fast_8xb16-500e_coco/yolov8_m_syncbn_fast_8xb16-500e_coco_20230115_192200.log.json)                         |
+| YOLOv8-m |  P5  | 640  |     Yes     |  Yes   | Yes |   7.0    | 50.6 (+0.8) |    52.3    | [config](./yolov8_m_mask-refine_syncbn_fast_8xb16-500e_coco.py) | [model](https://download.openmmlab.com/mmyolo/v0/yolov8/yolov8_m_mask-refine_syncbn_fast_8xb16-500e_coco/yolov8_m_mask-refine_syncbn_fast_8xb16-500e_coco_20230216_223400-f40abfcd.pth) \| [log](https://download.openmmlab.com/mmyolo/v0/yolov8/yolov8_m_mask-refine_syncbn_fast_8xb16-500e_coco/yolov8_m_mask-refine_syncbn_fast_8xb16-500e_coco_20230216_223400.log.json) |
+| YOLOv8-l |  P5  | 640  |     No      |  Yes   | Yes |   9.8    |    52.1     |            |       [config](./yolov8_l_syncbn_fast_8xb16-500e_coco.py)       |                         [model](https://download.openmmlab.com/mmyolo/v0/yolov8/yolov8_l_syncbn_fast_8xb16-500e_coco/yolov8_l_syncbn_fast_8xb16-500e_coco_20230217_182526-189611b6.pth) \| [log](https://download.openmmlab.com/mmyolo/v0/yolov8/yolov8_l_syncbn_fast_8xb16-500e_coco/yolov8_l_syncbn_fast_8xb16-500e_coco_20230217_182526.log.json)                         |
+| YOLOv8-l |  P5  | 640  |     Yes     |  Yes   | Yes |   9.1    | 53.0 (+0.9) |    54.4    | [config](./yolov8_l_mask-refine_syncbn_fast_8xb16-500e_coco.py) | [model](https://download.openmmlab.com/mmyolo/v0/yolov8/yolov8_l_mask-refine_syncbn_fast_8xb16-500e_coco/yolov8_l_mask-refine_syncbn_fast_8xb16-500e_coco_20230217_120100-5881dec4.pth) \| [log](https://download.openmmlab.com/mmyolo/v0/yolov8/yolov8_l_mask-refine_syncbn_fast_8xb16-500e_coco/yolov8_l_mask-refine_syncbn_fast_8xb16-500e_coco_20230217_120100.log.json) |
+| YOLOv8-x |  P5  | 640  |     No      |  Yes   | Yes |   12.2   |    52.7     |            |       [config](./yolov8_x_syncbn_fast_8xb16-500e_coco.py)       |                         [model](https://download.openmmlab.com/mmyolo/v0/yolov8/yolov8_x_syncbn_fast_8xb16-500e_coco/yolov8_x_syncbn_fast_8xb16-500e_coco_20230218_023338-5674673c.pth) \| [log](https://download.openmmlab.com/mmyolo/v0/yolov8/yolov8_x_syncbn_fast_8xb16-500e_coco/yolov8_x_syncbn_fast_8xb16-500e_coco_20230218_023338.log.json)                         |
+| YOLOv8-x |  P5  | 640  |     Yes     |  Yes   | Yes |   12.4   | 54.0 (+1.3) |    55.0    | [config](./yolov8_x_mask-refine_syncbn_fast_8xb16-500e_coco.py) | [model](https://download.openmmlab.com/mmyolo/v0/yolov8/yolov8_x_mask-refine_syncbn_fast_8xb16-500e_coco/yolov8_x_mask-refine_syncbn_fast_8xb16-500e_coco_20230217_120411-079ca8d1.pth) \| [log](https://download.openmmlab.com/mmyolo/v0/yolov8/yolov8_x_mask-refine_syncbn_fast_8xb16-500e_coco/yolov8_x_mask-refine_syncbn_fast_8xb16-500e_coco_20230217_120411.log.json) |
+
+**Note**
+
+1. We use 8x A100 for training, and the single-GPU batch size is 16. This is different from the official code, but has no effect on performance.
+2. The performance is unstable and may fluctuate by about 0.3 mAP and the highest performance weight in `COCO` training in `YOLOv8` may not be the last epoch. The performance shown above is the best model.
+3. We provide [scripts](https://github.com/open-mmlab/mmyolo/tree/dev/tools/model_converters/yolov8_to_mmyolo.py) to convert official weights to MMYOLO.
+4. `SyncBN` means using SyncBN, `AMP` indicates training with mixed precision.
+5. The performance of `Mask Refine` training is for the weight performance officially released by YOLOv8. `Mask Refine` means refining bbox by mask while loading annotations and transforming after `YOLOv5RandomAffine`, and the L and X models use `Copy Paste`.
+6. `TTA` means that Test Time Augmentation. It's perform 3 multi-scaling transformations on the image, followed by 2 flipping transformations (flipping and not flipping). You only need to specify `--tta` when testing to enable.  see [TTA](https://github.com/open-mmlab/mmyolo/blob/dev/docs/en/common_usage/tta.md) for details.
+
+## Citation
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov8/metafile.yml b/mmdetection_practice/third_party/mmyolo/configs/yolov8/metafile.yml
new file mode 100644
index 0000000..33cd22b
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov8/metafile.yml
@@ -0,0 +1,140 @@
+Collections:
+  - Name: YOLOv8
+    Metadata:
+      Training Data: COCO
+      Training Techniques:
+        - SGD with Nesterov
+        - Weight Decay
+        - AMP
+        - Synchronize BN
+      Training Resources: 8x A100 GPUs
+      Architecture:
+        - CSPDarkNet
+        - PAFPN
+        - Decoupled Head
+    README: configs/yolov8/README.md
+    Code:
+      URL: https://github.com/open-mmlab/mmyolo/blob/v0.0.1/mmyolo/models/detectors/yolo_detector.py#L12
+      Version: v0.0.1
+
+Models:
+  - Name: yolov8_n_syncbn_fast_8xb16-500e_coco
+    In Collection: YOLOv8
+    Config: configs/yolov8/yolov8_n_syncbn_fast_8xb16-500e_coco.py
+    Metadata:
+      Training Memory (GB): 2.8
+      Epochs: 500
+    Results:
+      - Task: Object Detection
+        Dataset: COCO
+        Metrics:
+          box AP: 37.2
+    Weights: https://download.openmmlab.com/mmyolo/v0/yolov8/yolov8_n_syncbn_fast_8xb16-500e_coco/yolov8_n_syncbn_fast_8xb16-500e_coco_20230114_131804-88c11cdb.pth
+  - Name: yolov8_s_syncbn_fast_8xb16-500e_coco
+    In Collection: YOLOv8
+    Config: configs/yolov8/yolov8_s_syncbn_fast_8xb16-500e_coco.py
+    Metadata:
+      Training Memory (GB): 4.0
+      Epochs: 500
+    Results:
+      - Task: Object Detection
+        Dataset: COCO
+        Metrics:
+          box AP: 44.2
+    Weights: https://download.openmmlab.com/mmyolo/v0/yolov8/yolov8_s_syncbn_fast_8xb16-500e_coco/yolov8_s_syncbn_fast_8xb16-500e_coco_20230117_180101-5aa5f0f1.pth
+  - Name: yolov8_m_syncbn_fast_8xb16-500e_coco
+    In Collection: YOLOv8
+    Config: configs/yolov8/yolov8_m_syncbn_fast_8xb16-500e_coco.py
+    Metadata:
+      Training Memory (GB): 7.2
+      Epochs: 500
+    Results:
+      - Task: Object Detection
+        Dataset: COCO
+        Metrics:
+          box AP: 49.8
+    Weights: https://download.openmmlab.com/mmyolo/v0/yolov8/yolov8_m_syncbn_fast_8xb16-500e_coco/yolov8_m_syncbn_fast_8xb16-500e_coco_20230115_192200-c22e560a.pth
+  - Name: yolov8_l_syncbn_fast_8xb16-500e_coco
+    In Collection: YOLOv8
+    Config: configs/yolov8/yolov8_l_syncbn_fast_8xb16-500e_coco.py
+    Metadata:
+      Training Memory (GB): 9.8
+      Epochs: 500
+    Results:
+      - Task: Object Detection
+        Dataset: COCO
+        Metrics:
+          box AP: 52.1
+    Weights: https://download.openmmlab.com/mmyolo/v0/yolov8/yolov8_l_syncbn_fast_8xb16-500e_coco/yolov8_l_syncbn_fast_8xb16-500e_coco_20230217_182526-189611b6.pth
+  - Name: yolov8_x_syncbn_fast_8xb16-500e_coco
+    In Collection: YOLOv8
+    Config: configs/yolov8/yolov8_x_syncbn_fast_8xb16-500e_coco.py
+    Metadata:
+      Training Memory (GB): 12.2
+      Epochs: 500
+    Results:
+      - Task: Object Detection
+        Dataset: COCO
+        Metrics:
+          box AP: 52.7
+    Weights: https://download.openmmlab.com/mmyolo/v0/yolov8/yolov8_x_syncbn_fast_8xb16-500e_coco/yolov8_x_syncbn_fast_8xb16-500e_coco_20230218_023338-5674673c.pth
+  - Name: yolov8_n_mask-refine_syncbn_fast_8xb16-500e_coco
+    In Collection: YOLOv8
+    Config: configs/yolov8/yolov8_n_mask-refine_syncbn_fast_8xb16-500e_coco.py
+    Metadata:
+      Training Memory (GB): 2.5
+      Epochs: 500
+    Results:
+      - Task: Object Detection
+        Dataset: COCO
+        Metrics:
+          box AP: 37.4
+    Weights: https://download.openmmlab.com/mmyolo/v0/yolov8/yolov8_n_mask-refine_syncbn_fast_8xb16-500e_coco/yolov8_n_mask-refine_syncbn_fast_8xb16-500e_coco_20230216_101206-b975b1cd.pth
+  - Name: yolov8_s_mask-refine_syncbn_fast_8xb16-500e_coco
+    In Collection: YOLOv8
+    Config: configs/yolov8/yolov8_s_mask-refine_syncbn_fast_8xb16-500e_coco.py
+    Metadata:
+      Training Memory (GB): 4.0
+      Epochs: 500
+    Results:
+      - Task: Object Detection
+        Dataset: COCO
+        Metrics:
+          box AP: 45.1
+    Weights: https://download.openmmlab.com/mmyolo/v0/yolov8/yolov8_s_mask-refine_syncbn_fast_8xb16-500e_coco/yolov8_s_mask-refine_syncbn_fast_8xb16-500e_coco_20230216_095938-ce3c1b3f.pth
+  - Name: yolov8_m_mask-refine_syncbn_fast_8xb16-500e_coco
+    In Collection: YOLOv8
+    Config: configs/yolov8/yolov8_m_mask-refine_syncbn_fast_8xb16-500e_coco.py
+    Metadata:
+      Training Memory (GB): 7.0
+      Epochs: 500
+    Results:
+      - Task: Object Detection
+        Dataset: COCO
+        Metrics:
+          box AP: 50.6
+    Weights: https://download.openmmlab.com/mmyolo/v0/yolov8/yolov8_m_mask-refine_syncbn_fast_8xb16-500e_coco/yolov8_m_mask-refine_syncbn_fast_8xb16-500e_coco_20230216_223400-f40abfcd.pth
+  - Name: yolov8_l_mask-refine_syncbn_fast_8xb16-500e_coco
+    In Collection: YOLOv8
+    Config: configs/yolov8/yolov8_l_mask-refine_syncbn_fast_8xb16-500e_coco.py
+    Metadata:
+      Training Memory (GB): 9.1
+      Epochs: 500
+    Results:
+      - Task: Object Detection
+        Dataset: COCO
+        Metrics:
+          box AP: 53.0
+    Weights: https://download.openmmlab.com/mmyolo/v0/yolov8/yolov8_l_mask-refine_syncbn_fast_8xb16-500e_coco/yolov8_l_mask-refine_syncbn_fast_8xb16-500e_coco_20230217_120100-5881dec4.pth
+  - Name: yolov8_x_mask-refine_syncbn_fast_8xb16-500e_coco
+    In Collection: YOLOv8
+    Config: configs/yolov8/yolov8_x_mask-refine_syncbn_fast_8xb16-500e_coco.py
+    Metadata:
+      Training Memory (GB): 12.4
+      Epochs: 500
+    Results:
+      - Task: Object Detection
+        Dataset: COCO
+        Metrics:
+          box AP: 54.0
+    Weights: https://download.openmmlab.com/mmyolo/v0/yolov8/yolov8_x_mask-refine_syncbn_fast_8xb16-500e_coco/yolov8_x_mask-refine_syncbn_fast_8xb16-500e_coco_20230217_120411-079ca8d1.pth
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov8/yolov8_l_mask-refine_syncbn_fast_8xb16-500e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/yolov8/yolov8_l_mask-refine_syncbn_fast_8xb16-500e_coco.py
new file mode 100644
index 0000000..e25b6bc
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov8/yolov8_l_mask-refine_syncbn_fast_8xb16-500e_coco.py
@@ -0,0 +1,65 @@
+_base_ = './yolov8_m_mask-refine_syncbn_fast_8xb16-500e_coco.py'
+
+# This config use refining bbox and `YOLOv5CopyPaste`.
+# Refining bbox means refining bbox by mask while loading annotations and
+# transforming after `YOLOv5RandomAffine`
+
+# ========================modified parameters======================
+deepen_factor = 1.00
+widen_factor = 1.00
+last_stage_out_channels = 512
+
+mixup_prob = 0.15
+copypaste_prob = 0.3
+
+# =======================Unmodified in most cases==================
+img_scale = _base_.img_scale
+pre_transform = _base_.pre_transform
+last_transform = _base_.last_transform
+affine_scale = _base_.affine_scale
+
+model = dict(
+    backbone=dict(
+        last_stage_out_channels=last_stage_out_channels,
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor),
+    neck=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+        in_channels=[256, 512, last_stage_out_channels],
+        out_channels=[256, 512, last_stage_out_channels]),
+    bbox_head=dict(
+        head_module=dict(
+            widen_factor=widen_factor,
+            in_channels=[256, 512, last_stage_out_channels])))
+
+mosaic_affine_transform = [
+    dict(
+        type='Mosaic',
+        img_scale=img_scale,
+        pad_val=114.0,
+        pre_transform=pre_transform),
+    dict(type='YOLOv5CopyPaste', prob=copypaste_prob),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        max_aspect_ratio=100.,
+        scaling_ratio_range=(1 - affine_scale, 1 + affine_scale),
+        # img_scale is (width, height)
+        border=(-img_scale[0] // 2, -img_scale[1] // 2),
+        border_val=(114, 114, 114),
+        min_area_ratio=_base_.min_area_ratio,
+        use_mask_refine=_base_.use_mask2refine)
+]
+
+train_pipeline = [
+    *pre_transform, *mosaic_affine_transform,
+    dict(
+        type='YOLOv5MixUp',
+        prob=mixup_prob,
+        pre_transform=[*pre_transform, *mosaic_affine_transform]),
+    *last_transform
+]
+
+train_dataloader = dict(dataset=dict(pipeline=train_pipeline))
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov8/yolov8_l_syncbn_fast_8xb16-500e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/yolov8/yolov8_l_syncbn_fast_8xb16-500e_coco.py
new file mode 100644
index 0000000..bea8b2d
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov8/yolov8_l_syncbn_fast_8xb16-500e_coco.py
@@ -0,0 +1,39 @@
+_base_ = './yolov8_m_syncbn_fast_8xb16-500e_coco.py'
+
+# ========================modified parameters======================
+deepen_factor = 1.00
+widen_factor = 1.00
+last_stage_out_channels = 512
+
+mixup_prob = 0.15
+
+# =======================Unmodified in most cases==================
+pre_transform = _base_.pre_transform
+mosaic_affine_transform = _base_.mosaic_affine_transform
+last_transform = _base_.last_transform
+
+model = dict(
+    backbone=dict(
+        last_stage_out_channels=last_stage_out_channels,
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor),
+    neck=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+        in_channels=[256, 512, last_stage_out_channels],
+        out_channels=[256, 512, last_stage_out_channels]),
+    bbox_head=dict(
+        head_module=dict(
+            widen_factor=widen_factor,
+            in_channels=[256, 512, last_stage_out_channels])))
+
+train_pipeline = [
+    *pre_transform, *mosaic_affine_transform,
+    dict(
+        type='YOLOv5MixUp',
+        prob=mixup_prob,
+        pre_transform=[*pre_transform, *mosaic_affine_transform]),
+    *last_transform
+]
+
+train_dataloader = dict(dataset=dict(pipeline=train_pipeline))
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov8/yolov8_m_mask-refine_syncbn_fast_8xb16-500e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/yolov8/yolov8_m_mask-refine_syncbn_fast_8xb16-500e_coco.py
new file mode 100644
index 0000000..2884dae
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov8/yolov8_m_mask-refine_syncbn_fast_8xb16-500e_coco.py
@@ -0,0 +1,85 @@
+_base_ = './yolov8_s_mask-refine_syncbn_fast_8xb16-500e_coco.py'
+
+# This config use refining bbox and `YOLOv5CopyPaste`.
+# Refining bbox means refining bbox by mask while loading annotations and
+# transforming after `YOLOv5RandomAffine`
+
+# ========================modified parameters======================
+deepen_factor = 0.67
+widen_factor = 0.75
+last_stage_out_channels = 768
+
+affine_scale = 0.9
+mixup_prob = 0.1
+copypaste_prob = 0.1
+
+# ===============================Unmodified in most cases====================
+img_scale = _base_.img_scale
+pre_transform = _base_.pre_transform
+last_transform = _base_.last_transform
+
+model = dict(
+    backbone=dict(
+        last_stage_out_channels=last_stage_out_channels,
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor),
+    neck=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+        in_channels=[256, 512, last_stage_out_channels],
+        out_channels=[256, 512, last_stage_out_channels]),
+    bbox_head=dict(
+        head_module=dict(
+            widen_factor=widen_factor,
+            in_channels=[256, 512, last_stage_out_channels])))
+
+mosaic_affine_transform = [
+    dict(
+        type='Mosaic',
+        img_scale=img_scale,
+        pad_val=114.0,
+        pre_transform=pre_transform),
+    dict(type='YOLOv5CopyPaste', prob=copypaste_prob),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        max_aspect_ratio=100.,
+        scaling_ratio_range=(1 - affine_scale, 1 + affine_scale),
+        # img_scale is (width, height)
+        border=(-img_scale[0] // 2, -img_scale[1] // 2),
+        border_val=(114, 114, 114),
+        min_area_ratio=_base_.min_area_ratio,
+        use_mask_refine=_base_.use_mask2refine)
+]
+
+train_pipeline = [
+    *pre_transform, *mosaic_affine_transform,
+    dict(
+        type='YOLOv5MixUp',
+        prob=mixup_prob,
+        pre_transform=[*pre_transform, *mosaic_affine_transform]),
+    *last_transform
+]
+
+train_pipeline_stage2 = [
+    *pre_transform,
+    dict(type='YOLOv5KeepRatioResize', scale=img_scale),
+    dict(
+        type='LetterResize',
+        scale=img_scale,
+        allow_scale_up=True,
+        pad_val=dict(img=114.0)),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        scaling_ratio_range=(1 - affine_scale, 1 + affine_scale),
+        max_aspect_ratio=_base_.max_aspect_ratio,
+        border_val=(114, 114, 114),
+        min_area_ratio=_base_.min_area_ratio,
+        use_mask_refine=_base_.use_mask2refine), *last_transform
+]
+
+train_dataloader = dict(dataset=dict(pipeline=train_pipeline))
+_base_.custom_hooks[1].switch_pipeline = train_pipeline_stage2
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov8/yolov8_m_syncbn_fast_8xb16-500e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/yolov8/yolov8_m_syncbn_fast_8xb16-500e_coco.py
new file mode 100644
index 0000000..840d32c
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov8/yolov8_m_syncbn_fast_8xb16-500e_coco.py
@@ -0,0 +1,76 @@
+_base_ = './yolov8_s_syncbn_fast_8xb16-500e_coco.py'
+
+# ========================modified parameters======================
+deepen_factor = 0.67
+widen_factor = 0.75
+last_stage_out_channels = 768
+
+affine_scale = 0.9
+mixup_prob = 0.1
+
+# =======================Unmodified in most cases==================
+img_scale = _base_.img_scale
+pre_transform = _base_.pre_transform
+last_transform = _base_.last_transform
+
+model = dict(
+    backbone=dict(
+        last_stage_out_channels=last_stage_out_channels,
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor),
+    neck=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+        in_channels=[256, 512, last_stage_out_channels],
+        out_channels=[256, 512, last_stage_out_channels]),
+    bbox_head=dict(
+        head_module=dict(
+            widen_factor=widen_factor,
+            in_channels=[256, 512, last_stage_out_channels])))
+
+mosaic_affine_transform = [
+    dict(
+        type='Mosaic',
+        img_scale=img_scale,
+        pad_val=114.0,
+        pre_transform=pre_transform),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        max_aspect_ratio=100,
+        scaling_ratio_range=(1 - affine_scale, 1 + affine_scale),
+        # img_scale is (width, height)
+        border=(-img_scale[0] // 2, -img_scale[1] // 2),
+        border_val=(114, 114, 114))
+]
+
+# enable mixup
+train_pipeline = [
+    *pre_transform, *mosaic_affine_transform,
+    dict(
+        type='YOLOv5MixUp',
+        prob=mixup_prob,
+        pre_transform=[*pre_transform, *mosaic_affine_transform]),
+    *last_transform
+]
+
+train_pipeline_stage2 = [
+    *pre_transform,
+    dict(type='YOLOv5KeepRatioResize', scale=img_scale),
+    dict(
+        type='LetterResize',
+        scale=img_scale,
+        allow_scale_up=True,
+        pad_val=dict(img=114.0)),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        scaling_ratio_range=(1 - affine_scale, 1 + affine_scale),
+        max_aspect_ratio=100,
+        border_val=(114, 114, 114)), *last_transform
+]
+
+train_dataloader = dict(dataset=dict(pipeline=train_pipeline))
+_base_.custom_hooks[1].switch_pipeline = train_pipeline_stage2
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov8/yolov8_n_mask-refine_syncbn_fast_8xb16-500e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/yolov8/yolov8_n_mask-refine_syncbn_fast_8xb16-500e_coco.py
new file mode 100644
index 0000000..50d3774
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov8/yolov8_n_mask-refine_syncbn_fast_8xb16-500e_coco.py
@@ -0,0 +1,12 @@
+_base_ = './yolov8_s_mask-refine_syncbn_fast_8xb16-500e_coco.py'
+
+# This config will refine bbox by mask while loading annotations and
+# transforming after `YOLOv5RandomAffine`
+
+deepen_factor = 0.33
+widen_factor = 0.25
+
+model = dict(
+    backbone=dict(deepen_factor=deepen_factor, widen_factor=widen_factor),
+    neck=dict(deepen_factor=deepen_factor, widen_factor=widen_factor),
+    bbox_head=dict(head_module=dict(widen_factor=widen_factor)))
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov8/yolov8_n_syncbn_fast_8xb16-500e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/yolov8/yolov8_n_syncbn_fast_8xb16-500e_coco.py
new file mode 100644
index 0000000..5833df3
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov8/yolov8_n_syncbn_fast_8xb16-500e_coco.py
@@ -0,0 +1,9 @@
+_base_ = './yolov8_s_syncbn_fast_8xb16-500e_coco.py'
+
+deepen_factor = 0.33
+widen_factor = 0.25
+
+model = dict(
+    backbone=dict(deepen_factor=deepen_factor, widen_factor=widen_factor),
+    neck=dict(deepen_factor=deepen_factor, widen_factor=widen_factor),
+    bbox_head=dict(head_module=dict(widen_factor=widen_factor)))
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov8/yolov8_s_fast_1xb12-40e_cat.py b/mmdetection_practice/third_party/mmyolo/configs/yolov8/yolov8_s_fast_1xb12-40e_cat.py
new file mode 100644
index 0000000..e54bff0
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov8/yolov8_s_fast_1xb12-40e_cat.py
@@ -0,0 +1,52 @@
+_base_ = 'yolov8_s_syncbn_fast_8xb16-500e_coco.py'
+
+data_root = './data/cat/'
+class_name = ('cat', )
+num_classes = len(class_name)
+metainfo = dict(classes=class_name, palette=[(20, 220, 60)])
+
+close_mosaic_epochs = 5
+
+max_epochs = 40
+train_batch_size_per_gpu = 12
+train_num_workers = 4
+
+load_from = 'https://download.openmmlab.com/mmyolo/v0/yolov8/yolov8_s_syncbn_fast_8xb16-500e_coco/yolov8_s_syncbn_fast_8xb16-500e_coco_20230117_180101-5aa5f0f1.pth'  # noqa
+
+model = dict(
+    backbone=dict(frozen_stages=4),
+    bbox_head=dict(head_module=dict(num_classes=num_classes)),
+    train_cfg=dict(assigner=dict(num_classes=num_classes)))
+
+train_dataloader = dict(
+    batch_size=train_batch_size_per_gpu,
+    num_workers=train_num_workers,
+    dataset=dict(
+        data_root=data_root,
+        metainfo=metainfo,
+        ann_file='annotations/trainval.json',
+        data_prefix=dict(img='images/')))
+
+val_dataloader = dict(
+    dataset=dict(
+        metainfo=metainfo,
+        data_root=data_root,
+        ann_file='annotations/test.json',
+        data_prefix=dict(img='images/')))
+
+test_dataloader = val_dataloader
+
+_base_.optim_wrapper.optimizer.batch_size_per_gpu = train_batch_size_per_gpu
+_base_.custom_hooks[1].switch_epoch = max_epochs - close_mosaic_epochs
+
+val_evaluator = dict(ann_file=data_root + 'annotations/test.json')
+test_evaluator = val_evaluator
+
+default_hooks = dict(
+    checkpoint=dict(interval=10, max_keep_ckpts=2, save_best='auto'),
+    # The warmup_mim_iter parameter is critical.
+    # The default value is 1000 which is not suitable for cat datasets.
+    param_scheduler=dict(max_epochs=max_epochs, warmup_mim_iter=10),
+    logger=dict(type='LoggerHook', interval=5))
+train_cfg = dict(max_epochs=max_epochs, val_interval=10)
+# visualizer = dict(vis_backends = [dict(type='LocalVisBackend'), dict(type='WandbVisBackend')]) # noqa
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov8/yolov8_s_mask-refine_syncbn_fast_8xb16-500e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/yolov8/yolov8_s_mask-refine_syncbn_fast_8xb16-500e_coco.py
new file mode 100644
index 0000000..769a698
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov8/yolov8_s_mask-refine_syncbn_fast_8xb16-500e_coco.py
@@ -0,0 +1,83 @@
+_base_ = './yolov8_s_syncbn_fast_8xb16-500e_coco.py'
+
+# This config will refine bbox by mask while loading annotations and
+# transforming after `YOLOv5RandomAffine`
+
+# ========================modified parameters======================
+use_mask2refine = True
+min_area_ratio = 0.01  # YOLOv5RandomAffine
+
+# ===============================Unmodified in most cases====================
+pre_transform = [
+    dict(type='LoadImageFromFile', backend_args=_base_.backend_args),
+    dict(
+        type='LoadAnnotations',
+        with_bbox=True,
+        with_mask=True,
+        mask2bbox=use_mask2refine)
+]
+
+last_transform = [
+    # Delete gt_masks to avoid more computation
+    dict(type='RemoveDataElement', keys=['gt_masks']),
+    dict(
+        type='mmdet.Albu',
+        transforms=_base_.albu_train_transforms,
+        bbox_params=dict(
+            type='BboxParams',
+            format='pascal_voc',
+            label_fields=['gt_bboxes_labels', 'gt_ignore_flags']),
+        keymap={
+            'img': 'image',
+            'gt_bboxes': 'bboxes'
+        }),
+    dict(type='YOLOv5HSVRandomAug'),
+    dict(type='mmdet.RandomFlip', prob=0.5),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                   'flip_direction'))
+]
+
+train_pipeline = [
+    *pre_transform,
+    dict(
+        type='Mosaic',
+        img_scale=_base_.img_scale,
+        pad_val=114.0,
+        pre_transform=pre_transform),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        scaling_ratio_range=(1 - _base_.affine_scale, 1 + _base_.affine_scale),
+        max_aspect_ratio=_base_.max_aspect_ratio,
+        # img_scale is (width, height)
+        border=(-_base_.img_scale[0] // 2, -_base_.img_scale[1] // 2),
+        border_val=(114, 114, 114),
+        min_area_ratio=min_area_ratio,
+        use_mask_refine=use_mask2refine),
+    *last_transform
+]
+
+train_pipeline_stage2 = [
+    *pre_transform,
+    dict(type='YOLOv5KeepRatioResize', scale=_base_.img_scale),
+    dict(
+        type='LetterResize',
+        scale=_base_.img_scale,
+        allow_scale_up=True,
+        pad_val=dict(img=114.0)),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        scaling_ratio_range=(1 - _base_.affine_scale, 1 + _base_.affine_scale),
+        max_aspect_ratio=_base_.max_aspect_ratio,
+        border_val=(114, 114, 114),
+        min_area_ratio=min_area_ratio,
+        use_mask_refine=use_mask2refine), *last_transform
+]
+
+train_dataloader = dict(dataset=dict(pipeline=train_pipeline))
+_base_.custom_hooks[1].switch_pipeline = train_pipeline_stage2
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov8/yolov8_s_syncbn_fast_8xb16-500e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/yolov8/yolov8_s_syncbn_fast_8xb16-500e_coco.py
new file mode 100644
index 0000000..7e4127e
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov8/yolov8_s_syncbn_fast_8xb16-500e_coco.py
@@ -0,0 +1,334 @@
+_base_ = ['../_base_/default_runtime.py', '../_base_/det_p5_tta.py']
+
+# ========================Frequently modified parameters======================
+# -----data related-----
+data_root = 'data/coco/'  # Root path of data
+# Path of train annotation file
+train_ann_file = 'annotations/instances_train2017.json'
+train_data_prefix = 'train2017/'  # Prefix of train image path
+# Path of val annotation file
+val_ann_file = 'annotations/instances_val2017.json'
+val_data_prefix = 'val2017/'  # Prefix of val image path
+
+num_classes = 80  # Number of classes for classification
+# Batch size of a single GPU during training
+train_batch_size_per_gpu = 16
+# Worker to pre-fetch data for each single GPU during training
+train_num_workers = 8
+# persistent_workers must be False if num_workers is 0
+persistent_workers = True
+
+# -----train val related-----
+# Base learning rate for optim_wrapper. Corresponding to 8xb16=64 bs
+base_lr = 0.01
+max_epochs = 500  # Maximum training epochs
+# Disable mosaic augmentation for final 10 epochs (stage 2)
+close_mosaic_epochs = 10
+
+model_test_cfg = dict(
+    # The config of multi-label for multi-class prediction.
+    multi_label=True,
+    # The number of boxes before NMS
+    nms_pre=30000,
+    score_thr=0.001,  # Threshold to filter out boxes.
+    nms=dict(type='nms', iou_threshold=0.7),  # NMS type and threshold
+    max_per_img=300)  # Max number of detections of each image
+
+# ========================Possible modified parameters========================
+# -----data related-----
+img_scale = (640, 640)  # width, height
+# Dataset type, this will be used to define the dataset
+dataset_type = 'YOLOv5CocoDataset'
+# Batch size of a single GPU during validation
+val_batch_size_per_gpu = 1
+# Worker to pre-fetch data for each single GPU during validation
+val_num_workers = 2
+
+# Config of batch shapes. Only on val.
+# We tested YOLOv8-m will get 0.02 higher than not using it.
+batch_shapes_cfg = None
+# You can turn on `batch_shapes_cfg` by uncommenting the following lines.
+# batch_shapes_cfg = dict(
+#     type='BatchShapePolicy',
+#     batch_size=val_batch_size_per_gpu,
+#     img_size=img_scale[0],
+#     # The image scale of padding should be divided by pad_size_divisor
+#     size_divisor=32,
+#     # Additional paddings for pixel scale
+#     extra_pad_ratio=0.5)
+
+# -----model related-----
+# The scaling factor that controls the depth of the network structure
+deepen_factor = 0.33
+# The scaling factor that controls the width of the network structure
+widen_factor = 0.5
+# Strides of multi-scale prior box
+strides = [8, 16, 32]
+# The output channel of the last stage
+last_stage_out_channels = 1024
+num_det_layers = 3  # The number of model output scales
+norm_cfg = dict(type='BN', momentum=0.03, eps=0.001)  # Normalization config
+
+# -----train val related-----
+affine_scale = 0.5  # YOLOv5RandomAffine scaling ratio
+# YOLOv5RandomAffine aspect ratio of width and height thres to filter bboxes
+max_aspect_ratio = 100
+tal_topk = 10  # Number of bbox selected in each level
+tal_alpha = 0.5  # A Hyper-parameter related to alignment_metrics
+tal_beta = 6.0  # A Hyper-parameter related to alignment_metrics
+# TODO: Automatically scale loss_weight based on number of detection layers
+loss_cls_weight = 0.5
+loss_bbox_weight = 7.5
+# Since the dfloss is implemented differently in the official
+# and mmdet, we're going to divide loss_weight by 4.
+loss_dfl_weight = 1.5 / 4
+lr_factor = 0.01  # Learning rate scaling factor
+weight_decay = 0.0005
+# Save model checkpoint and validation intervals in stage 1
+save_epoch_intervals = 10
+# validation intervals in stage 2
+val_interval_stage2 = 1
+# The maximum checkpoints to keep.
+max_keep_ckpts = 2
+# Single-scale training is recommended to
+# be turned on, which can speed up training.
+env_cfg = dict(cudnn_benchmark=True)
+
+# ===============================Unmodified in most cases====================
+model = dict(
+    type='YOLODetector',
+    data_preprocessor=dict(
+        type='YOLOv5DetDataPreprocessor',
+        mean=[0., 0., 0.],
+        std=[255., 255., 255.],
+        bgr_to_rgb=True),
+    backbone=dict(
+        type='YOLOv8CSPDarknet',
+        arch='P5',
+        last_stage_out_channels=last_stage_out_channels,
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+        norm_cfg=norm_cfg,
+        act_cfg=dict(type='SiLU', inplace=True)),
+    neck=dict(
+        type='YOLOv8PAFPN',
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+        in_channels=[256, 512, last_stage_out_channels],
+        out_channels=[256, 512, last_stage_out_channels],
+        num_csp_blocks=3,
+        norm_cfg=norm_cfg,
+        act_cfg=dict(type='SiLU', inplace=True)),
+    bbox_head=dict(
+        type='YOLOv8Head',
+        head_module=dict(
+            type='YOLOv8HeadModule',
+            num_classes=num_classes,
+            in_channels=[256, 512, last_stage_out_channels],
+            widen_factor=widen_factor,
+            reg_max=16,
+            norm_cfg=norm_cfg,
+            act_cfg=dict(type='SiLU', inplace=True),
+            featmap_strides=strides),
+        prior_generator=dict(
+            type='mmdet.MlvlPointGenerator', offset=0.5, strides=strides),
+        bbox_coder=dict(type='DistancePointBBoxCoder'),
+        # scaled based on number of detection layers
+        loss_cls=dict(
+            type='mmdet.CrossEntropyLoss',
+            use_sigmoid=True,
+            reduction='none',
+            loss_weight=loss_cls_weight),
+        loss_bbox=dict(
+            type='IoULoss',
+            iou_mode='ciou',
+            bbox_format='xyxy',
+            reduction='sum',
+            loss_weight=loss_bbox_weight,
+            return_iou=False),
+        loss_dfl=dict(
+            type='mmdet.DistributionFocalLoss',
+            reduction='mean',
+            loss_weight=loss_dfl_weight)),
+    train_cfg=dict(
+        assigner=dict(
+            type='BatchTaskAlignedAssigner',
+            num_classes=num_classes,
+            use_ciou=True,
+            topk=tal_topk,
+            alpha=tal_alpha,
+            beta=tal_beta,
+            eps=1e-9)),
+    test_cfg=model_test_cfg)
+
+albu_train_transforms = [
+    dict(type='Blur', p=0.01),
+    dict(type='MedianBlur', p=0.01),
+    dict(type='ToGray', p=0.01),
+    dict(type='CLAHE', p=0.01)
+]
+
+pre_transform = [
+    dict(type='LoadImageFromFile', backend_args=_base_.backend_args),
+    dict(type='LoadAnnotations', with_bbox=True)
+]
+
+last_transform = [
+    dict(
+        type='mmdet.Albu',
+        transforms=albu_train_transforms,
+        bbox_params=dict(
+            type='BboxParams',
+            format='pascal_voc',
+            label_fields=['gt_bboxes_labels', 'gt_ignore_flags']),
+        keymap={
+            'img': 'image',
+            'gt_bboxes': 'bboxes'
+        }),
+    dict(type='YOLOv5HSVRandomAug'),
+    dict(type='mmdet.RandomFlip', prob=0.5),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                   'flip_direction'))
+]
+
+train_pipeline = [
+    *pre_transform,
+    dict(
+        type='Mosaic',
+        img_scale=img_scale,
+        pad_val=114.0,
+        pre_transform=pre_transform),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        scaling_ratio_range=(1 - affine_scale, 1 + affine_scale),
+        max_aspect_ratio=max_aspect_ratio,
+        # img_scale is (width, height)
+        border=(-img_scale[0] // 2, -img_scale[1] // 2),
+        border_val=(114, 114, 114)),
+    *last_transform
+]
+
+train_pipeline_stage2 = [
+    *pre_transform,
+    dict(type='YOLOv5KeepRatioResize', scale=img_scale),
+    dict(
+        type='LetterResize',
+        scale=img_scale,
+        allow_scale_up=True,
+        pad_val=dict(img=114.0)),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        scaling_ratio_range=(1 - affine_scale, 1 + affine_scale),
+        max_aspect_ratio=max_aspect_ratio,
+        border_val=(114, 114, 114)), *last_transform
+]
+
+train_dataloader = dict(
+    batch_size=train_batch_size_per_gpu,
+    num_workers=train_num_workers,
+    persistent_workers=persistent_workers,
+    pin_memory=True,
+    sampler=dict(type='DefaultSampler', shuffle=True),
+    collate_fn=dict(type='yolov5_collate'),
+    dataset=dict(
+        type=dataset_type,
+        data_root=data_root,
+        ann_file=train_ann_file,
+        data_prefix=dict(img=train_data_prefix),
+        filter_cfg=dict(filter_empty_gt=False, min_size=32),
+        pipeline=train_pipeline))
+
+test_pipeline = [
+    dict(type='LoadImageFromFile', backend_args=_base_.backend_args),
+    dict(type='YOLOv5KeepRatioResize', scale=img_scale),
+    dict(
+        type='LetterResize',
+        scale=img_scale,
+        allow_scale_up=False,
+        pad_val=dict(img=114)),
+    dict(type='LoadAnnotations', with_bbox=True, _scope_='mmdet'),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                   'scale_factor', 'pad_param'))
+]
+
+val_dataloader = dict(
+    batch_size=val_batch_size_per_gpu,
+    num_workers=val_num_workers,
+    persistent_workers=persistent_workers,
+    pin_memory=True,
+    drop_last=False,
+    sampler=dict(type='DefaultSampler', shuffle=False),
+    dataset=dict(
+        type=dataset_type,
+        data_root=data_root,
+        test_mode=True,
+        data_prefix=dict(img=val_data_prefix),
+        ann_file=val_ann_file,
+        pipeline=test_pipeline,
+        batch_shapes_cfg=batch_shapes_cfg))
+
+test_dataloader = val_dataloader
+
+param_scheduler = None
+optim_wrapper = dict(
+    type='OptimWrapper',
+    clip_grad=dict(max_norm=10.0),
+    optimizer=dict(
+        type='SGD',
+        lr=base_lr,
+        momentum=0.937,
+        weight_decay=weight_decay,
+        nesterov=True,
+        batch_size_per_gpu=train_batch_size_per_gpu),
+    constructor='YOLOv5OptimizerConstructor')
+
+default_hooks = dict(
+    param_scheduler=dict(
+        type='YOLOv5ParamSchedulerHook',
+        scheduler_type='linear',
+        lr_factor=lr_factor,
+        max_epochs=max_epochs),
+    checkpoint=dict(
+        type='CheckpointHook',
+        interval=save_epoch_intervals,
+        save_best='auto',
+        max_keep_ckpts=max_keep_ckpts))
+
+custom_hooks = [
+    dict(
+        type='EMAHook',
+        ema_type='ExpMomentumEMA',
+        momentum=0.0001,
+        update_buffers=True,
+        strict_load=False,
+        priority=49),
+    dict(
+        type='mmdet.PipelineSwitchHook',
+        switch_epoch=max_epochs - close_mosaic_epochs,
+        switch_pipeline=train_pipeline_stage2)
+]
+
+val_evaluator = dict(
+    type='mmdet.CocoMetric',
+    proposal_nums=(100, 1, 10),
+    ann_file=data_root + val_ann_file,
+    metric='bbox')
+test_evaluator = val_evaluator
+
+train_cfg = dict(
+    type='EpochBasedTrainLoop',
+    max_epochs=max_epochs,
+    val_interval=save_epoch_intervals,
+    dynamic_intervals=[((max_epochs - close_mosaic_epochs),
+                        val_interval_stage2)])
+
+val_cfg = dict(type='ValLoop')
+test_cfg = dict(type='TestLoop')
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov8/yolov8_x_mask-refine_syncbn_fast_8xb16-500e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/yolov8/yolov8_x_mask-refine_syncbn_fast_8xb16-500e_coco.py
new file mode 100644
index 0000000..8c27b96
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov8/yolov8_x_mask-refine_syncbn_fast_8xb16-500e_coco.py
@@ -0,0 +1,13 @@
+_base_ = './yolov8_l_mask-refine_syncbn_fast_8xb16-500e_coco.py'
+
+# This config use refining bbox and `YOLOv5CopyPaste`.
+# Refining bbox means refining bbox by mask while loading annotations and
+# transforming after `YOLOv5RandomAffine`
+
+deepen_factor = 1.00
+widen_factor = 1.25
+
+model = dict(
+    backbone=dict(deepen_factor=deepen_factor, widen_factor=widen_factor),
+    neck=dict(deepen_factor=deepen_factor, widen_factor=widen_factor),
+    bbox_head=dict(head_module=dict(widen_factor=widen_factor)))
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolov8/yolov8_x_syncbn_fast_8xb16-500e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/yolov8/yolov8_x_syncbn_fast_8xb16-500e_coco.py
new file mode 100644
index 0000000..3d8e665
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolov8/yolov8_x_syncbn_fast_8xb16-500e_coco.py
@@ -0,0 +1,9 @@
+_base_ = './yolov8_l_syncbn_fast_8xb16-500e_coco.py'
+
+deepen_factor = 1.00
+widen_factor = 1.25
+
+model = dict(
+    backbone=dict(deepen_factor=deepen_factor, widen_factor=widen_factor),
+    neck=dict(deepen_factor=deepen_factor, widen_factor=widen_factor),
+    bbox_head=dict(head_module=dict(widen_factor=widen_factor)))
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolox/README.md b/mmdetection_practice/third_party/mmyolo/configs/yolox/README.md
new file mode 100644
index 0000000..7d5dc68
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolox/README.md
@@ -0,0 +1,86 @@
+# YOLOX
+
+> [YOLOX: Exceeding YOLO Series in 2021](https://arxiv.org/abs/2107.08430)
+
+<!-- [ALGORITHM] -->
+
+## Abstract
+
+In this report, we present some experienced improvements to YOLO series, forming a new high-performance detector -- YOLOX. We switch the YOLO detector to an anchor-free manner and conduct other advanced detection techniques, i.e., a decoupled head and the leading label assignment strategy SimOTA to achieve state-of-the-art results across a large scale range of models: For YOLO-Nano with only 0.91M parameters and 1.08G FLOPs, we get 25.3% AP on COCO, surpassing NanoDet by 1.8% AP; for YOLOv3, one of the most widely used detectors in industry, we boost it to 47.3% AP on COCO, outperforming the current best practice by 3.0% AP; for YOLOX-L with roughly the same amount of parameters as YOLOv4-CSP, YOLOv5-L, we achieve 50.0% AP on COCO at a speed of 68.9 FPS on Tesla V100, exceeding YOLOv5-L by 1.8% AP. Further, we won the 1st Place on Streaming Perception Challenge (Workshop on Autonomous Driving at CVPR 2021) using a single YOLOX-L model. We hope this report can provide useful experience for developers and researchers in practical scenes, and we also provide deploy versions with ONNX, TensorRT, NCNN, and Openvino supported.
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/40661020/144001736-9fb303dd-eac7-46b0-ad45-214cfa51e928.png"/>
+</div>
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/71306851/218628641-6c0101e6-e40e-4b16-a696-c0f55b8d335c.png"/>
+YOLOX-l model structure
+</div>
+
+## 🥳 🚀 Results and Models
+
+|  Backbone  | Size | Batch Size | AMP | RTMDet-Hyp | Mem (GB) |   Box AP    |                          Config                           |                                                                                                                                                                      Download                                                                                                                                                                      |
+| :--------: | :--: | :--------: | :-: | :--------: | :------: | :---------: | :-------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: |
+| YOLOX-tiny | 416  |    8xb8    | No  |     No     |   2.8    |    32.7     |       [config](./yolox_tiny_fast_8xb8-300e_coco.py)       |                                   [model](https://download.openmmlab.com/mmyolo/v0/yolox/yolox_tiny_8xb8-300e_coco/yolox_tiny_8xb8-300e_coco_20220919_090908-0e40a6fc.pth) \| [log](https://download.openmmlab.com/mmyolo/v0/yolox/yolox_tiny_8xb8-300e_coco/yolox_tiny_8xb8-300e_coco_20220919_090908.log.json)                                   |
+| YOLOX-tiny | 416  |   8xb32    | Yes |    Yes     |   4.9    | 34.3 (+1.6) | [config](./yolox_tiny_fast_8xb32-300e-rtmdet-hyp_coco.py) | [model](https://download.openmmlab.com/mmyolo/v0/yolox/yolox_tiny_fast_8xb32-300e-rtmdet-hyp_coco/yolox_tiny_fast_8xb32-300e-rtmdet-hyp_coco_20230210_143637-4c338102.pth) \| [log](https://download.openmmlab.com/mmyolo/v0/yolox/yolox_tiny_fast_8xb32-300e-rtmdet-hyp_coco/yolox_tiny_fast_8xb32-300e-rtmdet-hyp_coco_20230210_143637.log.json) |
+|  YOLOX-s   | 640  |    8xb8    | Yes |     No     |   2.9    |    40.7     |        [config](./yolox_s_fast_8xb8-300e_coco.py)         |                               [model](https://download.openmmlab.com/mmyolo/v0/yolox/yolox_s_fast_8xb8-300e_coco/yolox_s_fast_8xb8-300e_coco_20230213_142600-2b224d8b.pth) \| [log](https://download.openmmlab.com/mmyolo/v0/yolox/yolox_s_fast_8xb8-300e_coco/yolox_s_fast_8xb8-300e_coco_20230213_142600.log.json)                               |
+|  YOLOX-s   | 640  |   8xb32    | Yes |    Yes     |   9.8    | 41.9 (+1.2) |  [config](./yolox_s_fast_8xb32-300e-rtmdet-hyp_coco.py)   |       [model](https://download.openmmlab.com/mmyolo/v0/yolox/yolox_s_fast_8xb32-300e-rtmdet-hyp_coco/yolox_s_fast_8xb32-300e-rtmdet-hyp_coco_20230210_134645-3a8dfbd7.pth) \| [log](https://download.openmmlab.com/mmyolo/v0/yolox/yolox_s_fast_8xb32-300e-rtmdet-hyp_coco/yolox_s_fast_8xb32-300e-rtmdet-hyp_coco_20230210_134645.log.json)       |
+|  YOLOX-m   | 640  |    8xb8    | Yes |     No     |   4.9    |    46.9     |        [config](./yolox_m_fast_8xb8-300e_coco.py)         |                               [model](https://download.openmmlab.com/mmyolo/v0/yolox/yolox_m_fast_8xb8-300e_coco/yolox_m_fast_8xb8-300e_coco_20230213_160218-a71a6b25.pth) \| [log](https://download.openmmlab.com/mmyolo/v0/yolox/yolox_m_fast_8xb8-300e_coco/yolox_m_fast_8xb8-300e_coco_20230213_160218.log.json)                               |
+|  YOLOX-m   | 640  |   8xb32    | Yes |    Yes     |   17.6   | 47.5 (+0.6) |  [config](./yolox_m_fast_8xb32-300e-rtmdet-hyp_coco.py)   |       [model](https://download.openmmlab.com/mmyolo/v0/yolox/yolox_m_fast_8xb32-300e-rtmdet-hyp_coco/yolox_m_fast_8xb32-300e-rtmdet-hyp_coco_20230210_144328-e657e182.pth) \| [log](https://download.openmmlab.com/mmyolo/v0/yolox/yolox_m_fast_8xb32-300e-rtmdet-hyp_coco/yolox_m_fast_8xb32-300e-rtmdet-hyp_coco_20230210_144328.log.json)       |
+|  YOLOX-l   | 640  |    8xb8    | Yes |     No     |   8.0    |    50.1     |        [config](./yolox_l_fast_8xb8-300e_coco.py)         |                               [model](https://download.openmmlab.com/mmyolo/v0/yolox/yolox_l_fast_8xb8-300e_coco/yolox_l_fast_8xb8-300e_coco_20230213_160715-c731eb1c.pth) \| [log](https://download.openmmlab.com/mmyolo/v0/yolox/yolox_l_fast_8xb8-300e_coco/yolox_l_fast_8xb8-300e_coco_20230213_160715.log.json)                               |
+|  YOLOX-x   | 640  |    8xb8    | Yes |     No     |   9.8    |    51.4     |        [config](./yolox_x_fast_8xb8-300e_coco.py)         |                               [model](https://download.openmmlab.com/mmyolo/v0/yolox/yolox_x_fast_8xb8-300e_coco/yolox_x_fast_8xb8-300e_coco_20230215_133950-1d509fab.pth) \| [log](https://download.openmmlab.com/mmyolo/v0/yolox/yolox_x_fast_8xb8-300e_coco/yolox_x_fast_8xb8-300e_coco_20230215_133950.log.json)                               |
+
+YOLOX uses a default training configuration of `8xbs8` which results in a long training time, we expect it to use `8xbs32` to speed up the training and not cause a decrease in mAP. We modified `train_batch_size_per_gpu` from 8 to 32, `batch_augments_interval` from 10 to 1 and `base_lr` from 0.01 to 0.04 under YOLOX-s default configuration based on the linear scaling rule, which resulted in mAP degradation. Finally, I found that using RTMDet's training hyperparameter can improve performance in YOLOX Tiny/S/M, which also validates the superiority of RTMDet's training hyperparameter.
+
+The modified training parameters are as follows:
+
+1. train_batch_size_per_gpu: 8 -> 32
+2. batch_augments_interval: 10 -> 1
+3. num_last_epochs: 15 -> 20
+4. optim cfg: SGD -> AdamW, base_lr 0.01 -> 0.004, weight_decay 0.0005 -> 0.05
+5. ema momentum: 0.0001 -> 0.0002
+
+**Note**:
+
+1. The test score threshold is 0.001.
+2. Due to the need for pre-training weights, we cannot reproduce the performance of the `yolox-nano` model. Please refer to https://github.com/Megvii-BaseDetection/YOLOX/issues/674 for more information.
+
+## YOLOX-Pose
+
+Based on [MMPose](https://github.com/open-mmlab/mmpose/blob/main/projects/yolox-pose/README.md), we have implemented a YOLOX-based human pose estimator, utilizing the approach outlined in **YOLO-Pose: Enhancing YOLO for Multi Person Pose Estimation Using Object Keypoint Similarity Loss (CVPRW 2022)**. This pose estimator is lightweight and quick, making it well-suited for crowded scenes.
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/26127467/226655503-3cee746e-6e42-40be-82ae-6e7cae2a4c7e.jpg"/>
+</div>
+
+### Results
+
+|  Backbone  | Size | Batch Size | AMP | RTMDet-Hyp | Mem (GB) |  AP  |                             Config                             |                                                                                                                                                                           Download                                                                                                                                                                           |
+| :--------: | :--: | :--------: | :-: | :--------: | :------: | :--: | :------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: |
+| YOLOX-tiny | 416  |   8xb32    | Yes |    Yes     |   5.3    | 52.8 | [config](./pose/yolox-pose_tiny_8xb32-300e-rtmdet-hyp_coco.py) | [model](https://download.openmmlab.com/mmyolo/v0/yolox/pose/yolox-pose_tiny_8xb32-300e-rtmdet-hyp_coco/yolox-pose_tiny_8xb32-300e-rtmdet-hyp_coco_20230427_080351-2117af67.pth) \| [log](https://download.openmmlab.com/mmyolo/v0/yolox/pose/yolox-pose_tiny_8xb32-300e-rtmdet-hyp_coco/yolox-pose_tiny_8xb32-300e-rtmdet-hyp_coco_20230427_080351.log.json) |
+|  YOLOX-s   | 640  |   8xb32    | Yes |    Yes     |   10.7   | 63.7 |  [config](./pose/yolox-pose_s_8xb32-300e-rtmdet-hyp_coco.py)   |       [model](https://download.openmmlab.com/mmyolo/v0/yolox/pose/yolox-pose_s_8xb32-300e-rtmdet-hyp_coco/yolox-pose_s_8xb32-300e-rtmdet-hyp_coco_20230427_005150-e87d843a.pth) \| [log](https://download.openmmlab.com/mmyolo/v0/yolox/pose/yolox-pose_s_8xb32-300e-rtmdet-hyp_coco/yolox-pose_s_8xb32-300e-rtmdet-hyp_coco_20230427_005150.log.json)       |
+|  YOLOX-m   | 640  |   8xb32    | Yes |    Yes     |   19.2   | 69.3 |  [config](./pose/yolox-pose_m_8xb32-300e-rtmdet-hyp_coco.py)   |       [model](https://download.openmmlab.com/mmyolo/v0/yolox/pose/yolox-pose_m_8xb32-300e-rtmdet-hyp_coco/yolox-pose_m_8xb32-300e-rtmdet-hyp_coco_20230427_094024-bbeacc1c.pth) \| [log](https://download.openmmlab.com/mmyolo/v0/yolox/pose/yolox-pose_m_8xb32-300e-rtmdet-hyp_coco/yolox-pose_m_8xb32-300e-rtmdet-hyp_coco_20230427_094024.log.json)       |
+|  YOLOX-l   | 640  |   8xb32    | Yes |    Yes     |   30.3   | 71.1 |  [config](./pose/yolox-pose_l_8xb32-300e-rtmdet-hyp_coco.py)   |       [model](https://download.openmmlab.com/mmyolo/v0/yolox/pose/yolox-pose_l_8xb32-300e-rtmdet-hyp_coco/yolox-pose_l_8xb32-300e-rtmdet-hyp_coco_20230427_041140-82d65ac8.pth) \| [log](https://download.openmmlab.com/mmyolo/v0/yolox/pose/yolox-pose_l_8xb32-300e-rtmdet-hyp_coco/yolox-pose_l_8xb32-300e-rtmdet-hyp_coco_20230427_041140.log.json)       |
+
+**Note**
+
+1. The performance is unstable and may fluctuate and the highest performance weight in `COCO` training may not be the last epoch. The performance shown above is the best model.
+
+### Installation
+
+Install MMPose
+
+```
+mim install -r requirements/mmpose.txt
+```
+
+## Citation
+
+```latex
+@article{yolox2021,
+  title={{YOLOX}: Exceeding YOLO Series in 2021},
+  author={Ge, Zheng and Liu, Songtao and Wang, Feng and Li, Zeming and Sun, Jian},
+  journal={arXiv preprint arXiv:2107.08430},
+  year={2021}
+}
+```
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolox/metafile.yml b/mmdetection_practice/third_party/mmyolo/configs/yolox/metafile.yml
new file mode 100644
index 0000000..78ede70
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolox/metafile.yml
@@ -0,0 +1,166 @@
+Collections:
+  - Name: YOLOX
+    Metadata:
+      Training Data: COCO
+      Training Techniques:
+        - SGD with Nesterov
+        - Weight Decay
+        - Cosine Annealing Lr Updater
+      Training Resources: 8x A100 GPUs
+      Architecture:
+        - CSPDarkNet
+        - PAFPN
+    Paper:
+      URL: https://arxiv.org/abs/2107.08430
+      Title: 'YOLOX: Exceeding YOLO Series in 2021'
+    README: configs/yolox/README.md
+    Code:
+      URL: https://github.com/open-mmlab/mmyolo/blob/v0.1.0/mmyolo/models/detectors/yolo_detector.py#L12
+      Version: v0.1.0
+
+
+Models:
+  - Name: yolox_tiny_fast_8xb8-300e_coco
+    In Collection: YOLOX
+    Config: configs/yolox/yolox_tiny_fast_8xb8-300e_coco.py
+    Metadata:
+      Training Memory (GB): 2.8
+      Epochs: 300
+    Results:
+      - Task: Object Detection
+        Dataset: COCO
+        Metrics:
+          box AP: 32.7
+    Weights: https://download.openmmlab.com/mmyolo/v0/yolox/yolox_tiny_8xb8-300e_coco/yolox_tiny_8xb8-300e_coco_20220919_090908-0e40a6fc.pth
+  - Name: yolox_s_fast_8xb8-300e_coco
+    In Collection: YOLOX
+    Config: configs/yolox/yolox_s_fast_8xb8-300e_coco.py
+    Metadata:
+      Training Memory (GB): 2.9
+      Epochs: 300
+    Results:
+      - Task: Object Detection
+        Dataset: COCO
+        Metrics:
+          box AP: 40.7
+    Weights: https://download.openmmlab.com/mmyolo/v0/yolox/yolox_s_fast_8xb8-300e_coco/yolox_s_fast_8xb8-300e_coco_20230213_142600-2b224d8b.pth
+  - Name: yolox_m_fast_8xb8-300e_coco
+    In Collection: YOLOX
+    Config: configs/yolox/yolox_m_fast_8xb8-300e_coco.py
+    Metadata:
+      Training Memory (GB): 4.9
+      Epochs: 300
+    Results:
+      - Task: Object Detection
+        Dataset: COCO
+        Metrics:
+          box AP: 46.9
+    Weights: https://download.openmmlab.com/mmyolo/v0/yolox/yolox_m_fast_8xb8-300e_coco/yolox_m_fast_8xb8-300e_coco_20230213_160218-a71a6b25.pth
+  - Name: yolox_l_fast_8xb8-300e_coco
+    In Collection: YOLOX
+    Config: configs/yolox/yolox_l_fast_8xb8-300e_coco.py
+    Metadata:
+      Training Memory (GB): 8.0
+      Epochs: 300
+    Results:
+      - Task: Object Detection
+        Dataset: COCO
+        Metrics:
+          box AP: 50.1
+    Weights: https://download.openmmlab.com/mmyolo/v0/yolox/yolox_l_fast_8xb8-300e_coco/yolox_l_fast_8xb8-300e_coco_20230213_160715-c731eb1c.pth
+  - Name: yolox_x_fast_8xb8-300e_coco
+    In Collection: YOLOX
+    Config: configs/yolox/yolox_x_fast_8xb8-300e_coco.py
+    Metadata:
+      Training Memory (GB): 9.8
+      Epochs: 300
+    Results:
+      - Task: Object Detection
+        Dataset: COCO
+        Metrics:
+          box AP: 51.4
+    Weights: https://download.openmmlab.com/mmyolo/v0/yolox/yolox_x_fast_8xb8-300e_coco/yolox_x_fast_8xb8-300e_coco_20230215_133950-1d509fab.pth
+  - Name: yolox_tiny_fast_8xb32-300e-rtmdet-hyp_coco
+    In Collection: YOLOX
+    Config: configs/yolox/yolox_tiny_fast_8xb32-300e-rtmdet-hyp_coco.py
+    Metadata:
+      Training Memory (GB): 4.9
+      Epochs: 300
+    Results:
+      - Task: Object Detection
+        Dataset: COCO
+        Metrics:
+          box AP: 34.3
+    Weights: https://download.openmmlab.com/mmyolo/v0/yolox/yolox_tiny_fast_8xb32-300e-rtmdet-hyp_coco/yolox_tiny_fast_8xb32-300e-rtmdet-hyp_coco_20230210_143637-4c338102.pth
+  - Name: yolox_s_fast_8xb32-300e-rtmdet-hyp_coco
+    In Collection: YOLOX
+    Config: configs/yolox/yolox_s_fast_8xb32-300e-rtmdet-hyp_coco.py
+    Metadata:
+      Training Memory (GB): 9.8
+      Epochs: 300
+    Results:
+      - Task: Object Detection
+        Dataset: COCO
+        Metrics:
+          box AP: 41.9
+    Weights: https://download.openmmlab.com/mmyolo/v0/yolox/yolox_s_fast_8xb32-300e-rtmdet-hyp_coco/yolox_s_fast_8xb32-300e-rtmdet-hyp_coco_20230210_134645-3a8dfbd7.pth
+  - Name: yolox_m_fast_8xb32-300e-rtmdet-hyp_coco
+    In Collection: YOLOX
+    Config: configs/yolox/yolox_m_fast_8xb32-300e-rtmdet-hyp_coco.py
+    Metadata:
+      Training Memory (GB): 17.6
+      Epochs: 300
+    Results:
+      - Task: Object Detection
+        Dataset: COCO
+        Metrics:
+          box AP: 47.5
+    Weights: https://download.openmmlab.com/mmyolo/v0/yolox/yolox_m_fast_8xb32-300e-rtmdet-hyp_coco/yolox_m_fast_8xb32-300e-rtmdet-hyp_coco_20230210_144328-e657e182.pth
+  - Name: yolox-pose_tiny_8xb32-300e-rtmdet-hyp_coco
+    In Collection: YOLOX
+    Config: yolox-pose_tiny_8xb32-300e-rtmdet-hyp_coco.py
+    Metadata:
+      Training Memory (GB): 5.3
+      Epochs: 300
+    Results:
+      - Task: Human Pose Estimation
+        Dataset: COCO
+        Metrics:
+          AP: 52.8
+    Weights: https://download.openmmlab.com/mmyolo/v0/yolox/pose/yolox-pose_tiny_8xb32-300e-rtmdet-hyp_coco/yolox-pose_tiny_8xb32-300e-rtmdet-hyp_coco_20230427_080351-2117af67.pth
+  - Name: yolox-pose_s_8xb32-300e-rtmdet-hyp_coco
+    In Collection: YOLOX
+    Config: yolox-pose_s_8xb32-300e-rtmdet-hyp_coco.py
+    Metadata:
+      Training Memory (GB): 10.7
+      Epochs: 300
+    Results:
+      - Task: Human Pose Estimation
+        Dataset: COCO
+        Metrics:
+          AP: 63.7
+    Weights: https://download.openmmlab.com/mmyolo/v0/yolox/pose/yolox-pose_s_8xb32-300e-rtmdet-hyp_coco/yolox-pose_s_8xb32-300e-rtmdet-hyp_coco_20230427_005150-e87d843a.pth
+  - Name: yolox-pose_m_8xb32-300e-rtmdet-hyp_coco
+    In Collection: YOLOX
+    Config: yolox-pose_m_8xb32-300e-rtmdet-hyp_coco.py
+    Metadata:
+      Training Memory (GB): 19.2
+      Epochs: 300
+    Results:
+      - Task: Human Pose Estimation
+        Dataset: COCO
+        Metrics:
+          AP: 69.3
+    Weights: https://download.openmmlab.com/mmyolo/v0/yolox/pose/yolox-pose_m_8xb32-300e-rtmdet-hyp_coco/yolox-pose_m_8xb32-300e-rtmdet-hyp_coco_20230427_094024-bbeacc1c.pth
+  - Name: yolox-pose_l_8xb32-300e-rtmdet-hyp_coco
+    In Collection: YOLOX
+    Config: yolox-pose_l_8xb32-300e-rtmdet-hyp_coco.py
+    Metadata:
+      Training Memory (GB): 30.3
+      Epochs: 300
+    Results:
+      - Task: Human Pose Estimation
+        Dataset: COCO
+        Metrics:
+          AP: 71.1
+    Weights: https://download.openmmlab.com/mmyolo/v0/yolox/pose/yolox-pose_l_8xb32-300e-rtmdet-hyp_coco/yolox-pose_l_8xb32-300e-rtmdet-hyp_coco_20230427_041140-82d65ac8.pth
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolox/pose/yolox-pose_l_8xb32-300e-rtmdet-hyp_coco.py b/mmdetection_practice/third_party/mmyolo/configs/yolox/pose/yolox-pose_l_8xb32-300e-rtmdet-hyp_coco.py
new file mode 100644
index 0000000..96de5e9
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolox/pose/yolox-pose_l_8xb32-300e-rtmdet-hyp_coco.py
@@ -0,0 +1,14 @@
+_base_ = ['./yolox-pose_m_8xb32-300e-rtmdet-hyp_coco.py']
+
+load_from = 'https://download.openmmlab.com/mmyolo/v0/yolox/yolox_l_fast_8xb8-300e_coco/yolox_l_fast_8xb8-300e_coco_20230213_160715-c731eb1c.pth'  # noqa
+
+# ========================modified parameters======================
+deepen_factor = 1.0
+widen_factor = 1.0
+
+# =======================Unmodified in most cases==================
+# model settings
+model = dict(
+    backbone=dict(deepen_factor=deepen_factor, widen_factor=widen_factor),
+    neck=dict(deepen_factor=deepen_factor, widen_factor=widen_factor),
+    bbox_head=dict(head_module=dict(widen_factor=widen_factor)))
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolox/pose/yolox-pose_m_8xb32-300e-rtmdet-hyp_coco.py b/mmdetection_practice/third_party/mmyolo/configs/yolox/pose/yolox-pose_m_8xb32-300e-rtmdet-hyp_coco.py
new file mode 100644
index 0000000..f78d6a3
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolox/pose/yolox-pose_m_8xb32-300e-rtmdet-hyp_coco.py
@@ -0,0 +1,14 @@
+_base_ = ['./yolox-pose_s_8xb32-300e-rtmdet-hyp_coco.py']
+
+load_from = 'https://download.openmmlab.com/mmyolo/v0/yolox/yolox_m_fast_8xb32-300e-rtmdet-hyp_coco/yolox_m_fast_8xb32-300e-rtmdet-hyp_coco_20230210_144328-e657e182.pth'  # noqa
+
+# ========================modified parameters======================
+deepen_factor = 0.67
+widen_factor = 0.75
+
+# =======================Unmodified in most cases==================
+# model settings
+model = dict(
+    backbone=dict(deepen_factor=deepen_factor, widen_factor=widen_factor),
+    neck=dict(deepen_factor=deepen_factor, widen_factor=widen_factor),
+    bbox_head=dict(head_module=dict(widen_factor=widen_factor)))
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolox/pose/yolox-pose_s_8xb32-300e-rtmdet-hyp_coco.py b/mmdetection_practice/third_party/mmyolo/configs/yolox/pose/yolox-pose_s_8xb32-300e-rtmdet-hyp_coco.py
new file mode 100644
index 0000000..8fa2172
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolox/pose/yolox-pose_s_8xb32-300e-rtmdet-hyp_coco.py
@@ -0,0 +1,136 @@
+_base_ = '../yolox_s_fast_8xb32-300e-rtmdet-hyp_coco.py'
+
+load_from = 'https://download.openmmlab.com/mmyolo/v0/yolox/yolox_s_fast_8xb32-300e-rtmdet-hyp_coco/yolox_s_fast_8xb32-300e-rtmdet-hyp_coco_20230210_134645-3a8dfbd7.pth'  # noqa
+
+num_keypoints = 17
+scaling_ratio_range = (0.75, 1.0)
+mixup_ratio_range = (0.8, 1.6)
+num_last_epochs = 20
+
+# model settings
+model = dict(
+    bbox_head=dict(
+        type='YOLOXPoseHead',
+        head_module=dict(
+            type='YOLOXPoseHeadModule',
+            num_classes=1,
+            num_keypoints=num_keypoints,
+        ),
+        loss_pose=dict(
+            type='OksLoss',
+            metainfo='configs/_base_/pose/coco.py',
+            loss_weight=30.0)),
+    train_cfg=dict(
+        assigner=dict(
+            type='PoseSimOTAAssigner',
+            center_radius=2.5,
+            oks_weight=3.0,
+            iou_calculator=dict(type='mmdet.BboxOverlaps2D'),
+            oks_calculator=dict(
+                type='OksLoss', metainfo='configs/_base_/pose/coco.py'))),
+    test_cfg=dict(score_thr=0.01))
+
+# pipelines
+pre_transform = [
+    dict(type='LoadImageFromFile', backend_args=_base_.backend_args),
+    dict(type='LoadAnnotations', with_keypoints=True)
+]
+
+img_scale = _base_.img_scale
+
+train_pipeline_stage1 = [
+    *pre_transform,
+    dict(
+        type='Mosaic',
+        img_scale=img_scale,
+        pad_val=114.0,
+        pre_transform=pre_transform),
+    dict(
+        type='RandomAffine',
+        scaling_ratio_range=scaling_ratio_range,
+        border=(-img_scale[0] // 2, -img_scale[1] // 2)),
+    dict(
+        type='YOLOXMixUp',
+        img_scale=img_scale,
+        ratio_range=mixup_ratio_range,
+        pad_val=114.0,
+        pre_transform=pre_transform),
+    dict(type='mmdet.YOLOXHSVRandomAug'),
+    dict(type='RandomFlip', prob=0.5),
+    dict(type='FilterAnnotations', by_keypoints=True, keep_empty=False),
+    dict(
+        type='PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape'))
+]
+
+train_pipeline_stage2 = [
+    *pre_transform,
+    dict(type='Resize', scale=img_scale, keep_ratio=True),
+    dict(
+        type='mmdet.Pad',
+        pad_to_square=True,
+        pad_val=dict(img=(114.0, 114.0, 114.0))),
+    dict(type='mmdet.YOLOXHSVRandomAug'),
+    dict(type='RandomFlip', prob=0.5),
+    dict(type='FilterAnnotations', by_keypoints=True, keep_empty=False),
+    dict(type='PackDetInputs')
+]
+
+test_pipeline = [
+    *pre_transform,
+    dict(type='Resize', scale=img_scale, keep_ratio=True),
+    dict(
+        type='mmdet.Pad',
+        pad_to_square=True,
+        pad_val=dict(img=(114.0, 114.0, 114.0))),
+    dict(
+        type='PackDetInputs',
+        meta_keys=('id', 'img_id', 'img_path', 'ori_shape', 'img_shape',
+                   'scale_factor', 'flip_indices'))
+]
+
+# dataset settings
+dataset_type = 'PoseCocoDataset'
+
+train_dataloader = dict(
+    dataset=dict(
+        type=dataset_type,
+        data_mode='bottomup',
+        ann_file='annotations/person_keypoints_train2017.json',
+        pipeline=train_pipeline_stage1))
+
+val_dataloader = dict(
+    dataset=dict(
+        type=dataset_type,
+        data_mode='bottomup',
+        ann_file='annotations/person_keypoints_val2017.json',
+        pipeline=test_pipeline))
+test_dataloader = val_dataloader
+
+# evaluators
+val_evaluator = dict(
+    _delete_=True,
+    type='mmpose.CocoMetric',
+    ann_file=_base_.data_root + 'annotations/person_keypoints_val2017.json',
+    score_mode='bbox')
+test_evaluator = val_evaluator
+
+default_hooks = dict(checkpoint=dict(save_best='coco/AP', rule='greater'))
+
+visualizer = dict(type='mmpose.PoseLocalVisualizer')
+
+custom_hooks = [
+    dict(
+        type='YOLOXModeSwitchHook',
+        num_last_epochs=num_last_epochs,
+        new_train_pipeline=train_pipeline_stage2,
+        priority=48),
+    dict(type='mmdet.SyncNormHook', priority=48),
+    dict(
+        type='EMAHook',
+        ema_type='ExpMomentumEMA',
+        momentum=0.0002,
+        update_buffers=True,
+        strict_load=False,
+        priority=49)
+]
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolox/pose/yolox-pose_tiny_8xb32-300e-rtmdet-hyp_coco.py b/mmdetection_practice/third_party/mmyolo/configs/yolox/pose/yolox-pose_tiny_8xb32-300e-rtmdet-hyp_coco.py
new file mode 100644
index 0000000..a739906
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolox/pose/yolox-pose_tiny_8xb32-300e-rtmdet-hyp_coco.py
@@ -0,0 +1,70 @@
+_base_ = './yolox-pose_s_8xb32-300e-rtmdet-hyp_coco.py'
+
+load_from = 'https://download.openmmlab.com/mmyolo/v0/yolox/yolox_tiny_fast_8xb32-300e-rtmdet-hyp_coco/yolox_tiny_fast_8xb32-300e-rtmdet-hyp_coco_20230210_143637-4c338102.pth'  # noqa
+
+deepen_factor = 0.33
+widen_factor = 0.375
+scaling_ratio_range = (0.75, 1.0)
+
+# model settings
+model = dict(
+    data_preprocessor=dict(batch_augments=[
+        dict(
+            type='YOLOXBatchSyncRandomResize',
+            random_size_range=(320, 640),
+            size_divisor=32,
+            interval=1)
+    ]),
+    backbone=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+    ),
+    neck=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+    ),
+    bbox_head=dict(head_module=dict(widen_factor=widen_factor)))
+
+# data settings
+img_scale = _base_.img_scale
+pre_transform = _base_.pre_transform
+
+train_pipeline_stage1 = [
+    *pre_transform,
+    dict(
+        type='Mosaic',
+        img_scale=img_scale,
+        pad_val=114.0,
+        pre_transform=pre_transform),
+    dict(
+        type='RandomAffine',
+        scaling_ratio_range=scaling_ratio_range,
+        border=(-img_scale[0] // 2, -img_scale[1] // 2)),
+    dict(type='mmdet.YOLOXHSVRandomAug'),
+    dict(type='RandomFlip', prob=0.5),
+    dict(
+        type='FilterAnnotations',
+        by_keypoints=True,
+        min_gt_bbox_wh=(1, 1),
+        keep_empty=False),
+    dict(
+        type='PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape'))
+]
+
+test_pipeline = [
+    *pre_transform,
+    dict(type='Resize', scale=(416, 416), keep_ratio=True),
+    dict(
+        type='mmdet.Pad',
+        pad_to_square=True,
+        pad_val=dict(img=(114.0, 114.0, 114.0))),
+    dict(
+        type='PackDetInputs',
+        meta_keys=('id', 'img_id', 'img_path', 'ori_shape', 'img_shape',
+                   'scale_factor', 'flip_indices'))
+]
+
+train_dataloader = dict(dataset=dict(pipeline=train_pipeline_stage1))
+val_dataloader = dict(dataset=dict(pipeline=test_pipeline))
+test_dataloader = val_dataloader
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolox/yolox_l_fast_8xb8-300e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/yolox/yolox_l_fast_8xb8-300e_coco.py
new file mode 100644
index 0000000..39198d2
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolox/yolox_l_fast_8xb8-300e_coco.py
@@ -0,0 +1,12 @@
+_base_ = './yolox_s_fast_8xb8-300e_coco.py'
+
+# ========================modified parameters======================
+deepen_factor = 1.0
+widen_factor = 1.0
+
+# =======================Unmodified in most cases==================
+# model settings
+model = dict(
+    backbone=dict(deepen_factor=deepen_factor, widen_factor=widen_factor),
+    neck=dict(deepen_factor=deepen_factor, widen_factor=widen_factor),
+    bbox_head=dict(head_module=dict(widen_factor=widen_factor)))
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolox/yolox_m_fast_8xb32-300e-rtmdet-hyp_coco.py b/mmdetection_practice/third_party/mmyolo/configs/yolox/yolox_m_fast_8xb32-300e-rtmdet-hyp_coco.py
new file mode 100644
index 0000000..4a4743c
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolox/yolox_m_fast_8xb32-300e-rtmdet-hyp_coco.py
@@ -0,0 +1,12 @@
+_base_ = './yolox_s_fast_8xb32-300e-rtmdet-hyp_coco.py'
+
+# ========================modified parameters======================
+deepen_factor = 0.67
+widen_factor = 0.75
+
+# =======================Unmodified in most cases==================
+# model settings
+model = dict(
+    backbone=dict(deepen_factor=deepen_factor, widen_factor=widen_factor),
+    neck=dict(deepen_factor=deepen_factor, widen_factor=widen_factor),
+    bbox_head=dict(head_module=dict(widen_factor=widen_factor)))
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolox/yolox_m_fast_8xb8-300e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/yolox/yolox_m_fast_8xb8-300e_coco.py
new file mode 100644
index 0000000..ec8fd2c
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolox/yolox_m_fast_8xb8-300e_coco.py
@@ -0,0 +1,12 @@
+_base_ = './yolox_s_fast_8xb8-300e_coco.py'
+
+# ========================modified parameters======================
+deepen_factor = 0.67
+widen_factor = 0.75
+
+# =======================Unmodified in most cases==================
+# model settings
+model = dict(
+    backbone=dict(deepen_factor=deepen_factor, widen_factor=widen_factor),
+    neck=dict(deepen_factor=deepen_factor, widen_factor=widen_factor),
+    bbox_head=dict(head_module=dict(widen_factor=widen_factor)))
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolox/yolox_nano_fast_8xb32-300e-rtmdet-hyp_coco.py b/mmdetection_practice/third_party/mmyolo/configs/yolox/yolox_nano_fast_8xb32-300e-rtmdet-hyp_coco.py
new file mode 100644
index 0000000..851664f
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolox/yolox_nano_fast_8xb32-300e-rtmdet-hyp_coco.py
@@ -0,0 +1,21 @@
+_base_ = './yolox_tiny_fast_8xb32-300e-rtmdet-hyp_coco.py'
+
+# ========================modified parameters======================
+deepen_factor = 0.33
+widen_factor = 0.25
+use_depthwise = True
+
+# =======================Unmodified in most cases==================
+# model settings
+model = dict(
+    backbone=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+        use_depthwise=use_depthwise),
+    neck=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+        use_depthwise=use_depthwise),
+    bbox_head=dict(
+        head_module=dict(
+            widen_factor=widen_factor, use_depthwise=use_depthwise)))
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolox/yolox_nano_fast_8xb8-300e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/yolox/yolox_nano_fast_8xb8-300e_coco.py
new file mode 100644
index 0000000..a0a5d37
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolox/yolox_nano_fast_8xb8-300e_coco.py
@@ -0,0 +1,21 @@
+_base_ = './yolox_tiny_fast_8xb8-300e_coco.py'
+
+# ========================modified parameters======================
+deepen_factor = 0.33
+widen_factor = 0.25
+use_depthwise = True
+
+# =======================Unmodified in most cases==================
+# model settings
+model = dict(
+    backbone=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+        use_depthwise=use_depthwise),
+    neck=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+        use_depthwise=use_depthwise),
+    bbox_head=dict(
+        head_module=dict(
+            widen_factor=widen_factor, use_depthwise=use_depthwise)))
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolox/yolox_p5_tta.py b/mmdetection_practice/third_party/mmyolo/configs/yolox/yolox_p5_tta.py
new file mode 100644
index 0000000..7ffe349
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolox/yolox_p5_tta.py
@@ -0,0 +1,56 @@
+# TODO: Need to solve the problem of multiple backend_args parameters
+# _backend_args = dict(
+#     backend='petrel',
+#     path_mapping=dict({
+#         './data/': 's3://openmmlab/datasets/detection/',
+#         'data/': 's3://openmmlab/datasets/detection/'
+#     }))
+
+_backend_args = None
+
+tta_model = dict(
+    type='mmdet.DetTTAModel',
+    tta_cfg=dict(nms=dict(type='nms', iou_threshold=0.65), max_per_img=300))
+
+img_scales = [(640, 640), (320, 320), (960, 960)]
+
+#                                LoadImageFromFile
+#              /                        |                          \
+#          Resize                     Resize                       Resize  # noqa
+#        /      \                    /      \                    /        \
+#  RandomFlip RandomFlip      RandomFlip RandomFlip        RandomFlip RandomFlip # noqa
+#      |          |                |         |                  |         |
+#  LoadAnn    LoadAnn           LoadAnn    LoadAnn           LoadAnn    LoadAnn
+#      |          |                |         |                  |         |
+#  PackDetIn  PackDetIn         PackDetIn  PackDetIn        PackDetIn  PackDetIn # noqa
+
+tta_pipeline = [
+    dict(type='LoadImageFromFile', backend_args=_backend_args),
+    dict(
+        type='TestTimeAug',
+        transforms=[
+            [
+                dict(type='mmdet.Resize', scale=s, keep_ratio=True)
+                for s in img_scales
+            ],
+            [
+                # ``RandomFlip`` must be placed before ``Pad``, otherwise
+                # bounding box coordinates after flipping cannot be
+                # recovered correctly.
+                dict(type='mmdet.RandomFlip', prob=1.),
+                dict(type='mmdet.RandomFlip', prob=0.)
+            ],
+            [
+                dict(
+                    type='mmdet.Pad',
+                    pad_to_square=True,
+                    pad_val=dict(img=(114.0, 114.0, 114.0))),
+            ],
+            [
+                dict(
+                    type='mmdet.PackDetInputs',
+                    meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                               'scale_factor', 'flip', 'flip_direction'))
+            ]
+        ])
+]
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolox/yolox_s_fast_1xb12-40e-rtmdet-hyp_cat.py b/mmdetection_practice/third_party/mmyolo/configs/yolox/yolox_s_fast_1xb12-40e-rtmdet-hyp_cat.py
new file mode 100644
index 0000000..f7eac58
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolox/yolox_s_fast_1xb12-40e-rtmdet-hyp_cat.py
@@ -0,0 +1,76 @@
+_base_ = './yolox_s_fast_8xb32-300e-rtmdet-hyp_coco.py'
+
+data_root = './data/cat/'
+class_name = ('cat', )
+num_classes = len(class_name)
+metainfo = dict(classes=class_name, palette=[(20, 220, 60)])
+
+num_last_epochs = 5
+
+max_epochs = 40
+train_batch_size_per_gpu = 12
+train_num_workers = 4
+
+load_from = 'https://download.openmmlab.com/mmyolo/v0/yolox/yolox_s_fast_8xb32-300e-rtmdet-hyp_coco/yolox_s_fast_8xb32-300e-rtmdet-hyp_coco_20230210_134645-3a8dfbd7.pth'  # noqa
+
+model = dict(
+    backbone=dict(frozen_stages=4),
+    bbox_head=dict(head_module=dict(num_classes=num_classes)))
+
+train_dataloader = dict(
+    batch_size=train_batch_size_per_gpu,
+    num_workers=train_num_workers,
+    dataset=dict(
+        data_root=data_root,
+        metainfo=metainfo,
+        ann_file='annotations/trainval.json',
+        data_prefix=dict(img='images/')))
+
+val_dataloader = dict(
+    dataset=dict(
+        metainfo=metainfo,
+        data_root=data_root,
+        ann_file='annotations/test.json',
+        data_prefix=dict(img='images/')))
+
+test_dataloader = val_dataloader
+
+param_scheduler = [
+    dict(
+        # use quadratic formula to warm up 3 epochs
+        # and lr is updated by iteration
+        # TODO: fix default scope in get function
+        type='mmdet.QuadraticWarmupLR',
+        by_epoch=True,
+        begin=0,
+        end=3,
+        convert_to_iter_based=True),
+    dict(
+        # use cosine lr from 5 to 35 epoch
+        type='CosineAnnealingLR',
+        eta_min=_base_.base_lr * 0.05,
+        begin=5,
+        T_max=max_epochs - num_last_epochs,
+        end=max_epochs - num_last_epochs,
+        by_epoch=True,
+        convert_to_iter_based=True),
+    dict(
+        # use fixed lr during last num_last_epochs epochs
+        type='ConstantLR',
+        by_epoch=True,
+        factor=1,
+        begin=max_epochs - num_last_epochs,
+        end=max_epochs,
+    )
+]
+
+_base_.custom_hooks[0].num_last_epochs = num_last_epochs
+
+val_evaluator = dict(ann_file=data_root + 'annotations/test.json')
+test_evaluator = val_evaluator
+
+default_hooks = dict(
+    checkpoint=dict(interval=10, max_keep_ckpts=2, save_best='auto'),
+    logger=dict(type='LoggerHook', interval=5))
+train_cfg = dict(max_epochs=max_epochs, val_interval=10)
+# visualizer = dict(vis_backends = [dict(type='LocalVisBackend'), dict(type='WandbVisBackend')]) # noqa
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolox/yolox_s_fast_8xb32-300e-rtmdet-hyp_coco.py b/mmdetection_practice/third_party/mmyolo/configs/yolox/yolox_s_fast_8xb32-300e-rtmdet-hyp_coco.py
new file mode 100644
index 0000000..167023d
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolox/yolox_s_fast_8xb32-300e-rtmdet-hyp_coco.py
@@ -0,0 +1,87 @@
+_base_ = './yolox_s_fast_8xb8-300e_coco.py'
+
+# ========================modified parameters======================
+# Batch size of a single GPU during training
+# 8 -> 32
+train_batch_size_per_gpu = 32
+
+# Multi-scale training intervals
+# 10 -> 1
+batch_augments_interval = 1
+
+# Last epoch number to switch training pipeline
+# 15 -> 20
+num_last_epochs = 20
+
+# Base learning rate for optim_wrapper. Corresponding to 8xb32=256 bs
+base_lr = 0.004
+
+# SGD -> AdamW
+optim_wrapper = dict(
+    _delete_=True,
+    type='OptimWrapper',
+    optimizer=dict(type='AdamW', lr=base_lr, weight_decay=0.05),
+    paramwise_cfg=dict(
+        norm_decay_mult=0, bias_decay_mult=0, bypass_duplicate=True))
+
+# 0.0001 -> 0.0002
+ema_momentum = 0.0002
+
+# ============================== Unmodified in most cases ===================
+model = dict(
+    data_preprocessor=dict(batch_augments=[
+        dict(
+            type='YOLOXBatchSyncRandomResize',
+            random_size_range=(480, 800),
+            size_divisor=32,
+            interval=batch_augments_interval)
+    ]))
+
+param_scheduler = [
+    dict(
+        # use quadratic formula to warm up 5 epochs
+        # and lr is updated by iteration
+        # TODO: fix default scope in get function
+        type='mmdet.QuadraticWarmupLR',
+        by_epoch=True,
+        begin=0,
+        end=5,
+        convert_to_iter_based=True),
+    dict(
+        # use cosine lr from 5 to 285 epoch
+        type='CosineAnnealingLR',
+        eta_min=base_lr * 0.05,
+        begin=5,
+        T_max=_base_.max_epochs - num_last_epochs,
+        end=_base_.max_epochs - num_last_epochs,
+        by_epoch=True,
+        convert_to_iter_based=True),
+    dict(
+        # use fixed lr during last num_last_epochs epochs
+        type='ConstantLR',
+        by_epoch=True,
+        factor=1,
+        begin=_base_.max_epochs - num_last_epochs,
+        end=_base_.max_epochs,
+    )
+]
+
+custom_hooks = [
+    dict(
+        type='YOLOXModeSwitchHook',
+        num_last_epochs=num_last_epochs,
+        new_train_pipeline=_base_.train_pipeline_stage2,
+        priority=48),
+    dict(type='mmdet.SyncNormHook', priority=48),
+    dict(
+        type='EMAHook',
+        ema_type='ExpMomentumEMA',
+        momentum=ema_momentum,
+        update_buffers=True,
+        strict_load=False,
+        priority=49)
+]
+
+train_dataloader = dict(batch_size=train_batch_size_per_gpu)
+train_cfg = dict(dynamic_intervals=[(_base_.max_epochs - num_last_epochs, 1)])
+auto_scale_lr = dict(base_batch_size=8 * train_batch_size_per_gpu)
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolox/yolox_s_fast_8xb8-300e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/yolox/yolox_s_fast_8xb8-300e_coco.py
new file mode 100644
index 0000000..b371ea1
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolox/yolox_s_fast_8xb8-300e_coco.py
@@ -0,0 +1,331 @@
+_base_ = ['../_base_/default_runtime.py', 'yolox_p5_tta.py']
+
+# ========================Frequently modified parameters======================
+# -----data related-----
+data_root = 'data/coco/'  # Root path of data
+# path of train annotation file
+train_ann_file = 'annotations/instances_train2017.json'
+train_data_prefix = 'train2017/'  # Prefix of train image path
+# path of val annotation file
+val_ann_file = 'annotations/instances_val2017.json'
+val_data_prefix = 'val2017/'  # Prefix of train image path
+
+num_classes = 80  # Number of classes for classification
+# Batch size of a single GPU during training
+train_batch_size_per_gpu = 8
+# Worker to pre-fetch data for each single GPU during tarining
+train_num_workers = 8
+# Presistent_workers must be False if num_workers is 0
+persistent_workers = True
+
+# -----train val related-----
+# Base learning rate for optim_wrapper. Corresponding to 8xb16=64 bs
+base_lr = 0.01
+max_epochs = 300  # Maximum training epochs
+
+model_test_cfg = dict(
+    yolox_style=True,  # better
+    # The config of multi-label for multi-class prediction
+    multi_label=True,  # 40.5 -> 40.7
+    score_thr=0.001,  # Threshold to filter out boxes
+    max_per_img=300,  # Max number of detections of each image
+    nms=dict(type='nms', iou_threshold=0.65))  # NMS type and threshold
+
+# ========================Possible modified parameters========================
+# -----data related-----
+img_scale = (640, 640)  # width, height
+# Dataset type, this will be used to define the dataset
+dataset_type = 'YOLOv5CocoDataset'
+# Batch size of a single GPU during validation
+val_batch_size_per_gpu = 1
+# Worker to pre-fetch data for each single GPU during validation
+val_num_workers = 2
+
+# -----model related-----
+# The scaling factor that controls the depth of the network structure
+deepen_factor = 0.33
+# The scaling factor that controls the width of the network structure
+widen_factor = 0.5
+norm_cfg = dict(type='BN', momentum=0.03, eps=0.001)
+# generate new random resize shape interval
+batch_augments_interval = 10
+
+# -----train val related-----
+weight_decay = 0.0005
+loss_cls_weight = 1.0
+loss_bbox_weight = 5.0
+loss_obj_weight = 1.0
+loss_bbox_aux_weight = 1.0
+center_radius = 2.5  # SimOTAAssigner
+num_last_epochs = 15
+random_affine_scaling_ratio_range = (0.1, 2)
+mixup_ratio_range = (0.8, 1.6)
+# Save model checkpoint and validation intervals
+save_epoch_intervals = 10
+# The maximum checkpoints to keep.
+max_keep_ckpts = 3
+
+ema_momentum = 0.0001
+
+# ===============================Unmodified in most cases====================
+# model settings
+model = dict(
+    type='YOLODetector',
+    init_cfg=dict(
+        type='Kaiming',
+        layer='Conv2d',
+        a=2.23606797749979,  # math.sqrt(5)
+        distribution='uniform',
+        mode='fan_in',
+        nonlinearity='leaky_relu'),
+    # TODO: Waiting for mmengine support
+    use_syncbn=False,
+    data_preprocessor=dict(
+        type='YOLOv5DetDataPreprocessor',
+        pad_size_divisor=32,
+        batch_augments=[
+            dict(
+                type='YOLOXBatchSyncRandomResize',
+                random_size_range=(480, 800),
+                size_divisor=32,
+                interval=batch_augments_interval)
+        ]),
+    backbone=dict(
+        type='YOLOXCSPDarknet',
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+        out_indices=(2, 3, 4),
+        spp_kernal_sizes=(5, 9, 13),
+        norm_cfg=norm_cfg,
+        act_cfg=dict(type='SiLU', inplace=True),
+    ),
+    neck=dict(
+        type='YOLOXPAFPN',
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+        in_channels=[256, 512, 1024],
+        out_channels=256,
+        norm_cfg=norm_cfg,
+        act_cfg=dict(type='SiLU', inplace=True)),
+    bbox_head=dict(
+        type='YOLOXHead',
+        head_module=dict(
+            type='YOLOXHeadModule',
+            num_classes=num_classes,
+            in_channels=256,
+            feat_channels=256,
+            widen_factor=widen_factor,
+            stacked_convs=2,
+            featmap_strides=(8, 16, 32),
+            use_depthwise=False,
+            norm_cfg=norm_cfg,
+            act_cfg=dict(type='SiLU', inplace=True),
+        ),
+        loss_cls=dict(
+            type='mmdet.CrossEntropyLoss',
+            use_sigmoid=True,
+            reduction='sum',
+            loss_weight=loss_cls_weight),
+        loss_bbox=dict(
+            type='mmdet.IoULoss',
+            mode='square',
+            eps=1e-16,
+            reduction='sum',
+            loss_weight=loss_bbox_weight),
+        loss_obj=dict(
+            type='mmdet.CrossEntropyLoss',
+            use_sigmoid=True,
+            reduction='sum',
+            loss_weight=loss_obj_weight),
+        loss_bbox_aux=dict(
+            type='mmdet.L1Loss',
+            reduction='sum',
+            loss_weight=loss_bbox_aux_weight)),
+    train_cfg=dict(
+        assigner=dict(
+            type='mmdet.SimOTAAssigner',
+            center_radius=center_radius,
+            iou_calculator=dict(type='mmdet.BboxOverlaps2D'))),
+    test_cfg=model_test_cfg)
+
+pre_transform = [
+    dict(type='LoadImageFromFile', backend_args=_base_.backend_args),
+    dict(type='LoadAnnotations', with_bbox=True)
+]
+
+train_pipeline_stage1 = [
+    *pre_transform,
+    dict(
+        type='Mosaic',
+        img_scale=img_scale,
+        pad_val=114.0,
+        pre_transform=pre_transform),
+    dict(
+        type='mmdet.RandomAffine',
+        scaling_ratio_range=random_affine_scaling_ratio_range,
+        # img_scale is (width, height)
+        border=(-img_scale[0] // 2, -img_scale[1] // 2)),
+    dict(
+        type='YOLOXMixUp',
+        img_scale=img_scale,
+        ratio_range=mixup_ratio_range,
+        pad_val=114.0,
+        pre_transform=pre_transform),
+    dict(type='mmdet.YOLOXHSVRandomAug'),
+    dict(type='mmdet.RandomFlip', prob=0.5),
+    dict(
+        type='mmdet.FilterAnnotations',
+        min_gt_bbox_wh=(1, 1),
+        keep_empty=False),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                   'flip_direction'))
+]
+
+train_pipeline_stage2 = [
+    *pre_transform,
+    dict(type='mmdet.Resize', scale=img_scale, keep_ratio=True),
+    dict(
+        type='mmdet.Pad',
+        pad_to_square=True,
+        # If the image is three-channel, the pad value needs
+        # to be set separately for each channel.
+        pad_val=dict(img=(114.0, 114.0, 114.0))),
+    dict(type='mmdet.YOLOXHSVRandomAug'),
+    dict(type='mmdet.RandomFlip', prob=0.5),
+    dict(
+        type='mmdet.FilterAnnotations',
+        min_gt_bbox_wh=(1, 1),
+        keep_empty=False),
+    dict(type='mmdet.PackDetInputs')
+]
+
+train_dataloader = dict(
+    batch_size=train_batch_size_per_gpu,
+    num_workers=train_num_workers,
+    persistent_workers=persistent_workers,
+    pin_memory=True,
+    collate_fn=dict(type='yolov5_collate'),
+    sampler=dict(type='DefaultSampler', shuffle=True),
+    dataset=dict(
+        type=dataset_type,
+        data_root=data_root,
+        ann_file=train_ann_file,
+        data_prefix=dict(img=train_data_prefix),
+        filter_cfg=dict(filter_empty_gt=False, min_size=32),
+        pipeline=train_pipeline_stage1))
+
+test_pipeline = [
+    dict(type='LoadImageFromFile', backend_args=_base_.backend_args),
+    dict(type='mmdet.Resize', scale=img_scale, keep_ratio=True),
+    dict(
+        type='mmdet.Pad',
+        pad_to_square=True,
+        pad_val=dict(img=(114.0, 114.0, 114.0))),
+    dict(type='LoadAnnotations', with_bbox=True, _scope_='mmdet'),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                   'scale_factor'))
+]
+
+val_dataloader = dict(
+    batch_size=val_batch_size_per_gpu,
+    num_workers=val_num_workers,
+    persistent_workers=persistent_workers,
+    pin_memory=True,
+    drop_last=False,
+    sampler=dict(type='DefaultSampler', shuffle=False),
+    dataset=dict(
+        type=dataset_type,
+        data_root=data_root,
+        ann_file=val_ann_file,
+        data_prefix=dict(img=val_data_prefix),
+        test_mode=True,
+        pipeline=test_pipeline))
+test_dataloader = val_dataloader
+
+# Reduce evaluation time
+val_evaluator = dict(
+    type='mmdet.CocoMetric',
+    proposal_nums=(100, 1, 10),
+    ann_file=data_root + val_ann_file,
+    metric='bbox')
+
+test_evaluator = val_evaluator
+
+# optimizer
+# default 8 gpu
+optim_wrapper = dict(
+    type='OptimWrapper',
+    optimizer=dict(
+        type='SGD',
+        lr=base_lr,
+        momentum=0.9,
+        weight_decay=weight_decay,
+        nesterov=True),
+    paramwise_cfg=dict(norm_decay_mult=0., bias_decay_mult=0.))
+
+# learning rate
+param_scheduler = [
+    dict(
+        # use quadratic formula to warm up 5 epochs
+        # and lr is updated by iteration
+        # TODO: fix default scope in get function
+        type='mmdet.QuadraticWarmupLR',
+        by_epoch=True,
+        begin=0,
+        end=5,
+        convert_to_iter_based=True),
+    dict(
+        # use cosine lr from 5 to 285 epoch
+        type='CosineAnnealingLR',
+        eta_min=base_lr * 0.05,
+        begin=5,
+        T_max=max_epochs - num_last_epochs,
+        end=max_epochs - num_last_epochs,
+        by_epoch=True,
+        convert_to_iter_based=True),
+    dict(
+        # use fixed lr during last 15 epochs
+        type='ConstantLR',
+        by_epoch=True,
+        factor=1,
+        begin=max_epochs - num_last_epochs,
+        end=max_epochs,
+    )
+]
+
+default_hooks = dict(
+    checkpoint=dict(
+        type='CheckpointHook',
+        interval=save_epoch_intervals,
+        max_keep_ckpts=max_keep_ckpts,
+        save_best='auto'))
+
+custom_hooks = [
+    dict(
+        type='YOLOXModeSwitchHook',
+        num_last_epochs=num_last_epochs,
+        new_train_pipeline=train_pipeline_stage2,
+        priority=48),
+    dict(type='mmdet.SyncNormHook', priority=48),
+    dict(
+        type='EMAHook',
+        ema_type='ExpMomentumEMA',
+        momentum=ema_momentum,
+        update_buffers=True,
+        strict_load=False,
+        priority=49)
+]
+
+train_cfg = dict(
+    type='EpochBasedTrainLoop',
+    max_epochs=max_epochs,
+    val_interval=save_epoch_intervals,
+    dynamic_intervals=[(max_epochs - num_last_epochs, 1)])
+
+auto_scale_lr = dict(base_batch_size=8 * train_batch_size_per_gpu)
+val_cfg = dict(type='ValLoop')
+test_cfg = dict(type='TestLoop')
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolox/yolox_tiny_fast_8xb32-300e-rtmdet-hyp_coco.py b/mmdetection_practice/third_party/mmyolo/configs/yolox/yolox_tiny_fast_8xb32-300e-rtmdet-hyp_coco.py
new file mode 100644
index 0000000..28e539c
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolox/yolox_tiny_fast_8xb32-300e-rtmdet-hyp_coco.py
@@ -0,0 +1,70 @@
+_base_ = './yolox_s_fast_8xb32-300e-rtmdet-hyp_coco.py'
+
+# ========================modified parameters======================
+deepen_factor = 0.33
+widen_factor = 0.375
+
+# Multi-scale training intervals
+# 10 -> 1
+batch_augments_interval = 1
+
+scaling_ratio_range = (0.5, 1.5)
+
+# =======================Unmodified in most cases==================
+img_scale = _base_.img_scale
+pre_transform = _base_.pre_transform
+
+# model settings
+model = dict(
+    data_preprocessor=dict(batch_augments=[
+        dict(
+            type='YOLOXBatchSyncRandomResize',
+            random_size_range=(320, 640),
+            size_divisor=32,
+            interval=batch_augments_interval)
+    ]),
+    backbone=dict(deepen_factor=deepen_factor, widen_factor=widen_factor),
+    neck=dict(deepen_factor=deepen_factor, widen_factor=widen_factor),
+    bbox_head=dict(head_module=dict(widen_factor=widen_factor)))
+
+train_pipeline_stage1 = [
+    *pre_transform,
+    dict(
+        type='Mosaic',
+        img_scale=img_scale,
+        pad_val=114.0,
+        pre_transform=pre_transform),
+    dict(
+        type='mmdet.RandomAffine',
+        scaling_ratio_range=scaling_ratio_range,  # note
+        # img_scale is (width, height)
+        border=(-img_scale[0] // 2, -img_scale[1] // 2)),
+    dict(type='mmdet.YOLOXHSVRandomAug'),
+    dict(type='mmdet.RandomFlip', prob=0.5),
+    dict(
+        type='mmdet.FilterAnnotations',
+        min_gt_bbox_wh=(1, 1),
+        keep_empty=False),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                   'flip_direction'))
+]
+
+test_pipeline = [
+    dict(type='LoadImageFromFile', backend_args=_base_.backend_args),
+    dict(type='mmdet.Resize', scale=(416, 416), keep_ratio=True),  # note
+    dict(
+        type='mmdet.Pad',
+        pad_to_square=True,
+        pad_val=dict(img=(114.0, 114.0, 114.0))),
+    dict(type='LoadAnnotations', with_bbox=True, _scope_='mmdet'),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                   'scale_factor'))
+]
+
+train_dataloader = dict(dataset=dict(pipeline=train_pipeline_stage1))
+val_dataloader = dict(dataset=dict(pipeline=test_pipeline))
+test_dataloader = val_dataloader
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolox/yolox_tiny_fast_8xb8-300e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/yolox/yolox_tiny_fast_8xb8-300e_coco.py
new file mode 100644
index 0000000..fd175a6
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolox/yolox_tiny_fast_8xb8-300e_coco.py
@@ -0,0 +1,100 @@
+_base_ = './yolox_s_fast_8xb8-300e_coco.py'
+
+# ========================modified parameters======================
+deepen_factor = 0.33
+widen_factor = 0.375
+scaling_ratio_range = (0.5, 1.5)
+
+# =======================Unmodified in most cases==================
+img_scale = _base_.img_scale
+pre_transform = _base_.pre_transform
+
+test_img_scale = (416, 416)
+tta_img_scales = [test_img_scale, (320, 320), (640, 640)]
+
+# model settings
+model = dict(
+    data_preprocessor=dict(batch_augments=[
+        dict(
+            type='YOLOXBatchSyncRandomResize',
+            random_size_range=(320, 640),
+            size_divisor=32,
+            interval=10)
+    ]),
+    backbone=dict(deepen_factor=deepen_factor, widen_factor=widen_factor),
+    neck=dict(deepen_factor=deepen_factor, widen_factor=widen_factor),
+    bbox_head=dict(head_module=dict(widen_factor=widen_factor)))
+
+train_pipeline_stage1 = [
+    *pre_transform,
+    dict(
+        type='Mosaic',
+        img_scale=img_scale,
+        pad_val=114.0,
+        pre_transform=pre_transform),
+    dict(
+        type='mmdet.RandomAffine',
+        scaling_ratio_range=scaling_ratio_range,  # note
+        # img_scale is (width, height)
+        border=(-img_scale[0] // 2, -img_scale[1] // 2)),
+    dict(type='mmdet.YOLOXHSVRandomAug'),
+    dict(type='mmdet.RandomFlip', prob=0.5),
+    dict(
+        type='mmdet.FilterAnnotations',
+        min_gt_bbox_wh=(1, 1),
+        keep_empty=False),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                   'flip_direction'))
+]
+
+test_pipeline = [
+    dict(type='LoadImageFromFile', backend_args=_base_.backend_args),
+    dict(type='mmdet.Resize', scale=test_img_scale, keep_ratio=True),  # note
+    dict(
+        type='mmdet.Pad',
+        pad_to_square=True,
+        pad_val=dict(img=(114.0, 114.0, 114.0))),
+    dict(type='LoadAnnotations', with_bbox=True, _scope_='mmdet'),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                   'scale_factor'))
+]
+
+train_dataloader = dict(dataset=dict(pipeline=train_pipeline_stage1))
+val_dataloader = dict(dataset=dict(pipeline=test_pipeline))
+test_dataloader = val_dataloader
+
+# Config for Test Time Augmentation. (TTA)
+tta_pipeline = [
+    dict(type='LoadImageFromFile', backend_args=_base_.backend_args),
+    dict(
+        type='TestTimeAug',
+        transforms=[
+            [
+                dict(type='mmdet.Resize', scale=s, keep_ratio=True)
+                for s in tta_img_scales
+            ],
+            [
+                # ``RandomFlip`` must be placed before ``Pad``, otherwise
+                # bounding box coordinates after flipping cannot be
+                # recovered correctly.
+                dict(type='mmdet.RandomFlip', prob=1.),
+                dict(type='mmdet.RandomFlip', prob=0.)
+            ],
+            [
+                dict(
+                    type='mmdet.Pad',
+                    pad_to_square=True,
+                    pad_val=dict(img=(114.0, 114.0, 114.0))),
+            ],
+            [
+                dict(
+                    type='mmdet.PackDetInputs',
+                    meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                               'scale_factor', 'flip', 'flip_direction'))
+            ]
+        ])
+]
diff --git a/mmdetection_practice/third_party/mmyolo/configs/yolox/yolox_x_fast_8xb8-300e_coco.py b/mmdetection_practice/third_party/mmyolo/configs/yolox/yolox_x_fast_8xb8-300e_coco.py
new file mode 100644
index 0000000..0759d46
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/configs/yolox/yolox_x_fast_8xb8-300e_coco.py
@@ -0,0 +1,12 @@
+_base_ = './yolox_s_fast_8xb8-300e_coco.py'
+
+# ========================modified parameters======================
+deepen_factor = 1.33
+widen_factor = 1.25
+
+# =======================Unmodified in most cases==================
+# model settings
+model = dict(
+    backbone=dict(deepen_factor=deepen_factor, widen_factor=widen_factor),
+    neck=dict(deepen_factor=deepen_factor, widen_factor=widen_factor),
+    bbox_head=dict(head_module=dict(widen_factor=widen_factor)))
diff --git a/mmdetection_practice/third_party/mmyolo/demo/15_minutes_instance_segmentation.ipynb b/mmdetection_practice/third_party/mmyolo/demo/15_minutes_instance_segmentation.ipynb
new file mode 100644
index 0000000..9f5acc9
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/demo/15_minutes_instance_segmentation.ipynb
@@ -0,0 +1,658 @@
+{
+ "cells": [
+  {
+   "attachments": {},
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "x7seefPduh36"
+   },
+   "source": [
+    "<div align=\"center\">\n",
+    "  <img width=\"600\" src=\"https://github.com/open-mmlab/mmyolo/raw/main/resources/mmyolo-logo.png\"/>\n",
+    "  <div>&nbsp;</div>\n",
+    "  <div align=\"center\">\n",
+    "    <b><font size=\"5\">OpenMMLab website</font></b>\n",
+    "    <sup>\n",
+    "      <a href=\"https://openmmlab.com\">\n",
+    "        <i><font size=\"4\">HOT</font></i>\n",
+    "      </a>\n",
+    "    </sup>\n",
+    "    &nbsp;&nbsp;&nbsp;&nbsp;\n",
+    "    <b><font size=\"5\">OpenMMLab platform</font></b>\n",
+    "    <sup>\n",
+    "      <a href=\"https://platform.openmmlab.com\">\n",
+    "        <i><font size=\"4\">TRY IT OUT</font></i>\n",
+    "      </a>\n",
+    "    </sup>\n",
+    "  </div>\n",
+    "  <div>&nbsp;</div>\n",
+    "\n",
+    "<a href=\"https://colab.research.google.com/drive/1ogJ7MQ6DTeKc6mN2an9GvuCjkH3RREXk?usp=sharing\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"></a>\n",
+    "\n",
+    "[![PyPI](https://img.shields.io/pypi/v/mmyolo)](https://pypi.org/project/mmyolo)\n",
+    "[![docs](https://img.shields.io/badge/docs-latest-blue)](https://mmyolo.readthedocs.io/en/latest/)\n",
+    "[![deploy](https://github.com/open-mmlab/mmyolo/workflows/deploy/badge.svg)](https://github.com/open-mmlab/mmyolo/actions)\n",
+    "[![codecov](https://codecov.io/gh/open-mmlab/mmyolo/branch/main/graph/badge.svg)](https://codecov.io/gh/open-mmlab/mmyolo)\n",
+    "[![license](https://img.shields.io/github/license/open-mmlab/mmyolo.svg)](https://github.com/open-mmlab/mmyolo/blob/main/LICENSE)\n",
+    "[![open issues](https://isitmaintained.com/badge/open/open-mmlab/mmyolo.svg)](https://github.com/open-mmlab/mmyolo/issues)\n",
+    "[![issue resolution](https://isitmaintained.com/badge/resolution/open-mmlab/mmyolo.svg)](https://github.com/open-mmlab/mmyolo/issues)\n",
+    "\n",
+    "[📘Documentation](https://mmyolo.readthedocs.io/en/latest/) |\n",
+    "[🛠️Installation](https://mmyolo.readthedocs.io/en/latest/get_started/installation.html) |\n",
+    "[👀Model Zoo](https://mmyolo.readthedocs.io/en/latest/model_zoo.html) |\n",
+    "[🆕Update News](https://mmyolo.readthedocs.io/en/latest/notes/changelog.html) |\n",
+    "[🤔Reporting Issues](https://github.com/open-mmlab/mmyolo/issues/new/choose)\n",
+    "\n",
+    "</div>\n",
+    "\n",
+    "<div align=\"center\">\n",
+    "  <a href=\"https://openmmlab.medium.com/\" style=\"text-decoration:none;\">\n",
+    "    <img src=\"https://user-images.githubusercontent.com/25839884/219255827-67c1a27f-f8c5-46a9-811d-5e57448c61d1.png\" width=\"3%\" alt=\"\" /></a>\n",
+    "  <img src=\"https://user-images.githubusercontent.com/25839884/218346358-56cc8e2f-a2b8-487f-9088-32480cceabcf.png\" width=\"3%\" alt=\"\" />\n",
+    "  <a href=\"https://discord.com/channels/1037617289144569886/1046608014234370059\" style=\"text-decoration:none;\">\n",
+    "    <img src=\"https://user-images.githubusercontent.com/25839884/218347213-c080267f-cbb6-443e-8532-8e1ed9a58ea9.png\" width=\"3%\" alt=\"\" /></a>\n",
+    "  <img src=\"https://user-images.githubusercontent.com/25839884/218346358-56cc8e2f-a2b8-487f-9088-32480cceabcf.png\" width=\"3%\" alt=\"\" />\n",
+    "  <a href=\"https://twitter.com/OpenMMLab\" style=\"text-decoration:none;\">\n",
+    "    <img src=\"https://user-images.githubusercontent.com/25839884/218346637-d30c8a0f-3eba-4699-8131-512fb06d46db.png\" width=\"3%\" alt=\"\" /></a>\n",
+    "  <img src=\"https://user-images.githubusercontent.com/25839884/218346358-56cc8e2f-a2b8-487f-9088-32480cceabcf.png\" width=\"3%\" alt=\"\" />\n",
+    "  <a href=\"https://www.youtube.com/openmmlab\" style=\"text-decoration:none;\">\n",
+    "    <img src=\"https://user-images.githubusercontent.com/25839884/218346691-ceb2116a-465a-40af-8424-9f30d2348ca9.png\" width=\"3%\" alt=\"\" /></a>\n",
+    "  <img src=\"https://user-images.githubusercontent.com/25839884/218346358-56cc8e2f-a2b8-487f-9088-32480cceabcf.png\" width=\"3%\" alt=\"\" />\n",
+    "  <a href=\"https://space.bilibili.com/1293512903\" style=\"text-decoration:none;\">\n",
+    "    <img src=\"https://user-images.githubusercontent.com/25839884/219026751-d7d14cce-a7c9-4e82-9942-8375fca65b99.png\" width=\"3%\" alt=\"\" /></a>\n",
+    "  <img src=\"https://user-images.githubusercontent.com/25839884/218346358-56cc8e2f-a2b8-487f-9088-32480cceabcf.png\" width=\"3%\" alt=\"\" />\n",
+    "  <a href=\"https://www.zhihu.com/people/openmmlab\" style=\"text-decoration:none;\">\n",
+    "    <img src=\"https://user-images.githubusercontent.com/25839884/219026120-ba71e48b-6e94-4bd4-b4e9-b7d175b5e362.png\" width=\"3%\" alt=\"\" /></a>\n",
+    "</div>"
+   ]
+  },
+  {
+   "attachments": {},
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "V6W8P5XEJGoc"
+   },
+   "source": [
+    "# 15 minutes to get started with MMYOLO instance segmentation\n",
+    "\n",
+    "Instance segmentation is a task in computer vision that aims to segment each object in an image and assign each object a unique identifier.\n",
+    "\n",
+    "Unlike semantic segmentation, instance segmentation not only segments out different categories in an image, but also separates different instances of the same category.\n",
+    "\n",
+    "<div align=center>\n",
+    "<img src=\"https://github.com/open-mmlab/mmyolo/assets/87774050/6fd6316f-d78d-48a5-a413-86e7a74583fd\" alt=\"Instance Segmentation\" width=\"100%\"/>\n",
+    "</div>\n",
+    "\n",
+    "Taking the downloadable balloon dataset as an example, I will guide you through a 15-minute easy introduction to MMYOLO instance segmentation. The entire process includes the following steps:\n",
+    "\n",
+    "- [Installation](#installation)\n",
+    "- [Dataset](#dataset)\n",
+    "- [Config](#config)\n",
+    "- [Training](#training)\n",
+    "- [Testing](#testing)\n",
+    "- [EasyDeploy](#easydeploy-deployment)\n",
+    "\n",
+    "In this tutorial, we will use YOLOv5-s as an example. For the demo configuration of the balloon dataset with other YOLO series algorithms, please refer to the corresponding algorithm configuration folder."
+   ]
+  },
+  {
+   "attachments": {},
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "Ae5SqsA7wYGQ"
+   },
+   "source": [
+    "## Installation\n",
+    "\n",
+    "Assuming you've already installed Conda in advance, then install PyTorch using the following commands."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "cellView": "form",
+    "colab": {
+     "base_uri": "https://localhost:8080/"
+    },
+    "id": "XVLRaEIzwW-6",
+    "outputId": "901b5db6-b1d7-4830-e746-485ee76d6648"
+   },
+   "outputs": [],
+   "source": [
+    "# -----------------------------------------------------------------------------------------\n",
+    "# If you are using colab, you can skip this cell for PyTorch is pre-installed on the colab.\n",
+    "# -----------------------------------------------------------------------------------------\n",
+    "!python -V\n",
+    "# Check nvcc version\n",
+    "!nvcc -V\n",
+    "# Check GCC version\n",
+    "!gcc --version\n",
+    "# Create a new Conda environment\n",
+    "%conda create -n mmyolo python=3.8 -y\n",
+    "%conda activate mmyolo\n",
+    "# If you have GPU\n",
+    "%conda install pytorch torchvision -c pytorch\n",
+    "# If you only have CPU\n",
+    "# %conda install pytorch torchvision cpuonly -c pytorch"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# Check PyTorch version\n",
+    "import torch\n",
+    "print(torch.__version__)\n",
+    "print(torch.cuda.is_available())"
+   ]
+  },
+  {
+   "attachments": {},
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Install MMYOLO and dependency libraries using the following commands.\n",
+    "For details about how to configure the environment, see [Installation and verification](https://mmyolo.readthedocs.io/en/latest/get_started/installation.html).\n",
+    "```{note}\n",
+    "Note: Since this repo uses OpenMMLab 2.0, it is better to create a new conda virtual environment to prevent conflicts with the repo installed in OpenMMLab 1.0.\n",
+    "```"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "colab": {
+     "base_uri": "https://localhost:8080/"
+    },
+    "id": "-qATUuntwmfD",
+    "outputId": "24be577b-efce-46f2-8b2f-a65d02824467"
+   },
+   "outputs": [],
+   "source": [
+    "!git clone https://github.com/open-mmlab/mmyolo.git\n",
+    "%cd mmyolo\n",
+    "%pip install -U openmim\n",
+    "!mim install -r requirements/mminstall.txt\n",
+    "# Install albumentations\n",
+    "!mim install -r requirements/albu.txt\n",
+    "# Install MMYOLO\n",
+    "!mim install -v -e .\n",
+    "# \"-v\" means verbose, or more output\n",
+    "# \"-e\" means installing a project in editable mode,\n",
+    "# thus any local modifications made to the code will take effect without reinstallation."
+   ]
+  },
+  {
+   "attachments": {},
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Dataset\n",
+    "\n",
+    "The Balloon dataset is a single-class dataset that consists of 74 images and includes annotated information required for training. Here is an example image from the dataset:\n",
+    "\n",
+    "<div align=center>\n",
+    "<img src=\"https://user-images.githubusercontent.com/87774050/236993643-f581b087-9231-48a5-810b-97a5f31abe63.png\" alt=\"balloon dataset\"/>\n",
+    "</div>\n",
+    "\n",
+    "You can download and use it directly by the following command:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "cellView": "form",
+    "colab": {
+     "base_uri": "https://localhost:8080/"
+    },
+    "id": "gMQXwWuIw3ef",
+    "outputId": "c8efeac7-5b0c-4342-b5af-d3e790e358c3"
+   },
+   "outputs": [],
+   "source": [
+    "!python tools/misc/download_dataset.py --dataset-name balloon --save-dir ./data/balloon --unzip --delete\n",
+    "!python ./tools/dataset_converters/balloon2coco.py"
+   ]
+  },
+  {
+   "attachments": {},
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "covQskXXw2ul"
+   },
+   "source": [
+    "The data for the MMYOLO project is located in the MMYOLO project directory. The `train.json` and `val.json` files store the annotations in COCO format, while the `data/balloon/train` and `data/balloon/val` directories contain all the images for the dataset.\n",
+    "\n",
+    "## Config\n",
+    "\n",
+    "Taking YOLOv5 algorithm as an example, considering the limited GPU memory of users, we need to modify some default training parameters to make them run smoothly. The key parameters to be modified are as follows:\n",
+    "\n",
+    "- YOLOv5 is an Anchor-Based algorithm, and different datasets need to calculate suitable anchors adaptively.\n",
+    "- The default config uses 8 GPUs with a batch size of 16 per GPU. Now change it to a single GPU with a batch size of 12.\n",
+    "- In principle, the learning rate should be linearly scaled accordingly when the batch size is changed, but actual measurements have found that this is not necessary.\n",
+    "\n",
+    "To perform the specific operation, create a new configuration file named `yolov5_ins_s-v61_syncbn_fast_8xb16-300e_balloon_instance.py` in the `configs/yolov5/ins_seg` folder. For convenience, we have already provided this configuration file. Copy the following contents into the configuration file.\n",
+    "\n",
+    "```python\n",
+    "_base_ = './yolov5_ins_s-v61_syncbn_fast_8xb16-300e_coco_instance.py'  # noqa\n",
+    "\n",
+    "data_root = 'data/balloon/' # dataset root\n",
+    "# Training set annotation file of json path\n",
+    "train_ann_file = 'train.json'\n",
+    "train_data_prefix = 'train/'  # Dataset prefix\n",
+    "# Validation set annotation file of json path\n",
+    "val_ann_file = 'val.json'\n",
+    "val_data_prefix = 'val/'\n",
+    "metainfo = {\n",
+    "    'classes': ('balloon', ), # dataset category name\n",
+    "    'palette': [\n",
+    "        (220, 20, 60),\n",
+    "    ]\n",
+    "}\n",
+    "num_classes = 1\n",
+    "# Set batch size to 4\n",
+    "train_batch_size_per_gpu = 4\n",
+    "# dataloader num workers\n",
+    "train_num_workers = 2\n",
+    "log_interval = 1\n",
+    "#####################\n",
+    "train_dataloader = dict(\n",
+    "    batch_size=train_batch_size_per_gpu,\n",
+    "    num_workers=train_num_workers,\n",
+    "    dataset=dict(\n",
+    "        data_root=data_root,\n",
+    "        metainfo=metainfo,\n",
+    "        data_prefix=dict(img=train_data_prefix),\n",
+    "        ann_file=train_ann_file))\n",
+    "val_dataloader = dict(\n",
+    "    dataset=dict(\n",
+    "        data_root=data_root,\n",
+    "        metainfo=metainfo,\n",
+    "        data_prefix=dict(img=val_data_prefix),\n",
+    "        ann_file=val_ann_file))\n",
+    "test_dataloader = val_dataloader\n",
+    "val_evaluator = dict(ann_file=data_root + val_ann_file)\n",
+    "test_evaluator = val_evaluator\n",
+    "default_hooks = dict(logger=dict(interval=log_interval))\n",
+    "#####################\n",
+    "\n",
+    "model = dict(bbox_head=dict(head_module=dict(num_classes=num_classes)))\n",
+    "```\n",
+    "\n",
+    "The above configuration inherits from `yolov5_ins_s-v61_syncbn_fast_8xb16-300e_coco_instance.py` and updates configurations such as `data_root`, `metainfo`, `train_dataloader`, `val_dataloader`, `num_classes`, etc., based on the characteristics of the balloon dataset.\n",
+    "\n",
+    "## Training"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "!python tools/train.py configs/yolov5/ins_seg/yolov5_ins_s-v61_syncbn_fast_8xb16-300e_balloon_instance.py"
+   ]
+  },
+  {
+   "attachments": {},
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "TQ0h6sv_rJxq"
+   },
+   "source": [
+    "After running the training command mentioned above, the folder `work_dirs/yolov5_ins_s-v61_syncbn_fast_8xb16-300e_balloon_instance` will be automatically generated. The weight files and the training configuration file for this session will be saved in this folder. On a lower-end GPU like the GTX 1660, the entire training process will take approximately 30 minutes.\n",
+    "\n",
+    "<div align=center>\n",
+    "<img src=\"https://user-images.githubusercontent.com/87774050/236995027-00a16a9e-2a2d-44cc-be8a-e2c8a36ff77f.png\" alt=\"image\"/>\n",
+    "</div>\n",
+    "\n",
+    "The performance on `val.json` is as follows:\n",
+    "\n",
+    "```text\n",
+    " Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.330\n",
+    " Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.509\n",
+    " Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.317\n",
+    " Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.000\n",
+    " Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.103\n",
+    " Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.417\n",
+    " Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.150\n",
+    " Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.396\n",
+    " Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.454\n",
+    " Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.000\n",
+    " Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.317\n",
+    " Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.525\n",
+    "```\n",
+    "\n",
+    "The above performance is obtained by printing using the COCO API, where -1 indicates the absence of objects of that scale.\n",
+    "\n",
+    "### Some Notes\n",
+    "\n",
+    "Two key warnings are printed during training:\n",
+    "\n",
+    "- You are using `YOLOv5Head` with num_classes == 1. The loss_cls will be 0. This is a normal phenomenon.\n",
+    "\n",
+    "The warning is because the `num_classes` currently trained is 1, the loss of the classification branch is always 0 according to the community of the YOLOv5 algorithm, which is a normal phenomenon.\n",
+    "\n",
+    "### Training is resumed after the interruption\n",
+    "\n",
+    "If you stop training, you can add `--resume` to the end of the training command and the program will automatically resume training with the latest weights file from `work_dirs`."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "!python tools/train.py configs/yolov5/ins_seg/yolov5_ins_s-v61_syncbn_fast_8xb16-300e_balloon_instance.py --resume"
+   ]
+  },
+  {
+   "attachments": {},
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "3sJxvQoUrMhX"
+   },
+   "source": [
+    "### Save GPU memory strategy\n",
+    "\n",
+    "The above config requires about 3G RAM, so if you don't have enough, consider turning on mixed-precision training"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "!python tools/train.py configs/yolov5/ins_seg/yolov5_ins_s-v61_syncbn_fast_8xb16-300e_balloon_instance.py --amp"
+   ]
+  },
+  {
+   "attachments": {},
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "jVJdyHTxrQ9a"
+   },
+   "source": [
+    "### Training visualization\n",
+    "\n",
+    "MMYOLO currently supports local, TensorBoard, WandB and other back-end visualization. The default is to use local visualization, and you can switch to WandB and other real-time visualization of various indicators in the training process.\n",
+    "\n",
+    "#### 1 WandB\n",
+    "\n",
+    "WandB visualization need registered in website, and in the https://wandb.ai/settings for wandb API Keys.\n",
+    "\n",
+    "<div align=center>\n",
+    "<img src=\"https://cdn.vansin.top/img/20220913212628.png\" alt=\"image\"/>\n",
+    "</div>"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "%pip install wandb\n",
+    "# After running wandb login, enter the API Keys obtained above, and the login is successful.\n",
+    "!wandb login"
+   ]
+  },
+  {
+   "attachments": {},
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "Yu0_4YYRrbyY"
+   },
+   "source": [
+    "Add the wandb config at the end of config file we just created: `configs/yolov5/ins_seg/yolov5_ins_s-v61_syncbn_fast_8xb16-300e_balloon_instance.py`.\n",
+    "\n",
+    "```python\n",
+    "visualizer = dict(vis_backends = [dict(type='LocalVisBackend'), dict(type='WandbVisBackend')])\n",
+    "```\n",
+    "\n",
+    "Running the training command and you will see the loss, learning rate, and coco/bbox_mAP visualizations in the link."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "!python tools/train.py configs/yolov5/ins_seg/yolov5_ins_s-v61_syncbn_fast_8xb16-300e_balloon_instance.py"
+   ]
+  },
+  {
+   "attachments": {},
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "f_DyzfDIzwMa"
+   },
+   "source": [
+    "<div align=center>\n",
+    "<img src=\"https://user-images.githubusercontent.com/17425982/222131114-30a79285-56bc-427d-a38d-8d6a6982ad60.png\" alt=\"image\"/>\n",
+    "</div>\n",
+    "<div align=center>\n",
+    "<img src=\"https://user-images.githubusercontent.com/17425982/222132585-4b4962f1-211b-46f7-86b3-7534fc52a1b4.png\" alt=\"image\"/>\n",
+    "</div>\n",
+    "\n",
+    "#### 2 Tensorboard\n",
+    "\n",
+    "Install Tensorboard using the following command."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "cellView": "form",
+    "id": "gHkGlii3n29Q"
+   },
+   "outputs": [],
+   "source": [
+    "%pip install tensorboard"
+   ]
+  },
+  {
+   "attachments": {},
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "bE-nx9TY1P-M"
+   },
+   "source": [
+    "Add the `tensorboard` config at the end of config file we just created: `configs/yolov5/ins_seg/yolov5_ins_s-v61_syncbn_fast_8xb16-300e_balloon_instance.py`.\n",
+    "\n",
+    "```python\n",
+    "visualizer = dict(vis_backends=[dict(type='LocalVisBackend'),dict(type='TensorboardVisBackend')])\n",
+    "```\n",
+    "\n",
+    "After re-running the training command, Tensorboard file will be generated in the visualization folder `work_dirs/yolov5_ins_s-v61_syncbn_fast_8xb16-300e_balloon_instance/{timestamp}/vis_data`.\n",
+    "We can use Tensorboard to view the loss, learning rate, and coco/bbox_mAP visualizations from a web link by running the following command:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "cellView": "form",
+    "id": "g8fZgokho5CE"
+   },
+   "outputs": [],
+   "source": [
+    "!tensorboard --logdir=work_dirs/yolov5_ins_s-v61_syncbn_fast_8xb16-300e_balloon_instance"
+   ]
+  },
+  {
+   "attachments": {},
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "GUZ7MPoaro-o"
+   },
+   "source": [
+    "## Testing"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "colab": {
+     "base_uri": "https://localhost:8080/"
+    },
+    "id": "VYmxtE0GunTB",
+    "outputId": "f440807c-1931-4810-b76d-617f73fde227"
+   },
+   "outputs": [],
+   "source": [
+    "!python tools/test.py configs/yolov5/ins_seg/yolov5_ins_s-v61_syncbn_fast_8xb16-300e_balloon_instance.py work_dirs/yolov5_ins_s-v61_syncbn_fast_8xb16-300e_balloon_instance best_coco_bbox_mAP_epoch_300.pth --show-dir show_results"
+   ]
+  },
+  {
+   "attachments": {},
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "_cFocUqN0BCb"
+   },
+   "source": [
+    "Run the above test command, you can not only get the AP performance printed in the **Training** section, You can also automatically save the result images to the `work_dirs/yolov5_ins_s-v61_syncbn_fast_8xb16-300e_balloon_instance/{timestamp}/show_results` folder. Below is one of the result images, the left image is the actual annotation, and the right image is the inference result of the model.\n",
+    "\n",
+    "<div align=center>\n",
+    "<img src=\"https://user-images.githubusercontent.com/87774050/236996421-46cfd38c-0827-4251-8216-408dfa9e03dd.jpg\" alt=\"result_img\"/>\n",
+    "</div>\n",
+    "\n",
+    "You can also visualize model inference results in a browser window if you use `WandbVisBackend` or `TensorboardVisBackend`.\n",
+    "\n",
+    "## Feature map visualization\n",
+    "\n",
+    "MMYOLO provides visualization scripts for feature map to analyze the current model training. Please refer to [Feature Map Visualization](../recommended_topics/visualization.md)\n",
+    "\n",
+    "Due to the bias of direct visualization of `test_pipeline`, we need to modify the `test_pipeline` of `configs/yolov5/yolov5_ins_s-v61_syncbn_fast_8xb16-300e_balloon_instance.py`\n",
+    "\n",
+    "```python\n",
+    "test_pipeline = [\n",
+    "    dict(\n",
+    "        type='LoadImageFromFile',\n",
+    "        file_client_args=_base_.file_client_args),\n",
+    "    dict(type='YOLOv5KeepRatioResize', scale=img_scale),\n",
+    "    dict(\n",
+    "        type='LetterResize',\n",
+    "        scale=img_scale,\n",
+    "        allow_scale_up=False,\n",
+    "        pad_val=dict(img=114)),\n",
+    "    dict(type='LoadAnnotations', with_bbox=True, _scope_='mmdet'),\n",
+    "    dict(\n",
+    "        type='mmdet.PackDetInputs',\n",
+    "        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',\n",
+    "                   'scale_factor', 'pad_param'))\n",
+    "]\n",
+    "```\n",
+    "\n",
+    "to the following config:\n",
+    "\n",
+    "```python\n",
+    "test_pipeline = [\n",
+    "    dict(\n",
+    "        type='LoadImageFromFile',\n",
+    "        file_client_args=_base_.file_client_args),\n",
+    "    dict(type='mmdet.Resize', scale=img_scale, keep_ratio=False), # modify the LetterResize to mmdet.Resize\n",
+    "    dict(type='LoadAnnotations', with_bbox=True, _scope_='mmdet'),\n",
+    "    dict(\n",
+    "        type='mmdet.PackDetInputs',\n",
+    "        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',\n",
+    "                   'scale_factor'))\n",
+    "]\n",
+    "```\n",
+    "\n",
+    "Let's choose the `data/balloon/train/3927754171_9011487133_b.jpg` image as an example to visualize the output feature maps of YOLOv5 backbone and neck layers.\n",
+    "\n",
+    "**1. Visualize the three channels of YOLOv5 backbone**"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "!python demo/featmap_vis_demo.py data/balloon/train/3927754171_9011487133_b.jpg onfigs/yolov5/ins_seg/yolov5_ins_s-v61_syncbn_fast_8xb16-300e_balloon_instance.py work_dirs/yolov5_ins_s-v61_syncbn_fast_8xb16-300e_balloon_instance/best_coco_bbox_mAP_epoch_300.pth --target-layers backbone --channel-reduction squeeze_mean"
+   ]
+  },
+  {
+   "attachments": {},
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "<div align=center>\n",
+    "<img src=\"https://user-images.githubusercontent.com/87774050/236997582-233e292f-5e96-4e44-9e92-9e0787f302fc.jpg\" width=\"800\" alt=\"image\"/>\n",
+    "</div>\n",
+    "\n",
+    "The result will be saved to the output folder in current path. Three output feature maps plotted in the above figure correspond to small, medium and large output feature maps.\n",
+    "\n",
+    "**2. Visualize the three channels of YOLOv5 neck**"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "!python demo/featmap_vis_demo.py data/balloon/train/3927754171_9011487133_b.jpg \\\n",
+    "                                 configs/yolov5/ins_seg/yolov5_ins_s-v61_syncbn_fast_8xb16-300e_balloon_instance.py \\\n",
+    "                                 work_dirs/yolov5_ins_s-v61_syncbn_fast_8xb16-300e_balloon_instance/best_coco_bbox_mAP_epoch_300.pth \\\n",
+    "                                 --target-layers neck \\\n",
+    "                                 --channel-reduction squeeze_mean"
+   ]
+  },
+  {
+   "attachments": {},
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "<div align=center>\n",
+    "<img src=\"https://user-images.githubusercontent.com/87774050/236997860-719d2e18-7767-4129-a072-b21c97a5502a.jpg\" width=\"800\" alt=\"image\"/>\n",
+    "</div>\n",
+    "\n",
+    "**3. Grad-Based CAM visualization**\n",
+    "TODO"
+   ]
+  },
+  {
+   "attachments": {},
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## EasyDeploy deployment\n",
+    "TODO\n",
+    "\n",
+    "This completes the transformation deployment of the trained model and checks the inference results. This is the end of the tutorial.\n",
+    "\n",
+    "If you encounter problems during training or testing, please check the [common troubleshooting steps](https://mmyolo.readthedocs.io/en/dev/recommended_topics/troubleshooting_steps.html) first and feel free to open an [issue](https://github.com/open-mmlab/mmyolo/issues/new/choose) if you still can't solve it."
+   ]
+  }
+ ],
+ "metadata": {
+  "accelerator": "GPU",
+  "colab": {
+   "provenance": [],
+   "toc_visible": true
+  },
+  "gpuClass": "standard",
+  "kernelspec": {
+   "display_name": "Python 3",
+   "name": "python3"
+  },
+  "language_info": {
+   "name": "python"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 0
+}
diff --git a/mmdetection_practice/third_party/mmyolo/demo/15_minutes_object_detection.ipynb b/mmdetection_practice/third_party/mmyolo/demo/15_minutes_object_detection.ipynb
new file mode 100644
index 0000000..7faa328
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/demo/15_minutes_object_detection.ipynb
@@ -0,0 +1,1002 @@
+{
+ "cells": [
+  {
+   "attachments": {},
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "x7seefPduh36"
+   },
+   "source": [
+    "<div align=\"center\">\n",
+    "  <img width=\"600\" src=\"https://github.com/open-mmlab/mmyolo/raw/main/resources/mmyolo-logo.png\"/>\n",
+    "  <div>&nbsp;</div>\n",
+    "  <div align=\"center\">\n",
+    "    <b><font size=\"5\">OpenMMLab website</font></b>\n",
+    "    <sup>\n",
+    "      <a href=\"https://openmmlab.com\">\n",
+    "        <i><font size=\"4\">HOT</font></i>\n",
+    "      </a>\n",
+    "    </sup>\n",
+    "    &nbsp;&nbsp;&nbsp;&nbsp;\n",
+    "    <b><font size=\"5\">OpenMMLab platform</font></b>\n",
+    "    <sup>\n",
+    "      <a href=\"https://platform.openmmlab.com\">\n",
+    "        <i><font size=\"4\">TRY IT OUT</font></i>\n",
+    "      </a>\n",
+    "    </sup>\n",
+    "  </div>\n",
+    "  <div>&nbsp;</div>\n",
+    "\n",
+    "<a href=\"https://colab.research.google.com/github/open-mmlab/mmyolo/blob/dev/demo/15_minutes_object_detection.ipynb\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"></a>\n",
+    "\n",
+    "[![PyPI](https://img.shields.io/pypi/v/mmyolo)](https://pypi.org/project/mmyolo)\n",
+    "[![docs](https://img.shields.io/badge/docs-latest-blue)](https://mmyolo.readthedocs.io/en/latest/)\n",
+    "[![deploy](https://github.com/open-mmlab/mmyolo/workflows/deploy/badge.svg)](https://github.com/open-mmlab/mmyolo/actions)\n",
+    "[![codecov](https://codecov.io/gh/open-mmlab/mmyolo/branch/main/graph/badge.svg)](https://codecov.io/gh/open-mmlab/mmyolo)\n",
+    "[![license](https://img.shields.io/github/license/open-mmlab/mmyolo.svg)](https://github.com/open-mmlab/mmyolo/blob/main/LICENSE)\n",
+    "[![open issues](https://isitmaintained.com/badge/open/open-mmlab/mmyolo.svg)](https://github.com/open-mmlab/mmyolo/issues)\n",
+    "[![issue resolution](https://isitmaintained.com/badge/resolution/open-mmlab/mmyolo.svg)](https://github.com/open-mmlab/mmyolo/issues)\n",
+    "\n",
+    "[📘Documentation](https://mmyolo.readthedocs.io/en/latest/) |\n",
+    "[🛠️Installation](https://mmyolo.readthedocs.io/en/latest/get_started/installation.html) |\n",
+    "[👀Model Zoo](https://mmyolo.readthedocs.io/en/latest/model_zoo.html) |\n",
+    "[🆕Update News](https://mmyolo.readthedocs.io/en/latest/notes/changelog.html) |\n",
+    "[🤔Reporting Issues](https://github.com/open-mmlab/mmyolo/issues/new/choose)\n",
+    "\n",
+    "</div>\n",
+    "\n",
+    "<div align=\"center\">\n",
+    "  <a href=\"https://openmmlab.medium.com/\" style=\"text-decoration:none;\">\n",
+    "    <img src=\"https://user-images.githubusercontent.com/25839884/219255827-67c1a27f-f8c5-46a9-811d-5e57448c61d1.png\" width=\"3%\" alt=\"\" /></a>\n",
+    "  <img src=\"https://user-images.githubusercontent.com/25839884/218346358-56cc8e2f-a2b8-487f-9088-32480cceabcf.png\" width=\"3%\" alt=\"\" />\n",
+    "  <a href=\"https://discord.com/channels/1037617289144569886/1046608014234370059\" style=\"text-decoration:none;\">\n",
+    "    <img src=\"https://user-images.githubusercontent.com/25839884/218347213-c080267f-cbb6-443e-8532-8e1ed9a58ea9.png\" width=\"3%\" alt=\"\" /></a>\n",
+    "  <img src=\"https://user-images.githubusercontent.com/25839884/218346358-56cc8e2f-a2b8-487f-9088-32480cceabcf.png\" width=\"3%\" alt=\"\" />\n",
+    "  <a href=\"https://twitter.com/OpenMMLab\" style=\"text-decoration:none;\">\n",
+    "    <img src=\"https://user-images.githubusercontent.com/25839884/218346637-d30c8a0f-3eba-4699-8131-512fb06d46db.png\" width=\"3%\" alt=\"\" /></a>\n",
+    "  <img src=\"https://user-images.githubusercontent.com/25839884/218346358-56cc8e2f-a2b8-487f-9088-32480cceabcf.png\" width=\"3%\" alt=\"\" />\n",
+    "  <a href=\"https://www.youtube.com/openmmlab\" style=\"text-decoration:none;\">\n",
+    "    <img src=\"https://user-images.githubusercontent.com/25839884/218346691-ceb2116a-465a-40af-8424-9f30d2348ca9.png\" width=\"3%\" alt=\"\" /></a>\n",
+    "  <img src=\"https://user-images.githubusercontent.com/25839884/218346358-56cc8e2f-a2b8-487f-9088-32480cceabcf.png\" width=\"3%\" alt=\"\" />\n",
+    "  <a href=\"https://space.bilibili.com/1293512903\" style=\"text-decoration:none;\">\n",
+    "    <img src=\"https://user-images.githubusercontent.com/25839884/219026751-d7d14cce-a7c9-4e82-9942-8375fca65b99.png\" width=\"3%\" alt=\"\" /></a>\n",
+    "  <img src=\"https://user-images.githubusercontent.com/25839884/218346358-56cc8e2f-a2b8-487f-9088-32480cceabcf.png\" width=\"3%\" alt=\"\" />\n",
+    "  <a href=\"https://www.zhihu.com/people/openmmlab\" style=\"text-decoration:none;\">\n",
+    "    <img src=\"https://user-images.githubusercontent.com/25839884/219026120-ba71e48b-6e94-4bd4-b4e9-b7d175b5e362.png\" width=\"3%\" alt=\"\" /></a>\n",
+    "</div>"
+   ]
+  },
+  {
+   "attachments": {},
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "V6W8P5XEJGoc"
+   },
+   "source": [
+    "# 15 minutes to get started with MMYOLO object detection\n",
+    "\n",
+    "Object detection task refers to that given a picture, the network predicts all the categories of objects included in the picture and the corresponding boundary boxes\n",
+    "\n",
+    "<div align=center>\n",
+    "<img src=\"https://user-images.githubusercontent.com/17425982/220232979-fffa480b-9ae6-4601-8af6-4116265dc650.png\" alt=\"object detection\" width=\"800\"/>\n",
+    "</div>\n",
+    "\n",
+    "Take the small dataset of cat as an example, you can easily learn MMYOLO object detection in 15 minutes. The whole process consists of the following steps:\n",
+    "\n",
+    "- [Installation](#installation)\n",
+    "- [Dataset](#dataset)\n",
+    "- [Config](#config)\n",
+    "- [Training](#training)\n",
+    "- [Testing](#testing)\n",
+    "- [EasyDeploy](#easydeploy-deployment)\n",
+    "\n",
+    "In this tutorial, we take YOLOv5-s as an example. For the rest of the YOLO series algorithms, please see the corresponding algorithm configuration folder."
+   ]
+  },
+  {
+   "attachments": {},
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "Ae5SqsA7wYGQ"
+   },
+   "source": [
+    "## Installation\n",
+    "\n",
+    "Assuming you've already installed Conda in advance, then install PyTorch using the following commands."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "cellView": "form",
+    "colab": {
+     "base_uri": "https://localhost:8080/"
+    },
+    "id": "XVLRaEIzwW-6",
+    "outputId": "901b5db6-b1d7-4830-e746-485ee76d6648"
+   },
+   "outputs": [],
+   "source": [
+    "# -----------------------------------------------------------------------------------------\n",
+    "# If you are using colab, you can skip this cell for PyTorch is pre-installed on the colab.\n",
+    "# -----------------------------------------------------------------------------------------\n",
+    "!python -V\n",
+    "# Check nvcc version\n",
+    "!nvcc -V\n",
+    "# Check GCC version\n",
+    "!gcc --version\n",
+    "# Create a new Conda environment\n",
+    "%conda create -n mmyolo python=3.8 -y\n",
+    "%conda activate mmyolo\n",
+    "# If you have GPU\n",
+    "%conda install pytorch torchvision -c pytorch\n",
+    "# If you only have CPU\n",
+    "# %conda install pytorch torchvision cpuonly -c pytorch"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# Check PyTorch version\n",
+    "import torch\n",
+    "print(torch.__version__)\n",
+    "print(torch.cuda.is_available())"
+   ]
+  },
+  {
+   "attachments": {},
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Install MMYOLO and dependency libraries using the following commands.\n",
+    "For details about how to configure the environment, see [Installation and verification](https://mmyolo.readthedocs.io/en/latest/get_started/installation.html).\n",
+    "```{note}\n",
+    "Note: Since this repo uses OpenMMLab 2.0, it is better to create a new conda virtual environment to prevent conflicts with the repo installed in OpenMMLab 1.0.\n",
+    "```"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "colab": {
+     "base_uri": "https://localhost:8080/"
+    },
+    "id": "-qATUuntwmfD",
+    "outputId": "24be577b-efce-46f2-8b2f-a65d02824467"
+   },
+   "outputs": [],
+   "source": [
+    "!git clone https://github.com/open-mmlab/mmyolo.git\n",
+    "%cd mmyolo\n",
+    "%pip install -U openmim\n",
+    "!mim install -r requirements/mminstall.txt\n",
+    "# Install albumentations\n",
+    "!mim install -r requirements/albu.txt\n",
+    "# Install MMYOLO\n",
+    "!mim install -v -e .\n",
+    "# \"-v\" means verbose, or more output\n",
+    "# \"-e\" means installing a project in editable mode,\n",
+    "# thus any local modifications made to the code will take effect without reinstallation."
+   ]
+  },
+  {
+   "attachments": {},
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Dataset\n",
+    "\n",
+    "The Cat dataset is a single-category dataset consisting of 144 pictures (the original pictures are provided by @RangeKing, and cleaned by @PeterH0323), which contains the annotation information required for training. The sample image is shown below:\n",
+    "\n",
+    "<div align=center>\n",
+    "<img src=\"https://user-images.githubusercontent.com/25873202/205423220-c4b8f2fd-22ba-4937-8e47-1b3f6a8facd8.png\" alt=\"cat dataset\"/>\n",
+    "</div>\n",
+    "\n",
+    "You can download and use it directly by the following command:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "cellView": "form",
+    "colab": {
+     "base_uri": "https://localhost:8080/"
+    },
+    "id": "gMQXwWuIw3ef",
+    "outputId": "c8efeac7-5b0c-4342-b5af-d3e790e358c3"
+   },
+   "outputs": [],
+   "source": [
+    "!python tools/misc/download_dataset.py --dataset-name cat --save-dir ./data/cat --unzip --delete"
+   ]
+  },
+  {
+   "attachments": {},
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "covQskXXw2ul"
+   },
+   "source": [
+    "This dataset is automatically downloaded to the `./data/cat` dir with the following directory structure:\n",
+    "\n",
+    "<div align=center>\n",
+    "<img src=\"https://user-images.githubusercontent.com/17425982/220072078-48b88a08-6179-483e-b8d3-0549e1b465de.png\" alt=\"image\"/>\n",
+    "</div>\n",
+    "\n",
+    "The cat dataset is located in the mmyolo project dir, and `data/cat/annotations` stores annotations in COCO format, and `data/cat/images` stores all images\n",
+    "\n",
+    "## Config\n",
+    "\n",
+    "Taking YOLOv5 algorithm as an example, considering the limited GPU memory of users, we need to modify some default training parameters to make them run smoothly. The key parameters to be modified are as follows:\n",
+    "\n",
+    "- YOLOv5 is an Anchor-Based algorithm, and different datasets need to calculate suitable anchors adaptively\n",
+    "- The default config uses 8 GPUs with a batch size of 16 per GPU. Now change it to a single GPU with a batch size of 12.\n",
+    "- The default training epoch is 300. Change it to 40 epoch\n",
+    "- Given the small size of the dataset, we opted to use fixed backbone weights\n",
+    "- In principle, the learning rate should be linearly scaled accordingly when the batch size is changed, but actual measurements have found that this is not necessary\n",
+    "\n",
+    "Create a `yolov5_s-v61_fast_1xb12-40e_cat.py` config file in the `configs/yolov5` folder (we have provided this config for you to use directly) and copy the following into the config file.\n",
+    "\n",
+    "```python\n",
+    "# Inherit and overwrite part of the config based on this config\n",
+    "_base_ = 'yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py'\n",
+    "\n",
+    "data_root = './data/cat/' # dataset root\n",
+    "class_name = ('cat', ) # dataset category name\n",
+    "num_classes = len(class_name) # dataset category number\n",
+    "# metainfo is a configuration that must be passed to the dataloader, otherwise it is invalid\n",
+    "# palette is a display color for category at visualization\n",
+    "# The palette length must be greater than or equal to the length of the classes\n",
+    "metainfo = dict(classes=class_name, palette=[(20, 220, 60)])\n",
+    "\n",
+    "# Adaptive anchor based on tools/analysis_tools/optimize_anchors.py\n",
+    "anchors = [\n",
+    "    [(68, 69), (154, 91), (143, 162)],  # P3/8\n",
+    "    [(242, 160), (189, 287), (391, 207)],  # P4/16\n",
+    "    [(353, 337), (539, 341), (443, 432)]  # P5/32\n",
+    "]\n",
+    "# Max training 40 epoch\n",
+    "max_epochs = 40\n",
+    "# bs = 12\n",
+    "train_batch_size_per_gpu = 12\n",
+    "# dataloader num workers\n",
+    "train_num_workers = 4\n",
+    "\n",
+    "# load COCO pre-trained weight\n",
+    "load_from = 'https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth'  # noqa\n",
+    "\n",
+    "model = dict(\n",
+    "    # Fixed the weight of the entire backbone without training\n",
+    "    backbone=dict(frozen_stages=4),\n",
+    "    bbox_head=dict(\n",
+    "        head_module=dict(num_classes=num_classes),\n",
+    "        prior_generator=dict(base_sizes=anchors)\n",
+    "    ))\n",
+    "\n",
+    "train_dataloader = dict(\n",
+    "    batch_size=train_batch_size_per_gpu,\n",
+    "    num_workers=train_num_workers,\n",
+    "    dataset=dict(\n",
+    "        data_root=data_root,\n",
+    "        metainfo=metainfo,\n",
+    "        # Dataset annotation file of json path\n",
+    "        ann_file='annotations/trainval.json',\n",
+    "        # Dataset prefix\n",
+    "        data_prefix=dict(img='images/')))\n",
+    "\n",
+    "val_dataloader = dict(\n",
+    "    dataset=dict(\n",
+    "        metainfo=metainfo,\n",
+    "        data_root=data_root,\n",
+    "        ann_file='annotations/test.json',\n",
+    "        data_prefix=dict(img='images/')))\n",
+    "\n",
+    "test_dataloader = val_dataloader\n",
+    "\n",
+    "_base_.optim_wrapper.optimizer.batch_size_per_gpu = train_batch_size_per_gpu\n",
+    "\n",
+    "val_evaluator = dict(ann_file=data_root + 'annotations/test.json')\n",
+    "test_evaluator = val_evaluator\n",
+    "\n",
+    "default_hooks = dict(\n",
+    "    # Save weights every 10 epochs and a maximum of two weights can be saved.\n",
+    "    # The best model is saved automatically during model evaluation\n",
+    "    checkpoint=dict(interval=10, max_keep_ckpts=2, save_best='auto'),\n",
+    "    # The warmup_mim_iter parameter is critical.\n",
+    "    # The default value is 1000 which is not suitable for cat datasets.\n",
+    "    param_scheduler=dict(max_epochs=max_epochs, warmup_mim_iter=10),\n",
+    "    # The log printing interval is 5\n",
+    "    logger=dict(type='LoggerHook', interval=5))\n",
+    "# The evaluation interval is 10\n",
+    "train_cfg = dict(max_epochs=max_epochs, val_interval=10)\n",
+    "```\n",
+    "\n",
+    "The above config is inherited from `yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py`. According to the characteristics of cat dataset updated `data_root`, `metainfo`, `train_dataloader`, `val_dataloader`, `num_classes` and other config.\n",
+    "\n",
+    "## Training"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "!python tools/train.py configs/yolov5/yolov5_s-v61_fast_1xb12-40e_cat.py"
+   ]
+  },
+  {
+   "attachments": {},
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "TQ0h6sv_rJxq"
+   },
+   "source": [
+    "Run the above training command, `work_dirs/yolov5_s-v61_fast_1xb12-40e_cat` folder will be automatically generated, the checkpoint file and the training config file will be saved in this folder. On a low-end 1660 GPU, the entire training process takes about eight minutes.\n",
+    "\n",
+    "<div align=center>\n",
+    "<img src=\"https://user-images.githubusercontent.com/17425982/220236361-bd113606-248e-4a0e-a484-c0dc9e355b5b.png\" alt=\"image\"/>\n",
+    "</div>\n",
+    "\n",
+    "The performance on `test.json` is as follows:\n",
+    "\n",
+    "```text\n",
+    " Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.631\n",
+    " Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.909\n",
+    " Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.747\n",
+    " Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = -1.000\n",
+    " Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = -1.000\n",
+    " Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.631\n",
+    " Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.627\n",
+    " Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.703\n",
+    " Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.703\n",
+    " Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = -1.000\n",
+    " Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = -1.000\n",
+    " Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.703\n",
+    "```\n",
+    "\n",
+    "The above properties are printed via the COCO API, where -1 indicates that no object exists for the scale. According to the rules defined by COCO, the Cat dataset contains all large sized objects, and there are no small or medium-sized objects.\n",
+    "\n",
+    "### Some Notes\n",
+    "\n",
+    "Two key warnings are printed during training:\n",
+    "\n",
+    "- You are using `YOLOv5Head` with num_classes == 1. The loss_cls will be 0. This is a normal phenomenon.\n",
+    "- The model and loaded state dict do not match exactly\n",
+    "\n",
+    "Neither of these warnings will have any impact on performance. The first warning is because the `num_classes` currently trained is 1, the loss of the classification branch is always 0 according to the community of the YOLOv5 algorithm, which is a normal phenomenon. The second warning is because we are currently training in fine-tuning mode, we load the COCO pre-trained weights for 80 classes,\n",
+    "This will lead to the final Head module convolution channel number does not correspond, resulting in this part of the weight can not be loaded, which is also a normal phenomenon.\n",
+    "\n",
+    "### Training is resumed after the interruption\n",
+    "\n",
+    "If you stop training, you can add `--resume` to the end of the training command and the program will automatically resume training with the latest weights file from `work_dirs`."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "!python tools/train.py configs/yolov5/yolov5_s-v61_fast_1xb12-40e_cat.py --resume"
+   ]
+  },
+  {
+   "attachments": {},
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "3sJxvQoUrMhX"
+   },
+   "source": [
+    "### Save GPU memory strategy\n",
+    "\n",
+    "The above config requires about 3G RAM, so if you don't have enough, consider turning on mixed-precision training"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "!python tools/train.py configs/yolov5/yolov5_s-v61_fast_1xb12-40e_cat.py --amp"
+   ]
+  },
+  {
+   "attachments": {},
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "jVJdyHTxrQ9a"
+   },
+   "source": [
+    "### Training visualization\n",
+    "\n",
+    "MMYOLO currently supports local, TensorBoard, WandB and other back-end visualization. The default is to use local visualization, and you can switch to WandB and other real-time visualization of various indicators in the training process.\n",
+    "\n",
+    "#### 1 WandB\n",
+    "\n",
+    "WandB visualization need registered in website, and in the https://wandb.ai/settings for wandb API Keys.\n",
+    "\n",
+    "<div align=center>\n",
+    "<img src=\"https://cdn.vansin.top/img/20220913212628.png\" alt=\"image\"/>\n",
+    "</div>"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "%pip install wandb\n",
+    "# After running wandb login, enter the API Keys obtained above, and the login is successful.\n",
+    "!wandb login"
+   ]
+  },
+  {
+   "attachments": {},
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "Yu0_4YYRrbyY"
+   },
+   "source": [
+    "Add the wandb config at the end of config file we just created: `configs/yolov5/yolov5_s-v61_fast_1xb12-40e_cat.py`.\n",
+    "\n",
+    "```python\n",
+    "visualizer = dict(vis_backends = [dict(type='LocalVisBackend'), dict(type='WandbVisBackend')])\n",
+    "```\n",
+    "\n",
+    "Running the training command and you will see the loss, learning rate, and coco/bbox_mAP visualizations in the link."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "!python tools/train.py configs/yolov5/yolov5_s-v61_fast_1xb12-40e_cat.py"
+   ]
+  },
+  {
+   "attachments": {},
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "f_DyzfDIzwMa"
+   },
+   "source": [
+    "<div align=center>\n",
+    "<img src=\"https://user-images.githubusercontent.com/17425982/222131114-30a79285-56bc-427d-a38d-8d6a6982ad60.png\" alt=\"image\"/>\n",
+    "</div>\n",
+    "<div align=center>\n",
+    "<img src=\"https://user-images.githubusercontent.com/17425982/222132585-4b4962f1-211b-46f7-86b3-7534fc52a1b4.png\" alt=\"image\"/>\n",
+    "</div>\n",
+    "\n",
+    "#### 2 Tensorboard\n",
+    "\n",
+    "Install Tensorboard using the following command."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "cellView": "form",
+    "id": "gHkGlii3n29Q"
+   },
+   "outputs": [],
+   "source": [
+    "%pip install tensorboard"
+   ]
+  },
+  {
+   "attachments": {},
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "bE-nx9TY1P-M"
+   },
+   "source": [
+    "Add the `tensorboard` config at the end of config file we just created: `configs/yolov5/yolov5_s-v61_fast_1xb12-40e_cat.py`.\n",
+    "\n",
+    "```python\n",
+    "visualizer = dict(vis_backends=[dict(type='LocalVisBackend'),dict(type='TensorboardVisBackend')])\n",
+    "```\n",
+    "\n",
+    "After re-running the training command, Tensorboard file will be generated in the visualization folder `work_dirs/yolov5_s-v61_fast_1xb12-40e_cat/{timestamp}/vis_data`.\n",
+    "We can use Tensorboard to view the loss, learning rate, and coco/bbox_mAP visualizations from a web link by running the following command:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "cellView": "form",
+    "id": "g8fZgokho5CE"
+   },
+   "outputs": [],
+   "source": [
+    "!tensorboard --logdir=work_dirs/yolov5_s-v61_fast_1xb12-40e_cat"
+   ]
+  },
+  {
+   "attachments": {},
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "GUZ7MPoaro-o"
+   },
+   "source": [
+    "## Testing"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "colab": {
+     "base_uri": "https://localhost:8080/"
+    },
+    "id": "VYmxtE0GunTB",
+    "outputId": "f440807c-1931-4810-b76d-617f73fde227"
+   },
+   "outputs": [],
+   "source": [
+    "!python tools/test.py configs/yolov5/yolov5_s-v61_fast_1xb12-40e_cat.py \\\n",
+    "                      work_dirs/yolov5_s-v61_fast_1xb12-40e_cat/epoch_40.pth \\\n",
+    "                      --show-dir show_results"
+   ]
+  },
+  {
+   "attachments": {},
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "_cFocUqN0BCb"
+   },
+   "source": [
+    "Run the above test command, you can not only get the AP performance printed in the **Training** section, You can also automatically save the result images to the `work_dirs/yolov5_s-v61_fast_1xb12-40e_cat/{timestamp}/show_results` folder. Below is one of the result images, the left image is the actual annotation, and the right image is the inference result of the model.\n",
+    "\n",
+    "<div align=center>\n",
+    "<img src=\"https://user-images.githubusercontent.com/17425982/220251677-6c7e5c8f-9417-4803-97fc-a968d0172ab7.png\" alt=\"result_img\"/>\n",
+    "</div>\n",
+    "\n",
+    "You can also visualize model inference results in a browser window if you use 'WandbVisBackend' or 'TensorboardVisBackend'.\n",
+    "\n",
+    "## Feature map visualization\n",
+    "\n",
+    "MMYOLO provides visualization scripts for feature map to analyze the current model training. Please refer to [Feature Map Visualization](../recommended_topics/visualization.md)\n",
+    "\n",
+    "Due to the bias of direct visualization of `test_pipeline`, we need modify the `test_pipeline` of `configs/yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py`,\n",
+    "\n",
+    "```python\n",
+    "test_pipeline = [\n",
+    "    dict(\n",
+    "        type='LoadImageFromFile',\n",
+    "        file_client_args=_base_.file_client_args),\n",
+    "    dict(type='YOLOv5KeepRatioResize', scale=img_scale),\n",
+    "    dict(\n",
+    "        type='LetterResize',\n",
+    "        scale=img_scale,\n",
+    "        allow_scale_up=False,\n",
+    "        pad_val=dict(img=114)),\n",
+    "    dict(type='LoadAnnotations', with_bbox=True, _scope_='mmdet'),\n",
+    "    dict(\n",
+    "        type='mmdet.PackDetInputs',\n",
+    "        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',\n",
+    "                   'scale_factor', 'pad_param'))\n",
+    "]\n",
+    "```\n",
+    "\n",
+    "to the following config:\n",
+    "\n",
+    "```python\n",
+    "test_pipeline = [\n",
+    "    dict(\n",
+    "        type='LoadImageFromFile',\n",
+    "        file_client_args=_base_.file_client_args),\n",
+    "    dict(type='mmdet.Resize', scale=img_scale, keep_ratio=False), # modify the LetterResize to mmdet.Resize\n",
+    "    dict(type='LoadAnnotations', with_bbox=True, _scope_='mmdet'),\n",
+    "    dict(\n",
+    "        type='mmdet.PackDetInputs',\n",
+    "        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',\n",
+    "                   'scale_factor'))\n",
+    "]\n",
+    "```\n",
+    "\n",
+    "Let's choose the `data/cat/images/IMG_20221020_112705.jpg` image as an example to visualize the output feature maps of YOLOv5 backbone and neck layers.\n",
+    "\n",
+    "**1. Visualize the three channels of YOLOv5 backbone**"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "!python demo/featmap_vis_demo.py data/cat/images/IMG_20221020_112705.jpg \\\n",
+    "                                 configs/yolov5/yolov5_s-v61_fast_1xb12-40e_cat.py \\\n",
+    "                                 work_dirs/yolov5_s-v61_fast_1xb12-40e_cat/epoch_40.pth \\\n",
+    "                                 --target-layers backbone \\\n",
+    "                                 --channel-reduction squeeze_mean"
+   ]
+  },
+  {
+   "attachments": {},
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "<div align=center>\n",
+    "<img src=\"https://user-images.githubusercontent.com/17425982/220292217-b343a6f4-0c88-4fdb-9680-35d0ff8e5bdb.png\" width=\"800\" alt=\"image\"/>\n",
+    "</div>\n",
+    "\n",
+    "The result will be saved to the output folder in current path. Three output feature maps plotted in the above figure correspond to small, medium and large output feature maps. As the backbone of this training is not actually involved in training, it can be seen from the above figure that the big object cat is predicted on the small feature map, which is in line with the idea of hierarchical detection of object detection.\n",
+    "\n",
+    "**2. Visualize the three channels of YOLOv5 neck**"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "!python demo/featmap_vis_demo.py data/cat/images/IMG_20221020_112705.jpg \\\n",
+    "                                 configs/yolov5/yolov5_s-v61_fast_1xb12-40e_cat.py \\\n",
+    "                                 work_dirs/yolov5_s-v61_fast_1xb12-40e_cat/epoch_40.pth \\\n",
+    "                                 --target-layers neck \\\n",
+    "                                 --channel-reduction squeeze_mean"
+   ]
+  },
+  {
+   "attachments": {},
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "<div align=center>\n",
+    "<img src=\"https://user-images.githubusercontent.com/17425982/220293382-0a241415-e717-4688-a718-5f6d5c844785.png\" width=\"800\" alt=\"image\"/>\n",
+    "</div>\n",
+    "\n",
+    "As can be seen from the above figure, because neck is involved in training, and we also reset anchor, the three output feature maps are forced to simulate the same scale object, resulting in the three output maps of neck are similar, which destroys the original pre-training distribution of backbone. At the same time, it can also be seen that 40 epochs are not enough to train the above dataset, and the feature maps do not perform well.\n",
+    "\n",
+    "**3. Grad-Based CAM visualization**\n",
+    "\n",
+    "Based on the above feature map visualization, we can analyze Grad CAM at the feature layer of bbox level.\n",
+    "\n",
+    "Install `grad-cam` package:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "%pip install \"grad-cam\""
+   ]
+  },
+  {
+   "attachments": {},
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "(a) View Grad CAM of the minimum output feature map of the neck"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "!python demo/boxam_vis_demo.py data/cat/images/IMG_20221020_112705.jpg \\\n",
+    "                                configs/yolov5/yolov5_s-v61_fast_1xb12-40e_cat.py \\\n",
+    "                                work_dirs/yolov5_s-v61_fast_1xb12-40e_cat/epoch_40.pth \\\n",
+    "                                --target-layer neck.out_layers[2]"
+   ]
+  },
+  {
+   "attachments": {},
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "9v-dMkePvHMg"
+   },
+   "source": [
+    "<div align=center>\n",
+    "<img src=\"https://user-images.githubusercontent.com/17425982/220298462-b0631f27-2366-4864-915a-a4ee21acd4b9.png\" width=\"800\" alt=\"image\"/>\n",
+    "</div>\n",
+    "\n",
+    "(b) View Grad CAM of the medium output feature map of the neck"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "cellView": "form",
+    "colab": {
+     "base_uri": "https://localhost:8080/"
+    },
+    "id": "p9H9u0A-3KAD",
+    "outputId": "32ca5a56-052f-4930-f53c-41cc3a9dc619"
+   },
+   "outputs": [],
+   "source": [
+    "!python demo/boxam_vis_demo.py data/cat/images/IMG_20221020_112705.jpg \\\n",
+    "                               configs/yolov5/yolov5_s-v61_fast_1xb12-40e_cat.py \\\n",
+    "                               work_dirs/yolov5_s-v61_fast_1xb12-40e_cat/epoch_40.pth \\\n",
+    "                               --target-layer neck.out_layers[1]"
+   ]
+  },
+  {
+   "attachments": {},
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "(c) View Grad CAM of the maximum output feature map of the neck"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "cellView": "form",
+    "colab": {
+     "base_uri": "https://localhost:8080/"
+    },
+    "id": "MrKan1U43uUY",
+    "outputId": "690f8414-a76b-4fa6-e600-7cc874ce1914"
+   },
+   "outputs": [],
+   "source": [
+    "!python demo/boxam_vis_demo.py data/cat/images/IMG_20221020_112705.jpg \\\n",
+    "                               configs/yolov5/yolov5_s-v61_fast_1xb12-40e_cat.py \\\n",
+    "                               work_dirs/yolov5_s-v61_fast_1xb12-40e_cat/epoch_40.pth \\\n",
+    "                               --target-layer neck.out_layers[0]"
+   ]
+  },
+  {
+   "attachments": {},
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "<div align=center>\n",
+    "<img src=\"https://user-images.githubusercontent.com/17425982/220297905-e23369db-d383-48f9-b15e-528a70ec7b23.png\" width=\"800\" alt=\"image\"/>\n",
+    "</div>\n",
+    "\n",
+    "## EasyDeploy deployment\n",
+    "\n",
+    "Here we'll use MMYOLO's [EasyDeploy](../../../projects/easydeploy/) to demonstrate the transformation deployment and basic inference of model.\n",
+    "\n",
+    "First you need to follow EasyDeploy's [basic documentation](../../../projects/easydeploy/docs/model_convert.md) controls own equipment installed for each library.\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "%pip install onnx\n",
+    "%pip install onnx-simplifier # Install if you want to use simplify\n",
+    "%pip install tensorrt        # If you have GPU environment and need to output TensorRT model you need to continue execution"
+   ]
+  },
+  {
+   "attachments": {},
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Once installed, you can use the following command to transform and deploy the trained model on the cat dataset with one click. The current ONNX version is 1.13.0 and TensorRT version is 8.5.3.1, so keep the `--opset` value of 11. The remaining parameters need to be adjusted according to the config used. Here we export the CPU version of ONNX with the `--backend` set to 1."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "cellView": "form",
+    "colab": {
+     "base_uri": "https://localhost:8080/",
+     "height": 534
+    },
+    "id": "YsRFEecU5C0w",
+    "outputId": "c26011d4-2836-4715-cd6b-68836294db33"
+   },
+   "outputs": [],
+   "source": [
+    "!python projects/easydeploy/tools/export.py \\\n",
+    "\t    configs/yolov5/yolov5_s-v61_fast_1xb12-40e_cat.py \\\n",
+    "\t    work_dirs/yolov5_s-v61_fast_1xb12-40e_cat/epoch_40.pth \\\n",
+    "\t    --work-dir work_dirs/yolov5_s-v61_fast_1xb12-40e_cat \\\n",
+    "        --img-size 640 640 \\\n",
+    "        --batch 1 \\\n",
+    "        --device cpu \\\n",
+    "        --simplify \\\n",
+    "\t    --opset 11 \\\n",
+    "\t    --backend 1 \\\n",
+    "\t    --pre-topk 1000 \\\n",
+    "\t    --keep-topk 100 \\\n",
+    "\t    --iou-threshold 0.65 \\\n",
+    "\t    --score-threshold 0.25\n"
+   ]
+  },
+  {
+   "attachments": {},
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "q1EY415x3Idx"
+   },
+   "source": [
+    "On success, you will get the converted ONNX model under `work-dir`, which is named `end2end.onnx` by default.\n",
+    "\n",
+    "Let's use `end2end.onnx` model to perform a basic image inference:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "!python projects/easydeploy/tools/image-demo.py \\\n",
+    "        data/cat/images/IMG_20210728_205312.jpg \\\n",
+    "        configs/yolov5/yolov5_s-v61_fast_1xb12-40e_cat.py \\\n",
+    "        work_dirs/yolov5_s-v61_fast_1xb12-40e_cat/end2end.onnx \\\n",
+    "        --device cpu"
+   ]
+  },
+  {
+   "attachments": {},
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "IrjiBa5YwDQM"
+   },
+   "source": [
+    "After successful inference, the result image will be generated in the `output` folder of the default MMYOLO root directory. If you want to see the result without saving it, you can add `--show` to the end of the above command. For convenience, the following is the generated result.\n",
+    "\n",
+    "<div align=center>\n",
+    "<img src=\"https://user-images.githubusercontent.com/7219519/221061210-b91e0b5b-652d-4dfc-8451-86a9a36f7d04.png\" width=\"800\" alt=\"image\"/>\n",
+    "</div>\n",
+    "\n",
+    "Let's go on to convert the engine file for TensorRT, because TensorRT needs to be specific to the current environment and deployment version, so make sure to export the parameters, here we export the TensorRT8 file, the `--backend` is 2."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "id": "d8zxczqiBLoB"
+   },
+   "outputs": [],
+   "source": [
+    "!python projects/easydeploy/tools/export.py \\\n",
+    "        configs/yolov5/yolov5_s-v61_fast_1xb12-40e_cat.py \\\n",
+    "        work_dirs/yolov5_s-v61_fast_1xb12-40e_cat/epoch_40.pth \\\n",
+    "        --work-dir work_dirs/yolov5_s-v61_fast_1xb12-40e_cat \\\n",
+    "        --img-size 640 640 \\\n",
+    "        --batch 1 \\\n",
+    "        --device cuda:0 \\\n",
+    "        --simplify \\\n",
+    "        --opset 11 \\\n",
+    "        --backend 2 \\\n",
+    "        --pre-topk 1000 \\\n",
+    "        --keep-topk 100 \\\n",
+    "        --iou-threshold 0.65 \\\n",
+    "        --score-threshold 0.25"
+   ]
+  },
+  {
+   "attachments": {},
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "The resulting `end2end.onnx` is the ONNX file for the TensorRT8 deployment, which we will use to complete the TensorRT engine transformation."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "colab": {
+     "base_uri": "https://localhost:8080/",
+     "height": 1000
+    },
+    "id": "QFh8rIsX_kVw",
+    "outputId": "c5bd6929-03a8-400e-be1e-581f32b23f61"
+   },
+   "outputs": [],
+   "source": [
+    "!python projects/easydeploy/tools/build_engine.py \\\n",
+    "        work_dirs/yolov5_s-v61_fast_1xb12-40e_cat/end2end.onnx \\\n",
+    "        --img-size 640 640 \\\n",
+    "        --device cuda:0"
+   ]
+  },
+  {
+   "attachments": {},
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Successful execution will generate the `end2end.engine` file under `work-dir`:\n",
+    "\n",
+    "```shell\n",
+    "work_dirs/yolov5_s-v61_fast_1xb12-40e_cat\n",
+    "├── 202302XX_XXXXXX\n",
+    "│   ├── 202302XX_XXXXXX.log\n",
+    "│   └── vis_data\n",
+    "│       ├── 202302XX_XXXXXX.json\n",
+    "│       ├── config.py\n",
+    "│       └── scalars.json\n",
+    "├── best_coco\n",
+    "│   └── bbox_mAP_epoch_40.pth\n",
+    "├── end2end.engine\n",
+    "├── end2end.onnx\n",
+    "├── epoch_30.pth\n",
+    "├── epoch_40.pth\n",
+    "├── last_checkpoint\n",
+    "└── yolov5_s-v61_fast_1xb12-40e_cat.py\n",
+    "```\n",
+    "\n",
+    "Let's continue use `image-demo.py` for image inference:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "cellView": "form",
+    "colab": {
+     "base_uri": "https://localhost:8080/",
+     "height": 1000
+    },
+    "id": "rOqXEi-jAI7Y",
+    "outputId": "2a21aaaa-d4ba-498a-f985-2a6a2b8d348f"
+   },
+   "outputs": [],
+   "source": [
+    "!python projects/easydeploy/tools/image-demo.py \\\n",
+    "        data/cat/images/IMG_20210728_205312.jpg \\\n",
+    "        configs/yolov5/yolov5_s-v61_fast_1xb12-40e_cat.py \\\n",
+    "        work_dirs/yolov5_s-v61_fast_1xb12-40e_cat/end2end.engine \\\n",
+    "        --device cuda:0"
+   ]
+  },
+  {
+   "attachments": {},
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "ocHGUUEA_TjI"
+   },
+   "source": [
+    "<div align=center>\n",
+    "<img src=\"https://user-images.githubusercontent.com/7219519/221061291-e7490bb6-5f0c-45ab-9fc4-caf2b62419d6.png\" width=\"800\" alt=\"image\"/>\n",
+    "</div>\n",
+    "\n",
+    "This completes the transformation deployment of the trained model and checks the inference results. This is the end of the tutorial.\n",
+    "\n",
+    "If you encounter problems during training or testing, please check the [common troubleshooting steps](https://mmyolo.readthedocs.io/en/dev/recommended_topics/troubleshooting_steps.html) first and feel free to open an [issue](https://github.com/open-mmlab/mmyolo/issues/new/choose) if you still can't solve it.\n"
+   ]
+  }
+ ],
+ "metadata": {
+  "accelerator": "GPU",
+  "colab": {
+   "provenance": [],
+   "toc_visible": true
+  },
+  "gpuClass": "standard",
+  "kernelspec": {
+   "display_name": "Python 3",
+   "name": "python3"
+  },
+  "language_info": {
+   "name": "python"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 0
+}
diff --git a/mmdetection_practice/third_party/mmyolo/demo/boxam_vis_demo.py b/mmdetection_practice/third_party/mmyolo/demo/boxam_vis_demo.py
new file mode 100644
index 0000000..278574f
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/demo/boxam_vis_demo.py
@@ -0,0 +1,276 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+"""This script is in the experimental verification stage and cannot be
+guaranteed to be completely correct. Currently Grad-based CAM and Grad-free CAM
+are supported.
+
+The target detection task is different from the classification task. It not
+only includes the AM map of the category, but also includes information such as
+bbox and mask, so this script is named bboxam.
+"""
+
+import argparse
+import os.path
+import warnings
+from functools import partial
+
+import cv2
+import mmcv
+from mmengine import Config, DictAction, MessageHub
+from mmengine.utils import ProgressBar
+
+try:
+    from pytorch_grad_cam import AblationCAM, EigenCAM
+except ImportError:
+    raise ImportError('Please run `pip install "grad-cam"` to install '
+                      'pytorch_grad_cam package.')
+
+from mmyolo.utils.boxam_utils import (BoxAMDetectorVisualizer,
+                                      BoxAMDetectorWrapper, DetAblationLayer,
+                                      DetBoxScoreTarget, GradCAM,
+                                      GradCAMPlusPlus, reshape_transform)
+from mmyolo.utils.misc import get_file_list
+
+GRAD_FREE_METHOD_MAP = {
+    'ablationcam': AblationCAM,
+    'eigencam': EigenCAM,
+    # 'scorecam': ScoreCAM, # consumes too much memory
+}
+
+GRAD_BASED_METHOD_MAP = {'gradcam': GradCAM, 'gradcam++': GradCAMPlusPlus}
+
+ALL_SUPPORT_METHODS = list(GRAD_FREE_METHOD_MAP.keys()
+                           | GRAD_BASED_METHOD_MAP.keys())
+
+IGNORE_LOSS_PARAMS = {
+    'yolov5': ['loss_obj'],
+    'yolov6': ['loss_cls'],
+    'yolox': ['loss_obj'],
+    'rtmdet': ['loss_cls'],
+    'yolov7': ['loss_obj'],
+    'yolov8': ['loss_cls'],
+    'ppyoloe': ['loss_cls'],
+}
+
+# This parameter is required in some algorithms
+# for calculating Loss
+message_hub = MessageHub.get_current_instance()
+message_hub.runtime_info['epoch'] = 0
+
+
+def parse_args():
+    parser = argparse.ArgumentParser(description='Visualize Box AM')
+    parser.add_argument(
+        'img', help='Image path, include image file, dir and URL.')
+    parser.add_argument('config', help='Config file')
+    parser.add_argument('checkpoint', help='Checkpoint file')
+    parser.add_argument(
+        '--method',
+        default='gradcam',
+        choices=ALL_SUPPORT_METHODS,
+        help='Type of method to use, supports '
+        f'{", ".join(ALL_SUPPORT_METHODS)}.')
+    parser.add_argument(
+        '--target-layers',
+        default=['neck.out_layers[2]'],
+        nargs='+',
+        type=str,
+        help='The target layers to get Box AM, if not set, the tool will '
+        'specify the neck.out_layers[2]')
+    parser.add_argument(
+        '--out-dir', default='./output', help='Path to output file')
+    parser.add_argument(
+        '--show', action='store_true', help='Show the CAM results')
+    parser.add_argument(
+        '--device', default='cuda:0', help='Device used for inference')
+    parser.add_argument(
+        '--score-thr', type=float, default=0.3, help='Bbox score threshold')
+    parser.add_argument(
+        '--topk',
+        type=int,
+        default=-1,
+        help='Select topk predict resutls to show. -1 are mean all.')
+    parser.add_argument(
+        '--max-shape',
+        nargs='+',
+        type=int,
+        default=-1,
+        help='max shapes. Its purpose is to save GPU memory. '
+        'The activation map is scaled and then evaluated. '
+        'If set to -1, it means no scaling.')
+    parser.add_argument(
+        '--preview-model',
+        default=False,
+        action='store_true',
+        help='To preview all the model layers')
+    parser.add_argument(
+        '--norm-in-bbox', action='store_true', help='Norm in bbox of am image')
+    parser.add_argument(
+        '--cfg-options',
+        nargs='+',
+        action=DictAction,
+        help='override some settings in the used config, the key-value pair '
+        'in xxx=yyy format will be merged into config file. If the value to '
+        'be overwritten is a list, it should be like key="[a,b]" or key=a,b '
+        'It also allows nested list/tuple values, e.g. key="[(a,b),(c,d)]" '
+        'Note that the quotation marks are necessary and that no white space '
+        'is allowed.')
+    # Only used by AblationCAM
+    parser.add_argument(
+        '--batch-size',
+        type=int,
+        default=1,
+        help='batch of inference of AblationCAM')
+    parser.add_argument(
+        '--ratio-channels-to-ablate',
+        type=int,
+        default=0.5,
+        help='Making it much faster of AblationCAM. '
+        'The parameter controls how many channels should be ablated')
+
+    args = parser.parse_args()
+    return args
+
+
+def init_detector_and_visualizer(args, cfg):
+    max_shape = args.max_shape
+    if not isinstance(max_shape, list):
+        max_shape = [args.max_shape]
+    assert len(max_shape) == 1 or len(max_shape) == 2
+
+    model_wrapper = BoxAMDetectorWrapper(
+        cfg, args.checkpoint, args.score_thr, device=args.device)
+
+    if args.preview_model:
+        print(model_wrapper.detector)
+        print('\n Please remove `--preview-model` to get the BoxAM.')
+        return None, None
+
+    target_layers = []
+    for target_layer in args.target_layers:
+        try:
+            target_layers.append(
+                eval(f'model_wrapper.detector.{target_layer}'))
+        except Exception as e:
+            print(model_wrapper.detector)
+            raise RuntimeError('layer does not exist', e)
+
+    ablationcam_extra_params = {
+        'batch_size': args.batch_size,
+        'ablation_layer': DetAblationLayer(),
+        'ratio_channels_to_ablate': args.ratio_channels_to_ablate
+    }
+
+    if args.method in GRAD_BASED_METHOD_MAP:
+        method_class = GRAD_BASED_METHOD_MAP[args.method]
+        is_need_grad = True
+    else:
+        method_class = GRAD_FREE_METHOD_MAP[args.method]
+        is_need_grad = False
+
+    boxam_detector_visualizer = BoxAMDetectorVisualizer(
+        method_class,
+        model_wrapper,
+        target_layers,
+        reshape_transform=partial(
+            reshape_transform, max_shape=max_shape, is_need_grad=is_need_grad),
+        is_need_grad=is_need_grad,
+        extra_params=ablationcam_extra_params)
+    return model_wrapper, boxam_detector_visualizer
+
+
+def main():
+    args = parse_args()
+
+    # hard code
+    ignore_loss_params = None
+    for param_keys in IGNORE_LOSS_PARAMS:
+        if param_keys in args.config:
+            print(f'The algorithm currently used is {param_keys}')
+            ignore_loss_params = IGNORE_LOSS_PARAMS[param_keys]
+            break
+
+    cfg = Config.fromfile(args.config)
+    if args.cfg_options is not None:
+        cfg.merge_from_dict(args.cfg_options)
+
+    if not os.path.exists(args.out_dir) and not args.show:
+        os.mkdir(args.out_dir)
+
+    model_wrapper, boxam_detector_visualizer = init_detector_and_visualizer(
+        args, cfg)
+
+    # get file list
+    image_list, source_type = get_file_list(args.img)
+
+    progress_bar = ProgressBar(len(image_list))
+
+    for image_path in image_list:
+        image = cv2.imread(image_path)
+        model_wrapper.set_input_data(image)
+
+        # forward detection results
+        result = model_wrapper()[0]
+
+        pred_instances = result.pred_instances
+        # Get candidate predict info with score threshold
+        pred_instances = pred_instances[pred_instances.scores > args.score_thr]
+
+        if len(pred_instances) == 0:
+            warnings.warn('empty detection results! skip this')
+            continue
+
+        if args.topk > 0:
+            pred_instances = pred_instances[:args.topk]
+
+        targets = [
+            DetBoxScoreTarget(
+                pred_instances,
+                device=args.device,
+                ignore_loss_params=ignore_loss_params)
+        ]
+
+        if args.method in GRAD_BASED_METHOD_MAP:
+            model_wrapper.need_loss(True)
+            model_wrapper.set_input_data(image, pred_instances)
+            boxam_detector_visualizer.switch_activations_and_grads(
+                model_wrapper)
+
+        # get box am image
+        grayscale_boxam = boxam_detector_visualizer(image, targets=targets)
+
+        # draw cam on image
+        pred_instances = pred_instances.numpy()
+        image_with_bounding_boxes = boxam_detector_visualizer.show_am(
+            image,
+            pred_instances,
+            grayscale_boxam,
+            with_norm_in_bboxes=args.norm_in_bbox)
+
+        if source_type['is_dir']:
+            filename = os.path.relpath(image_path, args.img).replace('/', '_')
+        else:
+            filename = os.path.basename(image_path)
+        out_file = None if args.show else os.path.join(args.out_dir, filename)
+
+        if out_file:
+            mmcv.imwrite(image_with_bounding_boxes, out_file)
+        else:
+            cv2.namedWindow(filename, 0)
+            cv2.imshow(filename, image_with_bounding_boxes)
+            cv2.waitKey(0)
+
+        # switch
+        if args.method in GRAD_BASED_METHOD_MAP:
+            model_wrapper.need_loss(False)
+            boxam_detector_visualizer.switch_activations_and_grads(
+                model_wrapper)
+
+        progress_bar.update()
+
+    if not args.show:
+        print(f'All done!'
+              f'\nResults have been saved at {os.path.abspath(args.out_dir)}')
+
+
+if __name__ == '__main__':
+    main()
diff --git a/mmdetection_practice/third_party/mmyolo/demo/demo.jpg b/mmdetection_practice/third_party/mmyolo/demo/demo.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..dd613cee3bc13a3677908d7d6f1899e8278a4b47
GIT binary patch
literal 259865
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%0Aw0)EYPm1RqRD}_!C
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
Ybw+QeO1tFGlw$k9m}}{4>;K;b0BR+IBLDyZ

literal 0
HcmV?d00001

diff --git a/mmdetection_practice/third_party/mmyolo/demo/demo.mp4 b/mmdetection_practice/third_party/mmyolo/demo/demo.mp4
new file mode 100644
index 0000000000000000000000000000000000000000..6c06d15d941c640e15785e0416818181313d83b7
GIT binary patch
literal 297688
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%0A;|l8!(uePxI`3dym*4ShYqGo<OTtgf
zJV%RN&XHGHzOP$XzQ4m^=f?#zerDGjKUjaED<;_QUe@NlOXL5Y@wvg$p7r|C<!_5V
zUU=gW*|Q;%<D|h!Q-0eS{=r8Y8TDtS*tb4hUZJqOM`in&quyWqmNl(+dC8%eoG~Xw
z=GMozeZM@8&Crnzkco8me!a-!!^wX-m-pXaFsJ_AkGVXbu5gCv+Xx(St7Kf-WA?A^
z_G5uxQ_gm~8Vh`0|F`aEyUo8l_k(u5FOLtHRX?jbxTvNoZ$p`to7?+kv8n4jcfGMZ
zQ5UCMRqD3twTj}`IwmUz#YawD%)#|3W-(izos3FnzjQM8`}F27_Yy-+{>^-Hw2$?M
zf!@Bbu=|ha<ea-^@x%XbkM(W?{f9bFQn}9jXnS?B_o-zclcIv>ud*ZVw+?unS=WCh
z!R4sWGS`R6R@?qWExdNG@#Ymx8}S#jO1Zx8?m5q<7$kUd=dx`@oytz%Go%#W=U)#E
z+iAA@m%W|C@wzRCBJQ$Fztpky`m(@M+x);&GZVKrayKI`OI%4`*PO-PRW;)t&-bg(
zm%Y?72|Kdt9p~(aSCg+!zL)$<p~bwzbA7?5qc?t?_;Ff=`IgtajE0u<GY9WxB+9)s
zHVECZ{qCRV+{=B{g_cgfxg<Z+!F+>J*{h{9xw^ACGn;2Oe%Wy%P`~Eik{tQchsB;L
zOS5HmJYql7uG*8p=Vu(c;WhVH-&1i<4+SK1FO%uma`kffVg;$_S$@qY*QPfAPh4)h
z;YGz35l@48UmEIF_^KpVRI2Bk)@+%zdrM*WFU!E+O8&>h>r3XCuIewWPQAhSNi)i9
zqPex!3G1mTF|MMKeP%y07XSGzy_whce8cotm)E}IDE;8}@kyqR#aGMfwg<PjYeoHc
z6Y9)%PJI40^u5F6%N(})TXoE4hn!CJXk)qaqixc1_w`!$(k-59$FbL4TXcHT{mT|g
zR|^j6USA*Dr>rQYd%}X*`iQ@BRq0;QgH}c*&vtd_=Z8(_Zhs-copQI#B)Lx@;lnBY
znfvOOp1yxD@u|w<tM-{`%0X|7A85}_H=B`uJeDV*)yMeO*<^q7m-6h44#)KVx7=gg
z<y8M-PS1;Tow*#+r#=1~>8`tBRxRf;ZR5_m`F%Y9C(e<(;d0y}cw^T)h16qgavc{J
z?taj6MfIZB_B<(t*Hu@t*5n+iDxdkN*dYI@6nkRZmm|ltC0?kAFPm%MQOFhe@1y&{
zbBQm%=Wtwj-F!}7d`_6X#I(GrSH7mG-CZ(S>ve8l+r-J*sb9tKZ)#_oHD%hjWhcJm
zp7r_j<>TH9c_+n}3iHhhk^9B@fYC2~>h)*37QQOCjrV_<;rPaUwp4@Fe)o+%2S58A
zwAtW$#NFiv^J>YDx14rdn5TKdgQ-wwe%yo8lg=?8Zk2Nup7Ag2XTz<Pe9y|S^O{}T
z;;S`Z-L5sUsax)KgiHS$!)<Stn=>nU+g#O%$?RFGTY2q5bc#pY1N*$Cae~b@%a*^W
zF7-9)dLJ%#;40smvbbiKjNh78>&^!4?iNxNeb9ceA?lp^9k&(SI+sr|99gM5bJNl@
z8e!#k%e+@AYu7m3yl3XRjj!~|(y6*0V&#S_{_^eBn(S?Obam6#dDGb0C-yE0bp2eY
z5gH^v(Y2^T)jG7o=h33N9n2;SC4yP1&XV040`v3D{PdfwZQtnoeNBxC`CoGWQP2Ie
zk&piyKbv<*=J4{12i(6T20XZ6S=aWwYqPK9l7DRHr#Gtp+OqmvTFLgiU%c6M%&svX
z5uW+EcKcDW&cIuf!qzNlpKbB{<HtAigcx5vn!V*-)sp-IU#0hHJn!E`2W~iXF0|;&
zPR^`}zmKq=-TeNp*P96!xL1A6f6ww+=gzwOOH5A0mkB$vCq?UhT*)=@h`5zp+yBC2
zlRt6HRC>IqLvQJ1-d6{;=iB{T`}q8Z;@=yOKVnzx`%t=}Ff%-E5x>RDjj2DMXFod`
z74S1%M6{!Dp@-Rvm?JWICoWVbPu{|utn^ai;LKBp9Lrc<WzNYie7a@hHRga_o#*Yp
z>T5D^{WKG0t$5&Z+v}>6`$bMOzpkgVGEy_;-Fdkei8n0RSD|on!4}3tQ>H5>>&oO>
zD%Kt{`Ytg4!wwIf$<{g(o@jJQ>TLLFru*!`A-xMuk-EJXXDfNG|FwV5t$Cr98<Zbv
z6mY9ISqID%O>22|=Hj<{<;8oJFVnqv_L%OblQu_kPEI_Z^;m($Kj~CO^^Zld@2jRi
zQ!xA_CbsB=?eWA<rwu3U7S`F8Y3uf1<Em}G^7_7S#n&~}6eDHp9<XZPVtSCDUA@lv
zcdYGAIn55{r%#`KTqr1-wAJ~jL$BM1X=}{*|8L}Oy0Uz7@2@h>@XPW|fvevb+lrO0
z=YDYf22+@^mDr2V<wv>siucVuq9F5D?U~S#GJ~c?llo^|xMca5F<)Rup=w8UX_oI&
z(dG7T&6i^ST~l+Fdt3YB$m}OPhv&+Bt?Ti5p}tCq{oNOlcT1Tw1)@JaF8}rYqv53u
zla<qcYV2cc{4ARKY5zC#9Y+p-59284b5^U9=q|fp(Aga}eab%;&5jM9R(`fCS;=$H
ztxMK&l8b&+_U=R3bC>7;a`$?B-gk-iQl@FIuiG!L{2wLGyGTu3PbTDt()%F03@?}C
zixzg9*Q*${6gM27zfk>?+j5&Z`@BDtEoNKzd2OG4V94?n-_}S>53=6SUn1H3w4nRF
zc9gB{q_=8UWVh!0W%}s%_^RNlj%#k>SL)UZg>b06*}BB^-48M8ryj>=HWq12kaloW
zS~TZuy4a<kPnqgJ1g<JH34JWUcIV0U{cp;}dOxZCifpnhy~r76eWuGis_TC7I*~cM
z?gd|ojQlYF_48SYS#2A$>f{cF>_57W+aSeCCt>l!ThlqSw{ZPC_nm{Wj8$H-%CgO*
z)$qi6gJruozTQg;u)qG{Z0fQr=f1vW@zpb2CF%2v<%rkWPqWYTH08Dk{8RcqcYVrw
zhhl3+@#+aef>UQ%Je_L1u>Ox@T}wjaMeAn*L80H9yB<y}7hzH3E(`Xz^zc8L+T>uG
ze?ITbqHjtTZ)R9}i3XetDT|wXx1cgyO>K_fu@mui6+hCh-EnwuntLAmO-JG47aiTF
zV*jRi{IObpNnrxd!A<=qU+ppxpBIs|&FINBf9@L>zNAL+U)<ndVa>Jb%vpcmy6bf+
zQ$r7^n0)`sv7qMPl}r4W9-rgx-TbybIrMy8W5(C(+g{JDllEW7Z&7#J-K_Rv49Ciu
zj!O?{+4r+O>DVe3sml>P$G+>Cb>?>=QE!WkSs~o#CLXOnCBVn<)rF}jy=j4teudvV
zsiRL9&s?=pxbe5nm*1L?Q|yJJ9x9o2Fg>%=%e72kkDCx(*?-~cX@{Tgj}LFTrqlPk
zKEU+T?g<tp_W$mA_MSCkpLi_ngX)@=w)I8A&O5#q{oq-Ah>@Es)8c6Im->Y>?oAii
zbgj{JiFUQg>Qm=(lxAKNJRs%2q4>(`z^O}gX3mwJ!E)eKX-<dEd(V$yH~U)D7*^Mw
zexshWD{4yJDei`+D;4%N%J+n4w+Ysis+GUB{`+U$^ff{=sw#4$_T8CYc5`;9Vu0PR
zr1VL1lo-l>IsRapv9i7_IAYyRL$O_diYui8uZNUzXI!3n?GpQ*JJTjutUWdPck|WO
zmnj=BX?sgsu4Vf5`nAlukowqbYj;mMdv;!oaJIF>{C&qlL}Ya~THf1e`_16R_xXM)
zFZXNToo(M)++<|5PU>#1WJl;<5$pQ_i<V4X8oZfb;_zv~16wDmNAZ*}w2FD1-?(E3
zSFuU^qXjV`st;o4Jz>go+r~M6k4d?cfSvl>R+k-I>-eYLxy{Y;D)z;7{&r&~o&Dbz
z9CcASSZmO~<I5eJ7KZ8lS7)B(tg_oQX~UZKX#JO;k5q(9+E&gLE-3nXi9N`7kD9Ve
zdsnjZ;go#oo?^+v&5bku=FCzkFJ8`ct~cgiq@!QswX5rA9IU?)>*QDG^Sb$P32VGa
z@T|$x-_-RNZ1ek&{Z+%@l6u7E9d0o<OV+3@eZ?2!;pX#tr|wtf|G6(BHa!p6;b)Xp
znz}ZA-;2Iu+de;x&pQ2I^L*9Pt_dAqKmGi{b0tE&er0p%W2<W$-sEJ4Z7{CmP;%9u
zx_x=A>(a^zUJ`~Ej5Zq<E!BAV|G3o&!SBs{myfm1n4I8aSnH)9vV49<qe|xd4f9nj
zBCn=MKIVCtv3Xb8ZRtj@U7u&?&H5?M<@?_x-6d98Q#bD6A#>jaO?4Le!sg*;Jf5xk
zwtvGp>m96RGIK7~%<k)|v)#J%Yw4!-j(=OuSle&W_mkgz;%aB#yWeIaH?6&1GClqK
zU3}{jwRc<A)c(7`EYA_J_r+i4Y0um4=Gk)pyc4-^k$2W2TmISF5+c&|p9}dv#z!8V
z-_xdfNi@!RuH(TBzPJx8?~|7V^>Q{<MQO(}9g**<7g%F@Imz(Z*|p9$T$kDYc_Mqo
ztGwi)X3w@IjogvXTfcU!_{AB~#2~S7bMFpgs}26Q1<yU<Oxnc9rqF3R$v{e<KQ?II
z!dK^*s~G&R#aZ}BY@H#OxLZwR@yw^HU*9`!T)*N1H|LaZ_Wiregq>Y)^|8AYzYtek
zVN{jHY;|Uva{8UPBd@kk-5z`^XJfCjhladr`Nlo047)x|{9N1Ua`MJw-RS<rr{{uL
z4_|MQ`6P5FP222lfz|Kh%T)42O}`vHIr&`To*#mfeECgM?%$aDdhzaUTk@T)H}ovJ
zd}ZHz$uf@G<$P(MKO8vDz92T>rB9@5dqBK(oc|lkxq6DGH`Ok>9ou(*;{Wh-I(@fS
zzp<Gq7RjS2xcGI<+ZA69XtJJUwJ6-XW&5I@vLe1inZZ}4Hz(bVXnkd4wAky9@$D6X
zB5w5;BV5<!GuZrR3@Pu~(z|(uwD-zo-3wTAwl%vvPHyFk__tW-#)9BT-~LvfKW&a#
zqUX&+J(ftBoY%ekZV!8Cr<#>G`!>~Wt#>OX_%$r}%$A^ZJ?!1HZoRl!&!-zm{<kh-
zb`U#UEn$55{O{DN;DCQ@>91wOew#;c*ORUN{Z{YNXFK0%=Vj&I&d|MK8~r9R;EezN
zdCyC&yfZ}Dzr226T@^fuYxcGxiFNmHE2UjL^Lv%(fo0qcm!4nv{UOpS`tmvDdOqX5
z85e`26&Ru-rKAsCTeoNCqW%A}wiQ)7AH4M-w4OcpSf1UaWWVR$nW@%&iq|@dr?TBF
z$*xa2_9MDLK&I}_AHU{r#s}wHg`AqVhv%f)Gdnr+&($wJ^@SB(dCL3pMo3YMkj9yU
z5(|eD3*(yG(@j=Q-*xNxHDLt-neD&US3H*aziJtyH?OQj*TK#$i{?t7;;-HG%}`t*
zK%l1WuSNPr%^6Ra0~xqx8$a?AU{Jo5#{W<ChOyLQciCfRmWlk`9QS=*O)C1a#mhtE
zEnm&yW77Yx?tG^i{dU#)QaQ&(KNbE8cUecDW^lN@{OtN*zlVlr=WAN6&uQT1dJ;S-
z%U5>t%$dI@FKeBw>GbyW)`N;WG!{=!WB4`yXrSG?^mM~salW16R@)C6FD<-x_uiyA
z#giu~+wS=)o};o@!kybQp7ZSjQ>Q$etqBu_f4ny0ukx0C^VXwzf=l^{4c|mNWA03`
z=zJwp`giH&7JW$zDa!|?-ph7tN_2_cP19I0HR_Oiu);Fy#*o;ai)p6!gf7;18oi#e
zeN*`ProVd*C4Y4JSl;mHm*5727gKr5qH6Yhe7=9m(pM#W=dAO$+PPN$qg}G}l(1_l
z-8<Yq%uX_tekVNb(Y)icrWVK>3Lke*=-!~Nc<XjrOhW!N@gM1P*1tF0%rmFtlK+>Q
zp3`e<6D1oJHm9@QN`3P($-<-Uww?BebxQq@k1WvO5Er?6Z0}^7oD42T7Y)l>%Cp1d
zrarZ}@ov-QYRA4D-<A}!;5YX9Z3|wp-}uSAVYAU>N7WCPXI_s!wYemU`Iid2j7)nT
zx2z89wXb!~J2oBYOE#BYQ1(wX*S>)NPUW$Sl@0uReipGmTH1VZ`NY>wTdwU}WOC>A
zUu)Sf)2}VHR+mYUXj{8s_f@T?!U+x;*Bs4`3tRs`z4zPnl6e|ZUyd|<@8Q#p*l$~3
z`LbeZD06lHV@9@p?Pe7Vex|0C+_W}z4(ys3(U@(iQ}}Ryu(|$&`}MDtmdj=ptu<d(
z>yox<hhLVq|M#B;J&$`1pSu4>Mljb|I$Eh#^qT!s@8x^A#rNkt;;fI4is(P&(9Fst
zUKDtoVaJjFXE`#@SJbgzC<}VjXY$YX^yiHaO*dasS>+ZyxntY$>_d#tJ{Rw_%}`k+
ze)xz>9LuYOWdib37N2?5cGCOr+@;momnI~$oIlSSzOq(zpTGMw?l3O1-x{4&Db6le
zPW3+XP}-psapSQfv*;b$BhmVileCu9Dv2*p{uq<W5S=RZBhdcX;h3wu+jFOR^w?W|
zubUqA*(@;W#5WG>rmVjkE+6$i-}haBb-|&FOxoYG*SYI`4=V~SSt#@B=!`Y28ehKt
z`j@qiWk2gxcm2No?EKHF7!S>Tz*Tl4tHyja@7j{P7H6K+I+jLhpPaJR_j}JZcg-u@
zsvN5QT_0ljpTtb4sbCTJdz+oNKkeJG%MNk8djtN($Y$o<KIA&P;1c`ns?M0DCfX|2
z?X|lfsKoc%pZPcEe&vQAmAPI$t)H^__UKB;b^YOc=V^LsYT&7iH7~0fuI~}*jWk_j
z%kx%a<@O(1XS944C_Zt2?_Fzr=s<TQUzwbC?2q_o8T;oIc69KuEPHy#<kglJ`o^Vc
zAq>XG3U?!?_;@`n(G|LRS9GCjC%3wp;MyJ&?H3`x%l=!Q$f_%jC_HQWB&_jRSeW;F
zjlu@st0(Ti`EmNO#Z2qv3^!*kwkZpiT)*8i;PtVDVw)H0k8WvP?t7-ZG<x1fUKypz
zjh{^o^$h;JxR<we^FgjfMib<l&z(J;I9+Egd-eSrrq)jbCN3;5naZ^y=-C4fQ@-Te
zjbB4GUPbOccxplG#SN_-H~!nJpJyulCm86Lv_~LAI{IU{%9p_N3n$;2kl^|0j$a9X
z<NsxHovV};bkmQX)Hm8bed7c>Z8`35^;whtF0I|YvUGk(^tmP6d*vSn9o#JJ`P4+|
z^@hGz!qL2U-5h((%ecR+mst2=!Mlnt4V$_X&VH!XnfGp{QQ;<M@AqGCn!Xma75~5I
zR4=y%caKcfR_5-VhYqg!KmDuFw<<R_SFV@R%$)JJ;+~s6-=4ZrNKnDQ)i7!Cq6RUA
zOFg?-G;hc#@9@ap(0tCwY90H#4_O)8zL)ZGzI~PLE&S~1mYl=2#kR{+pKK~mIr-B1
z{o4ND#|34+Hs#N@Ec_SuxgzpY-gDi=3+uL|2!<w_Jt@7R65(U8Bk}FTqRMGjYtxq(
zdS3s|yTc$S-z4p<P^3z7vukAX&v|SYUVopf$0Q`S?bP{|@k=*3^%S3aSLw`nwzm1U
zkjTv|_dZ?=)Y+x%n7Q%y#rJzc3c_nSMR%Y3lD$CW*2V(CgpdCgZN5BHaJK%0UlJ8Y
zYrNRf|E62)UuN_AXp3lySC+-r^#6`)Km60o@CjKWo}l8dXZBst!gkg6h5S1jpEa}l
zU2BQEvEhbKjcbs6reboH^Fn3e;}YB-CH~I;qRG@~@aC~x_|@cle!il`4v&pHPKD2M
z+A#CZEWJN}b*(vGJ~Fe~K5LS!=A-g<ZO`!Z1<YEDT(m6r&JX0*-uBe&<~*%kT(d6K
z+<f%2V0YUOL%FJLi7xm4<lZ+3IH}fU(z)2=*TIud9yz=0+n&;XcI$zKcAOInF5Ty5
zh>cRb+`)0;p2dQkCC9}lCI8*{_(8A#nueFN`I2m2skXdz`J-~{Z%K2M5}Sa^zDEo7
zJXaa0SKZfOxt1h9-`n)#BrEGXldpG&=1#9FeJ)Y^I&jCL%p)b!E<5kK^OW;??ys+3
zzPQerS6gPa%6r46uXjy?<mVM_RSmf@G5vsi(hO$vAo1$d84}TMB58}-*17rZW6IfZ
zd%A2+_TS{~7hUhUS{8p6F%Q3IdF4ivKZEq#V|G~?Iy-+&xqOxF$`O&^D=qIWPLysb
zxpg}6c=_GaxAUBOE@gbWDkJsu(3EHyk5BtQo}QvQG4R7yrqgdd&&*%m+&8sp#g$G&
zt?IL_O%hgzG~akm-e+>{tQt3y)^E1nTibX<j7|Pp+;N^~@;Nc+S!bdn!-aD$96okC
zl4C=rTd!(<yeVOiLH=c>5Z|Y>UO&!QC+5m5*i^^rUbxLQMd@LH(vDxM?>$y6O?F?m
z^#tD|C(Ya~&tI=!ka9^OUqAUs%X-myoR7A&uC|a~SGZ|;952h47aRKO#CZR91T~g;
zF&w=;H+b)v_HWm$RangzOSegO6u7lBaE0^uo5wR}XYVvB-Im6qa`3*s<ot+hkN-ct
zTrj0X_x|RNN3lw$UYo={n*8*h_}bcYm$!$^*8KSXzlvp{LtNm=Ip${){e6w{9-2+{
zvDJF;M{LDEj}1Hi=*=zsK0nLqY#2k+&fkXRZkEpC3P~+3&s{kyrHfyD|J~^EDzzt3
zDaTG*Ec(mok}bS<g5N0^t&qBSL2cgKS>Lzl*Zqh(d0=bU+V4kYv?|k&zYcF%lFXTY
zWom)PhyOv}FU~UOF`i$<Rn&O!j_b4NU#bUqzB+kEXW3pZ`0U)_`r_EGSVgnhB3cEx
zhEu~k-W~5`S>4wE^_}&-!^PJfnF8IH**+{vlJYv*u-?y%?T257y6p2Np|W3XX1o<L
z7Z=s)YkJ*%ZFJ&%&$L6A56Sx-Rji%AsqX7?h0>0v^@)9*XN&*uZGGQm-TU;%BGcM}
zTmNpv{C~RVv)-g{H}qY8_6G3Did)M5nJ*T6b@iT8a~e}G>{RK^KNS1;<Hk<@jl63%
zeK@ZDVL|b<bw0YPJ6&QMQ$5+I-pO3J&Fw%}0s{lrGROHHu7Wo6V`psFeqB0AAUiK`
zU-V@`wa3S<dmOuAymy-o&*$s!-tIbe&i~8qn5DlwAFTQ0#&B?x!oIhE-*`No&Xdy;
z*j2jmR(4qTt-K8NxnWO4WE@@ZP2s#^si?hBr*P3>UGswEZMGL@+--6STWH?J$51Dh
z|6#($@RqgWUm9xqIFmPYZ9Cqu`{Lxo#~BLVi}S7yYGY!Xoa5rC@mpZ~VgJBs{-K`f
zzc;Rt|LOK2qiBu9;e6&f`}rl=W|i(b{)t8Ypi^Z_di#mD`*=61J<`fCT41qY%h{+2
zNzHjZ`ioc^49f2~=6v;G<bNt&zGJn~hOgb(6}%Dk$JSS_2`Ib6&Zd~U+;PPU!3_n*
z2OlTx%IrNZ9mTmj>U^K!`*-eqFL@8?XjX69@npNsrwJL0SLa^}6n~KP{9wGM#ZRv?
zBg2C?8nbL>xZ51Kkj>2U^~ddbvv$pu`&O{|O}cy{$3w}t&qHmdFXCHW(swC{kwq-<
z(xI?~REa6#k29x!ygmQ?RU@{Fw|Tp^fAqNVJTYd&1QvyrCYdIRsSJ9I%lZOeew3a%
zea*J36JHe{?B#i9lgquB=eXFyU+Yh0{5R`gx_{a;N1uy}Iocca*#qCs?A4XC%9MP0
ztLPNJpA^%s+v|LFH@ekIUiY88RA<GN%*k<`4g2Q)j{W{-?c3Dkm@_9*Sx&n7*9*>=
zZl=8IW%<l$w|?&0bo|f1mQxnFmS)!!C$UCb3-p+{=Dv8t*KxV@!rMEQpMIY_vVEJy
zP3Fkp;{iDf-(BlwmEmA?`}WOgQbK@M@$35ZO#P*;Yi5Us%P77swJ(l0OWieh&xS|S
zE{T5CsQ=?xevoO29;0%f<l53bJ1)n5P0@FI`scdS!Ebuymd&QZJ1(D?8o?JPmA=P7
zc<PTVUHh5mI&QHY{&;V5`kt$s79Oco{4)3Yrc1G07Kw>GdiJZCJB7aO$lez=WsjQI
zii4XM%5+Vd^4Lyt^KIrr9i1J=pB&h*DMmW%>D-%7ZoIy?=JvDGmoHegcIxEk@VvSe
zVf@->*0~Mrrhh$J)xu-_+=TTjXGzX~aBlG$NgIJn+4J0TW@qp7cMCG<zxK`RUnz6F
zv6)Gc$KEXs1to7?doJq8>3-bv_KZ;Wt4nKl`t6RDWWJs6uWh?M->dX1W7DF=24{9|
z2uqW!`}a|Oh1Z??yOpLo-#h)vVM^5%1@YWa*$bLerX2Ttt~8r<XU9|n9hY0zUQDu`
zEPE+%=@Jefx5vj%W(T+$A3O4Lc6ye+UdYK^t{E~OCtrR&`1ey`|G%8;CnSR>>6W|5
z&gz@{)|+j{pW^7sW?Rp?|LI*5Ioqyz_Wh8IoMidy<m_1|*iX)wI%nI-M_F1IW;T1?
z`jcR?^niB2oatF-e^yN^ow?9mn|=GIg-mO=t-dg?iqm_=60IxO!#J7j;%jqt1!ngD
z3~O7L?|jQezV@_PFH-}@#jBk%6UB=>>JIJx-ul9EYL2hMgUG8jc1KTErCXc&c0`&k
zo7Rx~wXEa@@1bus0*;#X7wtEz&t133^cB~eWoGX=vh0JmH_j=F@H_b}rjF~U9>c#2
z;#$@$$HKMSJ?snCzLM8H+~~fIHTlN-<u{xyS9s-fD|C6>kK6l1wBlg9e5I8Y+ec;2
zKN;))Up#VkQT*=&^|v2Z+ONx68s^0*k)7YgF!7HoPs4d-(T8i(Sd1#Knp!*h%jndG
z?DO-TRveZpJNJgSy8mbK?a~IDFDT4ewRDxv9wUXvKgIs}?Q56F4Y!glQB@FbjdP9c
z&y#q%YWvhTyxV_f$UVp~5^e}Rul8rzv*Z#X70;()g7aFsbp<AOn=k7-QX+i#?P<y9
zxv7rdZZ3!mvfd-(#(MgT>!oPz9kXoz?v7otp#At0#Z&FlF-P}0^-T3mF_>4L#IZf4
z<7TeH3qRG^;9yzdi{E{(3oUV4w<fR6|MQ2tWlRotTUaERJ|sv^PPH!!R+iP|ezw1f
zy-<D5&c8ARAMY=__~rOI{!RBSHUB>es7%lEFT1TTx!?Ek=W`vmryY|r6)IXCI(w4g
zF5`YahlRn@mM%9GI=$F`_Sr+~?pqq31}*V-H%|RGgGn*|%?dfr^^arsu53J{q<yKp
ziAn7Js#VIVzi0Xu8@~POz){LRDV|Ar!IqjPONLV)_|*^A2lDJ*kju^xZf3$+_0!r%
zL(}gIyZzC%MLuT&o=>}TJo=(b<^FRCQ-9nG3%@5ZA;n=e=c=l`m77BHOscLjKVjN-
zR8grcw?O#&!q|rJe%;3zkEMHSoO(YSg&i!i+r+Q9RV|8R`n9%Kh8cnDbChHA4_-QY
zdu@u*(U-jw?rlzyd2%~gFIsnj;RUg4tqXY>Uap(?=-T4l)BG>red2QAUPzYx-v>Ve
zZ(eT{sXh3aFMEcs-^5+5SASN!Y0m7}vie5Plw6f*jGV7M_{upSPJD0ozbsddJCW<z
zo)yiL?yo<UzAe(`nQl<)AC?odw@SY?E`Kkcm?V59(pF2lM&wSe+?9JenR^mEL?k!t
zn<8tnsmu0G(z5CHMz49kIqRKxxIurLeAK<_8>&+K3r^U+w~5*O;E0Tx<TkIExZI<e
zxiuf>&7UqbH+Wk%UrW{NpGh0;MXzE%RKC-@GHLH3(bTD>x7US8w`F{?J=?9Q^CsZi
zQ@iQ^zj)4@@Y#&@?B6u&dD_#rJ=!4G7{K84vo_a!bz$g>$2t}6`~R_bURmn7dZ$v{
z&!y7;)1+q}dvi`8YrR|J=iOV)ORn7drFT#2nBcsu&*lN2p46PH$UKp9F->62%p!43
z{wI-#{#@AiTh-oEL5i6pYU{066XF)<a_1>Wbv^87QCgAr>NuC>Q-!D~({BmvD<1@~
zTw<<{;P=>n?@QGF^%a+Uw;R0t>6ln~JulfkQak*AT#w2vVcot@O<vr7>MK4~T*|(Z
zw_Ut=;+-!7pP0o}R{eR~o^M-yS=YLX`Rv(=Nefu^+zFkj7@fDk=2v65?1{J_oxLk>
zMLp45X0O^P%5$#%QRmH;t)*v-7O;Kq7oKr=jfsA@@E5JU9n#FY=Z$x$A6XE&^&<bx
zYqu9ZsdJ57=@pR?G&}6aC)LP<Z6fcioBq4`Z+$N_XYqB{-op=~V)PTe7u+aUnpNP$
zA;offHmk>6`-@v!-hC>pd{BSu;QdV7D!-Z2wN}+`pO~CcaAAx4`G?2SBP5qt?pg5X
zGw-WZmb=p(x9Z9?9=fQfApcQMID6}=MjMrhoNW1w%|@q>#P=GTt`wOhrMYyW>lBuE
zb-ET>E!D>vmuh6I)K98P6Vl(P<@W2YlYRM-j*t!46kX?wtP1({znL#H<#EfDzp4{g
zx4RYPFWLO@|M6MTyA@{p&Hf$8!+9|E$p`Z%h3zR%rFRF1Jacr_+po2gYtBn|hu0$C
zl)s%VzpQ@6@xSOdqh*3>7s6T=+_}G_|DyA{4oNSm$KpM1FJ6845|eR+N3K!O?Yx!Q
z+0c25e0-(2ckkD|q^P|rLHVwH<OL0>v&rvPG4iL}GrF9$(D|-q<&nUW{V|q*_VRuF
zm1JvI9TFpWyl>Ob@2C9!O<vYNe|j5RK%87aj_2Nzpl$2kO}@P`P*O?tjH0A{&zaT)
z;f4dIn|`Poh;Fu8W#15Rp#7q3HSg|UTir?&9DeI9DOs90@kJ1egyqs*q3l!Co%a2k
z^nMD%5tV28%?l>ZRavF^w~1+w9sAkp=`w~bDo0oPd~Ax-{PWY};evyI_Rk1rU|>JT
zIDe&UeIUo%%@bcfesC@H?d5<U+bcIG?G065IXCpgq8$gmZM2?te)gKi%^Qr0I!wZ%
zievV@PVZsd(Q147@AgzKKX?0fryDogL?Za^eS9e0Bl7L!N9$R~uckAb|5B6NZgYIO
zmwKG3+H3V46|MGXJkMtwTcB&s6I=2?xKl6o^Nr(zz4KrE%Xpd3ao6<2mIAHw2A9-D
zG7F!#+MaPaJbMq5byz6xmA;~A8>Tn9Mu%^loKyMc%;^d9HptBH{x?U+c;dGjfr*J#
zf*O%7Y+dW)7EL`{mKDBJtmuCIuji-BFI+lPzEz^M%U9?4{Fh$y)Zbo_J@@tLxtI`V
zjpYS<yf<vH?|R{VHtNI@p8b3#-BvO#5l$DM{ABz2gSS-2_Wo}Dr97vsPtMQa5!md`
zcd)2sN#pm^ew#I><Ud}fG{0lZj79TQd06XCzI2>bb}!=LV?NfkzLC;DY?|+>dQWCJ
z@%wRX=+!M3>$nd7XHhm-xZm>mk<Y&6?`)mkAF=Ok+Vc7MAN@P^`)WfRYqV1((ie6_
zMz^tW+Od{~F>HG&BH$!zuexCe^O{_bxRk6qUmn4|8-0y`+BMqm+rVhF=$GRGh1XJ9
zN4MPZTcNc7bBIy~SMcn{M_X_Do^X|5Pc~z^-O}ila-JpY*WLW`*gx-AW*m3^VDaWz
zn)vD)2j*<~^_u(Fwy8S{f3IY|6I>MkJ%qoYZ>8Nlhq!!^M?bFGJ$fHn@U+A?vNLLK
zo?Py-(77MKCkL1u&UHF^WbwHxd;gpee)gBmTQ8%IpSN6gbrbik4kMxJo(2~_jgt}=
z-87b0_I}>J^}xiMgtJx4_s%>Y{x>0Dfz<wA*9`rdOqfoYuPl=F<zBsNTa;MJsZExL
zPvw10VOYCFM0z=U(c&_j)Pq4S;rF_u^2Nn}d_DLuFk|-Ki3@vTZ?aE+7NBPxx5c^S
zM$3=)7uJRwGiwU0IS^KHXYN8tr?g26Hr{)&`4rD2wg-3Ws}{^jT%TulmsL|BV;A?%
z8S0$swKZb<7ru|b(QrFeX2lk50gnH@r<hW*o9s-^NyW`i>`UM4)DgPG^sLO^`pMg#
z96enA{r3AzwUY@^8lK-{Jy{R;C_K@>HO=Cp)&#-!ESI|)Y9d`n?GFb>T;VakT&8yK
zFXx0!-%g~-?rBO<oo_Zd+y3?Mv**ueU0cJsf+g#0?C+G^>3mYQKOX<Cm@B(kkFP1F
zBtPwmXn^s(xk+<d{>hx+?fW6gyxOL{CBn_Z`RwWgdJl_!o(!#+%x|K6a>>4>59A-K
zotfa~b}>R(#qHrF{=(d<7?%I~$A9R`T4}H45WmvaA85^D;_?6Esg*b1ZSD$NwfoSj
z?oUEe`AbDLCP(r$m39{FlT~@O{lLS*3+K{v>ZPV#@JkesoXx`)C-QHuY1VyP2k(Q~
z$9os)JvS43m%XRLN8#8a7TJ7dDaRXWtc!lD?OCyV0sjsY)>R%)U%0j22n~3c=-g_X
zc0|Iu;on}PU=^XzTbtzCTm>uqA6)sbp?a^Y_LgjRy4T#ZJ}1A0IdoZguiIL)xbNaS
z=48QL&faDBZCB=ZZcBKw!n5b~g2ceb#=B?j^R}{V-4gL?iiU0ZHba5T?su%ZGAlFX
z))-#>6_@dLdudJl-H)=9x%n0r><+A2Zu|MeqK4?*9nxIfnJ>dO865~Nvvk=IuzBH^
z8No(2tUa6?&s)ZSKlAaRaqU@ykZZk4VFs&Hr({0Ty79`|V*AX8l6P}Ym@II)m)Fod
zVREQuZx;I}3*Iubr8DkVUDoC_EdKbi`$<vi{G)Gu|DM>jIdDn&oesqt8&W&0l$Te|
z3cLBZb85`(rXR)2Pw7{s?pYNRC--`i(&k`>8Pd56&!zV<RD2Gcuw^65k}tK(cAn5m
z{MOriT%%~2kvqTn?8DzC6mO84`n%-c>3h`$(@wJQFKlgmy??vhp+ou!T}*Y|w{%QI
zJGpLheBUngbvyGe&xWbTPO^Ppykd?K|GlkzWfdDv{Ig$HsC48<;KXOnFApWPA7)ea
z6)RZ%z1(Kge{V70IhH@ID<7=>pdHh({a=Uqw7&w=XWdxyC*)}LBCd6F588cuq<1m5
zNLkKsRrap5$7xCXx2T-gYsvd6dtry&`+QbOp`ZLSZn_vfldgEd>Q&D@?QL}T-Q{hs
z!&@Y`PxRezNJDO8{UMuWVGAu8&-JeM&zck0Z=)W;^o~g;t=eRYAK$UtkJ7{@try-9
zlF<1zVAGegKRTxCO<eymvr6!w;iqdYtK;SERh$GXRI0x*%3nGq^nS&WsGtC)-uEA#
zr_Med<$C|UdQb6@ni-8(d3~CiCj_mXu(H~mNn7o|l&;6;Sp^Pl(cC{(?6ghZoP1;O
zVTxv(!@*S1!wjly3%@j(%}xm0>shW7y!W4*^v0)obsWAci(LMw@1Fnp3%}cW|DqJu
zSjVWZ&t;n5=ZTB{p1;6KiSfvikW0svoUPV;nziPN&L6I#&i21+F8)!x9AFtD+LfFB
z^u6i#_Cr5Qk7aSJGd<J)t}WepnHF>DWB2{*cmDtBkbT?6(qp<x{;~q8H137_lamtH
zRa>pto%)E=<HcOPyDuD?V-keUCND17@xdtWM!=CS3HC*gXBGZ`(%&WWTVh+Y)xT-q
z1tkq#JI*h<qTS=6+!+=xXYg^k+|;}^>mMK7uujt4Iw!#^<M^!H$m#hKuWY9LSaTph
zJ66zwamzW)0Ljanckezld5uhSOuGIpxkd&CrC*M-*P8gm&nf@c^B^PVsgT01X1PA=
znzpXj(<IuRzTRJcMBn$--v;@6-|Y`@S$AniKL4=aa2`W?c*4oPB}`IYHjffcp3}J!
zu-Bt-eyYsx0Fhdyb<Z=;JhU~8(+>9*=+!zi^ZR}+zr8G}PrO(Y=g#=8TD?nNDnVhw
ziHJ$Oe&24+7vK9%{@sRiySA(qoo@KaFmLUNqs)7*dfCMMXwr*4`t|Xg>9=Nd>^9rE
zJMir3vv;i=IZOT8*}jW3KS;J^x!{;qv+fw@pG7kTOuGg4T<AR%B7R)<cvkXm-KxiJ
zE3+o`KGa{%8P+=0uD_`{`P|0|-5)=HmOCC&Tp+J<?aJ4$rdta+WwZUW*cn1v{x(=0
z^}1AX-sj98`3a_~;c7y8%TDz~%roNIbK{_S;?p0mL|xDM|M>k`aMSgo74te{wDzru
zwloMye4=J;r4xMJP3LxhMf{z~-Gz;(0=kv%{eNNEtr1lpx?Eqq{7%~K1A_K9U8btd
zTpgCAdsVC9hm^!0ua=yQv*O?GB-T_<X|29x<l(n(L-RS&>QrHt;x&`G3c@6osW6@4
zDN*RKZ4Q0+f058skGAa0l^lzfsc+gh;qjS?x|_~lQ&nBub)G$JdetT7i<?(=KjpVe
z@izWfQR(HS(J-;-wXEfu)Xcf(BR+=y&VHS{zGCwA%T+VaZvAl1b)W4q!-UrS<qx#e
zF2CJ4dwa{h$&G(Km%RAkvdPQ&w(QLf%gf%b-FNEZ@i$NQG(O?mVt)S0Df`wp^Rf&V
zoLjItl(Us@b;_o5p*quUyUpeiPy0LBeQMLwt!u7-dHF#uE#|&je&4Ru7n*yT8ceIS
zzNNWZP0)`v$UmZ3z?r^6TlCufW$qgkUsmohQ$4orn8aVU`cJB&%oXqMD5;%^*!Jf*
z-`%<?2Ux`xb)VQUQ{dJd-Lnf8xpN+@dVU}w#((mi4N0G+8fxFf>RnF>pD|;D{<@`%
zxyJJ~C&*pXHCgvn;9;v}pro~_06*t?Ta$Ky+m|P&ZQ5n9(arL|@N-k8nP<5k_)kdW
zFFSKn>_&mhzU(u{x7disrYI~m)O@=1Tz!jT;Gy5%m8wC}v$SI;u2@<AR6O5aTV#W1
zxNNI^dDpe|JF})SL`}`y>zBf$)39~-kwbyzHrnsYSI=oa^2f9-CUd`*n3J=6z>)@o
za-KT5C(jN@ujJYCIb^j|R_caW|M$lva`(&3dTjhd$jI>B)gvB1Kl5yy8-CVeZL>^g
z^!W$wkGVu_-l#b&W7M~wt2+0V_vbylO?mrj8H-KURZCuM;r#Vf-5~X0l%%A+u415f
z%W}CVuO_`XwT=IK%FogV=|!?CK`WV!Osq9BmhUmX-}+kCD_P5eL;Gy2_GuP1zwlG1
z&HpW|N!8G}e4F(Xf1m9-hfQ4jS{RBJ7F*i-$UlpT-Emg<=~2yxOMXdAuzzq{XsS`X
zBLA|hQ&gMx{4`oTv(>nn)i?Twsbl7?bw^As?`mlkzOyNGXZNq%c~!vZ>Zw(m(@l9_
zvU(hJT{7om_m7Nv=0&gFpU*S;q%=##eRfv=tS7rgwi*ABe{@K+ka3oOZ_%t{sx6;N
z1-2|p5(<(yZ{WK&dtvd+y$z>79dk{ZmTBI)&sZzvy_M1CjB}f}%XK-I_c88Wva<C^
z<~qxB?^ZU-&-N?*_?%N|!?a@(Hu`E(w#plx_{Ya5@8(v`Srj1q?b-@;&r|Ucx4)XL
z=bI?=`?&Y_RddWIFE8G+y?5EKv&{b&*WW+KpTN<3bpNf%mCG;a<fTmM$`EjmJ?&ml
zSH5D`@hFau8|OF*oZPBeUBh{`$0l;6Nc*8jYs``!smV3nDK!XM^zF^po_n`q_8jj1
z=llFw<m0Txw@wK}8hzB1T{ZucSxouKqucrYm2)cI+rC|1Q6jkTd$5XSveA=$AG+**
zOm6W@`<r9O+;rm5T#?$;n=j{xPtDrc9C_)jm7Y^`Po8^Vn%qscWfNyinESQ;)*3c{
z)5*SCtsfaX(zQNsTjn7q`~9}I&E+S%ix>oa8rL(-n|t|Z^!wPU&b;4(CN8_9T@`m-
zyjW>>{rdGYexG?S!Fc<Xi4)6vzB>y|r-$vDxAW1}j;8^eoLxieH~zjl`=@@?=Oj;d
z$pr~#FW#xYv4t!8V?xBYcUGVNNgT|IOGu1wjZd=TYoFtiE^wBWwRFB%><+Ekm)D(l
zq@`=N^d!_B$@%bk{k?$yIy0Qrw>JH|YUs<T9{cF)oJg(MnO2L~?p)(o{M#~_`E;&!
zSqD#POlagB!yWvkzu)JszRz~?y=~dsplG+y-TXb5CocXt>&934X6vq<n>wa^oOe0p
zHiP*W2K{$&QCZd7KL~{OD5}Og%xUDfQd=bI<1Zq$Bj~!rhW_Tx+Xc>-O$$%=v;SJT
zzHl1nH_!MR7jGYb5@6Q8`j^GY9UYqs`_0+U|8Y55KF`<h_{lhhm&@NLDT@ZzXyj@A
zo7}CnyLkR9+o#X@kBGX8Y!}Pq<WIY`C1JuP!x=7CPftzm$n_Jsl)yC8a@`rvokhLE
z2D)wrb6<+@P%4XW>iIGAblcOQO9!JSTKz0`5cr_3{_w=6!#j`JPrCX(L55M`#@Qpg
z`PSy1$cmq_uB+owa_;rJ2Agey^dm)0FWU<}%2l=R>tml3py29qcgy;=aE21sZ*|+8
zcL^$8$knpjX=syp&QYbbvg*!~kY44c?q62Rz3ta#+MZDG%bm6Lhr+S`39F~(S@pTL
zdKG(ZaoW$o)))UwFJm6ZqfOyXCvUG7Vf?zGBXhDJ?>xR$^J>q2TUWvM`CHA@-*Ofq
zL08lw^TqpW=JdUGzx4P82j_+Mi6u7|n|`l*t{xja<?Thu#OmW2+fLVQTo~CBVJQ4b
zr)XJNWA@R!W{>k(wz7gRpY#|kknPsus!F{7`CX#gsgPYW!|SeaFVSBSAn)J1M7AZ^
zf4{~N-?~6qPZ35pp)ZOHa~BjjSei_fyTc#+vs7C&*Z0JVYj=(&cC@E@MJRB_zvh)s
zpR9fUa@(r7V^w?EoO(huGN+zh#>29$`X|G}>f~7(<-6{FT75yG{<BNXg1!xx*n0Z}
z!_L_@uG;v?=cq2fj<7)PJwuJQC0~9_d$%g=>gvu1?5+#~dmjnzlw0;;R%q`j>!0;q
zYkzgNAIa1TXf<SMx43#Wo!@X~i^&(GTKmVT+k83Jb=^^^{r*_A@$cc&wLV(cISk)j
z*tdJikr(TNrtZDHrz%9`+v)s0#&`Yt*%zpsXqJ}{6N_o^P~m@E@Y?P%^N&pz?rby+
z5sm2xmFv4&B{8Em;BHCrM81-!Lu!4?ju!1&_xXPP{4~|_*9k(O>RxYqns!sTd)xfF
z{?q&2^>u|)TPmJsbS-OQoKv;0xx`*sYkwf~`C|Xp*%P0<k9Dh2c&<~q#?p22-<+S_
zuj)$JTc<^(iA>P_IOR;>6mwg~Rjc?eJ<6E5k*7Crj?3)Y{G+N2C(8W3`gtswk|k%_
zv~ICza_`UMr>5Rm+#j4S)!)pJ_c>HLW9PP)Q&LjCMoyQFTmJ3(q}LW*mkf?ev+L`{
zJWou`_}RB4Xr1ukhrUx^UvE1gKY506n7mP5Z=%)5%ij;pT&NTCXX@VA@820Nm}&(y
zs!U<Ln(4H81AF@62bz&x1`#iRY>2;qII6w-hQQ3W7gdrk92V{0=FlNpY<;K8b>nM+
z9j`Y=+C;~_wr*cFp*m+C`_c}MxIS%zukTx}!m?~RW92q*x~|dt;jZ@ToB&51qwcMl
z8?Js~I};rmSGmA7C&*%^UgOz}d;g|&a8;C@wwd5k+5fRrZRxL>IWoWAaWSWDzAJui
zx;Crop^X>&_sV?>i~7a(IeuZ#i$ceH1&Y=Cbm|x-#8jSh26}wE<&*v;`O`1|HR8$X
z1-qpMx!x^ZwrpQ?la&=qLFq0wg&B@f%fckBU$HLtsNVR)Y0eJ0GT#%kXPyh=u;`s4
z%(*Pl-TCs*gH!85FLZ65zWBv_wx+pJ60WKG&Wjvsn+yLPQ@EC)qs-Rv{gj5)r8>FP
z;tfik!spg)+bVbY(@wWDX_*U-%RIe#M&-Oi){m%p&nDk2`*Cy5w(iM3b?1NY+8cG&
z=0|+SqIK(wv(i#h)64x1{OFS_61}0bf5Ys=dquKxU4Ie||Frz|Z43LlrC+zTZ}fhW
z*E#JOBg?F`4{2W43|~mBQgBJ1dfF#5StHFT=)lVfwx|3fQ#F2HwfZ&ft&G4Tv!8`Q
zrJ`*gf+PjAS2wqoOUO$c|Dm&4;#-nmbY9&DgOmSGm0uSviuY)<F59T@>VADoQtSV|
zeT8f66v}5@n-CKr-~A;s{BU>6*Qv}=Z!!#DSxd<_Up6XWxAoa_-YV9wzjMWk63r<k
zlaB3CZ#{RAV<&G;TLj0+eQg%69M|*aUpV^Xo#y1}QnD|<-*x$YZrSnG+a%45VuHAS
zo?Q3EcFXh#g}Xs7J+k+uzWljsr$(E5k>|y7hhNtx8_)ZFUCr$FhK~CE9-TiHNcpMs
z2t@Wy34J-mHCp)iZH-Owt4}TJJ9N`r_N{or6yF0?Yuk=nn1*(ViX?1IKl<x)@S@-h
z(f;__X$P79EqW(%TCTI?QD{%s|Fq4VGiu%{uyOrPnOnU|W|gGDUD;1j@6<96yQn)E
zKij4CC+QO7R`q-Bn~k|1a`8W!Rdsj&_wyMno%7qLuR15oRI~V7V%YMTMHg#YuM}ub
z>Z`q3bJ6k7G0PSI<BpkLm((quvBgk&?W-d-yQVZe$xnMb(Pef@T|)ESlWEc=%d>P&
z?KiMpXT0?8P8aEfzAxcQXXN-6{Mg>qbx-Bbb@R<TR~Btr^@+37myKzMozvZiUzk65
zhb5fj{5N0rTjAZ=)-5HhOFv7zby?}9y+|k|#%sq*y$<KAjQ54y47Y8_6k3)Ta@1}<
z`_WIkl?;=Q^Dl|fPdb$(exP4g?hLc@m9k}X*cuhA)_Qhv8SS~9#aHM*H{#coT_0QY
zmtDW{p>|mWSNY4(#9TdnSF<9a(`S5_Pw1S&t!vuLw|8cW%&eJLr!RGnW(c~yE%N*Q
zjz^!n)8{{|^KesI)jl^!sY}$uq~%_7z*b+ktKxb`%nupyiTt$S{W106e%A9YhaC-~
zEjt(V%{ptiLrCQ@m*oY~Jqjo7C;Hi)3uAVOK0B|~{cYElbyEL6?P+ok{oP!`y6l)J
zbEInCqdQ$^0?j1<t1b8&U#dBwR(i!fk-b{X<;HV#oaUTyvMQg#_%TyR=S+!LgI_Z9
zHg3jsw@+?nVAJXA?`>Gs+0u3;y}ZSE_RjLyH=Fc6A9}}Ww03$<oNU1BjhzR0irEts
zA4rONn=CRtep0dT5YL&d6aOwYe>O)TxuN2M(em{-lP=twwa9YQ6ql+HHTxOP<~Gmc
z_87HI?AYfyVYx=LoGhF2h4VH0mfbK`(>y7ZelM))eSYXi4uvqkiL)!k_5SXBdTGVA
zxD<(kg(}f5Ore!*5?_4MzHa;P6FD#EP)Fg$<Fa2LpKI|o-*R0*d*a2F*0D1Zazq1K
za<s4dZJYF+QN=ZJLcaY)Qx0#QsN*bOZ-*(Y+AQw+=smxDZ|KaMOD^zF`}oXqYKqC-
zxQM@Nt<JqFWB<93A>F60UOUTo*McME@on*Y7BcSH8nMu`syQGa`O=!3rt($0Sp)aB
zOjMuDpndkUf|pj-+EaoP{H}Ry)4TtF8SlYYC66LF{gQ1KMozx2p`^#6SbAbt&NF$b
zEBltSg)-_+|9IFy+xWd&&7bBed1X_oh1=7%OfRT7BV|4_dGU+=rS?(J1dnhB8nI_9
zoVIyVd0J>~$b$84tF=G487k=8EPe4bA-u;!i1Qw&U*~Q1M^!c7iyrS@8f2oar>uQ*
zPhF#bYK-~eEjJcUekOHyhqm9TXH4%36j_$6o%yL;IXv{;+Rpgg7c<&cespt^YPic5
zlJtDa<Uj5S8a<4CI{PL?_-x?R659G*M^-iO!8?Y)b7}3{*iHv$1_Z9-X{fw>m-oht
z2dbhk1!i45B)z%(-un;M*WE;4durcd@(*3UMr@;<p<|-da-Xm;xkqn3tE5}iJocW+
zUiMnqt1x-#2aOwXL8|-a^Z3lZ_4Dz`nbW=pblrUT^O@hfIuS+nm1-p+$BK6NUU-`6
zd#-Zcz6Up>?po$H{p>8gV(qCc_L6JPo_~fXpZCXGXK^-|Wtc8mTy@W2&Lbhq9etPh
z?=-e<`LN09Mv$HA_mii8wesh3W?$YA99`~fA$qUPa&?jNiASPo(y14nMSr#le!5+f
z8q%D;GH8>VO08bilt9tM*^0mVL{y|F3hVtb2(1a8(q@`@Y3B5P1F;+v$+>ko6Zdca
zeM`W@wN)wc%Z=sh<oRZn?#gF;GefsHL-xx{)>exrSNMx9B8`tS)qONmcfOsP>`+{{
zaXO#Tdetk=o`)kjLfyFDG0vBtdho$V#ig5U{X=fbxPCb+K3jO!iDwg|tosh1n^CCz
z?K=P7S10@GJ^V91A9cKRV8;8EpH_u=e*b+pZFN^>+`pG{`u*<RoEPG}i)NR*S6n;6
zBG!JXZo1&#W5*bacppvK_WgP01BTDXZ>6t^c{251;JzHktXRz&&UGy{YuCuGp2M>>
z{obSK^M;Gh-;0y8eyhw|WHM#n%Rh(Xm#ukr?7>=@e79TsTo##q{H%Wc$J{&i><4#B
zd^KQHja?gByY<9ZPqUXMI~pHc%Bx%ycf)Ky<E1M0tx}WNMSU8q=Qf{eFE73I*h)d@
zm+7Xq7w7y=e07~Y<;>41|HD?s7u_(Nz_Dl2(~wn{|K2}bVBS~|vqSLH>>Xk!C(U%N
z@Y*mbzkdC32A`Gw=FWj{76<9{%ADSIflX|)>hGTWk7qYL|8cJI`H85f5k1}qV?Klw
z)~KHq-S$H(*!}PPmJc`8WEMp*iyDY<O=rKbEcD=$b*+{4x;d#WR~7I7lGE(67dzAN
zhuuMF-*>f>8FgX~$*+C6Ja(@Cxte*_<M1N0lJ*VvHfBzZIlpdds7Y+D?9r!|fvb;6
zcs&c=TfgwddsefbEb?W)&K}vac(u;_yejVxJ1+m<m;U?QU$!>C`3A1<-Mm-5Ke{_>
z)kzM%_x>jwy7%weW4-Dk<4Uf_TO?|hBs3oXx!xtlGh#&u>t>~w{=q7J?>=o^vR}&d
z{Ni07f8=Zy7J2YW)T||m{okVL#g5mniS3k3Uw^3dWf|k~>J5B7BJ1Y=c>G&P$UEVv
zri^!{VNLHlo;X3-1COu25I*?U;&R&5FPFLlk`1?HE1iE~zs2D|cS6tg|JfD3q6tCF
zw^!zh@+m*F<BpyGzF$G+$&#pD@g*~^AD=cU_`g=z^;TQym0MVNP2x5%*oVt4zvjIB
zK>dsD%O7UfpL7&2IBsBYS>Ss0+n-P3@6WjG-#kfu*&nWB@B0e&&M7}1*!eO4kC5<k
zq2K+Rzj|Hlob=H;#qjRK2>yQ_HdcM&ih_I7{O$@A2v;BDjGb`c^X6X~-w*LrH(9rK
zA4uc=Uh}&CWku_IRoy_ZH5-c)mrPk_@?Gn;fa1)k&hwW&f_6*vvU>HO3Ve0_LBvgi
zk0nhvXPV_?>b<*pQP^qmyx=L*oPujKj-IpdR9h|UKPS54hT~o*L2HBDi8Zy^JDVj1
ze{We*7M^!0b>{1W6&?|CUTw0sP6#spNeL?Jz3G~1T)N=kug9O#_P$m+a_$swiKwQ)
zw9_Y_WZ6x5u*=NYO}6&;Z;O9FIBs8j79Vj^I&$*-=)L!52`u)w?HGRHpqyUlkz?%!
zc4^*D{)L|vtj?L8SDGKDQ?>DlE@Sro+~Rj<FAFZT$oW?;EF`YJs=DgJw2fAWrs{3`
zJZ;YDl4`}Zfj>i7ero<q6jna7zbf+V{|)TZ7JcKGp_UP<@|nB)o(p%M&D_w?m@h{s
zbsf9x)MBbtvVmi>^K$=)lGYc|KDu(VcT_ptkkf2T(7)BlR$=tx=il9@S8EoldF;-t
zF#UT_?~2j#PA@&5YRNxqF2ytpxw+WP@@Y0PSQsI*I&FGeZnS;oo$`%LugkwM?lZZV
zSD<mLxX`9IHrafA!>2~866v)kSM=SxebifO>mkkcY^P3W@ISq}T~_My?W4_y?ec8z
zC@O6=HCiC>g~L~*BH3|=L*G4~W14Rnp1Rd7-8NHc=DNJTpDnwR&9B_suf({Z=!y2-
z&l~H#?yPUpUfa{TscFZLmRV}88zwV|-<Qpu^fP12l0@UA+L{w@StSn76Ke1Cau@%&
z*5vUYvvlDXJ3P-99zDQaoqN<_e&O>9ZcdwhECyS@R0^C}!qBGQa9_GY*EnbPq>|2v
zTu-0V{M!pw`Ae_O?faj8pZ`|0FV{Mgf}G=r1Uwm)jHYatZ8kk0(7W*+%PGDsqHC9I
zUViGu>s--uk6C41ey=UxxiTU|<mCUvS3bupOJ81DRb@LfZr3K;b$-_~*Ui6N`LB4Y
zw9Cx0JzsActt&lZ61Mr9`?<fHVqPS>U1ihcafw-`q+uBQeI1|0;|VhV+Ko+C8*dHT
zG0Sq%{RerDM<w=e_*PSw<*a;B&iQkNS>2P9No`_GD^LFy=~<~R|6}ESi>7tgjxQ{}
zKCe2q_4?=c1s%KVBW=!xS|>c}nP)t!`j_Z#j@1ujiVC9*9`4$fWNlry=+V*TOV$@|
zdu=VP+O}H5RFxyhJt3jWr&8ppCBtr35AFZ&nd2s;f9sr5wCYmp1#8b%os9b?o0ER6
z<?D@C&0cmx$Vy>-d(Nwisz=zC`pk)&$+&`7)b`)ZBOi6Y8fJJhg)Daxzv6X^Rb|14
z$rkQC0aw%)$5bh`wjZihNj!R0@ZiobYA;JvP73bY?#Ix#^0kk)&HlEn@7DNacs#sP
z9OkuOXw55ztyi^0^D1hyc(NUIJVG8gb~Ss{MfqJ?S{t*aHuH$WHOURUweGqmi)#Yd
z*Cs^GXW(1-?{M{WGmDdJYAU3j9`+XQ&t_(iUUbSlCZRQJi|op!i)!N;;@Z<cz4>1`
z-)vfTNx`R#7}gt8KTcqD(m!zD&3$oX$oY_ri-r*^yYlq)?>=>XJ}2j6oS0IZu4jv8
z`t}b?yIhx@`@4Gcr7w$=FO~8XGPk7I&RuEzKX#F=^m9wsqU6pOUYU>IujBhR<?)K7
zi&Lt~S?!lqS}vR8&(3UGsmQ`wQKIt6!R1c+g0xS?t8;CZyG2{ZKXz68$t{2TkMrzr
z-zG}d<_M%1^(6>(+eY-a9TSOqB|fL9w|1whL661-0~>}{^5+uuw~MFuEu3PqbH=d=
zAwm09GvD7Z(t7js;*UK|jRt$CIi;$9a;|1o@M|mYKL45{wQJMqWtR?`vIS({ZJ(TT
zVWOej0Ub$Iub2CImM`e8n0&MG=8MoPwKv#(f=f>>PxIZqZN<jL-18=KWx6FfpP4^L
zZil-K3zK=I&+mXmO{=Xd7<QS(9!P9@I?dBSo%g~A?$D_14>m<t)TdpVuuV`~COiL}
z&i!b8$9xx-V+p^GKU(81>RaW?v(M<?$=6qI$K2^;<Pr!7s9Nzx;p~jspF1W#d;848
zGwyV6!NDt04Xy7Yt~*D(*!6wcf1wS(ZZy1(H0_+eIL+z!rM}WLY2nWnS5*JpbollT
zEi=#K`7c^8a?jts!RUV8mSeoVM+)}D?}-*<{{2c}mzhB5f}N2UisDv?)XdbZ+)(*(
z;<00M6$+l7;>~+n`DRgn&hOtG9MK$F*(c8xT}vuA&3AQqC(GHTv(5c+-NN6(XM^5N
zS$S?wZmy2?&lAZtD{my83Z253@lxpa#b28i3tOG4o0F_j&3|Cx@9Dc9rSbn*q<70<
z(wVd7N^5p+4L>%kcb}1p+Tp;=ylbzL^P<ZSGKa_3f4u*@gLjGZBZ=Ps6DIjT`8lJc
z_{HG>do{a2U(FrQA20Y~qhs*tx5kA<iKZDATT+>IO{VPQX$)#yxO-a5boG3pRa?|d
zOHB{uJe?<S;gl~|*@Nw^FE?B((NJjHcE-|UUOC^yECuFieZjZem6w|d?|!(Jv1;iL
zaW?a}ug#R~KWSZDU$i39F+sLV?aId4yM7m#ZI8R$u=wKCD=q&^S+rjiXKt<flQ6MJ
z#=`q{sla@RLt(R<3twI5ztLx|@PFT&M5A)6{;F+>Io97lefzjM<??+kbK^&v<(!S1
z@ALg>wLNpT^mIsr_{pEg8Z^Xs1D2;(^=8Z1y_n1<DlzkV9h;!h!97taPK#A%*<O3!
zyOb>=f2ok;bKA@ht{*)UJSrB-=v`~eUv;lO-=Mc)Yp!l<HQ(%p>sJ%z-z^i1pLA^}
zPfFxdk7LHE4nFFZzK@h8z7(#0ofo%qa#`Q3#(S-io!jChSO46_J42~yy59uhdqJzj
zT%`0xBOS^l_ukzaxct*GV`0ynm1VDVX8%-@nl<CDx<YK6Nc_*;o2w4YvETPXH*r>v
z2E(G3)9$aPx|dB#;k7sXk`c`-DWbYhLTBRK{1wMCPKI6;|9yDd{JRUBQgSzz-<#OJ
zRPa*p-wfxV_6s6Ezqm~HJaTx6#HwFBNo$!--g5iF#Tb4|R@!($%FaF4^x99plHaD}
zAd;@8E*AQpQKBP3ldVto-s!vTH}s-xSr53K$iMt?jr1YoSEUSvi@X?)JgDB9p;LD9
z?3P1WqFeO(m2CDrzk4S+Q|7bVos;!KwygIiwJ<hnpZ>V)(3<3pn|)8&bDznvYX82?
zxa#knWA?ps!Z&frmj1B5Dywp3byZFh$NzV0YoE?O^}cCc*0aOXa~j^6+&;4FN>%CJ
z%07WbI``A=v<fHa$-X;0d8MLf>J*Q7sSo$x|A~-&yP`1l&)*Xhe|N9m<zLKy``=g1
zy9LqmZywum#aDV3EGdX!kht(<K0~ol&Rd%(m%wiovPTUz_PJl5GLuL9sVqw+Pp!ni
zYm1D%s~sdOF6R{-&QEGOw6W>((S+$67MRX>@AcbA|K!5X7{`}SA6~6gd6M`1mA2j1
zl@0s2&Ijf1*<<e^Ijdy;i<^AYF1?y_tb0dlXpq;*whedYu<za`sjSO<+3HAF<oqx9
zCBCiHOw_yd@uAR{4ewveY+5xl`QJL%4Za#bFLXcn7?*eHz>>{g91f2gSxx`@+dsGP
zoEcl8e@oo<-mlEveb0XD6?!Hr>y}k=HM)EYKW-}M`+dc({UXo&Tlajrd~8uz{knCh
z{BG}Kn!B}S=cX+uzB7p*>e_SIOgKgG<kgmA^H0c@vDciHb?)2hyn;z9dGcSzMj>`_
zzQ66v4(p=-C2=h~e~V4&iTCS2vo;IMFKjM}H;T%7rdSou`?!7yZ$+m0w<BlXZuH68
z{k!q=rey&~Zk;{DaLYCNM536(>$m@>Pe0cAudizLmzjk#Z*T2<e$?pusUW*wCd*2g
zQ(6t)9&Ffu>{{2F>HIgd%o<C1I_fG*POTGp8Gr4SS^9|+)q<t*OX}qlKWnO7b2gq=
zv$68&zj^a2{AcM+*45f@bK@;*wY8m(U&?POXYQ}pkehbwVvWa*)Tf5i3JzL4FOp9_
zGku9vq^94GM;qc)uJ2r#Is2?r(!+K)zI8r&M=ri&`D)7%a*k2b-*9`k#CxA}?(hHq
zns@Aw+^Yvw;R`#K9(A-?_@-gkz7pg8?|VMI5H$%kUOD}d*^lChPubt;oSIOW7*M-)
z1>Z?F<I|h;e($jgF8=toVbi_?OJ8rfqpLsT%Y#)X8@;Ejm~mHdZHUA%#@Vu0?h9|W
za${cZ{_vLcD(el40#lQfHh=ZCJ68Up>fBs|=5pm)+edrqJA&3SJvJ{tc}b@~?MP~K
zpxdKKFA7)OtKPhK`R-lKQ;h!I*%BH2BYwZ_EnN++FSCPwPT;)a(0^=Y<DcZPbIVi3
zFD_|XeQ&zk#p|1Drf77FFFf!+TXKiWv&g=aPt>pZb$`>`w=(Z-qtiLx+e)!am&3OR
z)--*2c7n&TvEh&x2M_y$_)8Bi@P0J;-Mh>^#J2M2g9m|3*=kBsaXmV-Ub5a4tk>{+
ze_p*c;niR6l*Lh&`$87%sT8~ZZn;9!=Qo@8{h6|J@A1`TJ6Y{jll-=PT(+#mt!s17
zrQfSA79X7d#g8{2n9=EEVx(TB$F1;P`&P}&F-Wh><MNueVU}#q@l$!$e8+76%-bI@
z``&EJ1&_PVy!xOS@bp%Ye#26|FO$|i{VcIId};K$Bem@H7tJSJc-J=b#^Ss_u7nT0
z)2?rm+R6I<TJWUIJ58tZ+yDKG_5F9|?16aB^fzHU`(H0v=CPP#apJ^%nh~2Ly^hD*
z6@QrYiou!h_G$e+oHKbm$}+w@nZo3IUbaPRvvK=!!-t-i7hh)ORA`b4*Wfk^JrU;N
zn|C9%doKe6$6Lqwr(Feg_PdMxWnB7DWKBiXf!1ptTbGx0OlT3!Wv-04kyt0_b;UE>
z@Xd!MmW!u;5^LGrt*xZ@=4H~K*ne}jemmrSY<H;S_O`XWoA!MEern56v38Mg?$T<n
z^OD}&QoALNSn$4|#(26q+t$hO;`H7-OYW{$I@qt%z*LxX^M&Nb%Li+cr=@N`z5C1J
zt-aMZy4HQTI_>L3o9#U{SM0Buhr2#KV?Fy-{KAU0m0yi5{JVHp`TLjs5PWxt>E4H{
z2e&a_UQ(^dz^HWhNy@eUfSM?W`I*U+CM>nNDyBOtPUxZ9=Ca+D@djtUaqUiib256z
z$G+Q+2kxizti2y~g!9T>ZMWF+)r`C>YBOWSf7HC!xh>ysu=r7nq_e9)T1HsVBQH~P
zp2^iI7gl&Hm#H=W44B{`zW36B_*wS8C7T>{PKZ2wyz=j-!k=4Xj+81yPj+Zm(zvtc
zeAC(ZH<{}ub*>ex5>j;8zTn?;L#H;YYL;ni-#6{mlb_9KdNKHsxsA2Vp{4fep<(Ht
z-4rkXx#+lh&)PrJ99K0?eNyDU`+LB-n@r+Uvs9Cds+w8Y`^%Hg|LQv?J@NPXXNoe-
zx+<sZg1xp~GRrQxYAVS#x9?|4)a8R~<)1Ot&P%FooEQI2`|$@YQN|zovX6W7wuo;k
z{$#8Xb&>s~PKH~L%GV5wRpk~T0vb*{U&~bFU+3KU%`!V-8i%0KS4+(ko7J~(OHj>~
z_-f+y>Y2D?jK)U|iF18|Pm`SYtN&+b3S}<vDdb3z%5&e8of}l3zvNx=3v1(8NluT}
z`PZth^V>&Azx{BUsasoa?v2B#pEp08xhKY9rjXmytJ_pR8*a?n_{#RXgel8uQ<25n
zKbx+d`SjDg<@>kIWt?qT6hBj1)mx?b)XkfJ1HDQ;5_R%dos?~EJ$~*{*NNNf-~Y*9
zJ~7XQ$%HjKN_Drp#G5TM0#)YdE!ms4Wbe^SQ(c_%gF9CyFAoyGI>mXyc7+*NHJKi*
zf8E$_EOGH?NJz%^X0{nWY>&EYYi&sjQnX}@HM(}7%l)s|sXHPOiXT-tzKHC&G2v~~
zg_j}|B_;|*ExNvA@|$jdp*0IjGHu`4*IsOR_3%dRQthc%u02(spSfGwT2kQhj-(r=
z)iuj6u2hv-)g)r4d-alxTH?ze=h|odcq0~U{`O4hn=cC04eL8aZ<iHL%T4G1Z*XmM
zoki4Brymop&i8$`!av+EpyH~JTU1xSjo5|usH{wp@V(J9LWBhJZoOK)(f6YL{<TM)
z5B41V9DnwP%l(Jz_qC{Ro@&I&neTi1*df{1vw0J*CZ+EGXcApwaz^{9)g2p&YfUT6
zW;HULRs15bCoS!8YqC#nl5N~$`}YEYg&aydnX7|cyxzuLpM9i-b<486tiEqXBJ9i8
zMkpRhk9pUf74oaf{zJ3RlSN(}ee9Rly%Lj~ezz{*?sw^f@m))H$fi6H3E1NIO3`V`
zkx5s$rytw2MpP+VQgRpnoY-%13Hh=&{9?Ri*RNl*>CBO34L_&Y+_RFubE<jzT*q)X
zx%*xVj%*Ixbt%C>^6sih-L?w(#nV$81opbVdvxW~CDs1T44>0O?u)LA>zV7k_9Dk}
zohhmOd0vmJ&)R*gEREX`(4g^d<-@z)+rBUL|NB4hcj%!NZaZ}DY>F`AW4OlMonNwk
z8jC{a)VJOq2De;ye0#mP?l1oYEp9bg?ou;-bJY`tAO7{cF~45*`PP&jRreW=oyu0`
zHT$Geb+3%Y#oO?O!p~ct5jktVJFeq0y!9s0Y#Qslush-l-u+$SC!!j6&u*dFj>Jjz
zzx`!@r_FexP}-chId`JaI-izjPBY_E-&=f|mYV<K!1+zt(-I@6>^9gb@+Rnzv`oRz
zSsys&u2lT{-=S7aDj;oXz18kN`WhbtHz##0zcl^E$_nK(hSj2-M^~OY`D?<j>xI5k
zE?rMEnKom(<)2ymch*c_XjosC@aV+{{<5mOuP^siI31DmcKmH3Hs$h*{ZH0?miK>p
z?dQkIpYtxqm*=XU;tJ7knJmF{d%o(qhx_N5DR16)G>pGga@NGRu_CV;-hPYK?O<OU
zV6*GmyXl!Th0;XKrDGSL?S6cC&VQw^$F>|==egjZG3Uuwt=VQ7Wh&EMdS|_U&B>LM
zvig#3OZC^f?jv@5x(hEhO6DA67n0_An`Z48_xIrOhYVbdn|9eo9NT93cI%Vqu%peV
z{G)TGOZW(Fn6uDz@d|nCZx#2CtnS*dQzA>>f88Si>9xMQV)<rye--2I50u@yH2JOd
zsslz5GNNU=9>3@QJRNmu)^WEzYjQel3g&3>J-_{b>9z~<S$prbtAsLaYOzb4&+791
zQ-Q^q40p+#{U%B)Y+{Wk=(qb{sO6kALHKNPDYwmior$ZAp82w8cfMbkB$#{l*I|Y!
zT)_r$^V&2xQoG!^P9=-3RyY&N+&KApc9?lUoXHLKa3B3&A78&^=~H28Rae-TU#6FB
z&3Go-igS}^!Mv_d3tFSCj!X1R*k#;Ol#!9?{CmOk-G9^mn>5cB>SR4rtN128@-F+2
zlQaJRZr#lNXW^o`%kw+_UU|hCah_l5<;>+KEK6!9-x0nt?UmzVn<=KXCvM*tzjeHl
zwRA;i1Y>#Fys1;|y}n4=pVogRUA1)b)ST2$(~bJxeO#+#>iA0O;3{QdE{A!QXY;;Z
zS!dI3v%dZP^IeglR;OC^`rOI|Z21bJ@16U`^<_nbc2ls_%0t16e@r-X|7y}diG8l>
zzvk>w_Y4%5+4A1SS(!U$-ujt7uIF3N{e06hQ95B#L-;EP{=ILP?8r0a3uTzON9Fsr
znx6~$vUW$ayY17Ivz};JRD9<WQ@qslMzc8$&z{$Go}4enb?1&u`P-zM?aLl~i({V2
zxFhq@kJt}C9&^d;w#{YMVg0sQ_i(J>y%p_GckR6`m$K%)m~OyJ<(JQopa0HrV3JE-
z)RcYk!lL*1yLWd7|4S54$eFb8^quQ}-2(&OCAk`>sRb@AjyeBIPq5pmq`Ks$3G-uh
zxq?GlA+HxWw;cKU^upB^yJM?fznT5<wvUC}LB_ucS)My4{4IMW7GQUpUun|s#S!vt
zZk0Uw?w42_)^pgusr|>;(Qy7<Z^)kwo%~%Q2@DMEMU3;`xc*Oh+`2Ez@ZTy0nR%K{
zPs)OnUb?=txn2~phfg~1amVsAdjI_@iq$WPw4d{H7y6XIncpsRaf)!mwVjqHX32dq
zdRM``aeIqKVY8>I{l&-yN8IYnR{T~FNZufE@88p_*BK*t=QjVI8MJO;*Tb+mGmR72
zK9ojS3P<hjc^t1O<A2=7R&lG0U;eL#*#~YoZVGv_(#=8sqy3@($)^sV<S1!=A^6Wt
z@!+f%S!-)$&TU_IjdlN(<D0HJp0n+-E!v~#W}fxq=a%J;4f)e1aq06Oz2$9~Q1Irk
zOzo!l$IIW}><Id3P%%4lzl!!N)2;EFpYCOyu;MVkKx2K-t3CHWyR*%GH1BA3Q-Pu^
zk0<x`$%*|ZbQTNTD~g(K8opn9kJcf@Y=)U#{YL8>*DLy{doJVF{pk3ZK~njUqTNH8
zH3gm0s+}crC#Q96T%OIeDcmZfJ@<<StMQjrEB49nwBMvS>D4vi4VAZp)|Z4|xnsXw
z`}+N@k9g+<D<#fneLA<a>s8_O{n;Dz?$oV0JBj1L0S5=0d51Qsa>i}qP>!nKWT`cI
ze&+5HhGjCZ7Ui&6-InmbE%oW|x?H~HdI{AoErJC*b}itHwDEg?DQ2>xsZ+(_->loO
z#Y)bqR=xS_nbgOw>hk5=ZwlS<|97<AI(++-#apCmiq?2`d1UFo4h#G9WWj$vu8lw4
zUIt9>c2S+sIQ4xQYZ}+BFl(N4)>&)k1k^Zrd<fv+S^GKq{)5YNN>crvrTscS!NiYE
z<3Os7LF2X6ce#qiJ1lu4t|#iqiZyYjTP>Rv>gL8BUlz81v!efIBbCi5fnT-NnBTdb
zHqi=t(Yn4Om*<t_^D8Iar3C8^o8QViXYy!W!H(*`!RHx5>%7XEEv8wX;{Wb8``@uM
zTZFG3vi$rnp{vWA_h(e}0sEeP8+v|jnLIh@y3IGy8<u=xwOui?dh^SUWk#G)75~Me
z9I9J=)m2WWCsF#u1S_^5sV*ur8k&M`RPOjJb9L^<`<@#Vv^MOxYNIY^GgHRJKxB<z
z-G_FmzjxmA7xgdM+4bCLO6YRMfA7QoU1sbqx={S*LeP6w(X+AkdW%-OmmFE2bbq-i
z`;56p9#dZGXKR_p@BV1BOp5dH`Q>+87T@SAPWiRN<ZE2RPeHxgmBEMo-YlHrCiT_l
zW|-^78wyMklKG!De`F7RCUte=!kldvqa!8D4U58-OC{aUPtPp9y;(1Up-J<${_~dL
zwhK`*T|zwlvWK_kH<va$h)fNx;h!gSbD_}66JNZglOwG&-)H_T_;&Smf!%}jhzBzM
z4ZHf&9C>BF&2MBCJD+>J`*HC%f%}Dx+HU6Bf`>xyWX*W0YiAo%b;`L#@_vJ%#of&O
zP=2q^(td^kUoBgznX^)+HGVt4iSdh)<N=F~r`5KpGdW#o-rDd$YewWX<2wg*rluyY
zHr~EgGyi>5<Z`nQH`a$oFqKIknW6JXfAgC1`rYo|EVCs$*SpPI@$`b`v%j+x@0|^J
z_vDuNciZLlbzIjrIdos)V~w;D?UriZaCD7T^;f@zlkcxNy|enzoO?a`QFk2#4(IKg
zAtcfpcdt6uKw0?TgG*Un66=pW`QaP&&^2(X+r#9ZFG+Wg1v;GgeVO}O;KXMZZ%u9l
zp4qxc@#W)$P50K#X|=dAQ{YcwqLa`EmW%9N|JH9}-EnvC?!PthDdrE32Ttu<{?y^p
z>ko%Ryx#^b{P65ZKvK@bU<uKOmrhi&tU6j3{UB#H+Yhnr^BviLTv2*9`~5~mdsoK&
z{`^_$4d+vgV`Vf$zBFa6y(lRlxJ^~lFjZ^H#r9JVtg;u$IxA><=jYU2T~NivE)(#3
zh4Jfm>!r7Mx-<Daz5b_k*>n}dZo9QR;*%5(&N?zpU2?HA(*)Z)Pf9<Yl92klZj-vy
zB-v;0uHKFa-5{YOWq#+-qv>UL<ed4_r~3&Ne>wbmd!y6K3Ej6nW@lWlnthPzqeJ79
z%VO4v3Bp%W7HK?8F&B^#4$!{Hp8n^;=A-_77ng|_UMTO|Q2bNt_Jmv8BR%-9#@$Th
zXpRW(+5Y2{Z>vp%{+onnT+&n9Tt0U#)93h+{qfH2fc1LE{4+9blf&7W6HYBsKE&i;
ze<4jTHYT`tZ~W~@o$QbMWYesrCwz}Q`f*0k_vFRuk;_jop6E<2oVP2c@l2HQCrPiU
zM)8tA0(YbGTxR5Q>)Yo4S?s+|&vuWI>-RktbNupeeHCer;7@AIztWpu-qzLE^p5GL
zad}sG7He>n;@$U5+^at(X+M5D$*eq(DciO2;4(=~k*2V9(}a(Cmo1<Du8AjKORO;N
zVz^G!lj3I6)~kBY_FZi_A=jl8weq?CVXdd%PS!uQ-t+hS=Op%fTO5p9-`0sf&i!gF
zb9Dd8euH<u#aa5hx0da9pYFdanPaI&xOTI}Qgd6u0^@m`|G&vo|4^dy%kp8w<(`#~
zxO;k)((LytMg7q2RZTMPm%h33%a6IskNE4yfALF{|1<HuK>D#S4_>&X<}X*|h)HEx
z7btMOjp1~_^C`^gZyUbvsee=WZ)xCLjZ6NT!T-A_x;@a`!n(uaMyOI`%Q?mwFD-V@
zVRfAA$KIM^Bgo0XAm8jb`-6#(|Nk>h8@Dpst^dd3F>BRsweZQJ<v}f>v7aU$o!D%@
zw(-LE=KaRDl85BA1Ez1O+j#w3lMTzmnX^83-1*WmrT<e?anYw27s?fQuQYgFpPyZF
zk$dWeym?2TG2fH1%lsTAn3!@d*u60M;QZO9m(xPuPoET(H$SGHA>H>i|4|q7f<R}6
zTBq2FYkvf4v@|Z8-mkgK<-MSXo`edoSNPmY-}0mHuEu=ei#U;{V0XOHtKHB<MdwnN
z<aZtErlR|*UnC8?nO|}hw^binv4Wxgh(*wfqt`hYvk#W(pTBqgq2!j_<GBfEE*}@Q
z-O#zFKIvro+pRz1u9UtN{?Y#U@5Q&W#Y&gmKFKxg-{hdr#;w06yF2XC;Y%xRwby7&
z7h-P;@2ujPkP)QJIF<9$cV^uj6MxZEO$iUPFMp4UM)gf>_<z;>;+L+;u4+{*^ZZvD
z%(3{oN7>k&Ia}$^t?lRPXWUDQbS&pBu(ROhi_m{9@jrBNoZ7i-T3_SXRZh!Jn6`HR
zExUDVny0eO+p}mo|J|^o%b$xF-H~ziV&qp!?6TeHeckxX*UvLHJ~*^4;LJ|d|1U(1
z)=hBgUVmlXhMeoy4#Zz=k6XIb=iza$i~V{@kFP!WP*P&*bgB5u<epF6?`NE!wToT*
z#O<Gam0O%8m!34aura@HuJYl=wrNgjn=js7_xb6j<*U}rdc)B=FVsAgbyb9K#s0D%
z6I?eu<E*t^__18G^~v?GQ?jP!ShPkxpZxc5{XE`>4LWK2_~bbMZP~Nns%&g@>%Rlm
zOZV5Y8zpkgZ?)O6T1-hZATq(#VufY=ZjX+Fu!GX?uj^Iy@|kGQF{^Gr@Ai@L8*5vU
z!bjECIgU%YQa7!02tC@p#%=EwgBQF0d5PE-c<wd)u%u!#V|DZF&+|_IUvkp>($VuL
zzxKpFe`mk>x5efsue_J8kWKeta`XFi^us5|4;2A7f6iWM(iyz7{8pD>E=zU1Mcb=K
zp-bIQew}8o+$9~!`cTj&;2nFo*nY7c(kEq#?DrU7%Ge_xYQQaW>G?c^$Z6Vv+f%vM
zTOSiNwtg;EI@kDNZQ!;^)(dv`d-D9=muMK8*TZ+{i^Y`vs}F8V4%>TS!He)Sn!S4W
z+K#lfMY47C)*s!pS@vg;N3NaS>2v3mSM-JNf57y+k1f5Sf5jh(Q=w1q3vO7*++*=x
zgmKR4h`88!hwILjHaKg@zIomMapTdB(z|iBH!>A0?N7O!|MkGTz0>ce@$^+&SC_V4
zP}{>PUFT(DC}$n~c77`FNA;AvLkHbsm9`W~q<nm=lQm<_nS5&xmp5!oe>e8)bp$z9
zWye3L4$bPCI72MpwD6gzZKwaFzG_)srkXKz-Ciyc*Z*$btpBdGJyLu-^HqF|qebwc
z1UWDBpT#v1k$-<}o|N@&Yt4a4bvMM;y3fdUsz{0be@Q^^w)!;p<p&hni<eCZ(b%_k
zzqWTo^0lci#pJcC{BO-V{n;x<Eqp5L{o43*O*6Fu0_R*<aBH$oPs)T@A{(N<?9`t1
zvGBaKiCX*zzbA}#E5!cp5nJ<8zqc%`tzY=$Mx$$64(nDOf4(hudEC~d_uIRs?6?@s
zkP;)$Q`xj|!t6T62hNxI@BbJ7qj+~usP9g$850`1esw%>5X@8f?!LcksZqSP_q5sb
z*cpAVUlO}~s7m{d{42RNDXB+I{HIKaebTynS;ba{xq_!Pj$Rkn_YpGkSMBi;`(1G9
z_lE<QulpZunq_K{-99O*GTz6-Nz?5?Ky8KeyUNn8lika2=5X*ao2@?F8~x#Bct_Ly
zMH-7e|M+HniCfO3eevy6zEx7mEUPCjpXIT_RH(btE=RjN@ceAv=cli{%8a*XX}@{H
zM(yhEY5V^@{vrOtpWXRR#r?v6b5%pCzbstdJbm?w*-ldXE(n-c@BMn^`M-v?GG3!p
z!-;Bdnh!4P4#+Fm|JQ4d<gAY!Yz?dX-gYW+=mn}&1^CY8u34}w^^ftltV^@1njUI%
z{GU9pwQPNx&x4X}^9}Y1HFw@PyL$HYCDT^C={>Yg@4vvYU2pevEi3(fNX~7Y%Y~cW
z@{>yD9oRN`y8?3=Q-D;lX3yP}?dujeW`&oe9J-S<z0hirk7vH#wjyJ>weuq6o)<jq
zjuTf=Q_xCU$P!+?xcYhDYxQ$xUj;u&arug$n5LU@BtW(#chk!mH>*!ZY>=(Zb+Iei
zaBBI|4Npsi&w9U4%War%ym)!rE{B~3uiIwknC;tQ!29$vQ?pU<q+q|(bF>6!cB%ec
z6xy}->!EqohN=IiIW9~oajbpD_&eLk!+XIkpH)RFW?o{lvm1jlu3hWckz@7DF5=<8
zWmf7p3@7n!d6Bf;F7C1Xx}LIL;q9NLW=xvyd~3JwzR-^$|GzxC6}D8aHNHwVgh#wu
ztmfOvhv$BsnLYQv>Gdf>pJWB^#neyymJ#D~WVy1<ttH1dWDA@UdnVO=(N5#ri}w}x
zjUN5a{=v<??}>s(+Kv9h%vI;#d^((c`PI>&=`ZGbDowrg>*jltS?0H<xJ~!l9ML*?
zsrP|w=0$lr0-tV1^IY`azkEfv(~b*Okq$qOojJhp`^UszE6XId1#CIo?=-D+!Qw~P
z3NQMyEN72Qj4tk3d@xJq=&BIWO`Yl+J}~?4U^r;ib@K0H(GBys*#4^PF!=pV?K?T&
zY0(PKC#;(qS7uy{E1zaHoq5r^Q`bL8@AtQSaJZPMPkQ6DKHm)6^ymu_2OiGnEECz|
zv%={0Y{hp{Cyy?;t5!Oz-fhtf8;1Pb9xpb}SMUwnoRG(tcl~)8lcZm(eV&)IMC`Mt
zXVxq_u`zX@_dKq=IM3ZJY|8lp`ZY}Fj@=G+zcW#Jvz7PV>1!6+E)5r25%*=vwe6Wl
z<&t&_tbDWK@b<Ndc`uJ${68t5)lNlcNkp#b|3|M^Pcv_HUs)>{&wfpagY(n;iZ7xY
zUL4rYacE~h|22)!t2)UJm*RcbK56>ee~(rBp3dEs0<!-9z8Mrp?MYqBZn&zuV%?EL
zm7nHj3-<h~H@lFTA~4gkU~7xZC!e~M$s42_CvQEnMd?|W@)Xy#7wUZTO^z&=J9zks
zdFauJc_wK-4DaHNXG(>vxuT)oq^YuuzhJ-l^(|~x8|spNMYHil*0%S)l~Z`VtGu=D
zo=!%#boLDocA<M7tdSXw$;az>e})8HKULtTe(37v;KN_**YEE+EX!fOWzo%(R?6D~
zXEwTfr62e*V++UC(5l+|p*JOtR2~0Vd~0U9u`tK(x;MIYo3c(<eCL+=&vmy<*II0C
zO7FvS$Lb54rY+2W66~*&_QCe#l(2^ZhG*vKeu>Ri>wfZzT|}y>L_r}&?W_Fpkh@~B
zs+(>W$|u)PIkkV%0<Drh=GWfIQZ?)MDm>DW;eR$EZ~Kl#=Xq4F7sZ?AdriLnd*9+3
z%MDlTCSD7DR26dKoZ6hyKv~VL1=EY>#p;#Ct_zy8_rr_OQ_F;+ejKVjnGyYfbK&Eh
z2Sv6?@6;=lZl$Mq#)*77DiuHH^QMNcPm?;IoKp#Te&pyn`{XDdwn~pbN1mi-m9<M6
zE_Ds~XY(t|C1|DC-<dC`tl2cFCXB7^kkqT1br)l<NoYF0+!DR6JUL$TC`WbNjN5X5
zJ@2Q?QrlI^&@LK(!CckuY5!4&gT8i4#5yJ%JJ)8ttSr@SwVT(ua8=Dy#`EvIT^}f<
zt|P#!zgjY*JVJhd$(#_s{FZOUW=glOnbz8b^VmASb*l<-(GcdHmyzJ~JZ8(=En)5J
z?`X_F{Om%a@q%TZp_f||(kgbjFRpKDnW!*%t_QC+)2-hMNtbW9YnFetT`tWVWVKTC
zUyu3bd8b7sx*l6SEYGzUfAv8?rs?J};Sw*Q8y4KIsmk^fW;L;QT;h81X~&x0ipah&
zmzqrp|3qdAiU0IXip{x}94@E-n`_|&<BccP9Ig06>x8~HCh@%Ham~wL)R9w|VkhSD
zck+si=KB9ng8rp)NXzeCciwGL>v^d|CVcvK8(lXuMW6q1_xgot|M$&a;}vST)4ON6
z_Pe8%2CRNtcT@$MzUnXx*y;MgD5ueDN8;Q`uhUo_>g@X*>d^2+&BZn+@~T~G4QtZF
zGmj)v=X5WLP1fzdZyC5k#%05@i3*P!jy@N8$emwsN?2a!*|~Nd)rCKo9Aox>QL$xP
zGb4MZ-j+k5Jd(E7E4^=QT~)g_py#~!&(rPCZf_~e{K~wl`s()wv({VKc{+G}PF~b<
zaLvO-Cp0w`r?gZaPx0)YzRJJIv2Wv|=F|5%x)z6DU^PqDFkQmnyrFo?X|YEgXRi17
zmv<l0{=euibNht+FW*#-sOF@kZP@$VSx|;WNmnFvYUPf;DOKu1e?F`fOqs$X9rW?l
znI-m9b6R$W=_R;yP7YjHD`Ap%!B3z^l-bv|!{7bO4|!QXsqO8@_N(x`(F^!@_v4SS
zd-IPSd3bHjvnJ)eoijGwd=+Q2^yFhMrdC!>?fmO{R~(&-PVv24@W}pH#Ge=69T~Lc
zM7(~cxZa(%s88pV+LXQvJx?npJ2GFJD$(@)>VZf6u_vZ;dTlUh)@cxWa&(>HeZG}G
z-=yb$|M*1D$a!Js{)}*zIr?>bO(wRsCkKmqOQhbK`ME|-WYLBRZu?zlF1*upv~$)8
zr-f5FXP2)M-|qUk?pfn%zG!ytBRiI6daOTPw6<&4GNpGSr!^8@W*go4cBNTHwxNd6
z{ucMm_#<zFi|0&z$DVzc+4^mLz?2FNXVyMTm(xpQ(@X2$ez_gQwnV{&>4}6yXI}O1
zbA_&Z=XfQk<ow*QI77VS&icgUr`JS2r}@U*D1B)3VfzgGzjIh^e%MuUR!@F?f8Lbh
z+<M*TD;dm>NuGDRm$#Seknp*ULDl#8Ioq6OcYN9q^D1QOh2G`KFML@#Z5PHJ;(sn#
zdSzmz%7W5dCTH>OJdf{giqR9_-1ze(JL}d7{)hJ;o;PitQv1JcTQ^+aeeJc5_F>(V
z8SQ;8^8D`E&L2grUoM}Uk(?{ITcq^v?w0@8t*2Ptct7*!&IQX(OI};jxJ7*9|EuR5
zpZYaB?EO8VH}QS=M&EZw%QIa6oRWT^u5X`l;h?qM<RotQi|4=XYI}Rpeqy1bec}Fz
zyIsrH<*(g+Rk~ibEh*}C=2W}d_CEQkK3RYM9?0hM<M`Mey(!+YZEJqkqeUCmO_fcI
zORDY>vy-3l^iJ$Wty^j{4=L}i+IZsZ>KAh-ntxT=5XrfDYM{g+cj2R(l4ckEVu@T<
zJ8|m+@yvGDD6xx&FNMlq&+^hzEHOWI+$;2s*pgX|?>vI?y^c*RaNis1sIzKacSP_W
z0o!MDxqh1{x#d1rTV4O-naScL_B&mDWx^kK)@{0A{MqiWv+(EZZK7Xw4`}&uS;zV$
zZ!J(v<<Q|>`hIcslf1)E{myw?2eeBSTdiNmRAM?=a5K+`+6$>s%`e^kTCXU5=ATq#
z6MRcHT;Fl0#@~Zq#s0-E&XnG-rt9N9(a2`;n#f%(wNI|D;t2l~%zS;tf==C!&im`0
zSq1vM+}-PR-c+4U^yk62_rDg~Zt1_iB2<p?;iI)j*+q<3NyJ++IAuTR-s{#mX^ZUT
z53lYstrWjwCB5eiTk5=byB0q4+45)M?x?9%*Lv@jUtcS7<nFW}C*dHq4F{~a4ts?;
zd;iSd$9}k}sz<KZHKj<$b4P&3rPP*~0Lj#~^Y=@6|CW9tC-3pE<Dm9`w#S|RxA)z8
z@h~`m@6N>^-9BDi<}P-Nj~%~blUuxZ!L8K)wyBYthj;=X7q8tcP``AUv2i?;tU+Dp
z(oFNyGCMgR)@?o-oE2MMzc+i^kB02eky1SoUzWJMc)vJ0=$7lUNTZ`+Uaxlv%l<F$
z^NuV0xLQBTCVrE~YRlfmnsr8ZcxDLdsH{7_|M!-K3PBI2?SH~1A}N@vxmxjBS-7FP
zWY<I?x$sSMx4md#e_I|G6aSEV#mWckSGLEf%}ZSK{0iI8Nk{A6XCz#IqE}@5BSOIY
zt*ukpr;~sFn^yK%)N6UonZ7@0xqAL0DdjbCQtXm(n+lpTIo~g_;x4vT6o1vD_r|_l
ze^FY5U8VVn-POkIey0kJN~}6-BM)D4`q5e(H+_MC+RZoLZ>%{YoS>ca?PP(V*Hg7a
zF$*>?y+7~NfykE=BKl80Jf}5Zy6!rk{)C-x#8h<FOpl(mwsqA^G2tbd+&(L7&v862
zl5Hwf@TiSErn2>Ml8x{3s`fJlyv!+*uS3u0mGwLm2vC<k;{U<iKD%r0e#djB)lKZ)
z;<ZmLSJWA@gz9kjuF^V_X6Cy7(yZ{$>&k!na2SN_F^Qjl+pc=UycMg2Pi*-ru;;r$
z-^2=;Xp66<$MZa=B}`X+b8*9_GLdzEUMyPu{@&)v{~p|k5-;vcIB971<?;2_2D25%
z!&p|E+FhS>h*M>LxYMPlZ*+EPDQ%KIHQ!^-KAvZ1PL^ES6Ld?-##?T7Ype6!NTKY)
z4yF@AwQ9M$vu+E|Hm(dh*L$W^+u{IM<M+BrU)tPL&X!p%JJbE@#e>DuPNa*he;x2l
z?TpAu<)DNnE(3e1Lq9!IR4sN&8!U;lsCZ&#;IL}-^hM<>4+x5M#OZ%eHUE4n#pagC
zqYe4D57xD{9zDCO&WFeC>nFQyJga;J9lwPNupMy<OpV$V`lrNIt3J!+!n^Bl9b+5Y
zdyGzBw$YgJIed3~s)%Fcv{;4zk0x*mH~d=>)mnOlKlC4`qNe2JYdoSsyovRCvK{Zk
zBkwTo{P^SDkF}y|FEaJSs=ba+al8LY>czo|8A5(@&pGT2Q~wsCHFe+iRh{a8b{`k8
z)O=$p!@OAT>A{0%S1KKKSa)cyw9<Kl=*%XQu*qTO|99$y=f2zOq<DFOIdj5>xl-IY
zp3m2o1j=vpp2W(t$Gc`qp}3B$WZ%uRvfEjVKC|5SoMSj=-Lj_H5Au)xzQtfWPw05G
zQ>p05+wsg(?0rlF?zsFhQ=PDoXR*zJ;AN}-WagacG8KRSk@0_YlbeyaySMR^&-zL%
zb;fGkqLMdUGOpe%a*o$nyPU=9c6uy#HQU3fE6p^Wcfap)?YODSb(WQ7i_?b2*SfRT
zo!LF5P44E?d-Iw+vpFyQk?i1cT9y5F{_|N+KLoKi9DMnGKmY9Nqo-S0O%C3>`RSn9
z??|&Gr<y76c+<5V<vSU}Us`DUo%_E?#_FAs@8^#yuLT@ma;&JD*f@EK_LBHS-)7IX
zVRh&DObm=fR^O<pUiv32Y>i%7*$T0ro5~yBZ=11KEjZ!*-Cd4LeHNX2IC0hb^OI%G
zj$WzVldxAaro{D$h?03u#M)1(?iVhpSDa9q+4H8>HDCSPv(Ju60Y@%u+u6=rV%+!Q
zgZMhrvwu0*w?>MbDdX9F_rCV`YP+Cps~4%q+<!%<P3Bkklx?rKH<-HUWBb*DmuJP#
zO<aCKOSoCT{qBcekDPCx&-tvH7|8zO$_uMKH5&N|BKu~r9XiPUd)AD=k6y<7$}O`$
z&Rw1K!u|^T4z`k~S*<2{Ue{kvpR0eQWR=U8r}h(H6a=Up4pLa0@VT$c|KvlymE~#u
zh7%Q^<cBIR{}+Dkl~n%E4^L;Dvts;de)7Q6)ZZICHaG0aY&Fxg*<-wq@0=B1qW}D@
z9Y<n#?xgM)&_CP|7&DXI_?%>8!1IlY%lcjh>@iU5ZnX7{z3v}bv6<C0MS-b((FM<w
z{iP>Ew;f-1>1z5tru_U}2lg%FN@0vE7ExQ4%2}kD9q2dfjB(WWjyC;$s&k`j?Dv*d
zf6AW8fAnkR@kPt73-~`3+?%}U)2vF9f+tG7@slpMXvVKUT~V@&Cw8f0^t+W(*JiGd
zT7C1#UFqsc3+ktC-MIg8mAF!&8&?e9j@5yUN23JQ>w-A8pWkRX$IxDNY0b<+y(QU4
zc|$fx+5Ec}c#q#XV)42u-3r`0m#3{iVscV*dQj4<2@1=mhuJD@4nN^wd6r*Ob^0A%
z<>(1lzUxn&$H~Wesb=Tr9alGGy!<b&!{lM6yRNgLLo7fl?XH&jBIz$$Q{+7th^^JG
z`?GV|qvy}$TqF}ud#l*D&3AQ{T+bGl9oVb>?^9EC1;cHtopQdi>@T(0e|lfM<a~Ck
z+Lu!@0dJ+X-|W$5&$La<`w<>pdiZ*WPS{%>O@a2Ss{ZmEULl^>b9HwgQR1!TT%q{P
z{Oa6N75C6(g#{B%{Z8vpy~QYVD?Y#Z%Hy50FZ+Ez6T5D`j-Stl1v_t^)3m>HLg;K*
z?j3W1^G>%9wEq3E!kd5M%=H$PrCR!*>kHC!?i+0^+jr}H*Lv-uIR@v_c`9r^iC<Ek
zcb@af^^NbfCh!Z_Y<K<qVB_j9n=3c}vx%{IQ2nF*tEJ?kss4v$E&s2}OWJgDjpym|
za_#>=l|`5LNPH?ST%h?Vru3OpbAaoY@`K!Q5Bxk#j=Ab>y=-azwo0mFm8<59yU{0f
z^nLb<KD5nva42he*O@#sla5zmr}FCCjn>Y-bdkf(bf=Q*(#mSy*GHDKXl`cXp5{L5
zY1cGQj;`l<(o4N>H~zM$=sV2Py*qnC?W2XQ0xuUHiwdkZ)Y&X}_1lw7jw?z5o5C)7
zMtFac>v?89eR9n8O=%`m#pfQAS2mwo-Mc~8v}vE`4ab?kcq1d*`R*5;DSUK`d$q(Q
zw(7K`2gODWRlG5cm)JNfw!hlEC~cW^D$DA(xx4Ehd`ptMHUFFxC&O2TC9#6aA@4tW
zi99;Op!UP%m9N&;r~5Muwm#h7est!y&i^41?eUuK-PgGn#a#Kd(&wYg@$>_7%nFs?
zWTti<&nUCDJiL+bs>bT{Uv<mXuKhkHS~$s)<J-sg4<1N{@0x8m-C@5H@0W;tqmW0z
z$*GG3^ZbLZtd^{_zjycjiAQcr_jz}1(wN!pIOV^L<wEO)631_ra71pIy_P?z+PJPc
z#iCU@dTj<nTf5uySdW^HLoeSY+D}<>WZ(BirUD|Jx}_@b8>YFRH42*YNwMa}*I%-4
zUeB3vnQva8ldjI8P1_1;>`et$sk?8#yLzvl+vEL`2CPTEAMU%FdT*9X)#9kCxp($H
zU1cE>Hoxky`9jrtsh;mg<{#ANv({zj`PTH;O*;GYyi(1}*S>Y>c&vP4bLe5w8Ouor
zulDMzzLRfmmHwvnO``bR!u@ehd|6p<f0r!HHA%aqoRN0WivRs4KjRX{D^vY0uE^r#
z4wS7wRgtT8wrz^pX6FZ=?yS~N*j3ND^8K>-UKfjL=961QKE-+3t32Afrt@!Af<@!=
zJ=QN8cc~g!B@|x#`DvrYTZhm)?>97VS)H(TcHW`;U6-sXCeJkeBegeqip#E3j^^ur
zJZldU-V_p9HuuA!Tg$Rv?8`rWa^L^VjQ<{g8hRClrnar%`C<@hUt@7<!tq$9<B>es
zwTA^$ESf`Se{g*zpEoh{WK6G5j{m2~E4v~%CmGx^x)Bp*BR*Nyx4`6e$H)1XJpAp9
zj#r%Wo$>VctB>o`U#y5x<LWycv?3u){<X<6#n6c2hRS<qI^VHBbV}QIdcEfLzl_0e
znw`rnOE$QQ99kLkJd`EEaEacG?xzoyZsb(TTp2l&Eo<f+%c?Uo<np@Z&gJwuHp}?^
zJ)KwDUYYJw6E8DM=Fd~D=n@fsp?AzRj}0RV7hTm?<V!F3Yjb>ONM)_^<&Y~Ees%kJ
z`bS;b6~cFD(lI@0M;}Ea?s$RTu-W&wGv~K)M+k(SubBUH|NQ^4`|4$#I1br-^W|hw
zd#x2b<Mi*wr<eEcvNt)ie9g;K?h3~ax~`7e+ONYDXY|VbRj)$=o1@D;9?zwV=YM?U
zf9m0dlR1m6TnyM{jdxhZOkfb6tG8oEK-|VBsY@=X^~{aFy|8$W_PIn41&O56V-vWg
zejU&)nVWHL&FTpiUvdLncW>U~ZR&XP#u4T9>y~((on_VBCup!f#@LVPfZ3#*7xHT^
zZhJP%t8C`&4N05+iBJELePTI>&?dLsE33mxi%X<p*GFjtdR0$6`6N<#e@E1Ei&^~7
zKHYwCQP-j8OrndEBkw=H%hslg6Zbh4vVJ~#kK_Cb{_hGm`;|6$u_STn?6Oljt9!C=
z#oMNRo7_&U?cq?2V3kvQo;zPrFM{dJ`_)EYvlf)e1%y^qr7xd(?DdB3O7CN5SeQ?S
zg=in08Q9FX*{^xU<-?Ek&Q~ffEN?oWAj7Yc^&+Y3Z{kI#^8tMZi(_}{UEf&9_L_B@
zwS}+b`(0DsF3Gs~>EE>gv-{3}ZdFz5F1V*)*~9rtjOF(m?)A#DyPB4r+EQrnWB<xL
zgYd$><W)ScJpyGCSn@6(ub%yTNvz9zrht5Zj;}%-&uddmPk&)=+2?lJ&getiwEd4&
zDy#S>XGXsKoA)`T;A-J@t&?%);_F02=UeER91m3er?J6n-E~>5uRr+qp7#xHo_Ton
zjQY|Ey|e4Wgl2lZaEg3icYWe9%i!n>6GDpkr@Bl(=zrOvzUc0rbM+#}y5HSU`%<c3
z`qHvB-ZeJp&d)`Up7FopUj0x)#iTI#)~WVSo!3R*n{P<<?D;7A-sQ2Uoq_V)z{*SQ
zi~AXtH+OH-W9VCbE!!!KMUquO()6m_okxCa4{SaD^bM<!B>VgKYc?A6h;6XrT<xd7
zrp#<vp643A!*7ln8y!>$cxNPiLF>vX$=(~$UIoVAuYEt?dho^D*s|^m20jz+$ov1h
ze>Fo|cF*B$X-r<{df4N6C%vwGe0=&N_NwTsdkZ<%*S}1&FwWfjcGIOFC7W|@eXKsl
zrj}k;y|Z-B%fKDpj8UKVF-&=4w8o{Ik12&CaFN9Cm*sT_-kzG5#wK&Y#zlVR!YSU-
zN5by}yqWf;=`PRF-_N=9OtvUC-EX{XbLRYO<%a?f4wr3c56YjATWzO%=f8rI(^<!S
zjf1}T4o#TCc0tql$yJ-`?88pnRhoOx<;r$AX0V)*-gEuSWeGc>{;ofqT48(R+q~p-
zrp>;WQ1C(Hr?S$W-Tu0F1po7|@5<5spmqG^YDtFKhV}>l=Kr=YSh@Vk{^D=FZ=>wy
zxPNnb!!Ei$e7$Unz`E`d-zC#S^}3%d4)i}aQRbFjP2IUorzKUI8W|WknjGixxr*xk
zKiedvXnFKeAIpqv$p!}I^jBtTM<p0!?mo#~UGLH}aqgiR!Kv=$;y!OaZR4F}*U^^G
zlzKp}<%D*B<~^GP-Wet4!9v^Wty%lN?A#ZAg+F)O3eiWmbA+W2^1i$s;~?Ve5*6^P
zt=Y_XSs-6PxVz=2Hy<i<m~!PB76eZFc&a&0TH*B#aaZm_?zYEy|5oqtxBhWo?lDt)
z*4lf&IQ_(Og5M?oZ%WuV?{j<Lr{gb}PCrP#_se+pEq(Ub8SDO+xtl1@vIstXzRRg}
zO2xEz{m3s$7kM;!)PF8`zbW5bdCsCar7K&f$A2yUsrYOIvqAx9gG8Fn78^yiJ@Gno
ze81NI7U!(0&~wh4$o|YA&okkv=IZF*M>yV0V|ch|-x{fjd1l-j-(HVcv0SWn-sFIw
z)`njDJD*QxbollP#vc~_cTAx@;49lxEm>7A)gvlTA3F5vpLUX~ZJhCw=VW}+lf^bC
z{vGdD+!VAca@+pov)`ZT7u-|GOPJcTWMi^`r)~B$frm-G7B3uoPgF|qZ0mlfy86<x
zGHsPdKY4_9-IkxR#adOFXNd`KX|RKx-|l}0E}eZBabnH!#Cmb>G=&*|GQOR=dP3;J
z?TMEEt!{7h%+%a)y`KBZ!E*Nnw}eZRLMGe_&P*x}ntgleT#xe&rBwmU$x2DmD)aQ!
zM0rFkvwbg5GS0eIVbL3QF^^fU+EDF6pwWu$cVwJWlrF}d*vHc}ac;-HoB!Dl{&RQQ
z!L&4GL4(BiSEaAMT$<M;=q||q-r@vvp8nOSX*S+xAKXZ9T$`e!(9bw2!T6#lcZ2F0
z!K0h6#fApwIEePX6j6C?^H^fbo@FPQrde(|FmsmKc0*&!!r97B)0jRz)QR0bZ{^jK
z$M-*C+)$cu&GO5{EsaP0GBlQ&tFv^@RywG2alyx4)9>6@HvCF=P2w~W3}ja*{qc@r
z&GD6D+WyODXI;3_d1AI*t$18nroZk~jngws6Ini&hS&!?RrM~f_)+fm;_52bb9ZYh
z%XRjdP2zKt*wq$y-z;R^${B}3=Q5uDrN_m-<#wf+(XUfw&5P<^lzF*cZq9rlwD*M1
znpHO>Q^Hi&>D`?csuuU$?_cv%R@X<x%Q8Z)GjWvkS%2<~5;BrL|Efz>)%V()ck}Ol
z`uS)c`wX26=3!#SbCzs~iA;Ygd|qw-d*hDf0iLGkrmpI%)@@+!5OZ#rt9<>SDO=eT
zX0C=GeP2ro&iMUkU-2nnpC#M6t?S+Q9-i8CGpt|z?4>mdm!#j#>j{j@S1t?KSHiMb
zWugA;^v9<0^ONq^9oYA5-=jM3O}cKp8IuIPZ{%qg88JmJo?s}eDaUi{NgdnMK!%T9
zGyi74oH}1EK5KS#zLc&0L0@CmC(cXHx@}$)et?lP?`}%?j(x0``wpCpc+B)~r=5X8
z&O3X)*{3$%ukx|6@3{0b_`yBnLPuuHg)9PTN!y#lUtUvNdgJ)(kn=MSv~#U^@cGo2
z`~MXG8A%`Vvhv*h)8m02xBkhfD*3%vW~{AklR5Rx`DN@o4wvmKuAfook-PqO9z*=x
zRYI>H?Jw;OJMe7ZiLe#3B|D?Ls+oVy-1+xZr{}M`sxv*x<}|0N?YqY7QaeHJmdnDK
z1utioPgqwe6@GB0I*Ys6wd5>Y!8wd4T&LO3?_^YO{4?eD7T41G{#7>_?)2@JTr9Ns
zCy%0V%g(4P*Hxdl-2cp2{p5A#t}_R1qqZfbbXzUoKD|aj_}8kO#vkfIsdL}_(q1Oh
z)w!=?_qVVeU(`LH-FYV{m-@E-RYPfJ(MI2+0>RVHU0l#!<T=~s@*|C<0gciMrdN#(
zH5<QH1cx13@BB~R;^NsD%j3sWHz$1IbuFI4={B!RQ0w0Pbj}zCNu`w$GesI>`_^v>
zfAIE^!lsX}o!D1CJtU#Gl_O@x^Sfq8e>%<-SNxp5nYCRufA`7%mMx)&Dr`SG%I-UV
zvQzS#BFp>~&XT}?T&^yAC%S5f<}K@3KY@!;xny$Vmo?>Gw=+N0Cck48l=Pe+7j@Wy
zcb;k2gpP0f_qeF$oNM(+T62L*g=LNclfB8uZ~oec4R(CIzIpyV`7K`lcK@R)-Hdn@
zw#+zl!RPi}mT>kzy-AT8_35t{OgwwCzUq#FXo&h^eNKy9=D#cc7#|ak`}m^tb<dnn
z-(@v_^K({~t^3lI9ptw5#j5RBI6_-~{|-@o8T00Y?UZd-zX(Oxq!kL^Tc-HP&PA~1
z(TBZ9j_g^UbjHzKkpD#d;|W?<Qnol;e9dy4v1j97H_5v1r&oI~?#epCeqDuwt)h3w
zwLYUPzN9<1pL+52iEmr6`@vj^(<>8=x84#Bu&+7BcKy^n_NhC|!<YZaJ=@1+UfbXI
zKi_+*+n!tRo(61xX~OgSlBQJL&y9M2!YdAL66U}B?ZS%)-OP7KqpmeJl-<`{&^X_K
z^GY+@{oXL6uf3M}3|?(lw!E$7TKSjN^5CM*ymtcA+jP!;Q59zCN_D!VGgTo&)WP?2
zu+HWb&JfK_ilTdYo}IdLQ|GwAa}&;Y3(_BbtnYBWpx|beY`*UVm-O_~jqHX-XR@wM
z+4^vb&Fq5Bk}i9h8h8J_n!0qsQL*zkc1a3}fAH-Lk10w2z323Xb7{)UBOBeB7QK}-
zpM1x3?ZXAR$*Iw~SKh8{Em2s*!F@nxzx&tSRUB_M=1A91J;in8QJ&2@@gEtvd0XCT
zUNzxV^}Fj-$31I{+=Hp+AL{n>Uy5b&ZsG2Wdn8(YX6<KhOP(dR;pf}?H%wRW?lfC+
zJMU#-8EcMauxa?*4Hx6n_P#n2G{@kJXL#JD&Yc(7vOZpB`nOzKNRTJ~h<#<?JkBqg
zcSW*!Tb-57ZtybwvGciK%sVar-L0KH{g*GV@KEAw)OpZz;4bGUCg)1Q*529kj$1G~
z)$a29rM^`uH{ndS)%Ip(gB9E?VxpJWAJ4t`>gLUN!6^^qyW`_MHNy9@T)FpP!HY%)
z2DVPddHU}Exf%9c4$!{4eWOy)-9_8~8Col>e7WVnXyx4HTc_Cc?icGlAi8+M2DygM
z@)H|0g-V!})B_Hxng*p^KI;B9;G)9A!w>C0FDtQq$?J5yK3lA2F5|^_3PQ<#T&4eQ
zwWq5t{b}21Ki}`x>XV@wVWAFgk6oYmB)_^fE%`F{_e<v+WP)T_<}n@LI4xu1KjF|T
zuI|4lUhZpkNLZ%y@3qh5tXQ-D^v);d&pg$G^|fr5|5W?=%4AoI^P|`4vZ3wW)#nvs
zlSH0ba|fmF_OM>PYR~h2zT*#G2Fxfh-25q=X>IJ(>-T@}*u>6i`>)`^s(;)p%dXvB
z{5o<;epm6XqF-+hXFpeJ_<p5V{n7o(84|CZ7vFxHS=C_h?fve8skT*-XJx|mUwwaT
zcb8rHyOE>Vs<P!b8xOwmTFN9}JuU0=BcqRxr{@~^9DH0nH~hujOB;6<zAej%QhZ{*
z$UNl*)3@huk6kSD*9_k}w}10-Ie(k!hqU`tE<S5W)jQo=HUBb?Ew9q!$7Q>vUKV#0
zF7fVBiu(Wd)ah48ieDb)TmH9hw)w^PC(bRXj6Q!{?!~b+PwbWyuw8#O*{1&OwpZ@^
z^1u2p`mMW`6#QqgcyUC^|NqUerK)#X>u%)es7`1*{hlK(^1=DD>Ptgj*BO}XpIIWl
ztMBis1!9Hs9&Qt`ij?F{_c@(1Ye%=cs8v<nZAqWQ2fr8|`cw8Syztj@^JWF}DbL=O
zEREHgz;n9ieDO6=KV{G6CKDqI9pN>aru=EM<>MM|#op*hIK5cQuDngi{$+Ps{CktC
z;KB+)_BmHs|2#d_A>*~<nrYG0V^2yy@7yJNINid!b=SsCev3DV#Z9Ykncuc7L*kKj
zum1k%dh=;s=T)=JqVo^tK51cG+d9KXMrx1WcJ(KBeU1hvr6_-|eVRD`N&T#e_D(PF
z7H-|pW;k=J?QM@|f9@|bf3Sn6ZmvSOPgQTZ;3|d=MbqE)DlLyX6nZ-*&I$ZnapX`p
z=WX4KiqBO%*DjyI8Xvy7#If8b;@YHLKf<3UYfSE+cUjfzxZ#Oatgrrf?OD5h@3RQQ
znOjzsYKkB3@rtX{66N9z;k<M5ZzfmbwyK!LiEX=cOODo``p~u@-6EU&*tu`5Ym{<J
zSGN8AZ0-=l@@eW87S7d~zT&Hm7hN&s-Wzg1PAhM#*(CY6DQ!0r)+{cO5Hyu}bzA@Y
z(KC*xd>bt{o;UyDr*L^!hCow#zUtS-r}`CZH1;ggy0ee1?FL)n43SGV*+(^(&pBsj
z<sKK$YW*ot^9y6KrP(@x{lZK4{j=Db{o?WqZSPH%H7h>YnaP<3HpqqvJku3Yc)D1g
zY3)~q9eg53GY^MP->}v9nM3Jn(SwQS7rgxcqgAb4NbZ*T_q~r^e0;93la1MM_MFL5
ziy2cCV|Gjb-c~C<O|rIBTWF`H^vkb%7cE^i^~J3&;Td<9d3iYUu^;Jql=tPQe&i;r
z@2VH3E9Hyvng4S>8!U6ehmq@Z;eE@tU*Z+%dNDjVdY%3_o_%h^`_*c@>b0DGkMld`
z=6!Qb(0#4W^kueWW6@PtyNT1?RX%=w5&pRFW#EzTE_}I3i3`n4O?Gj9Y5ihxOLXDZ
zO$+X7wkO`IS6<4(bbf!@7sksebJ;h4*S>vR`<v`n@q_NX&-)aPrf5Wb@%=ur=4({j
zRsW8o2BqnX*Gue9xjD%{ThHS**KglPUNsY%LW(Pl^A4FeSttt$EpdJKHSW&dO0{dp
zE-X2oDRWbfe@Cy>G)=df%_nAxpWK%#;kEtCG+&la&i==EbBfA?fAbyj%4MA&eRP{`
z?d(rap7XHz_dh$de?jcKUJLd1f{AVS?+RA^b^AU?v)st|yl|?+;lu-NrI|j@%9*+*
zeD>i!61P*~R%6Z*_O|#Abv2VGZED9BDh1e_I9m1gN{ew5-#+z7liqBX=e|=`1WlU!
z;72Oc%^mF<_Sq-toMnyIwy|dluc>}7_>)=xMcR$-_xtK2&zPs&SiExMgDb%Y=dD@W
z(s|AHtg_VkHR}!kz0S5h`B{YZ=%cIYZq)@G*SO4EK3;Hajand9+xfJ9O0^f~gLSP2
z(>DA+aroWWWnb_7JF~zq`_#>tTPO7;R#dr*PZtnn-a5U@>%q>6Owr}PrYQ>A)M=Qy
z)g8XJWcrOg+kG-S>jE^S9{VnSd8B(+z`H5uL*rxK`Ft>pSAJU8W45H{M1Gz1q1{Wi
zn!OeL_hr@nU*dH+@8r{3XTM?L|FOJOf@=rAr!mioBZnu>Fx=DkefO`Ve#Je4azTw}
z85pGgIL<OQ@rjptT`6a|+v~1Q|KEd?x4(BgxP4i{>RpUFjoWyV*Q}bnq_h0k%f(TB
z_PW38vRsQVG>dIM*1ONLOXQZT|KCfBkB)xgt~_-8)rpNybN{c)wiP|hDg8fGS4-r>
zs_pw9PQTXiT!CG(^ybv(%;(Deqg0n`-G1`k?ChN-qKuxazb@g}pBny`bDq(24ed9q
z8x-HVsi-CH;(9ni<aEbhQ=4~tKQkonofo>}w0|~df8<e_V4vP%sf7!E^2&L;^k1~N
z&d$&Kd=B60M_<iaYLA>=P`)whLhO<plPTisGNs>2&EcBLvA)CiCtKrX%NdugpX+|f
znJdoYe&f~_-xVu+lOiQu<S*`Sdb!<mY24NaOijNQ$xe<{NalZ|=XYcCv&Lg<Pj2+u
zJ)KEwBHux;17Eb`cglHo?m4n#f?M22F2C7pdsY|Uo0^!pko{KulZwv7{3CNkl^8wT
zN)CDcPIUKJcI(W!EsytHJow?v^QjM)UEOWV8YA)S%!dV`>zDj=%wttLW6Sbv)_0+o
zE;997&Kz8^>yhR<o-_OIuPgaedc1ro!|asAjb~<DDmSe3j$F-Ms+#T3+TK^Z;kk^K
zSnIomt}m9ECQ2ooKV-k^_pv$4rk?A1tn<;Z>N4lyx0?Jbvwgo_IeT;Rg(+XZ<n6tX
zE5dw^r}#sEU}<?zc;w>Ot7m`f5}v<ndqx_!v0LF~hF0|tnO4S$Z~ETZMprUz)vWye
zL;A#S!(G9b@(V<de`Wtu?X4p2Te;io&#Hb=!6_f|J@};FNj|=49m&w_zxUoN>usCs
zI=q)ZEw8+Guqk2Izn|?ZRsS?=gk)%)*4Q3##Pi~wMK23qOyu47v2Dsyf&O~Q?3DKo
z!V8yG>KUiR^FGkIn)EA<Z+`y&3#rMU+Ui5JSsc$zjmWxKEaQ9f$a~41N`B|&up7rD
zPl)9ER4l$aH$36R^_8|+7Q7uRCjKg3)BL{G(@@HAUH*Z)A1}#dt7yH6vN+jx{zQ>f
zZ?@&zh>mA}*mQ$#?%XwX(tC{`5=}SynEAfO?tV30```bD)#|F34L+=MV+)K8FXoc{
z^w0E+OyR$GIWsTjNvEnlnqr;0^tHKQ)!$ep(<44><Q917e+#|N#Jp}^h20OuX+Ey0
z-%Lx^%xx;JS37qiG3!K*QSxpMw$riGlb>hpExkA6*-eYJzWF*HUmc@Tx-zfub*$L%
zWYN;!8JB90H$9SWe;sA*`!$ovKVK=iTR&07K5ZJKx{U{?Upw2ue{0nL%qx`SE@)VE
zQBy8><%(nB%N+ykx7`15{l9j%^{0iO_L$kH%&o}Hs_i<M8+2)2M(ok-k6EuwIQ!zy
zbUftx<imYR=Ii|_@1y=3yT<DY>D4)=7sj{o8FW8g`a4GY)bd@M{9G*;e2nS2#rylv
z9_y#+T`eEZZGW2bd}d_CC8ybc%Rct`3$3u)a(`o&;1#|_C!Q!Woz7+1eLm`$m7UL{
zc}2PA(alxI_N+P=XrXlHU&qp5<%s(H=zG`2_g~%PxLvl+U|Z+bqYkGRt^4#;@mJNW
zvm$5J_gU*+w)ir`H0i3eOqz{B%I<j%2H!5bx^>$0nS=;N@-{K|?b~}ktL={T0gh>>
zRxG`|YXaN(yT{loh2B>hPFB$quCUFyvVXtdVZ-+q&D6ZTUFUPZw@ccv%f;ElDQQMt
zZ}o%k-j|NP|0Ga%rD~3J)trxuy?%yxdfv0`R5+9qASAu}L8?#M;y=M>A7-jweZSwH
zr79@LfY;~dy|2Z*SC3`73EW?k(X5(Qv--wihZZq8?kk6kde(9$E+{;);jpd8uD0Dz
zd#YF#Y&1#{`INGlX`$asre5*Fsef`>nNO@+bH}7=gX_oXc2A>1t5-z}@l9__s4|I}
zrzO<1-BQ3xCc$8J_}kA%Dr{$Xzt1^t`}q2V)A#Zd^H<hyIOu-8$mx^bKGj8+m4CkZ
z^3wR@%LoJC1v5))1%;GXL@pG$+&q6yNwE8>TlxuXj+55NDYU1sp7no`vh+v>)3uzi
zerNNRb5~cCFEy-isWeYGl=kV9rgrs$9Rc6DU#&RQ>J`ppt;A^bwS8fw_qvCz|Bm@v
z&l5MiaMM_$tW)8|%nH#DUmVX&&7Qe~M<b8z+MJ_Tm~y&$f<?E<E%BQ<Bmd3wGr5ba
z<_Ro4c6p+}V<8tSKhceOVpq#Pse7$Bw2jH`30GN%b^d{rhO05lRAUuojGFsqOb$AF
z$C<sguw|mDROD*g$_i!XcZ+AId}5Uk=3Hb`&(Kx6D9!c2yRaK)=6lYu`Tt|?^@I6B
z&!@k6Y%xn<TA+V|_rI^)sZJ@uorll7lzTew(Z+mD{ijn8RI6KGO{@vn_~}UCvckOk
zuOIxe(Vo3Add2gfpUWk?ul!M&sP$i4T8wY;@+-eH&u-UuJ5+D$_=x{#{*psiRX60$
zYCS%?ELPRKv*NGT>3S3X*oaLZPHd5M6<M>TZQePRFHG#KSrfMJ^2qEI(7yVp_1^(+
z*+c3jhovN|=1lpwJ|;EGNAzCX|8O&3j;1zypI_CD=O)N4ZQZ!HPQ*RSA#$>v=eHkE
z4%(;c{#N-|c1KRTz3cQ$OJ?U~NshY|onA#gpVnme#HVy>(ZaZ6kJDanvRRNAr~A-a
z<by%hg|v5NHa`~CN#v~6p2!*Cw5D%Y=A-0o@`7bM&Me-yME_P@CC5KA<HZb5GYx`!
zmQGya^)GnNO>rB$)Yl2l^)Y)NY4M14{aLSHkh}PhaIu?7P6@Yh+rQY!%jDDFmgF+7
zTV=RUR{E~kyk#y6cgW5>ApV8TWJ2-5n&8yE!RN%il_eI6wQio#vP9IdU)eJJNyf&n
zn%P~_%1YM~7kv>7pT(<{`l^X1r{hh>#fW)#_nnYVUAU%iK~_x1jrfp2Wn+G($$fcC
zl3sH+m-cS_bDK4L-CT*?S55kERI=_mz4XhU?4q;YhHhF<9G~S+`tz%}?uUH$<FD6N
zEIqeS#8_;)*w(KJm*+Zir)2D%XPLKo!J^yzS5x>V1v;!+eo2o<he!Eg*SxiXZ_K^J
zPcv;#R-N<yqC$tI^}2{HEp|e$RS(Wr$t`8kYPle{?84zIwLZ`D*6mtyi}9j~)o$kt
z>n=nw2x>a;GN`ABUpZ6uWY_wMNoRMh(@a{%{MY}hL6T!AyR7Au0}mJ9i{I@S@TsTh
z@v-C+8+#r0f0GrcEUuBrne(ss^{x0>mKPa|)BD#iO?kQE#^<di!3(r!t;l=Su#|z}
z{Yobt$L!Er`|C^BCHXo{{J|(avFvp(tMb)m@grM29?#6XHb+(UVSKFeg1ht2x^Fg<
zv9Fl@J>Dut>7Bpo(WV)DmE3L{`n~->ga2IM>kB`#m!G)1=-`dYi4*tC=DJXPf$PDo
zq)=<s)eXs^*8?`kc&|S8`k<1uR6*JCDfiwpwBKy!xU}jzi+9YLeKI=_e3LV(d?EYO
z{N$1C&+_{1liIkBt$tIzqR}GNG5&Hn|AC<IwGI1jPUKzvTl}HOoQX}2@8WpH+rOs$
z{LiQ!H`V&-$pd?zPHT~>4-<SgZO@wNYW~c1TJ3N4H)XD2=QBTUDAlxm@*=^<OFjAb
zL@2dQ`m(a5spnPf?=EFw`HwGN1_s!B-PdHkedq2L^X#P6)9kn}$*s;vne(yj;KBWR
z_Zyb%64&bp+O+P7VZeezS4^*Mz2^I1;ZyM*<wTiFMq*n^_nAD@wQ#s>9pZb)YfYHw
z<d1c)v{d?L|F3<xt6^2l{bSOG2aB81KQ{E7JeT?Y(+`#Befk^k#Kow`-w5`-c0Gsj
zBtvg$zfX@!x=-9ZmeV)gw%s{&zM$-d)q`6Re80|he>OSyz<bNQweiPv-*5i;Y^Jqs
z$W5Nb(njJZI}37|>^Xn`JDry#%vrl5Avg6i-+!gonju$gxn^^gPe@xPxz%LNf>ZJf
z4W3JDK9gN~+DyCY$Yu?5w}p(xr;@m1YMRSEPwnP9w0>c|)496yQ=@mxH99nJLbU$1
z<!Kw${MB<7Hq1!By2*dL*j@h6g&r?c8$ve!3*M&i<Dr?qW==BSv8m^Ul9u+#Z8%+H
z?Y=g!c4upk<o5ilVmuWK<Zd6?^SC=zZ>mem!_vchwVVtlha^p2mc1nL=<50Z%b&}d
z-Yt6gNBW6;We<Z$;^LT?dmqIbw=}3JRS7<M^Qu_v{&Xv~xmrAeRX4g_7FOELy(cq$
z(nF=XgIzcG*G&2Es3emi{q^(Tf~nekS1#Q%IHeu++)BO9U*TfW`tmrXLT?Xc)uvCe
z^Y*U)ke-xXeZ8pDMKP?pLyBi}z^(S2Ios=hcCNm&>7C<8r8CPn8lB#z*)-|QYgN`Y
ze7g_(hRd^*DK&XcS}e9iFj4&g^Wi&u$tgmfnVhedTuiabEjY&+y+!xY>UP8X4?`Zd
z#-wmb=qE+AdTL3FWzKZE{hlk}D~m#6{bT<h>dl$<>|g)(|1M&<n0@)ZPj<MSiLM62
z({)w}j~8S=HMZ*2VO@9h-DCj+Iq4=X>Bm``6N^@E*d4N}l(kUz|FR82d<No&jvYEv
zc(o<i$7OlqDeoUK$M?L9zH?Y3aVz7)HwV?5n6K>-<(W{^D<0YM`#8G}kICJ5w)Xd%
zWmSr=E?B%sOp58l#`T{BzE-Q>TRYF&BaZ8|zL6{Q+VgKp-@EL+d+ut(ft1DyN$$Gn
zptULQjX8?cr+argD)nj=Nz3ji?pS!>s@<#D+;bm;3?2Nw_>@j=xWY1TWs%e!=ZkH-
zeWPWn3}@UssbjD_I$-)VrR5V71a@ip&pm0rHSD$c)cYHzH#@%Gv-p&g^PZBXEia#x
zXXQv-(OZ7Mv|--vUT<&1G^v7eo+^FW)S`<|FVEl%<DRM{b>wwY4!h=Cjim;KMM{a+
zMDB0sGkkHpGq{}Z>2|+)aW(<o58U?jvY2i5syKPfmybiCcK79*TOACqbho)KdGBMe
zrmLeXbLyg>$IO<PiJE6>ie9$UeE6_&rhf4X`R(r+tlEP;Jf+$0?PWjoze)M6XsnfT
z=xvsAsS7_#S-xy}w$61zsEKRG)b%~n^3``T&S!VYY_03)bquQP`{HaI-|#8*cz@EQ
z-@DVlnY=G!(zfJN$w-`A@?+k2x2u{m%!f{JrYqe!I?F5l=xY{+%(#ZRockW6?fgEq
zgRg$-5{E-O{_foNk#~=!|9;;stSVxE<deTWzTP<dW=HXS_crD?Kkj*GoVceRowbs!
zo6Buy9rMRkq6zP`+wZQLwc@YRtS-*dqD2?FtbUkCR6gCl%l<yo`dOb#!?viVuZy>{
z;atxAHtywY9y?bFsgn;69e&!VyLRDW)^98|{SCDo&5bEf=G*$s%68pgtK3)DJ8f3R
zv6{mvQ^oX8tS@1go%!Krn7nDwy^MtugJx}3oO3Zp*KPOytM>l?l|3IecD|Qhure;x
z+w2D)hluX?sAV0U1^*>_4}6|6m95BHEG=>7wg^7yKmX;P{My&O;>`ix-<46_z5Vv}
zyKePMF1xt8uzB~L4eM^FTW9AV;5>0xL(g<>=HEVlZ~X^ae|68#=s4wh^kC`v6XzpJ
zd%Zg?JGHaK_j|XT;+P}(dQs#v1&uQQPt2?v{Z_x96TaUxt%rSO#kQiAcjgrtM17H7
zUvhP6?`^y9RXY^_<&|FB^g6!zePh#3S(}40lQ(qCeS1fphg<$iOrE0amI&7^Q7!VU
zR{J${W-6vROpL$Ib+k-+1>>|(c5f!>V?UNW3{pDqb>{@fkiC^9@dsHeu6&t(HM{q)
z(V_B5Z|2Nj)%SC?&&TV>XX>om@kCN6L(h<}<6q+TDa&3@d)C4?CHM28cOTCjw{^2#
za{pq6euZNAIfm(XBSU#5FZ##Fo|&Lf=_p#nbkWiOQ)h|%{r_pc3mYYv7ACK7y&P7u
z{BRCuw|ha2phE1fU%S+INFCm5uTUw#%n)bz^I^-08!s2Ee6sgl>EHD!s`*<bHt1*R
z?0r{kA2vlIAbYK1x8sqC`RkQe<u=|}`6<BRkz~*=!^Jbd_8lv1Wm(4aD<Vbr-lrsv
z)9QXst@oGv|C^>z%V@<_(S5|`3FG3%-68J}+lZf1pPFs)Vs}A6jJ?3;mUZ7##KS(s
z+eX`jBunRN$CU)66qUYh*`x3B<?`Ygi{E+$39o;&%%SJhQGU;~;|C6`ytU)x>Ro%L
zpVIdB=qeYil$tqr&FLl67#Uk?%c8Z)90K=zNwUhe{#LkpTE0{3vx<~RHnv}LY%Xgg
zORb#i!F{D>>!N%ACU$Rm_eLyyV|<Bhv*SB8jar$|erXqPKWq62B~v?_DO;Jg-d+D-
zN66}6X~8_f$19AdH3*BduF@%3#oY5sYx;4{-mliPoqT(47w=9tSUpL1FN343|8;rm
zJ^s>vYpY+mxH7vO(=gpAdS%8j=@s2CFN7HLPwlljXZa^S>s#H8i*_~!vXV2;FX+$<
z{(rtw`|DM^yd-glT%CaFQ|2-${7(J-!-rwvBegwGe>k0W)O(Y(&wG>Y(GOXB9E`SC
z`=?l4jye)CW9wT7Y3I{Ro9F)*c{$a%hx3GC-NqyDDs=c<&pJu+Z?W@}_^S2e!3L**
z+cRc76khmpZ}T6qrumUSDv!r9K94GQyL{R6Jg1`e=j=v-4FQr@)7gqW)?c=8I2EZ{
z$>Se0d-E>sR}WHKTic?$(kpJij%=ELU8Q@+rHvbfUR@DdvaNH;+-up#9&ygPJXQPO
z!!Pfn+fJ|h_v-To>xn<-S}7&AYt28$`rwI(a6SK8?}DidS`#vU8Y?MSdwpnT@V}E;
zbmm%h*b!xIx94mcx+aG^`t)=i%pxDSP4Cc})S1F7H;wg@zEjCcmEcgroSjAIx}um*
zu3ab_-7Ixyb)55`H0{WM4!1IU)}-BB3wHMVX<nF8TAbFta~;do8|#Z2E=lLH%kur7
z>Tp)@<FYm4XBzywU9@NA8Ew+_YhQAfw|;-or=+!3EP?KtHaGY4c9`xIaVyv>wP!<w
z(kA8g{;BmJYdVzg|IYM$due&^ndCn9?#0iTuku!RUC;Q&SXW>9==GL_i%WHrg0H-s
z8eP!5`&*&@R`sKA${y)3&D$8X$}z6~_UeVVq#u7Q`0N+xZ*wK%lxCf%0skcd1?I-u
zKc1f$gWv4*(3<ybIeYdBnRzqb@6Ek(|GV?--RUQ~6Y>kq)st;^&ffRu!|zS)R?ALo
zYFh5Dx=v$J{_JN;3u1qtpVBOzB{6l`Dc$MpO^ffyT~1|nHCd75wSC8YSx%v^UM);3
zTzG`ncqaXptenAkx#wr}|HKoAHBWM-Zq7TP<yw31*TL$D_obgW=JQ^cf6@Qk_yYg;
zO|Fb*54u@;&Ez>z7k|U#dvBA=Z!e(=>9?g5oxdKB$&o(gc_g&;R{tldV4tU#e$Vyo
ze09+_=tY{3h-^pwqwfn__sX7(4DSed(paamRrSxdgMqus?<|XS@43_|7Jnyf2CvZd
zjW;h<UNF16D>`eFkMW6wxHV0O=dxW~FgI<I$W)2v{_N9ke?LEc>BD1z=kjtcM$NKl
zUAkKQQS?OpoSiyS-y-BzNGx-netG`|p_%iJy}8eQwd(Gx%AUPd`mCzc7-LgbbvnG}
z&pfnF{oexb9S`20RbR7oU9{${Z<;E-%eZ^GB<@&r|CTnt_`q1ceCPiS^O~1kU1|DL
zJI>%+ambxnS9K)nnO=NK5ZN<Ly~A+Mllo_qHhLxgYOblW-ufUbc=0^{Yu0fBS2>y3
zD|ZLVFP0Se$QN)r{p@G6bMuZ@zfW+;*#GgA!kOt85;FcAc)hCP^_k5H)-CIMGCps<
zdeO?i%!i5l{wkAKn?pW?rl`M)IyaSdT7s0uw}$VLJ=26X*7+E}>=V>IRsCK&``5QW
zx<@y4P1<<$kGg%@8u8#dr&)(?RPbwyJ^r#wQzAm|ByZ$)uH}WVcbV=G(3@gE>tJ+g
zQ`W_lNnM@ZqW6;&zPDWo_IN7sR8H;Yk3}=1nH8^2zdK)kq1;;ax2r3k_!kA8PCgp8
zr2ekk<V6K13-Y}rJneG+``jpAzABG(3x`0)$=j9J1C)i&ez{w6d%>hz8+dkScCFF7
zGFPO$UTn^~R2zYHX}T<}F0z?vFMe;3oK%sSTXEp5noFkTCZXlbCyy3&yQO)zv^rkZ
z5_|c5YgysfV<HZ^sXdc+CEI6-M9+S<{(;&b;avyf?pA;9d%8BVBG83()v=&{%bh!>
zOKvV#4R($U<L%<-XexG`#;DvQ(ChQfwaqpsJA3`XE;~E(ys*%JqGFG#?sV<5dpx@|
zI{%H)ict259V{UM3(V75ee-9w9*QdXdUQcz#N8NqnWFhQU!NDRnVbFQ`)ZDZ9hxsB
z-2ZAFXgcI$|KX$7yXnTs-Yc&#>tEiPx8(G_vWXT6u~W8BJyASE+}!EpKhG60+%Bu;
z*B*)bxLECMV}!lbBL4TDVg-*+rkC9{OxZ2KRO)abatmkriuJK=HDBaZxPL0%ZqNJZ
zVr}tzZ-jTU--2}hEjHCc7A@vhCi`<cHW(z|bbH5gT=DUqZmY-sp(0kgI)}I`-87$O
zNuNAjzSpz)M%lyfPYzDgh<vg;-`{bIz~-pGUh6Ki9JYUXn8mC^u1?Xos$lNQWx@{^
z{+lyp<&hU(f=|s?*R*BKU-|e!T(H%(AE^QycSS=jOV>Kii(PtmiAbeLZupC5hMa<8
z0(bZhuM(Rdwtmj!Hi5wJt0JFgZ4Nza^F~|pu7;X>j0nfuG%nZAyH{oxuZV2&`xsF>
zx67pQt=d`hvurkN9eVy*ytFIXd9ZkE(o3E!i^-+8CEv4ObB~Maip`#RgYkjtdfn`4
z`}kYM_Nbp*wXj>-_=dsT$}QeX9>Ut^6AZr3s8tGyD7o7-@s9hAlBRmU4?i~Ksh+>`
zPhn!!*|7gF6F>j_^@Q*1nMjZJ1sc^)9Lzb+MSrysY@c<bJHanxY3QZ*(|@hI9Q=AQ
z*VULA(`QEbd(4-)eAoM_RMz^v7vtZHZf!aDPuFc)-GNU={fYtUJslR!{3p*SSN#mN
zh)G-Q7<KGeu!BbNhs6iJz0Js9dW^Rvci+zm{F{ESpS%9?wXio96M15{GtBD<kTCjg
z8c^7DoF#pw<K2HP^R>L&8O`U$9k{{i9B1Nc8?;#@PU;k2-KD8t)cp-LFYUWJ$7GV$
zivM$GR>vD3n7&q8tTC<6&-?#|w+j>uy+nm0t-BOri=IySc3z8bv+16gij7Mi`22C2
z{>?cwP%eJ*^l$f!PF~w!e`{{n7oYpOH`aeSvQs;2-_m8mdzt;?WLzVd)@i&x*Vz-H
zdDp)>=zVOdj#Kz2je94!zkP8j3O<tTaz=QSbnKhL3CluHu&#KZm3Vd1!Haj9S2wxL
zos!s_bKi?q!gcjcj~Dx_c`F1bZ`+<OAoYf~pWk@-+|~yd<3GeOZF+a1ai3{_+vN25
zc5RQJ=c&zDW#%7n=x|1avR`ks`h>YQf1`!uo;YnfZ}QA=3;WiIt9H3{7=4_%v1IxF
zpe>oV8yFbaLmcM?f|i78WaK~j8GBD=$BtJ=uko_n*EG{=|7#mLhb67^aDkz7zd&T1
z$$`Wwo2=*qtB*2Nmrl5I_xE<ANypN&S6u7p`qunMw0-W8``;t)iay)%T#voaL;u==
zBew7VYq={<u6*V3aot>|{n6K00{?a@&)WIz!)K;lY0L6kGMp#(?zy=lFKf=1<$tF}
zm7h<TdZg@T-|tE8OPZeF=>Np;es_oZ%5{|<`yan!?b`ayW7FiRzq!m01n`v0>R#zS
zI3xAJ-^}l-5naEtO^oKpT`<X-Q!87@8Jy))w0F^zMV}l@WYq;EvW#-nd=78>eX4kg
zn&RgI21C8vcSbB*cHKTNAu3#Jo_AZhyScztuiWGQM*VHmPx8vfX>Dr>=3LzTIC^#2
zjLq}D9ef-$<C+6={Ea0q1%CKe-*9YQ-Zv+}a;DhayyZf?oGbjh#QNgZb}XH?<;;<j
z3)r)R&d)pWXx6c<3jW~{2l8hGupC}BQGOKzdmK~R$;Qe;jo?WK_@8E${@l7|=0__<
z^RCyS(X-CnKcV^{tZdzFZUdcD<&%w0HJ$AAcigX5pu0CRLB!tMBQ8aU+i^?0?yN?2
zpSGGQo=m!}J-o6zJb%Z>h~HHbX4$rQsc~iS*)sw=<7e{JbL1s*`<qx+)Na$57*luL
zvOGGeWaX)c1%4Vj_ka2eWvo6kODpK}hN6HIcXrH;e4wNe=hxc8Z(N=3%w<!NCAvW}
z(?apF_s&RGsVI}xb)Ec26+Di%i$`$I;?R}-BYsBbZyrzL>fMb7PFp_s&*!~RCoa!<
z?!N2)jb9&ZTBtEU)!1<3?L`yMI&QhRC}HoE{yUYN$HEu9$o$d9UYNc%F=umZ<<Yp)
zAC0Fz)RogP*65vCsTuD7I9;A~zu)fJF3MJ4SEXg&x@e^9<Nc5?x88m6v@{?6%%^tp
z>c*i#Q%)8}zSKJ}v`fPz;jgh|szhARwk@BZ+;(Gd`<q~LsQtmqq^fOh0!P-LPC5QV
z^L(qr+A6&_2Ui6(^}S$UFURp*Ry^-rh4l9&nO44e@lO9w&0aiP*=epwtG1Pa$zEyp
z8IG$xO<69ij(4`1EF}19$2F1Y^EO^@A99)Mgmo`JcwW)faar*qWhUe4KcqXlb3T2a
zk(eRar@1Bh%guEur{*8qmo$UPG(aImVb7{1`_;Y+&TxLZx1^h=JceiYx?peS4*6}1
zeed2mDL1w5V$SNa+iiLA#j5Lkez|wlaC}X_8zqr%c0R7<oY|)ed5&*4x|&5y|CVd7
z6=)6Fyf^Gxl!(vjc{d~fzk9dW|M=XlH8+jC=Xi@Io^)MZzRE7di!HAB_RQTAH-3$m
zm54}P622~z-%xT}`XwpdRO$49C67-X{I|^9+|Ziy@x6(ReX}=*Bp*1t+_!s?^5xfu
zf870=akxn{?#J4DZ5F!=I}$JHa^B0I;9y{PB${XGM$xmIx39JdV7<{5A^t&L|780P
zk%M{HYKr(z_e81(rymq5oR>4vu;BBBU~z-3GAFmlL~73Mn118*)wM@>43#$Rn!T%k
zi<sQ*>bJM<I-LmWe!J%AYy0nQ@!?#xPY#vaYL>7$_~f`ve*E8D(0BXu^!x=(-_G9o
zw7dG*y}#4;9Gd+-U*N&Kpp(yUD4BRp>)6w$;!>q!(Ya=W^djkJ$5S2OMIBmwSg-ZD
z%Au|LufFDAzrS^A*_VUn^R891T&a0#t>50z_w}Qw!_}S#UuBzb+iexT^8cGPYyAo#
zMbUZ6zakH=uzqKz68BB)cWg`K>N)+l%EbRC3iiE7mlODN()svnt$U3-#cj?PUjA<>
z`ZNDw-t(4}7MTa{d2~I6#AQ3<orGO{r##8mk-uL)UF?CH%j)J03mUT%chA~vm#?$T
zTxl==CQh#_D;RdiTGxGy+4_i|^-y0)hBoJ+vJ72&-rZAtjJ3R<o$<Z-tHLH<<d*uX
z{r}yi>Z-$*AE=)#%e^;M_{BrNlQPWx8|$~4X$PLGQd{7?!Y=;ucBvz+RUWf+|1NQ3
zVxGC#Xqs)+ub*)_i3g_ZU0ZNuJLmc5o!8eJ#+2?cy0y}TA+1SbZRsij@uQEmB;H;9
ztx{q0+%PnvI{Qgf?~0?VqWp7DOn<X_iv9)bmSsuTAJ+!lt6;qL=Ioz$YcDLwd49k7
z^>ob_k-@v(pVZW3@D*iQ9<(Xu{X(zIPv0tLsw*s>EP3vW*isf3*6TYC%6cERzZWD`
zF!#U(^R2rdDF`_`nmm52*j*E1QTTq<YqpKyZPt&ib-%XGY82ke^x15Nv#_gn-xq%G
z!oGjbyIi8u9O5=?Wzv^2mpfVeeb=@(Qw8>gWEy^9Sg^e!zsh5efX2anJ1;A3ImA8f
zcuCkKjaw}bqPHX@Rymkk)pN;dT25)o`sh7>%HzNf4N~ekXP%0P#B%t=T~la{colo`
z6=%X?-$Ryfn7u=~&+Dm7k9m2*qx0{rcO@SK&OJF@*N~J~`%dMy(#5r(=WjW?K)kd`
zsPMKFWBxbojdg|x)DxK3N;@qyJ-I2k(|D23iMbj3jp`T!dEC;2ot~_F6B3-xX|i^T
za$}j*@0P0!46IKX=M}mC*Etrc{O#^useik)tPj6a_j%*}>HYa7XS>r21m<!r(|J;o
ze3p@0y|PjGuv9k3Jag~IT2DF_{oC{XQqY_JSqG-?OSyJf%WzfT0yoy*7R616&6;Ff
zvYlT4*s9;0dTHjgXIK6`xbo@bA(6djmnTXuJ8?HG<nNo%skWadt2s(Zo_~1dk{p*i
zcT4iEsq)vO9-RAm^_S4bS7+6k_iT)x*x%H~^zB^}-zD+)i!B^EXYJKJ)A{${uhJPW
znBM$PH@f(lqx`_%h|N!|43g`noGbR9uGYkGsB-4C!uwlAD}Vcx#;*uu-{st`^ovLL
z^^`h3tL;o}b0TtB;=5;6Mx6~%w0o8lxOuKc?$q4^?cQ%R|G8<%cAqJ<K9Iqv*F4SB
zTp-|&%45!(yvkjHHu2Hl6g$l_PANpM4ea{rlB_U6o<DAmhvT`0ArAdz*Y1CEuCz!p
z7x)%??xY<<^r4EYf3?3)c;z-b_wbtleFfgb61vqa*<6B_Cu=Ii_Y42qaCzCHd)z-8
zwAdeZwOB5l|G02fIgi$@A2;QEzLZZoeYI)p9>co-AIcu4-P`=?sJ{2Y%GOURcfHz!
z*m9)2<*oQ{zsNg%{rAP7+dk)?%zP*t*K})6lvU`53ndZ1trr(_Nv^LoH>=#}8L714
z&W9kI&l3(c)SjHtU#jdW#oE3t`q+V+*Dkr72z}A^#ly#K)}8aRVf+_rBR+juqGKLf
zu=RUvQ2TfD2{8_==`Z7g%ah(6y}S3?Jx-SMXN-N-PS30elfINYwefP&>^C=-Y}Q?q
zAgZx;wy4BhAr==|=0_ZR?92GwectE3<>4(_5MuS_qv>aXBOkUdUFX<;B;dK^-#M9C
zs>_WRuFw+}jEQK@e9!)TnWN{XIoEg0aEYz4IkL>IC)H%`ea2n37007)?^(Y@?bX9M
zOV(@@tvNYufmiKo-KV#?t}YMW^u~pwVcXp=IWO}3>!-)xyW+e0>htUG|1-K=E|)l{
zK6e^l%N_UVWxg6>TMkx<gtFP!A5+VC^PqL2@&TKM69xw|l5W0EuF5)VQh2>3qUTvm
zL;4X5-P{SgqCYG6{5u}K>zA5v#b<_nZ;ze`o56Bz=DeO}S?zsQ0*u;k!!L7e?B#0`
zl{m{X{l}KPwDx&F*GW&kSeMTBG`Z@Y>CSBjV?I>ZvLC&|eb(OF>5O`~otO~AX$I}=
z-#<O{{GVvfoUkCwiAB5aT(afyjtIFe**je9nBGpfE-t72L_2r(hH75zkSXUocAnx-
zi`r;@=AlnRxMQ;_=ObqGRQ28N-(K9&d#K*deE)=N%&Hc)ouZ4T$tUGov8l{z+Z3}n
zX73`6b2IzD-<a@wU61(UC)VlbAH5fP91!*Qm^^>rhFNYsxz?w4oJ#+6ex?7TC&!<^
zxyNzV>#@|~zshgj@BS*C9j(I5Y+&J1C(OKF*!#S;_T*%PlX6oR>NPttSj^)1mODA>
zv30VFm)(Plv--X#_I(mtUZv}*@Q&TVlvR6{(+r1eQ?orx^<^~o+56s#<+<G{w_w7h
z^3dGWoAZn+53oFawODdZi0g)nHZrFcr7NzDQJi0-`1TFIqxrL_GfXqh9FKl{@Wa1s
z$49g4t4ika>~oUO5q~0Z&RYG)MIPt1&x>T9PMx&D#5PuMr(aXljM)DU#rc0(w<{JY
zzE+x5csp!u!^&y(vo<^w$}02s`^L$maLqBtChf(cHTA3))b8u=;oY=X;Z%iY>uckC
zdpf7B|8wifR4>!7&%QOzyjcD{DCgF+lV25^-=0su^SxA8^YLbpKaEo^ZCxX^ayM6!
zfT>{i$A8?rWh<L=&YYNfZ{kkf>6=cUov=AT_jGQ%@oE0LYdgCInZgSGxj6r0QaYZ$
zKk{a;Qn3FbLCGC^)<?{=I}uxXCGX#>zqV>sdcO{5Z@u{=cdEe2x>Utr`J1NG%6O*-
zE`Gjzf^G79kB+oEr$uyvW}mbb5m^6W&gJfz$9#6)s+||`-nj9_iz5$Oc-1_L`LkBe
z^}A5OlC;yZ>yTycr~k$)1hap~&Aa5-y=1Out;cJF7P&c*jVrrN4n+tQFfhn)JI*RI
z@rgHdeScCS>x<`Zg&v#R$KI!0>d6jWZFu8yvP=3Wz3m1%OE$OK#j3F#4(XB$e^>ec
z_s7*20?Mu&&S+WoBkk4d2|s4dUp2E??fPCBxl00{?+Pl)Y_s3<rE(g79K*qgqL8Wf
z|7NVZ{>^e?@k#lT{^@U;Yh_nfte9C8zs|NYTeXI9b9Cvk4OYzyr&Y;6j(oiAqw~jK
zl5T57&+9xd;CSFB6Z~uWg~ej6>=zGmzi-@Q`sxeghLwd(ryo=-d$P%m?M6#Mi@l;q
zkHtzebBB!T5BjV6Q*E+D{5C!kDBV#0<ZdJPT9dWrzc|0S1a|gGgsSgRiE+JHR<-7<
z8Pgqu6+PZ5L30_|wKUCme!b_K>#_8P+ZJQR8zE6S_iTQ5&n=Ui*uW7nIkW!m_wxJv
zHW5FC{g(FIebNw}Q1>^j<dFG0*IT!E-%nrstyAL0M1#JQ`Mt)MI-EGSu30INJgp_A
z{QmW4XHST_D>zu3yyPdnk^kV#$=4)~l^MrJ2<1=xueo*U2Y>Y(>6s?WQ;UC1aTB+<
zOPZ+_(!5tNr{T9ihiqdu=giu!_~~D~_h=-F&Uu<upLluy!DxLR4fc}P?FE6(p8VC3
z8?H+l#{An`kXh8Fx>jyQg`@AIFWGx<gs#6ghaoVjpMS--g7dw9za9u#e^@ZR^3lx2
zJ%1f}<K2=D-e2@5v*BjbpZhU=HZfcIw#MI1?ChVkZlbf}l;YB9e9mRF?C%^Y*w8hD
zXJXm64G~qm1-2VBWDX}!{Ob8($=ye?-8r({$FFl8J=Pa+fBC%Mzb>1vpWFM1;XvUh
zcg@eg*pjq!eDb6If1C2~hvZhK`B7>CT$&TVwFhe3?wb8(+7rh6ri*+(&D}Crv?0;I
zbnV%#+I?Y{-)cDSRXjC)|1I~*sq)L8@rg^_RxWgosN}qN|6gK;Ox1IbZ$;<W9_ene
zJ;Slz?qyhse72N>NYVOTv-kEHT0U=IQs&xnB!+wY(YW556>_2OuS>od^wynMnl!D}
zZ}}R}vzOOM9b$NLcoIwU?U;|A68ik=-4{C8_yt1(8=t<e%9}A&%_r`5#<!!hmK@oh
zv$KIOW6@_-^D7&zIbU?TOwzbMyOLLMOBCC0L7U0|tGnSQp_XYDYhJDpx~Z2J7;Uze
zE!F72s`k@5xs`6W7N0Npd+XB1C(T==xSW1fOpMtjv+qgrc}KSFkpFAVezW>`o!_xu
z?_?{}+?9R3TXwvtFPnJzKY#F-mDePNmp$yz*zRMHc(pH1(ZF|t#-bgE#qP>REfko%
z(C2B@oIV9<mYtWoxZ>Aad?;VN%XIP&dx4{~muDUI?R=1z@qfOx{(BF3soRV(oWcCd
zozAhg%rja3Dn|J|zl>GcT3vVlnLkciyz;-6@c)_XJ@>;`ryUeJ?e1Cf{9+0Vv(5AJ
z9*>6G=j3^|Pp+MvQn=`Y$hPV&SBy8yz0s|<F51F%t25%wx|>2b))pste@eOg=!{Rh
zXKv}_B*Wg5`Hakuf1Zxm)b4nR@uD~5p<Fj-(GBix{1?OQZkk*(*_^UU=EAG`IUf{{
zm7m`dI5$)-zHL>S?qT*z_g>bo>Z{dCIHMx-toI9NULxm{iS4RiRBE<Vyl${R$p4D_
z!ZF*w;;$?jUhiL({{P8`$v#hfmdw4s!p5iF<=CX7X(CziIovaOuZmyXdPFF(`DsM-
z8GpV*soh(SzjtKId6jhW`o~#4LFPq~Z$7kcRoWp|X7KsmyYlom(wR<uzpuTtmFBoM
zX}ZwQo8O#P$S*9k6`gk1-}mPI#Eg@cm%28GCs-IpPkHY;^+!>`?rUqLxF^n=EI8AZ
zQTl?hPPFDEH)G`zw(ww{oG6DlA&Dv$(+8{noImfrLrgEBA^5>*6^->~4T1(1^#!fT
zamF7PU*8fDyv_J~o8ofoyGH}9!&9|(eOY(-H>1pL&98Uv>nf+K=$=Y$`g?Wp<z<=s
zc~<pZwF%eVGx1;^1M3EcADgFF#7C?tICO#Ww~<lvqsQ!_Q+GEO=AYbDztq3EN7Cr#
zPo?9N^8ZiHQhIN(ZN_|up4$C$1G1xoBa{lQ16WU}ZMJKSZk_EPG2J@-go&+-n&l<g
z`v2>my8VB3gY{!$%HlgB|5+mR%Hzc{tprWy9PQb7#VP4EFITCEoyKa<*^6y<YEPA$
zqqS{{UJKj7qQ-64e^iPs?z-aj#Wr&9B&mDBp-+rCj&pZqUer8#Xwtjc3vX*^%~D+v
zJTD`zM)&ZC#_yp^IB$K>V_=Hly&U(!|Mby`JsTL+fBn<@s*<nseELKG?>VW}wkaMb
z?o6DzI_!e}YIFBBwz&s$Y#Fm!zDP~15<XRWRZPq4!HH^%vOI3b`iUWL=WJR$Den1A
zp1RMD1(xRDmFAw)*>~hp!o0)3_urm%!0Y_^Crd8IoO9ufIInYw`&A^9xz269>l<HP
z{H=HRE7SDweIK7_us=Bv^>ks~y2V=~)dkLZWX%!$S9N(W*Qe(1Pg`5w|H{(lp8qp9
z^4t#hZ*Rq9^QKAWFJJZ0XM#w!Yuhi$@=x0~v7V3)<99C*)Vy96mc4uJ+*PalmYM!z
z+RO2`E}}1jH`gT3ZQA+;PH%U!fAkVhKHS)RJEX?M=j@vGZBbcQg>rKXG;+PQI-+a)
zR_5e<whv$MbVuQd-d|5^Qf2fEd>UEpr7xyD^-?yjI3=o~ySG^L`p!#_?!4BUchcaA
zV_L|vD-NHfl1!`3>t7wOdiZ*wjN0{Mk-pK(8|V68U89^ZKl$#P6I~42R*UsnMNez3
z*LnY=?8-OMbIRL76uyc+ZC|{7(vAt?9dX87b3Jyl7X0J)xq9DgIZx^S{p_1<=LR%=
z_OvNv?%iPUB2vgItmrt~#O~Mf^LdXN1<NPMJPo|FsO2-K@Q;tqr<z0^d?fOFk2Rj^
zpU0RqN61f_cjGbD8FN~1Y!iNK%=oF~#r9(6-#oiN9^bHU*<q2>pI=(lT@PjUJy0FF
zYv#hPSeG?El9zjgOL8MBmNZR~)biZBj_KJlLsL5uxeXT|%?z6Ndin+n>4m4V-IeEY
z)`hPOn4e$MXWqZZO5s&c^S@aucCHPNy}NV?%Q^4+b?Nd^M<iFb70)@wHe*q^)2f_B
zQ>-T##PBUW%D*9$<)f5`Tf%SUdF)Qh-x-~VZnoUkbk}l8$hG@iqIRpFf7)_EZ#`Sz
znUWQMeb=rxnzL{INp-GG<>E89A3LLbwoY-*bg3^tgWEa$e9r86EjBx!O{60Dht;cz
z5=Yjv@kpGV$d~jyW=_M02iAXcN>{JeSZc2FheLvOJ@?mV2Ia+jBH~w-oppa-6W;yo
z(Y%Srvd@1PWfEl#eysPd+TrWoUpj00e)kEjmu<7UB)#V_>!S^&dVI?r%00E`tUjpY
zF3+qj=CrmaNZV`Cj5x<EjV=2wRz9uxY0DwAI?3z!v1!~_WN$m9)n+!oTRQXq`Pk<N
zCd-}Hzf%2Z(lh7ToF!9Q?^m<bJ~+Vn{&*bQQk~x#&BDz5O~Un_?b^kiJ6Qxo<a3VK
zzMN^oSyR@0wI=2Jo~a_)u~APxuPQ7syy`1>#(U>i@5Kfg^XB|`vMDus-#_6;_k%31
zg)g4DGWK(PUKQt^N2=|P$4-6OA}qiyG4suy=$#i>nkM~Kd8M28C`D;s%2g?oIPJU{
z>A#O;Zai{fO>EES4L^B&vMgHOt~8i2$N9&HLmzmeZ1lHH?@yRL@zuKP?thi{@T4r2
zE|Wgu+QNE&jloa5ntL+#^;PGO?k`j6ZGP(ZNwj2!?t;=QR?p5pDwRIsG<AWNvBL#j
zvv6mJ&HA%;Kk<)J*z?bbE#l{krk<#`>fQ-QZZ0%*PRPviEGss6Yn=BqsU_J-E8wr0
zfoAQs|4Pzcp2`{~LYvf{&6GH{tvpIYZ{nHv@5)=ZP2B#gvtx?%=Qk4@(`Ns&kae)R
zbz5Kbe6s32wdY@R{M<VhW%B1+A9}xf{|N!Zr`!CO*)~eH$}Q_k59s}8k$vI%36s(V
zK6j0-7b@SLy41}<e5Knv$2|_)Z6eoYO6}_QsQk6}*hX2_>~wohxm9;MDkOFl74%6d
z71@Ml%+QZh_gm@Qw(MAo;G^~XQxyMQ2>CN{dO*!l-eZ<4f4hcDE~wcS6mH?N=RI2@
z*Q+((uSyth=Rb5PZmF1_mvQ9TMf-0!c0Zq8n04f*T{-s@X6KrTH=C=%O8TEMPMNvS
zPVL{@?F#3XA7Hw2BJ<A?JGuO09a;+$ukh}8FYF<!zNe2<J}cr`!0jHch1M&J>Sjy|
zELpg1(I01#ts(Ir<6kDc(u_3a`yuZ5{I}nm6KQhm{P*NA%;~+Qx!Qv5Q}41r3ei$s
zaa+>ermeWU==O())(7v(vP6CK+;H+*?ZnS{)d$%p^zinjZ-2FFYRZf$e$O)BIWPrR
z8~$9Q@_eDxQUCrzncr`owcUNNPCYmNzZLh?w5;1)e-w%?o&Rm{cxL*IJ73D)ypm|Y
z6S67XM=I=|)uL-D{Qv*APjD;FO*hTG5NWg|NAJfvG0(jT?_y1JZH~!1P7Qvzk}K|z
z@7pQeA@cKc?#;Q!Z?m>F|Nn)>>l9{re?R%|oV;?zwV-mRIj-tQOOA=eX&>WUz<K>r
z)6L$~9`p6O!Y^})F8lvK>Hq49a=&%<PwJi@+WwuVLH-q+U7w<g(D|sugRZ}3MLaDw
zyi%OZH)oobSLv}%Rr7r-|Apn>GUQV_cKvMq=jIJ(AE|L`>|4C7w&C$M+bg_nNg_A*
z9-c5aqq674H^T>S@^-jb?+Z1wj@%t|Awc$VRVzbvJmZ_N7r}i3Wxl+99+%e5*4Jm8
z!kK;4tZw<2&h2tKOl<1*=1fc9oL--EZo>L*frV`U%#1$G)pNb@iSv}{%6%(luL^3}
zWO8H8Zl9|^HqT_vT5WJe>2!!*)51!<J3fDwh^{iNlJU44{92GXX7S1z?(X&5VlM1u
zWjpuW^PhXdyDQxPVpxJJr4LkyoO6C0wDx=mOY!RRtV+GCv_)?pr5v(<8L@<Gv)npI
z17DWo#{++HUY^vc8E7=~=A(oY8m2SLR?2<XGdtD6<`r0f`B*ZW_~yz}hyOmiry-=(
zv_W6Cw5hqXI#d7ILA^5BuPl}~_WPKIP1qi|;6mZDi8eXGOhqSZ0{dr|v9T!@Pdeqs
zI4A#_pX1s|D-!+vw)tP0d|-}(d~D_~4OyLSi#b0j2tIE-yjFOw(@!mlQ_Ej<o>D)N
zerD>{hK8#`o(~l@#RSs*-cNr0amM7Q8`^ujvp4j*PrB-`=-G--P47Dx+kf*uJfxym
z7(4IxmqJ<3j1>&`&*ql(@x__>*OyqCHOSjtt(f!dZ{Q~#?lTJ8H_dtVXNg6l#~Fcl
zrKzc({YtaSwX$mt9-n#dR!N`H+<xaA?+j_CPDgLmKL1Ert8a7C=N4b?{uk=MKjxd|
z=hy|Ww`(b$UevT>jrrR&9pU?t+VQ8|&wjH`*cJBt`P{eKffsMp-%T|ySf;1E@!faF
zn@4R9I(xQXlW9NpOHVY{&1TNRy|LCWr)>Oi{ZZLNcflmPO={;>{WQ;%P@B?VeyYl!
z^SoLvSLW{bvzs?9ZvFqq_Iv!>q}MO@2Ur}LD!yUv+qO0d>uWOtH_W@g>A837hmd2|
z2fy|!%RP#Xi9M&ft5xXVu?^bab_G4nxpCyh&*j?79p`$zJLa3@Te3WP-vdVbbdvyy
zKu1A#mTQkolAM^H<bU4g!*@8gUh?EY$JTl4ds>9{JlMG|tNHyBsoPAu*PfbtitYE2
zJE@0_++MiGZq*1DeU$2>Kes+Le|h=b?5@XCx)K_9d^~%n;`n8j*f_Z?rp>B(Cm8f>
zb+0hhEZVuG&N0`u>G>wns~h#BuCBT=r|Z7-H~mS+0`J<3&okg<@Lm+!dB~n+eTy`w
z;@99S;z9eoH#-TmG_73zsi7p+{mNO%y1AQ{pZMZd9%Fa+wx^F>;g7GDasQjn|2(-r
zVAFr21CfdI4&GyA@Qu4vu;rqzrL3>nkFUAgSDu~qLFTr1K#sfdlc>K_XGT{=+@JTu
zu;JjQ&D~lxX{vK(z1ULwaC=W{f|mC;js4L=Qyi8ajwp7|-^+Jo`Ia;5-F+qcz0dbw
z{@2m<Es|mJ6~;LBAHku^*GO5Wl-+W!Jsl)r)z`~ixvu%kj^Z-~Cg+o7uYU^O?*4Q^
zpyK3gD{Y&Ha}Otc^;W5=-+$ultOYSsa?a$vxWW;8#N)v#iM^&8$G`lVt37i=k-7Ip
zn-|>-2i|@*IJZ-Mn}ABK%FILZvYm%#l$80pyb<cYy3+U4-iaR$?sRl_xM~$DHe;*N
z<z8{6x}$QbmNrbww#@t(ZkwBb@Icp%#%&M#&0MlK9^PU1AYe{q(W9DsoxKOkvv|%W
z%q|hM)O_M$ZluZIdt_20FN=f7+pJsvoR<b`-4|MKFMsj&l1EqPnD}q^aV`rtY}e6V
z$IyH8bKr>|C3pFR<V^pVDg}$1Br?8W+%aL{`^grLj_+R{sW#wVvH2VSyC*W?QzgHy
zV7)f)WPNf}dDGYbb!mB9cRb7x_3bkDmXLKmzk_?$Cy6h@52Qay^9!w<JG&|H)wG-5
zyAn9{OjkAEm$=v`rFiGpF}?jv@y8Z~O;6n#`|R|A^-Wzn+&fO(>e@f^Pf&aP4|ZSO
zr7J5ekDc&}JZV%k$HC<M<xJPoud+E==gT;H>$JPK?4G8eV!ePbv`B9Dt#i*O$$nec
zt@Qs-kHOUmo)0G<n<ROoHR&J6Ve!zvo4&Kl+W(HKZeL<Maivz3Tx`;<ZjHxF60dJQ
z&$i>#|6dz-+50ObnspSvNLkcb?Ed}U^qY1cf5vKlWM81+(>l@9;BrKARS?JN`Psq~
z-_LlX<1+c@_0^mX?)A@l6GR)r!mcwirb%8+w7OILcKyuG1GQ)WurfM*b$xMKc;Ua`
zl7O0*YmXj^dhoj>`H{7o8K;u{LW_G(+<a55)+R3Uxqg+~&z(v3QsQ05{juK|55_OP
z-4;|{KF{7rYY)qxjOR7xt(RMEGLCetyWuDOX6B{$^P&&xw>sXa{Bdx}q1<(yfe{zY
zKCe8&k}~JC4~NPYaj&8f)6d;iXK%O~Y)_eLyZqDhJ7!B4eR(CDwn6C3!}m#l9e+(u
z5<Pr+b<9)O*8;toW{JlGwn^D)vlO<oaxu-_oLFVQN9FB8gR7^5o-BKxFSJv4yYvdH
z$E)5sxCLkR`juZ^DX~cA&!(<dYd;>jk-l+-`9u4fpBn7zCbYbY`?y<U>CPOf=pv2K
zCWHOl68UN-lj3^buf0B}rfFHmge#es+vmJsYqd(|Jby&AKxa!`$x^$L;){o5pCq~P
zoo?JCp>vdTe*c^wi7K_zk{t858M>dz+k9n7o~c<!knu_$6OZmYnpcF`e3_W0?zo`N
z6dnBT`vXRYEo&zoDz+9{+HzxNz^`3eliplmX1d()Ri<3ck|D(_#3aPYVsUx4v6ti8
zEgW5iv-@jy#4C2j?JhWW=k;e(p`I_&wv$}ebw0A*G5M`y{SjuSUt6!a{VR!haUi1D
zId|gf|2r$rb7#-0xi9=bLu6%F_}QI1RF8gi;x{>)vZHWzS@P#Y!dnUtWFA%Oo&2P=
z$LHq0u$STGM=s_^uXy+9@kP_g3E6=z&u*#yQZ(Y`IL36&+1?;Hvr4mN``WVoxAZF4
z%-lA)^W(!yYu)uD7+$YBYkR+H&76GwJA0G$melmrD=Z1}N(@Zs3{||=^TOKdj@1<j
zp|I#l|JdhsZgriZFRB)ptoNk(0oRhtQO3*}_vfGZ-jHUy-;$ku+0VA(x17~aLMDrZ
zavb>fac*<<mH#g^8rSe$a{rjUG-8j%!|fAS-ulEO_}}l<j(Jxe@07W!c`?^Iy@Y?)
z93F|uFU8*$<<^Q7{`@&#Vv%R>zZECtj@}9KYh5Z4C4VGsVWFJ!pHkabd{b@)AM!W;
zzvAS#KU#Jd_}iY&moNVIL1g|G(LGtmUQOXXb;@p4K(v$9J03IR{qs$}KD#|(RalI|
z{&O>f?C<zqTFb^;Ci3*<yQP;-KR?x{<6`kWPV$(5rE=xDJ`J(!7jMSi;P^3Re{Ex<
z>gA&8`b%uL?wOz9P<rt2tOwsFXL6U{jCVQEm$mlPPM%w)pN_=7PiFEzc)0b~*39#B
zCTxAZca5lxfAih>z6%S2UWS;3buE_il-L?M=XS0Br<?*8p>w~C&l!i`tb1j2?RQGi
zlb@B0krUOf?^qQqd`|u1r1~=VT_0u##@p~NfB3mGHMo7v9-dQcGQ>GHYpU6@oznl6
zF#r402e)(&y%1CuHPKBMwv6Ml(|M`6b7@|4PHk_>hvIobS5GLol+C-jFgnE`!EEvd
z4L)^&bGPKHS5~}Ok(kl5>%)v$r{x8vJbg4vFvxvn$=t2amD4VMF3k-3wrjcVIn6ki
zIeJf@X_T`TmhwKa{qeY@_*ogR3a`m@-|qsSLNksXc=6FaYexio;QWy1rRV#)7JqqR
z_Q`Of$Mq?K>P3;VJWhYt1;3sl?X7b?cxu7wbXB8|Y?l_W6n9u1<;cl?I<;fvlAGQ>
zg%e#;Q=3gzv@xCg?)z4FcPo3^p@zinFxOBa+3X#O3CBJ!?Xs9II`?T=_-y}&GF8sT
zHEPCc54V4l4?lj-=7Pja*_m&qtFX$v|E+oUT%_dfl;3Kv%crjS!nA&ti0bKs8^am@
zJzem%VokTDXIA3VH-RRrk1F_|IQDFBg33j<+3W3Mc6RDJPp>zbb@pwd;Ip-cyU)K)
z4KcR+RKbv2(K2~2!yQSMM-w@g%nz6m<l1pNAzLrs_RjSMA2(cWjokmc;AHZ${cjo!
z79M`_?7A=KL+>Lw*Y;b!*UgI+u5#4z^!|Hd!}_kWb4S`2F<hBy7IVNOX}8W|!@5?#
zPn9oDCR&7Q+CQKCjk#Sn<I4Ma8@7l~H4qOM+#qN5tSNozn#5+KSg*u2Gq-Fz|Ib^f
zc>erEm+Z(oehbe(pFMv#JC{Db#`7)R&0RG0u}o`+%KvSPXYc1`IP-J+d#2LZoocC%
zos)Xr96KYkTFS8V(!A%k>N%|c%zRx0w7#3PW;$QuIVgW?WyPe%=Hken+w&?eDg9zP
z<DQdN8vV}utmCyUYj;j~_u&oqzxL&RuY6+z4N8=_MWrXTdRhJ3!#YLv(W{xC(`O`$
z^7Zc!NH$|otg8=HI`x$2;K^qPJ)F#|I|^oXMvLe!_42;^wKr||-R^arE+I1C-#>O<
zW2NC~>|;7JUD@W`*M~gc1zzX6HQxSzweH2?PTkgPiAwW@{w#mrv`O`~ZS4l*EcLa)
zpLgFoGr4N@;w1*0e-!8b$zj%=Q(fQqku%PjQ*E-CNoUhjj}yAu4mC%Vs(lXbyd3}A
z>iW-Q#@-w43lHshb(HV3p0-HZj9)q{=ij-xg5k#HH{ZUB@(CT$T)nNKlBcn8k$$sV
z?BQL<Z!c%u;Blnm+)X2gnU2kM|JGGK@OSyM^x^BxYYs`Cik4d2YE`-Z#?d$HW#Y=K
zbLMmGGibK?Z+l|j9leCr_w{^l6z|RPDv_HxquK8AdC3<NPupw-tQr*N1RasRyZS7n
zhs*4bpA3!WUKY8m^j_w8#}22Am=*avbE0J}s!y5UYML`cY^`vEZ~*s}+sChEN!y-j
z$v@m8qoEZ0Nw3(>TE^_Cq|A4f$bS~w^vi5ECeGVY=cIf??ejv%UxMn}_WMp@+`9a$
zT%JI(_r_{YtL%V?H4Z{NpU(?kW}80!VZy_MtWDjECdbG>sn}$rl2rI<b6WW}udTr!
z*m55`+rM=C=TUHC;_9Ho+Wip^q8fH8C0)DU^5EFfzP6or1vMF^y64<Fo_Ot-UOcB-
z&))qk)}mLp#xYtlemAe@jj%tQy>jy-_ADC%1_rikj`OB~)>AILKP!4kLjU6PEFTki
z!dIxpmOKerbX5IU<Z_1EXK(FG-%1>3OI|6y<$t7hy^n+Khj)+O>!*J4*jJ<Sv5bj}
z@p<B@_^$2mCLPzGx45ZqALIXhq9U$mMeZzMTVN4WFC-NAwECd)>wp&J7CyDBZR%ex
z{M=WjZt_lM>NG#?k7p-taad9MGjEmDB%Z5NoqjNO_8esRpCmlz`JK$d4?DJQ<J%z<
zzErs2#?)hFXK$U^x3k&vV6uxye3)HyX~w(s+E-H^FR<KfC4ZzpOzPd;7kMWIFMaLO
zId(P8i+RVTqxE6e8)w^^cyB#n<^T75xK_w#NzT&~H-B!QairFc|L>`8w$v3OvS-%3
z5WF1KzGtIELVsIM!-M-@XS~_nTd-Ez`;4{uCR^UK_J1|Ig7srIeU^M8`BBAi-A$gQ
zsuBMes&<@HJl}7$SMg)yzc7Y*q0=8a#w~pywZQw~oWIt8nex~}78H5kU%YhthM0{r
z*Ce&A)Y)S^>;KEsMH{<c+wBkcxEwmu$>YbVne2rRl7+ulJX!rCvt`w$t-q^kvmTW!
zI}+-!JThADmwWBr^YOnlZ4IWYN<38vG1HP@nyNK-5xdHoElfAoC!gPYeyU+r>XS9s
zY~Qq$wAEK-_IKRfxu8_uFT_UttP^)ue;1dc+l~!8{@m`|QSB+i60GjDKt8-BQSB*v
z@UB`T`B1(Ezrx;!PdzAeG>4yoDR;G0yY7bwH8J;_Q+^gS7Y818+oQO36Zeah-h1Xh
ze_n_>Bq#Gig#W&TaiL*!@ZQ@ulq;uyEP7mh`;G1OO}tNHi<wuRTGwkaS4lx%HRomY
z*`te=u0Oj`PPT6AwSA|9W~E>GC7Eio)0NM7dC=K){(Gm(v?eIGiyyN&*x$slsDXd7
z!)n13pWKS=q}J`a$1BGpvS5n7I)Bm@zP2Q#>5JZO`E&Qu;vG{LGO@3Hl9eB2@3${&
zD_?`t^@{2L-9ul*F6f{4UFL=<yQ%w%>xbqGb>57Wzm<48%I@JLv3H91#Zo>VKV|Os
zHT?K%Z~lw-jZI#KSj@CvxpiOChEU76{0Yb9zV342S^UFj{gTd|O=dTOdw8m|{-kUE
z=9!=N>+-Z+k*h4XDb7&I=&yF~yCvwC^0z5ocz$89j_$(KYts6!*h;<<-)Z<`N8(Yj
z*0VqVecUT+x;)~oQrjV!ZBv!5A4x2W5Pv8z=X0fU;j>L_Jvw|7BbG17^y7c{O(fxo
z*@b@x{B=KfZr;10=h%@gPj>T{@g3RBzn0fS^y_)IyVDwa&mCHuv6dqtblRog>6(rA
z=FIh*@M!DD#qRue7Q(4BG$Q}s3UIp^^Wn}7Q^$uj#b3JLC+k1hG_Sr^Yg&`Lp4A3c
z@hyA%k3Xu-OkcvEzy3zfW4EUDHR|itIV?Z*ug={!rM-&3YQj-_gAc~eTxO!5Lj>xT
z)-N~x_$>GKM!$m--JWdJn|&u?T7OBwH{UkdEw}Be5>mGtgf+z2PJJ==bG>`L*9Fc0
zJ2*^dPPEzb!LVswppVE>J>UG`pRP-sY!-jAyv5oqP$6fv?%KzPAGA}Qy!`*3tPP)B
zc`|4|S3yGJRau3ulB8>T0{0}piLSA3*d}NH?s#+$e`WcF>RiSf9<OHoiS~IP@yqTP
z%S4Nqi<kKBM;JQ_hs|I9);I9Yg>Z@f69-h?);wvQw$0NZdU5fzxJ^RIZU3rxQ_hE<
zC|p?|J!4*V#a<5UWvaEWx4ZciZ~k~z`B3^V?IZ<P*CorIKl#VUT(z>Ai~G}WE{2s{
z7hRZM^lF4mOKj1sOM7yz?=ItWr)N?6d)3WY6{qyRkH0Hef2rQ@!@t=3QQvxZ&suZ5
zHBo4G+@21f!kI_%*NCb7pTGC(<gSxWD_<APjJKJgByjTp=Ybi$ruiwM@3z0@5%6LS
z;B^#P{PP{Nx8^g;{ol{<JSYg&P7?|>RZ;6(sa-F;<f9{#?Y5PQ&(dqAF6G>~SpO>1
ztIN_N5p#HACPywVT5u!GxwATdPjS`n<u};xD~gpdPnQ21;iJ5KPIl;)2{+4<j>i=m
z|1Ey;EA4o>V)28*!l;~iuVnsyot)0}r(i|>gax18uW$(Anr{>7>*RFMYBi($$+=eN
zYUOKZ7fbD}=S+1y`IxV7>PA;5KkbJ;GoDR79klhYg!1V#f?{z85B$nrIko@Ut4#v?
zL-zkYx6yXy!s{DsMLR#VOii6^e~I;+{mv~CHBuGVV@)3hyY?v@SRz}%`PNBAXa76>
z&Q-cR*V+EE99r<ip&<Buf%B=KZTxkule=dn{=6J3cP;I_XsA$JieqYz#H_DD*&htM
z>s~!vmXYt&a(Rc|WX*3MOQ)7s1Z`P&pZ$Bi<;imw%-O|PJSm_1cGK@5%hLNP?|xU`
ztrOW{{hfh<^)%zWt?vIBGhZ=eax!Y)3I5$_{ml8G^4x2!hc>ND6k|4j9Ko}-<lXG=
z+I7B~)lX!2A302%r)jY8r_sxufhCrwm5!D^d@8%py*vM7cyDXsfuf5oyDXKN*e1Is
z-_jIHa;!*{{%}@h!D_8#t2Z27vG+Igg-MsSqAr{EEqP?}ZjYja=+WB=7hlw5-O#!8
z@lFK0hswskQE$wTU;BBp`EA|$viL5W?30tS&0|78KRG?uY-jNYeb-NhK8lZ<RpWOa
zVK4TaP#<>l5~I?^b39UNXZh_dgezko^A&T>_gX8fapLo2HaUr8ZKvOd8qA*C3utWF
zt?QXR?W+T0*wif(6QA(xEUReE6)gC_WZ63ru|qrSxmLM%Z(4Qom-@<gzITn6ZLeRr
zKIQUm*_V&3kI&<uY}Ros#WA>)Iq{mHO2&kAlk(g!#d|vrs5DgiX`XhU+8VNC`W9&+
zqvP)%xp!OZYHM#j6H_c&>Tkuz_H@pd={%K|bB{TSC2^d0(7UG?>0rO3Y;uv+zQfZ$
zr^Se#;BYTvuZ&Cks=Aj=Mm_2B`DA(Bo=FdFHaFTR^$55{r!9T=>co?vughK?aoaEQ
ztX*`5+&`}PBy*!(>jOkn=F9E>u(Z<geNS(#M8d2xHul=I8ec;V<KkCr>bVSY(s$pb
z#;v?L!}`?M;O&d1_|J<k{_@o8D9fe5A6-qZBE8;RoN8O{F-*GhYP+k#(^`Yho1r_K
zijFN(@AfTKKlD@W6US8^MS-6jFD9&7v|8HY=hFrEFYmsQzdIqVcFxIv^XzY`_-wdz
zHF$c<63!`;86_&1@2x)Fx8BBzfAPPA4vF)gPS)fq_IJ6(Tq&2a{R>O|Z$1khZEv5x
z9iO7@A5_iVp?K|s=9)#thx)gCj~DK)yMJxz>~D)EU0a&AaqnxX&&e|qnhaD{C9Sb|
zv&F;q9)IkulYvU77dk1Ho%^5r=Z%iA^Uw9h2lmGo|MS1~VyEP<#-6Qh^Vz?uOT6I@
zEx&J@&wD5B7pujjU3!ud6{{VeGTb;4y+~7Lr?K;DZTnkOUhL4wVfa+O`<B2n%N3$h
zThkey7Nz@bepZq7aO$F@+3P>$1+AUlC(b?N<rl51|1Vqh2p!mM?Nt}5YdpjL(ATK2
z`{!gAT;I0PNBFJgi%F5*e<mb%o}V}W_J^19CXG)GPy2}6joZCd{l(0-JG$GLwy27*
z*w&XVDHgpS7nEh-5>+>!E353_Zb!AE8>-W8UFSdS|5Ws@wfVN@>Bl`87aJwrwqJkd
z8f)de>93E}6l)9ZdHAQBRWFZ8U+7gcmx{G+M#R<{Qv=40N%C<Su~+MIgE|dDeT^!f
ztKVDl>xk-9_OC1D6iSNRl|%1rb?epIC#BT-^x0age_#GgWBpUQTw`Kl(v2zS)U996
zn;^#6#IVHWPJ?LCxhC6;f0gSm%e;J{cB67p#s70$cWp&2-g=tcHJF%r$44^GcSg<3
zwt|9aGv8S~C$=9ry6Wtil<Ou9sgE+ZGKI4+s!xhOIAzIS-5oREC`%}5ZT9EivCVF}
z$$ZAtze#E3=ZwVG${Mb8{!?St|E4XGqk2KV+Kqd{I&}t_Z<YI8UoFb*S14Jh)R@<`
ziRa5Q38u)~-P*@rJio2|YQfG!B|1-9U(d3*%A9y<z1FISGhf$z&;7PW`H){^<I%L4
zPviGqzq5Gv)ad<(FT@?5b<WoC`zPlfA?``n?=>Iz;LgyTKJBg4Ar9|XADNzo3b_l|
zcC<#bRZX+9Hr;po@2S@U-*N;53~sQv<Ya8*4A{{Bf2r*0%!`*CgqJ*@>9^w5f!8jA
zHHj~Z-bmX{;dc!czjVE}?A4FZAKlUGIInKaad>j-Pv7rb$r0D{w4#=J9^E|g*0<+B
z3M8!lY?R+&b1nU9fa}-B+}vwl-i9>(Q|W%|Dsm}j*Pe9={gQvTJUV@vv0j=za>aC&
zBWo@9EW9IH^EphK@oDB;7crIIu=Z1nxo${YDz<8#G|hjBgUL@HjuSRtmjBLMnNZ=i
z*|$3-`~5!ua&IkX{sIOD#dybAJ57B2|3ApQ*x8)Ie4;)2llAu}<)6>~-S$guy_<JP
zoad~aKEYSMJMo^=>bv=E`B@PIQ^tUUZuVYnaZ7sL77PAR`(>lR!rOhDon^&0SLrk7
zSWiT3{39^gfUo1x+{*Az8|sc)CMK_NcyE2BeZlW5jdP{$FkSjnA@HVVV-%w>+u=1<
zpT4m9zIHufAbsk!t)x)BK=R%5mc>(#D$GC9+tumhwwLQ~=G=@aeqA<YA$7L7)16<&
zg?e?Xeb{yWf_1zF%i5F7F}u7!XZQX(oaHZRZGY`^N}B4_$A?+V{0dhuk}_1*Z!WI9
zQJpu_UcaHTc>Av1n;vVY`B&Tt(@gx6s<v|7?B6oZe*eP)`6nwcGVzEG5}S8xwyTSv
zv2Z}@M#jxux9ju#_X#sz7Fi&r?s7AM-8y$(;PdIq?UI|-js@xZ&rTQq_<qGC<3L9H
z>x<WlcE_LSVN|)fVrx^S;v!}Ba|N4@>jf|9Fq4$KcP6YY+)MC7)VJh$3uDV0r9UY+
zYH(TX)(l;y`!c$k&8k*U+0pcbr^uyE>prZn+PHARrMZFOmb3ZFtD5H}`*|4cU`qOH
zu)zD>;sht{z1JdV-0W@s$u@t{&V@-K%dT*8v;1mG?+G<`ee&<WzD&q2fwv3F-E$6I
z4a_+a{(^t6f{5&qZ5_LtRh~A@{&%EkkyPxRh*RzppZ>8mdc9sy)jB`@^Q01;JBuIa
zGcLDnRn1Q?v)!Bd@7nG8LhrTnHP*_BxGymKll7{*dS>-iL3aaX-h0wrY?pq;-pR~w
zR8Oco;i%L4%r4~bYpKHU&oUX)p03$dd-U=%wT6FZw7nH4uCA$*zS-ree9dyn+vq5-
zqvx0Wo6-5>Q<#26zf0(<hwrVeu6_Q&bZKdY$%fBf@((vwG96xJ-1%#p*8-kJ@<0B{
za;}zns>pt^YIU_&K)c7*sRlKtPRCD}9dPa0wGH3<7tK05zva2w;T*SDNzpe>ezsP!
zbZis<zBzDG;PF-GJez~fpRr_|jo*1y)91It_nTpklWsCI&pW#6X7;1^7E>>^6x6gz
z#XrBiX1`O?*?n*A_lU14l_;3;>uUHj;c54$M^<oc-dTNSqLki5m1Fb7>Xbwl=g(^`
zW?W_7Z@1s($liw=P2FPNtrU55`M}Y4jPa}zIy*CqUU(`!4(z>d+T!nKzfR!JpIIB;
z6ebIIJZ$HC&D(#bf6C*ZFO82czT{*ip`0;e(j!a1Pyc^j3HCY`ez`STo`3$6rRP>u
zZugzYQed(2{@Z_hPA|HCZR?B)m6vz4L=-bc?0kMrM6l@6?QD_gh?L3v!jJl#eb$Pb
zTQ9AgtDC!m>1LhTt{$H=iRITH@8a}6<FW6E`OnJR``ITaxVrU7N2|#^SY~^>oO^jP
z-{Di&^74G@<$iW`#@P$=Xm%YJWqtOUJM?Ob`PU*t`?t!jzf@&T@ZWoKN9C8+T%F6e
zy3@{2c6}ftGUw&Rw@c25wYjYpxVrNX-+n8WmN<n2#;d)R42}Q3V3{ZTM$g2B=hU1h
zzwa(!Yr49*dA5jEa8mErn8f~&^Uh~0eD?h~IQf^-sp~xJ<7GDWnXg_~s5dEJu}Ur~
zrqlLkW7Fd$*JrBqng4oX9y#;CsZ0h{x2WTbccgriIsBk5v6_KTjOR?j@ufvm7cZ`I
z3HTM%-(9ne?dpv1Py0O&#Y<OJe(PIR7h=!4xAV@tBi<Z)%~x$p+o9$>=}%@?lBK7?
z^VvL#Zw^W4UR<(0g!gN|mRF&{mVD0dyG#8p9=dsFF7sFO#Vl^-?bo`U&ZU;jy7No5
z=bd26r;EFJ*dKTIywd6tDKJ`=_vd@=qUKkMi(V;es<_GX>70s|Kep`I+P^htc>XE>
z@?28l_@~q(+ik&JQP$qTViBp<lC{>$Fa1jNX>0h%xwiXN(t{uV*B14N_nhzw<^Gp_
z>FUKF3{|WJq6aG99uLmS-%*vmY0;dkax+(cK0JHsj$8r0^7vIplJlp@hw}9Z`>Ox=
zdC)rR);zAL=CAwxTBk}+UYhkM?N`$~`vQUD{+B0@r%pWE=$qDk`s%xzGY_it%gGs6
za-MxyvSfq#6t!jC$t7Y2I}$dmd9iO&tJ(n<1?Dr~cO6?>aK&t)`Ak1ke<kJV>khBq
zTH<2+p6f}wf``fCpxl2cZkuDXb!(F5ZIym|FSGH8U*dr>pT9erHvjk?%U&c}=yx|^
z&AR2mi)Z_tcrCT@GsDYc3q@GU?w@(R)plmVmX9yp7+ZZE9_LR9$kpw+V(Pf^jCF;C
z|BV?{ci#qY{a*i4$5uUadJNAMr|BBnQs%n+-wO-9ynV%=eOb!#kZbY%X%mE{dhb>;
zZTRxfI%KEzb?LA!rN7gJtJ<$=OLWRB3(w@ZS9Io{fAa#jL+joOz7&|e`>2wBT=zeH
z<_8w0?9-kbmq{<0VD!x=I%&h-85wzPYW14xH!N#5C%t-kU)y?@?@_TdMm3q=!n!?z
zt@<u&=h_}rx~s#ao@V*%MdM{3#bz6oT|6t9Bp!XMN&L#6ocLJTGW$=s+ry`dyAm&H
zU;Q>kI=;-kcrSm|ri7U6jc1gYECjyo_qk>GKP7ywn$M|JCa<-PpEM87+q7<vUbNTQ
zbt>&~H~0gN=ZRU0tv|G<lXZ?|=Cg#w|Bt+CYc{#FV$Xqx^5-6xR2-bSvhP;ga%m17
zx&P{wdv3_-iCoD|W9E=4RG-=)#F%^~IO?g;o}PPKof1pUcu$1wT~OX4RmocQ?DsE;
z`LTKV3zzCn+VyOIj@R;EKXfX>x(%`>2F$9QqO#B6r>TDK+5RFgw&#|um*Y=uT6nz8
zT+O2Hv039H<7y)Y{hEMp9uL3epS`lQJ9UxXyNkcszfA5H+P?mf!2U%w?dyB4E$s`P
zdTaiovpW~+3)<I(>MZ)VZRKR+`Bh@#GLdRxVXvOLJr(73y{9i6mmzlQd#KyR_RJ19
z<!#JYg^#^sH*FL7`OUNcN1RRU?@lE<*Z(VZTphM7TqDNYq1j}k+jHFb_lKIzvp;F{
zcX<E2>yvE8J*Po~PeRzBdX{<{Q{z^B?)#!E&$a1^l;|Hk_;9tsyGxJKC+Szd@V%?i
zx=k-dYH8@1ZB4vZehp$@uY8((`1Mh~J4e26`to|$3!U0~tp{gn?wDBM^yNHP9NS#?
zmN~1ApE2d_)u>r~wEE)iNw?nX#!lc9REo6^I%`(i(6mBG@R9IBE~eYOZ0Z;9w{Hlz
zB6a4T=a)7EF6Sje3_{xqx88bfUL&&Ui~e5C!grdIReNWowrsevNaAYkk@{kXjOp=4
z49&YQ#M=G4ah0PYD~3-zGh|1|ZCj5y?<ZJS9#Qq^WmgQ^bMfny`_HdeUI`1_v6}DO
zdh?fi`}*d|SuZI)%Pn{G$gD~yV~K`e2V~veFsJm#?K-$7^MLy~r|msam;ZPEIeX-A
z?A5@N&MzM9*OV&P%-a9+{>`%G=BI-Wa3~$0!*V?FaF@R8ggXbaKL0GXv@VLfw=`LI
z;b-2vGVfO}@=ePt*?F^MtLLW1?+5M&9z5YH&DZh9zdeARrQ4=n|JmIyQ$GD=TIyn^
zaJ=B&!7UlL4HEiRN%G$boVl@R)5(Z-{%Z;ruHu(&|D3VE^2Wm*Ins~B`1sBC%v{kB
zGTXk}PE+H|b%Qky`fqk#Si)3Q@FdYmM@-T*RBm0~wHVEU$7!_!0e^&2L}wX>OBYQ(
zIOzyu=Cs9SYjuUD#<QrgUz_!JlJBSK8*i6?`TA}~u$e^0^TY9GKY6#=Obp85d?O$s
zwOF!5DaPM$uSfN2Qv<(e>ic~E%#HVZWT2d`XDGDOEBQ-y#DrHZXLp`;nB{tP)%vZH
zE#iH4Y);JVCa*S^J}M5M{mzpAW~PE~Z|h#2pj%pdO!V{WymnpLc<bwo%p}`@`+}|;
zoSywMZQLNw8UH}M<-5@IccR?8g#K8lWVEm=2wr)$A|P^J2KVySlanGcUE*7JZDqf4
z-phFIeva<iJ7pK7nQFVw3!aa>FZM36&8FN&EQIgcoBkcIvo-2Y7Or|SYv-9G$JELN
z@62d!&6nT0{;wNT{>KNOIbBw=Y)s{FUwPj5La(jIo-^<Kz9sp8m)ZD#g;)BKMF)77
z*%}|eK5><t{;w%7nXWE9_++D)?ftpW->JJ-82{2vndO~aE&hH+>$%4*t2@_AvV4rI
zNvl>%>kknu63CI+r7b0Mcx$=teI=Xbof9hBze$I)tp0rGX_fN!=jqeSRuw5$KP&%Q
z;e9i8x*cz`v4o7kv(FFet6vsh5jA+3Go_UwFhg{9+s_s4?Ms%F*p|BRw&mTn+brD2
zx$h89|1)J)zlm!;HB1UW@gR7|@$D}ju*4nAPAgDMyJ_##zuIm~*(vE)Th@K>x4xeI
zd`-Iiik`ZTD>hk+E$$`sM=Uw^Xp(Q(+q2H4iH?=dxhhKT-`?#xcjnNQ#WCNv><BG<
ze(6B`r3HcC^CWg<2iWADS*`Ff?cS{~9C}Yx1GysZ%l^Oq^G!iC@5a8^LjM14e@(sG
z*Ds%vwo8v^D*KwERJVAYun)qGoYo1?+-4eRJz_O7p4d^IXC~OXrFV18=NqeJ`cz+K
z@A5mG-e+Am&vVaz=bA&U=RM@D*L>Sk!>;e%&r~`$aO#KMhoj9W>^<Fdge|>wQZn<|
zrwYcV?fXu3Pc39|7C4Y6I9DX}p`_oXr`F#c*_5_l(|1*xb#0!6(X!ef`wlj9u{}*R
zP%zC;U47-jhD5cuQ*ZfwevuSuyLY~r_uHDQkJs~jE1Df`wcM?U<y2rU*UOr&i5V6j
zPXDwlDSkc0bc3LIjHI`f;!hs-f=e!H*XBLa7keYV_Hp(xW|>zPmdPE6l9W8<D6nnm
zQqg%F-}kpp2no_&ZLx2@&%M>BRv4b&w&rqWh}`tGI|IWW=4u6hOxXI<TCZLGdGkxp
ztsG}>w3xZ>Xgd6UqMY2`63Zu7>}ILxZ2exW7`(6lZrSqIVuf9~R?bUguI+K0{eQB?
zd28`_Lx#;y=2ZLcnz;K;=V!xz>;G2HKhk?)_PeVcSBwt{)-Ur|FUJ@X9(Y^({tNkc
z)7~CC;m|xUmow>mR>ww3**7PHB_dVVx>s(iIiq6y&g+WWi^6HDi&|&=S$sg|=fdY4
zPwHBX&TsqTw&_&i66a5RGmcuseoOkyvT>*9>-8C|s`ETnUX}Iwzvu5aw&cA`aV;EW
z#$ET<uG)U+=PAL(JeMzLoVj>9BQsmZdB2xbjY#wP+ysA(cvth1@ORhj_xG9H&U=5+
z*icdZOUs8s8LwyW^<IQm%~`1z===2klg<jo3l*+Wy|+JdbL>d$wQNhe8*Ef-<2<d|
zN|r0w`cX!CX`QE}r+rYk%O>IA+h#{iLcZPkv%W;6OVRT@N4woZt_$@If8$=={&4G@
zR%E0~!6Y*g<*zqb_`)*mlIp}%8aR4po%g%)#%K5KunWRBPJ9<!z_96OR$bJSbIp$1
zUR6%Jpjg;lr#;EvdVynfk%`H9|1jQial@)5!urZnlU~Y{7OeYyc0=TIUf;Kin-wmW
ztvGtmP@1{_XUqOIcULdfa9qyr72_hC7B^Mka@D50m+qVSXOutLIYD>h<RHy^EB{z}
ze_31ez$Q;<XF;Q?*Xz48*dx!$nK-HQ$;)lLt`g{C8P&wL!QyAu(wf#Q-4CuuvSj7`
z+uxKir~bQ@@skHxMfav9$<3c}RN>k50~)D?JHAgbT6)8Ig*3N`$!}4HwWnm}tuy3~
zy;|3{*!S?MSsa3@PwLOkf3mQ7@83U9oBOyv?_+$Xs#u+4`zJu$W5?vy%Uqjv>bg9S
z8BJR^|BB+#fY@}71;U2X@y~XycS#pKzlJwQKd;+)AA8B`iq8p3x9zP|%>7sI^A%!#
z*wx;);IC=ZrF)sRYlLs7KM0qv4hZw#c!KM){lbb4ttaZNU1i_@3o1FQ_6N5ua(RBX
z_Wj&{;jbRWA5U=2SLd&+?#b(!V9)6?EyT#<`Iqm}KP+pV&fVb%j_+8dR9E}X{F`dW
zC7-D=3)=UFSYB^@TcUmU48u0z8>xr)?_t;-vS+8rxj8ptt_Hk(($2!oUdZ>dEo4@L
zwesR>3k$818~O(=x@NG>V|0pJ9rRz0x#HUyk!3O8#1fsZ-HD&iyfh$ajr4}2f@xQt
zUvg#KbCY*=iR`46Cr;Z;J$NWcvvcK*%3ir$FJ5}|+sQU@=-k`8!F)nwcfdDwbxGT|
zAAN*ZRfjct-+b!Lx;W&3Vb7k{T@u$_bT>a;)sSX7Y1vAr14+vSz8;;EEu8k2`)zVt
z{L1f}0#0dv|2JoHa|PE7``!L~dW0uA%}<;%eIMuh&EanaUbHN^u5p#8|DAsC*;V$f
z?z0p^cz5}qKmR1wbWfpZ!ezdS8JX!teC8(}e6ID4ofDfBwCPMmu`{oFaNa#FDL-y;
zsh_h2&r7}k$hi8>%9`TmYpn%8@okhBo&9{v#j8($?6162z3TQ)>(Jji*KY?J+zr~N
z*7rNZv~GUa_dn?#t$)s(<6*T3pL5Q4t$xwUtk26ELLa=B*ki>y$>O~2eeN9-yzenD
zTUx5!d-K*r?Vk7urqv>^M1Pq7mJW+Ak>6)0vN=zcS*uySR%1(US@Fd%uITEL@~<b;
zW0(JVILAj$Kkv-LeVM;Fm&?Cz^6_Y2wCm`HzcM?c-|k(x>9k9!%Hauu%Dnp(T4wN9
zxbZl$zc0Mg_2{wi;#XlWlnuYHzy4^)4pFWD3~zGQR@#5_ca88qy|=DK_4kbvRXP{W
zuI8Sz{IOZr>d2y5n_TX-PWN*WT<1J#)lqr>qt`-bdrX?J_FhC&cY{^J4$ZQ&7tVa(
zxqIo6zlv_i)Wg1UbIji4Z@ha>jM0Qsv*Or!mm-@_A)oBzeHa#7r0y2GQ+({x$$~&j
zi50ikYV3RJWK$sF_|&~=W82JyZ9kq>-Yw?1z9?;l{IBvv*VSU7W=G9ALwEm*+UuL1
z=eml)s<qHNXVY&L-rynypUq}>j9fm=Tz1sY!20l-1p!m{oV_^n?vb=PahZwJH(I65
zx_`I0CcEW)#bqhe?tN32gdA;NwC<ikSe<H3LX2m>SN+Y`8$PUwi^z9U?)Y;1E91qt
z<}n5zm;bwC@8fr7leFNq7fT*4<9?`mWy;k}R=0&7Hb@#YU2wMYd}X`zm++1k9baOr
zYuCQC4^ZdzVfz&vtfCbCeus>*+j_Mf!s#5W`%fvh#7}J5tmGB8Z%duRVjjNT$!rt0
zD;HO)-T%TSTF@xz*VQAs*W>i{^@r<v{_<xm6->QdGb`^vdiTTY{hup&Ck6H0-%vXF
z#zX~u-{ooDf%{bBXUwT)+<!(|(2OPaVIKR_rECW-w|o?R8<Hv^{+n~^<ZUbe&fWK0
zDE-qH;ds6c&rY8|RC!S1_D0dV!;g!sm2IBowI#?-=*)HyewRLn>09h$md`Sbg~^#c
z>+F8`i|Urm_5FW#L#nc{NAZhPgP>E+-W%ET=3QSXDOMY<?!5bKGM|tyzr!~Jwr>|M
zwZ}~3%uJAcZ~fFm|7v~w|3di}*Js}6>^=Lu`r-4v@3x&e+I;Qd#6*7wrHaTo!8`9q
zM8%jb_b|PaFg<i~tBX3TknG$&D+`$TVnj<t<3w`=c7O1mGIwdkrIgS)uRP*ZqnA#c
z>^g5@X6xschYejHl#eRjRPLSj)U~Z>Q)N!d-B4}oU3-rCs=ssTs%$fk+I8(;U3Ka1
z80+)W3okIq^#7f-r_(I6nP0vp{?Ys_iL)+?rTUiKyRt--K{fD?TXLWLpA)kp|97vR
z?|M{BSEx>0@mkWJ{d2#^gjq=+n?7y*Ew1Ii>&19a^z11O&k$T7yT;(};b7gxnjQgf
z70%1d+27Nly?8<Bgl&%w-|oBnM8WAAyZPHRUxS%Jemzqh&CV=sS~Pi6K>y<}C*Q;!
zzkFe{QNv-cTzTVbUu*L<_KDZr_n5xx7gJiCSAa*NhT6k^qbnap1>$O=7>^zF+VdrG
zok`0@siKt99)8jO^#-^4BlWiQ9Y1GT)cEmkcI)&P0l888{?8Fou;1B|?4FRcc!96A
z-R?7QPjEG}zIA*dze#(=(&vYrj!h^LpRxLVPC#`C@9OKTucw{ebo|L_39a1HuaX<9
zPpTUJY`;FUZHN86_dArYtL`y4lbl<3zaZ^%=O=Sk;Wamv){0m7zRUf2=F_6YWgBkv
z>aKRJOh`8{T6Zy2W>0+dzP~lq5nPwe7P;`=7y4yn!g`&3_2CwS!&M)ztc-l~@!c5)
z%NMa?`|tcp)!yfOCOFvj?FU6)zTWLZv)&oCpSs~BaYIaR>Xkq@o|COiDdpR{x%1A|
z{a}u(+jwl}>en0AJP^1Tp3W$}CVuu$g-261zHR#P^2F!!erghTq}V&;EzWP0IaDz>
zCAKi~%U|WF%5SF+E;u8c@BX9oixOwQeazjfHP5cUn3($Ya*h0!#Gr|>x2MjMnAf5r
zzMNB4<LiSB3-{|E{8wRcO5Uo<_JyN<cBbT^WsiK1ul)N|Lha{;aJ|*q*-f+Jj~_c1
zt!-;ivsk;|{^$Iz_Xn~VH?=jKo&GoK(u5>)^QAxZqvelZJd&5r7E#;uw(|QouD?F}
zR>t*7FIyOOIMOrC?4GNN)rP-s*Z3XYa85F3Vo1d&-FA(F?-Rb5>^*YV%<QP|=}i`m
z|GDPf&<e4xxt3R;FL`6(+RMySs{Z_~eb(2w>(tLczJ$Q54byc#OsSpLcJ5G;zvr}f
zMfCv-+4o(ywhj{RXwxuRV9}m`)_WVzL9OZC>lUx5_!H_8zNcQD=Sp~0kd<v;`H^53
zWkJVR&&B3k+xL0ZJNLI7o1fZcKG9Wsuy{|5bus%cMrT#UzdCbRgIDhL+c^D7|F%<~
zH!j=q+}iO|?2S3k{vQtQQ1trIb!bb;Q|9LN)xRw3A4DyDaXTyN)1frgJxV1Nz23Q;
zue8N3ACYC5ytTpiWGmC3s)hUx0tfs}_G+gHhaOS#bzGmQ&@Fsg!o)PuX|2BJv>tu#
zyZ8QA-EF^|yRm6CQ<KK4T0s#u(OKu?U)_usXUw|$ukBzCEA#D}rd)SFm$1!o&^B=U
zIYT~0Z$7J7?!%ih#t-kFom}xYJmh!K?&o*4{k<csmmGIcS{zr>Y@QQ)yy@a3AwjY1
z<2RDd39R7`t<5$vm}bXuz2YXz@h_WS>s~XN_3l{N%skt;1>D^M#Wmu!OJC_R_0PWc
zEZZq}{-=$x6I13i?sOA>I<KtiRnVjfX2JrKza9GUY2H5jliLI5EA79Q(JZReao6s~
z*7RE{A7)R8ES<x-@{3xPYQpJ%p+dagCVx*%>quF>{9ShXmJ;5WfA)Vie5lM87fWVo
zEDe8FaNrlSO!SV;+6G;^$B*>t?+XiWh`9K=B6Z$&^Mv|+i7z$mp1V)9QrO8=A;9oy
z`k@3qwLf1j{d8X~wawbB-Te_u*h`hK!IBc?{|fFu5q%=|z&a+Uq%LaWT90!7J(Koz
zuMBvSr>m-TIrfT1C_`VM`0JbvMz5I5qJJqa?$*pLm?&49q{I=j(B<I4X9s$v?e-cq
zvG@JkczJnyl6Y>+HbI_U+>J~27%%&EQdOyww{Vj!>$TV2K|c%pU#7pjRNv!P^6=X;
z>4`c!7JZLgKIOB<EC+v{PLmDSiX&bX20sn{JNu+`4%3go1q@4mx#=;AUW{~LVBINH
z-#+7u=9WWO;@)Ybzp7WRJp1bNhezV|UF>(~W$tNjIiynl?w#?L1cN7my{pzPxw6?a
zq#)i|y#M*iuGv$i9u>P>sQpqsaZ}g7xni6JJNV}5<<&ILGdUURwj?fd=dI(rax1^Q
zJh#z(!DQ1fhQjIhrazE5S^LcT*V#ok|Hzd(SbFyhezejSj`}?Lh*G}xzSrDZ>}3oy
z7nz;ts%I@~dJt%$9<#VSF6Zz&7Tx8J4zF557ytZpcyayi<&)38@_M!EYLu{V<THCC
zBP0Kxd5ccFN}SAG@ptYnrw<nnUuVzoyr7h_&`BvrB*>uH?vUQ{^!uq^T>oF@<Xm@k
z*?2HlS!rjekXY>T1ykl|Zu<5-_3y-tN}G9aeDd}D(~m^Do(p^uwZmWjn$p4D(;l7s
zDtW1yV_qGnmg}T?*E*)%wSVF+PnPviT>mZY<?BUjxt=dz$qniY^yvE=BX}iNbOVob
zY;yNY7IEJ?j*!i#IlEuITvz(|o{WN6)2n-dovSY1v$$7O%BmyvchRr#_J7R(0-PiD
zWxoCnG3Hsa`Sm3JwVn03FK>#4i(8)zT<qs=F|9fM+Qd^~lf+itZ9K0ZHu-zlcbC_9
zRo?SA)m(4wWG+7z82I;eN_3o-eTt#At<a6d%yZ8!PxAcgzNoO^{{{y8ua`b)*cMN_
zB)KZ(Zkv?5-paJ<eF92mZy$ZVEBip<XQ~iKPW`R<zs1uw>V^Gz<Zw68>EfT2);lr}
z>uwcE2`lz`Z?ttqX1G!7Q_D?a!PRHF$^}1h6wE)reBYto{C?3J`P@5lKgUl}P1cJw
zdSf<m>h?RaD#y<E&98iQhI6IxQP-|3JKjHkl3t&CTesx9Zn!z?<g>x%0WV&4_rLJW
zGTp%RnM-P8(aE3pS6njw`C7Tl)K@OG?IgpM)Mw9lk~~&PD(-*U%Kk0&vB0x@kFzHO
z821M&a|TYY_-3&5&DDSaKd<laCW*_-KRF?+yL17!uT}4nixGMUvUgr|?R>V?a>}FU
zn-@;WOkI1J{g{tN<TO2&xX!|!)ypMsJ`b!odgRB;GrDzpcl+y}m(>(9XI?ruuYDqy
z_uov3MK<dNLv-g_Nr_8My%Sh5*QH4-!+G87KWr(EF0XnI|6O5OFTEh@<J%Ipg-kAW
zDV1qQP2y*<mU3;2Pu#+!=I`$FGFQRp{9<9rB|6PdT~xwF1E0Q<XA2Rq`<h#rEpM@{
ziu-SV@#)#z-yJmN%mq)MX*#6#h1uYJxZI-FhX-PJa!&tW(0U^@e)E~>(NSU#UG&ci
zx}28%;U9VA-W;X;-1wP}(yexvB(`kO6e(Dkdn;|a!~@lX7mQu%Om;l0pE}R}ZnrzL
zyjCISs^2AQv)27xsQtVoGAOxv6XWFvVv^>4_qSL^>^u~@Y~s-l<7@3KmLjf)&7HOX
zM0afWnJnK^E8@62Y3-`8lMl|N%d}l!y8r06*oW!IQdaiaaRh~*yrrg^XKALK;NS78
zbC&s}=TB!$?AG&g?z4?d=Xt?zzA?a1yRQ28cSeu1TPDg0o?X3!)5A;pdV<vqX)jq<
z?UEVR2akSPa()%pOj({5#sz!W>T>1&=j^?>eYf(B6)V?IX1zBh`GI=Lq|0lL2fcbf
zy-iT#T_%%+w|j7%s@3nN{q?qt(p8=QoN}x;U;91uGG}>^GnGZ0P5xAbNyv|8-=`nm
z?l_t+y<w&1&*;YXBesrN^L{S(S#*AR;$^#62O}FyV%3%}WiE_gyv2Lg@@I!P-7skU
zVX*JiG<}zFO|d7=hmM+gW_+t&7`I2lW$)K7TMcKe7kif_5>rvLJTd6N!pE)2tLMv`
z$9WmeP}SDsX?%RS?+R0BPj>Hu=Njuj7aUn%KR3?*zrFbBlZoF}m}*U%y)wkFNg&%Q
z_?Yan3tu()eD<u5T>f~Xb=~hd<t=x&eO-RBKTO?oS(@zY=QrPao|JL^wQugyhWGVP
zP6b;odQtyo-X^U}tC#PpH;z^KF2||tx;?p+aYoCzb0%(@KRevxZ_b{c|8!zl__K_l
z>H}V%PqT@=+@q24@B0LXJsaFVytuudfq}i>ao%;%T5z>xk##-)ZccrCO6Y6c4gtxp
z8&_Xh`nACIg|V=`sC{U1y5g#PYYlR>s{U!tkZ+9QI=d~-FSbq2{hP0)=cniSS$2Q#
zWytR^JzsF?7dvCm?uUIgZ|0ns%C=fOjCbF0uP=(xJzI`T|6nNO+a7Si!q@N$*Mb9&
zjh60Ao$zqMl>;`+7cS^WtUA6hbK~P@8@T$udHh)Wbouh@9%<2WW+GY|MPKD_d{I7g
z|GDGzpJ5ZK){0GWFKF^n_`)<<CH-6V<oLNf(aY@ihV4H$@3-y2P=<M;5i_>#6Yfyj
zYMTH5NNUOTKaqutcf9k+d{J`j<74ghXZB4t$vrQ7&}U0;=9W#@%KLm0(oWyzeY`Mw
zs`RB>>3$dG7iAgpv%g?j5Ho#ip3<*-Ox_=ho*s<eG4ECB1K0VBZBvTPn2z#Zh?jXS
zA!C^My=VRY`Nh3Lt=<bm6q$P#I$G5JtkSJEkt^V@D`OGzlX+de?9;O+pEW&&AKNx@
zumpFjfBC#ln&ZiLzrgMp`ra#2GZP*!EjKd0x!~uF2>u+SN2?>3d{*;*X3Mx^V#}70
zxhK#3EIvN(LHoWPS7UXTnf+QS%K6aNII&{eamI`%8~^`opS5;ofS$(2838IXT>dMA
zWFP&jn>J<o^79Y=y;ybq-^{&P*~^Qb^4e#!Z_c@XzA1ZVPuyyalG_E9d22sd`y^fR
z7N02gaizg7HHX<>j#(S0*<DMn<JAdvS>P$@B_ATK7Q`La$#~RN>$my6B^(bjGlUc~
zG}GBDc(WXuE=}C9(_4l+D`&Ib%KA%_<I)w^|0zz}b#KY!zwB~)?Zzwi+~L@@`U<C{
z`JtKbvn6%^b{)O*LTJIO6@f~X7vq=aUHdCy#hpAeLT|BWK*-eO-LD^IO`gA6`QI$H
z$y>WlC06-I9AQ{}@6heKG7d|jmb3c*&7U0dd;g-y&MbIa1?zsL*82)}Z=P`nR7(81
zZcuSlWAaueCjFeAw`&f13k1#KI`#W*yGfMnCaFKV+6*CDw|`AISh(Ef^pt&C|D*S)
zsXb?q(s*7hJ8gm9w<~pJI}h#(yDa|I*45xj)W4-owpBeAB`==ZU3&i5!>>eIBh<mb
zndya_57&$<Gj{kNT)m=W-_s^e(XTrn+}-@ZPP4p<@pRd#RgvMTL9cpFUe8lZP%Wsn
zKicy;uY~!v5!0W$+=^@NNOj$+zO%~a>aVv;jdfSK&U$UAz9}~GT0*St>?q3)A)!Cp
z=HFIsJO22^=Ypb%i(Y6pU%8=VIk$a|$d2i*Z!TpB@z&=)JiqtU<-4<l=1GfH8Ft;6
zYQ6hngz)Og6LS@(n|$z?b^gJO*3$>B&Abz}w^iyEw*Vt^cI~7OZV&eEjNCA>%*Luk
zV`^H-!Koh@e;nMlqKn~Eze{8Asq!=b8W#%v`r&r}q0fnl6DtHnj-LD(Q2tNCpZE8U
zzO9RA-e%g;^3wc>j#)4N*5n26WEjKT0&1168V8%7@A>`ht$42P^*wpwjz?oNf2nKE
zFKYP4F)Q<2$B*s*;y*Sn?|4-bB+bL(Hp9BXbk$Oq$0^Ih78Ls^Ocg2m?4{0oeFwMg
z7U7jQlV*MEP&>XO!>q+&LE^cuLR%ffR1cntdwNF7*y`Kf2JO50g^K)pJ2oUW-fy4d
zn8xC3QTgRlP{tbR>p#SQO?@tD^}lNN1D0RE&lLZ%x$3m}`_9SF4zInFFJs>4pwAs%
zDVnxuia)n(pE+B?iT|5pR&lF*I<?#P$(+sy3ZJ=OxUnr&7mSHmH*Il|*j~TH1B+Mx
zwRifI-@bG1iw6%%_fFoft;;XQ&3<sjvnz@pmUS{`m?)+`$bJ0CAY>y$Hh25tjQ5ke
zzaO}&pq;%+|Bc|eqN%bvv2Q(pOp%=WjECW79>b&D7pqKq9eorx*G^D~7G1%z?95L_
zCbpxJ2kJW1yyjS4)3XuSdc0KUblmy5>jMuhUth!>$jDQhztd%nnTELZ?SJigJ|BI>
zZb_c|Ez|yCx7WR*>SQn7HTC~~rZ`SvEEQYJc1!Z|E76rEw@*CC4Sx7e;xE(gU1c_A
z_txxP=Dp%d;@>!a_Egz<sug}e-8#$El@{iuJUF+oShYvS{_6qODI5_W9KL&e`L6px
zRd;3BuC{j?4m)3YZ(kOz`fWbDv(R>-h{vUGEh4gXgXCPE$e(EF*;l8(?dYL*#oueK
ztt4G8ip`pkq#VHOSy}2;S-<qrZ;NSRPk-GJ+O_&|$G<1n+8sS+Dj2(qN_%sC(G>gX
zVmvRTJt4cT|Jivzc~<$;_mXRwx^Awot`XBb`&6cFPo?a>uBign9_l?Fw(nmt*rf?M
zUzM~}j9C<3EwNQ1nX$~h`2YR=Hnl76eNtHF9sl~!>8I0<CI9%!$-ao`d;956lUHUw
zUTkpdYi!XO5qYs0y^N~gXYmNXTiVX+a4Xt!!Rxb37C|Rgrq8-1TXyiuo`xl5Ef&YV
zc)GPnUMyMgI_Su0H@n$SBaS6)%5R<H)6<po@<n=rgo{D!A!k>I>>IB?aOLs$?iRdp
z<`n0Y&;v(8XH}~oab8-q&uEvn*oDG#k-=^kd~YA@pZe@-;l4ZBZpx<r?mm6-;(J?(
z@w8Wrn`8}k*l(NrWd4D7$0P0@`xOvUer)}9o=MLOFJ1_9nauNHjw1sD+eF5BKV0ii
zPfkdPURis8hxP_J3BC8+U+v!YT;9b~#o}{()kPMqlow&=<W?(NKYrMAqb$%pO@CW|
zU5{2?Ys-t1I^v&?@)q81R&<Jb&v}qxQscfkaa%cJOrQMVP(Qijn9%X!536@B+;BsV
z$@AwXsX0qUHpuCGRNgC})Vq4&1&aqy@*8=7CDg63PO22E_Slm@BctA6xkqv86ZQlP
zKfR4dv|69MRF<qa*q@q~U+KIj+J$9WSdi`UXT@yhi)E8^8A~t6H+B8Ie&lz0yuZVD
z2184BgJ)OG(=PR2KltjH$w~LUIi?buR?J{ycqtU2-5u2SP~+a=xOaCr*X&GQ@HMxF
z&)@Jv{59runc!P4d@GKbxob^txc>GCn|s2`GS+SDn6~E`%y_tH;ho>=zqH!SBWH2`
z{@hWo@#1dY+o@mpla^W@VdRQj5P!sSDZ}|GGasE^&h%u(jrCG`;rSd>FX_LX#=UBl
zc+9-N`*NbY^q8wpPWt>m|G04d&3(@|RV%!DE$(U0a4`9f!tSOs2Q1{@q%`XIPA-t2
z`7+kRwKzTK>$eR;$pKx(>PwcYrP#eVWi;^%=ku*b$+d6g=BGz0*sDysTvqqJ@re5l
zsb#-EaK4eZeZODk?b^!ypAr%>%kCuqT*>q-<nh8cvdY3-4=aM!c)85^UAimf>ejet
z1$Vg4<w|{<{<dACx8bCgr&fphDINBWOVi^eC+4Rgev?(qr#8>8b^%j+%56adgYK}8
zQ~W<>^LT%hvYJ=<<n?zW$47hnR&0IOEwSLb8vnNC58am79uCbpq9wc1Wv3L=`M%n$
z6LNjgHM+ari!7LF@pz*Azm3K1|0l878OprunRn7*et%4c&%0(JMrUTeNsJzs-y~ID
z=~=@5<)`J!%g)t5ddw_N+dr5xzvlDqx%_D%ovBu~4JU4gKA+9Quqf!1=yj2l-`9CO
z=fzy*`kqvguNlAWzOt~t)<p?nyUfIUuT>1Dyn4p8<K5)7H<n(%QKf92mOCqj>tt$4
z>|%kIBHbK^*=);S-8m!ijPsdd_41_G?Q+*+F1JZ8%y-$^zK6d=<?g1l&+QL#oVvj7
zZ+vLl3xR_dDz6`Sn4Q~uNc+0ra+&mkj}r|piyajaDE`ml+Rtj>;q&{3+Q+h8Ej7Dc
zf7LAG<eU}5P$s)hfTgjjSkZ;!Pv)WjWl!6=zT90_BYVaF*TIBI6V-GkR(&jYNK{>?
z@OM#LROlYdY40Cwxc-E1dFXE$&zva>cmA1wW>>IN0K2ZU-o}*IZb>#PC5(^#dCjm_
zCGFc`RfQc&U-lehSn)?=>bJZI6?;?Jee=~i(ip@_9*9nSEUIzj+Lh{`uBYc{D}IXz
zo&M!_Qta}!(^1xyu9Ib4jk3L~XS#82{?gSFJm>s&9{q=j4*jcm`6f(R^1RHVxpB|Y
zz|g1fk5xT=`14m;aKA)t$>H;}ADmrQJb(SMrJs6t37-5}eRh4y-%qSIQ=Y~5Di&IN
zRDS$nL(=}0)hULGY?&+UO&)AJx{mkN;S>I0JATx?^ZFCY@G&Cgtir7PHTU~+p1*i8
zE8RTdfySdBO{|A|QulAWT4Mh!Q88iv^deh%u2+qFnj|IsGJC&BuMS_}?|%O4f-A!F
zU#^^xex{q%|6g!C+w*2CDgG^%n;oq7TiywlI}xWN@oa|eMg{(aJb{?dJ3U`*8WX1Y
z`t_RFY`$T0w>FG*V;|G$lNKt+6%JPybAC2jsPXyQ$ClJzCyKLVOiZrqarB!1Yf4+#
zy6Ov$Dt9KhuiE!bEq{+s#Zf^{&iloxHC<_4W&d~1dtRo>rl!)>eRA)W%;{AdnCu_6
zJ1v&`ccNl{*b=wC8?kcBTvl~u*Y2I$S;BoL+d<6ZL~($GPTPGqJs-p7`m4Hp|8nLW
z;=FEnUhdQ6z6*ZpcU|{r%u2quu<!EPYszzECrgW+$<v&-WK+R|DfUTnOO!oYQ+M(i
z2(kPL?Bb1i{J43=B*9~WZ=YY-)gJp|PG;Q11Mjr$-h@}DEz-DWa%~=;iJD(nrSgS#
zpG+=859z7i|9&#-?RRb5F0wSTUwLx4if86I4w2pzBPmz@L-`!}0+C)%oVZpOt&WZS
zweN<S@ecQkXSkLxJ{5e~iOsb_{y5LIH)?hT6R-6b8Xs%RE4gzfTl&+J3*EE4j)$;(
zUTrn^glvuzYw*1(qU(?En9R+qBN3;tb5_^_#Uqi2D_09&s91mRU|^TkkJZaMoNnA(
zH09(UlU<v)?D+6>v$Nq_p$gX<m%jXY{<y)*eV>u?M7~$4vS()*sUH&-+wWIy_?Uq~
zs^4+eUlX7B!{7X`KFZ^`-#Mwr@>Vd5hRX!k$4$;39M(PLW4+525EdBMdTPp#si{By
zWG8j`o?GC)WS+CmcmKZsO(|a+S28>>u*{A1*z>Ain9+ZA#75uu(q$dfs~f(?aPeAP
z(LZpD|Ja*9JH9Sw*|AyQM?fR7bmp=};$P>OPOy0ry(08Ld(rW*q<XW+YyV?7FaOeO
zS+O_u4~N52mY5w=UBBq8oL95iVbRt(J(h3g$GeIYhFYCnR&BxSbi1kX!;Yojy(5=<
zKT4ML{`5ul)!S{q%B<cmcb$6uW7fXgApx;z2abKPUl6zCTDP5$$BZk-jsLic)Vz$@
zc_*(_cwt_-nCl{WBd3>VKl@~TZ-1=h9yoU&llj(nnl=)D3}(2zmP-hoDPnX==&|Kb
z84-_lVH4-CTrXokbE1+~NTqh3^J<CJT{#c*vY+|HA1S!av~>Np#!F{@{<t0g$zu;=
z{yFA#tLLv<owu<f&sKcutQ`k^uE!NWm)X|4azju^i*T1-THBPbjq2U2zVYpRJ?Xms
z-jJvDzRX$)wn-gNq|Wj`sO!?K`pwL<`}eMpmexqK_|+Ekd8Zv?b4@vQX~y%;H%AON
zo^iS4!>Mw0%>yf|PUfq{U$```Zn^jG^|5s~Cj=f_n(TT_utVj!*z7Ni&&AeC8+ggw
z{dHhz7W<K!Ps?=tZ{C^s@)qBT&2!i7J<g%O<_7PXx|=KJayD-i`|o`3>`b*V&m*UH
z2DQ0<D#()lx4*pJ#s6Z!o(pT1Z28UH|8L`Fi#s=e?YJ8EE`sNT!CE#EdsgR*yTdcI
zR<F~({=)IJDDyg@2~lqTAJ%bvQd-Eb`<8F6!n>A#hhsL0x4L{;nZKzw`r|yENWp!1
z&$yoiRdFu+VNzCcEZ~#QeyQ`Fwf{~X(Na6|i0hOUqt{9)^^a=X(*Aw1>&j6K-S<{j
z_tA=)(!bJqI&S&FS3bUMZkl$mUq(8{!tcR4LGAMyt0sAUYYgVxywRcRp=zU#?)IpK
z2fqI9+{G<+C(`S#&)x<B-|+l5Lg#eX|9ux=<*}KiaAm`CL+$hP8E-udF)^FJb@g*G
zi+8)HTw9V?A{M@85|_+8L5`Id^d<_-NjJXAajWC<!*{Y5UDc!4NF3MHI=JMS&%TYt
zb^^hEt!jMV<mTRfe0Rqj&g$Iff$w@Go_^`E@m62QI{D|TOLe89JtjZOC$FgglNY*6
zM1Y}aSKX^89)h!`9n`eh^Vp^D)FZPivzNQP{Lpdc$1xL|w<_QM?7i%8MELWEsE#O>
zYa0^zRBbQyoX(MP4EE9FK78}=^c4#yCnmg{{czQHU!H|ZotJ%I&G+r({&^r~ii-(D
z$oaWiZ+!y;AGOH3-?lPcs;C>k_tb&gLfkzEgaqc*n_t^`q&m8E#<M`qS>Im#csTEF
zdSd#aTF-TBH*^Ww|4yCcm>?M}CHHE<ZiT<Rm$Su|os<iBXSnb6@8idA9aPBuI$7aI
z=ItU&QN0NzkA7S|=iS_>puWDTYIchqhh=KL(vd2kcZ%nuGHP2yix1k~nLKsDYWoG&
z-m7(kd(B<bS9<;Yd%QPCdGoD()(P#eOKu#9<Ku|(uK8!~bEx6JYry{l3I3<kk`3nT
zEGd1lc_It@-wNRviTxXm=gZIDq8F@g7PXoE2Wu0bmR01YK0~pFMdI!e3I89iSbU^H
z<?;Ex<KL^eo4Ercex56uchY#-&*@X#&rUu$`Tf!;pQWc)yo*mfoHIdO-{#1vEe|IC
zD-`HcQ(3tDtYGK2x@&J=8XkV}cju0RDO37Nm#8wk8Erc~Z)0D4QN8fijzreCDsgTH
zuS^kr|L^YN)8<ndZuHFD`ZSVz*_*khBB@LL`jXg-yB8*Km2IkS*qpw4cWCtt^P3O<
zcQBk>JY8pd?32L0uTs~3%zyaMRN=_Vby^EA{Ih2Yx_EhA1Jjj7mrXw&=xp#>x*^WT
z?deRVbd3p5-P@esuJPyD@tgCpj;w{^*@9=5Jw?2-tAFV)jWI9@mD6ERpSS+F@U0_(
z@s@WM&D}3nX0pBb#pesnDkd#1g7<H1w|_W$ksCMDYBq*-F7HH+tg4!GL4C*4#Sj1F
z`iaNJF>!gY|MWBcVm3eg#<Le2&K&f#i)$BqRMC9<Q?xL5_KCMUCfyH{mHB6s{pt8Z
z9@WbDY3HOvSXX8gA8-9RYtxC4kc&nAaa_`O7xlf-`=rg<-PysWb@77N71rM;mt5XD
zt8vZz+Se9^?xt#wa@|ZW94v@44bL>6WGffs>Drn9VWDA^;);6@Ke4_O2;Gn&?Db?X
zV~JO_tKy;^x@s9ra+BsY_7@2<?|8M@*o-H&Kj3}T9F5H7PMUWF5Aj+2S*LU`FY@<K
zyA37*wflSbq(r7f?v-7*=aFHJa5aB_N#WVO=2wy#BU<w`Czdo_D)R7%p22W~<9v68
z!2D-_XA7PeoB4`cZeRJ=Gk5i03h8gH*M7L-8vA~o*FVHwi#kl$zvxqW^xg$`iWdsr
z`Tx~GyYr#))oVBM7=H$DV_j18sPNxqdG7ydbN9x*>HbkE`(8{VJoNAP?z%L+iFdSP
z4|T|YlscaLbYf*4@1;wHT@gmib0#_euG_bH-PDBR%)jKt_2<15)SoN9<ooq0XM)%5
z(R5GZo>aQi*ULk-b&vMqeL1y>j)B@)#~wY>@ZL8$`-agfF1atI8t0BOR-AKw|L<;J
z-<J(f|3>rNc%;Lnc1^&jzWCr-h4-hPa%{~@K7YnXUvcZ{Lpg7r*VVW`JpW^6?yTpD
zITD*D_taf9o!0m`bbii{<z<Vnew+7t&2kNes}_wu|5LZ{7jG1b_*CA?98qR)<@xNM
z-jjQhHC1@lZ+NDi8(~(km`T%zgH^lUY(u1;oAcRfPp)|hK1rK)Rx9r;^4fAHE%GkY
zvsqRZ-!G^I-)=lxF<B=-WungigeMEUUfdPfx@wJ&ffm<wi{tYWb!W+h7%JT~o5A<`
z(45`&@+;SwuxyB|shsR#QRq2krjS(L=c=WtkGWHq?weFrYg<}aE&gM@Qik%A6<2n+
zEh{>h*ue32-#xEM=XT6&-u>ik*S@AYhV8rFmd1COq-`vWTc>Gg^U{06gHOj<?pCo)
zUGu2%Ys^bo7t3=>#%s>Z_LDTLSQ5~7(8TgVY*lPYM>iYGQ<uaL|MYHEZkrvK0)6|}
zSslMtJ-s9|EtTJVm3U$8hJPHkn<Q>-Z+yHYn!8|v<=^5kxwpG{X9(m;`n`VG8F>Bv
zE{-|1hyQF%`hJY@x1rqL?aVJ4JQrNaR6iKD{*FUz!nwBxb{YJ9mdd<-(L4o~&V_9P
zx)<%&te%rTc@4{gP6^59<^4C+3Ucm=_8XO5`>2`WxBbJ_iCl*->IQ#yj5>HXP{$x(
zx4%Jyf#%t4&l75m6E1{A-QKQy`_8OKOM+hClz;o^^|9Dby1iCw_bz@N^SEu%)C(Vb
zABJ2GYm2<OAmaY4Inpm~O_lijuWe>o?JqsKk6zKt2}jq=UBtYSeT&S}HyvkZsxOsV
zVp_+Ts=w0r<BcoVexGFB9REtIzQ?FzYtEzD78wFQOFy_y+~knbq{Yy|d~AZkH>ad}
zDc>vYUYi%x`6c@F)=g)Au6DM{;iyoBfg8j6nLRQKXRP}-Z~j-suWw_!JFfmcI#v9$
zVevQq*9-Jwy}f>@`JYk_;=Urbcal+F7GHG5$1itgs@z@~S+eW|d)>jSYoh1Q`oHhz
z;{z);GoHO#E7kOJ3y-0c|B*$XPh3%YbAMrBq-NIfJnmnuhWC#fWm>of)=mk!sQi$R
zt0`~Q$Fn_uo4*$bFOyjC_rk~D!u35dbM@~iR88{`-QDttb&rig;q}Mj_3r}jX55~?
zV%@`#C6N_-GY$7VQ9GHsW_ygLvgfJJ-xaRw<&Q0!*7~(b$aH=^gVe4MYjm^!G<^HN
z_}S&h!F<*it|@bbYVcdeNHI$%D8z@$$6dN~uj+!W>W2?mI)`>m*(A*6uxIBEoip14
zWm3xmrv#QPuyZaezWm<$r*^XLi@BlS56`cVdwNl~-E)dOx1``}nJrh|{^PBSpJ^|9
z^eFGQWpT|%xL9M=mzw1s{>-Y<_q%VxWAF3II-kWhStic9ev<!bl$H~Bv($T@o!zo~
zdya^lzj@-B+7U1H+}F#uY0B~k)Ot^D`MF$U{gg+V(#GuBy2ZUsq6fBAOgP+-!!Tv(
zTa)8|OEQk#ukbmuF17Xly2$4z%{94hyuGBP({biZz{I&c%a?DGwhm}(OpiS~IaoQo
z&rf`L<M*e2W^rnAA+n(_3M;>4u5f=}|7G4*Ee5|&e7~eZigx_;S=_b#@bhP7%Hjpb
zelMB*Q|!=^)v^l5b!JK#u42z{4E-fM<HTxx6?f4Mv41Q+e~@-k=~&!4Yu&1?`BOO^
zEp;Bqbmp&+an`NevDmD0jZ@9-)St@*gpbLbwn)3&J@3r7obLwLFYiwNp8WYk?GgUU
z?KbSs>#CkSw3p89Z;RM_qPfwN_ikKJoa5t+>7Oqh<Y)fc8?RYVle6RCCjP$d@;QI4
zcVuo_=2|OUvS{}1gR*rAE9TCdCcuBVc2gE_{}QW>k!LIACjW4{$S<?md+H?lcI7?l
zFXwPNWYpe%b@;blS$}r>1A#9WJ0rH4?R!$X%klD+Sr7kOUhGr+tzKKIt&*CZ{mlO3
zE*_t`Th6^*m%_Tc@kn0Vgy+rOdju2M@B1jO?*8*N&|~fIZFdzPSL*J5eExUxu9LEV
z&$pai>QUcU^?8Snb*HKh6QlIMmJ-n~Pwu}~o80PqueY$enIZb1;k8+Zc83-vyI-kH
zRk|qjys7VH!)$?<lTCl^44LRO^GuJpvcy?~peK&s{T2NLoQ(2LI-EHyX7}m9D@~{F
zBd3~<91gbrG|6z=`_dV6R3G<L{?U7I=~i9TEuHqGY-y7OY-XQk*_d;*G&x4{Ynf*4
z!pRAa^63Jnn0K3=?fdYgK1B6Jp;#2N>YnSXf86mnGfB{CgTk3Bc{X_qHVLd)(c`S1
zGoMlWcvAArv;Pb;rm25T^-vHja{9l<-FN%yuzhom>~$)c!MJ*hblq$9X-l)sO+7bO
z8J~0bHO;nY(ypz-JHM0%?AF^T&2sYk!Ec+x5}&QLo8H}efbIJU)vfvhrQ21WZg{J)
z<NwO7)BQAgCtqB3PvLn)Xz~)pyS$eZ_+KQRUfI7s`}YdP$|L`;IoJmD6|J?A3H#`|
z$@Kd%Bas;b3s*l0(|UM(Z<nvKe9m{Cx^TM*`iu9S4b*yNz0&K*)opq;jqTlw>IF9}
zx4JMp+QdR>O7XlS4uQwNY8+VK*JOKnqvs!GnbS>AWmPTiT@LwjEw;V(+fxg-8BDU5
zI1XL=D$D&Us><`Z;A{S=%K|JmeVNzr>FI?##%d1p$_sOCnGT&)I<!hC;*ZwjuMeK_
zpJEA#zqLqF$mMRo=si)c1rrMWT3)bPOgYuoKkwwe<lsLsIm^B+tTO0HeD?V<>m0X3
zI@Xhyz5j4dv~aPSpWT)<s*g|F{4ib>b?VLoJ=QLd{T#Iyq8B`i?y{Nd_a#}Y|7-Hg
zpbIU9$LFjpFS@|&+55OW?CtD>Th2`VDn5PdmF&qk*EAS7@AP6lpenxV@BN?z_Wd<$
zZ{@TV1gpPTzjgw{Q$v>CJJZ<xe=NLfU#K*F<+b8j%bT0tFhwyM$rt=t)t6qe?(eJa
zh0>ZgGTu*`?mh48&gr&Xn|xZk^jTIfd^GFdIxUOz9bb!IxW4jQefJuJm!0b5M{y?~
z=$2XTw79>qE3)%X@WY)K!i07j=o}JsQP}wCvF^-Wk|k*tCscB7hkMLT^?uD(tbFRg
zLl)iuHG`lnYdjThpI}l>6KR&_f7EwadN;@NS2{;lN4&|~_`2bRkTFkm;UeAO8OHBe
zPS;LYbXd91b9Zd}|91^f>K*?+-L|*UK{BF6zu)71+WI{rYwDP0yZsD0^Y>O|gX94-
z;Xte6Xa3)sKR?`hY=Oh6i*EZ%{_mgr(l_TC@0Mbv`<+@kdz5#3+*Da{eHzE5dC%%*
z1hRhqv(@EWviI&bk>`?H8_X7E+nikgu%o0T*G%nJX6CA6`Zcro_MLy1weHjH^fZCC
z>u-G5$aA*ICSJPXV<(){eL#|hx9j)HAk8OX7Ke6aY*?&#y^d*jx#i7`O^0oo&f6_L
zb!6{OPqSV5libd}G>kZOcG0qrlkWd;Zaq0;=Z2<@%%UZ!{xTCj@f%;Rd!)njGST7d
z1kRg0Nihau2LH~^`S-rUalcZ<?#0Ou1Y<9sl5EhNe(~UECLNA{yQ|HF7kw_+r6pJC
zeX44S$u$;*ySG?p+T^!=i=5uHEB5u9s68tJnfdw7bZC6?i|?OgUda4;^$%fr<^07$
z-}X%2+-f9{?iZBtEL85J?;m6NHNQRFPXu>=XqY$ARby!d>tUPuT!Hs?Y+~4+wx&yA
z#_AO7v`Ny3JcC{)Z(<dB{-vf(HTc;k=f(%+6KXyb`mgJ++}O4uhEt{AguiQ(MD)%D
zGtQg-oxJ<xhSid%CR8gmCS<Bh8eToPJ5}y<*Yx<7ZJCEU>~qpDZamV<vO8)yPgvWT
zIsVH`SW4NhhaQ=%c5aJI&BumIMn!Kk)5Cu)Q(bZVO^NYr!RvQj92*PVbtN(z=exM=
zJ}Qxyu3!^geNOfFw$oqYCYL{vTt4O7s(TLFEl2g=&n{Ow8?dNkj{l>xe>Z>be#*S~
zng;*bYu_Eeth4zu!SmJymx4vJENU3G-U;F1O@I1r;~h!0;FW31S*9x;%-~(_ocB1@
z^;KAg@S6CV?Vj9Q1U5vx{}ofI_GOtz<>$nP&9}lH`&_m(R=B%;>*btHPaf%QIiA1a
ze(bRuG3&1-&E3@GS$6J(gN{>v%ggTh?RWi?-Q3te9636n(lO}7nVFfXem$lAy(!-s
zm$Ey&m?FLB(T!iaZ|4VHIJ0)mZijE;f7P2JdnOfiDa8Dn{nvc$^Q4pKY>VP1OkNUs
z_1`J;Romu0GVX|pEoa-1@@ZFE=*=X}th0@>Lhd1@mm++kwEY|RXgq(gq)6V--s(5Q
z=ESrv?`ntkD+ZHRAH1tIdqXhm*`o{m0)7AayS>W4TOnIBYwyeW$?BdW%e77hscM^P
zh*m6=3*Ez=^XyBz%_a2(oy))btm|B;ckAMZ<0)cyx2k;(f2*F~_igY0EpNVZu9+ED
zQFHS3?d68|!j%6{Vh9X!Rgr0#8o_;5XmPa0EeFTv8^6hze=^;0Xrsc~7m9X%sxMj2
zK0O~^ai#5zkm8y8!ZziE4dR=PlWo5)m@hbK9mlRSsd39cu5=Pvu}0YVeNZCPiWe;A
zmuB2~YVE4o5gpw7I5&3c+KcV))Nbb=JK>-xJ>l0yZd-}zdf%9Kf9zQG+2ycd><X0|
zOD{g&op*M{`H#=0c1?Y7JtjnNr&!iS4a+U|%1dXZ`%U|FOxK9}nq-gsK25&A<}3dT
zAMyHO6UY;3_2%N7DKpIlOHSW95P86M*(HIw`)fJUbW0CUR-P}`_;9}N6-nX4f1mAF
zle0YBcyn`@%z-35#?rGEhYMFq1z0_>d0epULg*9MLc^PfeO3o%v26KOtRSYjP5#yM
z_9>R9-ga}`R@zv1UrXWc0<)syub(c{H=4#-X6C-H@EY3%{zV%PEZCd4Z^mKOQ`c;~
zQ|~hzu~@ob=D!>N3$`9({I|8?YJ(zIh(ANN_|nS2mr)N7Uq9w|EqzIs-|H28?*w-F
zn)F;yOgO3@K0(E8$BfH06As-jo09NxpH+j0w7RlO4xe%A>hwu(-LE8{WwG<&{-7W$
zkaFHW!u=zA<NTgko&wue)E_dCO3II48@n??Usv>m`=Y?2bHe#w?LFTub5nom#Nc5S
z@q+zvR%@cej|q8y4d2L!1<dqNwJKlvbJ6P^>)XHU3E8%$TBM$9z3zH^QvPl|j`ml(
z8S7#?T34q}xnTE&$8qNw7qim0I^AWDug<TPPg?nI@vYY{U;Hq=S=1uipK|=n^V^AM
z9r!nHmp!epIP6i%#&cI{4=@{BXn*W0oOID6OgJLI=hCvhG8USK)?acCXYr~DrztEi
z(>mLpvn4Fm-?#Hp@<YZ=ei=)$dk^wdXjON3as2e$lW{%N#Wv#gtBtmcF7X&?T{$-8
zxTr_h<fFVB%A9A-p74t6S^?h?R<$LjzxxBdmsv%8<(d=!XUV${%hzXobDMB)Vq{OB
zp309!OYgbwPx!Pg_GHiAZQJ_tj?6sn&cU`f&4Bsisa0BT3(D6#Sy@+Uz@vPF<?1b&
z`g7}dT=*Z*BC*|NR~y%F3%7gBN++l6VA#+Q$z8+#J9-I|@t*`9p_i;Xb_fNjHZEMp
zXZn4eqL{A9Hi2R`w${AIQrDBWFYe`9rw|jv_U4FcO6bNpr_1)p)G5A|;<=;bz4we?
z!lzr&+|TQieI1n!e~|og+HIeQ{uAa^-KAx}!`d&ZhdlZ>b!p=7{iQc^xymm8<7=AJ
zTF}`4g5Q2yd#sUB$a()0O`qi6uSmZ#`E-~tTSmST_id4<OJjMbHM0dPDy@AsMaSMS
zN=HoC)@u&W`U8`-H!L~vznoV=xbM@gcNVpa6Dv1NX`I$OY1cZR#5wcVo@_9Tld;==
z$Is*04gI92Pg|a8tdmp`HCS-3k|pNspQk%pr%o&TdTq<M?9+j>43@MDhS_WUny_zG
z$&xw+yR~Af^AoP`ySKw(?*s{+^w&WvF5GPJK4JCNd|A|96K1Bp#}=)&*EQR=)1KLL
z#@VSXiHBd6O-nuMe{!##oPT{r5|6;Dh}&OzzuDGl1_w>=tlL~5cuwKAxrJ%W{Wg8e
z1C0%bAAh^^;83M`(6vBAndMvyjxUKg>^=RpPdd+m3srYNFMq}SKtKBHq82~z3HKTQ
zsr-FV!*_<K^jY1{CBG&IwMV?2uMl8z!#YTAZ!XJpXY0RP7Jg)I3H4tt9&~qkt1wgX
z2aN;ULf`Pnm@|CWTYT{<%YnDDe*~6%J|}(1x78uy?+uocSF<>44xH%!_5R&S+n+~N
z)b><6xJ$Ci+cs5i@m+9Vee;W-=`Xh^KD>Qr<B509K5@QNcUQ=_+Vtuvs|nfWWHKy~
zl>V_rFroV8)AJ5{4m(b}I_=Y<7Rxi@jZ?ODdHr%UE9*U-xAXzmcP9n0+eMF6*<b8@
zk!jCr*l<6-LG|GJQzjA$p6-t?u5Rw?SJ8P{e*JjCo1gqo^B1V6GU{Jl>hL*WZp(F>
z`yYHR3Z^~X)xWWMf$(z8_BR_3><HBOxvzrdq5h;Z$J`ThuU%en<;V18r(AY@jbC*!
z>t_A#v%h<mt+*3*>(j;u&!w%mYoy<}trjlHT)m|1rV5K#b@aq9A7>m2+4i*D@%^iL
ztG7fiS5RW{xa573fq~D%alSNY>0)@<lxyFsKHaqzcRzmjw}p7-zc1&*^A&z{{@*XX
zd9LFzg+PhdObKR@p?#~KO)<>LoSMcg+S+R>ac5?FirP=H8NcRol}?&=p~dgobH9Bt
zPG_DdZklmi?<>=afU6P>oA10o?lHB-r)<;CtqdI1?Mrh%9`rtcsNxilMD}*xV+JQn
zxDP!4aqjS`DZCq0?p*%c{(PtGR_9Rug^{=R&DngRRCSU}P9?`{(MQ1+t8Sf85~>n?
zWAnD8TFrd5SmC-8HMh*ejz)^Vf3fl!(}b(<EN1fCF3Uf{p}J7?`1<T8@3$ZQ<iqfx
zaHaZMrqhZ|HOE?iowl|p<(+mxW@1zSmqzD(@6y|1vS-gWbg?)yv+Y<ck4vOm^ZV>_
zuKQoUmA!RZ++&$F*Qlo3<ft0&MrB)vJF}HGM;5H{Y%2fxS3-DSOvhBg_N!MmYVz(#
zmRj>FEOD+xbCvqNexIA4%$42m3fUd~R}&r4WO{aGi=MgTcOSml@(!Ery?Um<(7rKa
zgYNgqJD**4-dDfy+q;#MUukOAIMlYzSmv{*P^jqL`MU|+sjuyxWk0>>yy}FZUv6nz
z`K_ZHRbHo0$_;C3>10lxdNKHZ{VT?blWI2G|70-yYFGYtDdXb&rJP4|KGbkEEelwa
zvuo$7)$Lv1^6uSi+V5~s<ALy5)6doHb9|@oum8p8w^UE|O2u>`{Ur}>Z~cBc_{w(0
zlivfqtlSUzg(kKqXeXzabfxSOK2hGyyP)gjl9<^NL6%37WP>Jh$xhtbeBgCOXh6+}
z=`}x`x*z7w+F@+s7Uog4W-HJ3_{Fv>=gLZ6XHZ%s{pjn@`R8~=7TTDm%t%(g)f^DM
zPM2MsYhmCT-`w|~oPJHqS!Q1Nuy@{%w~4oQXx+~^Ua>sXsMW#wzGv{Kl>dRtSw(N{
zN!-ypb7R0QgI{MCoH}qwDNx{hX_=z!HGaE(vtJxZmha+f)g(>V&6YBY`8MSeN3%e@
z_@rf%_L%TquWOcO3aR^A$C~9N5F+IsI`db+i54E$@O_8g{dFpRa*;cE`!&vkvUjp=
zKFIM^mlx~pn{GV&4pW$Ia8b*u-(GRk8q9l|0=6#Ye;8k>+h4O<xcL&(4Y?`?*Vs!h
zA8zM4vHtbltR)uPu6<5TbbPjR`BD*=s|+(gER#sMw7TlC<nPj^V=h;P+e>`^dM%o)
zc-~zsGTc1z+vCN{pXly?S{}vwIWf-G?B2bswA=5?eh8%Po-BS?w?J(1bN!ZkH}Adf
zY+B?qE4qBsxsplTs}=K#z3#Nt)+Kxq-|8wjV|w;8r3;&bZa%u5^I3wqfMfUXi>ZP;
z4gb8n74!Z3O@sMM7Q}Qt@w4=7s?0escb^oicieiL<vIU_R&KogZ=>LQqwGhiYhCXf
zTseAOe33%m9<>%B?&IEuW<@rw`sdotN}2i#arp0;YUJ5(XLFYQ-2`^arYY`kWEYwU
zMfkt9T+KL9fWs!gU*q}NH#W)#WSS}&w2WJy7pD5!DyQt5E45&Qo{U|&=Q6F2(!LTJ
z0TSN+&JQ;}yE!Z9$k`29DR(7%nhn4EwsKm0pTV^=qQyq8VeXSlLf*oKliSbBKf1Xn
z<jlJ#5iFZFCar6Jb-#GBgx=I5ZTZZ2w<cx(N9PO#&%W5dd*_LxyDJnI?47rq$>HO*
zN7J%5`>m;)Z!MhjLM<(5Ul?2Eols93=aU;&%+%&nu(|4^H1}8ezIPih?`m4L__<cS
zc}B+0#FCXKzRo)l=CtYB`rA{?zX@-NFW>yWe8=XETE5p_e0dmWU3W@*+JRLPk4hz-
zUMxvplWINTYu)M4(4$B1cG+ZfpZOV}8La>I=7;327ng5m-ki$Nb46)()}6XpO@}V#
zKRa}0-?H^ngEx9k_@+~lf8njcmGiur;u|`bKZ;Cw^1j`d=Rj4(`86edh0}f?tveXB
zr0~7b`e=6ln2kC)&b~(J9!Jl<Ub(rmum4tITl<SoE=MOaezg~~Fix5Fv+v;<Wu4uJ
zR&V{joxf?~pVIQHOKLaI;mS(oX^{DS@eJRcU6si(D;{f|{W?v;<=!Ii!d{arJ#Jj{
zo|-$gY8?_>tfR7KbBB0_WX|46=_ht?;kC=k=Dx-Mp4r>NFZ<Y^1MAGro$Iu`KL2sn
zvr{j0gEn5V{1YpEMulbjLw3j8ODDGq|5-G#^1HV$ufg2rFWy@dg;!0p->3AL<-3T(
zvj<(zf3hwqcE5K@?_Jiii_bpEyR`jG=;~kb#K~<|z+pAJ#k=Mv^(P%(R($8Z!)yL&
zWsS1eUHVt?_@{0Q(a=4e^zYcaJ12NdH|Or%`p|$q`w0Jy>FP2Trvhg%MD9EOq1Zo!
zQ(3&}3YYYCbHPTpkbIr_S3-3ERsX&6c27{on%K`Di_h&+wVrHcb3tzc$C0zHe^ig~
zpY`7M?*64*&FQK)=2}cHv$`4g^y;${1^2I9Y^`0tdFO2bUu8*Yr{`OL-uU4*;qu}2
z_d|nTNfkx!{XCKXO>OyK*@_Ek{@WL1tA3quC2czU`k60p3nbdSX4y04!eLH7<6^&w
ze|LUTW1dyM%{_bOz0W`V;v?sVcu18$U*NHzGpAPgsz|59^-=-;Scw<S8b+sn1+3*`
zuICT8)3sPWH9~yPi{Qg^ncen;Y+uRxW~ZZC*M{HKDvzQ*yye-=`qVUDKeK4@mw@cM
zZ_aGCn613-{_@p}?yW9W+-Q6^P^;qCw-thyS33QB;QPXIy7{DV)<@f`-<<x^n;k19
zk;%E%VZA`|*&nsMo79CFV&5%a<?j1-p1*wOl)yY`an7G_zDEB_Il;~P;rpC3U7@>q
z{JwP;zMAr-?C+#W|I&IL%j3!>maLR#*}3_N&+<jpb9r5?vV^S^>>h0W>37h}GtT64
z<Dr?m?LWRukly}EyEd@W@p$zt{*s!D${X@m9M@cSon1SyByr)A#!JbivirGO0^6Io
ztIPPq6DQo4+hi#5cgo!*ytl2iY8v<?>~-V5d1PhJ`f;cDLdwG=rP&s?He03UwF((;
z-!JuyuP?Cf%kj4c-x*t8o!A*WtIoS}uJh6Np)1cwv<1$I;IlmJWOH*#okhns8`oDa
zn7;U|%&by)8=!XbU#CA`X-vw?om;l-JEmW=$w54Lg?8|TziY3b?9TO-|JJuB@x%65
zkzIMG_thP1HQc?}N2TTAKkwx#?XyEGF7+B~Y~^1Uvvcc;Es5`*{9q|PQy(_b`p;2i
zo|R_de>j~A=gn2Ce|);BQs5ciyXk8;yYPuFVsm6~l?*;BdvL#4&u&kZ|BUq-S9Te_
zuT3;aK2h=b;oY^uOFjqcIQFxxe36mgd6Q@Td2^Rvl>t*%|9EzwoJ)=MNm0Mi(JrBc
zO{`|y_-d1l_2%flk7qWIl(qS%xWW9QPwv#c!oQ0v8Xv!0JXh_~aigDh1*SeHu2sy_
z|D>o8a(KlVty!UMmwWaLSgmC`@p00;h24T;>@LSFj?CF%z{?}MPi5`t>*qu^n=DyU
zl5?`ZICH|ortSOtbJQOEeA&PfzuMR5l?MO)iFP_IC;!-TZ_Ku9wp+?0zTR5n=gD1)
z^K(>vdv5ugZ%LB(Upwz$`TdzorOo`V?3L@~c9E~pQ~hUCU=f|qYn{JXPPJk7M9JOh
z4Kk)u+~2Ic{>)2E{<tV~cbGb-^yY=qJ#i})WYQ}&j;2^^?%UgcnWLrdh{dxbdldi0
zL@rlf%%SXd|J(cJ3H*-V-W*<cndMaMEtNffs@CC8@6GmG61?)n*OdI8ciZPb*uCb+
zE!OrXE}mH$f4`m<W_f>GyD%h9=7^2Oi#uQLEZBH6`|<(?d8Jdbm(I<vD$ToXo^}4k
zha$UxQ~{%oFCP;U1Ez^w51Xv8|L^;?g_enC1(k~J{<{oY^pd5nS_pk|{vUa+zS3&0
z<@KGfJ2dplU85obt#7Y$48Egx=E;Af@ZbdbXuE^`E8X8+YSXl6{g!L}qFqS7e-YE)
zi;w2ZF}LO<9oSI0*lx4h>+NOh>)0K_-X|@ZymqhB!5p9F_U$`Vp1JQ_oPB7yc;7-7
zEwc{+$LBna%UR1@EwLn6{MF{=GEPeuOUpStwXylR{$EIFy~(nMO*?m<7GGWY>)f#=
zVWqlGU-#B)nxF67cd^F(SV`OC9oIcJ`m4M+@@m@ME$tS$M?Wu8yji39$I11GmED4e
z+r*`_rIt=IKK0tt`opZQU2`AmF{f(p%vdQn{ZROu%+pO0OOM@BPckZ8z1t+VDx~a?
z@-xSie$h))9M^ZRH^@EW_RVzS>hvATdmD6Rmp)jzD(9g{_2d)zWhe7Y4=%K0{8;&y
z(Yn~;(dEU5&R^b`^-<tGQ;q$;sEavV5zDtlskmq@iC<~bvPLM2saXGr)+K(MFZM>!
zFTF(0bnV)6LFe*!KHllif*p&0K1<|rb}(yC(6YBU8X@rbYv`u$ktLq#Tew|X>Njlv
z?*5@w)p}0uOtTXLUh7@%t#8r_{joUuuSr_x;d@D}8p%QPBkC93FFI74#h>0($Ul3w
z2=i6GSs(nb?%TF&_e||Mfm#Y>vfJ73eNy23nv>sX{Wam=<jRLz_wrrX^7pduC!Y!1
z!)p``ZhcQM-5R>;)YL!AwkV5jwZCv(Gp;@Ru*|MGaxeBe9Am6=yWD;5fM(8GyQ?!^
zT|8+2_45Iv7QPkFAH3F2_?r4WO=a~HJ+oO%4aW9{$!AwE^FO%a^k|#OHy%wTJ;z0D
zxu=RR2b3Cz&dxN`y(hn3V}s(<SRv!sBxWm@?Q@q`yK``?ac0OZaXulW%^!HMMp)xZ
zp_I2w$HA{D_P=hVeihUHtoKBDKf9!pt=7j4M#o>R`k!9FI(vVG$64F!8|74ARJ>l8
zsvok-r6$wt<eDivb$$o@_th6!R{AM`L76KytTRaE$=`|oe3I@py{DrS_`K8Gu4%s!
zIWu#s+Hb31mX3<3OMR^K3{K4tydYt4y3Q_VgT}*C8mj~sZDp9Q^x)wS|DMUB_gppR
z?%7xDv~)?yqPYf2f>l#kKE0mp_m8hrf`NhU5#xL-*ZR7XC)aYcvhf7D?O7DgHL>pX
z?EQ1oa<@o?*r%{+_NM7xT(7f>srca1?xmu;Csj;5I>Rz&&f<It=3ud})o<_RU7MRJ
z{rJ~iHOJW(mUCOSA6J!jY1w&cuk}Q|RqOOcO~2?&4{87Lcm1``tzRltICJ?|mt-oW
z%?Q@LuF_iM$;o)|L)QGQ^S2f_-IlAle)Yuz))o~PK9~B^Lme_PUfy?g59y}$)r$VE
zIdkY$W{%{O^0W)t3Bg&H3vR7h_p!g&qfyqfc-g<#Gj(0f|6SSpu=--T|E9G|_Mdn9
zuqU`pQhNG^u!+C7Pu}5{#J6I<_M^6Vzb|(_oO)f?d%`Bz@7#aEWm#=%J+~(vzj{=J
z$>VIsiPgt8&S}@=xVov#xw2<x;S{yG$x+9*e}5QrrE+GtB-`KEZ&P;cG`hp8vron;
z^YH5D=IK!$#wP1OKKI_t6Ij0Q|0EWb{2-Z4SKnGxq^IwFeB^ce{)E<^m}z?!9Q$9i
z-<tpK_0tP@b@%eN-7lR`Qn5L{Hm_UfNA!nY-Agwnvd*3T|7As*n`8aI@;T1$6Lv{V
zD>%uU?|*RC#GL|fwlXUBe&IS%R=nx{;a%UeOrM0iJKpIO-JWvrsl8JNYvQ)s`c<NL
zaw1Ax&pe&4_`f=I^No$_TF0fMUqn6*dA)l76kmVYExl~EeWvvj`g$#8SM5E*@79={
z*VF#`&9xWXm>b<9y=-&uOsr8m`_c7`zgw?uW<=;D(Y{oMNq4Rsd*AZg<?5{8OS{FG
zXN0t^;tJL3v1XP(JJHX0|MguJALid+pY!zJMup|hW-pU&mY#OkY~FCnmE%_HyvQ02
z6_@DFhI=Nb<fnY&)p%gRRy*lif6Xt&X+kHGZk2FF6;2Pn%^qsLM60qrRi()0;-{%a
z&z{fy`0MiN(l;(wIZEW&wf7kA+r+$K$AYeB_8*y5JQZ`_T=HJ`dCE)0=ZlVg*f*ik
z^swV9mgXnLD}TpC?oIJYP_<wzNDN<?=x?=>>&8vR*ahugPq}w@%KzfLGyhE^lg*|H
zHJvvatzXPKxQp4By_xIM{X<9R9p}Hn%;VNHLFl<m<qoceZmt%JzxI7G$jrPrL+t+H
za3MP;jxPZhQ>I=#eVEs_vUS4UJucE(r!If7sbM#o$v2Jv*jt`m8!j<<$2OXJd{ALm
z;uHRSF}jUK+riK1`y$4`Tk)$ix9y77R1%!Ws=cap?JE9)uih*2`MUQ<Yf3IUroM51
z(b=>e>u!YYete#Peog)Lx?^+sO4t<7`HSg=UWzhs>=oZze&gk(eZOipc!Y|IDqDGV
z*-L0NEZHL%z4NP|<Wv4rzAHm)n*^N??VtVc@caIwS7dWsc?&)G)T<d5q$k;gSgf!J
z*2vd)jw%qcu~oW!LvNm}t8QCD_V@h5u0BcKu39rHIz)peh8cVR<1A!T_}*;cy0&U}
z>>BT1$2cb%v{|}H@$Ywh;IZdgcGJ6_N6Jig6&G1I%I`a+X&JUE<5F|w8HY*MGD7bQ
zD(CP79q+#Le@B6$(ymS4^LrL|-eZqQc;<Tb{FkT$m!@^9i5j-oPoHVmv0>H)=4Wi~
zyZZxvY>{sXyS&BqH)p8QiN}nIjgcWXT&_oSz8<_JSXcizSizbpL9@y=MXR^$#L;^n
z9?h^}R(^E-zuC_GE2<pYf!Y?|-xz0qe=I#a^ugN+meX#yO|EO>FSv8`*v^?-&DQ+?
z<-Pj!(&tgRj#(#zLfjAZ@B9_KA=G3~OdyMgvg~x`YV+P8W`!c1o!_7CD}3;FcSL?d
zrK~&SL3Kr5XQ}xTmw8`YKPh0jWi5Y{@JprXHTyzNd(E=S=P#4|8U9_vBUfL1QneR{
zR3Mw!)MWu2kG`@UFm#yvFDAMz<KVJ6^Lp#80{adf6)yBS8tA>zYiafGKi2l2!!%CS
zJoj<FW7>bbU;XXI(`iR47llPXyJ;cLmaoV<dFxTZ{{gmpT@HUd_2G_kTjQ4vy;hI6
z%I|$|+f!8kW~W<xYjwTsy61iWLgw&$TxROs(E4G*i+x#nAEuqP@eft!?=x_f`E|ua
zV(PY8nF|j3CCxm*qx5cWZ|<R~YI0fJU#6}|5qFX};@oUykfxmVv`^nPfAN*#R_3h{
z1(S{ky-h#&>|ATw%+7R=udz&PB<7u*roPid)&JXssj-4<6B({o)>>@6)ZDqi&|0hd
z&g(t%g%m%p%!>Xfs5$MNYFYIpze`V~Hkn9Uoxf1ge(>Pq-k-5vZ2V1<RqkR}uj$=A
zIc?jsBAdT`OG+~g&P7j|%d7ACrN%gU!3^f0uFd-V+IRdO|Ib-GEp*z0Wiy>FeEQt*
zq~P~t*9nuDN<%xB>eOUEy1wgj%X97DpAWr0R(|S4hd|ExAh|2^XU6IMy0?m5u%ub-
z*~}XDIpJy3PVTl+WMJUXVw`W|GGAA6^U6G<z}R0>M>hV<5Yzv>WmnMBH^IvG&*ii1
zQ=h-K2y-dgDetJWbal@4)INdEZPshwTi?hC|7vw-E9>nm`R5cSXly)o{zm7e-?xqV
zUPiR#AL}vr{ov9XSB9ABkACR#^6^jouMzz$@PU;u?}EAg%GQCkCev0e;+CEHMrDVm
z?Dzg4f${_2@4V2?H+^{I-xS{R#>sqp*LV~t%!uun9-N+W$5C%eg5n)3pH)#jVMQ<Y
z8Z;(nobQ|%@NcWJRp7b1AAT-)^FGLX2IuA}@z->|OqF(Vd%EW3PMJ;DSI#-IFGJ!N
z+v_IzkSn)sch#hPvbn`%%CuW8!{fn3UC%tN{^M74f2^9|rh6pj<Hj3`5?eR#-KM0W
zHSg{F$7MN5uN0@wp19VsW?j+MA4fE&p166s)8coP;6$z|fgI=e*iK$^PyWv2|7Y!N
z`2G|cJ6`&}SJ66Ak7;7l%@CJ8l2W~Yyyx%P#^o0s@4(!ztZG}pWW4w7cK6s>XB$-R
z+>CcO3$i`J7I$-YX2{%Y7Du0KJ*&HU7fZ#&q{WZV@4J6@{dYy487;f`v@K%tGQM}a
zv*z%ar5f0l#yvU8n^AQ9&bBnhGe=q;luO<b4d^OdvvcwDx*Cq;d67GL4V?w}O0r5n
zWISB^l(CgTWyXQ*IW-Hp-3#s~nkt^pi(dXB=u7pbAV%Se!<{FEeWzIq_a3sHyS4iC
z#@?gq4#97_7aJ?Da=UP2XIH=Xrys{6KYnBO`e<?bn?m-)U>Q!e1cQe@wu!nTykdK@
z6<>zjk<giZqghz{$C_7pcNZMZGTM0Ed-3dj-_`UQGU|5w?>f#LKkv%3z1>YLuTFez
z-`=5-Bb)mC$rhJmLe~4b@5Pi@v-La=y}G?r#(-0K%e9GV_a%#zL@s=MzjL+T$^0+9
z542xgZLPH0cKWQ`#;K)i7YcA}EuJKk^ZE88e*eA9bMHOvDY}vSL-@n0vY3b0#kd#+
zmZjLpoXEc>zNqo<<a7Vc9bB5fOnCF&xWshgYQ>p9a~~hyb~<+1@kY_iU8>65_omgc
zR`*O`xtDr_OZ(HkT>(8SpJkV9YdMgx_$YJZ`!o0M-z+-+jn&gydTyw~#@;Pr;iqj9
z-^|*&ETH>|T3LqeB2McEw`x-Citk==OndisionHkhbgx=aC6PSnf^9?VcLxl$31n`
zoJLb*Z=L0O^|UV5{P(Y*i3ga^zAF^;*yF3-|4!I0B(S{b_ASoKu9?4!&Sg(8$YoiR
zIZ03|ifdWOhV7@fU8qfx;<<2N`dNCx|Km%1OegGb`)ZL_`rzZ^ZnZGp{H+2yw-U<#
zmB^^>%F8xYjPCte{QCNVg`CfJR6af5e4$~g(5bEy+mH2bXtHoRu=(ZV_Hy-@H@y>G
zk1t_4xGJ(XX#@NHrMB{A4~;JvdVgcsxhzP#!0Ol&>&M6VSZ=<S^49UJkpHoE?f-oO
zzqbE<x>&wq@mt0}-yhxVzCZ2eozzRbPVOg}LOX-9HqBx4$$V>Qk#?9n`9|24=+!ST
zyXo>>+!yzB+KbDbcJ6ytX09yxwt%}NcGXjML5nsmk9FpswDTM?le5{kzFJmtZtwpf
z-eZNm4=%+V3_rGuasRLT|L4p;bLOI5(aJx&l+}5k743XfabD?#bJE|_S^aJWHth9@
zdrVHgIX1gqbE4~<_m;VbCOg_K+S(9*k-vD;Vy0>N=c2wm=$6iLUM0$Aw(SqYv#BoI
zHi%k%3J{;+d7*}LPJZzA-1p(4o9^FUYopN75~6gomUGqZ;`%*8j{csLygRde-_7b%
z$ST=B_kvmbX{JxPvyK!>NIsEK77*BB7_;b|{&fDuH@+>-Zp+<lteLm@$YhCE4^C!Z
zx*c+KQ`j-yBkW3wlirm)KEh?Ls=Au1-pS%i;_jP2BTQnG>h`t8ty-kD;Qb2cm1kKQ
z92S3MoT3xFj6>dO=Gq!j;YQJlQy0aoE*ljxeLclhV-@-NM)L%XmrFmssr7%~H~CWC
zp=I)iV~dyQr{A6%(cax*%75nUgnPI67;Gjlim3SZqE^*?XY{dKhC8m;on~9f`1M@n
zo-Z=$wFmYu=$$>O$5-pjHz|&AhyUAZ7cFOa{FaBux+t>u?e2_6ZFZXso%dRmtT~f@
zJLk@dbi+B3Mhjz`6@(Qer#7*(va8+KF1#zjX0x$lcAy&1E&2RCK?`<er)KTFRT0=^
z?KW*Wk6gmOzsoX>IBzvx7eA7|(QMsMsptchKclntmn8kJbIJbtV~*d#V_)2_9_)(E
zsboBDw~BcJqxu3q_8A<fgD!_Uv^MQGduc3ol~3jL8_maSIM%$n$7OrD_}K1}`A2q~
zUVU;e$8M3UWo?~lC4BXJH&plQ$#5+;p5>Lj<)+=uDUX7_AG`9Zo$>GSkK$E&*E?5;
zurq6YUgA)mepLR%7p1=0b()8d-jQ>DHo-Ye;Dp8Lxi2>5vN7Mw|F0bJcd|{+<x9t7
zy$vmV>>E$p{JWa+QfKPi8Tm?C4aQ|hmrc1D=N06$!0qI$fA`zoOu61TyJ5Tg(qlDp
z){AscRX=RMbTVL>YS&Q%cFi~Xu8TGqJ~aN4Wx4ORcv<VO)j{$HWpbZ{U&wGXeLrQk
z_g{(s)q4t#XIm}58d?&5ccH!0_cQNQ<n8{x;lEz@U9QvIZ->To@pb$wK1y7^8me71
z_Z1JTjG8fL{vv^{v+QiC%Ocfo*u@-}TEA_j-=DLxF`uVx+t;sO=Chk6RP2ZPQRQZx
z7gs;eR+wZ}9KQYH(}T8$E=TZobudL<Yf!sco-0(7ziOwH+pZQ)f6>hn39H#2T&&Wr
zN~}%l-QeDR_RzfN-&HE2SYvu_N3Z`TFJ|s6UBDLkcC%f<tjm>_3=9J29cSB{_$<o)
zFBbdYgUzqM3wSSWpXo5!aNTCUEp_*`cMC0<prf1mcve6}r*PZ<$#u6b-(yJGWDu}(
z#*M2RwmrSQ|9biAIK$A%9;XvR`@RL}T66LDyiz-p(Wqh(<MCs^?BO|6zF#QgH{UMC
zJ1wIo`}~z%YT191&&^W!Ji(3Wg8jKmpFh3+rL@iWY}2{R6OOiUo8G8+z`bGBrBuf=
z!CN;RnE#;Wee0*G4uA8?^$Sw&pO}^Fxj9n#Sk>cdzHH<5i+?@q-`UisBViDiQ72n3
zANs)N;fCfM(=+=Nh2-tuDobuvKE2@H#rlWhAC8>Ubv)3*P_<I$Z*Je}ReoxPM-^tR
zNU+l^DJ_1er!w34{)H|1aS_cm;X5BQZdnt3e*Yg26SZYcQ#uYQ7pTb3Y~A&KQPuzZ
zn(kXm*4a1y^<Mg;d4a>%gM2S?9D=&OR0JR0ac*<tsWyiXX`u>w!S*|oPc?S<eSCP9
z{avC4XHon1ZEJ<6dp>Dn-}j*E$8uG7CBFU7@+Wr(AD?KN^>|gv#gi7>7df|Ro?AEj
zO7iO8WmCSi|LO3t^*R37Cg%m)T$zsaK23Iw+cVEI%-M9Y@p>H#=j4Zfq+hyvEif=V
z-8pLtm$XmGrIp>+w>z8PUy|<;WU70#=4ir%okuJVDRncg+N~_A!tKA<@afy@)oTTF
z{LgA^ye9McSi_;h75OQJzZ7MHpIsH6*L?p+n#`BZ9_2j;W?yTL5<c|t>;)Fp6FGgG
z_vP{{#|l?p6H{8365#R5ocrsoRhAo)1y_A3U9<Bd+nm6J#O}X6J};(m6uA3uGJmmg
zI;TSP<~wHdR!XqeY@XcGBj@{`UA1&_Sy)zK+@-!5zI#0QzNB9N%JQd2>bjC7Q^0;7
zyXqUA7w63@>-Vybm+cD=w%PZ!voz<Wg~gwDVV`sU9??E;+`cR@gw@|++S?~xHd7nV
z+=;Rg368Fxu_i9rvhTae!YjKwds!CFU#DQR^0sTetwNha+>E1DcT}VsQavRjTs{^4
zekXWt(N$CSUvnk|gvGlS&I*x@FWDY{E}kt#W69dgyj|BeWb@qN{$M-tfboTOZL4SK
zElOQ>&)avZ*lUZ;;gU}mbqgA8TlCqXr(U@KgXRU%Sw|nsoPYA=k={JR{!-1u3x1jv
z{?z*OfwQM~6Gvmh_r2fq8{D?+jJnBLbGyoB>o0+ez286a#e43|D?J=$l_;vX$g!up
za7hDm(|w+Is{C=^wH21^2wfk*{<({Pa&IETJoCA;UduLYUjOxq>AABd8&?}xYi(FE
zS?`CkSekC5iQdn?_Ky!|t8wpDRW>)>x{WDWhb!c5#WxH6z^SV299<>Jf|*B@mEzTS
z7`A;C?VDz<7Bq?XeO>vSN$0E|oLU`Gu`lA_#fjxXPV(=k)*DSK*?w|&+Q*6O^=2ls
z7MF^hxV0x+M%mY&=a~Qb|8`%p4qfg%x9{MByDY1&ac^e-@zvW#wk%O?lKt^-XM9Q)
znDl=RNm;}8{K!n^2j@<nc(FR9tF`#G*l!~b&ihAVH7X`Od~<7e$dB5upF=9_KdEgw
zrsCV0Y+iTwWMo~&nv{-fddvLXO%jryUQV{`y0lp^d_kS}(}wIV@yeBx&u!hlZSOUC
z-sTeu=aqLHxp^!hH0r>lsWJ)Q=6s11h|9nJqV86DdCRH98sYzc)-QVL9B$09$YAO&
zO_fcrimS^TSOWh#X!0AX8VP(h*SDFvzN_@^EY=ele)1Pr>&sXa&5(QYJaQxJmLRRI
zUrv`4EoDA@pQB@PhCAzAt`C2ET*J7To?FEge*W@b`{_)hzNadtL2Ikt37(8LxjlE!
zJ(m*YF3qH^mFW|@+7rwyW^f%TjT5Wg_(w%-{c@J=hf`U^mAOin%bt+*Kb0ctdHBf7
zHBlkk3nq)FXSW;+cgkx#mp667l?4m0Ui&>MT|;^8`g<Q2c+}i*Sap5P>vb2c>{D_p
z8ve2z+8+DIi+e$_sr>q+3q=}w9>=EDZ;>s{;b#>xPup6qx_9G>6C8XWCdcmYzIpUk
z_OJbSFO{q*NRM5+n(NpGpEdidAEa?hb6+}c;ZqRSap1|$&sWa9eAX|$bA4&WBQ-s1
zU;g69E#`N;9^L!9Jv{Vt(B4V<*6!bzRK+jh<+}2!+|lrNfykMgQ<X}&9kkzyPUe4h
z=(BpqejOv}eLU^|WSbhdUX3#G*!B3?TJ!FcGr4cf|L^M{d4BWiqhj1r->iJxPc0JW
z%r@Tm-e<XB{+<7Q?AgVEN`=yYduDX9KHz1%7p=oH=gfxZ2QS5$Jo8`3aDU~uM@F-{
zb-Zc>%nm0hyfMgkE!}f5(6Q2@SNmW~M9%xbXC14J?`;r!*LS#CIax~c?X#Fq^H-SF
z_UzN_Qc{-)@XPDD|7li1>cuq{w~qaLx6o7JFSGbchZ8TAZZKR8KladczcE)zuV_g2
zW$%g~NzeP<JTrgxa>rSble5?KEf>1*PvL>e>y%m1S>I$M&$AyFsw_@=nvks{IETxW
z;e5*NPYyN8epB0>9A5~`c9uWS|LDivt;uyuQ!cI1UsC?)pR%;q5lMr2?;k!1WiSrg
zs~I8GAi48%o!W~}jODVsPX0T{-@j^lljyGI>4!gT*>G*=z32KreUw&vH7?o}oOWwR
z+zj4?-s}4}-D&!rc{i-&flc21?>T`lgtco={de7Qhm9{S-m0j`@b~YM!?ikkQS$p|
z>-z19m*_Y;O|x3&SZDRu%l9{{?`W%6Z(q;hvsUU&$RD1>2r0XN%Nf6XJm{7du9I?)
zb$f!8v%~XL)~_v>7}g6cNxY$T?`Fj0`G1$k9{v`3xH0OlRl(GC+~RA`U+BAZQb&Am
z+qT#;xB2T%JWk#bl{UxuUw&iTZHrZ}9R7TIWwd(V&WPP?Hodb$RyVIb(;Jzu@$T!N
ztXn}F*LWQZid=f~{>^MwBlT>T$4XX5AMfpBfBNxM`MZ*R%j8Zlp7{E-_BH<up<O3?
z3$MTQbA7cr{`HOCmDir+3H=Fs*m6juye{f@O~RU3oh8TrSbSX68`kVAwPn%c)#opk
zy_1{kb;MpG(7X4>oPa;JYlHn&bOR>(ZcskWobdVa#z|gMy_{PdQru6O-JiO)WbzK(
z6>_WhY6ipwf2=-w{cu7&r?~ZBHMO}~H-0oT7*`95h>9(ryUm!#V8aZ#z@Kqno7MTB
zRlJsNG|OGvx9q&E&+PUuKhqW#uyA(>q!k(p@?X{GesN;+-0EWP<r?$!?YHa?e(*A-
zh-K=GOWb=uP1m)3)yc8qRg&?>$Zh$@<O0@m=$FPx_Gu@`Jbsq^lHuuQrkjeDZvS>=
z$^T0V7hcJF>gYM%_PEVL>C3z?2`cMv(TL1#y?L5*yJz`2fpyzwHcK0Fo^aFs6gIm|
zxO@G4jXM`EWVaeBU(AiRsolP$@$uufj*Y+XIzLf(%X>|_cJhn&tM_l(yi`s1i1wDr
z-TyWo*Q=KbDm<<|_4(8j#+~X)NA`7YTd6W}Zt(k>3HNpHz3=~V*4pu;yMXv_{ovS;
zi{}+~MPAo)+i}9+V}X>Sb5K)#n}%aiLci<UKUsU?UJ13d6}>W9Znj7FdBMe?&_(l&
zGFNjNM3iJ5Wqq;u<h)zUjAb}q)TWAvDZB{!^HwIK*GlP|;)Boj`zzHWJU9>THgsiw
z&!fCbYn$O4E?;AHrHLO`h*h1x%yRLvP}Gi?5NU<K($Y0e+J8OISFFuzkC7>}JXqB7
zb>*Y}K*gk87ZWNM?3dhgzs7m>7uDhe^Y?#wu6bom)>DpvvuE;5l><C)S+92tGM4D9
zF?@UMu#L;Qjr)S1PkLZ&{hDo$QaYoK^!yic`we-%{#a)CXliL_6i48KxeZ4?h`!qO
zw^Dq^3da>{(R;W3?RVpxA7*?_XwfT<X36KPW1dVcFaLP#h*_2UBNpkHpi64!?rD|k
z7g!!#z_5AO**NL>X9}-xpR%%k+r?)BMNL}W?m{0{p4Jh++%j8!qREy=B{T0w-(Rct
zknP*j4E+xiy{<33+RO6d&LdmJqxom=?XkA$4r0~(rk%OIp)=m;;t|<SS7-69dl`<{
zD_Kw6sois0Y|7^P*Y4t7_n)%r2A_X@ha<e|;$+$VSxr~IGv8mK`X!Z@v2?$(Ub@sS
ziJdtb3-Xrt&yJ3cxy&7ZT7y+3U42i_tI4V}RCw>&?VKMzZ$HcLja%Kig-)u>nwXUJ
z^2GGqOUBCuUN5+`?(4LA`JXn<jQd4Ce(|`xvU1fmCZn_4j~rc+%hq@PlgmUlnWaVN
zr|*6G&;8laO$+B;vvPgPv*Dg(!LH~x`+1#ogd+Z(UwzEXaE@o@62-%Ng4(xBNt$mj
ziZhE9RL%96SoF^>yT0vEg3qi8?>6cPHkhu`{mo+ed8y2XdoSa@KhduFnv^kZK12Bi
z{WlqPRkf2=J;}7Ty{}~u?=|@(-#pe^e)~li&V6R2pt=9;;cpHqdJn^9&RzI^r?1|5
z=a+w$s{|iauMAEW%fIP=>#)+lGIrieFG|f^A6DHi(CkQT?eJ4qdAD`_gg^KHvs!so
zXH1yZ(h;=A@9IsV{x(0krDx^4Kc4#{C{kWh{BhOm|J}Y*64WZ)kFPqf92vT&Q$FR_
zDcdTA%bh|er$%%8uI~$UUHNqh|7*4L`O~-FtcZ_gS>+MEB;lD~_06PoJ4u(KBg{21
zQv~;)aTWeJdCtGpzT0!&B*y7D#`Y$3C+t12{MH%UhXJSc&%gSymR;+A&y*)=t@BNe
zEbi0IHrmq5SAEwlVb<kCYZv6dI1s?UlhrYNTi$A>eQdevA310Jln-$;P@9*)T_e3`
z%C4{Fmv3-C&EVL(B8Fw}>Y&~uMQ@jFEopdYrp~GICAqWc`r_XY{ZkX-o}CRZVQe)`
zpZ#m`Zu9P4Wm%kUVynIfuvARiXTDO#EHiwy*pj<lSMIfXaqnA@F1)nBP3YRq_HXn5
zCtfp5dmvP0(lFa-q5DcJS=Vr8zs=r?=bq)f+iABjB)9H){d18s?LD_e*Y9e)vGn-c
zjS3ZeG>=u>|L(7m(tmL8w7i{3>Hh;tPHfHKds24eUH651i+99#mL6TVDs^}Iqr6qO
z<~*NU?(eUeE^pxF!24p?`<tOm+GX9Z_Dec2Jr<s=kQlaP$^FFSO2$3EeC%DOW!^X+
z;xtn%RjTF3s=qrw$p1HQEnoOMx_g7z5+U<9%Vtdde)oaDQgZgA-v=M6)nA{r!#q$t
zHEn6l>P3^Qzd3J>yzqXG%(oYJFTP(Zu6}U){Jz7>mQ`CD`)G%i7D}y(zusCQJwt*q
zFw0-gt5UM&%EdI-x1TLN4P4Jnn>B%F%b~3auQrsgjGEFF`tqQ?t?Hxps_JO-tIr=C
z6Doh^%33ME?P|WWO5n51o!zWAwQsU|m##d0MkUllXD3&B<>4!OZqC(<r~E9R>^D8@
zQCRPbQ?_5(GPrhFZ|Q9R<2f(8$6v^1O6kG?PPbK$B^tN!D4p<r{N?h2W!0Q=*DXs0
zXS4Q;+FdM}x8ljmM^10Ei)|*hI!=&L&r8`k^N6!=j#Z&{_V!!9P5AFIXHEF%7MB^4
ze7|k_U;c(W|Nb+cowe(vK~1NcaMZIcp8bI{&%gdJtjV#XVfmX2y7BuqJZ5VR-<VJt
zyD<8)>zAjC3sz2>8TpU*Q|uwTlssKmw)Ai7!@`$w@~2zotl^!@wf9Zrft-^wN?kYc
z|2qD=Soq`QzOTX_Wn0P{8MBT!T(u42?z_MDNYv5#hu?0_5EL^~{*$vwdZTpb6koyb
zcDCl8OqSw#exJ%TmVb3ola$>Vba}d0Rk*Fs^EbZxq%O|>=JMX&XzRDnld|s5Y6_jW
zeN*kV+=ic*quk}MDC*^NM1Gwlofo(A^5hE1+alI8Ki<>G-tU$cedy&I>re7(CQ9j*
z8;)!6EM2bc|A2vkqnmMloNGPn@-6MM?DBK9?H<Nt3C!eoU#1y$>sno$(yCHrrBCnq
z-riMmTrb1>tj50iTl0;ePs_aL?`SnI@#VaA`+Ar{y>enk-&c`k_FSD4Z!uanH@|J0
zdsx;a&G^<#hIwZ<|Epc7WF;AMUqi-0HCDZ-zQlCmxsGQS&Yg&klkYxz{tLr}f1ML-
zJpax-bH8SeOK5hbopsvGV`cB})O3q_cO{+im{%<L`)x<Ic3807%NgJFCX{JcuW<k9
z+>u|I)%ETX%R8}Y!5sHF*GX6RWt0}36Wi1$p||*`$dwt!_9s6+*tUDM2t!GbmgJlc
z!|FD_w!9YJtA4MgWTvIm_<XjTeI-ctQm+`ZSm)&pZ+CQD>O4Kiz&fnd?{`mH{b?7)
zVvlJezM5>6ufNo!9S>N}%U|SRKgWUd(Jvprv$uMiU60N!_dnabZkr-=B>UrCI}ZNe
zrc&DR<q`WXk%tmd`8QMSXRX$iU(#@$$5gmXZ{?hts3ZT}SFJq3Uq4^>nbzc21;u|q
z?Q{DW!(BIL!eKs>`yBtPW{X@@DtDfEGxHn!b*Hm37nZ14O=nO%c>9y;irj!#Pp<}>
z=A2)7+HYl_&}ZYPdEZvsdo-O{qL#4gHs}3&n=BXYdvpA#q;>0>ZA+#I=AH>Su+G`6
z<y2<Imu@$+hZ1kUuk-tLN=47BDofK+e|D42>@RMoKTmX+DUqSNFt{{O^zl(14Uze=
z?;nNbY-&zC^!V5&=Er6a9pBzu`DTKz+2>6uQ)cq*p7$XwP0sxCZuy8gJEq3+zp^el
zuF7ro(yL}6!@DJCYSNNt8x%j{(Nz0Yp6T@Nz~UWK&QE_}zjnpD&Rz0hKgt7j*qu)&
zi)l0N{eL_=Suwe<DALwHeoh9blHRkZcLK|f9&fO*(nx<lFDNOp)`H>RJI3!mG7d=w
z+C^u04>bkO3r+cQFGldr^LG>GKbd#q&h6mTs_U;i)?Z#x$X&LJK_#YoK?X-Y^P}qI
zE!BGs4y(nu?G^64?Dzf71mD)94i-~1zs1IKeAq3Oeouab)THHgHxu8*RtYKD=-hI?
zy`$jQ7QJ(x*=O#kwK}D)R-1jVMPl_rwWYIEx0f9_Tz1No^MlHny&t#v&vwvp+P0KO
zEO^nsBU#gxoFlGk&AdP3L;^qii4eiBzpLimzS|$D6X9UmnH_ny+D7zk$A$Pg_a<`b
zt?xe=XO>m4;jo2Ji|U`mIg_5QHPG)<k@#?$^-Dl~x7*s}tm>vcc|~zslK2)Wa4qwQ
zSg*NmYM`SG^R<pH$*G2ytdkNVK3kbi*HtR#S*v!`Pvds<lZ_f-bIx$Gi8$@au-V=l
zHLtGpa+UVolQK=6dt!J@zuf-$eS*#3Iq_9@$}@NFNt$`)yO!62nZ|x>>3RH2%#-wA
z&VF4Lo;Lj#+pbyPZ4NNRZ(DnO!{;q_k;YbY+_rqY^|!?=d_&2!t>?nO+PKZE@V%s=
zmuTrxso3SAr8R%f5x;9)3tW8VgyW>YE-AY3Pgyta)>Y<{ueA7>-_2a1A*95+Qfk-P
z?(V0JZ`3z380~#Or?jxG^Xa^MHRsi*H@yGi-gN3VLyhZl?k5Kxa^&S+me@B>L+G<1
z$F=`GQ!3x4g<Wju3%KFw?`6<B$@ZIf^7kAO_UBSj@1`<@c{HhhJT$dENbtsyyBF)H
z@bsVFQ_E>~*jvkdq3-&ir|N%q@)j0H%o1C;|C_|*F!2o{YhK*8Wwf5QVP7t*xig1%
znc%_5*-Fb}68%fgi{IU5z2oxEqQ=8IM$L8_2ZOH9*z)j`hK@W_doAz(iF$Xlb5?Hr
z^!c{PZrOyZJ%4{nuMLX&t9u|O@z#vAN~Xx`iDy1vo$u%ntnTq~!ja!|cL~o@-?{no
zpV_nKdsp2E+Ol)fw`Qig1$&?B7@Gf+@Vh&4ir3st!i(+a?9gr#Fqbye5>&ly*e)1n
z-sS$gCpqJY!8twNEsVDfn7PZnmr8C8{D0$+!ZT%sF!j^tUR*C*wLCiSAa|Nie@n#6
zTZ!sFWoG3c&(_b?E}k2+ySYtx>!r(!kAK>}z1=RRk!gmjDbtCG`;z9@@7-|u=IQrq
zJe20%n8@^M+kNeRgQ?%wr(_)FbzgPo#{5|yHO0B^%!+55sQXl4^IV1ayk>!>6ZP_n
zuRqQ9lr~>=HgLUT#c{4z2VFF_Gw?OWHsqAF$}UNM%6%zl*PqR4`%iSg|M(%(Jek|(
z@Uf!(^%tMyeeLzqSUu<Sw_Q3$aYZs;7fikt@nFNjfW)-&W9ve*SH<<7bP@Z#Zr!1f
z)Sz$enj508#Hr>S2ztljsLic<>)`Ll9<`E|90qri+B@C4LpoO+jJy7SPQa0`6Sv9k
z{e6$WzC7W={vGmO8xQj;JngmQU%Qg|@#*fUw_MN6(+jt=GM^0Kz0UjF??VEcG0!~h
zx2wN;`_%|vd4BlBn`aKrtREh9F16m}B0c@f_en`#O6>!SSKXg~j=|=*k~i-S8;7Eu
zwRT62p1e}a{qsme(yZ{CToy6hG6E?ZueNOxlSzG75_!7n$6KGo|0!E0EANWvd#-#y
zJUX{3)yg)Cbx-;0BO5f1oG<^^Ip-&j!)NxUA8(px7bQy{@Y;VM*y-0o7ZXpbA5#)4
zyX$U+XzzUBkr$-EaX)i!<cXYJZ%fMMCD*bE&CJR=*kPq`QIq9#i(vIS*7UM(HJ7+J
zD*Vh|PCV?hK)goXc%r|}xB68oah0EJPBR&(*a&a_YSAN<_B2LfHY4Ak^N**T+-uCM
zZNVvhG*QL1?StHu;s-C9qeE4<{n{^JY+Ai6Wnt`BuCU(JtK}-w1vhJQv&<>8IR3rC
zY4X!Lot1TSe4f@Ex10QGiSU#Qd4?`>%Vp(y(*;y=CWRbk<~3XMi*K4oy>wdmS~mM=
zSNkbqpPY7I7QbTj$uEQN+Rba}@@+ZO7k6y_S<tVx+E$>#l<n=N6L<CP;--1APf|!#
z=v=#}_lb3X*)az;EeoZSW;?fwi?=<PXv>wffPrDYQffyNgZ+mV)6)9JCwqhaMY?yh
zU%SgN>GG>%&i}Q)Z=5v$M3bA=<%~HigKTF?ELDA*U)r_bGhk)b&5BITQg&}qrOMkY
zRkW?P|9G~=Ye(gTQ!bi$RVEjcij`SP^-fzHSz`anV!FrmH9ua2I`f_C{M5wFJb&)V
znVqc#3PsuM9?JQTk5;@k`gGHVxmkbj!?yFsUKFl~?LU%usL=G>oxdV`CoJ8kI(x%D
z)2bNfwOiymrB`eSk-X;j@yzqwvm$4`HJslF=Pq5j>fY7|Y@e<F?UjtMm6+aJdM+lE
z)qe8V<|W^coHUtqW|Medt=vQZ)#3Xmyi0C5q58O8*M0tsvxaW$N&36O9<=;yToAWs
zlQq}F&Fj3Px)03UKG)`nNJ(hS=e67A=S<dNzNw%g`ZeW<M#JHWh3Aa4+x9#E-so1I
zf9Tdh-`zKqwe}T0`}|_(r*F#`D=)76T5n!5uUc#Ix?@-SYM)%_?|ioO${n9P4xwF_
z&e-f-CE_cvdRB|k+!JX>cV2#;G<B1WKzG&Gk4vxUYMMTJqNQ+pAuG@7X2<XM%vA#4
zSazl5_jb+il06%hKIiXYKgRVxe~DZ^w==Ls>2YFb@jCt((Wo8UZsg9{^!t0n_vbv{
zH|O5CbhPmy>m9boB|Oj1WjB>-oDXT-X0>2B@AtIT<sZy<A2}ay@^-am++VH}>H%9h
zpD6Y$RXCeGu|F*9m64P2w>WbFOW8V+#YYc>ugze)S+(@EA@4lj{B>L#kCi;jR66-<
zjh*|=I71J)um9h1Y?~JL<+ZF3x2LYx%LD8QERynd|5`S9t(QJ-a`g^(Txxv6-K=nx
zIK>&IiyEcl7cH``WVPbkd9>r*-8#jF)%8j?>n6%+sXTo4@RipWrrhGmPhGEv7!+i!
znP_^}R`sKcW=8TsF_v?w{o*UWO?bIMbc0!c#-D0a#|l^REaSeEeTtKoL{H}DlKv?8
zk2&O(L46Sa!4yrN<@aYLeDSU=T_U{a)t=RrM_4Xzf6XTHSGCUe^viYU`wDWe+ppho
zVY6cdKi4*vdyhA5IGJlYNwDv-_so+ruZ4g4ztl_ruCOJ+W5yNry4zQF@+^AoY#<`A
zVB3nw#C4U+yqo%tUZ2EqYp%1x$HKjvgsPeLRxR4$F=1Z%H-lyJ>_1E_67PQRng3-b
zbN#EtiJWm-aj(5sxaLf{(a9+463NpQA+CSQAbiF`mX-Wb9(>oFLe0*<kev|7#LIe1
z>m;9!#i@U*<!&47`CC|YuQ^}k@t38o498o4g&3q9{#9HseUew=8L7i_SWoYIu&Bg4
z)W}1B%cYrh)$-qOu4}0XteCbia9ZV2=@TE<`s+GypA-Dlq~>*1U1fX4*5@0p?R_}=
zeBImt&bGBN1(y}>GcwGKdv3jZ_l&?#+huz0^C|tBzVCkoYmgbMq=tjl2RGfPd;)dO
z37t##JXu({I-@hm-KSvXO15d=e>@O4G4)aQ=WAz|T-tV__|oysAEjk=*&d&7vYG$-
ztcTu;8I{QwYPtFk>v9Xc30qW@kk2*ynz-hwEUEj^2aL`fvUkbfd~D|~w|*t})o%no
zW;yOP{-Yy$<Z^bhc;S)1CcHs@pXZgIzvsz+N7MYALH7DL7b;65oA)f5Z1vOp->Ef+
zA8miUR<h7x>icdnWv5AzL2IM<J5^@gyrWYsBI%~GWHoo=yV@grj}~wHcf5Vt4^flr
zk^y^jt(jR?$q9$9vTo{oJ-h1XWRC^M@8s)$?eT22`*SszN4Wp1z+|t^L-E#}cMTVX
zxF0K6(X*wkOZUgePeDObo9nzBY7cJH{aF3!f^qMG&DmAU9PN3N{lB*^k=)OFO6ywi
zm)DiSDaTAUsB>LzOLGkWuiRhZUCg(Q<6PxUKQD(yg=eQ7Lb9Ifv+3UGUg~wLGCCu4
z-{D)^u5Z42@zAxOW@eRd!)9|GKK}KVkdxHHWyTvaRIacrnppA6DI@Edj<SiK@5iP4
zrZ%cu=N`K~cj*(iDGMK_NrziLQ(B_e_}+A;VbS6k4w*-#8zdYTIQZ<#?0ZnjJWu&3
z?}Pe>?~d5cogc&dkh`?E<li-g%>uK}c+}jtcIUo#Ddj@a(e8pH4Q>3T|1%#Orfgix
zF?Z2~zJ&Rq`$Z1ebHA>$KDqz=iuVpuKI<<|bxN{5>?#;|P^u!c+VtqAERjw8VZkf*
zJ(gSEu_Pqg^O#FbU-XPkwl*JZzvg~FRL=bTqgpk)gL)p{%)|0xWxc$s^Gx2qV4Ysa
z{yJS~MOjP3{^X}l7SopZ3eGIac5VFoxYnI9YIdDo%ez(bHzI$2dgpVDFVWkq$ISk%
z)BT4>yzig;d)IeHxait?YsvKfIO&z89_J;G&-#=5*O1e7!z=bnW&hY8Mscv;dtr3A
zAxiJj5j$b0wTl{MR(GhCm0W&&rM~1*)uy_izi+HQx4xnOws(DB)Ppj`GDD8i6^r!s
zd4l>^?Yya#cI8c{v(@vB)f`OE4tnvXte)OoHaVolTlL{*Bi+Quq8k{?t*oX`>awVp
z*(<d=<EQBr9;GJdtpZ8xy){4MEek$sA5+@M!7e7=dgD=huE;mj?dL8$pU=1^Qp3CM
zkE(uw?a92Sha6oGx=r;AaQ-`wi9dhCOqcU1uL>kHDt!gN3a#?ok-I5Sz2N&ZcR`;2
z7J>H^YC|u7bU3%Gd+{r&Cp+stP5&z|(`PhQ;3v1y(fIPRlOac+OwK<m_xRs#OOIQw
z%zDd0{?+|=U%AeDH=_mXrKmE?tSg)wYeP%^R;oKSS6@1_xx2>tqlenxUgJJ~k6kg&
zXHVz7NYyROT=ZcnSG4tOlMS4r9t+mYc@Q*XcA>VQZq}T6KaKxyteEz6&DYa<sm+Iv
zJ@FTp3cs7^Vy32~8GZ6^QSX(PH}=oC`@_cDO-+QEmGzuo+0jnRMMW7BHwvB|)#trg
z@%7)tisWWXslD4j{QeNcz9^=YGnYTksmkO;To})}V(!obi(?~oA~%=c-m{bKEX(7g
z-4`31wk9%7wGGq$-LNhC<*ArgZ4OOmZ5VE?c@TW#!;XU+R87~5zR^-xc9p9?`Xk56
ziuwaLdl%lwzIe~a=7G>^^S!F+g00JCFC4$yS0guHO1e8Z+)mcw;Nb@OBYkGwQ!cvf
zQ@!!hzhNb(+KWx!Lnh8Ga$3o_eA>>|_Qv~$GFhTR{U);?Pf7gPBrotettI@`bq2%a
z9WNKFrky;UxUy}x@lU(1NdiW*U3C6bPf)*KDR9ha_VG)){w(Dy*rdB>nU?+g(=K#X
zSHEt@*6{6VcFe)LnL7;PuU~(1e^FEC<E1XLPK<0)yCafySy^>G3$nM|+3gwg=Jnls
zhpaz)CT(Hd;r+q=<R3=SZ5$V`-^kxvwTI>VHdXI5)hFo}O<T4-^V!1J&=+~+yYEjg
z-Y0FxmLJ@w>D_wbh4PxDUu?;D+w`t2U3uVh|6kjO_q@0xJiZ5M%fDOkyHozv{@S-2
ze&;8?=zp-aB-`kW*WLrqZd`e@)ZT<6JtJjS?DH?#nc3a(rD?pp&-a$TT`Hq}^_^gE
zE0?VLF6A3J;i|S?P0Pg?L*nk%Z{8`pq_r$QHZ=Y3<*wpy5#FEY?MgBzKB6O%d?xq6
zzE$E1|G3_!{CuLwUF`CU|5m{P?aHk@m46!xpKV+s<@tJBs~<0uN446M7b|9ThD*nq
zK5krLS0mEhv^h=8G<KGq|E9j4!&YlHNIaP)nfUXyV4!Q6a)D`Nh+Vb8*^tdiuY-i{
zNxaRAea-u0Uv}fuZ43W8{;5k;>g8~FAU{uI=9>L$<K~|WZJ#5>n>_jC#=9X3Q<DR9
zTW=R1s}u~scG=x?{l=`~SqdB83e<@{;AA>o-t{}O$tBmr$KcHbx!favG#owt+yCHA
zu`^tdGH-`jbdb@rMK=l=Sr(UUpR;k@UZ>(2rZ<^_ZI{hCJfqUYNU_B4?a}pCVq0u?
zZ(R5D$3<V|>eOxLk3OsE3o13qpK_R4`RIpu;UmT@kCHa$7NzLTeb-l&9I$Wi@dMwT
z-Znqk+YvrH@otUbZM`jf^EUo+{H3_u)&14ZYxm~F9xnQ{|M~2b*4_E`3v>OaE#0x*
z^O4sro9jio3(Y>rEStx_B{7NnvEtq|D`PFG(z!vec*Kh|kEVKuPY9QFIe)wB!KYlG
z$47Qs&#C_<y}(@}vf-beY0KN~|34nSlzngR()1Vi%vO~f6dw}_Eq{^6IW0KvN=-DY
zyLjinXFhubSFY+l72LUfP94K9yJWumrW?9%?hflY?Iq&A>O-D=z$R7k-5M8PI{$s)
z{PwX(SJl)G;b+UYzMh!;R<M3=oa@K0|4vnQ|C@Z+D>nYA*l(+rr>_!he&?<_S@&1O
z?VIb1hxbE@qBX_dt>a93Y#b3FQIm7=O`pg%%cGC^7+TJ+-e0}basQOxn?GySnd-0{
zG!$!@8mL!za#GPW>+t=X>$T=cy^PG6>g?Ei{GORZ$K7e_Yedi6|9h>L>e+sB`MmAh
zxQ`Ya=LB_${^Q%_rng|`Cczg>*EJWs_lyfxUB?z`E6>;WPip3bePIjO9ymn4*x9A9
z;XA9Wb9?r@%e(u7`Hy68RGgo*(6xM?!V&#Xmu?-~zKd&noz7>!ClN~zt+>f>SgLYL
zx?T0`-@EQAbiH{s^LO%1m-l;bn$L>dn7Gc%yv5+dzOyHVto2z0i!QF3<j+2ZH>+v$
z4Hm-<|5x@JZ|LXQ@zQYvN6iU_=osIdZJGQ_e$U&jptSh+k&_9N;%;TDU!M8%f|ADZ
zFG_2!=@!gr{TlVJ_9eSBi<Kq!WU(W4H5$S>`<pa_R)2rhpu8pI^@9`guersREh$_z
zKU}TYaD(>gN|(kp!oGhzjXxCJDU1`D<tVb@VTR?tvrA@Nc$^XR`_yuU(8vtm|JHMo
z_xMz4Jm1P`vL|;<&Nfle)g9Si`lITlzZxC9oj74e-2b&#uh0Cd_uqfZ!R4pRSQuyc
zmMpq{`rM8Os^2ePXR5qka(m{j1h=ZYVFxeSCnvt=(zs)9fB$FT+I78sjy+O+&kygE
zI;!xaNB`?WhI^+<J5PO7xuJRQb@=X|B|3d-%J%vtq4nzRMWqGvBG*lyT7513m9|%+
zMa_v5$p;UdDZj8;De(RByIa>R+`!~gsL1H%xa$(@*GB1Smz`I5f06IL_Ujqr24R_{
zaV6#Qi(eeLC|LEfP<s3K7p$u^Uaj7JNbccmj$5n02kUpM|7zx%{kQ+zjTEJn!d<fF
zZF`HO*GpvFOenTH&y=)b!+Uq>i?;VKyKa2V{>klDYJvT$hzoVCix&vh*xs1YSfn*!
zQ~K%B-EqltpX~l9d}GDg7Ad>B2QSYC<u&9y*qtwXt*dG0cdOcau30bNzT|q~c5+c<
z%DIXO>-wf|V4hfiPt_vx;5NT-jg+qrOyTeSr#whr5qM!TuW6_kU(ZX^_dgEaoxlI`
z@r{?mojoj{i;EoS;N>f4xUl-Cx%irQdyJPWMIX7oF)W*Za#fP}rc#S%?y|>L$i_zS
zOV7SL{eau*g&&&|Hg;Jvv()fNH=kX<^_%;pMTb8BQ!7r?4)s-7HzoS+^|IvT=+Zy0
zg^u5!q-b_IVaBPx{|f&zGKDKt#Ika(2VS`Q>+mhB;CsChE1%knlo{WfbXKuS^kb^u
zb04P{mtH+@Z1R*}Rkh&z^#cZV$`^m_e(LS--|zNGM0uCe*`s%qqK$vanqNv_^<e0c
zzVObjO1|-Fp8p?bm7R4hpL3s1lVdTPWN_YP`zPfOuYVnKT=+{-OndI4$ga%hx^$B%
zaT~d7Cw!7?HOqYW^Wt5Ru(R!=o9CTO%T!#y{iDme1DcsPA4?u^c_G6dP;zncmC4c*
zKlLs-^NEo+Xy%F25Bk<#zxMd)%Q<mt!~f2!4&zlbIUg3g^<>XG#rX>zPBeK>G)~g0
zNM?<lD4lvkE4Spsf8KL*j?ZYiEIXG=+~N>(-_^$w%!d6!&RHh~yVX2nPsSvgU)=0f
zS>U+HG=O)C(fs`%w%rZ7F8Td`mR-cb!@o|=K2sT18pFIxs#ft>qDac=XS%O^dM_II
zNZuEX2y;?<^EZ@3lQ;J2426$18iG|!3e)zm$8+?YxLT3bZd`e}%BuZKZ`7Ikl({b%
zPOa8{_TaLnj{Cm2|5t@hE_UvH{wI^WN~AP!lYB&ey2;VwjREiZro9jHJiE&2#?^((
zJER{r&0M3iSh;7?rj8ZUxsQmxGb=DG%3>9F<oy5jxu2TqLFtHz-<y6ms))%ozLt{S
z<tA|DYH)pQo$~)h3>Ajc1FSbrDR3+LRPfJJZLyuxwzXPY=lqCFEdL|G;m@SBF8ZY#
zlbcy=s9Vnp*4xb2o@K83wl(IxuaT8roWjl;gSn@V8BHs<ozycw;`y|;0#lc~Lu>)f
z^`(Nl<1LPT{v#Eol&xiycp`p_*1<i}pZ6{+J^OLyoh#;!$y;tk1xQVaa5$9x_gB6C
zg3Xe#lm9pGe0(s%R$%9$lXg$LoRaGf?fevRuP0X3IcjxpXGGOUV^<#UZ6AJwRF&Pi
zxn(B1%+}U9Px=+h4p#a9+#Yk_h~U)DRqVGfM(*U#-KCPQbS;We+WO34OAfBiSx254
zCzx!`o78o8D-YY`SzjmJJ8|phDsFjC{kh*FQ&jzB^gc^Zjy&VI@ifcc*Eyk)EBebb
zJ438inzCK!b$F+7Xb<}i)xx9GmwtSrxH9X^?Th<-Ox%x}SEOES^AZm}_a@;|C(C84
zKtpaGBdxfg#tB>0X0MGnbiP1+U&%+~$XM@PM>k#5Nsw5S%eq>~`i;u0?A5isN9V15
zdd)~nyiBZVXIxuNq0j5kn|G7lZXNvTUt%=TWtPC7NUtd_5)rYUDhnE3Y>3G===J-)
z(BAq;*7EoB{SHmK9{(os9&7zX{+lPIPT0%*P@S=DYwoS%znuBESKeB4luNDb#+)r~
zN|$98^6l}rsoUzHr0{2T;_d4XR!cis$*(-}+iBV-+cV$gmkZm^6fL}MpS^oY$U8nq
zwXmJBS)GfQJvq?5+&0{zS})iC$H|ZR&p0N9>GM?vZ$7TZvT48Jss}Hl{%9K<dl<mO
zf6a2*vrduqEn?;Uui}15uh*-+=+5LCtdpa1wmCxU^`(Ox&R6}kRW)z^{kGtD*rr^q
zcD_Q(br+nhf7ZRb89w2_!mn19!NCsq&&V(sTCtp)shG)rMqpDvLuA#_E0<S`lx~^0
zP9(nNSBy#0mz>9u8LBUrE|6dJc%9iCjn<F0ffLK`{+%9ngHgeozsP%fn}G0MoyQv@
z^k?Sotk_)~#4*j=LB-C`zpdYIr^0cyxAE-K3J;<;Z(N!gD4})I)iPJ?v7CLOjo2)W
zl!tQWN8U`Vyl^P>ZOO&FjQM|5=Jn0zxVO@=?Oyij2i=tnfsUrZ$yT{}e&rHLvTHrX
zmhC?oGUMS*kzbQ%uk4uLIjj24wS%v=);>FX;#VW<q1#2<HQ(>%{^{{0_OM=nt@h>*
zlU`o?bj17kmtWr7B)xUl+?|tn_jT4=@rX0pXA3`txGpNR%h`Qq#hKK$b4%uX81udV
z8**TayHD`hzMBfEOlv-HdA)otTJ81LKh8?R{49e&%DkNEtM*-=b$?&sbEg*DYc?-G
zX}z?bS`?@3tS@vybYa2PT~AadJm!gh8!oqTX|G820=p9d`}S01g+-onzkXu5zKdMa
z9!I8I)074CTn~5&Px}9V3af<;=fV|Fr!37lWVq~(d-m(c@)q?X>*bXLd7>`6g<X4m
z_d!j`ZI%b$OPE)moBAkDeV<edOSJFS#=BDHr)GPJ{i>*`_z?VjnvC`J&rE%qS9iLx
zZ@&Efyw#j{qMKzuc-%-0y1#6NLTTBu7tx!(eX*SW``a#eGt&o?4X3k(UryP6r}NzT
z2~&D%_yvvCY7Jg4&D{6;$o>>9=|eqfcgq@f=!SO}fBE=7<o)lWkp1gVwPdz^vg+9^
zc~9HovsJWJ{lrf-Pi7`7W!!!p_ab`zjc=Q89FQ-0dDy$oWXVDA>C?l+Vo$_c2RzGb
zP`-JI(W~Ni$KU(8%qPU>&WdwjJ8OM;ZrAsx8#_%*VlC_^Y@PP8v2L?zt6bjY%W~RT
z@4swXF<beaX?WPNrU>8DXY!Xs%vP22wDw48fAM@{)9bWv%n3~YRJ>YxZcbag*`VN+
zKf{gy)65I;;VWxS`9IlIv!1JDnw6JcW7LBCOMb+4${d{0c0TmS(LM9tAANbhKP6y;
z))wiWEtb`>`7EKWhu5Y{Gfj{@!rXE)MePC4RJW)j8h6&-{M(;m@^Oms9?u#7Q@ib=
z9_?~pz2P0FRGj#?#s9Z;eQelq=40xb{|$?|%~srL-+NkOTkxU$Ioo{tLua_0?)jJ8
zQ!uS~f8p;lYW4@>ckR++J#Q@A<|*pe|NWt1boRyXt~?z7O}BODZ)<klX1=&(s-yR=
z)W(Tri)?lluIl(GWhPs7>F3szYwf2G|9hMFrG-0(y=OzhUAM)aHJ=1I-&TA7yKvyk
zk52~w@2YRU#Bp-f_nhck5rXQ{0drn)O$_)Qc9-Yo+!IPE+G?%S)_k0x&zN<VzpyMh
z+PGz^<TRh@Og0Z!W$ZlUqc>-xxXkvzE?)=3S^Hx>UM+Z=@VqGbm=k0F%Lh+n(zmZx
z-uu<%#+eN_&5FhTXE2=RxN>n_!tLPy^R{KL%r%~N=!}ZfcgBU<bvNd6R^)PK?tX5S
z`O&LeATv=d#A2KOrfy|xBc3UlTW?KUxYoX{n(Nh*!@|GhYIw@7d#XvSO;NtjuRg7B
zj<Ciw28~70q2VqW)9;)Yzwl<esj}AmIqU611Alg|l$jd(y=INXU(RoRk7e|mzfPG}
zf1q~HJ)U_Cuir@3oQQg|?c&St>Rx{@et7A}tM+e_wmNrX(4B8Zn;9hKKO73H`04&w
zgZ2E`kWxnB>DtW9iB(rT51)&EmS<2iXQjf<wN>W7=RH}LGil|b=i9&EoOL=&<mHz;
zx3lwEt1UO@oyoJipTlg~lsf;}=IxKA*MC%Zn0RcGuVoO+)9R$0b;mznwK~+3;2N+c
z@ebn&@3|#LJ_0TE3j!*gpWVOnp7-2SCfl#BergBA)1Qa@GM~-PXu`d7smiAm?F@x}
z;iY+BbAJ__`nms#l91)J*M<-7PWOMt-}Pfwz?9Q#zEoK4(m1x(knO&%VZqZg_jY|*
z*DF@myW#)IeD4xg)y>h0+V3weke&Z9uP1oshUY6o<>Vjp2<^JaP;V5{)Y|>&&Mkd`
z-OCqlnm1i5Eo(=zbkwOGM-MA9Ep$G^Kb`TwjMD3kY`Hn7K7}s-ShM!(wCzb6@%)p6
zH2?Cv>Ufv?ME7(3Wr2!KXO|Q-W*Ek@{d%#|^W5_j(&EA|GY|jK@%Z7D{&Cji$5-}V
z`7eLu`PB@GQ@!_BM6B0%b$$!OV}CjBHTHhhqC6W<sV^#A5_+iP*via%rytL&JNwA}
zaJJjd6rcApt=9`CD63t)yl<Y%C%w*%2UaiOJs-;LyUE5q`X&=^*#ZTl+uPaVl{ogK
zT#r{$d3kzWMtn@OMx;6KnuG8Dad33oKj2j?(6clQcXB_<p13&tn9;LO4tM@}t>%)f
zta!x~t@QctGRY6GG>)G=&9;u?){&hr?S9E@dQ#vt>tED@vK`I2AOHRT9HMT0vXP<x
zN#03jxj8};X8!PzpR!BzDC@HFkl=(@Up1`fP1tw+$>VpjDK*7q9$|g2t$jSF?Nzh-
z{`E^y7Vi-ehqu-8&Cgzk-HV=)U(h{o(LWZk<Z`p^Jr5n`OiVo&&ic^fl-r@;i>XPo
zb`-F)n+P&|u{fM1G{LYzJ$z&3(Je=2FXx^3Mapl-xnRNhlb&r{u;}G7rp`$UOFszS
zOu50f$u%HQnK^oyfmqr5vS8)=ou3M4Fdvzo`gu0%;uA?179<MYjo56YWbeZ+%Q%gZ
zb;sTFVg<5hB?2$=&&|9m*_ySfy==mhs2{C9V!1qLcPi-0eyja-?nznF)6<&+T&}Dy
z)p{`Pp~dN~Z(~hDm}i<ClRcrQxs&5$!<{3`;_u(({8<q&<<9&U`*gL{Y@2rM=&f5j
z;jY7C8^$kjO(Orj%GC=ro-9}M&b7_Ee{22SiN({GouAzJxArr$mWO4>=2CyhN*;r|
z5B%4qyy9>uytZE0;$T;nK+|I9iD9`0jX8!9G8(ZaU-bS7W^|;na`XM0<FX>pG|l^`
zlFm+3<=U8A-{q@2**|l9++bLDPuTFB#oT>=qhf;ujl*Tkd6G`7IqvvM_P%TPDxsw-
zPA5)2`(dZ`tb~w1Z_55Q<$nle42g(0+h;HS?^?ZN(hTb^{(C{%x0RJwypB+f-0pO9
zr-i-s7V8(&dL8pmY!dd+Ui3dbAn&}2@K=WW?K4(BJY?3SuRG2BWJz49OU<g%U}F(K
z9#3_?IrqQCTX?KB|NDJm`qWNao{cI7m$i>=*~)4)VP=cq>y2WZ;_ClCtF?EP%-px}
zFVk^j1`Yco^-)5T|0f=L)+un|nIS`Eeb}46`zsbk|9Z7nvue{)j;2L#=I9iM^jw&I
zURUAG<LC43=UrWS$f3dNmb~Brmb|JZ{XTEb9GAVl=t06ddtH8so)nj#DxEq)b6!kw
zs&bVH-NX0qcj^4s$yes2-dbhbV!2hnLM^3v=5kHdo~}<bi_Zpa<yK+#%xTkE{%6jT
zPp_xQGrWz?{dOe6FXz<<=2~OnX>O~&nZNgweIY6od3tRuTkL-=4_0Bjz?EMdnfFvH
zn9bR1<^SZyB4^&;CwaV=cD#<7dvfCAGaokkv0VPaGl7FK&R#aYan^Mg?=4q3a^)s{
zT77J;jgLo&)8h?2LH2ilX5R5m6?+gRzSN^G$SmJBU(_M>dPvNaw=UHaH)uwhEPlgr
zr82Kk|FN-5hMC#IU%QshNL;+$=2ZEjpcwzuWw%b}v7fq<yWV%xl>={`D=ytK{*|=I
zNOb1;AKpz|PmbE?mu6JVIJU+%iN$p3hyNDKXa20WUe%|vrGfRG(xS)%8TY@KZr$|r
zMDi|u<<rtH=5T4>-da-pwmZy{BU@GD=B8E857i}g-_$A7Rotra?%4Sm$AvCAZ4^10
zc#F$xiR<b@AwT)e^MwRXDV4c?-W4Kwa_dgZ$DIDNUc8vmp~PuvUT}O}S>o*fermEm
zjAP22p4S|6ur@kYwt7dYW2lzYwNORJL+lG1+ZWfF9$I4OEMoucXHdtcn>Ky_GH<ZW
zEIR*j(!`os6Q;>MTRVH(vMsGv*B@MZ8?0;9ZdrIXoAtiWg-S!^#AWLXHY80ln6Wvl
zgPCuwz1m`Nk=p^UeYR)K?^B52ecx=p^77X{sosfaW>4v3>D>BaW_2Qe#<zPj0wyLV
zzWB5DPMxh&=%w&KtK=n9e=41dvSE6uo%vV8t9@nqGUGoh+*heJ^iNLUQ;s_Q*L2;K
z^nY~{dA0Yad@tE_!>K;VyZ6Ja1>1YQ;=Sw&w!C&|t4}=K#P(v5HoLEjwb6W)_jj8&
zJbrI?DaR}Io!`FnOU|#Kl)akOrMqJ*_x_$Oz8MJ*Ur%biDLrfdR*79Te>0ynH^@HI
z-V_$cy>8Qj!~OE{Elh%Pfx5+;XQrLH^lPDgVv=%B+rA@F4{Obwu77WSl`!4G^rrY^
zCGPYaOP<YazV}qn>-({1zb(o?uM}ic6=dn0`eoMw3G?OEL7S&&CcF-3$(wV>W9`Oe
ztPgMY9d__O^F-)$$h<@UUhvPEF!@!^q|6nZAuHKGt911LS5dt8{ITdl)oZyyj+IrD
zEziHdyHul<f5n-Df+^F#Mn*icRw@sZk^X=1_L>Ka&bDOuRy-}7Hc!NSeqc36KuP-H
ztoaeot$xg2Ip<Sl;jJ%`vqQ`rGHNsfS970Uw{6OfEVGG!>Rw&TS?ZQ8o-yTa)&5NJ
ziBSvLe$LtIbFf>W(>tos^`Zat?dJ*(?d8!-k!Oy-^>eqYS*(X?<cx`CA={pqDaB^X
z&zC(|C@7WechXvhzw?xK#q?#J{NJV)C7%1i+@!*IZ_b8U&NFS~?^`ua=zM)LuKvM}
zva>z!7EZ7WR;pfg;%-SNN9+PtH*Q6RxPSY)ES~4>UEKA;LqzXX%_8GX_pYkwa@A;u
zA3N3}Z~E+Wuf$ZHokA*RcjmctX~!)w`&puR`g8WZ%j-ktRG+)f@N3(9+5d}0(sY8d
zTKe8E{G>V2Rq<1zZ|rS{AGd<{pHrN4xV_$E(hV8*9VzptT$YaCf8_Zdv-^{K*55js
z>Um=GgQ_=|h4h2}%uNY+a=ZBX$y;*$Dl`7D^WNwSRb8lEecMiLb87ZF>0Nq4y?Oba
zXYbW<I%IHdl2~}=<RQmhEHxV?auz(@u;ZO_K6~yNwk^{mo<3iCVA|Bw&s!E<-?~hF
ztD%!`?IGijemfrpDVEJJd2!ZqrRI*%wwsHlRt5FeI|d7NzX~&clkn7e!-C0XtRKwZ
z`D~y6w{U{OR%wl@>leK<j?bGe_on=%X<_~+(aC3}rPsa`yY1kX@sFjy!zC%a_}0Se
zU8T9ET|WPo@47tk`-y`;r{8#;dHl#DnZW<e(pS!}cyr{y*6zC3>05<6vtO?K$}#Kc
zk(yZk3n5<w&sni*%rncF`^i*pwnf5CkA0iXLuOr<UV4m)bBCi3yQq!xOY<Y_Eh{&!
z<<<6F(tLBlVucyI4W7Krx_io6T~49@(?hYgMUAT89}C}MxSH*G{Yh1Chb%{q)U(q|
zR`)qGL@ztN!}k8y>&@b?KGuJox<8C9?to%{pn%J(uq~6tTnrPg|6(!sWt$xA+_Bl`
zf<y3ySGFb<J{^J+&!@00OWpbF$l4N3p4e*N!~0uA4lS$u=JWogfR^~eoeoQrWVzHE
zAD6G3e?2&PNrPKnIIq2@Nm+ev<Ad19@6*qQDy0fcnw2$uPSxdpR-=@{182T+rDRXt
zzP(&$@-nSRvwFrmh1<=JzMA=MTHrh8zcxqW{SV3>JXC07`6U0Y-l;`_Pt+`gp8aQ3
znIBTD$~#lTlFj#R{N*CAjQOw29lxx1*}{58Y*AUnv_8d`dv<szW;f;u#pI>B&fFqZ
zEwlGj30G0nLOF}v*CA$8)+VpM<)>NNv@m6}@%rCv>}~l=Ps;mMYPCA%pKE<4>vDYN
z)bc%v9^QA{w~9_O+AZbvaZAxZwYpP{OV7(4ez|Gd1RlS<Ic(f~KYQ5N52gA&ULN$Y
z$K}L_#^&zqEkP3H8Q1yC?y^U|IbWWf;eEE!PJZ5x0MCe}OUoROpIuO5>2mClEmwb8
z!58o7J)0b7pNd&}TlV34ce5D<QH3&MYSZp6Ij1(C!Qm74iOU%u<tvZPZ1|e|@rJ;?
zZ7oah2<>sul@_QsdYO^l9#$-FZ{srm;rDk>UZ>^6hH`eklw4H*NzYHEe16cqs!pE#
zW|0@RZt8zye%-qec(=1fb&i$RoxiJj8jl9}Pkm;ey2+~an^%5RBx7PWzrd7F-=_b5
zWcHyfTERb6Pn|9C`sv%*&eLv8>|jn=mXm!nSh4R;ak7Uc<AQpg`0BzlXJ@FSEV*3N
z*Q~ny_rCR&TIWTc39Y}*qT~4f!r$ziH_|(%TzrzOy6C=6_l)Jsoy850*NLpm?Gh=|
zd)O0{oV8i@?DHqSH`CKR4=n!j>E1WSKOB$6R!Vwrn($5VPO7blaOs?wwzo`Qw0xx5
zUwr#{X*-kNu7GE4uOz+YQVnvscW(K=V!z46V;zT87V2>9u;ke*-WK7d%jm)#Z4~+R
zW{5+JvDvkSzspw4p3!i@`Ns4gYhL}Bv1;q4(yyZ2b<BqHmNTO+{(LU@>h>L(x0inz
zNnZH<Z9(c8r{zV*JZ|WRF?J*znq8H=!}maDvWwV#6)%TVva)Ym)K{ilbIOQeSnMsK
zP+W3(?+>xclVJ;uYkwK#dF@=Xi2dISqpANNscaXLv}J9Yd~)M?*>y+s4HKA(?-p+g
z^fvw?CLDD_oO#QEOPh@y^A@_jyKMAj{ij4DQ>O0uZVIfM7it@AT3VI*J-vyUb4t<w
zscMb){ykDmJG8~WVQuvEV-M%3hfk2`-D9BM=^MFyaWl`e*&((Zv$F54HxVyZUG#ny
z$GgaXXWl*uS#_#!Ly*+0Ie8^>FQ`dXYG09Mk@n4LIQM+nBA-qUo&+|rA7{=v@e6(`
zwg2OH>({)$la^fyW|;Z9m0!y0&5v(seJz3~vr?X)+~HGb@K^Uj;m1z}&an=xJHx-c
zWOlVMzv^e>#`B?SRqOYhMJmDaz7yUAU)|Lxsl}ERWioSOJipA@mWldShBC)|E(SK;
zlblm}EhXGIpLhA3k`wdOmnFTsr%@gI$1uR=_xB9<e=|cg+2ki3G+C+BFa5n{a#i&m
z#ZAFoBKM*rwJdL3n`-Letkvc7_3Go@Dgs}hm`Pt;;b%EvV$S}uFE_47O%-&sTavSS
zpQrO_=|u6GDYO5V1geIb9<BK6vM#<e<<NnZvQ{o<np}%sKCcU$EcM1){HDTb&ytCY
z-$caUjh|8R%uZNc`g_{F_`i$gwOalQ_Djuf`8;J^lR-zr?JY)ryi;Peu8A*^sjget
zzQ}s}^jCMxD%d!KFD^HAuAleljJoe<+bM73*FIZyUFYY6ib?D3ST`2UtD3BK(%P(X
zQdYS3y8!*}>$9!)M+<IAX>*E_zWtRqUtsU$)N|(rw{kz2G)JZN#j}w8{ILp!_2H|R
znuPCAOLEW9NWI|Txbb3y6t~CJ+kveovfEb+gx>4s`(+pZJ6A(FG_WGQTUqAbtO+ZA
zRkiKslq_|e>UGR~=I6&%mL5q*#Dhu;rly815YgcN$ZmTke1Y!mrCW4NK9_7<bC&zM
z;+~-FR6QPM?Tjscm%k~PoY-xDPR%p@vjOi^roC~s%EbmAMmqB|7al&fuD3+tWG(Z$
zs!6Jh>59_5mxFrq%N>&ZBYIW6ix%%LT&$Ruv&#RPXUZRoC56!s*NCS!nsHcLhN#G_
zDP5NSQ23&MX6;S;&lAIVIU?VGU^ub**pL4kR7%VKOY0qep`zjxkjAadnIPY8qhx!E
z@74Vlm&%fFuO#MA<+vB!AIP&l;<sT!+2W;BUU^uzMqEe`OxL}c{`Jz`lD9URKaw>6
z7Ppq_S|7U@t^2?%f6s=l{TKEfJX_~JQDUFbN4AUh4?b*pQ@;6`u<D^5nWuekgl&7m
zu5fW#;^d3V>N`yiO#bOIZ_nimJ4*DY#{T`Ze9eL-o9AD95vFwh>A%M=cMh|?yK%+i
ztk>;}D-z5al%ghYZ&^2gmQvu0eR=;_7GC9(=qy^cUi-p%+0t9bFZ&<i(sJ9(zh}|*
z{rj{m9|)N%-}uif>zI^v#muj>R4@0;5usOKdQ5(#-OOAyYk8bhO4fwhuB5vxUCZLC
zzaCILVpe@SCo6UN#Vw9on2jc$zEUqL^B`~YyUwTC>OBusPu=4QnPhFcsObAWjWZAC
z{fX%Fe$k`8Yp&GP)J*k&`8C>0j|I)#>a~PFs`_->tS@sEE>_7mSe|lyeW>b|T*B4A
z60AQ~%1Z2J-I=js^$aVa8Ea0?JTQ0J92*V+zdB8(+^mZIH$EIMG+EI%?Zt(s|DzbT
zz2CB?fiK|*gL=1`kHew*&l|$x6oTwD)|}t$H|5vgs@9{M+~j_z<Ro{AtYLbVlXmIb
z9*OCN_I0lMvp*W#)0{AS;^#Xd5lOuB*<S|y(sCD+y`Gh1zr*0>_ln$__-|Wc`HqJ5
z|95ZN6VJ9WR->!&YWl~SKF*nc&8>B_9~^8oKluIZdH1s}p^p5?MHOES|D=X9^Hgbi
z8dOHy7R*|x=E%AG`6b)v{r}hP3U78f$Fbw}lbionD{EKDzZHFGcYdQljeGD{zK4$%
zTywtWXcVQC>+pl8#7cN}v!2&?ow60_`9Zy$re2@LWKZt?eP-6)rBSaG7tdD?y0PX+
z_MU2yyTPl%W;$NV4VswTzv{hU*`t%y?-pLZ_2^g9zMrq}@)!TVQGePsY>jHg%hxlU
zK77fZWwJJ|EAsaA)ORjH@)Ocu9kS){ns>Bj*GI_}hq*Wz_&K{Z{;yQ4T%5@J@&2h4
zvpg{^i?qsupP#pJPrF&nSe0QI_tq?!#aU14{L+4_Rd#K+3`4Ho$k1l<|DqJT)<Drc
zRE&4oTK-iQJYShk9<iSJKGfp6;T)#5k)OV;WxM@LxFJy9Atq1vmo|gj`Z9^|O^;@X
z9F69wIi1=X=)F{Yu40IFX+pofc=<1bl|j~j`X2VjChqHDT79-n;`rr;FG5qx_|NRq
zoZa(Q&v%-R+wTZLrf)~ic)46Tr~d4tuI2kahOj;F%p|&0gnylj*MH1kxUorm!?r2=
z{rAdrwjSGJpn4#r=}pKh$9SQ+Z?awLUTOX96fCsU@4Z>s_w&T#wD!uNH@0hv_cH&E
zxsk#UGcon<_JgK&lRqpAe#h0c=}zh1cR#rlr!RQ>=0=EmT13gQd$I1`$Jjod=r{G1
zyB-#zaoQw9@1Dxe$6`Fsg8wC4d=h*1&&h@lHgBeD$8}9#y)$V3fjf$&Hw|arNw<-Z
zUHs!-y6zJ1+uiO8Tjo@0yyVSGeQwv?t8p=Rh0fI<9S8R?E?BT<?fEIM^kSQi%wEiR
zqWem-QPD<u+tbV+cdP7o_^S2Y@B8H_(XPeb?IF%@RxOuSUgapTJUuO0Hg#3zck^4*
zJJz(cmkIoya$(bV=D?C)b#GI*_-_vj_mc@?=c}z>AY{%fz@=2asQqQM(z9=CBc7FZ
zyk1sqRhZ8E-XWB={Gzzq8?y~tbq)BIGfXei<cU9MeYNBEmYVndw|dXj-@mlbM^Nta
zFM*d2TIRo>&-|iC@%qcv%f1WCuuq&m<!1PyTW<xVyz{yPTt2bAeEX{~DRJ$u30rr5
z-u399e~j9eb#Hd-Jy^meQ#`3vc&$&VkoNj>ww#;0oEP&eKDg;`5x#Ry%a3WNxgNYc
zCZQ87-}cFO^NF`Pr@Q>_iS@}V$*g_G9^dj@^SNuA=)q?j_=1AtzWp-|m}GXe=_nUx
zo%&2xF2)Ms4cS&#tQYn?cwPVX+QT1jbo5HpXP%zlIC+D*@AbMg{vz>i?Q{MaC%^oP
z6jJJUKk`|mPh`yr&nKJtQk#$5&0xCxc=4meJhyj@t7C0LYlLqv)MjZ72s0`S=RJM*
zs+_3B>on=h=1CRSzeG%GYdiQW)L%?kYw>96XB7+cRP~o#DYI?gIIR<0{&!)kUx$gv
z)9b#P8Rl{=)9=Q{{cwskcDcCR@$UP>RecPL9g5!8h|a&S^ljPH^8SBLi{G!?$kin`
zv-Z`T|4eCzzfI&8n$H%Kv>^NDeruOiZ0S9fH>DOXw`Pg$Z?;kFNPNx`y6@n;X(BQ*
zOViW%7fnm4Oq;HDtN;BrX%*eD2|r%#VZHe|dSS272bZGw;+0?Q|1IBOyV>T*#gj+#
z{+?WU_5Z)M@^(A&3OjcDxW;TX5i>aRbY<Y)nN?p!C$KT~cJl2x@_0_JMd9b5HFZJf
za$f}fYk1H5czdpRmxp=fo_e*U_3LXN?fP^&d2WW*@iRgHLtCe0o7<^PGtNr*k(#45
zb%OdI8wZEfhw4$kv_F5n<7So9fA#OJ$C-~_i23#3cp9^Ibq`09hBzamgNy6hoD+6I
zO$H1FrEkUC^4{!hek5&~tIU2XMM-~A*2|M0+*)HA-FB|+?Gdn<X8(7hc1xrf)56xm
z^Lr-Celp!4F1T)U$6Lv{pI&Cls~&Mn)l~?Z%J5)=5#x&+YyE8>ujJwQ@KNcum$S>&
zE$0u)J6tpGS^O&W&qtMS8`yHir?W45>GUkyPkHOli}8Kp+z)qY+?!?=)+}w|ymQf4
zEj#t|an37lCvV%l_RGZkCwE9$`=nnCWIT8G#~MkE*GJg}=JVLax&JdTxKLCc-126_
z+SUm3K=%@*HiyHfKiEVn-#Qlc^x?k99FNS>xwkIl>1;Bv{}}TilvnQU^~8;*cuqZ8
zlT`JeXGh@|8}`qxI=gpun^^UIVJTj|_2z3%{%<C&wJeGEmMCZ+V$+WOdbdJp2J5cg
znwJ~n=7xRz-QcF_vhCju`{NJPG86g!eoJ!LUEF;0qw(f73l2Mmvjp9gvbwhaWWbR#
z$Byy}{nD7cB`G7m-r%NG_qv;w>!alokNpX`yWjGcwdsqe{u5gpT_t}`nX@@y#T5J7
zZ+*{f?%Ou&;ZIKf1qm!lo7XnJdBv7#;PmZuBY(Di&@)knI<qGX_bX#sod2sD&bsdG
zQhng*gCj@#=WNzBNQggSSmN{6Wu@i4smrC9WH^}%GA)bSHRR{Mb<*|;xGZt~(3=>c
zQ|d;QX=YEC$Dg*k_wCe+>&6{I(=#OunqJt<h+lI1EMuA7=_U2+!XDiVo%>hs?s{`0
zVVg&vjE+y$`evs#!G3!6S%3YfV%OJPm)>S%f9q0T_5azNGv38Zx-IezpSU{9(un<e
z*oj|SVfUJriYc$$o;Hz3zw)o#f~{E@fzN+ldK&xMn(fp3;Dx_kluSJKYoD9F)a-YD
z$}<<IZ~2Q8Wj-q0nDmLw`fi+%_zt~|$J(sU-=3GaOvP?d<%0xSfy9eHvPC{JZ_fVG
z8|dcp++p^qr#b<jZyIQOxX+E3O#8kt`$YM&{&PFGHt25uy{xPF;4aM*oly^$xcDE@
zOcp)Lf64vux4GKtMy6kXeK`7A==z<-$^29Inj565wau~SxYS;D`u>p)t$ux}ElU}F
zc@OY=K05KiHE81TVCkhCdpN!y%`@+oJ?>)8ruE_B(~>#YzP@hL-u~^5=f=JBE>(Qm
z`h)3yL}?ZO{0K#@+@92o6GFEZ6e;)S1c=-&-XFx<oXQ<mD;T5lM{e%~#SJqO&RH+B
z_<6@mH?ZT+%Hp;=M)Hp`ul<QXou53j?vU>%4TWV4JIdbozdrBu-AAc;LUrC=c~&No
znKvgKJbtxpl3dh{*?z6U6S<l#{N^b3EW8+^l7F-D_2x*Ob3K30Bn13-ndKa`UvI0L
zlUnPFl*^x1?X2TH$8-14-Ro}e0z!W6$;+~RpPug-ns2w@?S)O>7d76Wv8CUp?#jvv
zCpnR)yz&)!n=doCUuxOcb)$FHC7tjkM+Iww5<?|wUoPL&R_@M!VAkI)dy4=2u6o=q
z@>o;(OS<LsS*w0r|6Jm=WA9<EW-sexUj~bdPG^`r4Yv!<yZb4Hqm^+^k@2dT`vhM1
zZ|vGH(D~;4MRn`lr5y$x_qyurC)(_@ImX&M^}A2Oe<vnem(R<0%<B75HrLay@_U)G
z-LIKfx?Q)+TvYOT{v%QUE}vf9-$OQ)E@hWYd=@%3?6{|Fa_^GjG9Hn(9iM;Qocl1%
z)-on~y27><nOTOsPw&R|%+4~o$MELne<{5Rp|iVQPmnKf4KBLy&Rza-hlR>p&9<AV
zmD~IZ4(WMs5#gz4HNG+D_KxR=<r=bQ3vV+0qkhCUT3~<wY=h>7Y9f_$6DAs0)|jSM
zD!%1h_3Y}#Ue$Kf^N!DTCZ({HPAHDlxE(&L^2~&bd<nl5Dl4=^RBnDMR{Xus`lIG7
z`)^YDD}D;eNb%3{l}t}wdTGV%Xc>N)&4>5#y*F&iDOwO9ZnpA!^-9;9NmZxyVkZgD
zo?vj%Rd42d&F8BUu6FaqW=^z`)@grcIMLEM?DwyYeZ>lS&Hn{h1nnyYra$}FYP8(%
zeCI}IC!br_LN{(bcfrbJ#>K2{cMfcPDrt6Z*>lauo3kV5FNwRSzAxsE*=M%g^L%#a
z+{NawZgAbM%BHY9`Ip-1xvQq|E;jE|*K-r>SJ`Y5<*QcI_ICfDt(yDa3ze7Jy*B3+
zm|%BxYI=j`@!!wqD-`$ZcymwB-F)cNlLr@amiMj739K+$a{KMSiu8l0#GdyS=oJ_(
zeZBwhkw=qexA09(xFPpu=GUDsRiElLU#hYYP&xekR@c|apMQVuI=6e<_V}r>5{D!t
ziZ)N|KhS!;{Y}YqMq{Qj{#~cITC$>S;#d#=dzf}LSu@dAKgi)sz_+RYPsJQJ5ZZf<
zL-4`@`#Cj#&pZ&1O#1qS*>!)lUe7J9%{rG{m2_fd9^bdE6m}5(=&D)g%6{a(_O|@>
z-4<u&nm+yIE2WX`S5-BC+8nV3Z!gKOT#zoIcaLw@gp9^H@iL(@Mz8I5C~^dRIkM}-
z{z-v9-T(elGA{VyBzsV?rSsJ`CM)q>6Sqx%<MO(5{&Ci47Q2$vj%_Lylv%j@*HR6u
zZ|%qLDKAXkoXgAgQbzUd(GMICeFf7W2)=qSGqs!ftD<q>E`w4xF8`DplU`}(PMFfQ
ztHwX%RewQA`g(s)skMvRWS#_1J?xwwT)8yvtL{>@$syf~SF8==H9b@Co0I9n(wv{t
zidDQZ4Bw}}(KF!)|8`>4*V%`shJH9_DfZ2D+Dqf9Th>ngxb;^bugjh7*M6(S%vclp
z_nHv<)<2R36OGU9Vfi~XVv=F&>*7OcOO|*Stq7kPY{9MED?iKRG}E;!FXAff%HvuN
zq#U1@BURsj<?_m`yUP?7SE#hKaEh-!HTUIS`x)ZN3QISN#At|LK4X>5_$D&kdzG`Y
z_cYtSt_I15GQrwn_k1Oxinzpo#ZLnLxE5c`?mS_$<D9~V(}_kGBiUzkNp1f#VIJ4+
zyGp0b52{S-uAS_AIc53zuzd4Oi^_x$w}WS-j{kOUn^2YApK?xfvZLK(MwKcnui65+
zS$~~_j<L-7SIX90))nwykfr0=y9Uv-^^f$dms$vAcuOju_@?#K!cUcd*QcY$N?u4@
zU2`p=VQ%rmm(wbjd!Lr%d@A-#&+>T2T(<M?**oR7Ykd_w(RwJO&h^n>b%9^je<yHR
zZrwNk{(O!34y8x0KB#x@p1HKP?W@b2sJ06??{~0kM_0d$t=Z5db$RB$a1;HM?}C49
z<u`MsoIN$~o5YtX=lfTdp332VD0^T|2A4I1;|@uS^rT~jLFdBVgXjM<KD(=!T|nG=
zz44~Phbz?F<N~9Y?u^QI?^ippO;2<~Jlh@?Z%57MpNpriWa~{iB(dePDznA3GwI={
zPXBYru+BC+ew*)(-Eqf?qY|Mz80+r#&ASwIU`Dq{{X+X~>G8k9DlT>wY1Zw%J^8Ld
z=A&<0+18xXUl6PE?D-5OpGzmt88+SbPL}fEHeld*nSHKtzVwS}91>fKZk~5N;@P(~
z^~~4RPvdn2zFDlYeKq55WsH-<OS`1R#JV;ASPLo-e4C=;IBP=qN6szr4NrdsmD_&$
zWTEWoTN(T?foB@~#@Estf?suC`xGX-<F~{?5z~L7WvO2srp0<a`&>AC&!)s_FFp#s
zwm)$$Z}DFp`HB?o!{Qa|&ML2VnjL&`+eg-?%rb6#IWlF(=37m<&p#pfhrM<x<K#Xg
z)$4rAyw!it3f1~_&W1;+|D(XYeGy-;gg@SN>AlF0n>YEtZx{OiDC70^)~i3vTf$>z
zo}RsCbMfmPODgUxyLCeA;0DgE2Td$rr=I7li9eLP{wK$k{_UF-H@3AsZ1`ULBvSeN
zEZfA48y8)CckW?ce0tN7J3oW$gVsibJbItEch%8NSGSzK^K;X3*0MY4tt@}_OU&;^
z{|c<q*EFoZWOQ<suh-iDHaYL_3r}0ZxAj#>SW^70Noni$=Y=i1q4vRR>QtporiRRn
z6W(fl;Ojnp!TWyU2}8%VKJ_~vChU%yUr|-G(}dsOx;H=C>X-fg^$I1Oe2y!M_S_BC
z59z#Lbk_PKx5Y#LmTM(EF2|B37*0g3)?Y5NQ0S$C&C#o@)i267H)MwLJv^9q&f*YP
zV7%x||EylO<sQrWXBO(#&wBKZ^R|Vy*5494_nA&d4!z$#rMDv{*!zima?!*;>xG{4
zd^l+2o@hBm=q6`!&U=QHhj<cMwTzBxH*|add$%MfuZr)3_w^4fGc3w1r_SkfX+9%6
z$C}~MsZim+l1zJ7<SOp>xwWchA>Ya?4(qP}-?X%NzmUKpnONE7P0G@YGbPujJ4-Fx
zAI89xxOdsAvsb2kIV``mfjyh8#731RYWn&6eAoH+=lJ%;B_ClB&VRV(%QkKPddq;&
zg|_Kw#dQr&idXE&c$Mg8+0ZQQ*q+bhaPFYU=G%O!J&P2o#5T@ibUd}C|Ms)ClOC-*
z7V=ybd@02jzUQmqi3zfsHmIAP*fw?D`a{Kk&R;2*X7hI`H>+X$>2<S1Hk>f6c@Q>@
zmq|Xg=}&w6#1FqWeY~WRQyqGP+4oG;{L{R7C$^;Jbe66(nQ6dh<hkAJP7lk04?AQ^
znVwGX<xyDHp0Xo!?*40Qk2V|<%$@y0>iAsk7pE%RVl1}$r5V5bDAeiiWFzL2wm>{R
zWNVmw!p%*-H}BZZ_mxZv@@!8zoOgJWV@*o1hnr)m$CvsiVoNy1jCWt#{or7D&C8>k
z&z<3&X^<zZ$vVT+_TBPl)q54?6yGKM{_h;bweXBk>PrvzOGi|Vvsb4u-P-WO`hr3A
z@5p)U92E3(?X>2(wDQ?=n3>PM@K|Wmnyk`k_m@td`)$&rFy7S(ezP++vCTUe7iHP{
zLd2kRahMeQjG|i_6I%TiEHuAe%ItQgP`P@cTyD{1{^^2i6N^l<YQxr^3pSATPB;EF
z{oPt)J%QPsuCMg?>W<9s*UPYwQJa12`msf9E7t96%wP5U`8VOPr$+w@V~&KG|H}ES
zQSs|TtJKzu^VTh|ke0d|Jn5NrspXFoC1+YrUVYXmFz?+-H@;cRU(YQU-CFM%moWF+
zYT1OtOMg^7I<&&1`f^C)r=I<;x}ERjUJG1(QfZq}mcL4=CGni$)^kTS&)?jbA9-oT
z)H$s;dv{E|D8u=S`{kLq=|9fgx3f~JxvuHE>U}xi<Ml5e^d|`)(MrB!vqpG{!QKOv
z;nO7L|MBXTO0PJ%<sk2?^1DC&9}A0~+3{S7Z}-g*DW?Yse3Q0j9lZ2URPN>}%O4k;
z%A1%xPM9eOc__!VOU=3SoLRzZOMlq5&9xejyxK3i$K5iU@HmxCeruG=8r~CXZ&DeX
z4;0vNC<dfxwO(S0`m=KJDsN%utoJ@l6W^}<U#Pe+YQ50KXvys}9`&5tzsc@Gm&jWg
zY0t8ysV%FnFzkqz;nVN>RujT|cA?shlUF=Sgxm|-9(+H>|9h*^TdtG@kC@jirHWT3
zh?UykoOm!^ZFX7B`OJ(y{we)yUVJ&_wMV9;^w_4wfdO(^*Y5FN|EBxRHpM#6;K#*p
zVw>8QN%BuRy5F|wp_2ZpM_Ie1nh#1&e8TEAqhQJYt-_2YvrnbHOpVa&TA5YK(>yD6
zic^eVb;-LI*1vX%v34o*|635wlP<i~N%7Ho4i7U0zNVJaqm~!1OrL+Hq<#CILhmi?
z`T6?<J){pTzWx8Z_@0kH3|Dr1cs|8G$K`%#Qtjf*_x~*RG(4*8nKa?N+}pBr!DTvM
z#0y?~N>2T3n5SdER!-`Y^S-2evpU|%sKuS~<Ky!8nBew{=gQV|$~T{7YD}0GFh_!G
zzKg6v&=MVm+V8%hCh6W=)mkO2T7rJ$-{pVUZ~8X*wrSUiACCp3Gqbu*?Ci>W9lyOG
z{@?EyquS8_3F-^C9sSDuu9xre*MCbV?Y*P%|MOCv)>Hl8Wi7Wh^1NX=m>POLu{g;5
z-<ivN1|8Xx+50OPR1eJyQt6QO$Z5M174E-La)n_>)l_lzly=S~-W)FvF5S4uFzfs;
zlM8%XeObkSRLi?7r^ZP=@mRfjOHb8DqXvGKh4Z)V;@$Lp!zz{}(ZBh6WuG?aYPDWq
zS*$V7PN#DEt$Pov^%5JK{%7d$1iV};bfb(dtIFo#qI(X%j~^2#zF8SEy~D4IVVB^P
z4`=e5i>Gd2oqu3^QV%cp%eNQ1CFb!i{qlClF}umi4b`9G^dxlipYFNRk&)@4lK4n8
zmVff3n4KHXJ^$9N*}B>**-=MbDtw;Hsk!<Udd4fd!cT8ZaO0Mr`SY`lWarLjvI(B2
zkGj1``!T&zmcgvwWcvM0CD}YLYkiZX8T#K&T-ULGmh0b{KEL?cn>{Z4dQ{pqgKzV5
z*NrBk(`05hf8Q$J5!Z3{1B<+n{`y%e*0U!!Uo_Bq99f(n>ry0WDaq+Kd-BAM=Z~D(
zV9K#z$*VluREL_|`LFlH8LfER`t0Ru7oJb8LErg}=k^}$j?MAqkU9EZV8Su?_K(6$
z8hoCUvJ-Y@nmP-vc+ST6tH^ojdgg`)4=qCXPhS)H!|sXt;le4QCr|!+IU_Sp`EA^s
z+};B-Z=1-5NK8)Pj8fPdbwn(+qS|=!f>4jSpWldX+xxxXO<S^oy7&#VU(cUwnF}3L
zUuZY|Wcr_5lkIrF2|iEoZ85JoalNbgevYJpz@NYIPC1v>zvvSS-umwJcNIpX9?moC
zM4!&|T{?Ba*34NGPG9G_S{77c6LgM?;o<UfA15x21MVLF3Z>$6IX3a}rIs*ty$e=n
zNts)6CuF(J>*PDCFApUaANjcJY>V;!&J*UGPgc7;i{r1=KKP!4>BrVyANJ!*K3?70
znt77VN>6g7M?$ULv)#6?c5kL7t92eLpY3<@z}A3Je&6<)4};k4ic1}tm(DMgeI(-G
zY=6(i-X$YR+ALQyzEJ0Z4U_n;=1^PJbkWs$0)<v5CZ#-BR$ZW}y?^7Gz-J{Vn6}8s
zzB{n~@shh|B5t|vt^S);w_#^M;vaA6I=#BvlaBc1SKZ|QGi|!5Zr-<r8#lccJ9Wy*
zN9*yQeu*RbJ9@qAehH@8s|xDuzBFM!<I&9QpA*bwq7R0+ekr`}<&awWZb4`F`MU76
z?CK0sWr=Z1eq5VkALI7OTy=k~rgNsq%fGkWt?H)MH-*g2TjaWXj|S5PHk-uQ1tI%)
zv^fSvRY|$|i@jpr!>qD}=}8^Cwdj`LXSSRy5#woiv0=5@-yU_3x*Lb2cdyB|a?$$e
zVB$Uf`Nc(=3X)2ptF9i2k$nF1ZcR;mno7HH=hvAtZERyRJX#-~J>RUqEb8{Y_p+O0
zW-sJyUlb(t(CfidUF}c)(l-y~%$!g*`9}Gwmw^*lW`*g!R(N?SdY|GQc2lF~j_!g|
zjqbzmk19CbieGqMebIbY=KOcun)7ZeSSu~v`euI96HE2^pI4rFt6ozuDXnOsU8g$F
z&M(m$D{?EC7YF<M`aho8kv_lqh+yjvUMr@1Kh-DKPm^boaXviLN1M@B>G#>Te@FEf
zx)pfbl<#g{X8v5KyZ3F!?Jf<c`R0;Wb{_7|$><5lI)5b9h(nIe`_ao*nR|J&yU!au
zT#>r%k^RZV4$h%Wr(U*P=bUTVa<|d+@Zp%%3SXzCa&7y+{oJw(xA<i5g}A*+x7@Tq
z|6HAv*+$EE&sOq1`1bje*W+*9ih7+(+>e}aENqLtroR25ynp27%{i${W_xJKEo!y?
z-}_Ie?pk>?gZQ=k+tQ;hc!wX%d=a?5YO-8*-I`mECf_~kIaiR;J!|_#l?$$~w^Zb+
zOh}lO6S_)om5y2VpY|+)HA;d0r){RPII7Q@q`AOa?WP`^$#(f|YoC1Gf7IIY$L=lK
zyqmTkwwS!`uMMl+kH3eGB}RBk@@(Jfv+Aw91|O@L;ASN&9mk(fw@BVUG|PI)hjVKu
zr=6Q(pqR1n?!T?|E1a96T{4x{J<+L9URf2?|L9S~=ZN-gGLqNgDyE;_5YaJX*-vko
z#y>olZS!KIpWobDv-uBy?{OaI6^-q|i&&zWwb`GoxW4{>y_@DD`7`l~@BB72M$fRm
z*dcZQ+|i?aW&ORe!HdhcJwDrUVY}u;wO#HFyBF?ku{rHNsV&Uyz3|`t&)#1!Pm*D%
zZc1BVYJFq=>aUHhVR0!8Ve_5dSue;>me?)JS|@kwu~gIr7G{&lTX)QOoTYVoPVkj!
z!d_t~{VT6o@)+C5K0cPyAg2^|v>>nYs`E#$z$WwB2}Tkx{L;m5tutJ^zQ)7eoo$Wu
zxj&tOua&hJbt;z#Ut-uAxNG|n&xBcX=gQBB71{Mv>aq@}ncNnkZFha0raj=5TT^su
z@=Vz~7xQM`Dv(`~S8}M=cJ|U)w#VeW3${+rQM_{cZB%gG0@(?t{9~u2t1gUeD%}6N
z)V%PG2;1S5vyv_gubXqpK4?+clBYj&vX98^$%|qaTn;GN$j=%Z(IGLv{>KjUcZ|z+
z?TA}^(wjfaV6xrnlID4D%&fASPfm~Fi_?4l`bVX4e))%`6BfzTG1~oES2@4r=)s>m
zRLb;<-n~D}Z8%Bt{s#U#+b8IMR8#bL_I%U&x|g#;9)5~wzjXdp;f0OU-YW}nv~jat
zQ2K4AkegYr_DkILoN8w`+xGv4?%SXB_X+FYo$}z+zIL<cIxDQwU9SaQP&L@MNM*We
z?urIk>z=*Sj!#d$EwV;T%G!7uXKnvAjrZCX-%lDFO)gI5dTD08Ng_92*J+Ju$~`%+
z9}6OC7nt4AI+D_9cOm}EoZl<1PuOiaX+_k6TNOq5N7wzB*J*z#UhU#^-QW-#3niN#
z#b36%FFUr#R-FFA&M|qF@J$Y(GZXqm?RO-qcUIQcMSsk2|6V^m&~e+JWs#vj?sn;N
z7`yVFzsl~g?eCNN;;+ls9!yJHv-7Cu7lW;F>*PcX9*V9qJ3Zx-Tw__q=3=jt`U{N~
zCAd8_RW#dhOo%IdVTxbc`zKYwtIsM)i|G74^=)6nj^y38QywtezUNSQ$<5Tc-Joct
zBcnk3$xGe+dd!Rttr0(Jmlo#8ZJYIe){Fmdo;z=xuV~`${{GAQnT7S&w;lhlcur*@
zPr%EquQDw5ZxS)miu-gV?%3Vnx%}s<l^GoPL}J_p<!q{V#WwE#7EqF5$6sqBBDVGR
zzj8+9tG|BCYdh4<%%Iz!-No2^h*MRfX?~D1-vNy^UypvOfAgnn^Kw6rRY#s5m?#tb
zEb7U&_V>&RY4X*sdTSlnPi^0)Gco9w?)NN*97g}Sj~FhU-=%B&X_N9?j;V|rC$5O~
zthiE}^1T05!zCxtUy;9@H7htBo@^~>zO-2G4ZnYP8IQ)}^wZ7!caB-js`j7IYsYi(
z25;o!sgK+l4_^ptnk4_*e^axZ{NrcaXPx8!sPN#~ZR?6dUoOo$vg`8feg2nsF>p70
zyyL~MBY5oMB<9!F7aqJ#X}6GPZ<#-D^(}{a?d_}hDsyCie%|Qc;y#5@Urs{x<@M~(
z-kiCy%ddR#E4!<5#&N>2^TtUmR?@;>)~uc0l)cpCVxP>5i`!UT3yKwszFnv{KkCP#
z^(1K7^)HI8+oUtzSo1WTWp{sft@*IP)$rq+4}JWwX{V~ZU*$~wlxMPY+T4#g2(nsL
z6}|ezKXt;FY7>XL#F>{<5@HVvIv!4wuq}CfV+T|CAG7M?{|eit%{aJa*0r#3`TwlU
zwtLF04yVY9&5m2y{y^-r#>JQ}dGi?tQtAzsHk)_9i2Swe*`hbcrwdE#=o~G-^?5=<
zrS{EJHqIfvf~Mu6Gd#BZ{q=wGf4i)v-PMwbg=zl^Ka}1s4~;ouplGe17RUbZkca41
zUVGod`jthSC%!nVemuyU$zk5Z<&m7v?uZ`_ujfv@qkDEHhmw%b`XHT-hV}csyC(}O
z1lF?fJZC)0{B-@c`c#JM+uL8NH`e%v**$P<SiESPpu+5V1sP4}%wqhONtJw+u=4Tq
zIb##cxN(-%vC!5ZQmRG87Gk+CQlm33@7DWv|I*HeNUm2=WhZ2QwLiY_z;oIJ8?lFR
z@iUv!In}!3in(~w{AKj6mNQ&@*YGiz{YTX5{$82ceOA*P3r@3^`pX=YKUI@EtI)8t
zIcMi?!Jl#xPYkbVU$K;TmYJ|!eeR#L8r<1-4nNOax-}`2-G83RqKb=xY83$=8s2U+
z-?lyI|CwE?Udn7cie8nL9=@|8O(ULvx^Cy@^#QBpmO6+ndh+tT;r){tTGrD}>^gPg
z>O{xuOqKqh6b{}Jz07@QuFaav_pjJ$JNiFOwViaRERgm5zZ)~M@2eRJDA#Ud$jsX}
z^OVPd90zyltq;$K`Q*!faM}}oZ1>v5J2(E=FIZCdRnDL1w0B|9uW7YzyP4naob^RW
zIE{ai;(Wnqo~WarW~7%JUG@3k_b%3@<EXFxahad4y&rccda+GeyF_zuUU1X>Ugqly
z802}Jl;mW81#Iz8NUMG^ebu(6i-9dEmu6_SeEO7sX4MM8H@jGOzSr5nns9c;(Pcf4
z4jnUp>$X?t+WTEOOiioQPp|a0Q0R~PtJCB3jK_6}zN^ZmBWuzR?%&p4rBVAl)%SAF
zCm{>>jqBF2dj8?uKSPki>&C?CZ#Mm5=jzzNT9<45>UwnG+5LR=krw(}nfdqcN!AFf
z_1qd^D_a>a$okHp^W3aepY^m`8CG;LdG7z=yZ3ZZ|DscUALXC5haLIgvg@vZW5b2g
zv^f4&efH<?7S)$&N2|}+CjC@*t=ar%3(qR#U9P=evgL@H^(xJm^(6<6l;vLJ?^lZJ
zxqkE5j&cJ(KF0bNS7Q_>_rH%l)BWek#}(55SMfEM?3;JFblnO2^}i3@E!$K(O&~o&
z=2*=!kH@{9POI1-DJQD`IR5|qI-zG9r+UAinH#0qs{C<V%C$q50fBpaxs_~=-ZbyC
zEk1QS<@%=gr>=y0YA6O9I%V##cG^4bgof{(Gq&zd_q~2Fl>MsLm40|Dc~{DQrGGna
zuGn_(UPri8dqF1S+eD$8v1Pm;4hYPsYjk^O`SbQ?7Wt^jW-@=7(jz?H_TII5AbrRD
z$7WXUAC13kCDU83O_xhESy&%#@XmMPjO>*5iL-2sHyW`{iWZrFQ*?7ssD$0bnGSV#
z7-Z~J&sF7^|4mi3%1C^@>CMv<kqleDE}5;>VYlp?dChOpo0CuSR~LRwvF3jLyJAK9
zx;FFmS6-DpYu58xb$qFS#@!?8cTJ0&kCvPgU0z`s#&{?F<tyC)MO94>U-z2J?lunJ
z|2z<Qx=%y!f$4#kTCbbmS}dzp7~EPWz*&BVu`T-mZ_Zh{t$a_vhhA^r)|9fUZG!6*
z&Ii87J2jR}pBejjcHs~8xw|5tiVEr{*)k`|#z}|VO0wj4Se?CM?Qi}z@wdM<l44eU
zW3n(mxY{8-fb&fHI?*F--<T$eistw4wwkTBKjzt5@kqgA3x(9yrEa|VLvV|47w2^A
zc=kmf#1opGw}%#cmp$EgT9A#SYIk7FpU~njO3P-v;jr$~i!jl-nltNh&5S!)2Acb0
z;<hDDwvu9WIx)xM`JZhUzu7RI-16OG(_2=P=jwH4oso~zN?jLPByQwBKIck=$%C*m
zzo)O7n*|rL%}!4#J|@<AyMAf%>0}PY$uhd;S7w=PlF`=|_76@7c=<Mt?aqC}z$LSl
zrY_mJQo8%~vuqpwefo}%qC4LPxb_Pkv}j9BlAqQZqtwrnc*NiLd9i<Deu-O)+GgGJ
z54S$%PH9$rz!PfyWMa{d+P98sEu6o*mhry3mH+9j&EJCfe7^&tix2&1;eAsgH8+aY
z=z-C)80U3<!C_ICHnrK_IJ&xeZ`yu&BVGCL)=?g7tA0)SaPiWI<%$LgPkQd8r(TnF
zSjc*OQsPp(c|p^^{(7XoxAyKz=NAPAITzlPeNEGs-`m5iu+Xcq@|l{~f6<O_%l-dY
zcJ}+;u$PxTvHZ!ubIWu>m%Y8SzmsM5^tD{cx7^m}Pw!kTXKc5<%r{}ylR%x~zgabE
z3^(_+Evr4@A-lb@OQl@-ZlB<(<y;YSp1OzhP5vx(LHXg*Lq`_g;rC{`u9dgp^c=1#
zdG+^>-pTV8PBh%T|5(xQKet=Y>v!#%&i7KyD3Nj2-q#bB<y{JWBUp9wu*NyVVp~7`
z7gHVg9_8WPa<ZW?ESb~8rqjZ^_He`9l5^`jt|o7hknm<SV`p%Zd|`XDmsM=*cJB9!
zzhvw_De}F!Yraga#s#J0B|qGq3_tZ$Tv&EQDO5~$TI{i4-I*;jwra{8Fj<iETJK*D
z)A5xx%xSXyJN6Z**t3Y`-s{W0o4NZ!HFu^K=k|_oD_VojDZ9_w78;Oy_q<m_%tbff
zW&cl_`0qL)ab@4aY1eCIrr+IAe79OUb;*{qRc%p6uAbD`QIH;caMSJyTOI#$CoR?A
zG+pP{v>PjPRtx=@oZ$P^_4d@Vm4|QX?6$M{V!yv}Lg;RHVegCt8QHf#I^v@yr@Y<h
zYwXCWkzi_a$j(M?$4&i-htKy(swAjs8#?<HU%Q|5HL}uDUFW@|sb0DA^~ExGFJ6jS
z8LCqJruN5OA)WhcnKxZnsUX%IXn3-mt$O!VM%#_W9H)QH<u3Qr_KT@Wf0iW`u3zAO
zNLuI1)csb8^+m-gtt;nL*Ew#e=B?iRjosI&`pWj2a#8jRS<1CD4=En@cAs%?k*pEp
zzqHtkPtEgh*i>;(p7T+>Q1$7%-VJY}wH}BVZOlu^Ipktd#hbV{>F}mC!5uAahRNku
z3m;4F@@5hU{gSup_{Qvc=e}Job#b|RX|@Abw@>T?rL+GsW(EEzU-G=w@Sh<wdtbnU
zAG^)-GOv8P%$3xY{o&yCoCi{lUov+_lo_1oDoC6k{q0#x+EK}zhR6k4l}373Lnhqz
z`4;zdtw2T2`OVxfTPlu9{yzTnzxe`@12(JcCV!sT_@ey(`D+>6OQqt9{cab=e@Q7?
z`1S0rlZiL{cdgFeqB1*~Wyz&^Yd#0^CQAFZx3wrgdvCz+ztQ{eg5Zd)0W;@`E!!<*
zpuy0bw%9^KTSPuZZ5IF0KhyWxaJFx&n)%uN{TGMpt~*`AoF}R^iKGgM?0WoK=|od)
zc;_nL?JnZ)y9@b))Hw`8m$sN||KZts<+1Y7O9zh&WfhwwUhKbIn6QI;!!O~t{?|_$
z9G2PB^r-H}vnejy7B+v^53zW3+T}~R<aMq^=Sylk*XJoS?lIC_bn0r%>3=FR1$qyq
z4|C7Blr=@_yp@VYq34ae0zuUqC;Pl|+Zn{Yv_kuS?xu-TexD93JCPkVVHWqZpKqD7
zE*ow7$F!!B*(h%7@;P%_yr!sJOg39$GDWl_{h?FV@%T;IHow$^y}ciu)NOK8KJ)Ra
z#ayFTo&`U;UCNeJf4q9>@rA(f8SgIt-N>-+!%mqUr`It$bNL*8%JuY}chjP43Qr;&
z?dup@4=<YGY^C6|FL9%X`>jX;FZq3`hNU;ZJ>4@WcCS`tt}=7>`)!|hNV9%;yf-D@
z;ZC)cmg7bb`=Cr|-^Apn?3rRW&;Hu7|Ea%X0_WPDqQSBr%{Si_Th^bq*vXNxVM^jv
z&iL8l2LeA;?`pe#F<SBN!uUOXJq^c9Du40sm=|8YzPA4I=4THwzdIk4yn0c-@MEM=
zp4+`MJC3Rg{CM56scx5nkcM+f_K)Curvz8XwkV|}MtO42p1jD4%PULj{I`eeJ}h|}
zEGhl`a$$V_w~3pL*B#w+R?T7N>*ZXPf2T-H`yBi2b5(m3OMsMv#SS}WIn$TtY+n7<
zV)>TlIKf)^leNR{ywbxmkq%ckx#oR+^(TIh3g^ycUrQ8s&Ukw1*(v2WF6}QRmMYH{
zXA56EMZ)cVgKDnQF(1h*Tc%!(3fZ_l^s#iUZuRU(dzMICx^X}E>6xjD|8D1|t(+pL
z%5zsLQ>5(Lmez(ZPYqsuiYhT#=pB&2b;<fiips89Bge+@hzV1f1oUU?ebJb`A^6~t
zt9q#oHEl1`r#}shom-zjSGi(=qpHZfkSpouJNEF(O!R+s^1wVkjb{gxGc&r*-hcn2
zY8%gqoQr$d%ib<%DmlDqa(Ug#JF|C3zKoplslQCUZ<QkZ<B3`4PqZFPsdB&5&Jydo
zD4V6|tXIz?+xvoVPQSEIe1GhLVx`8T6+e&fc;ag2Z~n+;&n}MqNB8qxdd^1Y3ta4q
zHVFPKA)RQj?$V1pYAz<B?>_bxv=+Ah-Kp(!<-&=QyDQ4d{_S^Jy!wqmX#dKlFXam+
zzV(l7a_B9Xu&AJkYvY}x@^!H`m6DgAr1YF&m{BNkqKb8rg823+G9`>RJ(Lax3%yI<
z`FQK~W%+ZH|EVg^HlF+cBjd{Y+SkQ({)@wU<&G9SI9;OSV|cu0w@RV(<1_Q;7HDp&
zl{M)0=6`3IE*!18iRrPxALjkOoOAyyNNTh_@;*H?S7Q33NoT4z+!9`zq`PlcnrOtH
zxLYCrr1w_!D$B&I_p~{Bc^Ah^nWo@JIYP_3D=cO5FKsvT-7jnTTH&K}=Z6%>z@yI>
z&iUnfeZ9Bbb~z!}ZF9ewX);>RblP<-NFpqB?~VuoBeyx~m-gk99{2vqk|-YV;oTI^
zU7;J(t@mF#ZMEWIQNS%$<6|Yqx9^T!wywrR-i-g~o?9~vHE!<Dd;LmrwWDA3)O)9G
zgV@fN<){SCC^d6bv%2>r^W6Kb!ui}%FaC?3-PPfrlapv8!dz&szNezUb$Pz#q91=e
z-)CN_JQK>-H}&D(x=e{y=To&$ynnst6YA;Rpp~Wh?(fl0#~*J_Nze1(5`4Jz`$wN$
z>OPMY7qHLX;MMVEs@l_gtGN9nbLGP~%6fiUdF{!m4YAv9sa`xT5My_`$%$ck{qq<e
z&4t}XdXAg_G1l>Ov-VY|ofqC0fBJ9inbVVZuSr!=DEZraZ&AqiGFzrOB{>Oe!s5O=
zhGp1V%?sIXzCObDY2~rG$Fd@9{r^nbA9E<X{?%G_6Q#Lctzjj9-gGmbIr!h|`j1LO
zU+D-gL6@0U>IKOSafVl_gX9-hD)?XEkk0-6<-p<RPv-{I-n=w(y>aUI`6V~C{Q27U
z-P~1sPj%BDQ-1S@1+@;xYaXf1Otoh_xUzx!k!-A)*7gFi-46`^E!`Eoy!-05H<OZ9
z&Ashh$$V94FW-+PKmI+-t6$6HQ~!nC;_2Ot4KIFAyyHJ{J4;{9RKDhR$@_;d%-}q6
z|Bfj4ENAAgYfpY%{?jt^QStfAlUq9q->*1#sKeRf;=8!}dkZDI`}=0z|E0^SG~IC1
zqFnK{OAU5^TB$u}%j#XRUX9WAb?jN?OF~<kDy$6;E6z*h?pvZXDcJvGX@r${$>pNS
zD!sh3&4Zt~R=)o8izCXZyxGq4f~3eHL!sBT|3kNGPD`{DyzU&Z;HGUaH+Nh1bYl&c
zpXNzC5i%tai}Mt0W*_9a%icP}Pscn<I{D<|8Rma2=4f<UW$EyWNviTktj^E%)-Nyk
zAu5=wAlWOpTWrUJq8mR>-~8?|>8q+xNQ)WA-Vo_-hRnSaKlvTEULNOJGsiJ-x#thL
zBik%~dVh-BWXCbtUt-gQ)iozCUGd{R`rc)~g=GJh_kp3T(y6ikiv*5rkTq~V^Zt85
zesawxTNVbk$<u2Sy*H~jwQ24zj(L*ptE-mN_3!r5Jg-e(#k`gO`@}jGYPY;EYYg(N
z{jqB6&2P(8Z|*sv@kQW(sm8&c17H5Htl|z>_r=%5+>LSL`*ertX(@kx9nH7Ze9X47
z)F~v=_>9ZH_ZNQf3rWve!}s6rfTc~R<lRR-dZz6Gg7+74L{7aso9*nkgZn0Ro!EZq
zziaZrU3^JWOrf7QOx<&BZ@r!T6lS^HEe28gl@86%;*?qRSFSpBhilt`1CKA%KB=$W
zvcGP>*f&Le|CXC)9~S#q@Az{l=44<~OqYuCowe^AUZmJ<;OsUMx%f10$>g7hFXwHH
zy14M+yOV4Ajl9D1eS%i4U-)9PQ~B(3VY61XcS!tM(dl(Dcc)JGSN4hk$E?>|Gv40j
zF;e|It1YYQ$o|~mMq_EtgDFkSA#10`e!kqluW#@3H;;Q}$KT=C&O9qM*G{8lg}t5d
z{kwN!Us^vpI6E$2na?V_?XLf=dh?eH<yx_HGGuJl(hd79;=8zQhsdc#J9i(LWMy@_
zds747%A;Ej|M;SP{~MQ}k?L%XJ0S-$e=K}{<g8o5)AtX14*r{W%j-f>>fz6;{ygY2
zbZ6Qa$8?cr)x%dD_o{dNPS*)%*t}SqBiYLCcY*jiZl#TzerX5n+_5vIwp!&izv?wR
zh5ql-8#=aK2oYx6cVDzJ*MjM?+T{-d;d|fnEemU(d1_v1+U!h0q17AT<*H8jz<kOe
z(!-<ssYvE;yWjU2XRy5da^>77R|)2ty<ch{h27i#QuKf0ikzdIzke=2Yj;33B<t?_
zzYHr&enwol*>P*()R{6{u1}e_b+HTolhuEwKiKpB+$58vi)?$3UNz)feC1Ky^yba&
zD<t3C_-DlF_SB$mwWYRsP#I_MXPM>mcU7FeSW<LA?tYA&VeP)Ubh90cKW|!Ie_f(I
zy=JLOn8mlFJx7nM_+s&V&vBna3!jz7eeJ%n#<wu9fo<9^kADy1kK}GXYBr6d_QRYv
z>(_jpuyDrtoWpk{SI#e4mMZ(g?kL;)hg@oQLR~>0cstx3CR+Y_;ApIow!_W)ZlM2)
z;s%=u#eXxC#ng2FFoyjJJFvz$Cw^M^vBPEElMRDif~MIRf7O|=$S8E4&Ivz@eg7WM
zkSJ4TwM?irKRKi0VQ8>y+MyjOGbPL2wtk2VmcG7tZ{}j_=)>v_CwEMq+VbLUZ0*Lm
znhuJG_1;I!Sdts|`P~QK%YpZ$(%a`M)ScE?VKG<#tE}UUX9c-0Zws9L8gl$3Gl#{R
z4U9?G&e`sn=v&lg!S5s^A%0<&6|?F5yHfhI_jxX_+|f1ZVcq&jWBD672EwNp>YCH;
zxx9{D^hj{dk@WkjZolVOcO`B(qUft=xctJ8dDnPc9-3MR7*3ydK<Chb-rUFK8GjVd
zX9?$&iP&=SS2cg}<67M~BR(g0o0`D7Z|e`|vsCCjWpb9Emm+A%ulGcz{A&Y8or!$f
zkEhcFH-CAzHrD2=)1T)WeCa(0EEMIN&TM>8A`pJx=x)l-RxYokiVt=P4h;!cO1L9y
ze7Cgx_{DHnS>5nYuXlyM*4G1qnJoFLUS~`{USpV*x36r1R50UQ4hDwFt%tL(8nIM<
zJ83aL?W5|y@U8Ry-nqF~?P=tM^Gj{-HL(0HJv4WfdXYtxz>bGfZ&e=hEvj0q7_&|4
zl-!A)#%l2$ccoNA)n0B-ne(y!dsw^iw1{%MHpY)P`P$5Tl4cqTrkq}SXPwrvB}ZA)
ze#}3<DaV{wv9D?3@A;|*@&`*VU5GH+=)AJF;AvmedzH`?%f%e;{QPt%hGoHC9V=hc
z*D{Bq?grZi$fmkQ_zA{JZ9IM0<%H<TOYDMr*4@=J<tz{JiWHwNVYItdomi$;lrnd-
zV35Wp9tmrn%NuMR3w;*rPTU#5B)0lr)mpyaGrV{N)=%4Z?9zS1s_UQL%|HA&EAm51
zd-uw9Lc;s_C9m&!B*f6X?*8FE0amtmx<_J+{Qs|M-v9LdfrqI(&SYob7BQ@!o4(t~
zK5W->zFR>-T>n#>HVD0sSfls8rq}mua@o;Sxi409d&VXn@_F;qx{_z<of{D<i>2;u
zD%m5^_hNortIWzn%JRpPw9KBQv2@iumYU5}6T5tB`nt$|1OLqn4wXD9<C=5*0&6_$
zrCtw{OdkFH{~fle^PN}MD`P)(y=8Irzx5L0c_|YowfkDQA7%KfH%;q(Nzt#FW*6+T
zZ!QTkcT73$b@fBoO^3NDzdr`An=f+hO|zgv<R#%;)vpV*-2V0VsxQwl{UKwhY`=|h
zVwS|s&o8`q9=k-So(`GOF@L_&tawKUHvfj2o2_3vc@;$bq+VT|#^$^3q=V49rN_>2
ztw>9scTQ;Cgtw;potIBm_B~snwQxp(z7p^G7kw)#_f|`O|J6|I8SzrzlxKs)wqO6O
zgtqTFUhynGUHXyL-J{00(yq9vI<%GwR49M^X}n+EhAnK$c9}mX0yr(NeC+uc&%Rpm
z#c`33cWjrvmirfXDCX!!$9rcg-cQ!>p6TOnBc7YVD<(YQexGT>>2!bJ6OA{cV?txT
zL>uj$QOdDVf34NIo|nDlhp(PX>%K6#Isa|Li=~BK&2bK@mJhnjmd#H8zQmy-{dvJM
z=Ld=GQ-AU7Ys%u1;}RCLxj*Onl8I*ntu0-8`Tk$C>VLO(&y?Dzgt`CTU*Bhy)N@Yt
zdEmn76;}**Z+N%k^@FpISn4KhUH>jno@tVu>!U)cw$J=06qODocs^2(X`dG(%l9o|
z$BzH<&-0xn`k3bmbS6A$KFE>OXLo(xB;(L$Pqq{-y%j65TDft-$*E=AZdtr$EMFw8
z^NZ0>_}stdABwHhc4xK9+&ZwaH$TQi;#Mkiew0w|!izl(-v7?zcNE%g&+OW6U-oK2
zu<f~XThzbG9%NZ@_hxLkag*ot*XNhNwXWM7CLwz~;7{v+nSD?Frky+ew;`6{avwuY
zQIqPsfBJHKG3iY1>o)H-nR<9$*|8lasiLbE`NZ#L$_;I+<ad}=%=ogXjbGjD%7qeH
z*Y^6jZ;6kqTh97#{@-X+V<pJKlGX8KiiOGkyULHh&YgDUOGI_3!gIZ|AH)7vTt8j%
zfouI_<3|pqPlF}AoK~!>6y(c%YUO%G*xhpayY_qOW;)FBN|M&xM{`-1GFdG0%!uIR
zIy-ayCZ(CmY|l<qFfb<;&G@vk@bpyO&>5>4c|8^T%=tYcX4F-#%h8#!A?L-*SI77!
zDLk5$^5bQeo@;E%^Q9-u@08^kRs{1ecAweGd}7|*-mbNF8U|N3{+{#H*!W9PO+p&$
zqV+O24W~7F@D%*YsN>nsDC_@7tmM$H{Y%QO8Xd}xdtb!!>uzcIraiuiMhtpRa_m=r
zxqn<3XlkDmyvE_UWz$mam%plRRZde%Y+AADf5$|tXX)<_{!LW#I(#g%^Q%_Z6VW#l
z)~4UE($c-HEZFDw^V!Gw4}!lYY|wo4SU=!zpyfgh?R73C*B3HxZe=+qIqB#vN6A9p
zgZE1HOs;Y-*Wg?6GiRSy_=&z%UMtsEyZ7cBiMDFp75xx)vrZ>tl2MdrR!ei_c`1v@
zt<#q6cx5tex3}5dUuCY>>sS6xJAY*I>4F7{@7TqsJIkKAnybrn>XCMyS%8txsjCc&
z=g4F-nEc%m8~BA^r{DOp@bwbzr(GYu?49N(y7<zG3$Dd>%wiWex&D9mJxWKQgNbwA
zS<{W@4fBK=?_E0AIenJf;gV;<`cp4#>t$+VNS753xIUqM!m*E?``W%$t4VYCX4do{
z{226@;h*@Fth>Db`c$sC^R6^+X}=j>|2a)xUe{S)|Jj4$Cn=r>rhiG7Z#?<##f7yu
zX0MteULoxD=<<t0=HVxI^otd7xHM%P>~{Y5uX*vkP2G~GKBjrRNpTj5d9|zZQgmq1
ziJcSqYcwPNc=ZIbs=6$fmNw-SyzL_X@5t=)%TFCywB>x-k7Jd=JU@8*GniRbLSr`f
zKHvMULQXkwf?BfQGiJVau_`0hsg@s4KJ6=gy8FFX(6t3g2L)Fd`XAK%o^Kq+bS$Dc
z!S?9y2hUhK?kZ<Wr%t?cxnj$aZEH9fPJGjIQ2i?QJXw9lUj-NC&Ydl13{2F&>~if6
z&z9fzYyV=USDzOdlyCbkySwOS@srlc`m1M2HO+l?uyq#S?HC~@j-^@;iaz9bF+aV?
z$jUE}^6=fZq*pBxzXMn}-+FSLRx9_MW33!jD$8+HeeTB}SC7pL{vEA0_39tjZwfou
zEB>4^yz=zyOP!lCMJx78MX!AR>CeT*_rE`!amCDk$JRaDT#TZf6!$%!zHR~Ui7&h6
z$`)^*@~YD%>A-wh$=>y1YS)*ZI$rjt!c*Sk{r^8@i46_=wzq{^EB$W0;5er#e6xs(
z*p2jBO}Ept?;6Rhy(`PVmWAy}nL$V7qfRG7r7O*oJ{|L&rdh|R%M~Sg_yAvEsg2u)
zx48;&oOQywzh{R0)V})9X)o(GVFn$A9jjT)v!Xp_JuTTki}i-t@5wu##JvrAziY)~
z&NUyHJSAj{0-oLc_bEH<T}X>>y~bRd;FDiYyx3fx<CAFGw`F4^$GYoVN-DIRHt2s%
z=D1-dTqFBxe)NXo<_8hCtv*z2y*7c3bqo9BiGq8U+?kVR|J$JNZ+nZ|SucT2HH#l@
z)%ZVq)}{5&KF`a1^GS2o&#Ytizc?>;pVUfUv9ax&Ue;Fai3iR*9O;_H9J>G4P4iQ+
zZQGs~wSQg0w)V*ppT^mqiJmenY`-|{N|R0ZvTlAR|7K&$h6&T(dU!B2=-&+6tG_q)
zwkPi|S)D(w-`skWZ{Mr_;;8vD_Nx7{lh;D3nVQmCN;y*wcd4j-zn68rKa+2LFst~w
zzs&d3XXeSCGn~XKx^~{<f>+wdpW2EEMS8xQTYu$VM_tm&GNH0{p4pWy6Zu|7oXyM8
zyH_H0DfQ;^#`gN{*I#QW&JFW#y>;}Fwwv(!&abz3hr7<2|0M8sW&XlP*IlxNHH(U}
zuY2<3J^x~J;7Ic2DG{;d7E#ITBV^7Tsf#>p<n1)wGxU{$f$fW?JAUe01RE1SuUK4k
zve!gcLUhA?xpXOxIrGl1POjiw_Fmd@ZBWn2waqR$pVWRRbKjlYDirbc5ogxpcXbb$
zjWY8}<wH8ImRrnueok{8_a=v^BUhFmuHn{PFzvM<<D^e!i#*E|Dz?W-M9XeG5xCdU
zv7*hAzv$4z<|jE-^Gyw07m7(GE6y+5nD17nc$uH`W|&|D+s){biF1<viND)9kJI#+
z)x;)F`>pyp=4W2*6*+W+dGcKqWsyqvW_F+M_a9}VL#D@Vzw(Z$`V?P##aacmtvZQ^
zCp<9MbNupER77I2%ak}r=BYEjI=^4YtF~d=pMOkeSd>iWW}Z-*vSI(z2~tYi9-ogt
zXE$&1x&^ICFLEc(ykC=*tDLFU^Xsng%$MFd4~#kQ#C-NNnB{wa-KCloK9#WQ*u2E2
z-9<AKw@iJ}UL^Zs-<}UCU9z9{Gn=YeNi|-wj4JVNUFzAKcVn(hY;^3b&|8v1>R-zn
z4a;ZUP}|%+FSg3p{6g<b*Nz!UE<aO`eH7}`=-yPbDC@pq?etk&dxUnI@k$E`f0?uP
zBgebScQ3v?2-qaa-z1u``{C<d8-<zl`(wOgPyKQ`tj6dmGc8#AymNn!Pw?a3pD)fY
zF3%TG-1@cn&&)hq(d!eR{Bds)%g8#KG4amPOv&kcFWYYVQEqYTu-SFa)QL9JnR*T1
zZfw`CS|S*k<)4{$K`62G?xU28`qh6gM7(OUH*T3J{xVu`i)-^SuR6)eMc%s^&(w+Y
zw|r!-f4Ske;ndd#5C0Xe-h6ncukx&i3X@lxl&@VOwRF|@glWwzXDfo`u6l;9R5w`r
z!H)6yzAKwOWy^n>Cp$-TZJ2bt<N(*k>km8K3Xe8>sXh2=TXFvL;d$5poc;YOMm2Z&
z+Q!3QzjB`6QoD@NKh56h?D`D}T=6@LQ>XLWuLwQ+b^GDPDuFq9yKS`=$zSH=TT|f5
zutevHr{-M!$dkV&T$JA{^K7xtzgnJMXRpt=xSsFhCEHtH6IVwUe3dF^Jfd~bv-Yz^
zmU8IA#3?UKxLz)vs(beEVsp7ma=|a|t`lCtu_fyNw<&BtmaMfe^PJ%BB5l5+uVu%I
zicgXg4u72GaJQH1y#ADcn+n%jl&5j46r9dH5Efp}t)gghY|Wp%{7ANXpSx!Sw-@;v
z9K7MMae-;=hP*B8?p2fW9Ctjvuc?`4pDbn+JGXHD+a#r9Tya-T`vSk8$T=`M;p0Z%
z)hiDNEI#na>)po}kMduLgkQ{^$!P3)*yh>B1eJ%pslDy%KkaibX}-g7X_FY+M5!N1
zPmg^q4%oi)dz4+#r{Kn|-U8vQhbmMHGkDt`sz3ACC$rz}#HJ#7VcwUM`lEU!+NN+H
zH#@lV{`RIr8xm(e(GIsiw)l|tw7dRmb*pbIx4iH4b;n(4r?`s~U)QnEc^fc6`dW;H
zk>uKUKJWc!PK=(Sdgzw=LmmD@6L;|EPL6xN<s?JaUyE|*<N7C^A3VAxJYzbe@zc+|
zb3UFESJR0!Us_qX?A*0`4t#9x>pr{{%el7J);XZIeb>p?oD(yTSc^P6z4p^hSN|K=
z7W_WLe)`%SSC_wEA3uF!JoU`%JJGgsMM_4-_ZMt++1ys>oZolw`nT7A56T_R=?mzJ
z+Oy))KgoSd_Wqdc5Gy;$|9bV~Lt)3i`RVM7SKyMnKIdameG0q1$I}T>Z*DG>f4I8s
zw?YlmT(!L|qK7gXJ_cpJ-{8E)Snfq`;kskdA~t6u+VjM%#opfBWu|kU=jWF7-;FD0
zxTiYr<@%~_%sl1xh8gveS3|V;Jek{tLv!Xy@?Na^qR5!qu;>!g`F0KWW_R_Ie@ruV
z&R$_j>zj1%ZqD@LNU6!u27J>Wbp*^^7q7PWw7kbezR0u9ZynFJx2^A;l=59gvD0VS
zw#iWpT5bIaFVyG0j^wU*Uc<CduE*JfEz>5gH)BixQ^vBy>Id$7g(qk*O*_bU)LQ&|
z^?q$Zg`ghBnd@)0&7HXRrAf;lh4mB89`TYB{Pd@PorvSadMjVs-#)EEVr~nyYd#75
z(ba1B_;I%nSNGYy`4@^7IQpbc+{*2px-;E>**S+x`@f{#3!am-=$qY(2YXpGH@}K9
zVPjg(7r6WDzZ~O)bLaT3tJQz&o5Y`e^-jyO^JjJ4qw<b?F%9^V`><f2>i^lxF2=G}
z^?4hemzRm}?eMyIn?EXP;#ZH*{`+_L8KqPNsn^S7Xyob3%#rbQ-8A`J|6X-*)d>$@
z<jxK)?Yy;r_hZS#-$x^~pB=weHpyI8Q+0=0Un)n^w>jE*(y2>>_GxyNc^!4DjXM2t
zMN<D;J(>Ht>XynUBIa{1TBJMaOHEwiuBNVEGB)As%foK7r`El6w!EHYUwCgG^E!FI
zpI4U1mT?t#iBHk?-Fol%LC=*;C(a#JJ-0`G@%Lr1vKcXbQ#VXr{$us3+ncPPEr0Ny
z=kE-YZST{Ly;yT*>-X=ep&{=t*>(m#vN$Pqa&PtG+F2G!oPq(H?tMG@M=tEb&i&hs
zHk|hBF7?!D?~;8n_t(vaT~?1Co)D{c7gkv{W6G?C9`knhxM`}ln?EmJa$s(I?2<c;
z4^A3C{@dv|&6sn>mL1}vCYxr(pE!2nK}hZXPX}8a8#qqNiN)C*tekzzdgGkr)2}*N
z4{_|d9grNP{fOa~(A`^U*2c5v+fQUzz4%r2n}}17Z~Nty2XeFAj(MUW{&Fi%kn`%h
z-3f26J>I-{SM3`%m$JLxi<ma%EMm(IUh7=^WPVM-w&Xo~=IOsUa>1?YL8Zyd)&(om
zT#lR%{Ou~8xQ*W+pkM2w=H0y+8+;A;duA}qV~-bHq!s(~bzl9m9ql=rUKajVdwpBL
zLSgHt!@Eyz+9-Uf;^zYUv+E~K2swB&?&Uj+OV2)S*tfpkPj!!A+@Jd|G#-bpbbJ)H
z=uDOSlSQWPowZw9j8?uCFkQc1{zv#-qm~4VZF>Suf@)p9h&^mO*Tb`P(sSo+n^VKx
zt|s0MxK(ESBD|pK8GG#g@D%$)Vn2^Qy5?6JGUdJF&*MwdnEWU8W@t>j|Kf&0dO=&u
zlG3Hc6W+I!Ea+Fy)D=nW-PQVSk6yC7NW+P`g-eazJuR>8;b7Vxwa4kkp({MakG3h_
zT+5X)dC%4m;YOxrpXXV(dR6CdDxLfw?3M{HOEmX;&7`0kPAjIY5Ba!VHgWy`y%$rt
zUd7+_`_6su<cak13`ff)bE;-ezAAXMd}8q2hYMMapZA`~@Yd}=<20rF+tWJnZE<?>
z-+X2WI=+5YAzAh_>gt<0elt_#EB2&cU_TKTo!eQsaGl>TuNC)pE?yy5b9V21RZeXI
zssD@5)z~Jl*r3^)bKxqZC}+!jgB|a~a&6Ch2EI(Yti5!h=RC8e&YMFW4i<}77R<Wl
z!eoAU`(yk4j9EM-3pvweF17l+yO45xl2lUve77G}oLS;?JL_2<?Ay4-+Uwv&tzDAs
zCm$@BvPY(LUp!0Irw>-^JMt3(_w3x(mF!UFcO-~6;ljz9)NjuYznK`?{_30Q?e7Lp
zZ%v=?yr-|9N8J5Jv~1Cj6_2z{Wi=P_ySL;NUw!qQul~q}s^V3Dy6YTzgHr2nc7D=Q
zU6;OQiCxI%!%a%N9VTQ-{mNebfbIS2M?WtX*fcKL((*L&nL}Db4FCG0PZH<9W6zS`
zEz|l!X6421bFW@W6>%T>byPaiUTf{kUsKIicl}><Qn78NXp8FJo8p(|C!M)o<hMR?
zxzV!gu^|oj?ccFY$&EH#Xm__}VK?v5FFSnS{Czj$==OJe{&UExF=a6|F+{9rvzd8f
z4*M;`CSzs3rw3;DilrWNb~)z0ccs(veH;OSALg!~>(}vMg@bI<U#$&7rurM6AN+l@
zCh}8gBu9?r<h#fCzgZ=m>)-lRCv`KwgYsn)i8)(bj?3SfS@qEUV$ho2x@mP6)Y(=`
zB%hz(nDwwTcV*#>pbInpy$E7C#GZUCOk##a;Kj7p8xGe$IBMGAz5e@pp6sPMiy~TL
zlz6U4ncNdfRhB#wAhYJ+Y1aQ!Q<JA2e`UM3P-c(o`!3bWM;e~~X(kns=Y)%nFOk19
z)nWOIt1&nCHn2B|8VA>UiLp#S%75AJu+Ju&DSd}i;*;BadOu6)%Cs}z&s-jUe&XNr
zwab3*;Xie~=fZYL?$sUA#W${U?b#D*o>;MFv(@@@JFfS*mHVul#BG)^m8U9yuBrWl
z!0GvmcZf$-%n0EPl#+gGqjS~nj?Xl^npZ+O>z6P-mS24IN_Qpec8Sd37rQ50g!^wZ
z*>SgOm8#m$D8`EhE~kE||4B_Y+_6B=)-7v6Ws!J-iAR{P<@@5GJw|y!u@81`@4JzZ
z#+N;H`HnBs9$vZY$<1+{C4cs(Lz`mvN94O)J#FV6bYZ1hs)q06b4$(``3UcF>_0xY
z#7%lz45w2qt4rIn?+I6(_O1J{Z%yr~6c5p_p&6$mj4XDgy*X?8XTH8s+wEQ36*>i3
zAFWvY@X%KmtxF}79(VMn%yaN%Y<l0Sm-w);?fSyqM+5Ve6?Hd?P1R4_@4j>Q3xhX$
zH<l}zzdyozTETu>AG7L*ork~NX?hs2FIVmA2gS7KlT`oS`mA~>Ny|U0*ty5uTebDp
z^vCaR8Q*FA+W6SFVXydoBbOBsF)8=IRGV=fGq9CrHhbljvrFuzw{dy)3j21E)Ogn)
z>&nhr2`pdo=zZxm*IQ0vb%L8@{~Cn_I4m$I{8P8#<-(WKN~NCiF+X!ZExg8ZR@{}3
z%LJGz<mW#x-u`~3M(4{pCN3*HJr-P;KH-Z?a<J^W&lfI#PLwgd`{5f$(f_G;^ra7N
zpPqa6PxYzw7wf);*GtNa9TZ5K&OM!T^(N86!}+eORJw294cKqW*AcWPCjED>L~elq
zW4go6n8wALxyM!PUVGiU)mHUA{OGA0J<b>OjpV*|xH=vbpUhob!!U>c)!99NnwR7{
z_uf`|-c$VY&h+_SIdjDBpPK&R<fPY=#Lrv4^0eDARofx^i(l)(pl|WHWgidi`pX-$
zZf40H-b1rB^|xk8T$GAoOHf%gr*!eYh}i|#HJ|_ff6z4c>B$fO7X_;r@`mno`5p6$
zM`_YOjU5w|80Kr8?cMv~$mh1SJNp|&w!GLI{CJ_!vj@j!H7`5DAsNa#Mc3M{xz;~t
zTfo!kz00R$c{M0>aTW5ON<Xkp#`>N0FWxl$?zflUezE2APveMqUFrXV=fBXtL^hiX
zKO&=iP6Q-P+Ntwx$3^uRcB6|Mer;0Gn0>9O!{g%LLN$hqj~NAPV@u^Uj=sCM&iwPI
zJIZN}CT1+t{Pi>^b2X(Ii=Iz5H+_8jAKz<@-%^L1(tf{oJva42<n}{{c~o;Oe8Rm{
z=csP`zjoFvjU$N{T0ccRk@=r{;p1QbZ0!>boLK_@IUlFhe|*Nt&LO+;@!XOgAHJ6y
zo7A~GQ(IO9Mr}}X`@K&2N`}`AzIzK@zl1!P+Pe36&Pu(TmSJWs0mZv>)6$ExY`V`p
z?cMa(^`P`KUZXpaA6sAN$LT~&?l!MuW6n{lX;Yn?=gRzd<-?|qH5U>!p8v@FwdvK_
z@NFWy0}{j-tWI}6mNl4f{PM}_O}Uq3IO`navX{tz{K)hrmutOfMWN;9<!o=*_jk_X
zE6`C^4V=-L@O!uOu4g%4nI<g@cYmZLk@j%ee<2%{HHZAN9a(h`aM<e4=i+%2`%8f*
z^5@c)md_t%1;oB6m{IpD_RwnG$=f<|E0@14dv5o*nyV!J;*?r0P1e4f`;s;I=iWVX
z@2G)?Ufk8t(#@*_oFZP<>^7F{E%aQ~p}bVtDMHc6%==w0bLu3&v+u9}zx6*%g|F!<
z-`Nw4VmE8&p4gx(bFL_8R_t#<hJ>Dt2QJ>a`Ct~C-oO6#_7a!s*()RupG#PK(z@l`
zh7*}fH=kr(q9pj)w}Us6T}$Du=ER>0{I;8(H!=GeKVnPXvoyR}Qr1n*Z9~}qotuu!
zy^V15iM#*(=Y&k<q=+ABYqjJ&PWwKb^I(lv%OkDB&JH^!UR~S9T9|U`X7n%beuZD=
z!5))Ni+rhHcD^)Om|Nr1_QN)7g0|m~NHTol`6^Vbo#E0AmfbVlr7|YR=EP5#XJGxq
zO!o-K{TPJ?hwz=oFZEce8*eQ6JvrNax|-bFq!K;8{2H6}Q{7^tncJIVCr(?(|D{Cx
z>wiJTOGU}QgVQ4e7qN7#yY}{l^t`LekLynPeU)3Z%T3)t^ifRcij~WsI=`N0{Cv_G
zagVJ#a^HIG4oqR&o-Xy<N?UZk;l+K1b=OnE_A^as-!8JMQf6g%sh_Q8X~n$e2>TVi
z42wGV`f)6rXD#bxcRcM{Ps-)zVmr>-R6RG-D(-u-x#vLEg5ILi?3BNjTiIp^EKuQj
zVcjhu7I}&9#W$Xszi(B4Pk$>HVw+|w{4v4r_}^ctp><-8I)^WxDVr2kxypM{{K0au
zOUphik_vQBNSJIs>Dud-fIE!Q*QVZ__USxt+VYn_PIF{`3Qx9^5ig!!?DS;9$<3Fy
z@Yt5xOnYwF_~woqgJ)}XOx_#2?v9r2ODC$ay?^|F)t%c%7Z%!Nh0W-SF<W;?b{5Bi
z$fyt7qXe^dKKy$keVLl;YX|#Ro|`|(t@^Ikk}Bc)_2Sg}LhG3aPqY{*3JX~AEUv!x
zbHi5EY-aY@IXqeiW}f?d%qwJ>z|$*M`YG`j-4(u=TCL4>_%7}@f7KBy2FuNtKI~n2
z_G`$C-7|j{&bw~B{mTZMtkp|TPuZVpRJYC2?~%&^^}w*>D@8U&1`9+-ES*usF#TTD
z%&6Wqz8g0=eBGs*60~?z*B;F+UAqdVbF+t8u$*;oUGo3g*FrAO8rH4K&cPR^zHFbk
z_S*9`4gX$l30)WWq#-OIBdR2Sh4-g8>+(Z)Tf<lv?zr}4`OVvXPw&p$crUU<xVd!e
zns;h;LbFmoZNH|QT(SRDvbZ+?Yx(Y1ogteu{_Zb6=&@P;j+A8C$y;A$u8;S9k!jj`
z-Qnwp`C-aREWAH2?*6{~{s$4m{^s@j_5R$yy^h6H$2wtpiJ3-}uDrCw%e5|g?h-{y
z%?<Cns=jjav0Qnd_2@1^;Ws;8>^FEnC0xD3aI^jMX-Cc6O5=Vdd?>Z})m*pq0M~s<
zmQ&yR=YJ7NdGLJqq^^U{59rQcu<*k2()perW}2=@Tf}MgY_U}@_YCpX8k=&X8<!Up
zoPX0Zon@5~n^oP30`bcIYeb^A@a}Otb;JDQeD^<ZWmFj7)$ktnVc*doXSCE_?O^)t
z{1AD?Vz~=_9!L60zTC7qq~x!@kVPcLedEXFZEotn^FKa0u)lI{?cbH#)OW7Y;;^6m
zAeMEt<^9E*ZG<As1b-~G(_Cn?O*KtP{pT`<jFVI6vHR%mt<hBJn$vN5ql#Z&-o5kZ
zqs_YtGVTQhAD66?y7-fkN$Qo5*82s!w-p=`kex7nQDxP(geJEodbuW2%y;*GP>{WM
zquO=(#=Qj!&q}ZPc|1zk^3YV3|FVEz=LMe%PhnFRxiujh4>`QBQ#bsytNWGTgNa)w
z<i;xeN_l4IyIF6|?Wk(YB^xDnOka03Kv8mP_O+!qV%$BX+k@1TB1PxlxsiKR&`ed(
z&&1|>eWj9Ca^2&5E{;AcIhUQjHM{Tn7sJ^J5qHn|u27Oq<XN*|YY@|U?RpFS^-C5z
zM|Al=c`WI;x@p6dnG4+J9Pe)}Gyce`#?NdU#vi?HdGf_uCmFBLOw@bE_5JUa`R{UG
z-HBNcm}(lHb?9I9*GE><x_XZba(YSj%AT>=bpMdDv$ST%jQ^V)r(ALHExWLB)sB_j
z(Z*UyuFZQN$n{^AVBGbuV8f#~`?Jn(?J`mReqHCAOi7`U=`YP1iyw}i6$S^{_avDL
zpDbzB*u(p6;%AGq`;}{Zf3&aqCu!tYEyGuO=UYngQYTN<HuH@#Ke@8`3%Qs4)m@_4
zwWc{rHZCwu>!C>NvLDl4Ps=tf>CNh~|8)1-F1z!7JB4q=8_UmEdSia_hFi_8)63X1
zPJcJNmSxiK^J!B1qq&wx#4=_lnYRB`dlpnG$e1&`RJ4u5X7=2*1y4)wzb)J_S7~~x
z$<4|m$q!!r`19;`yGP@KLWLd7_a(zm9RK}&^M-{=Q-4jLcHo<v8N>By|1a|Q7E5MF
zSUbmgPXDegb)k~w_VX?8zxwEL7|&0xUE2Ilto>+bPSm}y%ds<~^%TsCmYvf+_9fZw
z;8B~{$7iy0UDqyr`A=%g>V{8-E2?KjF}8742*hkZ=Th#}_x7US%R_-HZ!^!ndp<%k
zMyZeI5ZkT&S$aq2dPv%a{j2h~?@Pa^wRYkMZ?8grzXRWWSDepVJg@G0!#~~Wjq4>i
z)*qCQDt=;|#$Pvmf#uY<MR(#&)y3Iflzso9*75yaV}^A0o4U&kTNJyr{#Q<6o-8?;
z*+Sma#QOb-?|~=29=CUQblP)RFu6V5Zt(-hpP7FG71sM`^UTrzypnz2g93NXMLw2I
zx)Plw^)uG>?Q&Twx*%r5!p|o6*!X0p7G+g_R_2_XeQL*!&@heTI^At+F7bvuoHVDW
z{`d7n3(arq1hn~sm6Q6Sf_MBi*mB_7=QooY@?t7ot|uQlS`e8Vs?a7nWi#i5U%#?e
z<R8{rTr>a4&Fe}+H`n*w73h%L6?9iq^wxt4gCj2%ooSSetSMv^bkw|muFP&i)~By6
z4o=%jqaAy1_gnfcNZexHz<T7y*;kAHtLiSkZvLX2^>VEOSLg4iOx3Nn+$-aIFEPD;
zUtBYZx4ui)?EW;T>({Q7t?*Slmf*Y2v!FloO_R#6TL)F{=Pp!E3)-8|xx&!hZ<50t
z&-wim(z+Vr<rmHm=6iF<XG((5@}eX8x4&%q5jN{tm>A2YZHG^;`y0FQnel?$Ge6aq
z*EC0*y{7bzDP<F{fkMZ(kjv3WRoCVyWo}#ilY{B)f*Ch2<sRb>-)xm#`sIlgyJB^D
zRoG?D$lz3QPKHOG(bsQ(QPgsX+dXkvwseG8yqahCwAXrq^_#P|>V4z7cum%)FRmz7
z@!s<88B9S2!TYmjFFhi^DoN;1=CwBajaT?oR%-BfJJwl0l2d4y?pH4_;wL72LaI=p
z&O4@WJ=+&Pjtv_&G#@#6H6<v6-LCGq&6SJAmPJS2?>ct)tyY>lQ;NIvOm>%?4WIO4
zjy;vPJQSWZeb04?wmUwTZp~NjN}ODuHOD}^W`)*nrTOajF1^~ieE!S_zjnKCOEh#6
znEus(@#LZ{#_RQTj_o=!>)9p74Qs7;)E@uhAfOfSYHI!cB`qZjjm#pyD&2_wAFCa+
zt=Mu(d|p`k)SEe9CPmEY`QY0lvOi;Ya7uxmQ^e<6>aC5TH-)v${__=YfA#D}g!3fk
zk7XC6t{H`uKDqbyy~k?)x5a-~<(8<IJwE6@v)BA;jhb=jvKLRnZ~R)5Cf*y#w%%A^
zN#46zkM9Q6ylrEuuh?rh>&j8DcVesW|7X9-@gsUKNBZ^sx4$S9Ra@>%H~Dt-i`%u!
zO?-}0fq4(|7w?~bXV24Xmp`yD@p1`;^DP!yzvs=bSx*8dO)k}%lW)u-C-RnY{p$83
zD^fJ_9cmi?URTrievuy~zhTXh89h~elWbVpb#x7Ga>~D5_VxS3mx}`L%xyVs^}S+J
zY0_!-v`I~MpWa0;^g6y`*CW>YQ|_OcY<##j<@+%Qdixek%2K->dBJ#=<HJW5t6F8Q
zUcP<eGUu+J{zi$M>s9}sU|y{pz^&13dwWGhM(3g9(=YDpGxa{?d#*d*=uF}-iAUlJ
zUpMcl4g7w1)t27bTeyQOEz2e?Kl05``~0(t2+<PV%D1WZH|)=5Dg3kE=C_Tz`OWti
zDa)hM%`aNkTxGXP^18P#YSWXA_6hrH1g<{4Im2+0c0hY}_=Ao^^I7$HHYGmIDVpRt
zKdR%E;ziM@zuAcjoA>X#!0>@(>fxrK<#j(Vq-}_967UOs+EQTM>)Rhw=MnCd`e|LC
z;!CIWiD#9bH{bZP>cG?q|6YFDU9GylruNidiSy-uI-4ZFPUUA|s=uoKKri%o-l7|~
zFU!R;eNg)^tnRS$q9z-|?V2-{OG5uXz4;=a^G$5yKl`w~c1J!3M^;4gKZ|Jp%Oz@f
z-TVBdt>(rKYCGpi1Z|UkP<MK5Y)+QPiMOFPEXV%`>Ceg)t6R?Je%k6A!-5x&wagDa
zF@EzyyXXLC!s+S*s)D{7kIvrkp;~=z<L^K7Uz|Rur1s-pyQJ<MezAD--;?@Y&R}gn
z@?*<0+4&Edo`xs(`3Iesj6QQ?igxM~j_|`%PN}zF+mpC^Uhveb#oK?q+4tz2Lf3=F
z+YL-rRnsoLOxre>-Qx>$^6i2h3zMRfub71WKYikl$lZOXU)-PdG~U72!_cw0Y?D;y
z^5=#Je*V3GMIk5D<Z0^<maQUheqF1%Qup=w@!HAdi+8^Bl-@AsoY_><^z}IvQ+~(B
z7j~uGI$7~Wi*bYag7qH7zJ`gjS~+$YGFA$GP%(FZI_=AOAxDQ<n^?bFwq7f<&hVFS
zk+fgmt)^<%!nyM9ZX<)GrDlxXg|(l<@9mnXr+9Y12>aGW`4#8>TyJqQb&bpK5_G*V
zXW{ED8bOJ>6jW11ZG}JYiTr-4+@W;cdM=}%-9O!u-A{+~6y39ak?VG#+1Mc0#FzUR
z4@+~Rf+T~o;s47g?*Go86uRY}?So4R3x2n?E{*#&H}LhUPm;@`f1Th6E1UE$tS$G+
z?G@d-A6?0QkT^xL=+luoTPInDrEx?ZWZcTbJts}>zU0R(nHhz)`ll9V{n~uUI;)gB
zR`-|o&yooqj2jOr<Tqbj9m<)V70mY_J-b^YZs{|YV{)EvWLB|weGQsr_2i9r>f2tY
zB}+dAIBf|1uu}8v@vGY3yF-4m&bYLe_xS&eZY$}8Z}WCCPgt+*<ew76+4|=4TfV%c
zNBsvFC%%sO|3&b>#-D9fFRq*@xqES)#t#3k1U2iPM`!un{@Us|BzCXr$x3>@z3kb^
zBTiydui44zmY&n_+dN0YtR!bU`<ikyAvT8VdS^A14k~|RVrY4Nvhsc8haRT>&rD`~
z>t6&|G=6m{%g&zimsjn5i51I7e)G1XV=KO1GcS4ebQzz1&Eq2x6V{u2-tLjBUO!u4
zUs4bw!_H6BBou7gAA1_^-zBj7RaEY;d)KF)oqX5OPWWBvl#A`DYF+>H7Tm0Su}#~r
zu&Mkvzd_6eV-Kx~C*!#^^>y_oc})KQPub%~?Uzmt5rcNkm`g14-43jMWP1JX<d4fs
zge>p&%zNXt{!_E)5o3d}p9>2FpSnzp^_t{w*Re|NXU(bfvi#j2CT7)nEw%Hny!h1N
z-L_11zr34XntQ4jd6zx&Je0RwVaF!>UZGOncp-_Y!b%A)>5_7upTrh^P?>SXVcB-u
z^-PLIdeeVpYEI2Q{V$_p4tG%ekAF=^gS-B=Pjxq4KP$O)_dgE9vv<E8zo5&IVR7_F
z<i>dsOW5y!d2k_`v*k_Ewkiirxp43QxBTTi4F2}tiby}S-sB1M?jY^c7u-VU%+?KA
zuvC0z>BJ3u!JigQT`QXv8`+c`c;INcy2ja?@xBX09NsTJXD?f+6(aYEwPeRW-sT0~
z(Y8Cj-Ou!CoY2cN+g0xI*6{F#a})M3bt-$5uKKltefPG*uRG@p6nJl45n${i)+U!<
zclSflB-#1%BpRCZkBDWoCcaEqbUriRFur->g4I_YZuWRDSt+A+W4+qszJ^ssiQYD8
zMf=yMMdb#a*xSf^bVfwdn*O|%*Y(ytTzm0P$1~xAAfG?}yU+IDytyd+Y<0vc-G_ay
zB5wY!$5!YRDT+OPWHhbg^Yj_k(S~dR8HfL0Zko&6Hu?M1X}(j!Dl&ZH{wyl~Hv8Eh
z?b?pXnN_nE_f?n~PcZ)bqoMd{k#>iLz^j>OjWX|Uzb1Vwe22Gt*JSmu$!F^fjwg#Q
zkuIEXGEY6$^4R`8MSZc^hyJ%{#7ON>wU)i#thRhcn3hK2xo4h5^74}dk2O?(6ghAH
z<ei+{vVa@kp2l?FbjynQ_S#79VQ)Kc-THXBPa0~$@Aljl&fQ^A|9M96uk)9+&$f7o
zUR>h)!ta6ct>cZ6i-lipjW_#a((JMFaXN>^k-cno!VC;A7Onf&ys7<+?$7RbCaN~_
z%%4i<-i+xfb$?p>^6b?9M~_&JZ{BJ8+0^|3!-MzR?PmwrKRR39D<P60Ve#d_;)eX*
z=USa|fBmKw>uP@U_#EvbbTsJrbi+8w{Mr+2?S-a7Y41HJUt7vOX--9A&w0yZ3`QRX
zmxiae^)Sk<&^^2?E2LVsnrp{)zgJTk=1rb9wI(i?f6?WAJ^9j`_^i$wcI=xQZ&vid
zapq+vrD>nj?PS*cc(wcFFXx+;3s)D<X~@jU?Q4D)zmj*xp|7_senvKK|I~4<Dsl_&
z1iy!#{PsPfi=?+3-9E$g>(>ma=hGf#XeXppZk7%esgdgX__I&2uP@#IdD`QXIV-w(
z&62sAbiO;zjcDmD|Eu&yZ<CwuHlE8b`P35k8zhS=gspZz73aV3t7cTfqjPmGYo9cT
zZQIh8Y1m-vGrwo&*Yvq1V%odzmU}-c{Q93O|FTM$@=}FwVtt>UpZrmo`<*?ZyZ+zX
zIGqR<?KbbtHu9UQW45~ro}5*=U~a70a`&s(tG+u2wdh~cez0NY^tZo$7e1H#Fy}?f
z693MrX17l9-Sl2K)x*)0aZBrhig`>L6W(8F&H8NSWBbG;efy-hQcQEFCzXCF3Hf_M
zYJ<M$F1?b#MduDX*S@b15nsV3|HM0?sJ_PdemIBsolEvQI<vW(Qt~ub8J;-iyY0LA
z`&i}Lw5~(#DjJQquXg9XkBG25%ysz7vzraO5^^eDM!gcq|9R$8wR29_ruOxpFMTq6
z&3L1lJuOkv^SZyU%=>SJ$KSZ^_$2tcN`R5+h;(OZ-1Z8U*w+rmt&D#ECmYXEQj|<|
zkx4MtRos@LX=0FSIsbtu^WypE{l2d2>TKP+X2lT+k=s9_-G8o;H4ZrL^=IKfqojGS
zZ-j6tpIH`d@Pt#KhWGolfGztbOx}_vzAF5g`?R#!m>KgVdRu*VGhKYrGT*UXHtO{o
zzP)?>_dR!AH))=IWbb3+8Jp(bou6;<QO~eazh_C-z4YoX%d5#<ejUX}W(OO|G>h}5
znsUU|n7*2Ds*r{Eu&jJ4XJzeGmA_4){3T!WdycZdOPCN4%G$>3$fGz_;-mKY?|Eu0
z@9*wSjxSjiX7W`+<3`Nt&?N#HUX^UzK7BJxe@+yfq{1ea8$N|Oi%Y8NLwrujlDcE3
z!k^C8<8PfI@Z(0*`!f^x-f8v5HyE;qJ8*tdW((iP_`G2skKNh_>nor0EGgf!rTx3u
z3&pTq9o1=!d6}=|Y96d{*1m53z{1GG?qJ1Yo8Uc;H{8$txhmAdmDg_)mU(N|d2!#w
z;FBj_bo~_A!FYZ7X^sB$pZ*~kAHHR(s3~{Ic%+~3(srM@pz@dL#I<2k?Y0clc|)q+
z_%3{SCgk|^*3@!`=xR2j+n3b&99CR8x9(H=^!9)6BIf+bKdHZYXJ40yVaqzR0}l=@
zk?YK0X!*BG<pyiT&*EP%lg{s78hpq|-NpRn6U9e~+1A&VKYw3q_VcQ2mkM)xkmX;u
zsX@JUy)7+Qzp&&ktGH#Q++cn$vFyI22;b4(M7{D;pN@XYo7E&}BX?CGX5|G|VdmWB
zTf4fnR_&eGu#)e6>rUTK$zA(|)6R>}tCoHJdFjOZsAa~zVz-((_;>HU_Nukp?0&4&
zMPmt%!=f(NnhzJ+F#cxknQp9eZt|a%>s7l=Yc3?D$#aSPIm?%;TX$Zd?^KO+_UZ>;
z%Vf=@7a#O|WSAGG;CuXV?268FsSh{b@snKFds_OA)+eK^FSnEyFmM@kvd8AxN2H5B
z-o5M1-I_T*cHstUTc&^H(b=+rd*a{z<lTyr7bJsh=IbB(;*)QwxIm7r&Z*>i-|jn3
zypBs{*$+oNzEXdE>ubkz8rtciLXRWvpLugF=Z?8_C|9!E0_z*4FKweavmYwmbn$ww
zaD8^E;j>u_%2qtyZq)X#>7sJ-yLOg7%eV<XA@#kC-hG)H^@{fUJza4?{hYnED!cTP
zUF%hBuI;t?XYeXYdiTyrE1JAmUZk&xY*~Kl)+OsO-79R;k*Tkj-dO$mux)8*)$irg
z)Q+td`Q>tC^ZaMl7ud|&We@C|lEoEe{qWD*{U2qcC(Y}Q(&AQV%h_46X6a=G=Ou?H
zF3@{APu3u4LDlygr}|Da{<2)+`FZInTfQUyXS@x!SBY!u9y6Pww~M=Pj%sB4hL6g;
z-;QgQCL6Xam40?s!OQ>ZzZ38D_ZZ|$<#<QUTFThEGE%_*tlG@G#_q8~nGv~0rWpy_
zVrKOSJ{8c8j8yn~n!ic5SYpGk_V70mhdWF7lz!;GTqMtba82yxM_kk9Tc7@vAl75H
zon`yq$*-nn7R|}{ti&V0^K117`z*Ox4$oKxN;Wr%{yWlND!Z&q^~T|)7rP6Ck8q?s
zFZ9@XZ|B1Bl{2Sr=#2K$V)`MliA!O>uvc8e(!(C2^Z5@?w!I@EdNcmK+HE!mxmkxF
zcb(q5|H!QLP2Bg_E?=m=X89jUx!Hza{=2^1n`JYvM#yV@;hF4DFRV>$-`sjWC4PtE
zhbt;vt~<0RbwAW(vul2|yJfd~tbMVJm_GCUoBIUXtBp7o2NWNi8qQy)n|x{izn_K1
zS91N8jk9v(6zi1#wrnn_pR@6<+JnAX^Va6X^KQJ?(En-O4Xs2DL;ZJQ6K<dVW0sJ0
z>-fxhdO5pntM_UC`zn<zKRrzBN=?CQVX1jy&-ko7j{9w4i@x(OV%oBYw?cy?e%%g#
zSjl^8rqf@Rxzi`Gp9m2AH9JF~eWPuTzS-J&w<b8O&DCx^V_H~ayFl<6&y%Q*<X+Dm
z_jGcmCBFXlhMB!>ectA>@_)wfyx&`KMx4I$;2~EdTj+H|?s=X<N%Ft`PwJF^&tJKy
zOK<Wzvo%ql&-mH={HC?sp-20K9DAURYpwT!tuNV{Vm>BJ-?-SW%|XUrmQQa(_S<%=
zml=_>#KZiW%nHvgmYlukc!bjCYtqs)549G5k1?3b<05jl=J%X>oeO%J*_+)|7x^cb
z>at{2RD62#DA+diZ0V-!%KO^mgSZNsc0G~Suuu^{VpWx85*nDBW9#xvdXZf*x6t?P
z^{<p{dGqzQvdzw{(^K5mswBf{_NO{LTk@S_oQC&=#X-vpb{=e7lEhPM6*!?%eodZB
z4(Htq*949@IYpOMt)02=E9XhZe+p4MS=TCV+N*ggJF7NeTP?#jR?FYd%RU~zQ~9{7
zJug>vlc<8-^Nfe}54Gn0DtLHqR*da&n}@&iCBAy?_1yGwW@>)nzJ(Ll_N`gJnf;b@
ziRb*x1EE1T6JAYQa@1#6Om@yvr{cAj%%2^vx>m}iuCDXL&-m1>f0bKK2i7}#l{)_s
z4ho%pa_NWf%lkzqlt?@fF_HPZBRl0=$B|^-Qwj3~6HnP{WfgQ<PIO!C@iZ}Xos)sj
z%gX(iH}9CV@m@~mvZuY0>R%XT%nr?!7x<|5v@Uak^3nzE=jN!}Y!sbx{{h>v4$-q}
z7F-jrKRedUvUfu1LZPLNfq!&YpK-lcZ?7ci<jiq9e(%%mrVb~zr(K-%x#Q3cme!*D
z2lBslD;n<I++lRnpRM7H>bm(IEc)3N2j_|<h}bWRUJ;{FaY2K3MefFH#`oM9Od6dU
z?=EcIoUFC=^J0}H)w>gJ_|7ZrQ=4kvt?p_Y-{a%D<~PfUO_{RY2M&Lod*S`+mo<x5
zZ3^I7HrecMl_f*#*OK?G-{ns3d1D&1z2K6H@M%Xk<LfhAa~A)(!f^lnG4=5KCE8k_
zS??b7lKSKsa=mKjjs1>A`=+sN+99^&@2PS%|FeA}mKD8sxFU<*x<A}7_gCWOZB?v?
z@5$6w?Je);c+YHDt#^0+r3boPu9gg3$G)x;l<NAk$?8<J+k!cdCoAyrPwzeB$`t+4
zy7Xy_{e(1&mY4_U^Ofwl8C%!x@Yq`RMxEQ_L-PHk>*tosBsQ(At4UShpDHJKYpc)=
z<&ye?YZz~>KG)oA-5{@Xteo?@#3p$KkBg04pZ%TvbL9=&H5HF_OJ+9ydR=GptV{OI
z^7+cAw*Ssv;qmzE`}aSded|_z&B4L)YwzY#t@wp^-o6vl@042JR;hRDh)tCKTWgM4
zkN+(2I>5Dg%j-t2_}Slr1E1ZGJhSTECnjdQ+C=NrDlH+qgl;>1RXO(y9v<Jb<rL2x
zf13Ir{rOG*X|a8ZimT3?(_bG}z51NQG)70SUH8)hUUn~Noi|OPPpvQFOJ`Q+v0qg_
zyRJF}Tog9iDIEPZZJI@p!<r|Pb?(hLbEdoI@}16iZffV1W*W9wXRy@D|0-X;B*Xml
zl1?ApCT3+WSN0Fv<O*#KJ^Y&5Y#cQ@^OEnr-F^IB*mlRB*9#97`R$y3|9kB`maE%$
zYqM(T*XW*eTefyC`+Gg>6+(h<9;9~`h}?c-7o)ny*kY#ju}sgcfjJqvj~1Ts(UZIM
zebqWni`oJiu}O<pygkykf$7eUegCgdU8}x(it*-}ORn6Xr7oEMzqw0%IkW21fci}N
zqY;O`9P+hqZS|UTVfmsmZBv1w+yyuNnxDw}e_228&q2<e-@8iwc?zxjntg|@j&<+H
zh+7A&O@7qdt>00}BAZnI=>!+IN#Tm9^M7AIUY7czZWHg47|B+jOS!9ediJF+>;8Ky
z<5gBm$n<?`KksTi+rSx@z1Z&Bhv~ol`>s4JQ(huxdg$V`#<_>C{aIeweTHGij@i+-
z{b#@FzOnyaxj9F>wAbBV(^MaY*{-)O&}4|Q+Eq~hyhV?9(w>d#IV+#d+pbg|csS;n
zvj4|Nx?;8;v{SUU_AKqnXY`PM)n5~G$F}0Bep$KMF12SNKiF1ZotkSN6Z7lo^$5|X
zy(#64p1$p`9kQPW1*PZt8zkQQe``}pX8p1HH9GD4r%cVC*r2=W)AnCZ4cxoMwYlXB
z^$+Lqz1$+PT6f<&?FSL>R1&N=UQJ7?;5T*RDRIA?6p|#jV0QLHZMG?SCdC^~6@9l(
z`{8lmaevP*@0jWp25N_vg-?^3plA7V=C$B<x!W7(GYBk^s=UZy`(W8tjX$%iTHe_G
zaAdCdp1Z$%#)7K++gx?8CzZ<yth*ba6zXYN!D#tbSlTgZ)dUr*;!T_40&V@bw=E77
zG0}d?Y^+|vwfOv#8NHustM7X&<>)W(5MFM;RrB3o*6gK`DNDK(bZ1P6(7CfX=l$zH
zY#u@7Ua7B-Y0O~z#<(`@oVc<5b^FEhwUqCycPd^Y7|QFm^}A=jmD`H{oJuZ_{)TP#
zI~M45LU`%N_W4f22hSc;*}~Z+)z%jF)+l3+#wTIc2%WjFCwW}k8L;xx7vVj>5<*_e
zWp3dSWX$+&Ghx^6N+*xoy|?;ia9!mJ=UY=XWtHr8>7?0j4U)V~7Va?&J}-4ddB(@>
zG7Ge~1zK&MQQ+A!<9LRq&c-a2vRMy}T((R4G#}U$bW<?LZ}B&SH_aW5Yd)P{&B&&u
zl~y7kVsq58Vfx~mEHCxmxe13KeA4~ov-jn@IW1?Gavz#;$y8_G`OQoz`PIEwbNK_d
zetgp8`+aqg!`_8q%(vg|YT-R<tQ^-Q9`wWV$l1DdGt2XTjxNi%Y<E*~b`y8Rtl8%`
zExGMF-AYnpWouZrZNR&Kf411L&s5xcV_S0G&G)Z<cyV>hDI8>AVC8b0r6e)^|Ni-=
zJq`>E%uFlXGWqWuUHI_o;o5Gt$EGaH+}Ax=V|Y2*%=NzZl$SP73k5!1_?x&?oRO*i
zUK{W2;PqS97jC;=qmky?li2xt$<rI1?cra8=UwcoQ@ZnO!|kZfw53+ZL{gvTo7KK3
zdQqw(61yurbpEkJCO+%#PWg9Y^D@sTS7T0WND!9(wqj@YqK~OJ>o_Mdv*k+$?8>Z|
z^}c1>ykjdq@l;sH9QeB0EVNK@f!L*47p!0Sp4wT|lz(TRZSUr1f@g|C{DTx8)yeU0
zzn#nfV%ytUk3H>FK5=oJO8B_zY^m8y|EmGJ73*GYdAvb(pWE%&WeGI~0<$h(Y?kg+
z;;9NyT&8;~pW!tBv45|MEW7HHMJ`RVir%;5rro4NA6`9?$&zsVJTLes$3(#|(xL^g
z{@j#b5M<nMUb7(~j{B6ycEdIAY!8UvP_Fb`ARLlEA+q`Z=L12rCwupN+Gd;e=<Ft)
zroe#AUGb&-C-2zLmHK?y{Vb!LQD*s^t3Riutf`n3_vyjSET3QdIxdDhciYUN8hwgo
z`lECII;-n%?@?`y@Ds>L*~GR-k2SrsB<Izn%oZ8upGHP6FQp&WS-l|OjMS1xa#_B*
zZJ(Z1GPM7Ae)N{@-l>=V-w?g0Jm+-M&Hr1^mof=5c+9!KY~9`^SI<V>k-eAr!$LfF
z*||pxj<I-LKjirH4Od%u|E#v12b#~mHlM+}u2%i?`Nh@d_boK6Z(mnf%KcyJ(bgS@
zyh5E0#g;v}e=;wlzp2dG*~V<qDW&(HC%j8O^g3bjPU(N0w&y2udr23>Z3ydKBCWZ>
zY$Kc0>kf~<ML!?^E9($CFXa%Jzvjs1xEsfB&*NVAI&bf30kxGni;UXuS<iW7Hb*Mx
z+5H(@^IJDXa8z};3M^m5^7*E5sW|8U%WVJePP{bji|SNvO~XgVr_X5mJ$<&0@1Xq5
zOLrx&<ZTe~SFGHdHMjNdhd0Y>%p(G;&!4n9{LATs;JTlxhOXU`rHk@1KgLx1?o_z*
zv9IzHYoyM+P|1ak-D|7*!&GESr>k7@ER^5>O#cnf=A*|r9(0uM?3$MGSX=eOOBIeX
z_FIg_nV)W-%|7*nL%|_PDJ)7v_RHBKw^#X=Om{agGdt1vd#%BOpzBi)hMD9hlwM@=
zI^{38YNGn3Rc3~fOLe-67woGKI%ra}Yu4Y6InI4C>IE5lf7#pbjdPdS9jsEtr}E(S
zQGu?L(Q}Tt?`C(2Icr>@SiEZ6oD|n4RW-TOheW4y=522lJoIhjKksYz!>2wqbk@1h
zxopO(oX4wHKl}Lnb%d+$u7j6YkM^7pnmTXWm79T~i}ua`&ht0qV@ybq$Q;JGbv%y}
zL%4pLg?&FAIm`O<um6oF{+`NI+q~c<>oNx27KS^f;U@97BX8}T%Ey+bP-G;3)^$$h
zd%iq9E}vz0N-GZXl*&KUyH_y(;s44-N-xEhRvr?5aj{&#Rc<=Jp!{a`qZu!YZPMQx
zWPUj)oLzWrd9H-$?0HAu>V4u~HT$jF=S^=^j<Nrq@IsR50Ppmp8U8cB&*4tC+Vl4K
z+j4d0<y&sqXRP^nJf>UzBNwl%l<1zlck?G&O-P)r)qlEgLC{+s-I-R3J$siQXIG68
zICnMT+RdX+-f670u*f+7^GAyC&PO+vPgh7`6P!CqWdcKaM$V^g_vTBQ`oDQsUUAWY
z`G4Khsook-*gvd0_POGdL(N>K-t={|X1=wq*PA%sr&jB=1e?Ozn@^LrhGp!@N!=TH
zPEzmy0|UcZ#(9n|`+4JhHb3mrJZVzNdNl3ul^uyJ459JgCN&iltzwwBhgIrWk@kd>
zTN4$;Uvnxwc`dqr%d+yWhoUTdofd_pF62_rnV7I;$D6swVm~}%T_16)VAc+;Nlj`;
z*6T;<MKOff6bQ{<FnRB)xSI?3&i7Rv$eykoa=B5i>VdGa*PfVF>Wfyzls}Ky%6wBH
zKcThV{^!O^eQgZoaa%p6Z%kPD=u>U5ui?qf_nntl&53^}cJ%(LcK<zz%oo1Aycu)p
z+%bW(g`4Wnz2TjFtnE{EEdvAVtK9tjG6n{QoZPaE6b2N){DOgjV;2J>0|+5x7!gb`
z3ytpp7Q{&~F)*--loTaqGcYj3lw^bLWJXdAHH~8zk{E;um4R>=&>Y3U0J4{rfq{YP
z0$7DgYD!5l0|SFhYEE$pSOlyCWG)Ms#lXPQlbe#6$iTp$kedQ_2UHn|vSDCgXk!RH
z0%9}hW~Ag4fmsX;3}u-qsW3K(4$DkQ&G$&mOUX$EsbMkC&CE+<U|<j_%LN;X>}-`3
zh@4DHQ7T9cNIyuPr?e<X0pca*@5LoaISdR8`-@A8VG#mSvp%sb*$|`wq7KS}Qmi0v
zdoVCCfG|i5qyt3b#uESkGcYiiCYB{TGo~=e|9{9Jm7c;NzviYx0PAi>0R{$U1`xq~
z;A6970wV)U#``@R{{Hv@GEkr(vA6*043I@4NhL*)Fcvr{z#yRC%fP@OQCtEJe~@~R
z8fOLuCJ<YqxTF{qFCaEZ03_$gz`(d68KK?;6paiFEFd+E3=C{g8l)VQ6k*~VAaN$B
zxs15gqw7c4ht5Y)&x$aY3uGUXJs>W~Jur6>lE-TglDX*WsLdzjP89zmxeG;Hrnsay
z85{zT+ysh8XGof0R46Vfu7b*eC}#$S*iZ%ro+t(ek)sR@Y;p_?{O=eT#3L9O*!vh5
z*nAim*wPsoxJwxrm`^Y;@V{hWU@l=`5Pi(Rz{bnKz#7fKAhn!<f&C8y1M5!)2BGf^
z46JPo3?hsS419bH41%l-48mdz43a?%46;EC3|w3c46HL57+5YdFvwdnFmRhOFtGA7
zFtDmKFi4~_FtGD6Ft8qCU=Ur-z`z#9z@YM!fkDHMfq`ok0|Wad1_q^n3=A9}85r2h
z7#QT+85lU)7#P@k85pD)7#P?i7#LVzGBC*SGcd5-VqjoB&%mIV%)r1tnSp_ADg%Sm
zWCjL4kbj;rFmUKGFbG^`VBqLyV3@DQz`)AKz`$@3R5TQqB<F(y1`=Kj1`G@gNu?<z
zpt2|`Hx*2Sq!p3No!penqQrs%P|*OA17qDxNa3csvLqj5plnJaSTiUx7<>}T(o8M%
K%uMwR4GaNa;y4Qc

literal 0
HcmV?d00001

diff --git a/mmdetection_practice/third_party/mmyolo/demo/deploy_demo.py b/mmdetection_practice/third_party/mmyolo/demo/deploy_demo.py
new file mode 100644
index 0000000..f5d08df
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/demo/deploy_demo.py
@@ -0,0 +1,120 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+"""Deploy demo for mmdeploy.
+
+This script help user to run mmdeploy demo after convert the
+checkpoint to backends.
+
+Usage:
+    python deploy_demo.py img \
+                          config \
+                          checkpoint \
+                          [--deploy-cfg DEPLOY_CFG] \
+                          [--device DEVICE] \
+                          [--out-dir OUT_DIR] \
+                          [--show] \
+                          [--score-thr SCORE_THR]
+
+Example:
+    python deploy_demo.py \
+        ${MMYOLO_PATH}/data/cat/images \
+        ./yolov5_s-v61_syncbn_fast_1xb32-100e_cat.py \
+        ./end2end.engine \
+        --deploy-cfg ./detection_tensorrt-fp16_dynamic-192x192-960x960.py \
+        --out-dir ${MMYOLO_PATH}/work_dirs/deploy_predict_out \
+        --device cuda:0 \
+        --score-thr 0.5
+"""
+import argparse
+import os
+
+import torch
+from mmengine import ProgressBar
+
+from mmyolo.utils.misc import get_file_list
+
+try:
+    from mmdeploy.apis.utils import build_task_processor
+    from mmdeploy.utils import get_input_shape, load_config
+except ImportError:
+    raise ImportError(
+        'mmdeploy is not installed, please see '
+        'https://mmdeploy.readthedocs.io/en/1.x/01-how-to-build/build_from_source.html'  # noqa
+    )
+
+
+def parse_args():
+    parser = argparse.ArgumentParser(description='For mmdeploy predict')
+    parser.add_argument(
+        'img', help='Image path, include image file, dir and URL.')
+    parser.add_argument('config', help='model config root')
+    parser.add_argument('checkpoint', help='checkpoint backend model path')
+    parser.add_argument('--deploy-cfg', help='deploy config path')
+    parser.add_argument(
+        '--device', default='cuda:0', help='device used for conversion')
+    parser.add_argument(
+        '--out-dir', default='./output', help='Path to output file')
+    parser.add_argument(
+        '--show', action='store_true', help='Show the detection results')
+    parser.add_argument(
+        '--score-thr', type=float, default=0.3, help='Bbox score threshold')
+    args = parser.parse_args()
+    return args
+
+
+# TODO Still need to refactor to not building dataset.
+def main():
+    args = parse_args()
+
+    if not os.path.exists(args.out_dir) and not args.show:
+        os.mkdir(args.out_dir)
+
+    # read deploy_cfg and config
+    deploy_cfg, model_cfg = load_config(args.deploy_cfg, args.config)
+
+    # build task and backend model
+    task_processor = build_task_processor(model_cfg, deploy_cfg, args.device)
+    model = task_processor.build_backend_model([args.checkpoint])
+
+    # get model input shape
+    input_shape = get_input_shape(deploy_cfg)
+
+    # get file list
+    files, source_type = get_file_list(args.img)
+
+    # start detector inference
+    progress_bar = ProgressBar(len(files))
+    for file in files:
+        # process input image
+        model_inputs, _ = task_processor.create_input(file, input_shape)
+
+        # do model inference
+        with torch.no_grad():
+            result = model.test_step(model_inputs)
+
+        if source_type['is_dir']:
+            filename = os.path.relpath(file, args.img).replace('/', '_')
+        else:
+            filename = os.path.basename(file)
+        out_file = None if args.show else os.path.join(args.out_dir, filename)
+
+        # filter score
+        result = result[0]
+        result.pred_instances = result.pred_instances[
+            result.pred_instances.scores > args.score_thr]
+
+        # visualize results
+        task_processor.visualize(
+            image=file,
+            model=model,
+            result=result,
+            show_result=args.show,
+            window_name=os.path.basename(filename),
+            output_file=out_file)
+
+        progress_bar.update()
+
+    print('All done!')
+
+
+if __name__ == '__main__':
+    main()
diff --git a/mmdetection_practice/third_party/mmyolo/demo/dog.jpg b/mmdetection_practice/third_party/mmyolo/demo/dog.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..77b0381222eaed50867643f4166092c781e56d5b
GIT binary patch
literal 163759
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
Ro?nitl>{CBtakqYO#t&I_tpRa

literal 0
HcmV?d00001

diff --git a/mmdetection_practice/third_party/mmyolo/demo/featmap_vis_demo.py b/mmdetection_practice/third_party/mmyolo/demo/featmap_vis_demo.py
new file mode 100644
index 0000000..892e73d
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/demo/featmap_vis_demo.py
@@ -0,0 +1,199 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+import argparse
+import os
+from typing import Sequence
+
+import mmcv
+from mmdet.apis import inference_detector, init_detector
+from mmengine import Config, DictAction
+from mmengine.registry import init_default_scope
+from mmengine.utils import ProgressBar
+
+from mmyolo.registry import VISUALIZERS
+from mmyolo.utils.misc import auto_arrange_images, get_file_list
+
+
+def parse_args():
+    parser = argparse.ArgumentParser(description='Visualize feature map')
+    parser.add_argument(
+        'img', help='Image path, include image file, dir and URL.')
+    parser.add_argument('config', help='Config file')
+    parser.add_argument('checkpoint', help='Checkpoint file')
+    parser.add_argument(
+        '--out-dir', default='./output', help='Path to output file')
+    parser.add_argument(
+        '--target-layers',
+        default=['backbone'],
+        nargs='+',
+        type=str,
+        help='The target layers to get feature map, if not set, the tool will '
+        'specify the backbone')
+    parser.add_argument(
+        '--preview-model',
+        default=False,
+        action='store_true',
+        help='To preview all the model layers')
+    parser.add_argument(
+        '--device', default='cuda:0', help='Device used for inference')
+    parser.add_argument(
+        '--score-thr', type=float, default=0.3, help='Bbox score threshold')
+    parser.add_argument(
+        '--show', action='store_true', help='Show the featmap results')
+    parser.add_argument(
+        '--channel-reduction',
+        default='select_max',
+        help='Reduce multiple channels to a single channel')
+    parser.add_argument(
+        '--topk',
+        type=int,
+        default=4,
+        help='Select topk channel to show by the sum of each channel')
+    parser.add_argument(
+        '--arrangement',
+        nargs='+',
+        type=int,
+        default=[2, 2],
+        help='The arrangement of featmap when channel_reduction is '
+        'not None and topk > 0')
+    parser.add_argument(
+        '--cfg-options',
+        nargs='+',
+        action=DictAction,
+        help='override some settings in the used config, the key-value pair '
+        'in xxx=yyy format will be merged into config file. If the value to '
+        'be overwritten is a list, it should be like key="[a,b]" or key=a,b '
+        'It also allows nested list/tuple values, e.g. key="[(a,b),(c,d)]" '
+        'Note that the quotation marks are necessary and that no white space '
+        'is allowed.')
+    args = parser.parse_args()
+    return args
+
+
+class ActivationsWrapper:
+
+    def __init__(self, model, target_layers):
+        self.model = model
+        self.activations = []
+        self.handles = []
+        self.image = None
+        for target_layer in target_layers:
+            self.handles.append(
+                target_layer.register_forward_hook(self.save_activation))
+
+    def save_activation(self, module, input, output):
+        self.activations.append(output)
+
+    def __call__(self, img_path):
+        self.activations = []
+        results = inference_detector(self.model, img_path)
+        return results, self.activations
+
+    def release(self):
+        for handle in self.handles:
+            handle.remove()
+
+
+def main():
+    args = parse_args()
+
+    cfg = Config.fromfile(args.config)
+    if args.cfg_options is not None:
+        cfg.merge_from_dict(args.cfg_options)
+
+    init_default_scope(cfg.get('default_scope', 'mmyolo'))
+
+    channel_reduction = args.channel_reduction
+    if channel_reduction == 'None':
+        channel_reduction = None
+    assert len(args.arrangement) == 2
+
+    model = init_detector(args.config, args.checkpoint, device=args.device)
+
+    if not os.path.exists(args.out_dir) and not args.show:
+        os.mkdir(args.out_dir)
+
+    if args.preview_model:
+        print(model)
+        print('\n This flag is only show model, if you want to continue, '
+              'please remove `--preview-model` to get the feature map.')
+        return
+
+    target_layers = []
+    for target_layer in args.target_layers:
+        try:
+            target_layers.append(eval(f'model.{target_layer}'))
+        except Exception as e:
+            print(model)
+            raise RuntimeError('layer does not exist', e)
+
+    activations_wrapper = ActivationsWrapper(model, target_layers)
+
+    # init visualizer
+    visualizer = VISUALIZERS.build(model.cfg.visualizer)
+    visualizer.dataset_meta = model.dataset_meta
+
+    # get file list
+    image_list, source_type = get_file_list(args.img)
+
+    progress_bar = ProgressBar(len(image_list))
+    for image_path in image_list:
+        result, featmaps = activations_wrapper(image_path)
+        if not isinstance(featmaps, Sequence):
+            featmaps = [featmaps]
+
+        flatten_featmaps = []
+        for featmap in featmaps:
+            if isinstance(featmap, Sequence):
+                flatten_featmaps.extend(featmap)
+            else:
+                flatten_featmaps.append(featmap)
+
+        img = mmcv.imread(image_path)
+        img = mmcv.imconvert(img, 'bgr', 'rgb')
+
+        if source_type['is_dir']:
+            filename = os.path.relpath(image_path, args.img).replace('/', '_')
+        else:
+            filename = os.path.basename(image_path)
+        out_file = None if args.show else os.path.join(args.out_dir, filename)
+
+        # show the results
+        shown_imgs = []
+        visualizer.add_datasample(
+            'result',
+            img,
+            data_sample=result,
+            draw_gt=False,
+            show=False,
+            wait_time=0,
+            out_file=None,
+            pred_score_thr=args.score_thr)
+        drawn_img = visualizer.get_image()
+
+        for featmap in flatten_featmaps:
+            shown_img = visualizer.draw_featmap(
+                featmap[0],
+                drawn_img,
+                channel_reduction=channel_reduction,
+                topk=args.topk,
+                arrangement=args.arrangement)
+            shown_imgs.append(shown_img)
+
+        shown_imgs = auto_arrange_images(shown_imgs)
+
+        progress_bar.update()
+        if out_file:
+            mmcv.imwrite(shown_imgs[..., ::-1], out_file)
+
+        if args.show:
+            visualizer.show(shown_imgs)
+
+    if not args.show:
+        print(f'All done!'
+              f'\nResults have been saved at {os.path.abspath(args.out_dir)}')
+
+
+# Please refer to the usage tutorial:
+# https://github.com/open-mmlab/mmyolo/blob/main/docs/zh_cn/user_guides/visualization.md # noqa
+if __name__ == '__main__':
+    main()
diff --git a/mmdetection_practice/third_party/mmyolo/demo/image_demo.py b/mmdetection_practice/third_party/mmyolo/demo/image_demo.py
new file mode 100644
index 0000000..fa2cfb2
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/demo/image_demo.py
@@ -0,0 +1,168 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+import os
+from argparse import ArgumentParser
+from pathlib import Path
+
+import mmcv
+from mmdet.apis import inference_detector, init_detector
+from mmengine.config import Config, ConfigDict
+from mmengine.logging import print_log
+from mmengine.utils import ProgressBar, path
+
+from mmyolo.registry import VISUALIZERS
+from mmyolo.utils import switch_to_deploy
+from mmyolo.utils.labelme_utils import LabelmeFormat
+from mmyolo.utils.misc import get_file_list, show_data_classes
+
+
+def parse_args():
+    parser = ArgumentParser()
+    parser.add_argument(
+        'img', help='Image path, include image file, dir and URL.')
+    parser.add_argument('config', help='Config file')
+    parser.add_argument('checkpoint', help='Checkpoint file')
+    parser.add_argument(
+        '--out-dir', default='./output', help='Path to output file')
+    parser.add_argument(
+        '--device', default='cuda:0', help='Device used for inference')
+    parser.add_argument(
+        '--show', action='store_true', help='Show the detection results')
+    parser.add_argument(
+        '--deploy',
+        action='store_true',
+        help='Switch model to deployment mode')
+    parser.add_argument(
+        '--tta',
+        action='store_true',
+        help='Whether to use test time augmentation')
+    parser.add_argument(
+        '--score-thr', type=float, default=0.3, help='Bbox score threshold')
+    parser.add_argument(
+        '--class-name',
+        nargs='+',
+        type=str,
+        help='Only Save those classes if set')
+    parser.add_argument(
+        '--to-labelme',
+        action='store_true',
+        help='Output labelme style label file')
+    args = parser.parse_args()
+    return args
+
+
+def main():
+    args = parse_args()
+
+    if args.to_labelme and args.show:
+        raise RuntimeError('`--to-labelme` or `--show` only '
+                           'can choose one at the same time.')
+    config = args.config
+
+    if isinstance(config, (str, Path)):
+        config = Config.fromfile(config)
+    elif not isinstance(config, Config):
+        raise TypeError('config must be a filename or Config object, '
+                        f'but got {type(config)}')
+    if 'init_cfg' in config.model.backbone:
+        config.model.backbone.init_cfg = None
+
+    if args.tta:
+        assert 'tta_model' in config, 'Cannot find ``tta_model`` in config.' \
+            " Can't use tta !"
+        assert 'tta_pipeline' in config, 'Cannot find ``tta_pipeline`` ' \
+            "in config. Can't use tta !"
+        config.model = ConfigDict(**config.tta_model, module=config.model)
+        test_data_cfg = config.test_dataloader.dataset
+        while 'dataset' in test_data_cfg:
+            test_data_cfg = test_data_cfg['dataset']
+
+        # batch_shapes_cfg will force control the size of the output image,
+        # it is not compatible with tta.
+        if 'batch_shapes_cfg' in test_data_cfg:
+            test_data_cfg.batch_shapes_cfg = None
+        test_data_cfg.pipeline = config.tta_pipeline
+
+    # TODO: TTA mode will error if cfg_options is not set.
+    #  This is an mmdet issue and needs to be fixed later.
+    # build the model from a config file and a checkpoint file
+    model = init_detector(
+        config, args.checkpoint, device=args.device, cfg_options={})
+
+    if args.deploy:
+        switch_to_deploy(model)
+
+    if not args.show:
+        path.mkdir_or_exist(args.out_dir)
+
+    # init visualizer
+    visualizer = VISUALIZERS.build(model.cfg.visualizer)
+    visualizer.dataset_meta = model.dataset_meta
+
+    # get file list
+    files, source_type = get_file_list(args.img)
+
+    # get model class name
+    dataset_classes = model.dataset_meta.get('classes')
+
+    # ready for labelme format if it is needed
+    to_label_format = LabelmeFormat(classes=dataset_classes)
+
+    # check class name
+    if args.class_name is not None:
+        for class_name in args.class_name:
+            if class_name in dataset_classes:
+                continue
+            show_data_classes(dataset_classes)
+            raise RuntimeError(
+                'Expected args.class_name to be one of the list, '
+                f'but got "{class_name}"')
+
+    # start detector inference
+    progress_bar = ProgressBar(len(files))
+    for file in files:
+        result = inference_detector(model, file)
+
+        img = mmcv.imread(file)
+        img = mmcv.imconvert(img, 'bgr', 'rgb')
+
+        if source_type['is_dir']:
+            filename = os.path.relpath(file, args.img).replace('/', '_')
+        else:
+            filename = os.path.basename(file)
+        out_file = None if args.show else os.path.join(args.out_dir, filename)
+
+        progress_bar.update()
+
+        # Get candidate predict info with score threshold
+        pred_instances = result.pred_instances[
+            result.pred_instances.scores > args.score_thr]
+
+        if args.to_labelme:
+            # save result to labelme files
+            out_file = out_file.replace(
+                os.path.splitext(out_file)[-1], '.json')
+            to_label_format(pred_instances, result.metainfo, out_file,
+                            args.class_name)
+            continue
+
+        visualizer.add_datasample(
+            filename,
+            img,
+            data_sample=result,
+            draw_gt=False,
+            show=args.show,
+            wait_time=0,
+            out_file=out_file,
+            pred_score_thr=args.score_thr)
+
+    if not args.show and not args.to_labelme:
+        print_log(
+            f'\nResults have been saved at {os.path.abspath(args.out_dir)}')
+
+    elif args.to_labelme:
+        print_log('\nLabelme format label files '
+                  f'had all been saved in {args.out_dir}')
+
+
+if __name__ == '__main__':
+    main()
diff --git a/mmdetection_practice/third_party/mmyolo/demo/large_image.jpg b/mmdetection_practice/third_party/mmyolo/demo/large_image.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..1abbc5d9bb9cf1656ff95fb813fee0db4a40d74e
GIT binary patch
literal 171829
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
OgYgub#-c8U|2F~BcR8p4

literal 0
HcmV?d00001

diff --git a/mmdetection_practice/third_party/mmyolo/demo/large_image_demo.py b/mmdetection_practice/third_party/mmyolo/demo/large_image_demo.py
new file mode 100644
index 0000000..bdbc3a5
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/demo/large_image_demo.py
@@ -0,0 +1,294 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+"""Perform MMYOLO inference on large images (as satellite imagery) as:
+
+```shell
+wget -P checkpoint https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth # noqa: E501, E261.
+
+python demo/large_image_demo.py \
+    demo/large_image.jpg \
+    configs/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py \
+    checkpoint/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth
+```
+"""
+
+import os
+import random
+from argparse import ArgumentParser
+from pathlib import Path
+
+import mmcv
+import numpy as np
+from mmdet.apis import inference_detector, init_detector
+from mmengine.config import Config, ConfigDict
+from mmengine.logging import print_log
+from mmengine.utils import ProgressBar
+
+try:
+    from sahi.slicing import slice_image
+except ImportError:
+    raise ImportError('Please run "pip install -U sahi" '
+                      'to install sahi first for large image inference.')
+
+from mmyolo.registry import VISUALIZERS
+from mmyolo.utils import switch_to_deploy
+from mmyolo.utils.large_image import merge_results_by_nms, shift_predictions
+from mmyolo.utils.misc import get_file_list
+
+
+def parse_args():
+    parser = ArgumentParser(
+        description='Perform MMYOLO inference on large images.')
+    parser.add_argument(
+        'img', help='Image path, include image file, dir and URL.')
+    parser.add_argument('config', help='Config file')
+    parser.add_argument('checkpoint', help='Checkpoint file')
+    parser.add_argument(
+        '--out-dir', default='./output', help='Path to output file')
+    parser.add_argument(
+        '--device', default='cuda:0', help='Device used for inference')
+    parser.add_argument(
+        '--show', action='store_true', help='Show the detection results')
+    parser.add_argument(
+        '--deploy',
+        action='store_true',
+        help='Switch model to deployment mode')
+    parser.add_argument(
+        '--tta',
+        action='store_true',
+        help='Whether to use test time augmentation')
+    parser.add_argument(
+        '--score-thr', type=float, default=0.3, help='Bbox score threshold')
+    parser.add_argument(
+        '--patch-size', type=int, default=640, help='The size of patches')
+    parser.add_argument(
+        '--patch-overlap-ratio',
+        type=float,
+        default=0.25,
+        help='Ratio of overlap between two patches')
+    parser.add_argument(
+        '--merge-iou-thr',
+        type=float,
+        default=0.25,
+        help='IoU threshould for merging results')
+    parser.add_argument(
+        '--merge-nms-type',
+        type=str,
+        default='nms',
+        help='NMS type for merging results')
+    parser.add_argument(
+        '--batch-size',
+        type=int,
+        default=1,
+        help='Batch size, must greater than or equal to 1')
+    parser.add_argument(
+        '--debug',
+        action='store_true',
+        help='Export debug results before merging')
+    parser.add_argument(
+        '--save-patch',
+        action='store_true',
+        help='Save the results of each patch. '
+        'The `--debug` must be enabled.')
+    args = parser.parse_args()
+    return args
+
+
+def main():
+    args = parse_args()
+
+    config = args.config
+
+    if isinstance(config, (str, Path)):
+        config = Config.fromfile(config)
+    elif not isinstance(config, Config):
+        raise TypeError('config must be a filename or Config object, '
+                        f'but got {type(config)}')
+    if 'init_cfg' in config.model.backbone:
+        config.model.backbone.init_cfg = None
+
+    if args.tta:
+        assert 'tta_model' in config, 'Cannot find ``tta_model`` in config.' \
+                                      " Can't use tta !"
+        assert 'tta_pipeline' in config, 'Cannot find ``tta_pipeline`` ' \
+                                         "in config. Can't use tta !"
+        config.model = ConfigDict(**config.tta_model, module=config.model)
+        test_data_cfg = config.test_dataloader.dataset
+        while 'dataset' in test_data_cfg:
+            test_data_cfg = test_data_cfg['dataset']
+
+        # batch_shapes_cfg will force control the size of the output image,
+        # it is not compatible with tta.
+        if 'batch_shapes_cfg' in test_data_cfg:
+            test_data_cfg.batch_shapes_cfg = None
+        test_data_cfg.pipeline = config.tta_pipeline
+
+    # TODO: TTA mode will error if cfg_options is not set.
+    #  This is an mmdet issue and needs to be fixed later.
+    # build the model from a config file and a checkpoint file
+    model = init_detector(
+        config, args.checkpoint, device=args.device, cfg_options={})
+
+    if args.deploy:
+        switch_to_deploy(model)
+
+    if not os.path.exists(args.out_dir) and not args.show:
+        os.mkdir(args.out_dir)
+
+    # init visualizer
+    visualizer = VISUALIZERS.build(model.cfg.visualizer)
+    visualizer.dataset_meta = model.dataset_meta
+
+    # get file list
+    files, source_type = get_file_list(args.img)
+
+    # start detector inference
+    print(f'Performing inference on {len(files)} images.... '
+          'This may take a while.')
+    progress_bar = ProgressBar(len(files))
+    for file in files:
+        # read image
+        img = mmcv.imread(file)
+
+        # arrange slices
+        height, width = img.shape[:2]
+        sliced_image_object = slice_image(
+            img,
+            slice_height=args.patch_size,
+            slice_width=args.patch_size,
+            auto_slice_resolution=False,
+            overlap_height_ratio=args.patch_overlap_ratio,
+            overlap_width_ratio=args.patch_overlap_ratio,
+        )
+
+        # perform sliced inference
+        slice_results = []
+        start = 0
+        while True:
+            # prepare batch slices
+            end = min(start + args.batch_size, len(sliced_image_object))
+            images = []
+            for sliced_image in sliced_image_object.images[start:end]:
+                images.append(sliced_image)
+
+            # forward the model
+            slice_results.extend(inference_detector(model, images))
+
+            if end >= len(sliced_image_object):
+                break
+            start += args.batch_size
+
+        if source_type['is_dir']:
+            filename = os.path.relpath(file, args.img).replace('/', '_')
+        else:
+            filename = os.path.basename(file)
+
+        img = mmcv.imconvert(img, 'bgr', 'rgb')
+        out_file = None if args.show else os.path.join(args.out_dir, filename)
+
+        # export debug images
+        if args.debug:
+            # export sliced image results
+            name, suffix = os.path.splitext(filename)
+
+            shifted_instances = shift_predictions(
+                slice_results,
+                sliced_image_object.starting_pixels,
+                src_image_shape=(height, width))
+            merged_result = slice_results[0].clone()
+            merged_result.pred_instances = shifted_instances
+
+            debug_file_name = name + '_debug' + suffix
+            debug_out_file = None if args.show else os.path.join(
+                args.out_dir, debug_file_name)
+            visualizer.set_image(img.copy())
+
+            debug_grids = []
+            for starting_point in sliced_image_object.starting_pixels:
+                start_point_x = starting_point[0]
+                start_point_y = starting_point[1]
+                end_point_x = start_point_x + args.patch_size
+                end_point_y = start_point_y + args.patch_size
+                debug_grids.append(
+                    [start_point_x, start_point_y, end_point_x, end_point_y])
+            debug_grids = np.array(debug_grids)
+            debug_grids[:, 0::2] = np.clip(debug_grids[:, 0::2], 1,
+                                           img.shape[1] - 1)
+            debug_grids[:, 1::2] = np.clip(debug_grids[:, 1::2], 1,
+                                           img.shape[0] - 1)
+
+            palette = np.random.randint(0, 256, size=(len(debug_grids), 3))
+            palette = [tuple(c) for c in palette]
+            line_styles = random.choices(['-', '-.', ':'], k=len(debug_grids))
+            visualizer.draw_bboxes(
+                debug_grids,
+                edge_colors=palette,
+                alpha=1,
+                line_styles=line_styles)
+            visualizer.draw_bboxes(
+                debug_grids, face_colors=palette, alpha=0.15)
+
+            visualizer.draw_texts(
+                list(range(len(debug_grids))),
+                debug_grids[:, :2] + 5,
+                colors='w')
+
+            visualizer.add_datasample(
+                debug_file_name,
+                visualizer.get_image(),
+                data_sample=merged_result,
+                draw_gt=False,
+                show=args.show,
+                wait_time=0,
+                out_file=debug_out_file,
+                pred_score_thr=args.score_thr,
+            )
+
+            if args.save_patch:
+                debug_patch_out_dir = os.path.join(args.out_dir,
+                                                   f'{name}_patch')
+                for i, slice_result in enumerate(slice_results):
+                    patch_out_file = os.path.join(
+                        debug_patch_out_dir,
+                        f'{filename}_slice_{i}_result.jpg')
+                    image = mmcv.imconvert(sliced_image_object.images[i],
+                                           'bgr', 'rgb')
+
+                    visualizer.add_datasample(
+                        'patch_result',
+                        image,
+                        data_sample=slice_result,
+                        draw_gt=False,
+                        show=False,
+                        wait_time=0,
+                        out_file=patch_out_file,
+                        pred_score_thr=args.score_thr,
+                    )
+
+        image_result = merge_results_by_nms(
+            slice_results,
+            sliced_image_object.starting_pixels,
+            src_image_shape=(height, width),
+            nms_cfg={
+                'type': args.merge_nms_type,
+                'iou_threshold': args.merge_iou_thr
+            })
+
+        visualizer.add_datasample(
+            filename,
+            img,
+            data_sample=image_result,
+            draw_gt=False,
+            show=args.show,
+            wait_time=0,
+            out_file=out_file,
+            pred_score_thr=args.score_thr,
+        )
+        progress_bar.update()
+
+    if not args.show or (args.debug and args.save_patch):
+        print_log(
+            f'\nResults have been saved at {os.path.abspath(args.out_dir)}')
+
+
+if __name__ == '__main__':
+    main()
diff --git a/mmdetection_practice/third_party/mmyolo/demo/video_demo.py b/mmdetection_practice/third_party/mmyolo/demo/video_demo.py
new file mode 100644
index 0000000..d8317a2
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/demo/video_demo.py
@@ -0,0 +1,96 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+"""Perform MMYOLO inference on a video as:
+
+```shell
+wget -P checkpoint https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth # noqa: E501, E261.
+
+python demo/video_demo.py \
+    demo/video_demo.mp4 \
+    configs/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py \
+    checkpoint/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth \
+    --out demo_result.mp4
+```
+"""
+import argparse
+
+import cv2
+import mmcv
+from mmcv.transforms import Compose
+from mmdet.apis import inference_detector, init_detector
+from mmengine.utils import track_iter_progress
+
+from mmyolo.registry import VISUALIZERS
+
+
+def parse_args():
+    parser = argparse.ArgumentParser(description='MMYOLO video demo')
+    parser.add_argument('video', help='Video file')
+    parser.add_argument('config', help='Config file')
+    parser.add_argument('checkpoint', help='Checkpoint file')
+    parser.add_argument(
+        '--device', default='cuda:0', help='Device used for inference')
+    parser.add_argument(
+        '--score-thr', type=float, default=0.3, help='Bbox score threshold')
+    parser.add_argument('--out', type=str, help='Output video file')
+    parser.add_argument('--show', action='store_true', help='Show video')
+    parser.add_argument(
+        '--wait-time',
+        type=float,
+        default=1,
+        help='The interval of show (s), 0 is block')
+    args = parser.parse_args()
+    return args
+
+
+def main():
+    args = parse_args()
+    assert args.out or args.show, \
+        ('Please specify at least one operation (save/show the '
+         'video) with the argument "--out" or "--show"')
+
+    # build the model from a config file and a checkpoint file
+    model = init_detector(args.config, args.checkpoint, device=args.device)
+
+    # build test pipeline
+    model.cfg.test_dataloader.dataset.pipeline[
+        0].type = 'mmdet.LoadImageFromNDArray'
+    test_pipeline = Compose(model.cfg.test_dataloader.dataset.pipeline)
+
+    # init visualizer
+    visualizer = VISUALIZERS.build(model.cfg.visualizer)
+    # the dataset_meta is loaded from the checkpoint and
+    # then pass to the model in init_detector
+    visualizer.dataset_meta = model.dataset_meta
+
+    video_reader = mmcv.VideoReader(args.video)
+    video_writer = None
+    if args.out:
+        fourcc = cv2.VideoWriter_fourcc(*'mp4v')
+        video_writer = cv2.VideoWriter(
+            args.out, fourcc, video_reader.fps,
+            (video_reader.width, video_reader.height))
+
+    for frame in track_iter_progress(video_reader):
+        result = inference_detector(model, frame, test_pipeline=test_pipeline)
+        visualizer.add_datasample(
+            name='video',
+            image=frame,
+            data_sample=result,
+            draw_gt=False,
+            show=False,
+            pred_score_thr=args.score_thr)
+        frame = visualizer.get_image()
+
+        if args.show:
+            cv2.namedWindow('video', 0)
+            mmcv.imshow(frame, 'video', args.wait_time)
+        if args.out:
+            video_writer.write(frame)
+
+    if video_writer:
+        video_writer.release()
+    cv2.destroyAllWindows()
+
+
+if __name__ == '__main__':
+    main()
diff --git a/mmdetection_practice/third_party/mmyolo/docker/Dockerfile b/mmdetection_practice/third_party/mmyolo/docker/Dockerfile
new file mode 100644
index 0000000..fc65431
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docker/Dockerfile
@@ -0,0 +1,36 @@
+ARG PYTORCH="1.9.0"
+ARG CUDA="11.1"
+ARG CUDNN="8"
+
+FROM pytorch/pytorch:${PYTORCH}-cuda${CUDA}-cudnn${CUDNN}-devel
+
+ENV TORCH_CUDA_ARCH_LIST="6.0 6.1 7.0 7.5 8.0 8.6+PTX" \
+    TORCH_NVCC_FLAGS="-Xfatbin -compress-all" \
+    CMAKE_PREFIX_PATH="$(dirname $(which conda))/../" \
+    FORCE_CUDA="1"
+
+RUN rm /etc/apt/sources.list.d/cuda.list \
+    && rm /etc/apt/sources.list.d/nvidia-ml.list \
+    && apt-key del 7fa2af80 \
+    && apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/3bf863cc.pub \
+    && apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/7fa2af80.pub
+
+# (Optional)
+# RUN sed -i 's/http:\/\/archive.ubuntu.com\/ubuntu\//http:\/\/mirrors.aliyun.com\/ubuntu\//g' /etc/apt/sources.list && \
+#    pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
+
+RUN apt-get update \
+    && apt-get install -y ffmpeg libsm6 libxext6 git ninja-build libglib2.0-0 libxrender-dev \
+    && apt-get clean \
+    && rm -rf /var/lib/apt/lists/*
+
+# Install MMEngine , MMCV and MMDet
+RUN pip install --no-cache-dir openmim && \
+    mim install --no-cache-dir "mmengine>=0.6.0" "mmcv>=2.0.0rc4,<2.1.0" "mmdet>=3.0.0,<4.0.0"
+
+# Install MMYOLO
+RUN git clone https://github.com/open-mmlab/mmyolo.git /mmyolo && \
+    cd /mmyolo && \
+    mim install --no-cache-dir -e .
+
+WORKDIR /mmyolo
diff --git a/mmdetection_practice/third_party/mmyolo/docker/Dockerfile_deployment b/mmdetection_practice/third_party/mmyolo/docker/Dockerfile_deployment
new file mode 100644
index 0000000..8ea1e38
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docker/Dockerfile_deployment
@@ -0,0 +1,65 @@
+FROM nvcr.io/nvidia/pytorch:22.04-py3
+
+WORKDIR /openmmlab
+ARG ONNXRUNTIME_VERSION=1.8.1
+ENV DEBIAN_FRONTEND=noninteractive \
+    APT_KEY_DONT_WARN_ON_DANGEROUS_USAGE=DontWarn \
+    FORCE_CUDA="1"
+
+RUN apt-key del 7fa2af80 \
+    && apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/3bf863cc.pub \
+    && apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/7fa2af80.pub
+
+# (Optional)
+# RUN sed -i 's/http:\/\/archive.ubuntu.com\/ubuntu\//http:\/\/mirrors.aliyun.com\/ubuntu\//g' /etc/apt/sources.list \
+# && pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
+
+RUN apt-get update \
+    && apt-get install -y ffmpeg git libgl1-mesa-glx libopencv-dev \
+    libsm6 libspdlog-dev libssl-dev ninja-build libxext6 libxrender-dev \
+    libglib2.0-0 vim wget --no-install-recommends \
+    && apt-get clean \
+    && rm -rf /var/lib/apt/lists/*
+
+# get onnxruntime
+RUN wget -q https://github.com/microsoft/onnxruntime/releases/download/v${ONNXRUNTIME_VERSION}/onnxruntime-linux-x64-${ONNXRUNTIME_VERSION}.tgz \
+    && tar -zxvf onnxruntime-linux-x64-${ONNXRUNTIME_VERSION}.tgz \
+    && pip install --no-cache-dir onnxruntime-gpu==${ONNXRUNTIME_VERSION} \
+    && pip install pycuda
+
+
+# Install OPENMIM MMENGINE MMDET
+RUN pip install --no-cache-dir openmim \
+    && mim install --no-cache-dir "mmengine>=0.6.0" "mmdet>=3.0.0,<4.0.0" \
+    && mim install --no-cache-dir opencv-python==4.5.5.64 opencv-python-headless==4.5.5.64
+
+RUN git clone https://github.com/open-mmlab/mmcv.git -b 2.x mmcv \
+    && cd mmcv \
+    && mim install --no-cache-dir -r requirements/optional.txt \
+    && MMCV_WITH_OPS=1 mim install --no-cache-dir -e . -v \
+    && cd ..
+
+# Install MMYOLO
+RUN git clone https://github.com/open-mmlab/mmyolo.git -b dev mmyolo \
+    && cd mmyolo \
+    && mim install --no-cache-dir -e . \
+    && cd ..
+
+# Install MMDEPLOY
+ENV ONNXRUNTIME_DIR=/openmmlab/onnxruntime-linux-x64-${ONNXRUNTIME_VERSION} \
+    TENSORRT_DIR=/usr/lib/x86_64-linux-gnu \
+    CUDNN_DIR=/usr/lib/x86_64-linux-gnu
+
+RUN git clone https://github.com/open-mmlab/mmdeploy -b dev-1.x mmdeploy \
+    && cd mmdeploy \
+    && git submodule update --init --recursive \
+    && mkdir -p build \
+    && cd build \
+    && cmake -DMMDEPLOY_TARGET_BACKENDS="ort;trt" -DONNXRUNTIME_DIR=${ONNXRUNTIME_DIR} -DTENSORRT_DIR=${TENSORRT_DIR} -DCUDNN_DIR=${CUDNN_DIR} .. \
+    && make -j$(nproc) \
+    && make install \
+    && cd .. \
+    && mim install --no-cache-dir -e .
+
+# Fix undefined symbol bug
+    RUN echo -e "\nexport LD_LIBRARY_PATH=${ONNXRUNTIME_DIR}/lib:${TENSORRT_DIR}/lib:${CUDNN_DIR}/lib64:${LD_LIBRARY_PATH}\nldconfig" >> /root/.bashrc
diff --git a/mmdetection_practice/third_party/mmyolo/docs/README.md b/mmdetection_practice/third_party/mmyolo/docs/README.md
new file mode 100644
index 0000000..f0b7969
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/README.md
@@ -0,0 +1,28 @@
+## Build Documentation
+
+1. Clone MMYOLO
+
+   ```bash
+   git clone https://github.com/open-mmlab/mmyolo.git
+   cd mmyolo
+   ```
+
+2. Install the building dependencies of documentation
+
+   ```bash
+   pip install -r requirements/docs.txt
+   ```
+
+3. Change directory to `docs/en` or `docs/zh_cn`
+
+   ```bash
+   cd docs/en  # or docs/zh_cn
+   ```
+
+4. Build documentation
+
+   ```bash
+   make html
+   ```
+
+5. Open `_build/html/index.html` with browser
diff --git a/mmdetection_practice/third_party/mmyolo/docs/en/Makefile b/mmdetection_practice/third_party/mmyolo/docs/en/Makefile
new file mode 100644
index 0000000..d4bb2cb
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/en/Makefile
@@ -0,0 +1,20 @@
+# Minimal makefile for Sphinx documentation
+#
+
+# You can set these variables from the command line, and also
+# from the environment for the first two.
+SPHINXOPTS    ?=
+SPHINXBUILD   ?= sphinx-build
+SOURCEDIR     = .
+BUILDDIR      = _build
+
+# Put it first so that "make" without argument is like "make help".
+help:
+	@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
+
+.PHONY: help Makefile
+
+# Catch-all target: route all unknown targets to Sphinx using the new
+# "make mode" option.  $(O) is meant as a shortcut for $(SPHINXOPTS).
+%: Makefile
+	@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
diff --git a/mmdetection_practice/third_party/mmyolo/docs/en/_static/css/readthedocs.css b/mmdetection_practice/third_party/mmyolo/docs/en/_static/css/readthedocs.css
new file mode 100644
index 0000000..353aa9e
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/en/_static/css/readthedocs.css
@@ -0,0 +1,6 @@
+.header-logo {
+    background-image: url("../image/mmyolo-logo.png");
+    background-size: 115px 40px;
+    height: 40px;
+    width: 115px;
+}
diff --git a/mmdetection_practice/third_party/mmyolo/docs/en/_static/image/mmyolo-logo.png b/mmdetection_practice/third_party/mmyolo/docs/en/_static/image/mmyolo-logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..41318aec92d86749d327bc5f9b9c689632ffc735
GIT binary patch
literal 30145
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
Gp$PzrcXhV_

literal 0
HcmV?d00001

diff --git a/mmdetection_practice/third_party/mmyolo/docs/en/advanced_guides/cross-library_application.md b/mmdetection_practice/third_party/mmyolo/docs/en/advanced_guides/cross-library_application.md
new file mode 100644
index 0000000..271d129
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/en/advanced_guides/cross-library_application.md
@@ -0,0 +1 @@
+# MMYOLO cross-library application
diff --git a/mmdetection_practice/third_party/mmyolo/docs/en/api.rst b/mmdetection_practice/third_party/mmyolo/docs/en/api.rst
new file mode 100644
index 0000000..a45f66a
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/en/api.rst
@@ -0,0 +1,80 @@
+mmyolo.datasets
+------------------
+
+datasets
+^^^^^^^^^^
+.. automodule:: mmyolo.datasets
+    :members:
+
+transforms
+^^^^^^^^^^^^
+.. automodule:: mmyolo.datasets.transforms
+    :members:
+
+mmyolo.engine
+--------------
+
+hooks
+^^^^^^^^^^
+.. automodule:: mmyolo.engine.hooks
+    :members:
+
+optimizers
+^^^^^^^^^^
+.. automodule:: mmyolo.engine.optimizers
+    :members:
+
+mmyolo.models
+--------------
+
+backbones
+^^^^^^^^^^
+.. automodule:: mmyolo.models.backbones
+    :members:
+
+data_preprocessor
+^^^^^^^^^^^^^^^^^^^^
+.. automodule:: mmyolo.models.data_preprocessor
+    :members:
+
+dense_heads
+^^^^^^^^^^^^
+.. automodule:: mmyolo.models.dense_heads
+    :members:
+
+detectors
+^^^^^^^^^^
+.. automodule:: mmyolo.models.detectors
+    :members:
+
+layers
+^^^^^^^^^^
+.. automodule:: mmyolo.models.layers
+    :members:
+
+losses
+^^^^^^^^^^
+.. automodule:: mmyolo.models.losses
+    :members:
+
+necks
+^^^^^^^^^^^^
+.. automodule:: mmyolo.models.necks
+    :members:
+
+
+task_modules
+^^^^^^^^^^^^^^^
+.. automodule:: mmyolo.models.task_modules
+    :members:
+
+utils
+^^^^^^^^^^
+.. automodule:: mmyolo.models.utils
+    :members:
+
+
+mmyolo.utils
+--------------
+.. automodule::mmyolo.utils
+    :members:
diff --git a/mmdetection_practice/third_party/mmyolo/docs/en/common_usage/amp_training.md b/mmdetection_practice/third_party/mmyolo/docs/en/common_usage/amp_training.md
new file mode 100644
index 0000000..ac1fddd
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/en/common_usage/amp_training.md
@@ -0,0 +1,13 @@
+# Automatic mixed precision(AMP)training
+
+To enable Automatic Mixing Precision (AMP) training, add `--amp` to the end of the training command, which is as follows:
+
+```shell
+python tools/train.py python ./tools/train.py ${CONFIG} --amp
+```
+
+Specific examples are as follows:
+
+```shell
+python tools/train.py configs/yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py --amp
+```
diff --git a/mmdetection_practice/third_party/mmyolo/docs/en/common_usage/freeze_layers.md b/mmdetection_practice/third_party/mmyolo/docs/en/common_usage/freeze_layers.md
new file mode 100644
index 0000000..4614f32
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/en/common_usage/freeze_layers.md
@@ -0,0 +1,28 @@
+# Freeze layers
+
+## Freeze the weight of backbone
+
+In MMYOLO, we can freeze some `stages` of the backbone network by setting `frozen_stages` parameters, so that these `stage` parameters do not participate in model updating.
+It should be noted that `frozen_stages = i` means that all parameters from the initial `stage` to the `i`<sup>th</sup> `stage` will be frozen. The following is an example of `YOLOv5`. Other algorithms are the same logic.
+
+```python
+_base_ = './yolov5_s-v61_syncbn_8xb16-300e_coco.py'
+
+model = dict(
+    backbone=dict(
+        frozen_stages=1 # Indicates that the parameters in the first stage and all stages before it are frozen
+    ))
+```
+
+## Freeze the weight of neck
+
+In addition, it's able to freeze the whole `neck` with the parameter `freeze_all` in MMYOLO. The following is an example of `YOLOv5`. Other algorithms are the same logic.
+
+```python
+_base_ = './yolov5_s-v61_syncbn_8xb16-300e_coco.py'
+
+model = dict(
+    neck=dict(
+        freeze_all=True # If freeze_all=True, all parameters of the neck will be frozen
+    ))
+```
diff --git a/mmdetection_practice/third_party/mmyolo/docs/en/common_usage/mim_usage.md b/mmdetection_practice/third_party/mmyolo/docs/en/common_usage/mim_usage.md
new file mode 100644
index 0000000..2752ea5
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/en/common_usage/mim_usage.md
@@ -0,0 +1,89 @@
+# Use mim to run scripts from other OpenMMLab repositories
+
+```{note}
+1. All script calls across libraries are currently not supported and are being fixed. More examples will be added to this document when the fix is complete. 2.
+2. mAP plotting and average training speed calculation are fixed in the MMDetection dev-3.x branch, which currently needs to be installed via the source code to be run successfully.
+```
+
+## Log Analysis
+
+### Curve plotting
+
+`tools/analysis_tools/analyze_logs.py` plots loss/mAP curves given a training log file. Run `pip install seaborn` first to install the dependency.
+
+```shell
+mim run mmdet analyze_logs plot_curve \
+    ${LOG} \                                     # path of train log in json format
+    [--keys ${KEYS}] \                           # the metric that you want to plot, default to 'bbox_mAP'
+    [--start-epoch ${START_EPOCH}]               # the epoch that you want to start, default to 1
+    [--eval-interval ${EVALUATION_INTERVAL}] \   # the evaluation interval when training, default to 1
+    [--title ${TITLE}] \                         # title of figure
+    [--legend ${LEGEND}] \                       # legend of each plot, default to None
+    [--backend ${BACKEND}] \                     # backend of plt, default to None
+    [--style ${STYLE}] \                         # style of plt, default to 'dark'
+    [--out ${OUT_FILE}]                          # the path of output file
+# [] stands for optional parameters, when actually entering the command line, you do not need to enter []
+```
+
+Examples:
+
+- Plot the classification loss of some run.
+
+  ```shell
+  mim run mmdet analyze_logs plot_curve \
+      yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700.log.json \
+      --keys loss_cls \
+      --legend loss_cls
+  ```
+
+  <img src="https://user-images.githubusercontent.com/27466624/204747359-754555df-1f97-4d5c-87ca-9ad3a0badcce.png" width="600"/>
+
+- Plot the classification and regression loss of some run, and save the figure to a pdf.
+
+  ```shell
+  mim run mmdet analyze_logs plot_curve \
+      yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700.log.json \
+      --keys loss_cls loss_bbox \
+      --legend loss_cls loss_bbox \
+      --out losses_yolov5_s.pdf
+  ```
+
+  <img src="https://user-images.githubusercontent.com/27466624/204748560-2d17ce4b-fb5f-4732-a962-329109e73aad.png" width="600"/>
+
+- Compare the bbox mAP of two runs in the same figure.
+
+  ```shell
+  mim run mmdet analyze_logs plot_curve \
+      yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700.log.json \
+      yolov5_n-v61_syncbn_fast_8xb16-300e_coco_20220919_090739.log.json \
+      --keys bbox_mAP \
+      --legend yolov5_s yolov5_n \
+      --eval-interval 10 # Note that the evaluation interval must be the same as during training. Otherwise, it will raise an error.
+  ```
+
+<img src="https://user-images.githubusercontent.com/27466624/204748704-21db9f9e-386e-449c-91c7-2ce3f8b51f24.png" width="600"/>
+
+### Compute the average training speed
+
+```shell
+mim run mmdet analyze_logs cal_train_time \
+    ${LOG} \                                # path of train log in json format
+    [--include-outliers]                    # include the first value of every epoch when computing the average time
+```
+
+Examples:
+
+```shell
+mim run mmdet analyze_logs cal_train_time \
+    yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700.log.json
+```
+
+The output is expected to be like the following.
+
+```text
+-----Analyze train time of yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700.log.json-----
+slowest epoch 278, average time is 0.1705 s/iter
+fastest epoch 300, average time is 0.1510 s/iter
+time std over epochs is 0.0026
+average iter time: 0.1556 s/iter
+```
diff --git a/mmdetection_practice/third_party/mmyolo/docs/en/common_usage/module_combination.md b/mmdetection_practice/third_party/mmyolo/docs/en/common_usage/module_combination.md
new file mode 100644
index 0000000..3f9ffa4
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/en/common_usage/module_combination.md
@@ -0,0 +1 @@
+# Module combination
diff --git a/mmdetection_practice/third_party/mmyolo/docs/en/common_usage/ms_training_testing.md b/mmdetection_practice/third_party/mmyolo/docs/en/common_usage/ms_training_testing.md
new file mode 100644
index 0000000..b7d88f6
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/en/common_usage/ms_training_testing.md
@@ -0,0 +1,39 @@
+# Multi-scale training and testing
+
+## Multi-scale training
+
+The popular YOLOv5, YOLOv6, YOLOv7, YOLOv8 and RTMDet algorithms are supported in MMYOLO currently, and their default configuration is single-scale 640x640 training. There are two implementations of multi-scale training commonly used in the MM family of open source libraries
+
+1. Each image output in `train_pipeline` is at variable scale, and pad different scales of input images to the same scale by [stack_batch](https://github.com/open-mmlab/mmengine/blob/dbae83c52fa54d6dda08b6692b124217fe3b2135/mmengine/model/base_model/data_preprocessor.py#L260-L261) function in [DataPreprocessor](https://github.com/open-mmlab/mmdetection/blob/3.x/mmdet/models/data_preprocessors/data_preprocessor.py). Most of the algorithms in MMDet are implemented using this approach.
+2. Each image output in `train_pipeline` is at a fixed scale, and `DataPreprocessor` performs up- and down-sampling of image batches for multi-scale training directly.
+
+Both two multi-scale training approaches are supported in MMYOLO. Theoretically, the first implementation can generate richer scales, but its training efficiency is not as good as the second one due to its independent augmentation of a single image. Therefore, we recommend using the second approach.
+
+Take `configs/yolov5/yolov5_s-v61_fast_1xb12-40e_cat.py` configuration as an example, its default configuration is 640x640 fixed scale training, suppose you want to implement training in multiples of 32 and multi-scale range (480, 800), you can refer to YOLOX practice by [YOLOXBatchSyncRandomResize](https://github.com/open-mmlab/mmyolo/blob/dc85144fab20a970341550794857a2f2f9b11564/mmyolo/models/data_preprocessors/data_preprocessor.py#L20) in the DataPreprocessor.
+
+Create a new configuration under the `configs/yolov5` path named `configs/yolov5/yolov5_s-v61_fast_1xb12-ms-40e_cat.py` with the following contents.
+
+```python
+_base_ = 'yolov5_s-v61_fast_1xb12-40e_cat.py'
+
+model = dict(
+    data_preprocessor=dict(
+        type='YOLOv5DetDataPreprocessor',
+        pad_size_divisor=32,
+        batch_augments=[
+            dict(
+                type='YOLOXBatchSyncRandomResize',
+                # multi-scale range (480, 800)
+                random_size_range=(480, 800),
+                # The output scale needs to be divisible by 32
+                size_divisor=32,
+                interval=1)
+        ])
+)
+```
+
+The above configuration will enable multi-scale training. We have already provided this configuration under `configs/yolov5/` for convenience. The rest of the YOLO family of algorithms are similar.
+
+## Multi-scale testing
+
+MMYOLO multi-scale testing is equivalent to Test-Time Enhancement TTA and is currently supported, see [Test-Time Augmentation TTA](./tta.md).
diff --git a/mmdetection_practice/third_party/mmyolo/docs/en/common_usage/multi_necks.md b/mmdetection_practice/third_party/mmyolo/docs/en/common_usage/multi_necks.md
new file mode 100644
index 0000000..b6f2bc2
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/en/common_usage/multi_necks.md
@@ -0,0 +1,37 @@
+# Apply multiple Necks
+
+If you want to stack multiple Necks, you can directly set the Neck parameters in the config. MMYOLO supports concatenating multiple Necks in the form of `List`. You need to ensure that the output channel of the previous Neck matches the input channel of the next Neck. If you need to adjust the number of channels, you can insert the `mmdet.ChannelMapper` module to align the number of channels between multiple Necks. The specific configuration is as follows:
+
+```python
+_base_ = './yolov5_s-v61_syncbn_8xb16-300e_coco.py'
+
+deepen_factor = _base_.deepen_factor
+widen_factor = _base_.widen_factor
+model = dict(
+    type='YOLODetector',
+    neck=[
+        dict(
+            type='YOLOv5PAFPN',
+            deepen_factor=deepen_factor,
+            widen_factor=widen_factor,
+            in_channels=[256, 512, 1024],
+            out_channels=[256, 512, 1024], # The out_channels is controlled by widen_factor,so the YOLOv5PAFPN's out_channels equls to out_channels * widen_factor
+            num_csp_blocks=3,
+            norm_cfg=dict(type='BN', momentum=0.03, eps=0.001),
+            act_cfg=dict(type='SiLU', inplace=True)),
+        dict(
+            type='mmdet.ChannelMapper',
+            in_channels=[128, 256, 512],
+            out_channels=128,
+        ),
+        dict(
+            type='mmdet.DyHead',
+            in_channels=128,
+            out_channels=256,
+            num_blocks=2,
+            # disable zero_init_offset to follow official implementation
+            zero_init_offset=False)
+    ]
+    bbox_head=dict(head_module=dict(in_channels=[512,512,512])) # The out_channels is controlled by widen_factor,so the YOLOv5HeadModuled in_channels * widen_factor equals to  the last neck's out_channels
+)
+```
diff --git a/mmdetection_practice/third_party/mmyolo/docs/en/common_usage/output_predictions.md b/mmdetection_practice/third_party/mmyolo/docs/en/common_usage/output_predictions.md
new file mode 100644
index 0000000..5719299
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/en/common_usage/output_predictions.md
@@ -0,0 +1,40 @@
+# Output prediction results
+
+If you want to save the prediction results as a specific file for offline evaluation, MMYOLO currently supports both json and pkl formats.
+
+```{note}
+The json file only save `image_id`, `bbox`, `score` and `category_id`. The json file can be read using the json library.
+The pkl file holds more content than the json file, and also holds information such as the file name and size of the predicted image; the pkl file can be read using the pickle library. The pkl file can be read using the pickle library.
+```
+
+## Output into json file
+
+If you want to output the prediction results as a json file, the command is as follows.
+
+```shell
+python tools/test.py {path_to_config} {path_to_checkpoint} --json-prefix {json_prefix}
+```
+
+The argument after `--json-prefix` should be a filename prefix (no need to enter the `.json` suffix) and can also contain a path. For a concrete example:
+
+```shell
+python tools/test.py configs\yolov5\yolov5_s-v61_syncbn_8xb16-300e_coco.py yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth --json-prefix work_dirs/demo/json_demo
+```
+
+Running the above command will output the `json_demo.bbox.json` file in the `work_dirs/demo` folder.
+
+## Output into pkl file
+
+If you want to output the prediction results as a pkl file, the command is as follows.
+
+```shell
+python tools/test.py {path_to_config} {path_to_checkpoint} --out {path_to_output_file}
+```
+
+The argument after `--out` should be a full filename (**must be** with a `.pkl` or `.pickle` suffix) and can also contain a path. For a concrete example:
+
+```shell
+python tools/test.py configs\yolov5\yolov5_s-v61_syncbn_8xb16-300e_coco.py yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth --out work_dirs/demo/pkl_demo.pkl
+```
+
+Running the above command will output the `pkl_demo.pkl` file in the `work_dirs/demo` folder.
diff --git a/mmdetection_practice/third_party/mmyolo/docs/en/common_usage/plugins.md b/mmdetection_practice/third_party/mmyolo/docs/en/common_usage/plugins.md
new file mode 100644
index 0000000..5a0b323
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/en/common_usage/plugins.md
@@ -0,0 +1,34 @@
+# Plugins
+
+MMYOLO supports adding plugins such as `none_local` and `dropblock` after different stages of Backbone. Users can directly manage plugins by modifying the plugins parameter of the backbone in the config. For example, add `GeneralizedAttention` plugins for `YOLOv5`. The configuration files are as follows:
+
+```python
+_base_ = './yolov5_s-v61_syncbn_8xb16-300e_coco.py'
+
+model = dict(
+    backbone=dict(
+        plugins=[
+            dict(
+                cfg=dict(
+                    type='GeneralizedAttention',
+                    spatial_range=-1,
+                    num_heads=8,
+                    attention_type='0011',
+                    kv_stride=2),
+                stages=(False, False, True, True))
+        ]))
+```
+
+`cfg` parameter indicates the specific configuration of the plugin. The `stages` parameter indicates whether to add plug-ins after the corresponding stage of the backbone. The length of the list `stages` must be the same as the number of backbone stages.
+
+MMYOLO currently supports the following plugins:
+
+<details open>
+<summary><b>Supported Plugins</b></summary>
+
+1. [CBAM](https://github.com/open-mmlab/mmyolo/blob/dev/mmyolo/models/plugins/cbam.py#L86)
+2. [GeneralizedAttention](https://github.com/open-mmlab/mmcv/blob/2.x/mmcv/cnn/bricks/generalized_attention.py#L13)
+3. [NonLocal2d](https://github.com/open-mmlab/mmcv/blob/2.x/mmcv/cnn/bricks/non_local.py#L250)
+4. [ContextBlock](https://github.com/open-mmlab/mmcv/blob/2.x/mmcv/cnn/bricks/context_block.py#L18)
+
+</details>
diff --git a/mmdetection_practice/third_party/mmyolo/docs/en/common_usage/resume_training.md b/mmdetection_practice/third_party/mmyolo/docs/en/common_usage/resume_training.md
new file mode 100644
index 0000000..1e1184a
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/en/common_usage/resume_training.md
@@ -0,0 +1,9 @@
+# Resume training
+
+Resume training means to continue training from the state saved from one of the previous trainings, where the state includes the model weights, the state of the optimizer and the optimizer parameter adjustment strategy.
+
+The user can add `--resume` at the end of the training command to resume training, and the program will automatically load the latest weight file from `work_dirs` to resume training. If there is an updated checkpoint in `work_dir` (e.g. the training was interrupted during the last training), the training will be resumed from that checkpoint, otherwise (e.g. the last training did not have time to save the checkpoint or a new training task was started) the training will be restarted. Here is an example of resuming training:
+
+```shell
+python tools/train.py configs/yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py --resume
+```
diff --git a/mmdetection_practice/third_party/mmyolo/docs/en/common_usage/set_random_seed.md b/mmdetection_practice/third_party/mmyolo/docs/en/common_usage/set_random_seed.md
new file mode 100644
index 0000000..c45c165
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/en/common_usage/set_random_seed.md
@@ -0,0 +1,18 @@
+# Set the random seed
+
+If you want to set the random seed during training, you can use the following command.
+
+```shell
+python ./tools/train.py \
+    ${CONFIG} \                               # path of the config file
+    --cfg-options randomness.seed=2023 \      # set seed to 2023
+    [randomness.diff_rank_seed=True] \        # set different seeds according to global rank
+    [randomness.deterministic=True]           # set the deterministic option for CUDNN backend
+# [] stands for optional parameters, when actually entering the command line, you do not need to enter []
+```
+
+`randomness` has three parameters that can be set, with the following meanings.
+
+- `randomness.seed=2023`, set the random seed to 2023.
+- `randomness.diff_rank_seed=True`, set different seeds according to global rank. Defaults to False.
+- `randomness.deterministic=True`, set the deterministic option for cuDNN backend, i.e., set `torch.backends.cudnn.deterministic` to True and `torch.backends.cudnn.benchmark` to False. Defaults to False. See https://pytorch.org/docs/stable/notes/randomness.html for more details.
diff --git a/mmdetection_practice/third_party/mmyolo/docs/en/common_usage/set_syncbn.md b/mmdetection_practice/third_party/mmyolo/docs/en/common_usage/set_syncbn.md
new file mode 100644
index 0000000..dba33be
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/en/common_usage/set_syncbn.md
@@ -0,0 +1 @@
+# Enabling and disabling SyncBatchNorm
diff --git a/mmdetection_practice/third_party/mmyolo/docs/en/common_usage/single_multi_channel_applications.md b/mmdetection_practice/third_party/mmyolo/docs/en/common_usage/single_multi_channel_applications.md
new file mode 100644
index 0000000..3093270
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/en/common_usage/single_multi_channel_applications.md
@@ -0,0 +1,188 @@
+# Single and multi-channel application examples
+
+## Training example on a single-channel image dataset
+
+The default training images in MMYOLO are all color three-channel data. If you want to use a single-channel dataset for training and testing, it is expected that the following modifications are needed.
+
+1. All image processing pipelines have to support single channel operations
+2. The input channel of the first convolutional layer of the backbone network of the model needs to be changed from 3 to 1
+3. If you wish to load COCO pre-training weights, you need to handle the first convolutional layer weight size mismatch
+
+The following uses the `cat` dataset as an example to describe the entire modification process, if you are using a custom grayscale image dataset, you can skip the dataset preprocessing step.
+
+### 1 Dataset pre-processing
+
+The processing training of the custom dataset can be found in [Annotation-to-deployment workflow for custom dataset](../recommended_topics/labeling_to_deployment_tutorials.md)。
+
+`cat` is a three-channel color image dataset. For demonstration purpose, you can run the following code and commands to replace the dataset images with single-channel images for subsequent validation.
+
+**1. Download the `cat` dataset for decompression**
+
+```shell
+python tools/misc/download_dataset.py --dataset-name cat --save-dir ./data/cat --unzip --delete
+```
+
+**2. Convert datasets to grayscale maps**
+
+```python
+import argparse
+import imghdr
+import os
+from typing import List
+import cv2
+
+def parse_args():
+    parser = argparse.ArgumentParser(description='data_path')
+    parser.add_argument('path', type=str, help='Original dataset path')
+    return parser.parse_args()
+
+def main():
+    args = parse_args()
+
+    path = args.path + '/images/'
+    save_path = path
+    file_list: List[str] = os.listdir(path)
+    # Grayscale conversion of each imager
+    for file in file_list:
+        if imghdr.what(path + '/' + file) != 'jpeg':
+            continue
+        img = cv2.imread(path + '/' + file)
+        img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
+        cv2.imwrite(save_path + '/' + file, img)
+
+if __name__ == '__main__':
+    main()
+```
+
+Name the above script as `cvt_single_channel.py`, and run the command as:
+
+```shell
+python cvt_single_channel.py data/cat
+```
+
+### 2 Modify the base configuration file
+
+**At present, some image processing functions of MMYOLO, such as color space transformation, are not compatible with single-channel images, so if we use single-channel data for training directly, we need to modify part of the pipeline, which is a large amount of work**. In order to solve the incompatibility problem, the recommended approach is to load the single-channel image as a three-channel image as a three-channel data, but convert it to single-channel format before input to the network. This approach will slightly increase the arithmetic burden, but the user basically does not need to modify the code to use.
+
+Take `projects/misc/custom_dataset/yolov5_s-v61_syncbn_fast_1xb32-100e_cat.py` as the `base` configuration, copy it to the `configs/yolov5` directory, and add `yolov5_s- v61_syncbn_fast_1xb32-100e_cat_single_channel.py` file. We can inherit `YOLOv5DetDataPreprocessor` from the `mmyolo/models/data_preprocessors/data_preprocessor.py` file and name the new class `YOLOv5SCDetDataPreprocessor`, in which convert the image to a single channel, add the dependency library and register the new class in `mmyolo/models/data_preprocessors/__init__.py`. The `YOLOv5SCDetDataPreprocessor` sample code is:
+
+```python
+@MODELS.register_module()
+class YOLOv5SCDetDataPreprocessor(YOLOv5DetDataPreprocessor):
+    """Rewrite collate_fn to get faster training speed.
+
+    Note: It must be used together with `mmyolo.datasets.utils.yolov5_collate`
+    """
+
+    def forward(self, data: dict, training: bool = False) -> dict:
+        """Perform normalization, padding, bgr2rgb conversion and convert to single channel image based on ``DetDataPreprocessor``.
+
+        Args:
+            data (dict): Data sampled from dataloader.
+            training (bool): Whether to enable training time augmentation.
+
+        Returns:
+            dict: Data in the same format as the model input.
+        """
+        if not training:
+            return super().forward(data, training)
+
+        data = self.cast_data(data)
+        inputs, data_samples = data['inputs'], data['data_samples']
+        assert isinstance(data['data_samples'], dict)
+
+        # TODO: Supports multi-scale training
+        if self._channel_conversion and inputs.shape[1] == 3:
+            inputs = inputs[:, [2, 1, 0], ...]
+
+        if self._enable_normalize:
+            inputs = (inputs - self.mean) / self.std
+
+        if self.batch_augments is not None:
+            for batch_aug in self.batch_augments:
+                inputs, data_samples = batch_aug(inputs, data_samples)
+
+        img_metas = [{'batch_input_shape': inputs.shape[2:]}] * len(inputs)
+        data_samples = {
+            'bboxes_labels': data_samples['bboxes_labels'],
+            'img_metas': img_metas
+        }
+
+        # Convert to single channel image
+        inputs = inputs.mean(dim=1, keepdim=True)
+
+        return {'inputs': inputs, 'data_samples': data_samples}
+```
+
+At this point, the `yolov5_s-v61_syncbn_fast_1xb32-100e_cat_single_channel.py` configuration file reads as follows.
+
+```python
+_base_ = 'yolov5_s-v61_syncbn_fast_1xb32-100e_cat.py'
+
+_base_.model.data_preprocessor.type = 'YOLOv5SCDetDataPreprocessor'
+```
+
+### 3 Pre-training model loading problem
+
+When using a pre-trained 3-channel model directly, it's theoretically possible to experience a decrease in accuracy, though this has not been experimentally verified. To mitigate this potential issue, there are several solutions, including adjusting the weight of each channel in the input layer. One approach is to set the weight of each channel in the input layer to the average of the weights of the original 3 channels. Alternatively, the weight of each channel could be set to one of the weights of the original 3 channels, or the input layer could be trained directly without modifying the weights, depending on the specific circumstances. In this work, we chose to adjust the weights of the 3 channels in the input layer to the average of the weights of the pre-trained 3 channels.
+
+```python
+import torch
+
+def main():
+    # Load weights file
+    state_dict = torch.load(
+        'checkpoints/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth'
+    )
+
+    # Modify input layer weights
+    weights = state_dict['state_dict']['backbone.stem.conv.weight']
+    avg_weight = weights.mean(dim=1, keepdim=True)
+    state_dict['state_dict']['backbone.stem.conv.weight'] = avg_weight
+
+    # Save the modified weights to a new file
+    torch.save(
+        state_dict,
+        'checkpoints/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187_single_channel.pth'
+    )
+
+if __name__ == '__main__':
+    main()
+```
+
+At this point, the `yolov5_s-v61_syncbn_fast_1xb32-100e_cat_single_channel.py` configuration file reads as follows:
+
+```python
+_base_ = 'yolov5_s-v61_syncbn_fast_1xb32-100e_cat.py'
+
+_base_.model.data_preprocessor.type = 'YOLOv5SCDetDataPreprocessor'
+
+load_from = './checkpoints/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187_single_channel.pth'
+```
+
+### 4 Model training effect
+
+<img src="https://raw.githubusercontent.com/landhill/mmyolo/main/resources/cat_single_channel_test.jpeg"/>
+
+The left figure shows the actual label and the right figure shows the target detection result.
+
+```shell
+ Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.958
+ Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 1.000
+ Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 1.000
+ Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = -1.000
+ Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = -1.000
+ Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.958
+ Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.881
+ Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.969
+ Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.969
+ Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = -1.000
+ Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = -1.000
+ Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.969
+bbox_mAP_copypaste: 0.958 1.000 1.000 -1.000 -1.000 0.958
+Epoch(val) [100][116/116]  coco/bbox_mAP: 0.9580  coco/bbox_mAP_50: 1.0000  coco/bbox_mAP_75: 1.0000  coco/bbox_mAP_s: -1.0000  coco/bbox_mAP_m: -1.0000  coco/bbox_mAP_l: 0.9580
+```
+
+## Training example on a multi-channel image dataset
+
+TODO
diff --git a/mmdetection_practice/third_party/mmyolo/docs/en/common_usage/specify_device.md b/mmdetection_practice/third_party/mmyolo/docs/en/common_usage/specify_device.md
new file mode 100644
index 0000000..72c8017
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/en/common_usage/specify_device.md
@@ -0,0 +1,23 @@
+# Specify specific GPUs during training or inference
+
+If you have multiple GPUs, such as 8 GPUs, numbered `0, 1, 2, 3, 4, 5, 6, 7`, GPU 0 will be used by default for training or inference. If you want to specify other GPUs for training or inference, you can use the following commands:
+
+```shell
+CUDA_VISIBLE_DEVICES=5 python ./tools/train.py ${CONFIG} #train
+CUDA_VISIBLE_DEVICES=5 python ./tools/test.py ${CONFIG} ${CHECKPOINT_FILE} #test
+```
+
+If you set `CUDA_VISIBLE_DEVICES` to -1 or a number greater than the maximum GPU number, such as 8, the CPU will be used for training or inference.
+
+If you want to use several of these GPUs to train in parallel, you can use the following command:
+
+```shell
+CUDA_VISIBLE_DEVICES=0,1,2,3 ./tools/dist_train.sh ${CONFIG} ${GPU_NUM}
+```
+
+Here the `GPU_NUM` is 4. In addition, if multiple tasks are trained in parallel on one machine and each task requires multiple GPUs, the PORT of each task need to be set differently to avoid communication conflict, like the following commands:
+
+```shell
+CUDA_VISIBLE_DEVICES=0,1,2,3 PORT=29500 ./tools/dist_train.sh ${CONFIG} 4
+CUDA_VISIBLE_DEVICES=4,5,6,7 PORT=29501 ./tools/dist_train.sh ${CONFIG} 4
+```
diff --git a/mmdetection_practice/third_party/mmyolo/docs/en/common_usage/tta.md b/mmdetection_practice/third_party/mmyolo/docs/en/common_usage/tta.md
new file mode 100644
index 0000000..517d34b
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/en/common_usage/tta.md
@@ -0,0 +1,87 @@
+# TTA Related Notes
+
+## Test Time Augmentation (TTA)
+
+MMYOLO support for TTA in v0.5.0+, so that users can specify the `-tta` parameter to enable it during evaluation. Take `YOLOv5-s` as an example, its single GPU TTA test command is as follows
+
+```shell
+python tools/test.py configs/yolov5/yolov5_n-v61_syncbn_fast_8xb16-300e_coco.py https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_n-v61_syncbn_fast_8xb16-300e_coco/yolov5_n-v61_syncbn_fast_8xb16-300e_coco_20220919_090739-b804c1ad.pth  --tta
+```
+
+For TTA to work properly, you must ensure that the variables `tta_model` and `tta_pipeline` are present in the configuration, see [det_p5_tta.py](https://github.com/open-mmlab/mmyolo/blob/dev/configs/_base_/det_p5_tta.py) for details.
+
+The default TTA in MMYOLO performs 3 multi-scale enhancements, followed by 2 horizontal flip enhancements, for a total of 6 parallel pipelines. take `YOLOv5-s` as an example, its TTA configuration is as follows
+
+```python
+img_scales = [(640, 640), (320, 320), (960, 960)]
+
+_multiscale_resize_transforms = [
+    dict(
+        type='Compose',
+        transforms=[
+            dict(type='YOLOv5KeepRatioResize', scale=s),
+            dict(
+                type='LetterResize',
+                scale=s,
+                allow_scale_up=False,
+                pad_val=dict(img=114))
+        ]) for s in img_scales
+]
+
+tta_pipeline = [
+    dict(type='LoadImageFromFile'),
+    dict(
+        type='TestTimeAug',
+        transforms=[
+            _multiscale_resize_transforms,
+            [
+                dict(type='mmdet.RandomFlip', prob=1.),
+                dict(type='mmdet.RandomFlip', prob=0.)
+            ], [dict(type='mmdet.LoadAnnotations', with_bbox=True)],
+            [
+                dict(
+                    type='mmdet.PackDetInputs',
+                    meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                               'scale_factor', 'pad_param', 'flip',
+                               'flip_direction'))
+            ]
+        ])
+]
+```
+
+The schematic diagram is shown below.
+
+```text
+                               LoadImageFromFile
+                    /                 |                     \
+(RatioResize,LetterResize) (RatioResize,LetterResize) (RatioResize,LetterResize)
+       /      \                    /      \                    /        \
+ RandomFlip RandomFlip      RandomFlip RandomFlip        RandomFlip RandomFlip
+     |          |                |         |                  |         |
+ LoadAnn    LoadAnn           LoadAnn    LoadAnn           LoadAnn    LoadAnn
+     |          |                |         |                  |         |
+ PackDetIn  PackDetIn         PackDetIn  PackDetIn        PackDetIn  PackDetIn
+```
+
+You can modify `img_scales` to support different multi-scale enhancements, or you can insert a new pipeline to implement custom TTA requirements. Assuming you only want to do horizontal flip enhancements, the configuration should be modified as follows.
+
+```python
+tta_pipeline = [
+    dict(type='LoadImageFromFile'),
+    dict(
+        type='TestTimeAug',
+        transforms=[
+            [
+                dict(type='mmdet.RandomFlip', prob=1.),
+                dict(type='mmdet.RandomFlip', prob=0.)
+            ], [dict(type='mmdet.LoadAnnotations', with_bbox=True)],
+            [
+                dict(
+                    type='mmdet.PackDetInputs',
+                    meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                               'scale_factor', 'pad_param', 'flip',
+                               'flip_direction'))
+            ]
+        ])
+]
+```
diff --git a/mmdetection_practice/third_party/mmyolo/docs/en/conf.py b/mmdetection_practice/third_party/mmyolo/docs/en/conf.py
new file mode 100644
index 0000000..437a257
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/en/conf.py
@@ -0,0 +1,115 @@
+# Configuration file for the Sphinx documentation builder.
+#
+# This file only contains a selection of the most common options. For a full
+# list see the documentation:
+# https://www.sphinx-doc.org/en/master/usage/configuration.html
+
+# -- Path setup --------------------------------------------------------------
+
+# If extensions (or modules to document with autodoc) are in another directory,
+# add these directories to sys.path here. If the directory is relative to the
+# documentation root, use os.path.abspath to make it absolute, like shown here.
+#
+import os
+import subprocess
+import sys
+
+import pytorch_sphinx_theme
+
+sys.path.insert(0, os.path.abspath('../../'))
+
+# -- Project information -----------------------------------------------------
+
+project = 'MMYOLO'
+copyright = '2022, OpenMMLab'
+author = 'MMYOLO Authors'
+version_file = '../../mmyolo/version.py'
+
+
+def get_version():
+    with open(version_file) as f:
+        exec(compile(f.read(), version_file, 'exec'))
+    return locals()['__version__']
+
+
+# The full version, including alpha/beta/rc tags
+release = get_version()
+
+# -- General configuration ---------------------------------------------------
+
+# Add any Sphinx extension module names here, as strings. They can be
+# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
+# ones.
+extensions = [
+    'sphinx.ext.autodoc',
+    'sphinx.ext.napoleon',
+    'sphinx.ext.viewcode',
+    'myst_parser',
+    'sphinx_markdown_tables',
+    'sphinx_copybutton',
+]
+
+myst_enable_extensions = ['colon_fence']
+myst_heading_anchors = 3
+
+autodoc_mock_imports = [
+    'matplotlib', 'pycocotools', 'terminaltables', 'mmyolo.version', 'mmcv.ops'
+]
+
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ['_templates']
+
+# The suffix(es) of source filenames.
+# You can specify multiple suffix as a list of string:
+#
+source_suffix = {
+    '.rst': 'restructuredtext',
+    '.md': 'markdown',
+}
+
+# The master toctree document.
+master_doc = 'index'
+
+# List of patterns, relative to source directory, that match files and
+# directories to ignore when looking for source files.
+# This pattern also affects html_static_path and html_extra_path.
+exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']
+
+# -- Options for HTML output -------------------------------------------------
+
+# The theme to use for HTML and HTML Help pages.  See the documentation for
+# a list of builtin themes.
+#
+# html_theme = 'sphinx_rtd_theme'
+html_theme = 'pytorch_sphinx_theme'
+html_theme_path = [pytorch_sphinx_theme.get_html_theme_path()]
+
+html_theme_options = {
+    'menu': [
+        {
+            'name': 'GitHub',
+            'url': 'https://github.com/open-mmlab/mmyolo'
+        },
+    ],
+    # Specify the language of shared menu
+    'menu_lang': 'en',
+}
+
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+html_static_path = ['_static']
+html_css_files = ['css/readthedocs.css']
+
+# -- Extension configuration -------------------------------------------------
+# Ignore >>> when copying code
+copybutton_prompt_text = r'>>> |\.\.\. '
+copybutton_prompt_is_regexp = True
+
+
+def builder_inited_handler(app):
+    subprocess.run(['./stat.py'])
+
+
+def setup(app):
+    app.connect('builder-inited', builder_inited_handler)
diff --git a/mmdetection_practice/third_party/mmyolo/docs/en/get_started/15_minutes_instance_segmentation.md b/mmdetection_practice/third_party/mmyolo/docs/en/get_started/15_minutes_instance_segmentation.md
new file mode 100644
index 0000000..b42e25f
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/en/get_started/15_minutes_instance_segmentation.md
@@ -0,0 +1,332 @@
+# 15 minutes to get started with MMYOLO instance segmentation
+
+Instance segmentation is a task in computer vision that aims to segment each object in an image and assign each object a unique identifier.
+
+Unlike semantic segmentation, instance segmentation not only segments out different categories in an image, but also separates different instances of the same category.
+
+<div align=center>
+<img src="https://github.com/open-mmlab/mmyolo/assets/87774050/6fd6316f-d78d-48a5-a413-86e7a74583fd" alt="Instance Segmentation" width="100%"/>
+</div>
+
+Taking the downloadable balloon dataset as an example, I will guide you through a 15-minute easy introduction to MMYOLO instance segmentation. The entire process includes the following steps:
+
+- [Installation](#installation)
+- [Dataset](#dataset)
+- [Config](#config)
+- [Training](#training)
+- [Testing](#testing)
+- [EasyDeploy](#easydeploy-deployment)
+
+In this tutorial, we will use YOLOv5-s as an example. For the demo configuration of the balloon dataset with other YOLO series algorithms, please refer to the corresponding algorithm configuration folder.
+
+## Installation
+
+Assuming you've already installed Conda in advance, then install PyTorch using the following commands.
+
+```{note}
+Note: Since this repo uses OpenMMLab 2.0, it is better to create a new conda virtual environment to prevent conflicts with the repo installed in OpenMMLab 1.0.
+```
+
+```shell
+conda create -n mmyolo python=3.8 -y
+conda activate mmyolo
+# If you have GPU
+conda install pytorch torchvision -c pytorch
+# If you only have CPU
+# conda install pytorch torchvision cpuonly -c pytorch
+```
+
+Install MMYOLO and dependency libraries using the following commands.
+
+```shell
+git clone https://github.com/open-mmlab/mmyolo.git
+cd mmyolo
+pip install -U openmim
+mim install -r requirements/mminstall.txt
+# Install albumentations
+mim install -r requirements/albu.txt
+# Install MMYOLO
+mim install -v -e .
+# "-v" means verbose, or more output
+# "-e" means installing a project in editable mode,
+# thus any local modifications made to the code will take effect without reinstallation.
+```
+
+For details about how to configure the environment, see [Installation and verification](./installation.md).
+
+## Dataset
+
+The Balloon dataset is a single-class dataset that consists of 74 images and includes annotated information required for training. Here is an example image from the dataset:
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/87774050/236993643-f581b087-9231-48a5-810b-97a5f31abe63.png" alt="balloon dataset"/>
+</div>
+
+You can download and use it directly by the following command:
+
+```shell
+python tools/misc/download_dataset.py --dataset-name balloon --save-dir ./data/balloon --unzip --delete
+python ./tools/dataset_converters/balloon2coco.py
+```
+
+The data for the MMYOLO project is located in the MMYOLO project directory. The `train.json` and `val.json` files store the annotations in COCO format, while the `data/balloon/train` and `data/balloon/val` directories contain all the images for the dataset.
+
+## Config
+
+Taking YOLOv5 algorithm as an example, considering the limited GPU memory of users, we need to modify some default training parameters to make them run smoothly. The key parameters to be modified are as follows:
+
+- YOLOv5 is an Anchor-Based algorithm, and different datasets need to calculate suitable anchors adaptively.
+- The default config uses 8 GPUs with a batch size of 16 per GPU. Now change it to a single GPU with a batch size of 12.
+- In principle, the learning rate should be linearly scaled accordingly when the batch size is changed, but actual measurements have found that this is not necessary.
+
+To perform the specific operation, create a new configuration file named `yolov5_ins_s-v61_syncbn_fast_8xb16-300e_balloon_instance.py` in the `configs/yolov5/ins_seg` folder. For convenience, we have already provided this configuration file. Copy the following contents into the configuration file.
+
+```python
+_base_ = './yolov5_ins_s-v61_syncbn_fast_8xb16-300e_coco_instance.py'  # noqa
+
+data_root = 'data/balloon/' # dataset root
+# Training set annotation file of json path
+train_ann_file = 'train.json'
+train_data_prefix = 'train/'  # Dataset prefix
+# Validation set annotation file of json path
+val_ann_file = 'val.json'
+val_data_prefix = 'val/'
+metainfo = {
+    'classes': ('balloon', ), # dataset category name
+    'palette': [
+        (220, 20, 60),
+    ]
+}
+num_classes = 1
+# Set batch size to 4
+train_batch_size_per_gpu = 4
+# dataloader num workers
+train_num_workers = 2
+log_interval = 1
+#####################
+train_dataloader = dict(
+    batch_size=train_batch_size_per_gpu,
+    num_workers=train_num_workers,
+    dataset=dict(
+        data_root=data_root,
+        metainfo=metainfo,
+        data_prefix=dict(img=train_data_prefix),
+        ann_file=train_ann_file))
+val_dataloader = dict(
+    dataset=dict(
+        data_root=data_root,
+        metainfo=metainfo,
+        data_prefix=dict(img=val_data_prefix),
+        ann_file=val_ann_file))
+test_dataloader = val_dataloader
+val_evaluator = dict(ann_file=data_root + val_ann_file)
+test_evaluator = val_evaluator
+default_hooks = dict(logger=dict(interval=log_interval))
+#####################
+
+model = dict(bbox_head=dict(head_module=dict(num_classes=num_classes)))
+```
+
+The above configuration inherits from `yolov5_ins_s-v61_syncbn_fast_8xb16-300e_coco_instance.py` and updates configurations such as `data_root`, `metainfo`, `train_dataloader`, `val_dataloader`, `num_classes`, etc., based on the characteristics of the balloon dataset.
+
+## Training
+
+```shell
+python tools/train.py configs/yolov5/ins_seg/yolov5_ins_s-v61_syncbn_fast_8xb16-300e_balloon_instance.py
+```
+
+After running the training command mentioned above, the folder `work_dirs/yolov5_ins_s-v61_syncbn_fast_8xb16-300e_balloon_instance` will be automatically generated. The weight files and the training configuration file for this session will be saved in this folder. On a lower-end GPU like the GTX 1660, the entire training process will take approximately 30 minutes.
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/87774050/236995027-00a16a9e-2a2d-44cc-be8a-e2c8a36ff77f.png" alt="image"/>
+</div>
+
+The performance on `val.json` is as follows:
+
+```text
+ Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.330
+ Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.509
+ Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.317
+ Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.000
+ Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.103
+ Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.417
+ Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.150
+ Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.396
+ Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.454
+ Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.000
+ Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.317
+ Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.525
+```
+
+The above performance is obtained by printing using the COCO API, where -1 indicates the absence of objects of that scale.
+
+### Some Notes
+
+The key warnings are printed during training:
+
+- You are using `YOLOv5Head` with num_classes == 1. The loss_cls will be 0. This is a normal phenomenon.
+
+The warning is because the `num_classes` currently trained is 1, the loss of the classification branch is always 0 according to the community of the YOLOv5 algorithm, which is a normal phenomenon.
+
+### Training is resumed after the interruption
+
+If you stop training, you can add `--resume` to the end of the training command and the program will automatically resume training with the latest weights file from `work_dirs`.
+
+```shell
+python tools/train.py configs/yolov5/ins_seg/yolov5_ins_s-v61_syncbn_fast_8xb16-300e_balloon_instance.py --resume
+```
+
+### Save GPU memory strategy
+
+The above config requires about 3G RAM, so if you don't have enough, consider turning on mixed-precision training
+
+```shell
+python tools/train.py configs/yolov5/ins_seg/yolov5_ins_s-v61_syncbn_fast_8xb16-300e_balloon_instance.py --amp
+```
+
+### Training visualization
+
+MMYOLO currently supports local, TensorBoard, WandB and other back-end visualization. The default is to use local visualization, and you can switch to WandB and other real-time visualization of various indicators in the training process.
+
+#### 1 WandB
+
+WandB visualization need registered in website, and in the https://wandb.ai/settings for wandb API Keys.
+
+<div align=center>
+<img src="https://cdn.vansin.top/img/20220913212628.png" alt="image"/>
+</div>
+
+```shell
+pip install wandb
+# After running wandb login, enter the API Keys obtained above, and the login is successful.
+wandb login
+```
+
+Add the wandb config at the end of config file we just created: `configs/yolov5/ins_seg/yolov5_ins_s-v61_syncbn_fast_8xb16-300e_balloon_instance.py`.
+
+```python
+visualizer = dict(vis_backends = [dict(type='LocalVisBackend'), dict(type='WandbVisBackend')])
+```
+
+Running the training command and you will see the loss, learning rate, and coco/bbox_mAP visualizations in the link.
+
+```shell
+python tools/train.py configs/yolov5/ins_seg/yolov5_ins_s-v61_syncbn_fast_8xb16-300e_balloon_instance.py
+```
+
+#### 2 Tensorboard
+
+Install Tensorboard package using the following command:
+
+```shell
+pip install tensorboard
+```
+
+Add the `tensorboard` config at the end of config file we just created: `configs/yolov5/ins_seg/yolov5_ins_s-v61_syncbn_fast_8xb16-300e_balloon_instance.py`.
+
+```python
+visualizer = dict(vis_backends=[dict(type='LocalVisBackend'),dict(type='TensorboardVisBackend')])
+```
+
+After re-running the training command, Tensorboard file will be generated in the visualization folder `work_dirs/yolov5_ins_s-v61_syncbn_fast_8xb16-300e_balloon_instance/{timestamp}/vis_data`.
+We can use Tensorboard to view the loss, learning rate, and coco/bbox_mAP visualizations from a web link by running the following command:
+
+```shell
+tensorboard --logdir=work_dirs/yolov5_ins_s-v61_syncbn_fast_8xb16-300e_balloon_instance
+```
+
+## Testing
+
+```shell
+python tools/test.py configs/yolov5/ins_seg/yolov5_ins_s-v61_syncbn_fast_8xb16-300e_balloon_instance.py \
+                     work_dirs/yolov5_ins_s-v61_syncbn_fast_8xb16-300e_balloon_instance/best_coco_bbox_mAP_epoch_300.pth \
+                     --show-dir show_results
+```
+
+Run the above test command, you can not only get the AP performance printed in the **Training** section, You can also automatically save the result images to the `work_dirs/yolov5_ins_s-v61_syncbn_fast_8xb16-300e_balloon_instance/{timestamp}/show_results` folder. Below is one of the result images, the left image is the actual annotation, and the right image is the inference result of the model.
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/87774050/236996421-46cfd38c-0827-4251-8216-408dfa9e03dd.jpg" alt="result_img"/>
+</div>
+
+You can also visualize model inference results in a browser window if you use `WandbVisBackend` or `TensorboardVisBackend`.
+
+## Feature map visualization
+
+MMYOLO provides visualization scripts for feature map to analyze the current model training. Please refer to [Feature Map Visualization](../recommended_topics/visualization.md)
+
+Due to the bias of direct visualization of `test_pipeline`, we need to modify the `test_pipeline` of `configs/yolov5/yolov5_ins_s-v61_syncbn_fast_8xb16-300e_balloon_instance.py`
+
+```python
+test_pipeline = [
+    dict(
+        type='LoadImageFromFile',
+        backend_args=_base_.backend_args),
+    dict(type='YOLOv5KeepRatioResize', scale=img_scale),
+    dict(
+        type='LetterResize',
+        scale=img_scale,
+        allow_scale_up=False,
+        pad_val=dict(img=114)),
+    dict(type='LoadAnnotations', with_bbox=True, _scope_='mmdet'),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                   'scale_factor', 'pad_param'))
+]
+```
+
+to the following config:
+
+```python
+test_pipeline = [
+    dict(
+        type='LoadImageFromFile',
+        backend_args=_base_.backend_args),
+    dict(type='mmdet.Resize', scale=img_scale, keep_ratio=False), # modify the LetterResize to mmdet.Resize
+    dict(type='LoadAnnotations', with_bbox=True, _scope_='mmdet'),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                   'scale_factor'))
+]
+```
+
+Let's choose the `data/balloon/train/3927754171_9011487133_b.jpg` image as an example to visualize the output feature maps of YOLOv5 backbone and neck layers.
+
+**1. Visualize the three channels of YOLOv5s backbone**
+
+```shell
+python demo/featmap_vis_demo.py data/balloon/train/3927754171_9011487133_b.jpg \
+    configs/yolov5/ins_seg/yolov5_ins_s-v61_syncbn_fast_8xb16-300e_balloon_instance.py \
+    work_dirs/yolov5_ins_s-v61_syncbn_fast_8xb16-300e_balloon_instance/best_coco_bbox_mAP_epoch_300.pth \ --target-layers backbone \
+    --channel-reduction squeeze_mean
+```
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/87774050/236997582-233e292f-5e96-4e44-9e92-9e0787f302fc.jpg" width="800" alt="image"/>
+</div>
+
+The result will be saved to the output folder in current path. Three output feature maps plotted in the above figure correspond to small, medium and large output feature maps.
+
+**2. Visualize the three channels of YOLOv5 neck**
+
+```shell
+python demo/featmap_vis_demo.py data/balloon/train/3927754171_9011487133_b.jpg \
+    configs/yolov5/ins_seg/yolov5_ins_s-v61_syncbn_fast_8xb16-300e_balloon_instance.py \
+    work_dirs/yolov5_ins_s-v61_syncbn_fast_8xb16-300e_balloon_instance/best_coco_bbox_mAP_epoch_300.pth \ --target-layers neck \
+    --channel-reduction squeeze_mean
+```
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/87774050/236997860-719d2e18-7767-4129-a072-b21c97a5502a.jpg" width="800" alt="image"/>
+</div>
+**3. Grad-Based CAM visualization**
+
+TODO
+
+## EasyDeploy deployment
+
+TODO
+
+The full content above can be viewed in [15_minutes_object_detection.ipynb](../../../demo/15_minutes_object_detection.ipynb). This is the end of the tutorial. If you encounter problems during training or testing, please check the [common troubleshooting steps](../recommended_topics/troubleshooting_steps.md) first and feel free to open an [issue](https://github.com/open-mmlab/mmyolo/issues/new/choose) if you still can't solve it.
diff --git a/mmdetection_practice/third_party/mmyolo/docs/en/get_started/15_minutes_object_detection.md b/mmdetection_practice/third_party/mmyolo/docs/en/get_started/15_minutes_object_detection.md
new file mode 100644
index 0000000..354b2e7
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/en/get_started/15_minutes_object_detection.md
@@ -0,0 +1,535 @@
+# 15 minutes to get started with MMYOLO object detection
+
+Object detection task refers to that given a picture, the network predicts all the categories of objects included in the picture and the corresponding boundary boxes
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/17425982/220232979-fffa480b-9ae6-4601-8af6-4116265dc650.png" alt="object detection" width="100%"/>
+</div>
+
+Take the small dataset of cat as an example, you can easily learn MMYOLO object detection in 15 minutes. The whole process consists of the following steps:
+
+- [Installation](#installation)
+- [Dataset](#dataset)
+- [Config](#config)
+- [Training](#training)
+- [Testing](#testing)
+- [EasyDeploy](#easydeploy-deployment)
+
+In this tutorial, we take YOLOv5-s as an example. For the rest of the YOLO series algorithms, please see the corresponding algorithm configuration folder.
+
+## Installation
+
+Assuming you've already installed Conda in advance, then install PyTorch using the following commands.
+
+```{note}
+Note: Since this repo uses OpenMMLab 2.0, it is better to create a new conda virtual environment to prevent conflicts with the repo installed in OpenMMLab 1.0.
+```
+
+```shell
+conda create -n mmyolo python=3.8 -y
+conda activate mmyolo
+# If you have GPU
+conda install pytorch torchvision -c pytorch
+# If you only have CPU
+# conda install pytorch torchvision cpuonly -c pytorch
+```
+
+Install MMYOLO and dependency libraries using the following commands.
+
+```shell
+git clone https://github.com/open-mmlab/mmyolo.git
+cd mmyolo
+pip install -U openmim
+mim install -r requirements/mminstall.txt
+# Install albumentations
+mim install -r requirements/albu.txt
+# Install MMYOLO
+mim install -v -e .
+# "-v" means verbose, or more output
+# "-e" means installing a project in editable mode,
+# thus any local modifications made to the code will take effect without reinstallation.
+```
+
+For details about how to configure the environment, see [Installation and verification](./installation.md).
+
+## Dataset
+
+The Cat dataset is a single-category dataset consisting of 144 pictures (the original pictures are provided by @RangeKing, and cleaned by @PeterH0323), which contains the annotation information required for training. The sample image is shown below:
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/25873202/205423220-c4b8f2fd-22ba-4937-8e47-1b3f6a8facd8.png" alt="cat dataset"/>
+</div>
+
+You can download and use it directly by the following command:
+
+```shell
+python tools/misc/download_dataset.py --dataset-name cat --save-dir ./data/cat --unzip --delete
+```
+
+This dataset is automatically downloaded to the `./data/cat` dir with the following directory structure:
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/17425982/220072078-48b88a08-6179-483e-b8d3-0549e1b465de.png" alt="image"/>
+</div>
+
+The cat dataset is located in the mmyolo project dir, and `data/cat/annotations` stores annotations in COCO format, and `data/cat/images` stores all images
+
+## Config
+
+Taking YOLOv5 algorithm as an example, considering the limited GPU memory of users, we need to modify some default training parameters to make them run smoothly. The key parameters to be modified are as follows:
+
+- YOLOv5 is an Anchor-Based algorithm, and different datasets need to calculate suitable anchors adaptively
+- The default config uses 8 GPUs with a batch size of 16 per GPU. Now change it to a single GPU with a batch size of 12.
+- The default training epoch is 300. Change it to 40 epoch
+- Given the small size of the dataset, we opted to use fixed backbone weights
+- In principle, the learning rate should be linearly scaled accordingly when the batch size is changed, but actual measurements have found that this is not necessary
+
+Create a `yolov5_s-v61_fast_1xb12-40e_cat.py` config file in the `configs/yolov5` folder (we have provided this config for you to use directly) and copy the following into the config file.
+
+```python
+# Inherit and overwrite part of the config based on this config
+_base_ = 'yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py'
+
+data_root = './data/cat/' # dataset root
+class_name = ('cat', ) # dataset category name
+num_classes = len(class_name) # dataset category number
+# metainfo is a configuration that must be passed to the dataloader, otherwise it is invalid
+# palette is a display color for category at visualization
+# The palette length must be greater than or equal to the length of the classes
+metainfo = dict(classes=class_name, palette=[(20, 220, 60)])
+
+# Adaptive anchor based on tools/analysis_tools/optimize_anchors.py
+anchors = [
+    [(68, 69), (154, 91), (143, 162)],  # P3/8
+    [(242, 160), (189, 287), (391, 207)],  # P4/16
+    [(353, 337), (539, 341), (443, 432)]  # P5/32
+]
+# Max training 40 epoch
+max_epochs = 40
+# Set batch size to 12
+train_batch_size_per_gpu = 12
+# dataloader num workers
+train_num_workers = 4
+
+# load COCO pre-trained weight
+load_from = 'https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth'  # noqa
+
+model = dict(
+    # Fixed the weight of the entire backbone without training
+    backbone=dict(frozen_stages=4),
+    bbox_head=dict(
+        head_module=dict(num_classes=num_classes),
+        prior_generator=dict(base_sizes=anchors)
+    ))
+
+train_dataloader = dict(
+    batch_size=train_batch_size_per_gpu,
+    num_workers=train_num_workers,
+    dataset=dict(
+        data_root=data_root,
+        metainfo=metainfo,
+        # Dataset annotation file of json path
+        ann_file='annotations/trainval.json',
+        # Dataset prefix
+        data_prefix=dict(img='images/')))
+
+val_dataloader = dict(
+    dataset=dict(
+        metainfo=metainfo,
+        data_root=data_root,
+        ann_file='annotations/test.json',
+        data_prefix=dict(img='images/')))
+
+test_dataloader = val_dataloader
+
+_base_.optim_wrapper.optimizer.batch_size_per_gpu = train_batch_size_per_gpu
+
+val_evaluator = dict(ann_file=data_root + 'annotations/test.json')
+test_evaluator = val_evaluator
+
+default_hooks = dict(
+    # Save weights every 10 epochs and a maximum of two weights can be saved.
+    # The best model is saved automatically during model evaluation
+    checkpoint=dict(interval=10, max_keep_ckpts=2, save_best='auto'),
+    # The warmup_mim_iter parameter is critical.
+    # The default value is 1000 which is not suitable for cat datasets.
+    param_scheduler=dict(max_epochs=max_epochs, warmup_mim_iter=10),
+    # The log printing interval is 5
+    logger=dict(type='LoggerHook', interval=5))
+# The evaluation interval is 10
+train_cfg = dict(max_epochs=max_epochs, val_interval=10)
+```
+
+The above config is inherited from `yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py`. According to the characteristics of cat dataset updated `data_root`, `metainfo`, `train_dataloader`, `val_dataloader`, `num_classes` and other config.
+
+## Training
+
+```shell
+python tools/train.py configs/yolov5/yolov5_s-v61_fast_1xb12-40e_cat.py
+```
+
+Run the above training command, `work_dirs/yolov5_s-v61_fast_1xb12-40e_cat` folder will be automatically generated, the checkpoint file and the training config file will be saved in this folder. On a low-end 1660 GPU, the entire training process takes about eight minutes.
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/17425982/220236361-bd113606-248e-4a0e-a484-c0dc9e355b5b.png" alt="image"/>
+</div>
+
+The performance on `test.json` is as follows:
+
+```text
+ Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.631
+ Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.909
+ Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.747
+ Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = -1.000
+ Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = -1.000
+ Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.631
+ Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.627
+ Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.703
+ Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.703
+ Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = -1.000
+ Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = -1.000
+ Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.703
+```
+
+The above properties are printed via the COCO API, where -1 indicates that no object exists for the scale. According to the rules defined by COCO, the Cat dataset contains all large sized objects, and there are no small or medium-sized objects.
+
+### Some Notes
+
+Two key warnings are printed during training:
+
+- You are using `YOLOv5Head` with num_classes == 1. The loss_cls will be 0. This is a normal phenomenon.
+- The model and loaded state dict do not match exactly
+
+Neither of these warnings will have any impact on performance. The first warning is because the `num_classes` currently trained is 1, the loss of the classification branch is always 0 according to the community of the YOLOv5 algorithm, which is a normal phenomenon. The second warning is because we are currently training in fine-tuning mode, we load the COCO pre-trained weights for 80 classes,
+This will lead to the final Head module convolution channel number does not correspond, resulting in this part of the weight can not be loaded, which is also a normal phenomenon.
+
+### Training is resumed after the interruption
+
+If you stop training, you can add `--resume` to the end of the training command and the program will automatically resume training with the latest weights file from `work_dirs`.
+
+```shell
+python tools/train.py configs/yolov5/yolov5_s-v61_fast_1xb12-40e_cat.py --resume
+```
+
+### Save GPU memory strategy
+
+The above config requires about 3G RAM, so if you don't have enough, consider turning on mixed-precision training
+
+```shell
+python tools/train.py configs/yolov5/yolov5_s-v61_fast_1xb12-40e_cat.py --amp
+```
+
+### Training visualization
+
+MMYOLO currently supports local, TensorBoard, WandB and other back-end visualization. The default is to use local visualization, and you can switch to WandB and other real-time visualization of various indicators in the training process.
+
+#### 1 WandB
+
+WandB visualization need registered in website, and in the https://wandb.ai/settings for wandb API Keys.
+
+<div align=center>
+<img src="https://cdn.vansin.top/img/20220913212628.png" alt="image"/>
+</div>
+
+```shell
+pip install wandb
+# After running wandb login, enter the API Keys obtained above, and the login is successful.
+wandb login
+```
+
+Add the wandb config at the end of config file we just created: `configs/yolov5/yolov5_s-v61_fast_1xb12-40e_cat.py`.
+
+```python
+visualizer = dict(vis_backends = [dict(type='LocalVisBackend'), dict(type='WandbVisBackend')])
+```
+
+Running the training command and you will see the loss, learning rate, and coco/bbox_mAP visualizations in the link.
+
+```shell
+python tools/train.py configs/yolov5/yolov5_s-v61_fast_1xb12-40e_cat.py
+```
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/17425982/222131114-30a79285-56bc-427d-a38d-8d6a6982ad60.png" alt="image"/>
+</div>
+<div align=center>
+<img src="https://user-images.githubusercontent.com/17425982/222132585-4b4962f1-211b-46f7-86b3-7534fc52a1b4.png" alt="image"/>
+</div>
+
+#### 2 Tensorboard
+
+Install Tensorboard package:
+
+```shell
+pip install tensorboard
+```
+
+Add the `tensorboard` config at the end of config file we just created: `configs/yolov5/yolov5_s-v61_fast_1xb12-40e_cat.py`.
+
+```python
+visualizer = dict(vis_backends=[dict(type='LocalVisBackend'),dict(type='TensorboardVisBackend')])
+```
+
+After re-running the training command, Tensorboard file will be generated in the visualization folder `work_dirs/yolov5_s-v61_fast_1xb12-40e_cat/{timestamp}/vis_data`.
+We can use Tensorboard to view the loss, learning rate, and coco/bbox_mAP visualizations from a web link by running the following command:
+
+```shell
+tensorboard --logdir=work_dirs/yolov5_s-v61_fast_1xb12-40e_cat
+```
+
+## Testing
+
+```shell
+python tools/test.py configs/yolov5/yolov5_s-v61_fast_1xb12-40e_cat.py \
+                     work_dirs/yolov5_s-v61_fast_1xb12-40e_cat/epoch_40.pth \
+                     --show-dir show_results
+```
+
+Run the above test command, you can not only get the AP performance printed in the **Training** section, You can also automatically save the result images to the `work_dirs/yolov5_s-v61_fast_1xb12-40e_cat/{timestamp}/show_results` folder. Below is one of the result images, the left image is the actual annotation, and the right image is the inference result of the model.
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/17425982/220251677-6c7e5c8f-9417-4803-97fc-a968d0172ab7.png" alt="result_img"/>
+</div>
+
+You can also visualize model inference results in a browser window if you use 'WandbVisBackend' or 'TensorboardVisBackend'.
+
+## Feature map visualization
+
+MMYOLO provides visualization scripts for feature map to analyze the current model training. Please refer to [Feature Map Visualization](../recommended_topics/visualization.md)
+
+Due to the bias of direct visualization of `test_pipeline`, we need to modify the `test_pipeline` of `configs/yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py`
+
+```python
+test_pipeline = [
+    dict(
+        type='LoadImageFromFile',
+        backend_args=_base_.backend_args),
+    dict(type='YOLOv5KeepRatioResize', scale=img_scale),
+    dict(
+        type='LetterResize',
+        scale=img_scale,
+        allow_scale_up=False,
+        pad_val=dict(img=114)),
+    dict(type='LoadAnnotations', with_bbox=True, _scope_='mmdet'),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                   'scale_factor', 'pad_param'))
+]
+```
+
+to the following config:
+
+```python
+test_pipeline = [
+    dict(
+        type='LoadImageFromFile',
+        backend_args=_base_.backend_args),
+    dict(type='mmdet.Resize', scale=img_scale, keep_ratio=False), # modify the LetterResize to mmdet.Resize
+    dict(type='LoadAnnotations', with_bbox=True, _scope_='mmdet'),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                   'scale_factor'))
+]
+```
+
+Let's choose the `data/cat/images/IMG_20221020_112705.jpg` image as an example to visualize the output feature maps of YOLOv5 backbone and neck layers.
+
+**1. Visualize the three channels of YOLOv5 backbone**
+
+```shell
+python demo/featmap_vis_demo.py data/cat/images/IMG_20221020_112705.jpg \
+                                configs/yolov5/yolov5_s-v61_fast_1xb12-40e_cat.py \
+                                work_dirs/yolov5_s-v61_fast_1xb12-40e_cat/epoch_40.pth \
+                                --target-layers backbone \
+                                --channel-reduction squeeze_mean
+```
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/17425982/220292217-b343a6f4-0c88-4fdb-9680-35d0ff8e5bdb.png" width="800" alt="image"/>
+</div>
+
+The result will be saved to the output folder in current path. Three output feature maps plotted in the above figure correspond to small, medium and large output feature maps. As the backbone of this training is not actually involved in training, it can be seen from the above figure that the big object cat is predicted on the small feature map, which is in line with the idea of hierarchical detection of object detection.
+
+**2. Visualize the three channels of YOLOv5 neck**
+
+```shell
+python demo/featmap_vis_demo.py data/cat/images/IMG_20221020_112705.jpg \
+                                configs/yolov5/yolov5_s-v61_fast_1xb12-40e_cat.py \
+                                work_dirs/yolov5_s-v61_fast_1xb12-40e_cat/epoch_40.pth \
+                                --target-layers neck \
+                                --channel-reduction squeeze_mean
+```
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/17425982/220293382-0a241415-e717-4688-a718-5f6d5c844785.png" width="800" alt="image"/>
+</div>
+
+As can be seen from the above figure, because neck is involved in training, and we also reset anchor, the three output feature maps are forced to simulate the same scale object, resulting in the three output maps of neck are similar, which destroys the original pre-training distribution of backbone. At the same time, it can also be seen that 40 epochs are not enough to train the above dataset, and the feature maps do not perform well.
+
+**3. Grad-Based CAM visualization**
+
+Based on the above feature map visualization, we can analyze Grad CAM at the feature layer of bbox level.
+
+Install `grad-cam` package:
+
+```shell
+pip install "grad-cam"
+```
+
+(a) View Grad CAM of the minimum output feature map of the neck
+
+```shell
+python demo/boxam_vis_demo.py data/cat/images/IMG_20221020_112705.jpg \
+                              configs/yolov5/yolov5_s-v61_fast_1xb12-40e_cat.py \
+                              work_dirs/yolov5_s-v61_fast_1xb12-40e_cat/epoch_40.pth \
+                              --target-layer neck.out_layers[2]
+```
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/17425982/220298462-b0631f27-2366-4864-915a-a4ee21acd4b9.png" width="800" alt="image"/>
+</div>
+
+(b) View Grad CAM of the medium output feature map of the neck
+
+```shell
+python demo/boxam_vis_demo.py data/cat/images/IMG_20221020_112705.jpg \
+                              configs/yolov5/yolov5_s-v61_fast_1xb12-40e_cat.py \
+                              work_dirs/yolov5_s-v61_fast_1xb12-40e_cat/epoch_40.pth \
+                              --target-layer neck.out_layers[1]
+```
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/17425982/220298090-6f335786-0b35-4ab8-9c5a-0dbdb6b6c967.png" width="800" alt="image"/>
+</div>
+
+(c) View Grad CAM of the maximum output feature map of the neck
+
+```shell
+python demo/boxam_vis_demo.py data/cat/images/IMG_20221020_112705.jpg \
+                              configs/yolov5/yolov5_s-v61_fast_1xb12-40e_cat.py \
+                              work_dirs/yolov5_s-v61_fast_1xb12-40e_cat/epoch_40.pth \
+                              --target-layer neck.out_layers[0]
+```
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/17425982/220297905-e23369db-d383-48f9-b15e-528a70ec7b23.png" width="800" alt="image"/>
+</div>
+
+## EasyDeploy deployment
+
+Here we'll use MMYOLO's [EasyDeploy](../../../projects/easydeploy/) to demonstrate the transformation deployment and basic inference of model.
+
+First you need to follow EasyDeploy's [basic documentation](../../../projects/easydeploy/docs/model_convert.md) controls own equipment installed for each library.
+
+```shell
+pip install onnx
+pip install onnx-simplifier # Install if you want to use simplify
+pip install tensorrt        # If you have GPU environment and need to output TensorRT model you need to continue execution
+```
+
+Once installed, you can use the following command to transform and deploy the trained model on the cat dataset with one click. The current ONNX version is 1.13.0 and TensorRT version is 8.5.3.1, so keep the `--opset` value of 11. The remaining parameters need to be adjusted according to the config used. Here we export the CPU version of ONNX with the `--backend` set to 1.
+
+```shell
+python projects/easydeploy/tools/export.py \
+	configs/yolov5/yolov5_s-v61_fast_1xb12-40e_cat.py \
+	work_dirs/yolov5_s-v61_fast_1xb12-40e_cat/epoch_40.pth \
+	--work-dir work_dirs/yolov5_s-v61_fast_1xb12-40e_cat \
+    --img-size 640 640 \
+    --batch 1 \
+    --device cpu \
+    --simplify \
+	--opset 11 \
+	--backend 1 \
+	--pre-topk 1000 \
+	--keep-topk 100 \
+	--iou-threshold 0.65 \
+	--score-threshold 0.25
+```
+
+On success, you will get the converted ONNX model under `work-dir`, which is named `end2end.onnx` by default.
+
+Let's use `end2end.onnx` model to perform a basic image inference:
+
+```shell
+python projects/easydeploy/tools/image-demo.py \
+    data/cat/images/IMG_20210728_205312.jpg \
+    configs/yolov5/yolov5_s-v61_fast_1xb12-40e_cat.py \
+    work_dirs/yolov5_s-v61_fast_1xb12-40e_cat/end2end.onnx \
+    --device cpu
+```
+
+After successful inference, the result image will be generated in the `output` folder of the default MMYOLO root directory. If you want to see the result without saving it, you can add `--show` to the end of the above command. For convenience, the following is the generated result.
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/7219519/221061210-b91e0b5b-652d-4dfc-8451-86a9a36f7d04.png" width="800" alt="image"/>
+</div>
+
+Let's go on to convert the engine file for TensorRT, because TensorRT needs to be specific to the current environment and deployment version, so make sure to export the parameters, here we export the TensorRT8 file, the `--backend` is 2.
+
+```shell
+python projects/easydeploy/tools/export.py \
+    configs/yolov5/yolov5_s-v61_fast_1xb12-40e_cat.py \
+    work_dirs/yolov5_s-v61_fast_1xb12-40e_cat/epoch_40.pth \
+    --work-dir work_dirs/yolov5_s-v61_fast_1xb12-40e_cat \
+    --img-size 640 640 \
+    --batch 1 \
+    --device cuda:0 \
+    --simplify \
+    --opset 11 \
+    --backend 2 \
+    --pre-topk 1000 \
+    --keep-topk 100 \
+    --iou-threshold 0.65 \
+    --score-threshold 0.25
+```
+
+The resulting `end2end.onnx` is the ONNX file for the TensorRT8 deployment, which we will use to complete the TensorRT engine transformation.
+
+```shell
+python projects/easydeploy/tools/build_engine.py \
+    work_dirs/yolov5_s-v61_fast_1xb12-40e_cat/end2end.onnx \
+    --img-size 640 640 \
+    --device cuda:0
+```
+
+Successful execution will generate the `end2end.engine` file under `work-dir`:
+
+```shell
+work_dirs/yolov5_s-v61_fast_1xb12-40e_cat
+├── 202302XX_XXXXXX
+│   ├── 202302XX_XXXXXX.log
+│   └── vis_data
+│       ├── 202302XX_XXXXXX.json
+│       ├── config.py
+│       └── scalars.json
+├── best_coco
+│   └── bbox_mAP_epoch_40.pth
+├── end2end.engine
+├── end2end.onnx
+├── epoch_30.pth
+├── epoch_40.pth
+├── last_checkpoint
+└── yolov5_s-v61_fast_1xb12-40e_cat.py
+```
+
+Let's continue use `image-demo.py` for image inference:
+
+```shell
+python projects/easydeploy/tools/image-demo.py \
+    data/cat/images/IMG_20210728_205312.jpg \
+    configs/yolov5/yolov5_s-v61_fast_1xb12-40e_cat.py \
+    work_dirs/yolov5_s-v61_fast_1xb12-40e_cat/end2end.engine \
+    --device cuda:0
+```
+
+Here we choose to save the inference results under `output` instead of displaying them directly. The following shows the inference results.
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/7219519/221061291-e7490bb6-5f0c-45ab-9fc4-caf2b62419d6.png" width="800" alt="image"/>
+</div>
+
+This completes the transformation deployment of the trained model and checks the inference results. This is the end of the tutorial.
+
+The full content above can be viewed in [15_minutes_object_detection.ipynb](https://github.com/open-mmlab/mmyolo/blob/dev/demo/15_minutes_object_detection.ipynb). If you encounter problems during training or testing, please check the [common troubleshooting steps](../recommended_topics/troubleshooting_steps.md) first and feel free to open an [issue](https://github.com/open-mmlab/mmyolo/issues/new/choose) if you still can't solve it.
diff --git a/mmdetection_practice/third_party/mmyolo/docs/en/get_started/15_minutes_rotated_object_detection.md b/mmdetection_practice/third_party/mmyolo/docs/en/get_started/15_minutes_rotated_object_detection.md
new file mode 100644
index 0000000..6e04c8c
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/en/get_started/15_minutes_rotated_object_detection.md
@@ -0,0 +1,3 @@
+# 15 minutes to get started with MMYOLO rotated object detection
+
+TODO
diff --git a/mmdetection_practice/third_party/mmyolo/docs/en/get_started/dependencies.md b/mmdetection_practice/third_party/mmyolo/docs/en/get_started/dependencies.md
new file mode 100644
index 0000000..0d7fc6a
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/en/get_started/dependencies.md
@@ -0,0 +1,60 @@
+# Prerequisites
+
+Compatible MMEngine, MMCV and MMDetection versions are shown as below. Please install the correct version to avoid installation issues.
+
+| MMYOLO version |   MMDetection version    |     MMEngine version     |      MMCV version       |
+| :------------: | :----------------------: | :----------------------: | :---------------------: |
+|      main      |  mmdet>=3.0.0, \<3.1.0   | mmengine>=0.7.1, \<1.0.0 | mmcv>=2.0.0rc4, \<2.1.0 |
+|     0.6.0      |  mmdet>=3.0.0, \<3.1.0   | mmengine>=0.7.1, \<1.0.0 | mmcv>=2.0.0rc4, \<2.1.0 |
+|     0.5.0      | mmdet>=3.0.0rc6, \<3.1.0 | mmengine>=0.6.0, \<1.0.0 | mmcv>=2.0.0rc4, \<2.1.0 |
+|     0.4.0      | mmdet>=3.0.0rc5, \<3.1.0 | mmengine>=0.3.1, \<1.0.0 | mmcv>=2.0.0rc0, \<2.1.0 |
+|     0.3.0      | mmdet>=3.0.0rc5, \<3.1.0 | mmengine>=0.3.1, \<1.0.0 | mmcv>=2.0.0rc0, \<2.1.0 |
+|     0.2.0      | mmdet>=3.0.0rc3, \<3.1.0 | mmengine>=0.3.1, \<1.0.0 | mmcv>=2.0.0rc0, \<2.1.0 |
+|     0.1.3      | mmdet>=3.0.0rc3, \<3.1.0 | mmengine>=0.3.1, \<1.0.0 | mmcv>=2.0.0rc0, \<2.1.0 |
+|     0.1.2      | mmdet>=3.0.0rc2, \<3.1.0 | mmengine>=0.3.0, \<1.0.0 | mmcv>=2.0.0rc0, \<2.1.0 |
+|     0.1.1      |     mmdet==3.0.0rc1      | mmengine>=0.1.0, \<0.2.0 | mmcv>=2.0.0rc0, \<2.1.0 |
+|     0.1.0      |     mmdet==3.0.0rc0      | mmengine>=0.1.0, \<0.2.0 | mmcv>=2.0.0rc0, \<2.1.0 |
+
+In this section, we demonstrate how to prepare an environment with PyTorch.
+
+MMDetection works on Linux, Windows, and macOS. It requires:
+
+- Python 3.7+
+- PyTorch 1.7+
+- CUDA 9.2+
+- GCC 5.4+
+
+```{note}
+If you are experienced with PyTorch and have already installed it, just skip this part and jump to the [next section](#installation). Otherwise, you can follow these steps for the preparation.
+```
+
+**Step 0.** Download and install Miniconda from the [official website](https://docs.conda.io/en/latest/miniconda.html).
+
+**Step 1.** Create a conda environment and activate it.
+
+```shell
+conda create --name openmmlab python=3.8 -y
+conda activate openmmlab
+```
+
+**Step 2.** Install PyTorch following [official commands](https://pytorch.org/get-started/locally/), e.g.
+
+On GPU platforms:
+
+```shell
+conda install pytorch torchvision -c pytorch
+```
+
+On CPU platforms:
+
+```shell
+conda install pytorch torchvision cpuonly -c pytorch
+```
+
+**Step 3.** Verify PyTorch installation
+
+```shell
+python -c "import torch; print(torch.__version__); print(torch.cuda.is_available())"
+```
+
+If the GPU is used, the version information and `True` are printed; otherwise, the version information and `False` are printed.
diff --git a/mmdetection_practice/third_party/mmyolo/docs/en/get_started/installation.md b/mmdetection_practice/third_party/mmyolo/docs/en/get_started/installation.md
new file mode 100644
index 0000000..3259acf
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/en/get_started/installation.md
@@ -0,0 +1,131 @@
+# Installation
+
+## Best Practices
+
+**Step 0.** Install [MMEngine](https://github.com/open-mmlab/mmengine) and [MMCV](https://github.com/open-mmlab/mmcv) using [MIM](https://github.com/open-mmlab/mim).
+
+```shell
+pip install -U openmim
+mim install "mmengine>=0.6.0"
+mim install "mmcv>=2.0.0rc4,<2.1.0"
+mim install "mmdet>=3.0.0,<4.0.0"
+```
+
+If you are currently in the mmyolo project directory, you can use the following simplified commands
+
+```shell
+cd mmyolo
+pip install -U openmim
+mim install -r requirements/mminstall.txt
+```
+
+**Note:**
+
+a. In MMCV-v2.x, `mmcv-full` is rename to `mmcv`, if you want to install `mmcv` without CUDA ops, you can use `mim install "mmcv-lite>=2.0.0rc1"` to install the lite version.
+
+b. If you would like to use `albumentations`, we suggest using `pip install -r requirements/albu.txt` or `pip install -U albumentations --no-binary qudida,albumentations`. If you simply use `pip install albumentations==1.0.1`, it will install `opencv-python-headless` simultaneously (even though you have already installed `opencv-python`). We recommended checking the environment after installing albumentation to ensure that `opencv-python` and `opencv-python-headless` are not installed at the same time, because it might cause unexpected issues if they both installed. Please refer to [official documentation](https://albumentations.ai/docs/getting_started/installation/#note-on-opencv-dependencies) for more details.
+
+**Step 1.** Install MMYOLO.
+
+Case a: If you develop and run mmdet directly, install it from source:
+
+```shell
+git clone https://github.com/open-mmlab/mmyolo.git
+cd mmyolo
+# Install albumentations
+pip install -r requirements/albu.txt
+# Install MMYOLO
+mim install -v -e .
+# "-v" means verbose, or more output
+# "-e" means installing a project in editable mode,
+# thus any local modifications made to the code will take effect without reinstallation.
+```
+
+Case b: If you use MMYOLO as a dependency or third-party package, install it with MIM:
+
+```shell
+mim install "mmyolo"
+```
+
+## Verify the installation
+
+To verify whether MMYOLO is installed correctly, we provide  an inference demo.
+
+**Step 1.** We need to download config and checkpoint files.
+
+```shell
+mim download mmyolo --config yolov5_s-v61_syncbn_fast_8xb16-300e_coco --dest .
+```
+
+The downloading will take several seconds or more, depending on your network environment. When it is done, you will find two files `yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py` and `yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth` in your current folder.
+
+**Step 2.** Verify the inference demo.
+
+Option (a). If you install MMYOLO from source, just run the following command.
+
+```shell
+python demo/image_demo.py demo/demo.jpg \
+                          yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py \
+                          yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth
+
+# Optional parameters
+# --out-dir ./output *The detection results are output to the specified directory. When args have action --show, the script do not save results. Default: ./output
+# --device cuda:0    *The computing resources used, including cuda and cpu. Default: cuda:0
+# --show             *Display the results on the screen. Default: False
+# --score-thr 0.3    *Confidence threshold. Default: 0.3
+```
+
+You will see a new image on your `output` folder, where bounding boxes are plotted.
+
+Supported input types:
+
+- Single image, include `jpg`, `jpeg`, `png`, `ppm`, `bmp`, `pgm`, `tif`, `tiff`, `webp`.
+- Folder, all image files in the folder will be traversed and the corresponding results will be output.
+- URL, will automatically download from the URL and the corresponding results will be output.
+
+Option (b). If you install MMYOLO with MIM, open your python interpreter and copy&paste the following codes.
+
+```python
+from mmdet.apis import init_detector, inference_detector
+
+config_file = 'yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py'
+checkpoint_file = 'yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth'
+model = init_detector(config_file, checkpoint_file, device='cpu')  # or device='cuda:0'
+inference_detector(model, 'demo/demo.jpg')
+```
+
+You will see a list of `DetDataSample`, and the predictions are in the `pred_instance`, indicating the detected bounding boxes, labels, and scores.
+
+## Using MMYOLO with Docker
+
+We provide a [Dockerfile](https://github.com/open-mmlab/mmyolo/blob/main/docker/Dockerfile) to build an image. Ensure that your [docker version](https://docs.docker.com/engine/install/) >=19.03.
+
+Reminder: If you find out that your download speed is very slow, we suggest canceling the comments in the last two lines of `Optional` in the [Dockerfile](https://github.com/open-mmlab/mmyolo/blob/main/docker/Dockerfile#L19-L20) to obtain a rocket like download speed:
+
+```dockerfile
+# (Optional)
+RUN sed -i 's/http:\/\/archive.ubuntu.com\/ubuntu\//http:\/\/mirrors.aliyun.com\/ubuntu\//g' /etc/apt/sources.list && \
+    pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
+```
+
+Build Command:
+
+```shell
+# build an image with PyTorch 1.9, CUDA 11.1
+# If you prefer other versions, just modified the Dockerfile
+docker build -t mmyolo docker/
+```
+
+Run it with:
+
+```shell
+export DATA_DIR=/path/to/your/dataset
+docker run --gpus all --shm-size=8g -it -v ${DATA_DIR}:/mmyolo/data mmyolo
+```
+
+For other customized inatallation, see [Customized Installation](../tutorials/custom_installation.md)
+
+## Troubleshooting
+
+If you have some issues during the installation, please first view the [FAQ](../tutorials/faq.md) page.
+You may [open an issue](https://github.com/open-mmlab/mmyolo/issues/new/choose) on GitHub if no solution is found.
diff --git a/mmdetection_practice/third_party/mmyolo/docs/en/get_started/overview.md b/mmdetection_practice/third_party/mmyolo/docs/en/get_started/overview.md
new file mode 100644
index 0000000..52bcbd1
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/en/get_started/overview.md
@@ -0,0 +1,81 @@
+# Overview
+
+## MMYOLO Introduction
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/45811724/190993591-bd3f1f11-1c30-4b93-b5f4-05c9ff64ff7f.gif" alt="image"/>
+</div>
+
+MMYOLO is an open-source algorithms toolkit of YOLO based on PyTorch and MMDetection, part of the [OpenMMLab](https://openmmlab.com/) project. MMYOLO is positioned as a popular open-source library of YOLO series and core library of industrial applications. Its vision diagram is shown as follows:
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/17425982/220060451-d50414e5-a239-45b7-a4db-ed8699820300.png" alt="vision diagram"/>
+</div>
+
+The following tasks are currently supported:
+
+<details open>
+<summary><b>Tasks currently supported</b></summary>
+
+- Object detection
+- Rotated object detection
+
+</details>
+
+The YOLO series of algorithms currently supported are as follows:
+
+<details open>
+<summary><b>Algorithms currently supported</b></summary>
+
+- YOLOv5
+- YOLOX
+- RTMDet
+- RTMDet-Rotated
+- YOLOv6
+- YOLOv7
+- PPYOLOE
+- YOLOv8
+
+</details>
+
+The datasets currently supported are as follows:
+
+<details open>
+<summary><b>Datasets currently supported</b></summary>
+
+- COCO Dataset
+- VOC Dataset
+- CrowdHuman Dataset
+- DOTA 1.0 Dataset
+
+</details>
+
+MMYOLO runs on Linux, Windows, macOS, and supports PyTorch 1.7 or later. It has the following three characteristics:
+
+- 🕹️ **Unified and convenient algorithm evaluation**
+
+  MMYOLO unifies various YOLO algorithm modules and provides a unified evaluation process, so that users can compare and analyze fairly and conveniently.
+
+- 📚 **Extensive documentation for started and advanced**
+
+  MMYOLO provides a series of documents, including getting started, deployment, advanced practice and algorithm analysis, which is convenient for different users to get started and expand.
+
+- 🧩 **Modular Design**
+
+  MMYOLO disentangled the framework into modular components, and users can easily build custom models by combining different modules and training and testing strategies.
+
+<img src="https://user-images.githubusercontent.com/27466624/199999337-0544a4cb-3cbd-4f3e-be26-bcd9e74db7ff.jpg" alt="Base module-P5"/>
+  This image is provided by RangeKing@GitHub, thanks very much!
+
+## User guide for this documentation
+
+MMYOLO divides the document structure into 6 parts, corresponding to different user needs.
+
+- **Get started with MMYOLO**. This part is must read for first-time MMYOLO users, so please read it carefully.
+- **Recommend Topics**. This part is the essence documentation provided in MMYOLO by topics, including lots of MMYOLO features, etc. Highly recommended reading for all MMYOLO users.
+- **Common functions**. This part provides a list of common features that you will use during the training and testing process, so you can refer back to them when you need.
+- **Useful tools**. This part is useful tools summary under `tools`, so that you can quickly and happily use the various scripts provided in MMYOLO.
+- **Basic and advanced tutorials**. This part introduces some basic concepts and advanced tutorials in MMYOLO. It is suitable for users who want to understand the design idea and structure design of MMYOLO in detail.
+- **Others**. The rest includes model repositories, specifications and interface documentation, etc.
+
+Users with different needs can choose your favorite content to read. If you have any questions about this documentation or a better idea to improve it, welcome to post a Pull Request to MMYOLO ~. Please refer to [How to Contribute to MMYOLO](../recommended_topics/contributing.md)
diff --git a/mmdetection_practice/third_party/mmyolo/docs/en/index.rst b/mmdetection_practice/third_party/mmyolo/docs/en/index.rst
new file mode 100644
index 0000000..1a0ab6c
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/en/index.rst
@@ -0,0 +1,120 @@
+Welcome to MMYOLO's documentation!
+=======================================
+You can switch between Chinese and English documents in the top-right corner of the layout.
+
+.. toctree::
+   :maxdepth: 2
+   :caption: Get Started
+
+   get_started/overview.md
+   get_started/dependencies.md
+   get_started/installation.md
+   get_started/15_minutes_object_detection.md
+   get_started/15_minutes_rotated_object_detection.md
+   get_started/15_minutes_instance_segmentation.md
+   get_started/article.md
+
+.. toctree::
+   :maxdepth: 2
+   :caption: Recommended Topics
+
+   recommended_topics/contributing.md
+   recommended_topics/training_testing_tricks.md
+   recommended_topics/model_design.md
+   recommended_topics/algorithm_descriptions/index.rst
+   recommended_topics/application_examples/index.rst
+   recommended_topics/replace_backbone.md
+   recommended_topics/complexity_analysis.md
+   recommended_topics/labeling_to_deployment_tutorials.md
+   recommended_topics/visualization.md
+   recommended_topics/deploy/index.rst
+   recommended_topics/troubleshooting_steps.md
+   recommended_topics/mm_basics.md
+   recommended_topics/dataset_preparation.md
+
+.. toctree::
+   :maxdepth: 2
+   :caption: Common Usage
+
+   common_usage/resume_training.md
+   common_usage/syncbn.md
+   common_usage/amp_training.md
+   common_usage/ms_training_testing.md
+   common_usage/tta.md
+   common_usage/plugins.md
+   common_usage/freeze_layers.md
+   common_usage/output_predictions.md
+   common_usage/set_random_seed.md
+   common_usage/module_combination.md
+   common_usage/mim_usage.md
+   common_usage/multi_necks.md
+   common_usage/specify_device.md
+   common_usage/single_multi_channel_applications.md
+
+
+.. toctree::
+   :maxdepth: 2
+   :caption: Useful Tools
+
+   useful_tools/browse_coco_json.md
+   useful_tools/browse_dataset.md
+   useful_tools/print_config.md
+   useful_tools/dataset_analysis.md
+   useful_tools/optimize_anchors.md
+   useful_tools/extract_subcoco.md
+   useful_tools/vis_scheduler.md
+   useful_tools/dataset_converters.md
+   useful_tools/download_dataset.md
+   useful_tools/log_analysis.md
+   useful_tools/model_converters.md
+
+.. toctree::
+   :maxdepth: 2
+   :caption: Basic Tutorials
+
+   tutorials/config.md
+   tutorials/data_flow.md
+   tutorials/custom_installation.md
+   tutorials/warning_notes.md
+   tutorials/faq.md
+
+
+.. toctree::
+   :maxdepth: 2
+   :caption: Advanced Tutorials
+
+   advanced_guides/cross-library_application.md
+
+
+.. toctree::
+   :maxdepth: 2
+   :caption: Model Zoo
+
+   model_zoo.md
+
+.. toctree::
+   :maxdepth: 1
+   :caption: Notes
+
+   notes/changelog.md
+   notes/compatibility.md
+   notes/conventions.md
+   notes/code_style.md
+
+.. toctree::
+   :maxdepth: 1
+   :caption: API Reference
+
+   api.rst
+
+.. toctree::
+   :caption: Switch Language
+
+   switch_language.md
+
+
+Indices and tables
+==================
+
+* :ref:`genindex`
+* :ref:`search`
diff --git a/mmdetection_practice/third_party/mmyolo/docs/en/make.bat b/mmdetection_practice/third_party/mmyolo/docs/en/make.bat
new file mode 100644
index 0000000..922152e
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/en/make.bat
@@ -0,0 +1,35 @@
+@ECHO OFF
+
+pushd %~dp0
+
+REM Command file for Sphinx documentation
+
+if "%SPHINXBUILD%" == "" (
+	set SPHINXBUILD=sphinx-build
+)
+set SOURCEDIR=.
+set BUILDDIR=_build
+
+if "%1" == "" goto help
+
+%SPHINXBUILD% >NUL 2>NUL
+if errorlevel 9009 (
+	echo.
+	echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
+	echo.installed, then set the SPHINXBUILD environment variable to point
+	echo.to the full path of the 'sphinx-build' executable. Alternatively you
+	echo.may add the Sphinx directory to PATH.
+	echo.
+	echo.If you don't have Sphinx installed, grab it from
+	echo.http://sphinx-doc.org/
+	exit /b 1
+)
+
+%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
+goto end
+
+:help
+%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
+
+:end
+popd
diff --git a/mmdetection_practice/third_party/mmyolo/docs/en/model_zoo.md b/mmdetection_practice/third_party/mmyolo/docs/en/model_zoo.md
new file mode 100644
index 0000000..1547bb9
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/en/model_zoo.md
@@ -0,0 +1,94 @@
+# Model Zoo and Benchmark
+
+This page is used to summarize the performance and related evaluation metrics of various models supported in MMYOLO for users to compare and analyze.
+
+## COCO dataset
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/17425982/222087414-168175cc-dae6-4c5c-a8e3-3109a152dd19.png"/>
+</div>
+
+|      Model       | Arch | Size | Batch Size | Epoch | SyncBN | AMP | Mem (GB) | Params(M) | FLOPs(G) | TRT-FP16-GPU-Latency(ms) | Box AP | TTA Box AP |
+| :--------------: | :--: | :--: | :--------: | :---: | :----: | :-: | :------: | :-------: | :------: | :----------------------: | :----: | :--------: |
+|     YOLOv5-n     |  P5  | 640  |   8xb16    |  300  |  Yes   | Yes |   1.5    |   1.87    |   2.26   |           1.14           |  28.0  |    30.7    |
+|  YOLOv6-v2.0-n   |  P5  | 640  |   8xb32    |  400  |  Yes   | Yes |   6.04   |   4.32    |   5.52   |           1.37           |  36.2  |            |
+|     YOLOv8-n     |  P5  | 640  |   8xb16    |  500  |  Yes   | Yes |   2.5    |   3.16    |   4.4    |           1.53           |  37.4  |    39.9    |
+|   RTMDet-tiny    |  P5  | 640  |   8xb32    |  300  |  Yes   | No  |   11.9   |   4.90    |   8.09   |           2.31           |  41.8  |    43.2    |
+| YOLOv6-v2.0-tiny |  P5  | 640  |   8xb32    |  400  |  Yes   | Yes |   8.13   |   9.70    |  12.37   |           2.19           |  41.0  |            |
+|   YOLOv7-tiny    |  P5  | 640  |   8xb16    |  300  |  Yes   | Yes |   2.7    |   6.23    |   6.89   |           1.88           |  37.5  |            |
+|    YOLOX-tiny    |  P5  | 416  |   8xb32    |  300  |   No   | Yes |   4.9    |   5.06    |   7.63   |           1.19           |  34.3  |            |
+|     RTMDet-s     |  P5  | 640  |   8xb32    |  300  |  Yes   | No  |   16.3   |   8.89    |  14.84   |           2.89           |  45.7  |    47.3    |
+|     YOLOv5-s     |  P5  | 640  |   8xb16    |  300  |  Yes   | Yes |   2.7    |   7.24    |   8.27   |           1.89           |  37.7  |    40.2    |
+|  YOLOv6-v2.0-s   |  P5  | 640  |   8xb32    |  400  |  Yes   | Yes |   8.88   |   17.22   |  21.94   |           2.67           |  44.0  |            |
+|     YOLOv8-s     |  P5  | 640  |   8xb16    |  500  |  Yes   | Yes |   4.0    |   11.17   |  14.36   |           2.61           |  45.1  |    46.8    |
+|     YOLOX-s      |  P5  | 640  |   8xb32    |  300  |   No   | Yes |   9.8    |   8.97    |  13.40   |           2.38           |  41.9  |            |
+|   PPYOLOE+ -s    |  P5  | 640  |    8xb8    |  80   |  Yes   | No  |   4.7    |   7.93    |   8.68   |           2.54           |  43.5  |            |
+|     RTMDet-m     |  P5  | 640  |   8xb32    |  300  |  Yes   | No  |   29.0   |   24.71   |  39.21   |           6.23           |  50.2  |    51.9    |
+|     YOLOv5-m     |  P5  | 640  |   8xb16    |  300  |  Yes   | Yes |   5.0    |   21.19   |  24.53   |           4.28           |  45.3  |    46.9    |
+|  YOLOv6-v2.0-m   |  P5  | 640  |   8xb32    |  300  |  Yes   | Yes |  16.69   |   34.25   |   40.7   |           5.12           |  48.4  |            |
+|     YOLOv8-m     |  P5  | 640  |   8xb16    |  500  |  Yes   | Yes |   7.0    |   25.9    |  39.57   |           5.78           |  50.6  |    52.3    |
+|     YOLOX-m      |  P5  | 640  |   8xb32    |  300  |   No   | Yes |   17.6   |   25.33   |  36.88   |           5.31           |  47.5  |            |
+|   PPYOLOE+ -m    |  P5  | 640  |    8xb8    |  80   |  Yes   | No  |   8.4    |   23.43   |  24.97   |           5.47           |  49.5  |            |
+|     RTMDet-l     |  P5  | 640  |   8xb32    |  300  |  Yes   | No  |   45.2   |   52.32   |  80.12   |          10.13           |  52.3  |    53.7    |
+|     YOLOv5-l     |  P5  | 640  |   8xb16    |  300  |  Yes   | Yes |   8.1    |   46.56   |  54.65   |           6.8            |  48.8  |    49.9    |
+|  YOLOv6-v2.0-l   |  P5  | 640  |   8xb32    |  300  |  Yes   | Yes |  20.86   |   58.53   |  71.43   |           8.78           |  51.0  |            |
+|     YOLOv7-l     |  P5  | 640  |   8xb16    |  300  |  Yes   | Yes |   10.3   |   36.93   |  52.42   |           6.63           |  50.9  |            |
+|     YOLOv8-l     |  P5  | 640  |   8xb16    |  500  |  Yes   | Yes |   9.1    |   43.69   |  82.73   |           8.97           |  53.0  |    54.4    |
+|     YOLOX-l      |  P5  | 640  |    8xb8    |  300  |   No   | Yes |   8.0    |   54.21   |  77.83   |           9.23           |  50.1  |            |
+|   PPYOLOE+ -l    |  P5  | 640  |    8xb8    |  80   |  Yes   | No  |   13.2   |   52.20   |  55.05   |           8.2            |  52.6  |            |
+|     RTMDet-x     |  P5  | 640  |   8xb32    |  300  |  Yes   | No  |   63.4   |   94.86   |  145.41  |          17.89           |  52.8  |    54.2    |
+|     YOLOv7-x     |  P5  | 640  |   8xb16    |  300  |  Yes   | Yes |   13.7   |   71.35   |  95.06   |          11.63           |  52.8  |            |
+|     YOLOv8-x     |  P5  | 640  |   8xb16    |  500  |  Yes   | Yes |   12.4   |   68.23   |  132.10  |          14.22           |  54.0  |    55.0    |
+|     YOLOX-x      |  P5  | 640  |    8xb8    |  300  |   No   | Yes |   9.8    |   99.07   |  144.39  |          15.35           |  51.4  |            |
+|   PPYOLOE+ -x    |  P5  | 640  |    8xb8    |  80   |  Yes   | No  |   19.1   |   98.42   |  105.48  |          14.02           |  54.2  |            |
+|     YOLOv5-n     |  P6  | 1280 |   8xb16    |  300  |  Yes   | Yes |   5.8    |   3.25    |   2.30   |                          |  35.9  |            |
+|     YOLOv5-s     |  P6  | 1280 |   8xb16    |  300  |  Yes   | Yes |   10.5   |   12.63   |   8.45   |                          |  44.4  |            |
+|     YOLOv5-m     |  P6  | 1280 |   8xb16    |  300  |  Yes   | Yes |   19.1   |   35.73   |  25.05   |                          |  51.3  |            |
+|     YOLOv5-l     |  P6  | 1280 |   8xb16    |  300  |  Yes   | Yes |   30.5   |   76.77   |  55.77   |                          |  53.7  |            |
+|     YOLOv7-w     |  P6  | 1280 |   8xb16    |  300  |  Yes   | Yes |   27.0   |   82.31   |  45.07   |                          |  54.1  |            |
+|     YOLOv7-e     |  P6  | 1280 |   8xb16    |  300  |  Yes   | Yes |   42.5   |  114.69   |  64.48   |                          |  55.1  |            |
+
+- All the models are trained on COCO train2017 dataset and evaluated on val2017 dataset.
+- TRT-FP16-GPU-Latency(ms) is the GPU Compute time on NVIDIA Tesla T4 device with TensorRT 8.4, a batch size of 1, a test shape of 640x640 and only model forward (The test shape for YOLOX-tiny is 416x416)
+- The number of model parameters and FLOPs are obtained using the [get_flops](https://github.com/open-mmlab/mmyolo/blob/dev/tools/analysis_tools/get_flops.py) script. Different calculation methods may vary slightly
+- RTMDet performance is the result of training with [MMRazor Knowledge Distillation](https://github.com/open-mmlab/mmyolo/blob/dev/configs/rtmdet/distillation/README.md)
+- Only YOLOv6 version 2.0 is implemented in MMYOLO for now, and L and M are the results without knowledge distillation
+- YOLOv8 results are optimized using mask instance annotation, but YOLOv5, YOLOv6 and YOLOv7 do not use
+- PPYOLOE+ uses Obj365 as pre-training weights, so the number of epochs for COCO training only needs 80
+- YOLOX-tiny, YOLOX-s and YOLOX-m are trained with the optimizer parameters proposed in RTMDet, with different degrees of performance improvement compared to the original implementation.
+
+Please see below items for more details
+
+- [RTMDet](https://github.com/open-mmlab/mmyolo/blob/main/configs/rtmdet)
+- [YOLOv5](https://github.com/open-mmlab/mmyolo/blob/main/configs/yolov5)
+- [YOLOv6](https://github.com/open-mmlab/mmyolo/blob/main/configs/yolov6)
+- [YOLOv7](https://github.com/open-mmlab/mmyolo/blob/main/configs/yolov7)
+- [YOLOv8](https://github.com/open-mmlab/mmyolo/blob/main/configs/yolov8)
+- [YOLOX](https://github.com/open-mmlab/mmyolo/blob/main/configs/yolox)
+- [PPYOLO-E](https://github.com/open-mmlab/mmyolo/blob/main/configs/ppyoloe)
+
+## VOC dataset
+
+| Backbone | size | Batchsize | AMP | Mem (GB) | box AP(COCO metric) |
+| :------: | :--: | :-------: | :-: | :------: | :-----------------: |
+| YOLOv5-n | 512  |    64     | Yes |   3.5    |        51.2         |
+| YOLOv5-s | 512  |    64     | Yes |   6.5    |        62.7         |
+| YOLOv5-m | 512  |    64     | Yes |   12.0   |        70.1         |
+| YOLOv5-l | 512  |    32     | Yes |   10.0   |        73.1         |
+
+Please see below items for more details
+
+- [YOLOv5](https://github.com/open-mmlab/mmyolo/blob/main/configs/yolov5)
+
+## CrowdHuman dataset
+
+| Backbone | size | SyncBN | AMP | Mem (GB) | ignore_iof_thr | box AP50(CrowDHuman Metric) |  MR  |  JI   |
+| :------: | :--: | :----: | :-: | :------: | :------------: | :-------------------------: | :--: | :---: |
+| YOLOv5-s | 640  |  Yes   | Yes |   2.6    |       -1       |            85.79            | 48.7 | 75.33 |
+| YOLOv5-s | 640  |  Yes   | Yes |   2.6    |      0.5       |            86.17            | 48.8 | 75.87 |
+
+Please see below items for more details
+
+- [YOLOv5](https://github.com/open-mmlab/mmyolo/blob/main/configs/yolov5)
+
+## DOTA 1.0 dataset
diff --git a/mmdetection_practice/third_party/mmyolo/docs/en/notes/changelog.md b/mmdetection_practice/third_party/mmyolo/docs/en/notes/changelog.md
new file mode 100644
index 0000000..fa3e1a7
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/en/notes/changelog.md
@@ -0,0 +1,342 @@
+# Changelog
+
+## v0.6.0 (15/8/2023)
+
+### Highlights
+
+- Support YOLOv5 instance segmentation
+- Support YOLOX-Pose based on MMPose
+- Add 15 minutes instance segmentation tutorial.
+- YOLOv5 supports using mask annotation to optimize bbox
+- Add Multi-scale training and testing docs
+
+### New Features
+
+- Add training and testing tricks doc (#659)
+- Support setting the cache_size_limit parameter and support mmdet 3.0.0 (#707)
+- Support YOLOv5u and YOLOv6 3.0 inference (#624, #744)
+- Support model-only inference (#733)
+- Add YOLOv8 deepstream config (#633)
+- Add ionogram example in MMYOLO application (#643)
+
+### Bug Fixes
+
+- Fix the browse_dataset for visualization of test and val (#641)
+- Fix installation doc error (#662)
+- Fix yolox-l ckpt link (#677)
+- Fix typos in the YOLOv7 and YOLOv8 diagram (#621, #710)
+- Adjust the order of package imports in `boxam_vis_demo.py` (#655)
+
+### Improvements
+
+- Optimize the `convert_kd_ckpt_to_student.py` file (#647)
+- Add en doc of `FAQ` and `training_testing_tricks` (#691,#693)
+
+### Contributors
+
+A total of 21 developers contributed to this release.
+
+Thank @Lum1104,@azure-wings,@FeiGeChuanShu,@Lingrui Gu,@Nioolek,@huayuan4396,@RangeKing,@danielhonies,@yechenzhi,@JosonChan1998,@kitecats,@Qingrenn,@triple-Mu,@kikefdezl,@zhangrui-wolf,@xin-li-67,@Ben-Louis,@zgzhengSEU,@VoyagerXvoyagerx,@tang576225574,@hhaAndroid
+
+## v0.5.0 (2/3/2023)
+
+### Highlights
+
+1. Support [RTMDet-R](https://github.com/open-mmlab/mmyolo/blob/dev/configs/rtmdet/README.md#rotated-object-detection) rotated object detection
+2. Support for using mask annotation to improve [YOLOv8](https://github.com/open-mmlab/mmyolo/blob/dev/configs/yolov8/README.md) object detection performance
+3. Support [MMRazor](https://github.com/open-mmlab/mmyolo/blob/dev/configs/razor/subnets/README.md) searchable NAS sub-network as the backbone of YOLO series algorithm
+4. Support calling [MMRazor](https://github.com/open-mmlab/mmyolo/blob/dev/configs/rtmdet/distillation/README.md) to distill the knowledge of RTMDet
+5. [MMYOLO](https://mmyolo.readthedocs.io/zh_CN/dev/) document structure optimization, comprehensive content upgrade
+6. Improve YOLOX mAP and training speed based on RTMDet training hyperparameters
+7. Support calculation of model parameters and FLOPs, provide GPU latency data on T4 devices, and update [Model Zoo](https://github.com/open-mmlab/mmyolo/blob/dev/docs/en/model_zoo.md)
+8. Support test-time augmentation (TTA)
+9. Support RTMDet, YOLOv8 and YOLOv7 assigner visualization
+
+### New Features
+
+01. Support inference for RTMDet instance segmentation tasks (#583)
+02. Beautify the configuration file in MMYOLO and add more comments (#501, #506, #516, #529, #531, #539)
+03. Refactor and optimize documentation (#568, #573, #579, #584, #587, #589, #596, #599, #600)
+04. Support fast version of YOLOX (#518)
+05. Support DeepStream in EasyDeploy and add documentation (#485, #545, #571)
+06. Add confusion matrix drawing script (#572)
+07. Add single channel application case (#460)
+08. Support auto registration (#597)
+09. Support Box CAM of YOLOv7, YOLOv8 and PPYOLOE (#601)
+10. Add automated generation of MM series repo registration information and tools scripts (#559)
+11. Added YOLOv7 model structure diagram (#504)
+12. Add how to specify specific GPU training and inference files (#503)
+13. Add check if `metainfo` is all lowercase when training or testing (#535)
+14. Add links to Twitter, Discord, Medium, YouTube, etc. (#555)
+
+### Bug Fixes
+
+1. Fix isort version issue (#492, #497)
+2. Fix type error of assigner visualization (#509)
+3. Fix YOLOv8 documentation link error (#517)
+4. Fix RTMDet Decoder error in EasyDeploy (#519)
+5. Fix some document linking errors (#537)
+6. Fix RTMDet-Tiny weight path error (#580)
+
+### Improvements
+
+1. Update `contributing.md`
+2. Optimize `DetDataPreprocessor` branch to support multitasking (#511)
+3. Optimize `gt_instances_preprocess` so it can be used for other YOLO algorithms (#532)
+4. Add `yolov7-e6e` weight conversion script (#570)
+5. Reference YOLOv8 inference code modification PPYOLOE
+
+### Contributors
+
+A total of 22 developers contributed to this release.
+
+Thank @triple-Mu, @isLinXu, @Audrey528, @TianWen580, @yechenzhi, @RangeKing, @lyviva, @Nioolek, @PeterH0323, @tianleiSHI, @aptsunny, @satuoqaq, @vansin, @xin-li-67, @VoyagerXvoyagerx,
+@landhill, @kitecats, @tang576225574, @HIT-cwh, @AI-Tianlong, @RangiLyu, @hhaAndroid
+
+## v0.4.0 (18/1/2023)
+
+### Highlights
+
+1. Implemented [YOLOv8](https://github.com/open-mmlab/mmyolo/blob/dev/configs/yolov8/README.md) object detection model, and supports model deployment in [projects/easydeploy](https://github.com/open-mmlab/mmyolo/blob/dev/projects/easydeploy)
+2. Added Chinese and English versions of [Algorithm principles and implementation with YOLOv8](https://github.com/open-mmlab/mmyolo/blob/dev/docs/en/algorithm_descriptions/yolov8_description.md)
+
+### New Features
+
+1. Added YOLOv8 and PPYOLOE model structure diagrams (#459, #471)
+2. Adjust the minimum supported Python version from 3.6 to 3.7 (#449)
+3. Added a new YOLOX decoder in TensorRT-8 (#450)
+4. Add a tool for scheduler visualization (#479)
+
+### Bug Fixes
+
+1. Fix `optimize_anchors.py` script import error (#452)
+2. Fix the wrong installation steps in `get_started.md` (#474)
+3. Fix the neck error when using the `RTMDet` P6 model (#480)
+
+### Contributors
+
+A total of 9 developers contributed to this release.
+
+Thank @VoyagerXvoyagerx, @tianleiSHI, @RangeKing, @PeterH0323, @Nioolek, @triple-Mu, @lyviva, @Zheng-LinXiao, @hhaAndroid
+
+## v0.3.0 (8/1/2023)
+
+### Highlights
+
+1. Implement fast version of [RTMDet](https://github.com/open-mmlab/mmyolo/blob/dev/configs/rtmdet/README.md). RTMDet-s 8xA100 training takes only 14 hours. The training speed is 2.6 times faster than the previous version.
+2. Support [PPYOLOE](https://github.com/open-mmlab/mmyolo/blob/dev/configs/ppyoloe/README.md) training
+3. Support `iscrowd` attribute training in [YOLOv5](https://github.com/open-mmlab/mmyolo/blob/dev/configs/yolov5/crowdhuman/yolov5_s-v61_8xb16-300e_ignore_crowdhuman.py)
+4. Support [YOLOv5 assigner result visualization](https://github.com/open-mmlab/mmyolo/blob/dev/projects/assigner_visualization/README.md)
+
+### New Features
+
+01. Add `crowdhuman` dataset (#368)
+02. Easydeploy support TensorRT inference (#377)
+03. Add `YOLOX` structure description (#402)
+04. Add a feature for the video demo (#392)
+05. Support `YOLOv7` easy deploy (#427)
+06. Add resume from specific checkpoint in CLI (#393)
+07. Set `metainfo` fields to lower case (#362, #412)
+08. Add module combination doc (#349, #352, #345)
+09. Add docs about how to freeze the weight of backbone or neck (#418)
+10. Add don't used pre-training weights doc in `how_to.md` (#404)
+11. Add docs about how to set the random seed (#386)
+12. Translate `rtmdet_description.md` document to English (#353)
+13. Add doc of `yolov6_description.md` (#382, #372)
+
+### Bug Fixes
+
+01. Fix bugs in the output annotation file when `--class-id-txt` is set (#430)
+02. Fix batch inference bug in `YOLOv5` head (#413)
+03. Fix typehint in some heads (#415, #416, #443)
+04. Fix RuntimeError of `torch.cat()` expected a non-empty list of Tensors (#376)
+05. Fix the device inconsistency error in `YOLOv7` training (#397)
+06. Fix the `scale_factor` and `pad_param` value in `LetterResize` (#387)
+07. Fix docstring graph rendering error of readthedocs (#400)
+08. Fix AssertionError when `YOLOv6` from training to val (#378)
+09. Fix CI error due to `np.int` and legacy builder.py (#389)
+10. Fix MMDeploy rewriter (#366)
+11. Fix MMYOLO unittest scope bug (#351)
+12. Fix `pad_param` error (#354)
+13. Fix twice head inference bug (#342)
+14. Fix customize dataset training (#428)
+
+### Improvements
+
+01. Update `useful_tools.md` (#384)
+02. update the English version of `custom_dataset.md` (#381)
+03. Remove context argument from the rewriter function (#395)
+04. deprecating `np.bool` type alias (#396)
+05. Add new video link for custom dataset (#365)
+06. Export onnx for model only (#361)
+07. Add MMYOLO regression test yml (#359)
+08. Update video tutorials in `article.md` (#350)
+09. Add deploy demo (#343)
+10. Optimize the vis results of large images in debug mode (#346)
+11. Improve args for `browse_dataset` and support `RepeatDataset` (#340, #338)
+
+### Contributors
+
+A total of 28 developers contributed to this release.
+
+Thank @RangeKing, @PeterH0323, @Nioolek, @triple-Mu, @matrixgame2018, @xin-li-67, @tang576225574, @kitecats, @Seperendity, @diplomatist, @vaew, @wzr-skn, @VoyagerXvoyagerx, @MambaWong, @tianleiSHI, @caj-github, @zhubochao, @lvhan028, @dsghaonan, @lyviva, @yuewangg, @wang-tf, @satuoqaq, @grimoire, @RunningLeon, @hanrui1sensetime, @RangiLyu, @hhaAndroid
+
+## v0.2.0(1/12/2022)
+
+### Highlights
+
+1. Support [YOLOv7](https://github.com/open-mmlab/mmyolo/tree/dev/configs/yolov7) P5 and P6 model
+2. Support [YOLOv6](https://github.com/open-mmlab/mmyolo/blob/dev/configs/yolov6/README.md) ML model
+3. Support [Grad-Based CAM and Grad-Free CAM](https://github.com/open-mmlab/mmyolo/blob/dev/demo/boxam_vis_demo.py)
+4. Support [large image inference](https://github.com/open-mmlab/mmyolo/blob/dev/demo/large_image_demo.py) based on sahi
+5. Add [easydeploy](https://github.com/open-mmlab/mmyolo/blob/dev/projects/easydeploy/README.md) project under the projects folder
+6. Add [custom dataset guide](https://github.com/open-mmlab/mmyolo/blob/dev/docs/zh_cn/user_guides/custom_dataset.md)
+
+### New Features
+
+1. `browse_dataset.py` script supports visualization of original image, data augmentation and intermediate results (#304)
+2. Add flag to output labelme label file in `image_demo.py` (#288, #314)
+3. Add `labelme2coco` script (#308, #313)
+4. Add split COCO dataset script (#311)
+5. Add two examples of backbone replacement in `how-to.md` and update `plugin.md` (#291)
+6. Add `contributing.md` and `code_style.md` (#322)
+7. Add docs about how to use mim to run scripts across libraries (#321)
+8. Support `YOLOv5` deployment at RV1126 device (#262)
+
+### Bug Fixes
+
+1. Fix MixUp padding error (#319)
+2. Fix scale factor order error of `LetterResize` and `YOLOv5KeepRatioResize` (#305)
+3. Fix training errors of `YOLOX Nano` model (#285)
+4. Fix `RTMDet` deploy error (#287)
+5. Fix int8 deploy config (#315)
+6. Fix `make_stage_plugins` doc in `basebackbone` (#296)
+7. Enable switch to deploy when create pytorch model in deployment (#324)
+8. Fix some errors in `RTMDet` model graph (#317)
+
+### Improvements
+
+1. Add option of json output in `test.py` (#316)
+2. Add area condition in `extract_subcoco.py` script (#286)
+3. Deployment doc translation (#289)
+4. Add YOLOv6 description overview doc (#252)
+5. Improve `config.md` (#297, #303)
+   6Add mosaic9 graph in docstring  (#307)
+6. Improve `browse_coco_json.py` script args (#309)
+7. Refactor some functions in `dataset_analysis.py` to be more general (#294)
+
+#### Contributors
+
+A total of 14 developers contributed to this release.
+
+Thank  @fcakyon, @matrixgame2018, @MambaWong, @imAzhou, @triple-Mu, @RangeKing, @PeterH0323, @xin-li-67, @kitecats, @hanrui1sensetime, @AllentDan, @Zheng-LinXiao, @hhaAndroid, @wanghonglie
+
+## v0.1.3(10/11/2022)
+
+### New Features
+
+1. Support CBAM plug-in and provide plug-in documentation (#246)
+2. Add YOLOv5 P6 model structure diagram and related descriptions (#273)
+
+### Bug Fixes
+
+1. Fix training failure when saving best weights based on mmengine 0.3.1
+2. Fix `add_dump_metric` error based on mmdet 3.0.0rc3 (#253)
+3. Fix backbone does not support `init_cfg` issue (#272)
+4. Change typing import method based on mmdet 3.0.0rc3 (#261)
+
+### Improvements
+
+1. `featmap_vis_demo` support for folder and url input (#248)
+2. Deploy docker file refinement (#242)
+
+#### Contributors
+
+A total of 10 developers contributed to this release.
+
+Thank @kitecats, @triple-Mu, @RangeKing, @PeterH0323, @Zheng-LinXiao, @tkhe, @weikai520, @zytx121, @wanghonglie, @hhaAndroid
+
+## v0.1.2(3/11/2022)
+
+### Highlights
+
+1. Support [YOLOv5/YOLOv6/YOLOX/RTMDet deployments](https://github.com/open-mmlab/mmyolo/blob/main/configs/deploy) for ONNXRuntime and TensorRT
+2. Support [YOLOv6](https://github.com/open-mmlab/mmyolo/blob/main/configs/yolov6) s/t/n model training
+3. YOLOv5 supports [P6 model training which can input 1280-scale images](https://github.com/open-mmlab/mmyolo/blob/main/configs/yolov5)
+4. YOLOv5 supports [VOC dataset training](https://github.com/open-mmlab/mmyolo/blob/main/configs/yolov5/voc)
+5. Support [PPYOLOE](https://github.com/open-mmlab/mmyolo/blob/main/configs/ppyoloe) and [YOLOv7](https://github.com/open-mmlab/mmyolo/blob/main/configs/yolov7) model inference and official weight conversion
+6. Add YOLOv5 replacement [backbone tutorial](https://github.com/open-mmlab/mmyolo/blob/dev/docs/en/advanced_guides/how_to.md#use-backbone-network-implemented-in-other-openmmlab-repositories) in How-to documentation
+
+### New Features
+
+1. Add `optimize_anchors` script (#175)
+2. Add `extract_subcoco` script (#186)
+3. Add `yolo2coco` conversion script (#161)
+4. Add `dataset_analysis` script (#172)
+5. Remove Albu version restrictions (#187)
+
+### Bug Fixes
+
+1. Fix the problem that `cfg.resume` does not work when set (#221)
+2. Fix the problem of not showing bbox in feature map visualization script (#204)
+3. uUpdate the metafile of RTMDet (#188)
+4. Fix a visualization error in `test_pipeline` (#166)
+5. Update badges (#140)
+
+### Improvements
+
+1. Optimize Readthedoc display page (#209)
+2. Add docstring for module structure diagram for base model (#196)
+3. Support for not including any instance logic in LoadAnnotations (#161)
+4. Update `image_demo` script to support folder and url paths (#128)
+5. Update pre-commit hook (#129)
+
+### Documentation
+
+1. Translate `yolov5_description.md`, `yolov5_tutorial.md` and `visualization.md` into English (#138, #198, #206)
+2. Add deployment-related Chinese documentation (#220)
+3. Update `config.md`, `faq.md` and `pull_request_template.md` (#190, #191, #200)
+4. Update the `article` page (#133)
+
+#### Contributors
+
+A total of 14 developers contributed to this release.
+
+Thank @imAzhou, @triple-Mu, @RangeKing, @PeterH0323, @xin-li-67, @Nioolek, @kitecats, @Bin-ze, @JiayuXu0, @cydiachen, @zhiqwang, @Zheng-LinXiao, @hhaAndroid, @wanghonglie
+
+## v0.1.1(29/9/2022)
+
+Based on MMDetection's RTMDet high precision and low latency object detection algorithm, we have also released RTMDet and provided a Chinese document on the principle and implementation of RTMDet.
+
+### Highlights
+
+1. Support [RTMDet](https://github.com/open-mmlab/mmyolo/blob/main/configs/rtmdet)
+2. Support for backbone customization plugins and update How-to documentation (#75)
+
+### Bug Fixes
+
+1. Fix some documentation errors (#66, #72, #76, #83, #86)
+2. Fix checkpoints link error (#63)
+3. Fix the bug that the output of `LetterResize` does not meet the expectation when using `imscale` (#105)
+
+### Improvements
+
+1. Reducing the size of docker images (#67)
+2. Simplifying `Compose` Logic in `BaseMixImageTransform` (#71)
+3. Supports dump results in `test.py` (#84)
+
+#### Contributors
+
+A total of 13 developers contributed to this release.
+
+Thank @wanghonglie, @hhaAndroid, @yang-0201, @PeterH0323, @RangeKing, @satuoqaq, @Zheng-LinXiao, @xin-li-67, @suibe-qingtian, @MambaWong, @MichaelCai0912, @rimoire, @Nioolek
+
+## v0.1.0(21/9/2022)
+
+We have released MMYOLO open source library, which is based on MMEngine, MMCV 2.x and MMDetection 3.x libraries. At present, the object detection has been realized, and it will be expanded to multi-task in the future.
+
+### Highlights
+
+1. Support YOLOv5/YOLOX training, support YOLOv6 inference. Deployment will be supported soon.
+2. Refactored YOLOX from MMDetection to accelerate training and inference.
+3. Detailed introduction and advanced tutorials are provided, see the [English tutorial](https://mmyolo.readthedocs.io/en/latest).
diff --git a/mmdetection_practice/third_party/mmyolo/docs/en/notes/code_style.md b/mmdetection_practice/third_party/mmyolo/docs/en/notes/code_style.md
new file mode 100644
index 0000000..3bc8291
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/en/notes/code_style.md
@@ -0,0 +1,3 @@
+# Code Style
+
+Coming soon. Please refer to [chinese documentation](https://mmyolo.readthedocs.io/zh_CN/latest/community/code_style.html).
diff --git a/mmdetection_practice/third_party/mmyolo/docs/en/notes/compatibility.md b/mmdetection_practice/third_party/mmyolo/docs/en/notes/compatibility.md
new file mode 100644
index 0000000..7e6ad3d
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/en/notes/compatibility.md
@@ -0,0 +1,46 @@
+# Compatibility of MMYOLO
+
+## MMYOLO 0.3.0
+
+### METAINFO modification
+
+To unify with other OpenMMLab repositories, change all keys of `METAINFO` in Dataset from upper case to lower case.
+
+| Before v0.3.0 | after v0.3.0 |
+| :-----------: | :----------: |
+|    CLASSES    |   classes    |
+|    PALETTE    |   palette    |
+| DATASET_TYPE  | dataset_type |
+
+### About the order of image shape
+
+In OpenMMLab 2.0, to be consistent with the input argument of OpenCV, the argument about image shape in the data transformation pipeline is always in the `(width, height)` order. On the contrary, for computation convenience, the order of the field going through the data pipeline and the model is `(height, width)`. Specifically, in the results processed by each data transform pipeline, the fields and their value meaning is as below:
+
+- img_shape: (height, width)
+- ori_shape: (height, width)
+- pad_shape: (height, width)
+- batch_input_shape: (height, width)
+
+As an example, the initialization arguments of `Mosaic` are as below:
+
+```python
+@TRANSFORMS.register_module()
+class Mosaic(BaseTransform):
+    def __init__(self,
+                img_scale: Tuple[int, int] = (640, 640),
+                center_ratio_range: Tuple[float, float] = (0.5, 1.5),
+                bbox_clip_border: bool = True,
+                pad_val: float = 114.0,
+                prob: float = 1.0) -> None:
+       ...
+
+       # img_scale order should be (width, height)
+       self.img_scale = img_scale
+
+    def transform(self, results: dict) -> dict:
+        ...
+
+        results['img'] = mosaic_img
+        # (height, width)
+        results['img_shape'] = mosaic_img.shape[:2]
+```
diff --git a/mmdetection_practice/third_party/mmyolo/docs/en/notes/conventions.md b/mmdetection_practice/third_party/mmyolo/docs/en/notes/conventions.md
new file mode 100644
index 0000000..40ca991
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/en/notes/conventions.md
@@ -0,0 +1,36 @@
+# Conventions
+
+Please check the following conventions if you would like to modify MMYOLO as your own project.
+
+## About the order of image shape
+
+In OpenMMLab 2.0, to be consistent with the input argument of OpenCV, the argument about image shape in the data transformation pipeline is always in the `(width, height)` order. On the contrary, for computation convenience, the order of the field going through the data pipeline and the model is `(height, width)`. Specifically, in the results processed by each data transform pipeline, the fields and their value meaning is as below:
+
+- img_shape: (height, width)
+- ori_shape: (height, width)
+- pad_shape: (height, width)
+- batch_input_shape: (height, width)
+
+As an example, the initialization arguments of `Mosaic` are as below:
+
+```python
+@TRANSFORMS.register_module()
+class Mosaic(BaseTransform):
+    def __init__(self,
+                img_scale: Tuple[int, int] = (640, 640),
+                center_ratio_range: Tuple[float, float] = (0.5, 1.5),
+                bbox_clip_border: bool = True,
+                pad_val: float = 114.0,
+                prob: float = 1.0) -> None:
+       ...
+
+       # img_scale order should be (width, height)
+       self.img_scale = img_scale
+
+    def transform(self, results: dict) -> dict:
+        ...
+
+        results['img'] = mosaic_img
+        # (height, width)
+        results['img_shape'] = mosaic_img.shape[:2]
+```
diff --git a/mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/algorithm_descriptions/index.rst b/mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/algorithm_descriptions/index.rst
new file mode 100644
index 0000000..e51d04c
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/algorithm_descriptions/index.rst
@@ -0,0 +1,9 @@
+Algorithm principles and implementation
+******************************************
+
+.. toctree::
+   :maxdepth: 1
+
+   yolov5_description.md
+   yolov8_description.md
+   rtmdet_description.md
diff --git a/mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/algorithm_descriptions/rtmdet_description.md b/mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/algorithm_descriptions/rtmdet_description.md
new file mode 100644
index 0000000..1cd6282
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/algorithm_descriptions/rtmdet_description.md
@@ -0,0 +1,191 @@
+# Algorithm principles and implementation with RTMDet
+
+## 0 Introduction
+
+High performance, low latency one-stage object detection
+
+<div align=center>
+<img alt="RTMDet_structure_v1.3" src="https://user-images.githubusercontent.com/27466624/204126145-cb4ff4f1-fb16-455e-96b5-17620081023a.jpg"/>
+</div>
+
+RangeKing@github provides the graph above. Thanks, RangeKing!
+
+Recently,the open-source community has spring up a large number of high-precision object detection projects, one of the most prominent projects is YOLO series. OpenMMLab has also launched MMYOLO in collaboration with the community.
+After investigating many improved models in current YOLO series, MMDetection core developers empirically summarized these designs and training methods, and optimized them to launch a single-stage object detector with high accuracy and low latency RTMDet, **R**eal-**t**ime **M**odels for Object **Det**ection
+(**R**elease **t**o **M**anufacture)
+
+RTMDet consists of a series of tiny/s/m/l/x models of different sizes, which provide different choices for different application scenarios.
+Specifically, RTMDet-x achieves a 300+ FPS inference speed with an accuracy of 52.6 mAP.
+
+```{note}
+Note: Inference speed and accuracy test (excluding NMS) were performed on `TensorRT 8.4.3, cuDNN 8.2.0, FP16, batch size=1` on 1 NVIDIA 3090 GPU.
+```
+
+The lightest model, RTMDet-tiny, can achieve 40.9 mAP with only 4M parameters and inference speed \< 1 ms.
+
+<div align=center>
+<img alt="RTMDet_accuracy_graph" src="https://user-images.githubusercontent.com/12907710/192182907-f9a671d6-89cb-4d73-abd8-c2b9dada3c66.png"/>
+</div>
+
+The accuracy in this figure is a fair comparison to 300 training epochs, without distillation.
+
+|                            | mAP             | Params         | Flops        | Inference speed |
+| -------------------------- | --------------- | -------------- | ------------ | --------------- |
+| Baseline(YOLOX)            | 40.2            | 9M             | 13.4G        | 1.2ms           |
+| + AdamW + Flat Cosine      | 40.6 (+0.4)     | 9M             | 13.4G        | 1.2ms           |
+| + CSPNeXt backbone & PAFPN | 41.8 (+1.2)     | 10.07M (+1.07) | 14.8G (+1.4) | 1.22ms (+0.02)  |
+| + SepBNHead                | 41.8 (+0)       | 8.89M (-1.18)  | 14.8G        | 1.22ms          |
+| + Label Assign & Loss      | 42.9 (+1.1)     | 8.89M          | 14.8G        | 1.22ms          |
+| + Cached Mosaic & MixUp    | 44.2 (+1.3)     | 8.89M          | 14.8G        | 1.22ms          |
+| + RSB-pretrained backbone  | **44.5 (+0.3)** | 8.89M          | 14.8G        | 1.22ms          |
+
+- Official repository: https://github.com/open-mmlab/mmdetection/blob/3.x/configs/rtmdet/README.md
+- MMYOLO repository: https://github.com/open-mmlab/mmyolo/blob/main/configs/rtmdet/README.md
+
+## 1 v1.0 algorithm principle and MMYOLO implementation analysis
+
+### 1.1 Data augmentation
+
+Many data augmentation methods are used in RTMDet, mainly include single image data augmentation:
+
+- **RandomResize**
+- **RandomCrop**
+- **HSVRandomAug**
+- **RandomFlip**
+
+and mixed image data augmentation:
+
+- **Mosaic**
+- **MixUp**
+
+The following picture demonstrates the data augmentation process:
+
+<div align=center>
+<img alt="image" src="https://user-images.githubusercontent.com/33799979/192956011-78f89d89-ac9f-4a40-b4f1-056b49b704ef.png" width=800 />
+</div>
+
+The RandomResize hyperparameters are different on the large models M,L,X and the small models S, Tiny. Due to the number of parameters,the large models can use the `large jitter scale strategy` with parameters of (0.1,2.0). The small model adopts the `stand scale jitter` strategy with parameters of (0.5, 2.0).
+
+The single image data augmentation has been packaged in `MMDetection` so users can directly use all methods through simple configurations. As a very ordinary and common processing method, this part will not be further introduced now. The implementation of mixed image data augmentation is described in the following.
+
+Unlike YOLOv5, which considers the use of MixUp on S and Nano models is excessive. Small models don't need such strong data augmentation. However, RTMDet also uses MixUp on S and Tiny, because RTMDet will switch to normal aug at last 20 epochs, and this operation was proved to be effective by training. Moreover, RTMDet introduces a Cache scheme for mixed image data augmentation, which effectively reduces the image processing time and introduces adjustable hyperparameters.
+
+`max_cached_images`, which is similar to `repeated augmentation` when using a smaller cache. The details are as follows:
+
+|        | Use cache | ms / 100 imgs |
+| ------ | --------- | ------------- |
+| Mosaic |           | 87.1          |
+| Mosaic | √         | **24.0**      |
+| MixUp  |           | 19.3          |
+| MixUp  | √         | **12.4**      |
+
+|                               | RTMDet-s | RTMDet-l |
+| ----------------------------- | -------- | -------- |
+| Mosaic + MixUp + 20e finetune | 43.9     | **51.3** |
+
+#### 1.1.1 Introducing Cache for mixins data augmentation
+
+Mosaic&MixUp needs to blend multiple images, which takes k times longer than common data augmentation (k is the number of images mixed in). For example, in YOLOv5, every time Mosaic is done, the information of four images needs to be reloaded from the hard disk. RTMDet only needs to reload the current image, and the rest images participating in the mixed augmentation are obtained from the cache queue, which greatly improves the efficiency by sacrificing a certain memory space. Moreover, we can modify the cache size and pop mode to adjust the strength of augmentation.
+
+<div align=center>
+<img alt="data cache" src="https://user-images.githubusercontent.com/33799979/192730011-90e2a28d-e163-4399-bf87-d3012007d8c3.png" width=800 />
+</div>
+
+As shown in the figure, N loaded images and labels are stored in the cache queue in advance. In each training step, only a new image and its label need to be loaded and updated to the cache queue (the images in the cache queue can be repeated, as shown in the figure for img3 twice). Meanwhile, if the cache queue length exceeds the preset length, it will pop a random image (in order to make the Tiny model more stable, the Tiny model doesn't use the random pop, but removes the first added image). When mixed data augmentation is needed, only the required images need to be randomly selected from the cache for splicing and other processing, instead of loading them all from the hard disk, which saves the time of image loading.
+
+```{note}
+The maximum length N of the cache queue is an adjustable parameter. According to the empirical principle, when ten caches are provided for each image to be blended, it can be considered to provide enough randomness, while the Mosaic enhancement is four image blends, so the number of caches defaults to N=40. Similarly, MixUp has a default cache size of 20, but tiny model requires more stable training conditions, so it has half cache size of other specs (10 for MixUp and 20 for Mosaic).
+```
+
+In the implementation, MMYOLO designed the `BaseMiximageTransform` class to support mixed data augmentation of multiple images:
+
+```python
+if self.use_cached:
+    # Be careful: deep copying can be very time-consuming
+    # if results includes dataset.
+    dataset = results.pop('dataset', None)
+    self.results_cache.append(copy.deepcopy(results))  # Cache the currently loaded data
+    if len(self.results_cache) > self.max_cached_images:
+        if self.random_pop: # Except for the tiny model, self.random_pop=True
+            index = random.randint(0, len(self.results_cache) - 1)
+        else:
+            index = 0
+        self.results_cache.pop(index)
+
+    if len(self.results_cache) <= 4:
+        return results
+else:
+    assert 'dataset' in results
+    # Be careful: deep copying can be very time-consuming
+    # if results includes dataset.
+    dataset = results.pop('dataset', None)
+```
+
+#### 1.1.2 Mosaic
+
+Mosaic concatenates four images into a large image, which is equivalent to increasing the batch size, as follows:
+
+1. Randomly resample three images from customize datasets based on the index, possibly repeated.
+
+```python
+def get_indexes(self, dataset: Union[BaseDataset, list]) -> list:
+    """Call function to collect indexes.
+
+    Args:
+        dataset (:obj:`Dataset` or list): The dataset or cached list.
+
+    Returns:
+        list: indexes.
+    """
+    indexes = [random.randint(0, len(dataset)) for _ in range(3)]
+    return indexes
+```
+
+2. Randomly select the midpoint of the intersection of four images.
+
+```python
+# mosaic center x, y
+center_x = int(
+    random.uniform(*self.center_ratio_range) * self.img_scale[1])
+center_y = int(
+    random.uniform(*self.center_ratio_range) * self.img_scale[0])
+center_position = (center_x, center_y)
+```
+
+3. Read and concatenate images based on the sampled index. Using the `keep-ratio` resize image (i.e. the maximum edge must be 640) before concatenating.
+
+```python
+# keep_ratio resize
+scale_ratio_i = min(self.img_scale[0] / h_i,
+                    self.img_scale[1] / w_i)
+img_i = mmcv.imresize(
+    img_i, (int(w_i * scale_ratio_i), int(h_i * scale_ratio_i)))
+```
+
+4. After concatenating images, the bboxes and labels are all concatenated together, and then the bboxes are cropped but not filtered (some invalid bboxes may appear).
+
+```python
+mosaic_bboxes.clip_([2 * self.img_scale[0], 2 * self.img_scale[1]])
+```
+
+Please reference the Mosaic theory of [YOLOv5](./yolov5_description.md) for more details.
+
+#### 1.1.3 MixUp
+
+The MixUp implementation of RTMDet is the same as YOLOX, with the addition of cache function similar to above mentioned.
+
+Please reference the MixUp theory of [YOLOv5](./yolov5_description.md) for more details.
+
+#### 1.1.4 Strong and weak two-stage training
+
+Mosaic + MixUp has high distortion. Continuously using strong data augmentation isn't beneficial. YOLOX use strong and weak two-stage training mode firstly. However, the introduction of rotation and shear result in box annotation errors, which needs to introduce L1 loss to correct the performance of regression branch.
+
+In order to make the data augmentation method more general, RTMDet uses Mosaic + MixUp without rotation during the first 280 epochs, and increases the intensity and positive samples by mixing eight images. During the last 20 epochs, a relatively small learning rate is used to fine-tune under weak agumentation, and slowly update parameters to model by EMA, which could obtain a large improvement.
+
+|                               | RTMDet-s | RTMDet-l |
+| ----------------------------- | -------- | -------- |
+| LSJ + rand crop               | 42.3     | 46.7     |
+| Mosaic+MixUp                  | 41.9     | 49.8     |
+| Mosaic + MixUp + 20e finetune | 43.9     | **51.3** |
+
+### 1.2 Model structure
diff --git a/mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/algorithm_descriptions/yolov5_description.md b/mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/algorithm_descriptions/yolov5_description.md
new file mode 100644
index 0000000..4d2ed51
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/algorithm_descriptions/yolov5_description.md
@@ -0,0 +1,651 @@
+# Algorithm principles and implementation with YOLOv5
+
+## 0 Introduction
+
+<div align=center >
+<img alt="YOLOv5-P5_structure_v3.4" src="https://user-images.githubusercontent.com/27466624/200000324-70ae078f-cea7-4189-8baa-440656797dad.jpg"/>
+Figure 1: YOLOv5-l-P5 model structure
+</div>
+
+<div align=center >
+<img alt="YOLOv5-P6_structure_v1.1" src="https://user-images.githubusercontent.com/27466624/211143533-1725c1b2-6189-4c3a-a046-ad968e03cb9d.jpg"/>
+Figure 2: YOLOv5-l-P6 model structure
+</div>
+
+RangeKing@github provides the graph above. Thanks, RangeKing!
+
+YOLOv5 is an open-source object detection algorithm for real-time industrial applications which has received extensive attention. The reason for the explosion of YOLOv5 is not simply due to its excellent performance. It is more about the overall utility and robustness of its library.
+In short, the main features of YOLOv5 are:
+
+1. **Friendly and perfect deployment supports**
+2. **Fast training speed**: the training time in the case of 300 epochs is similar to most of the one-stage and two-stage algorithms under 12 epochs, such as RetinaNet, ATSS, and Faster R-CNN.
+3. **Abundant optimization for corner cases**: YOLOv5 has implemented many optimizations. The functions and documentation are richer as well.
+
+Figures 1 and 2 show that the main differences between the P5 and P6 versions of YOLOv5 are the network structure and the image input resolution. Other differences, such as the number of anchors and loss weights, can be found in the [configuration file](https://github.com/open-mmlab/mmyolo/blob/main/configs/yolov5/yolov5_s-p6-v62_syncbn_fast_8xb16-300e_coco.py). This article will start with the principle of the YOLOv5 algorithm and then focus on analyzing the implementation in MMYOLO. The follow-up part includes the guide and speed benchmark of YOLOv5.
+
+```{hint}
+Unless specified, the P5 model is described by default in this documentation.
+```
+
+We hope this article becomes your core document to start and master YOLOv5. Since YOLOv5 is still constantly updated, we will also keep updating this document. So please always catch up with the latest version.
+
+MMYOLO implementation configuration: https://github.com/open-mmlab/mmyolo/blob/main/configs/yolov5/
+
+YOLOv5 official repository: https://github.com/ultralytics/yolov5
+
+## 1 v6.1 algorithm principle and MMYOLO implementation analysis
+
+YOLOv5 official release: https://github.com/ultralytics/yolov5/releases/tag/v6.1
+
+<div align=center >
+<img alt="YOLOv5 accuracy" src="https://user-images.githubusercontent.com/40284075/190542120-29d46b7e-ce3c-436a-9933-cfc9f86787bf.png"/>
+</div>
+
+<div align=center >
+<img alt="YOLOv5 benchmark" src="https://user-images.githubusercontent.com/40284075/190542279-37734629-2b59-4bd8-a9bf-757875a93eed.png"/>
+</div>
+
+The performance is shown in the table above. YOLOv5 has two models with different scales. P6 is larger with a 1280x1280 input size, whereas P5 is the model used more often. This article focuses on the structure of the P5 model.
+
+Usually, we divide the object detection algorithm into different parts, such as data augmentation, model structure, loss calculation, etc. It is the same as YOLOv5:
+
+<div align=center >
+<img alt="Strategy" src="https://user-images.githubusercontent.com/40284075/190542423-f6b20d8e-c82a-4a34-9065-c161c5e29e7c.png"/>
+</div>
+
+Now we will briefly analyze the principle and our specific implementation in MMYOLO.
+
+### 1.1 Data augmentation
+
+Many data augmentation methods are used in YOLOv5, including:
+
+- **Mosaic**
+- **RandomAffine**
+- **MixUp**
+- **Image blur and other transformations using Albu**
+- **HSV color space enhancement**
+- **Random horizontal flips**
+
+The mosaic probability is set to `1`, so it will always be triggered. MixUp is not used for the small and nano models, and the probability is `0.1` for other l/m/x series models. As small models have limited capabilities, we generally do not use strong data augmentations like MixUp.
+
+The following picture demonstrates the `Mosaic + RandomAffine + MixUp` process.
+
+<div align=center >
+<img alt="image" src="https://user-images.githubusercontent.com/40284075/190542598-bbf4a159-cc9d-4bac-892c-46ef99267994.png"/>
+</div>
+
+#### 1.1.1 Mosaic
+
+<div align=center >
+<img alt="image" src="https://user-images.githubusercontent.com/40284075/190542619-d777894f-8928-4244-b39a-158eea416ccd.png"/>
+</div>
+
+Mosaic is a hybrid data augmentation method requiring four images to be stitched together, which is equivalent to increasing the training batch size.
+
+We can summarize the process as:
+
+1. Randomly generates coordinates of the intersection point of the four spliced images.
+2. Randomly select the indexes of the other three images and read the corresponding annotations.
+3. Resizes each image to the specified size by maintaining its aspect ratio.
+4. Calculate the position of each image in the output image according to the top, bottom, left, and right rule. You also need to calculate the crop coordinates because the image may be out of bounds.
+5. Uses the crop coordinates to crop the scaled image and paste it to the position calculated. The rest of the places will be pad with `114 pixels`.
+6. Process the label of each image accordingly.
+
+Note: since four images are stitched together, the output image area will be enlarged four times (from 640x640 to 1280x1280). Therefore, to revert to 640x640, you must add a **RandomAffine** transformation. Otherwise, the image area will always be four times larger.
+
+#### 1.1.2 RandomAffine
+
+<div align=center >
+<img alt="image" src="https://user-images.githubusercontent.com/40284075/190542871-14e91a42-329f-4084-aec5-b3e412e5364b.png"/>
+</div>
+
+RandomAffine has two purposes:
+
+1. Performs a stochastic geometric affine transformation to the image.
+2. Reduces the size of the image generated by Mosaic back to 640x640.
+
+RandomAffine includes geometric augmentations such as translation, rotation, scaling, misalignment, etc. Since Mosaic and RandomAffine are strong augmentations, they will introduce considerable noise. Therefore, the enhanced annotations need to be processed. The rules are
+
+1. The width and height of the enhanced gt bbox should be larger than wh_thr;
+2. The ratio of the area of gt bbox after and before the enhancement should be greater than ar_thr to prevent it from changing too much.
+3. The maximum aspect ratio should be smaller than area_thr to prevent it from changing too much.
+
+Object detection algorithms will rarely use this augmentation method as the annotation box becomes larger after the rotation, resulting in inaccuracy.
+
+#### 1.1.3 MixUp
+
+<div align=center >
+<img alt="image" src="https://user-images.githubusercontent.com/40284075/190543076-db60e4b2-0552-4cf4-ab45-259d1ccbd5a6.png"/>
+</div>
+
+MixUp, similar to Mosaic, is also a hybrid image augmentation. It randomly selects another image and mixes the two images together. There are various ways to do this, and the typical approach is to either stitch the label together directly or mix the label using `alpha` method.
+The original author's approach is straightforward: the label is directly stitched, and the images are mixed by distributional sampling.
+
+Note: **In YOLOv5's implementation of MixUP, the other random image must be processed by Mosaic+RandomAffine before the mixing process.** This may not be the same as implementations in other open-source libraries.
+
+#### 1.1.4 Image blur and other augmentations
+
+<div align=center >
+<img alt="image" src="https://user-images.githubusercontent.com/40284075/190543533-8b9ece51-676b-4a7d-a7d0-597e2dd1d42e.png"/>
+</div>
+
+The rest of the augmentations are:
+
+- **Image blur and other transformations using Albu**
+- **HSV color space enhancement**
+- **Random horizontal flips**
+
+The Albu library has been packaged in MMDetection so users can directly use all Albu's methods through simple configurations. As a very ordinary and common processing method, HSV will not be further introduced now.
+
+#### 1.1.5 The implementations in MMYOLO
+
+While conventional single-image augmentations such as random flip are relatively easy to implement, hybrid data augmentations like Mosaic are more complicated. Therefore, in MMDetection's reimplementation of YOLOX, a dataset wrapper called `MultiImageMixDataset` was introduced. The process is as follows:
+
+<div align=center >
+<img alt="image" src="https://user-images.githubusercontent.com/40284075/190543666-d5a22ed7-46a0-4696-990a-12ebde7f8907.png"/>
+</div>
+
+For hybrid data augmentations such as Mosaic, you need to implement an additional `get_indexes` method to retrieve the index information of other images and then perform the enhancement.
+Take the YOLOX implementation in MMDetection as an example. The configuration file is like this:
+
+```python
+train_pipeline = [
+    dict(type='Mosaic', img_scale=img_scale, pad_val=114.0),
+    dict(
+        type='RandomAffine',
+        scaling_ratio_range=(0.1, 2),
+        border=(-img_scale[0] // 2, -img_scale[1] // 2)),
+    dict(
+        type='MixUp',
+        img_scale=img_scale,
+        ratio_range=(0.8, 1.6),
+        pad_val=114.0),
+    ...
+]
+
+train_dataset = dict(
+    # use MultiImageMixDataset wrapper to support mosaic and mixup
+    type='MultiImageMixDataset',
+    dataset=dict(
+        type='CocoDataset',
+        pipeline=[
+            dict(type='LoadImageFromFile'),
+            dict(type='LoadAnnotations', with_bbox=True)
+        ]),
+    pipeline=train_pipeline)
+```
+
+MultiImageMixDataset passes in a data augmentation method, including Mosaic and RandomAffine. CocoDataset also adds a pipeline to load the images and the annotations. This way, it is possible to quickly achieve a hybrid data augmentation method.
+
+However, the above implementation has one drawback: **For users unfamiliar with MMDetection, they often forget that Mosaic must be used with MultiImageMixDataset. Otherwise, it will return an error. Plus, this approach increases the complexity and difficulty of understanding**.
+
+To solve this problem, we have simplified it further in MMYOLO. By making the dataset object directly accessible to the pipeline, the implementation and the use of hybrid data augmentations can be the same as random flipping.
+
+The configuration of YOLOX in MMYOLO is written as follows:
+
+```python
+pre_transform = [
+    dict(type='LoadImageFromFile'),
+    dict(type='LoadAnnotations', with_bbox=True)
+]
+
+train_pipeline = [
+    *pre_transform,
+    dict(
+        type='Mosaic',
+        img_scale=img_scale,
+        pad_val=114.0,
+        pre_transform=pre_transform),
+    dict(
+        type='mmdet.RandomAffine',
+        scaling_ratio_range=(0.1, 2),
+        border=(-img_scale[0] // 2, -img_scale[1] // 2)),
+    dict(
+        type='YOLOXMixUp',
+        img_scale=img_scale,
+        ratio_range=(0.8, 1.6),
+        pad_val=114.0,
+        pre_transform=pre_transform),
+    ...
+]
+```
+
+This eliminates the need for the MultiImageMixDataset and makes it much easier to use and understand.
+
+Back to the YOLOv5 configuration, since the other randomly selected image in the MixUp also needs to be enhanced by Mosaic+RandomAffine before it can be used, the YOLOv5-m data enhancement configuration is as follows.
+
+```python
+pre_transform = [
+    dict(type='LoadImageFromFile'),
+    dict(type='LoadAnnotations', with_bbox=True)
+]
+
+mosaic_transform= [
+    dict(
+        type='Mosaic',
+        img_scale=img_scale,
+        pad_val=114.0,
+        pre_transform=pre_transform),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        scaling_ratio_range=(0.1, 1.9),  # scale = 0.9
+        border=(-img_scale[0] // 2, -img_scale[1] // 2),
+        border_val=(114, 114, 114))
+]
+
+train_pipeline = [
+    *pre_transform,
+    *mosaic_transform,
+    dict(
+        type='YOLOv5MixUp',
+        prob=0.1,
+        pre_transform=[
+            *pre_transform,
+            *mosaic_transform
+        ]),
+    ...
+]
+```
+
+### 1.2 Network structure
+
+This section was written by RangeKing@github. Thanks a lot!
+
+The YOLOv5 network structure is the standard `CSPDarknet` + `PAFPN` + `non-decoupled Head`.
+
+The size of the YOLOv5 network structure is determined by the `deepen_factor` and `widen_factor` parameters. `deepen_factor` controls the depth of the network structure, that is, the number of stacks of `DarknetBottleneck` modules in `CSPLayer`. `widen_factor` controls the width of the network structure, that is, the number of channels of the module output feature map. Take YOLOv5-l as an example. Its `deepen_factor = widen_factor = 1.0`. the overall structure is shown in the graph above.
+
+The upper part of the figure is an overview of the model; the lower part is the specific network structure, in which the modules are marked with numbers in serial, which is convenient for users to correspond to the configuration files of the YOLOv5 official repository. The middle part is the detailed composition of each sub-module.
+
+If you want to use **netron** to visualize the details of the network structure, open the ONNX file format exported by MMDeploy in netron.
+
+```{hint}
+The shapes of the feature map in Section 1.2 are (B, C, H, W) by default.
+```
+
+#### 1.2.1 Backbone
+
+`CSPDarknet` in MMYOLO inherits from `BaseBackbone`. The overall structure is similar to `ResNet` with a total of 5 layers of design, including one `Stem Layer` and four `Stage Layer`:
+
+- `Stem Layer` is a `ConvModule` whose kernel size is 6x6. It is more efficient than the `Focus` module used before v6.1.
+- Except for the last `Stage Layer`, each `Stage Layer` consists of one `ConvModule` and one `CSPLayer`, as shown in the Details part in the graph above. `ConvModule` is a 3x3 `Conv2d` + `BatchNorm` + `SiLU activation function` module. `CSPLayer` is the C3 module in the official YOLOv5 repository, consisting of three `ConvModule` + n `DarknetBottleneck` with residual connections.
+- The last `Stage Layer` adds an `SPPF` module at the end. The `SPPF` module is to serialize the input through multiple 5x5 `MaxPool2d` layers, which has the same effect as the `SPP` module but is faster.
+- The P5 model passes the corresponding results from the second to the fourth `Stage Layer` to the `Neck` structure and extracts three output feature maps. Take a 640x640 input image as an example. The output features are (B, 256, 80, 80), (B,512,40,40), and (B,1024,20,20). The corresponding stride is 8/16/32.
+- The P6 model passes the corresponding results from the second to the fifth `Stage Layer` to the `Neck` structure and extracts three output feature maps. Take a 1280x1280 input image as an example. The output features are (B, 256, 160, 160), (B,512,80,80), (B,768,40,40), and (B,1024,20,20). The corresponding stride is 8/16/32/64.
+
+#### 1.2.2 Neck
+
+There is no **Neck** part in the official YOLOv5. However, to facilitate users to correspond to other object detection networks easier, we split the `Head` of the official repository into `PAFPN` and `Head`.
+
+Based on the `BaseYOLONeck` structure, YOLOv5's `Neck` also follows the same build process. However, for non-existed modules, we use `nn.Identity` instead.
+
+The feature maps output by the Neck module is the same as the Backbone. The P5 model is (B,256,80,80), (B,512,40,40) and (B,1024,20,20); the P6 model is (B,256,160,160), (B,512,80,80), (B,768,40,40) and (B,1024,20,20).
+
+#### 1.2.3 Head
+
+The `Head` structure of YOLOv5 is the same as YOLOv3, which is a `non-decoupled Head`. The Head module includes three convolution modules that do not share weights. They are used only for input feature map transformation.
+
+The `PAFPN` outputs three feature maps of different scales, whose shapes are (B,256,80,80), (B,512,40,40), and (B,1024,20,20) accordingly.
+
+Since YOLOv5 has a non-decoupled output, that is, classification and bbox detection results are all in different channels of the same convolution module. Taking the COCO dataset as an example:
+
+- When the input of P5 model is 640x640 resolution, the output shapes of the Head module are `(B, 3x(4+1+80),80,80)`, `(B, 3x(4+1+80),40,40)` and `(B, 3x(4+1+80),20,20)`.
+
+- When the input of P6 model is 1280x1280 resolution, the output shapes of the Head module are  `(B, 3x(4+1+80),160,160)`, `(B, 3x(4+1+80),80,80)`, `(B, 3x(4+1+80),40,40)` and `(B, 3x(4+1+80),20,20)`.
+
+  `3` represents three anchors, `4` represents the bbox prediction branch, `1` represents the obj prediction branch, and `80` represents the class prediction branch of the COCO dataset.
+
+### 1.3 Positive and negative sample assignment strategy
+
+The core of the positive and negative sample assignment strategy is to determine which positions in all positions of the predicted feature map should be positive or negative and even which samples will be ignored.
+
+This is one of the most significant components of the object detection algorithm because a good strategy can improve the algorithm's performance.
+
+The assignment strategy of YOLOv5 can be briefly summarized as calculating the shape-matching rate between anchor and gt_bbox. Plus, the cross-neighborhood grid is also introduced to get more positive samples.
+
+It consists of the following two main steps:
+
+1. For any output layer, instead of the commonly used strategy based on Max IoU matching, YOLOv5 switched to comparing the shape matching ratio. First, the GT Bbox and the anchor of the current layer are used to calculate the aspect ratio. If the ratio is greater than the threshold, the GT Bbox and Anchor are considered not matched. Then the current GT Bbox is temporarily discarded, and the predicted position in the grid of this GT Bbox in the current layer is regarded as a negative sample.
+2. For the remaining GT Bboxes (the matched GT Bboxes), YOLOv5 calculates which grid they fall in. Using the rounding rule to find the nearest two grids and considering all three grids as a group that is responsible for predicting the GT Bbox. The number of positive samples has increased by at least three times compared to the previous YOLO series algorithms.
+
+Now we will explain each part of the assignment strategy in detail. Some descriptions and illustrations are directly or indirectly referenced from the official [repo](https://github.com/ultralytics/YOLOv5/issues/6998#44).
+
+#### 1.3.1 Anchor settings
+
+YOLOv5 is an anchor-based object detection algorithm. Similar to YOLOv3, the anchor sizes are still obtained by clustering. However, the difference compared with YOLOv3 is that instead of clustering based on IoU, YOLOv5 switched to using the aspect ratio on the width and height (shape-match based method).
+
+While training on customized data, user can use the tool in MMYOLO to analyze and get the appropriate anchor sizes of the dataset.
+
+```shell
+python tools/analysis_tools/optimize_anchors.py ${CONFIG} --algorithm v5-k-means
+ --input-shape ${INPUT_SHAPE [WIDTH HEIGHT]} --output-dir ${OUTPUT_DIR}
+```
+
+Then modify the default anchor size setting in the [config file](https://github.com/open-mmlab/mmyolo/blob/main/configs/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py):
+
+```python
+anchors = [[(10, 13), (16, 30), (33, 23)], [(30, 61), (62, 45), (59, 119)],
+           [(116, 90), (156, 198), (373, 326)]]
+```
+
+#### 1.3.2 Bbox encoding and decoding process
+
+The predicted bounding box will transform based on the pre-set anchors in anchor-based algorithms. Then, the transformation amount is predicted, known as the GT Bbox encoding process. Finally, the Pred Bbox decoding needs to be performed after the prediction to restore the bboxes to the original scale, known as the Pred Bbox decoding process.
+
+In YOLOv3, the bbox regression formula is:
+
+```{math}
+b_x=\sigma(t_x)+c_x  \\
+b_y=\sigma(t_y)+c_y  \\
+b_w=a_w\cdot e^{t_w} \\
+b_h=a_h\cdot e^{t_h} \\
+```
+
+In the above formula,
+
+```{math}
+a_w represents the width of the anchor \\
+c_x represents the coordinate of the grid \\
+\sigma represents the Sigmoid function.
+```
+
+However, the regression formula in YOLOv5 is:
+
+```{math}
+b_x=(2\cdot\sigma(t_x)-0.5)+c_x   \\
+b_y=(2\cdot\sigma(t_y)-0.5)+c_y   \\
+b_w=a_w\cdot(2\cdot\sigma(t_w))^2   \\
+b_h=a_h\cdot(2\cdot\sigma(t_h))^2
+```
+
+Two main changes are:
+
+- adjusted the range of the center point coordinate from (0, 1) to (-0.5, 1.5);
+- adjusted the width and height from
+
+```{math}
+(0,+\infty)
+```
+
+to
+
+```{math}
+(0,4a_{wh})
+```
+
+The changes have the two benefits:
+
+- It will be **better to predict zero and one** with the changed center point range, which makes the bbox coordinate regression more accurate.
+
+<div align=center >
+<img alt="image" src="https://user-images.githubusercontent.com/40284075/190546778-83001bac-4e71-4b9a-8de8-bd41146495af.png"/>
+</div>
+
+- `exp(x)` in the width and height regression formula is unbounded, which may cause the **gradient out of control** and make the training stage unstable. The revised width-height regression in YOLOv5 optimizes this problem.
+
+<div align=center >
+<img alt="image" src="https://user-images.githubusercontent.com/40284075/190546793-5364d6d3-7891-4af3-98e3-9f06970f3163.png"/>
+</div>
+
+#### 1.3.3 Assignment strategy
+
+Note: in MMYOLO, **we call anchor as prior** for both anchor-based and anchor-free networks.
+
+Positive sample assignment consists of the following two steps:
+
+(1) Scale comparison
+
+Compare the scale of the WH in the GT BBox and the WH in the Prior:
+
+```{math}
+r_w = w\_{gt} / w\_{pt}    \\
+r_h = h\_{gt} / h\_{pt}    \\
+r_w^{max}=max(r_w, 1/r_w)  \\
+r_h^{max}=max(r_h, 1/r_h)  \\
+r^{max}=max(r_w^{max}, r_h^{max})   \\
+if\ \ r_{max} < prior\_match\_thr:   match!
+```
+
+Taking the assignment process of the GT Bbox and the Prior of the P3 feature map as the example:
+
+<div align=center >
+<img alt="image" src="https://user-images.githubusercontent.com/40284075/190547195-60d6cd7a-b12a-4c6f-9cc8-13f48c8ab1e0.png"/>
+</div>
+
+The reason why Prior 1 fails to match the GT Bbox is because:
+
+```{math}
+h\_{gt}\ /\ h\_{prior}\ =\ 4.8\ >\ prior\_match\_thr
+```
+
+(2) Assign corresponded positive samples to the matched GT BBox in step 1
+
+We still use the example in the previous step.
+
+The value of (cx, cy, w, h) of the GT BBox is (26, 37, 36, 24), and the WH value of the Prior is \[(15, 5), (24, 16), (16, 24)\]. In the P3 feature map, the stride is eight. Prior 2 and prior 3 are matched.
+
+The detailed process can be described as:
+
+(2.1) Map the center point coordinates of the GT Bbox to the grid of P3.
+
+```{math}
+GT_x^{center_grid}=26/8=3.25  \\
+GT_y^{center_grid}=37/8=4.625
+```
+
+<div align=center >
+<img alt="image" src="https://user-images.githubusercontent.com/40284075/190549304-020ec19e-6d54-4d40-8f43-f78b8d6948aa.png"/>
+</div>
+
+(2.2) Divide the grid where the center point of GT Bbox locates into four quadrants. **Since the center point falls in the lower left quadrant, the left and lower grids of the object will also be considered positive samples**.
+
+<div align=center >
+<img alt="image" src="https://user-images.githubusercontent.com/40284075/190549310-e5da53e3-eae3-4085-bd0a-1843ac8ca653.png"/>
+</div>
+
+The following picture shows the distribution of positive samples when the center point falls to different positions:
+
+<div align=center >
+<img alt="image" src="https://user-images.githubusercontent.com/40284075/190549613-eb47e70a-a2c1-4729-9fb7-f5ce7007842b.png"/>
+</div>
+
+So what improvements does the Assign method bring to YOLOv5?
+
+- One GT Bbox can match multiple Priors.
+
+- When a GT Bbox matches a Prior, at most three positive samples can be assigned.
+
+- These strategies can **moderately alleviate the problem of unbalanced positive and negative samples, which is very common in object detection algorithms**.
+
+The regression method in YOLOv5 corresponds to the Assign method:
+
+1. Center point regression:
+
+<div align=center >
+<img alt="image" src="https://user-images.githubusercontent.com/40284075/190549684-21776c33-9ef8-4818-9530-14f750a18d63.png"/>
+</div>
+
+2. WH regression:
+
+<div align=center >
+<img alt="image" src="https://user-images.githubusercontent.com/40284075/190549696-3da08c06-753a-4108-be47-64495ea480f2.png"/>
+</div>
+
+### 1.4 Loss design
+
+YOLOv5 contains a total of three Loss, which are:
+
+- Classes loss: BCE loss
+- Objectness loss: BCE loss
+- Location loss: CIoU loss
+
+These three losses are aggregated according to a certain proportion:
+
+```{math}
+Loss=\lambda_1L_{cls}+\lambda_2L_{obj}+\lambda_3L_{loc}
+```
+
+The Objectness loss corresponding to the P3, P4, and P5 layers are added according to different weights. The default setting is
+
+```python
+obj_level_weights=[4., 1., 0.4]
+```
+
+```{math}
+L_{obj}=4.0\cdot L_{obj}^{small}+1.0\cdot L_{obj}^{medium}+0.4\cdot L_{obj}^{large}
+```
+
+In the reimplementation, we found a certain gap between the CIoU used in YOLOv5 and the latest official CIoU, which is reflected in the calculation of the alpha parameter.
+
+In the official version:
+
+Reference: https://github.com/Zzh-tju/CIoU/blob/master/layers/modules/multibox_loss.py#L53-L55
+
+```python
+alpha = (ious > 0.5).float() * v / (1 - ious + v)
+```
+
+In YOLOv5's version:
+
+```python
+alpha = v / (v - ious + (1 + eps))
+```
+
+This is an interesting detail, and we need to test the accuracy gap caused by different alpha calculation methods in our follow-up development.
+
+### 1.5 Optimization and training strategies
+
+YOLOv5 has very fine-grained control over the parameter groups of each optimizer, which briefly includes the following sections.
+
+#### 1.5.1 Optimizer grouping
+
+The optimization parameters are divided into three groups: Conv/Bias/BN. In the WarmUp stage, different groups use different lr and momentum update curves.
+At the same time, the iter-based update strategy is adopted in the WarmUp stage, and it becomes an epoch-based update strategy in the non-WarmUp stage, which is quite tricky.
+
+In MMYOLO, the YOLOv5OptimizerConstructor optimizer constructor is used to implement optimizer parameter grouping. The role of an optimizer constructor is to control the initialization process of some special parameter groups finely so that it can meet the needs well.
+
+Different parameter groups use different scheduling curve functions through YOLOv5ParamSchedulerHook.
+
+#### 1.5.2 weight decay parameter auto-adaptation
+
+The author adopts different weight decay strategies for different batch sizes, specifically:
+
+1. When the training batch size does not exceed 64, weight decay remains unchanged.
+2. When the training batch size exceeds 64, weight decay will be linearly scaled according to the total batch size.
+
+MMYOLO also implements through the YOLOv5OptimizerConstructor.
+
+#### 1.5.3 Gradient accumulation
+
+To maximize the performance under different batch sizes, the author sets the gradient accumulation function automatically when the total batch size is less than 64.
+
+The training process is similar to most YOLO, including the following strategies:
+
+1. Not using pre-trained weights.
+2. There is no multi-scale training strategy, and cudnn.benchmark can be turned on to accelerate training further.
+3. The EMA strategy is used to smooth the model.
+4. Automatic mixed-precision training with AMP by default.
+
+What needs to be reminded is that the official YOLOv5 repository uses single-card v100 training for the small model with a bs is 128. However, m/l/x models are trained with different numbers of multi-cards.
+This training strategy is not relatively standard, **For this reason, eight cards are used in MMYOLO, and each card sets the bs to 16. At the same time, in order to avoid performance differences, SyncBN is turned on during training**.
+
+### 1.6 Inference and post-processing
+
+The YOLOv5 post-processing is very similar to YOLOv3. In fact, all post-processing stages of the YOLO series are similar.
+
+#### 1.6.1 Core parameters
+
+1. **multi_label**
+
+For multi-category prediction, you need to consider whether it is a multi-label case or not. Multi-label case predicts probabilities of more than one category at one location. As YOLOv5 uses sigmoid, it is possible that one object may have two different predictions. It is good to evaluate mAP, but not good to use.
+Therefore, multi_label is set to `True` during the evaluation and changed to `False` for inferencing and practical usage.
+
+2. **score_thr and nms_thr**
+
+The score_thr threshold is used for the score of each category, and the detection boxes with a score below the threshold are treated as background. nms_thr is used for nms process. During the evaluation, score_thr can be set very low, which improves the recall and the mAP. However, it is meaningless for practical usage and leads to a very slow inference performance. For this reason, different thresholds are set in the testing and inference phases.
+
+3. **nms_pre and max_per_img**
+
+nms_pre is the maximum number of frames to be preserved before NMS, which is used to prevent slowdown caused by too many input frames during the NMS process. max_per_img is the final maximum number of frames to be reserved, usually set to 300.
+
+Take the COCO dataset as an example. It has 80 classes, and the input size is 640x640.
+
+<div align=center >
+<img alt="image" src="https://user-images.githubusercontent.com/17425982/192942249-96b0fcfb-059f-48fe-862f-7d526a3a06d7.png"/>
+</div>
+
+The inference and post-processing include:
+
+**(1) Dimensional transformation**
+
+YOLOv5 outputs three feature maps. Each feature map is scaled at 80x80, 40x40, and 20x20. As three anchors are at each position, the output feature map channel is 3x(5+80)=255.
+YOLOv5 uses a non-decoupled Head, while most other algorithms use decoupled Head. Therefore, to unify the post-processing logic, we decouple YOLOv5's Head into the category prediction branch, the bbox prediction branch, and the obj prediction branch.
+
+The three scales of category prediction, bbox prediction, and obj prediction are stitched together and dimensionally transformed. For subsequent processing, the original channel dimensions are replaced at the end, and the shapes of the category prediction branch, bbox prediction branch, and obj prediction branch are (b, 3x80x80+3x40x40+3x20x20, 80)=(b,25200,80), (b,25200,4), and (b,25200,1), respectively.
+
+**(2) Decoding to the original graph scale**
+
+The classification branch and obj branch need to be computed with the sigmoid function, while the bbox prediction branch needs to be decoded and reduced to the original image in xyxy format.
+
+**(3) First filtering**
+
+Iterate through each graph in the batch, and then use score_thr to threshold filter the category prediction scores to remove the prediction results below score_thr.
+
+**(4) Second filtering**
+
+Multiply the obj prediction scores and the filtered category prediction scores, and then still use score_thr for threshold filtering.
+It is also necessary to consider **multi_label and nms_pre in this process to ensure that the number of detected boxes after filtering is no more than nms_pre**.
+
+**(5) Rescale to original size and NMS**
+
+Based on the pre-processing process, restore the remaining detection frames to the original graph scale before the network output and perform NMS. The final output detection frame cannot be more than **max_per_img**.
+
+#### 1.6.2 batch shape strategy
+
+To speed up the inference process on the validation set, the authors propose the batch shape strategy, whose principle is to **ensure that the images within the same batch have the least number of pad pixels in the batch inference process and do not require all the images in the batch to have the same scale throughout the validation process**.
+
+It first sorts images according to their aspect ratio of the entire test or validation set, and then forms a batch of the sorted images based on the settings.
+At the same time, the batch shape of the current batch is calculated to prevent too many pad pixels. We focus on padding with the original aspect ratio but not padding the image to a perfect square.
+
+```python
+        image_shapes = []
+        for data_info in data_list:
+            image_shapes.append((data_info['width'], data_info['height']))
+
+        image_shapes = np.array(image_shapes, dtype=np.float64)
+
+        n = len(image_shapes)  # number of images
+        batch_index = np.floor(np.arange(n) / self.batch_size).astype(
+            np.int64)  # batch index
+        number_of_batches = batch_index[-1] + 1  # number of batches
+
+        aspect_ratio = image_shapes[:, 1] / image_shapes[:, 0]  # aspect ratio
+        irect = aspect_ratio.argsort()
+
+        data_list = [data_list[i] for i in irect]
+
+        aspect_ratio = aspect_ratio[irect]
+        # Set training image shapes
+        shapes = [[1, 1]] * number_of_batches
+        for i in range(number_of_batches):
+            aspect_ratio_index = aspect_ratio[batch_index == i]
+            min_index, max_index = aspect_ratio_index.min(
+            ), aspect_ratio_index.max()
+            if max_index < 1:
+                shapes[i] = [max_index, 1]
+            elif min_index > 1:
+                shapes[i] = [1, 1 / min_index]
+
+        batch_shapes = np.ceil(
+            np.array(shapes) * self.img_size / self.size_divisor +
+            self.pad).astype(np.int64) * self.size_divisor
+
+        for i, data_info in enumerate(data_list):
+            data_info['batch_shape'] = batch_shapes[batch_index[i]]
+```
+
+## 2 Sum up
+
+This article focuses on the principle of YOLOv5 and our implementation in MMYOLO in detail, hoping to help users understand the algorithm and the implementation process. At the same time, again, please note that since YOLOv5 itself is constantly being updated, this open-source library will also be continuously iterated. So please always check the latest version.
diff --git a/mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/algorithm_descriptions/yolov8_description.md b/mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/algorithm_descriptions/yolov8_description.md
new file mode 100644
index 0000000..70f1686
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/algorithm_descriptions/yolov8_description.md
@@ -0,0 +1,241 @@
+# Algorithm principles and implementation with YOLOv8
+
+## 0 Introduction
+
+<div align=center >
+<img alt="YOLOv8-P5_structure" src="https://user-images.githubusercontent.com/27466624/222869864-1955f054-aa6d-4a80-aed3-92f30af28849.jpg"/>
+Figure 1:YOLOv8-P5
+</div>
+
+RangeKing@github provides the graph above. Thanks, RangeKing!
+
+YOLOv8 is the next major update from YOLOv5, open sourced by Ultralytics on 2023.1.10, and now supports image classification, object detection and instance segmentation tasks.
+
+<div align=center >
+<img alt="YOLOv8-logo" src="https://user-images.githubusercontent.com/17425982/212823787-44031e62-e374-4851-8267-4e56e299473a.png"/>
+Figure 2:YOLOv8-logo
+</div>
+According to the official description, Ultralytics YOLOv8 is the latest version of the YOLO object detection and image segmentation model developed by Ultralytics. YOLOv8 is a cutting-edge, state-of-the-art (SOTA) model that builds upon the success of previous YOLO versions and introduces new features and improvements to further boost performance and flexibility. These include a new backbone network, a new anchor-free detection head, and a new loss function. YOLOv8 is also highly efficient and can be run on a variety of hardware platforms, from CPUs to GPUs.
+
+However, instead of naming the open source library YOLOv8, ultralytics uses the word ultralytics directly because ultralytics positions the library as an algorithmic framework rather than a specific algorithm, with a major focus on scalability. It is expected that the library can be used not only for the YOLO model family, but also for non-YOLO models and various tasks such as classification segmentation pose estimation.
+
+Overall, YOLOv8 is a powerful and flexible tool for object detection and image segmentation that offers the best of both worlds: **the SOTA technology and the ability to use and compare all previous YOLO versions.**
+
+<div align=center >
+<img alt="YOLOv8-table" src="https://user-images.githubusercontent.com/17425982/212007736-f592bc70-3959-4ff6-baf7-a93c7ad1d882.png"/>
+Figure 3:YOLOv8-performance
+</div>
+
+YOLOv8 official open source address: [this](https://github.com/ultralytics/ultralytics)
+
+MMYOLO open source address for YOLOv8: [this](https://github.com/open-mmlab/mmyolo/blob/dev/configs/yolov8/)
+
+The following table shows the official results of mAP, number of parameters and FLOPs tested on the COCO Val 2017 dataset. It is evident that YOLOv8 has significantly improved precision compared to YOLOv5. However, the number of parameters and FLOPs of the N/S/M models have significantly increased. Additionally, it can be observed that the inference speed of YOLOv8 is slower in comparison to most of the YOLOv5 models.
+
+| **model** | **YOLOv5**  | **params(M)** | **FLOPs@640 (B)** | **YOLOv8**  | **params(M)** | **FLOPs@640 (B)** |
+| --------- | ----------- | ------------- | ----------------- | ----------- | ------------- | ----------------- |
+| n         | 28.0(300e)  | 1.9           | 4.5               | 37.3 (500e) | 3.2           | 8.7               |
+| s         | 37.4 (300e) | 7.2           | 16.5              | 44.9 (500e) | 11.2          | 28.6              |
+| m         | 45.4 (300e) | 21.2          | 49.0              | 50.2 (500e) | 25.9          | 78.9              |
+| l         | 49.0 (300e) | 46.5          | 109.1             | 52.9 (500e) | 43.7          | 165.2             |
+| x         | 50.7 (300e) | 86.7          | 205.7             | 53.9 (500e) | 68.2          | 257.8             |
+
+It is worth mentioning that the recent YOLO series have shown significant performance improvements on the COCO dataset. However, their generalizability on custom datasets has not been extensively tested, which thereby will be a focus in the future development of MMYOLO.
+
+Before reading this article, if you are not familiar with YOLOv5, YOLOv6 and RTMDet, you can read the detailed explanation of [YOLOv5 and its implementation](https://mmyolo.readthedocs.io/en/latest/algorithm_descriptions/yolov5_description.html).
+
+## 1 YOLOv8 Overview
+
+The core features and modifications of YOLOv8 can be summarized as follows:
+
+1. **A new state-of-the-art (SOTA) model is proposed, featuring an object detection model for P5 640 and P6 1280 resolutions, as well as a YOLACT-based instance segmentation model. The model also includes different size options with N/S/M/L/X scales, similar to YOLOv5, to cater to various scenarios.**
+2. **The backbone network and neck module are based on the YOLOv7 ELAN design concept, replacing the C3 module of YOLOv5 with the C2f module. However, there are a lot of operations such as Split and Concat in this C2f module that are not as deployment-friendly as before.**
+3. **The Head module has been updated to the current mainstream decoupled structure, separating the classification and detection heads, and switching from Anchor-Based to Anchor-Free.**
+4. **The loss calculation adopts the TaskAlignedAssigner in TOOD and introduces the Distribution Focal Loss to the regression loss.**
+5. **In the data augmentation part, Mosaic is closed in the last 10 training epoch, which is the same as YOLOX training part.**
+   **As can be seen from the above summaries, YOLOv8 mainly refers to the design of recently proposed algorithms such as YOLOX, YOLOv6, YOLOv7 and PPYOLOE.**
+
+Next, we will introduce various improvements in the YOLOv8 model in detail by 5 parts: model structure design, loss calculation, training strategy, model inference process and data augmentation.
+
+## 2 Model structure design
+
+The Figure 1 is the model structure diagram based on the official code of YOLOv8. **If you like this style of model structure diagram, welcome to check out the model structure diagram in algorithm README of MMYOLO, which currently covers YOLOv5, YOLOv6, YOLOX, RTMDet and YOLOv8.**
+
+Comparing the YOLOv5 and YOLOv8 yaml configuration files without considering the head module, you can see that the changes are minor.
+
+<div align=center >
+<img alt="yaml" src="https://user-images.githubusercontent.com/17425982/212008977-28c3fc7b-ee00-4d56-b912-d77ded585d78.png"/>
+Figure 4:YOLOv5 and YOLOv8 YAML diff
+</div>
+
+The structure on the left is YOLOv5-s and the other side is YOLOv8-s. The specific changes in the backbone network and neck module are:
+
+- The kernel of the first convolutional layer has been changed from 6x6 to 3x3
+- All C3 modules are replaced by C2f, and the structure is as follows, with more skip connections and additional split operations.
+
+<div align=center >
+<img alt="module" src="https://user-images.githubusercontent.com/17425982/212009208-92f45c23-a024-49bb-a2ee-bb6f87adcc92.png"/>
+Figure 5:YOLOv5 and YOLOv8 module diff
+</div>
+
+- Removed 2 convolutional connection layers from neck module
+- The block number has been changed from 3-6-9-3 to 3-6-6-3.
+- **If we look at the N/S/M/L/X models, we can see that of the N/S and L/X models only changed the scaling factors, but the number of channels in the S/ML backbone network is not the same and does not follow the same scaling factor principle. The main reason for this design is that the channel settings under the same set of scaling factors are not the most optimal, and the YOLOv7 network design does not follow one set of scaling factors for all models either.**
+
+The most significant changes in the model lay in the head module. The head module has been changed from the original coupling structure to the decoupling one, and its style has been changed from **YOLOv5's Anchor-Based to Anchor-Free**. The structure is shown below.
+
+<div align=center >
+<img alt="head" src="https://user-images.githubusercontent.com/17425982/212009547-189e14aa-6f93-4af0-8446-adf604a46b95.png"/>
+Figure 6:YOLOv8 Head
+</div>
+
+As demonstrated, the removal of the objectness branch and the retention of only the decoupled classification and regression branches stand as the major differences. Additionally, the regression branch now employs integral form representation as proposed in the Distribution Focal Loss.
+
+## 3 Loss calculation
+
+The loss calculation process consists of 2 parts: the sample assignment strategy and loss calculation.
+
+The majority of contemporary detectors employ dynamic sample assignment strategies, such as YOLOX's simOTA, TOOD's TaskAlignedAssigner, and RTMDet's DynamicSoftLabelAssigner. Given the superiority of dynamic assignment strategies, the YOLOv8 algorithm directly incorporates the one employed in TOOD's TaskAlignedAssigner.
+
+The matching strategy of TaskAlignedAssigner can be summarized as follows: positive samples are selected based on the weighted scores of classification and regression.
+
+```{math}
+t=s^\alpha+u^\beta
+```
+
+`s` is the prediction score corresponding to the ground truth category, `u` is the IoU of the prediction bounding box and the gt bounding box.
+
+1. For each ground truth, the task-aligned assigner calculates the `alignment metric` for each anchor by taking the weighted product of two values: the predicted classification score of the corresponding class, and the Intersection over Union (IoU) between the predicted bounding box and the Ground Truth bounding box.
+2. For each Ground Truth, the larger top-k samples are selected as positive based on the `alignment_metrics` values directly.
+
+The loss calculation consists of 2 parts: the classification and regression, without the objectness loss in the previous model.
+
+- The classification branch still uses BCE Loss.
+- The regression branch employs both Distribution Focal Loss and CIoU Loss.
+
+The 3 Losses are weighted by a specific weight ratio.
+
+## 4 Data augmentation
+
+YOLOv8's data augmentation is similar to YOLOv5, whereas it stops the Mosaic augmentation in the final 10 epochs as proposed in YOLOX. The data process pipelines are illustrated in the diagram below.
+
+<div align=center >
+<img alt="head" src="https://user-images.githubusercontent.com/17425982/212815248-38384da9-b289-468e-8414-ab3c27ee2026.png"/>
+Figure 7:pipeline
+</div>
+
+The intensity of data augmentation required for different scale models varies, therefore the hyperparameters for the scaled models are adjusted depending on the situation. For larger models, techniques such as MixUp and CopyPaste are typically employed. The result of data augmentation can be seen in the example below:
+
+<div align=center >
+<img alt="head" src="https://user-images.githubusercontent.com/17425982/212815840-063524e1-d754-46b1-9efc-61d17c03fd0e.png"/>
+Figure 8:results
+</div>
+
+The above visualization result can be obtained by running the [browse_dataset](https://github.com/open-mmlab/mmyolo/blob/dev/tools/analysis_tools/browse_dataset.py) script.
+
+As the data augmentation process utilized in YOLOv8 is similar to YOLOv5, we will not delve into the specifics within this article. For a more in-depth understanding of each data transformation, we recommend reviewing the [YOLOv5 algorithm analysis document](https://mmyolo.readthedocs.io/en/latest/algorithm_descriptions/yolov5_description.html#id2) in MMYOLO.
+
+## 5 Training strategy
+
+The distinctions between the training strategy of YOLOv8 and YOLOv5 are minimal. The most notable variation is that the overall number of training epochs for YOLOv8 has been raised from 300 to 500, resulting in a significant expansion in the duration of training. As an illustration, the training strategy for YOLOv8-S can be succinctly outlined as follows:
+
+| config                 | YOLOv8-s P5 hyp                 |
+| ---------------------- | ------------------------------- |
+| optimizer              | SGD                             |
+| base learning rate     | 0.01                            |
+| Base weight decay      | 0.0005                          |
+| optimizer momentum     | 0.937                           |
+| batch size             | 128                             |
+| learning rate schedule | linear                          |
+| training epochs        | **500**                         |
+| warmup iterations      | max(1000,3 * iters_per_epochs) |
+| input size             | 640x640                         |
+| EMA decay              | 0.9999                          |
+
+## 6 Inference process
+
+The inference process of YOLOv8 is almost the same as YOLOv5. The only difference is that the integral representation bbox in Distribution Focal Loss needs to be decoded into a regular 4-dimensional bbox, and the subsequent calculation process is the same as YOLOv5.
+
+Taking COCO 80 class as an example, assuming that the input image size is 640x640, the inference process implemented in MMYOLO is shown as follows.
+
+<div align=center >
+<img alt="head" src="https://user-images.githubusercontent.com/17425982/212816206-33815716-3c12-49a2-9c37-0bd85f941bec.png"/>
+Figure 9:results
+</div>
+The inference and post-processing process is:
+
+**(1) Decoding bounding box**
+Integrate the probability of the distance between the center and the boundary of the box into the mathematical expectation of the distances.
+
+**(2) Dimensional transformation**
+YOLOv8 outputs three feature maps with `80x80`, `40x40` and `20x20` scales. A total of 6 classification and regression different scales of  feature map are output by the head module.
+The 3 different scales of category prediction branch and bbox prediction branch are combined and dimensionally transformed. For the convenience of subsequent processing, the original channel dimensions are transposed to the end, and the category prediction branch and bbox prediction branch shapes are (b, 80x80+40x40+20x20, 80)=(b,8400,80), (b,8400,4), respectively.
+
+**(3) Scale Restroation**
+The classification prediction branch utilizes sigmoid calculations, whereas the bbox prediction branch requires decoding to xyxy format and conversion to the original scale of the input images.
+
+**(4) Thresholding**
+Iterate through each graph in the batch and use `score_thr` to perform thresholding. In this process, we also need to consider multi_label and nms_pre to ensure that the number of detected bboxs after filtering is no more than nms_pre.
+
+**(5) Reduction to the original image scale and NMS**
+Reusing the parameters for preprocessing, the remaining bboxs are first resized to the original image scale and then NMS is performed. The final number of bboxes cannot be more than `max_per_img`.
+
+Special Note: **The Batch shape inference strategy, which is present in YOLOv5, is currently not activated in YOLOv8. By performing a quick test in MMYOLO, it can be observed that activating the Batch shape strategy can result in an approximate AP increase of around 0.1% to 0.2%.**
+
+## 7 Feature map visualization
+
+A comprehensive set of feature map visualization tools are provided in MMYOLO to help users visualize the feature maps.
+
+Take the YOLOv8-s model as an example. The first step is to download the official weights, and then convert them to MMYOLO by using the [yolov8_to_mmyolo](https://github.com/open-mmlab/mmyolo/blob/dev/tools/model_converters/yolov8_to_mmyolo.py) script. Note that the script must be placed under the official repository in order to run correctly.
+
+Assuming that you want to visualize the effect of the 3 feature maps output by backbone and the weights are named 'mmyolov8s.pth'. Run the following command:
+
+```bash
+cd mmyolo
+python demo/featmap_vis_demo.py demo/demo.jpg configs/yolov8/yolov8_s_syncbn_fast_8xb16-500e_coco.py mmyolov8s.pth --channel-reductio squeeze_mean
+```
+
+In particular, to ensure that the feature map and image are shown aligned, the original `test_pipeline` configuration needs to be replaced with the following:
+
+```Python
+test_pipeline = [
+    dict(
+        type='LoadImageFromFile',
+        backend_args=_base_.backend_args),
+    dict(type='mmdet.Resize', scale=img_scale, keep_ratio=False), # change
+    dict(type='LoadAnnotations', with_bbox=True, _scope_='mmdet'),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                   'scale_factor'))
+]
+```
+
+<div align=center >
+<img alt="head" src="https://user-images.githubusercontent.com/17425982/212816319-9ac19484-987a-40ac-a0fe-2c13a7048df7.png"/>
+Figure 10:featmap
+</div>
+From the above figure, we can see that the different output feature maps are mainly responsible for predicting objects at different scales.
+We can also visualize the 3 output feature maps of the neck layer.
+
+```bash
+cd mmyolo
+python demo/featmap_vis_demo.py demo/demo.jpg configs/yolov8/yolov8_s_syncbn_fast_8xb16-500e_coco.py mmyolov8s.pth --channel-reductio squeeze_mean --target-layers neck
+```
+
+<div align=center >
+<img alt="head" src="https://user-images.githubusercontent.com/17425982/212816458-a4e4600a-5f50-49c6-864b-0254a2720f3c.png"/>
+Figure 11:featmap
+</div>
+
+From the above figure, we can find the features at the object are more focused.
+
+## Summary
+
+This article delves into the intricacies of the YOLOv8 algorithm, offering a comprehensive examination of its overall design, model structure, loss function, training data enhancement techniques, and inference process. To aid in comprehension, a plethora of diagrams are provided.
+
+In summary, YOLOv8 is a highly efficient algorithm that incorporates image classification, Anchor-Free object detection, and instance segmentation. Its detection component incorporates numerous state-of-the-art YOLO algorithms to achieve new levels of performance.
+
+MMYOLO open source address for YOLOV8 [this](https://github.com/open-mmlab/mmyolo/blob/dev/configs/yolov8/)
+
+MMYOLO Algorithm Analysis Tutorial address is [yolov5_description](https://mmyolo.readthedocs.io/en/latest/algorithm_descriptions/yolov5_description.html)
diff --git a/mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/application_examples/index.rst b/mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/application_examples/index.rst
new file mode 100644
index 0000000..03c091d
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/application_examples/index.rst
@@ -0,0 +1,7 @@
+MMYOLO application examples
+********************
+
+.. toctree::
+   :maxdepth: 1
+
+   ionogram_detection.md
diff --git a/mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/application_examples/ionogram_detection.md b/mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/application_examples/ionogram_detection.md
new file mode 100644
index 0000000..a1bc7cc
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/application_examples/ionogram_detection.md
@@ -0,0 +1,307 @@
+# A benchmark for ionogram real-time object detection based on MMYOLO
+
+## Dataset
+
+Digital ionogram is the most important way to obtain real-time ionospheric information.
+Ionospheric structure detection is of great research significance for accurate extraction of ionospheric key parameters.
+
+This study utilize 4311 ionograms with different seasons obtained by the Chinese Academy of Sciences in Hainan, Wuhan, and Huailai to establish a dataset. The six structures, including Layer E, Es-l, Es-c, F1, F2, and Spread F are manually annotated using [labelme](https://github.com/wkentaro/labelme). [Dataset Download](https://github.com/VoyagerXvoyagerx/Ionogram_detection/releases/download/Dataset/Iono4311.zip)
+
+<div align=center>
+<img width="40%" src="https://user-images.githubusercontent.com/67947949/223638535-c4583d88-aa5a-4f21-b35a-e6e8328c9bd4.jpg"/>
+
+Preview of annotated images
+
+</div>
+
+1. Dataset prepration
+
+After downloading the data, put it in the root directory of the MMYOLO repository, and use `unzip test.zip` (for Linux) to unzip it to the current folder. The structure of the unzipped folder is as follows:
+
+```shell
+Iono4311/
+├── images
+|      ├── 20130401005200.png
+|      └── ...
+└── labels
+       ├── 20130401005200.json
+       └── ...
+```
+
+The `images` directory contains input images,while the `labels` directory contains annotation files generated by labelme.
+
+2. Convert the dataset into COCO format
+
+Use the script `tools/dataset_converters/labelme2coco.py` to convert labelme labels to COCO labels.
+
+```shell
+python tools/dataset_converters/labelme2coco.py --img-dir ./Iono4311/images \
+                                                --labels-dir ./Iono4311/labels \
+                                                --out ./Iono4311/annotations/annotations_all.json
+```
+
+3. Check the converted COCO labels
+
+To confirm that the conversion process went successfully, use the following command to display the COCO labels on the images.
+
+```shell
+python tools/analysis_tools/browse_coco_json.py --img-dir ./Iono4311/images \
+                                                --ann-file ./Iono4311/annotations/annotations_all.json
+```
+
+4. Divide dataset into training set, validation set and test set
+
+Set 70% of the images in the dataset as the training set, 15% as the validation set, and 15% as the test set.
+
+```shell
+python tools/misc/coco_split.py --json ./Iono4311/annotations/annotations_all.json \
+                                --out-dir ./Iono4311/annotations \
+                                --ratios 0.7 0.15 0.15 \
+                                --shuffle \
+                                --seed 14
+```
+
+The file tree after division is as follows:
+
+```shell
+Iono4311/
+├── annotations
+│   ├── annotations_all.json
+│   ├── class_with_id.txt
+│   ├── test.json
+│   ├── train.json
+│   └── val.json
+├── classes_with_id.txt
+├── images
+├── labels
+├── test_images
+├── train_images
+└── val_images
+```
+
+## Config files
+
+The configuration files are stored in the directory `/projects/misc/ionogram_detection/`.
+
+1. Dataset analysis
+
+To perform a dataset analysis, a sample of 200 images from the dataset can be analyzed using the `tools/analysis_tools/dataset_analysis.py` script.
+
+```shell
+python tools/analysis_tools/dataset_analysis.py projects/misc/ionogram_detection/yolov5/yolov5_s-v61_fast_1xb96-100e_ionogram.py \
+                                                --out-dir output
+```
+
+Part of the output is as follows:
+
+```shell
+The information obtained is as follows:
++------------------------------+
+| Information of dataset class |
++---------------+--------------+
+| Class name    | Bbox num     |
++---------------+--------------+
+| E             | 98           |
+| Es-l          | 27           |
+| Es-c          | 46           |
+| F1            | 100          |
+| F2            | 194          |
+| Spread-F      | 6            |
++---------------+--------------+
+```
+
+This indicates that the distribution of categories in the dataset is unbalanced.
+
+<div align=center>
+<img width="100%" src="https://user-images.githubusercontent.com/67947949/223640412-4008a0a1-0626-419d-90bf-fb7ce6f26fc9.jpg"/>
+
+Statistics of object sizes for each category
+
+</div>
+
+According to the statistics, small objects are predominant in the E, Es-l, Es-c, and F1 categories, while medium-sized objects are more common in the F2 and Spread F categories.
+
+2. Visualization of the data processing part in the config
+
+Taking YOLOv5-s as an example, according to the `train_pipeline` in the config file, the data augmentation strategies used during training include:
+
+- Mosaic augmentation
+- Random affine
+- Albumentations (include various digital image processing methods)
+- HSV augmentation
+- Random affine
+
+Use the **'pipeline'** mode of the script `tools/analysis_tools/browse_dataset.py` to obtains all intermediate images in the data pipeline.
+
+```shell
+python tools/analysis_tools/browse_dataset.py projects/misc/ionogram_detection/yolov5/yolov5_s-v61_fast_1xb96-100e_ionogram.py \
+                                              -m pipeline \
+                                              --out-dir output
+```
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/67947949/223914228-abcd017d-a068-4dcd-9d91-e6b546540060.png"/>
+
+Visualization for intermediate images in the data pipeline
+
+</div>
+
+3. Optimize anchor size
+
+Use the script `tools/analysis_tools/optimize_anchors.py` to obtain prior anchor box sizes suitable for the dataset.
+
+```shell
+python tools/analysis_tools/optimize_anchors.py projects/misc/ionogram_detection/yolov5/yolov5_s-v61_fast_1xb96-100e_ionogram.py \
+                                                --algorithm v5-k-means \
+                                                --input-shape 640 640 \
+                                                --prior-match-thr 4.0 \
+                                                --out-dir work_dirs/dataset_analysis_5_s
+```
+
+4. Model complexity analysis
+
+With the config file, the parameters and FLOPs can be calculated by the script `tools/analysis_tools/get_flops.py`. Take yolov5-s as an example:
+
+```shell
+python tools/analysis_tools/get_flops.py projects/misc/ionogram_detection/yolov5/yolov5_s-v61_fast_1xb96-100e_ionogram.py
+```
+
+The following output indicates that the model has 7.947G FLOPs with the input shape (640, 640), and a total of 7.036M learnable parameters.
+
+```shell
+==============================
+Input shape: torch.Size([640, 640])
+Model Flops: 7.947G
+Model Parameters: 7.036M
+==============================
+```
+
+## Train and test
+
+1. Train
+
+**Training visualization**: By following the tutorial of [Annotation-to-deployment workflow for custom dataset](https://mmyolo.readthedocs.io/en/dev/recommended_topics/labeling_to_deployment_tutorials.html#id11), this example uses [wandb](https://wandb.ai/site) to visulize training.
+
+**Debug tricks**: During the process of debugging code, sometimes it is necessary to train for several epochs, such as debugging the validation process or checking whether the checkpoint saving meets expectations. For datasets inherited from `BaseDataset` (such as `YOLOv5CocoDataset` in this example),  setting `indices` in the `dataset` field can specify the number of samples per epoch to reduce the iteration time.
+
+```python
+train_dataloader = dict(
+    batch_size=train_batch_size_per_gpu,
+    num_workers=train_num_workers,
+    dataset=dict(
+        _delete_=True,
+        type='RepeatDataset',
+        times=1,
+        dataset=dict(
+            type=_base_.dataset_type,
+            indices=200,  # set indices=200,represent every epoch only iterator 200 samples
+            data_root=data_root,
+            metainfo=metainfo,
+            ann_file=train_ann_file,
+            data_prefix=dict(img=train_data_prefix),
+            filter_cfg=dict(filter_empty_gt=False, min_size=32),
+            pipeline=_base_.train_pipeline)))
+```
+
+**Start training**:
+
+```shell
+python tools/train.py projects/misc/ionogram_detection/yolov5/yolov5_s-v61_fast_1xb96-100e_ionogram.py
+```
+
+2. Test
+
+Specify the path of the config file and the model to start the test:
+
+```shell
+python tools/test.py projects/misc/ionogram_detection/yolov5/yolov5_s-v61_fast_1xb96-100e_ionogram.py \
+                     work_dirs/yolov5_s-v61_fast_1xb96-100e_ionogram/xxx
+```
+
+## Experiments and results
+
+### Choose a suitable batch size
+
+- Often, the batch size governs the training speed, and the ideal batch size will be the largest batch size supported by the available hardware.
+- If the video memory is not yet fully utilized, doubling the batch size should result in a corresponding doubling (or close to doubling) of the training throughput. This is equivalent to maintaining a constant (or nearly constant) time per step as the batch size increases.
+- Automatic Mixed Precision (AMP) is a technique to accelerate the training with minimal loss in accuracy. To enable AMP training, add `--amp` to the end of the training command.
+
+Hardware information:
+
+- GPU:V100 with 32GB memory
+- CPU:10-core CPU with 40GB memory
+
+Results:
+
+| Model    | Epoch(best) | AMP   | Batchsize | Num workers | Memory Allocated | Training Time | Val mAP |
+| -------- | ----------- | ----- | --------- | ----------- | ---------------- | ------------- | ------- |
+| YOLOv5-s | 100(82)     | False | 32        | 6           | 35.07%           | 54 min        | 0.575   |
+| YOLOv5-s | 100(96)     | True  | 32        | 6           | 24.93%           | 49 min        | 0.578   |
+| YOLOv5-s | 100(100)    | False | 96        | 6           | 96.64%           | 48 min        | 0.571   |
+| YOLOv5-s | 100(100)    | True  | 96        | 6           | 54.66%           | **37** min    | 0.575   |
+| YOLOv5-s | 100(90)     | True  | 144       | 6           | 77.06%           | 39 min        | 0.573   |
+| YOLOv5-s | 200(148)    | True  | 96        | 6           | 54.66%           | 72 min        | 0.575   |
+| YOLOv5-s | 200(188)    | True  | 96        | **8**       | 54.66%           | 67 min        | 0.576   |
+
+<div align=center>
+<img width="60%" src="https://user-images.githubusercontent.com/67947949/223635966-948c8424-1ba8-4df0-92d7-079029dc1231.png">
+
+The proportion of data loading time to the total time of each step.
+
+</div>
+
+Based on the results above, we can conclude that
+
+- AMP has little impact on the accuracy of the model, but can significantly reduce memory usage while training.
+- Increasing batch size by three times does not reduce the training time by a corresponding factor of three. According to the `data_time` recorded during training, the larger the batch size, the larger the `data_time`, indicating that data loading has become the bottleneck limiting the training speed. Increasing `num_workers`, the number of processes used to load data, can accelerate the training speed.
+
+### Ablation studies
+
+In order to obtain a training pipeline applicable to the dataset, the following ablation studies with the YOLOv5-s model as an example are performed.
+
+#### Data augmentation
+
+| Aug Method | [config](/projects/misc/ionogram_detection/yolov5/yolov5_s-v61_fast_1xb96-100e_ionogram_aug0.py) | [config](/projects/misc/ionogram_detection/yolov5/yolov5_s-v61_fast_1xb32-100e_ionogram_mosaic.py) | [config](/projects/misc/ionogram_detection/yolov5/yolov5_s-v61_fast_1xb96-100e_ionogram_mosaic_affine.py) | [config](/projects/misc/ionogram_detection/yolov5/yolov5_s-v61_fast_1xb96-100e_ionogram_mosaic_affine_albu_hsv.py) | [config](/projects/misc/ionogram_detection/yolov5/yolov5_s-v61_fast_1xb96-100e_ionogram.py) |
+| ---------- | ------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------- |
+| Mosaic     |                                                                                                  | √                                                                                                  | √                                                                                                         | √                                                                                                                  | √                                                                                           |
+| Affine     |                                                                                                  |                                                                                                    | √                                                                                                         | √                                                                                                                  | √                                                                                           |
+| Albu       |                                                                                                  |                                                                                                    |                                                                                                           | √                                                                                                                  | √                                                                                           |
+| HSV        |                                                                                                  |                                                                                                    |                                                                                                           | √                                                                                                                  | √                                                                                           |
+| Flip       |                                                                                                  |                                                                                                    |                                                                                                           |                                                                                                                    | √                                                                                           |
+| Val mAP    | 0.507                                                                                            | 0.550                                                                                              | 0.572                                                                                                     | 0.567                                                                                                              | 0.575                                                                                       |
+
+The results indicate that mosaic augmentation and random affine transformation can significantly improve the performance on the validation set.
+
+#### Using pre-trained models
+
+If you prefer not to use pre-trained weights, you can simply set `load_from = None` in the config file. For experiments that do not use pre-trained weights, it is recommended to increase the base learning rate by a factor of four and extend the number of training epochs to 200 to ensure adequate model training.
+
+| Model    | Epoch(best) | FLOPs(G) | Params(M) | Pretrain | Val mAP | Config                                                                                           |
+| -------- | ----------- | -------- | --------- | -------- | ------- | ------------------------------------------------------------------------------------------------ |
+| YOLOv5-s | 100(82)     | 7.95     | 7.04      | Coco     | 0.575   | [config](/projects/misc/ionogram_detection/yolov5/yolov5_s-v61_fast_1xb96-100e_ionogram.py)      |
+| YOLOv5-s | 200(145)    | 7.95     | 7.04      | None     | 0.565   | [config](/projects/misc/ionogram_detection/yolov5/yolov5_s-v61_fast_1xb96-200e_ionogram_pre0.py) |
+| YOLOv6-s | 100(54)     | 24.2     | 18.84     | Coco     | 0.584   | [config](/projects/misc/ionogram_detection/yolov6/yolov6_s_fast_1xb32-100e_ionogram.py)          |
+| YOLOv6-s | 200(188)    | 24.2     | 18.84     | None     | 0.557   | [config](/projects/misc/ionogram_detection/yolov6/yolov6_s_fast_1xb32-200e_ionogram_pre0.py)     |
+
+<div align=center>
+<img width="60%" src="https://user-images.githubusercontent.com/67947949/223641016-9ded0d11-62b8-45f4-be5b-bd4ffae3ec21.png">
+
+Comparison of loss reduction during training
+
+</div>
+
+The loss reduction curve shows that when using pre-trained weights, the loss decreases faster. It can be seen that even using models pre-trained on natural image datasets can accelerate model convergence when fine-tuned on radar image datasets.
+
+### Benchmark for ionogram object detection
+
+| Model       | epoch(best) | FLOPs(G) | Params(M) | pretrain | val mAP | test mAP | Config                                                                                      | Log                                                                                                           |
+| ----------- | ----------- | -------- | --------- | -------- | ------- | -------- | ------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- |
+| YOLOv5-s    | 100(82)     | 7.95     | 7.04      | Coco     | 0.575   | 0.584    | [config](/projects/misc/ionogram_detection/yolov5/yolov5_s-v61_fast_1xb96-100e_ionogram.py) | [log](https://github.com/VoyagerXvoyagerx/Ionogram_detection/blob/main/logs/yolov5_s_20230105_213510.json)    |
+| YOLOv5-m    | 100(70)     | 24.05    | 20.89     | Coco     | 0.587   | 0.586    | [config](/projects/misc/ionogram_detection/yolov5/yolov5_m-v61_fast_1xb32-100e_ionogram.py) | [log](https://github.com/VoyagerXvoyagerx/Ionogram_detection/blob/main/logs/yolov5_m_20230106_004642.json)    |
+| YOLOv6-s    | 100(54)     | 24.2     | 18.84     | Coco     | 0.584   | 0.594    | [config](/projects/misc/ionogram_detection/yolov6/yolov6_s_fast_1xb32-100e_ionogram.py)     | [log](https://github.com/VoyagerXvoyagerx/Ionogram_detection/blob/main/logs/yolov6_s_20230107_003207.json)    |
+| YOLOv6-m    | 100(76)     | 37.08    | 44.42     | Coco     | 0.590   | 0.590    | [config](/projects/misc/ionogram_detection/yolov6/yolov6_m_fast_1xb32-100e_ionogram.py)     | [log](https://github.com/VoyagerXvoyagerx/Ionogram_detection/blob/main/logs/yolov6_m_20230107_201029.json)    |
+| YOLOv6-l    | 100(76)     | 71.33    | 58.47     | Coco     | 0.605   | 0.597    | [config](/projects/misc/ionogram_detection/yolov6/yolov6_l_fast_1xb32-100e_ionogram.py)     | [log](https://github.com/VoyagerXvoyagerx/Ionogram_detection/blob/main/logs/yolov6_l_20230108_005634.json)    |
+| YOLOv7-tiny | 100(78)     | 6.57     | 6.02      | Coco     | 0.549   | 0.568    | [config](/projects/misc/ionogram_detection/yolov7/yolov7_tiny_fast_1xb16-100e_ionogram.py)  | [log](https://github.com/VoyagerXvoyagerx/Ionogram_detection/blob/main/logs/yolov7_tiny_20230215_202837.json) |
+| YOLOv7-x    | 100(58)     | 94.27    | 70.85     | Coco     | 0.602   | 0.595    | [config](/projects/misc/ionogram_detection/yolov7/yolov7_x_fast_1xb16-100e_ionogram.py)     | [log](https://github.com/VoyagerXvoyagerx/Ionogram_detection/blob/main/logs/yolov7_x_20230110_165832.json)    |
+| rtmdet-tiny | 100(100)    | 8.03     | 4.88      | Coco     | 0.582   | 0.589    | [config](/projects/misc/ionogram_detection/rtmdet/rtmdet_tiny_fast_1xb32-100e_ionogram.py)  | [log](https://github.com/VoyagerXvoyagerx/Ionogram_detection/blob/main/logs/rtmdet_tiny_20230310_125440.json) |
+| rtmdet-s    | 100(92)     | 14.76    | 8.86      | Coco     | 0.588   | 0.585    | [config](/projects/misc/ionogram_detection/rtmdet/rtmdet_s_fast_1xb32-100e_ionogram.py)     | [log](https://github.com/VoyagerXvoyagerx/Ionogram_detection/blob/main/logs/rtmdet_s_20230310_163853.json)    |
diff --git a/mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/complexity_analysis.md b/mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/complexity_analysis.md
new file mode 100644
index 0000000..ae7989d
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/complexity_analysis.md
@@ -0,0 +1,120 @@
+# Model Complexity Analysis
+
+We provide a `tools/analysis_tools/get_flops.py` script to help with the complexity analysis for models of MMYOLO.
+Currently, it provides the interfaces to compute parameter, activation and flops of the given model,
+and supports printing the related information layer-by-layer in terms of network structure or table.
+
+The commands as follows:
+
+```shell
+python tools/analysis_tools/get_flops.py
+    ${CONFIG_FILE} \                           # config file path
+    [--shape ${IMAGE_SIZE}] \                  # input image size (int), default 640*640
+    [--show-arch ${ARCH_DISPLAY}] \            # print related information by network layers
+    [--not-show-table ${TABLE_DISPLAY}] \      # print related information by table
+    [--cfg-options ${CFG_OPTIONS}]             # config file option
+# [] stands for optional parameter, do not type [] when actually entering the command line
+```
+
+Let's take the `rtmdet_s_syncbn_fast_8xb32-300e_coco.py` config file in RTMDet as an example to show how this script can be used:
+
+## Usage Example 1: Print Flops, Parameters and related information by table
+
+```shell
+python tools/analysis_tools/get_flops.py  configs/rtmdet/rtmdet_s_syncbn_fast_8xb32-300e_coco.py
+```
+
+Output:
+
+```python
+==============================
+Input shape: torch.Size([640, 640])
+Model Flops: 14.835G
+Model Parameters: 8.887M
+==============================
+```
+
+| module                            | #parameters or shape | #flops  | #activations |
+| :-------------------------------- | :------------------- | :------ | :----------: |
+| model                             | 8.887M               | 14.835G |   35.676M    |
+| backbone                          | 4.378M               | 5.416G  |   22.529M    |
+| backbone.stem                     | 7.472K               | 0.765G  |    6.554M    |
+| backbone.stem.0                   | 0.464K               | 47.514M |    1.638M    |
+| backbone.stem.1                   | 2.336K               | 0.239G  |    1.638M    |
+| backbone.stem.2                   | 4.672K               | 0.478G  |    3.277M    |
+| backbone.stage1                   | 42.4K                | 0.981G  |    7.373M    |
+| backbone.stage1.0                 | 18.56K               | 0.475G  |    1.638M    |
+| backbone.stage1.1                 | 23.84K               | 0.505G  |    5.734M    |
+| backbone.stage2                   | 0.21M                | 1.237G  |    4.915M    |
+| backbone.stage2.0                 | 73.984K              | 0.473G  |    0.819M    |
+| backbone.stage2.1                 | 0.136M               | 0.764G  |    4.096M    |
+| backbone.stage3                   | 0.829M               | 1.221G  |    2.458M    |
+| backbone.stage3.0                 | 0.295M               | 0.473G  |    0.41M     |
+| backbone.stage3.1                 | 0.534M               | 0.749G  |    2.048M    |
+| backbone.stage4                   | 3.29M                | 1.211G  |    1.229M    |
+| backbone.stage4.0                 | 1.181M               | 0.472G  |    0.205M    |
+| backbone.stage4.1                 | 0.657M               | 0.263G  |    0.307M    |
+| backbone.stage4.2                 | 1.452M               | 0.476G  |    0.717M    |
+| neck                              | 3.883M               | 4.366G  |    8.141M    |
+| neck.reduce_layers.2              | 0.132M               | 52.634M |    0.102M    |
+| neck.reduce_layers.2.conv         | 0.131M               | 52.429M |    0.102M    |
+| neck.reduce_layers.2.bn           | 0.512K               | 0.205M  |      0       |
+| neck.top_down_layers              | 0.491M               | 1.23G   |    4.506M    |
+| neck.top_down_layers.0            | 0.398M               | 0.638G  |    1.638M    |
+| neck.top_down_layers.1            | 92.608K              | 0.593G  |    2.867M    |
+| neck.downsample_layers            | 0.738M               | 0.472G  |    0.307M    |
+| neck.downsample_layers.0          | 0.148M               | 0.236G  |    0.205M    |
+| neck.downsample_layers.1          | 0.59M                | 0.236G  |    0.102M    |
+| neck.bottom_up_layers             | 1.49M                | 0.956G  |    2.15M     |
+| neck.bottom_up_layers.0           | 0.3M                 | 0.48G   |    1.434M    |
+| neck.bottom_up_layers.1           | 1.19M                | 0.476G  |    0.717M    |
+| neck.out_layers                   | 1.033M               | 1.654G  |    1.075M    |
+| neck.out_layers.0                 | 0.148M               | 0.945G  |    0.819M    |
+| neck.out_layers.1                 | 0.295M               | 0.472G  |    0.205M    |
+| neck.out_layers.2                 | 0.59M                | 0.236G  |    51.2K     |
+| neck.upsample_layers              |                      | 1.229M  |      0       |
+| neck.upsample_layers.0            |                      | 0.41M   |      0       |
+| neck.upsample_layers.1            |                      | 0.819M  |      0       |
+| bbox_head.head_module             | 0.625M               | 5.053G  |    5.006M    |
+| bbox_head.head_module.cls_convs   | 0.296M               | 2.482G  |    2.15M     |
+| bbox_head.head_module.cls_convs.0 | 0.295M               | 2.481G  |    2.15M     |
+| bbox_head.head_module.cls_convs.1 | 0.512K               | 0.819M  |      0       |
+| bbox_head.head_module.cls_convs.2 | 0.512K               | 0.205M  |      0       |
+| bbox_head.head_module.reg_convs   | 0.296M               | 2.482G  |    2.15M     |
+| bbox_head.head_module.reg_convs.0 | 0.295M               | 2.481G  |    2.15M     |
+| bbox_head.head_module.reg_convs.1 | 0.512K               | 0.819M  |      0       |
+| bbox_head.head_module.reg_convs.2 | 0.512K               | 0.205M  |      0       |
+| bbox_head.head_module.rtm_cls     | 30.96K               | 86.016M |    0.672M    |
+| bbox_head.head_module.rtm_cls.0   | 10.32K               | 65.536M |    0.512M    |
+| bbox_head.head_module.rtm_cls.1   | 10.32K               | 16.384M |    0.128M    |
+| bbox_head.head_module.rtm_cls.2   | 10.32K               | 4.096M  |     32K      |
+| bbox_head.head_module.rtm_reg     | 1.548K               | 4.301M  |    33.6K     |
+| bbox_head.head_module.rtm_reg.0   | 0.516K               | 3.277M  |    25.6K     |
+| bbox_head.head_module.rtm_reg.1   | 0.516K               | 0.819M  |     6.4K     |
+| bbox_head.head_module.rtm_reg.2   | 0.516K               | 0.205M  |     1.6K     |
+
+## Usage Example 2: Print related information by network layers
+
+```shell
+python tools/analysis_tools/get_flops.py  configs/rtmdet/rtmdet_s_syncbn_fast_8xb32-300e_coco.py --show-arch
+```
+
+Due to the complex structure of RTMDet, the output is long.
+The following shows only the output from bbox_head.head_module.rtm_reg section:
+
+```python
+(rtm_reg): ModuleList(
+        #params: 1.55K, #flops: 4.3M, #acts: 33.6K
+        (0): Conv2d(
+          128, 4, kernel_size=(1, 1), stride=(1, 1)
+          #params: 0.52K, #flops: 3.28M, #acts: 25.6K
+        )
+        (1): Conv2d(
+          128, 4, kernel_size=(1, 1), stride=(1, 1)
+          #params: 0.52K, #flops: 0.82M, #acts: 6.4K
+        )
+        (2): Conv2d(
+          128, 4, kernel_size=(1, 1), stride=(1, 1)
+          #params: 0.52K, #flops: 0.2M, #acts: 1.6K
+        )
+```
diff --git a/mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/contributing.md b/mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/contributing.md
new file mode 100644
index 0000000..9efb887
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/contributing.md
@@ -0,0 +1,314 @@
+# Contributing to OpenMMLab
+
+Welcome to the MMYOLO community, we are committed to building a cutting-edge computer vision foundational library, and all kinds of contributions are welcomed, including but not limited to
+
+**Fix bug**
+
+You can directly post a Pull Request to fix typos in code or documents
+
+The steps to fix the bug of code implementation are as follows.
+
+1. If the modification involves significant changes, you should create an issue first and describe the error information and how to trigger the bug. Other developers will discuss it with you and propose a proper solution.
+
+2. Posting a pull request after fixing the bug and adding the corresponding unit test.
+
+**New Feature or Enhancement**
+
+1. If the modification involves significant changes, you should create an issue to discuss with our developers to propose a proper design.
+2. Post a Pull Request after implementing the new feature or enhancement and add the corresponding unit test.
+
+**Document**
+
+You can directly post a pull request to fix documents. If you want to add a document, you should first create an issue to check if it is reasonable.
+
+## Preparation
+
+The commands for processing pull requests are implemented using Git, and this chapter details `Git Configuration` and `associated GitHub`.
+
+### 1. Git Configuration
+
+First, make sure you have Git installed on your computer. For Linux systems and macOS systems, Git is generally installed by default. If it is not installed, it can be downloaded at [Git-Downloads](https://git-scm.com/downloads).
+
+```shell
+# view the Git version
+git --version
+```
+
+Second, check your `Git Config`
+
+```shell
+# view the Git config
+git config --global --list
+```
+
+If `user.name` and `user.email` are empty, run the command.
+
+```shell
+git config --global user.name "Change your username here"
+git config --global user.email "Change your useremail here"
+```
+
+Finally, run the command in `git bash` or `terminal` to generate the key file. After the generation is successful, a `.ssh` file will appear in the user directory, and `id_rsa.pub` is the public key file.
+
+```shell
+# useremail is GitHub's email address
+ssh-keygen -t rsa -C "useremail"
+```
+
+### 2. Associated GitHub
+
+First, open `id_rsa.pub` and copy the entire contents.
+
+Second, log in to your GitHub account to set it up.
+
+<img src="https://user-images.githubusercontent.com/90811472/221778382-a075167d-b028-4f68-a1c7-49a8f6f3d97b.png" width="1200">
+
+Click `New SSH key` to add a new SSH keys, and paste the copied content into Key.
+
+<img src="https://user-images.githubusercontent.com/90811472/221577720-af5536b3-47ba-48bc-adcc-c2b83f22081d.png" width="1200">
+
+Finally, verify that SSH matches the GitHub account by running the command in `git bash` or `terminal`. If it matches, enter `yes` to succeed.
+
+```shell
+ssh -T git@github.com
+```
+
+<img src="https://user-images.githubusercontent.com/90811472/221573637-30e5d04d-955c-4c8f-86ab-ed6608644fc8.png" width="1200">
+
+## Pull Request Workflow
+
+If you're not familiar with Pull Request, don't worry! The following guidance will tell you how to create a Pull Request step by step. If you want to dive into the development mode of Pull Request, you can refer to the [official documents](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/about-pull-requests)
+
+### 1. Fork and clone
+
+If you are posting a pull request for the first time, you should fork the OpenMMLab repositories by clicking the **Fork** button in the top right corner of the GitHub page, and the forked repositories will appear under your GitHub profile.
+
+<img src="https://user-images.githubusercontent.com/27466624/204301143-2d262d2c-28b3-4060-8576-21d9f4237f2f.png" width="1200">
+
+Then, you can clone the repositories to local:
+
+```shell
+git clone git@github.com:{username}/mmyolo.git
+```
+
+After that, you should get into the project folder and add official repository as the upstream repository.
+
+```bash
+cd mmyolo
+git remote add upstream git@github.com:open-mmlab/mmyolo
+```
+
+Check whether the remote repository has been added successfully by `git remote -v`
+
+```bash
+origin	git@github.com:{username}/mmyolo.git (fetch)
+origin	git@github.com:{username}/mmyolo.git (push)
+upstream	git@github.com:open-mmlab/mmyolo (fetch)
+upstream	git@github.com:open-mmlab/mmyolo (push)
+```
+
+```{note}
+Here's a brief introduction to the origin and upstream. When we use "git clone", we create an "origin" remote by default, which points to the repository cloned from. As for "upstream", we add it ourselves to point to the target repository. Of course, if you don't like the name "upstream", you could name it as you wish. Usually, we'll push the code to "origin". If the pushed code conflicts with the latest code in official("upstream"), we should pull the latest code from upstream to resolve the conflicts, and then push to "origin" again. The posted Pull Request will be updated automatically.
+```
+
+### 2. Configure pre-commit
+
+You should configure [pre-commit](https://pre-commit.com/#intro) in the local development environment to make sure the code style matches that of OpenMMLab. **Note**: The following code should be executed under the MMYOLO directory.
+
+```shell
+pip install -U pre-commit
+pre-commit install
+```
+
+Check that pre-commit is configured successfully, and install the hooks defined in `.pre-commit-config.yaml`.
+
+```shell
+pre-commit run --all-files
+```
+
+<img src="https://user-images.githubusercontent.com/57566630/173660750-3df20a63-cb66-4d33-a986-1f643f1d8aaf.png" width="1200">
+
+<img src="https://user-images.githubusercontent.com/57566630/202368856-0465a90d-8fce-4345-918e-67b8b9c82614.png" width="1200">
+
+```{note}
+Chinese users may fail to download the pre-commit hooks due to the network issue. In this case, you could download these hooks from gitee by setting the .pre-commit-config-zh-cn.yaml
+
+pre-commit install -c .pre-commit-config-zh-cn.yaml
+pre-commit run --all-files -c .pre-commit-config-zh-cn.yaml
+```
+
+If the installation process is interrupted, you can repeatedly run `pre-commit run ... ` to continue the installation.
+
+If the code does not conform to the code style specification, pre-commit will raise a warning and  fixes some of the errors automatically.
+
+<img src="https://user-images.githubusercontent.com/57566630/202369176-67642454-0025-4023-a095-263529107aa3.png" width="1200">
+
+If we want to commit our code bypassing the pre-commit hook, we can use the `--no-verify` option(**only for temporarily commit**).
+
+```shell
+git commit -m "xxx" --no-verify
+```
+
+### 3. Create a development branch
+
+After configuring the pre-commit, we should create a branch based on the dev branch to develop the new feature or fix the bug. The proposed branch name is `username/pr_name`
+
+```shell
+git checkout -b yhc/refactor_contributing_doc
+```
+
+In subsequent development, if the dev branch of the local repository is behind the dev branch of "upstream", we need to pull the upstream for synchronization, and then execute the above command:
+
+```shell
+git pull upstream dev
+```
+
+### 4. Commit the code and pass the unit test
+
+- MMYOLO introduces mypy to do static type checking to increase the robustness of the code. Therefore, we need to add Type Hints to our code and pass the mypy check. If you are not familiar with Type Hints, you can refer to [this tutorial](https://docs.python.org/3/library/typing.html).
+
+- The committed code should pass through the unit test
+
+  ```shell
+  # Pass all unit tests
+  pytest tests
+
+  # Pass the unit test of yolov5_coco dataset
+  pytest tests/test_datasets/test_yolov5_coco.py
+  ```
+
+  If the unit test fails for lack of dependencies, you can install the dependencies referring to the [guidance](#unit-test)
+
+- If the documents are modified/added, we should check the rendering result referring to [guidance](#document-rendering)
+
+### 5. Push the code to remote
+
+We could push the local commits to remote after passing through the check of unit test and pre-commit. You can associate the local branch with remote branch by adding `-u` option.
+
+```shell
+git push -u origin {branch_name}
+```
+
+This will allow you to use the `git push` command to push code directly next time, without having to specify a branch or the remote repository.
+
+### 6. Create a Pull Request
+
+(1) Create a pull request in GitHub's Pull request interface
+
+<img src="https://user-images.githubusercontent.com/27466624/204302289-d1e54901-8f27-4934-923f-fda800ff9851.png" width="1200">
+
+(2) Modify the PR description according to the guidelines so that other developers can better understand your changes.
+
+```{note}
+The *base* branch should be modified to *dev* branch.
+```
+
+<img src="https://user-images.githubusercontent.com/62822224/216594960-a2292b9d-2b7c-4861-b4c5-362a9458b194.png" width="1200">
+
+Find more details about Pull Request description in [pull request guidelines](#pr-specs).
+
+**note**
+
+(a) The Pull Request description should contain the reason for the change, the content of the change, and the impact of the change, and be associated with the relevant Issue (see [documentation](https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue))
+
+(b) If it is your first contribution, please sign the CLA
+
+<img src="https://user-images.githubusercontent.com/57566630/167307569-a794b967-6e28-4eac-a942-00deb657815f.png" width="1200">
+
+(c) Check whether the Pull Request pass through the CI
+
+<img src="https://user-images.githubusercontent.com/27466624/204303753-900de590-ddd1-4be2-8e43-8dc09f127f5d.png" width="1200">
+
+MMYOLO will run unit test for the posted Pull Request on Linux, based on different versions of Python, and PyTorch to make sure the code is correct. We can see the specific test information by clicking `Details` in the above image so that we can modify the code.
+
+(3) If the Pull Request passes the CI, then you can wait for the review from other developers. You'll modify the code based on the reviewer's comments, and repeat the steps [4](#4-commit-the-code-and-pass-the-unit-test)-[5](#5-push-the-code-to-remote) until all reviewers approve it. Then, we will merge it ASAP.
+
+<img src="https://user-images.githubusercontent.com/57566630/202145400-cc2cd8c4-10b0-472f-ba37-07e6f50acc67.png" width="1200">
+
+### 7. Resolve conflicts
+
+If your local branch conflicts with the latest dev branch of "upstream", you'll need to resolove them. There are two ways to do this:
+
+```shell
+git fetch --all --prune
+git rebase upstream/dev
+```
+
+or
+
+```shell
+git fetch --all --prune
+git merge upstream/dev
+```
+
+If you are very good at handling conflicts, then you can use rebase to resolve conflicts, as this will keep your commit logs tidy. If you are unfamiliar with `rebase`, you can use `merge` to resolve conflicts.
+
+## Guidance
+
+### Unit test
+
+We should also make sure the committed code will not decrease the coverage of unit test, we could run the following command to check the coverage of unit test:
+
+```shell
+python -m coverage run -m pytest /path/to/test_file
+python -m coverage html
+# check file in htmlcov/index.html
+```
+
+### Document rendering
+
+If the documents are modified/added, we should check the rendering result. We could install the dependencies and run the following command to render the documents and check the results:
+
+```shell
+pip install -r requirements/docs.txt
+cd docs/zh_cn/
+# or docs/en
+make html
+# check file in ./docs/zh_cn/_build/html/index.html
+```
+
+## Code style
+
+### Python
+
+We adopt [PEP8](https://www.python.org/dev/peps/pep-0008/) as the preferred code style.
+
+We use the following tools for linting and formatting:
+
+- [flake8](https://github.com/PyCQA/flake8): A wrapper around some linter tools.
+- [isort](https://github.com/timothycrosley/isort): A Python utility to sort imports.
+- [yapf](https://github.com/google/yapf): A formatter for Python files.
+- [codespell](https://github.com/codespell-project/codespell): A Python utility to fix common misspellings in text files.
+- [mdformat](https://github.com/executablebooks/mdformat): Mdformat is an opinionated Markdown formatter that can be used to enforce a consistent style in Markdown files.
+- [docformatter](https://github.com/myint/docformatter): A formatter to format docstring.
+
+Style configurations of yapf and isort can be found in [setup.cfg](../../../setup.cfg).
+
+We use [pre-commit hook](https://pre-commit.com/) that checks and formats for `flake8`, `yapf`, `isort`, `trailing whitespaces`, `markdown files`,
+fixes `end-of-files`, `double-quoted-strings`, `python-encoding-pragma`, `mixed-line-ending`, sorts `requirments.txt` automatically on every commit.
+The config for a pre-commit hook is stored in [.pre-commit-config](../../../.pre-commit-config.yaml).
+
+### C++ and CUDA
+
+We follow the [Google C++ Style Guide](https://google.github.io/styleguide/cppguide.html).
+
+## PR Specs
+
+1. Use [pre-commit](https://pre-commit.com) hook to avoid issues of code style
+
+2. One short-time branch should be matched with only one PR
+
+3. Accomplish a detailed change in one PR. Avoid large PR
+
+   - Bad: Support Faster R-CNN
+   - Acceptable: Add a box head to Faster R-CNN
+   - Good: Add a parameter to box head to support custom conv-layer number
+
+4. Provide clear and significant commit message
+
+5. Provide clear and meaningful PR description
+
+   - Task name should be clarified in title. The general format is: \[Prefix\] Short description of the PR (Suffix)
+   - Prefix: add new feature \[Feature\], fix bug \[Fix\], related to documents \[Docs\], in developing \[WIP\] (which will not be reviewed temporarily)
+   - Introduce main changes, results and influences on other modules in short description
+   - Associate related issues and pull requests with a milestone
diff --git a/mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/dataset_preparation.md b/mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/dataset_preparation.md
new file mode 100644
index 0000000..af670d8
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/dataset_preparation.md
@@ -0,0 +1,145 @@
+# Dataset preparation and description
+
+## DOTA Dataset
+
+### Download dataset
+
+The DOTA dataset can be downloaded from [DOTA](https://captain-whu.github.io/DOTA/dataset.html)
+or [OpenDataLab](https://opendatalab.org.cn/DOTA_V1.0).
+
+We recommend using [OpenDataLab](https://opendatalab.org.cn/DOTA_V1.0) to download the dataset, as the folder structure has already been arranged as needed and can be directly extracted without the need to adjust the folder structure.
+
+Please unzip the file and place it in the following structure.
+
+```none
+${DATA_ROOT}
+├── train
+│   ├── images
+│   │   ├── P0000.png
+│   │   ├── ...
+│   ├── labelTxt-v1.0
+│   │   ├── labelTxt
+│   │   │   ├── P0000.txt
+│   │   │   ├── ...
+│   │   ├── trainset_reclabelTxt
+│   │   │   ├── P0000.txt
+│   │   │   ├── ...
+├── val
+│   ├── images
+│   │   ├── P0003.png
+│   │   ├── ...
+│   ├── labelTxt-v1.0
+│   │   ├── labelTxt
+│   │   │   ├── P0003.txt
+│   │   │   ├── ...
+│   │   ├── valset_reclabelTxt
+│   │   │   ├── P0003.txt
+│   │   │   ├── ...
+├── test
+│   ├── images
+│   │   ├── P0006.png
+│   │   ├── ...
+
+```
+
+The folder ending with reclabelTxt stores the labels for the horizontal boxes and is not used when slicing.
+
+### Split DOTA dataset
+
+Script `tools/dataset_converters/dota/dota_split.py` can split and prepare DOTA dataset.
+
+```shell
+python tools/dataset_converters/dota/dota_split.py \
+    [--splt-config ${SPLIT_CONFIG}] \
+    [--data-root ${DATA_ROOT}] \
+    [--out-dir ${OUT_DIR}] \
+    [--ann-subdir ${ANN_SUBDIR}] \
+    [--phase ${DATASET_PHASE}] \
+    [--nproc ${NPROC}] \
+    [--save-ext ${SAVE_EXT}] \
+    [--overwrite]
+```
+
+shapely is required, please install shapely first by `pip install shapely`.
+
+**Description of all parameters**:
+
+- `--split-config` : The split config for image slicing.
+- `--data-root`: Root dir of DOTA dataset.
+- `--out-dir`: Output dir for split result.
+- `--ann-subdir`: The subdir name for annotation. Defaults to `labelTxt-v1.0`.
+- `--phase`: Phase of the data set to be prepared. Defaults to `trainval test`
+- `--nproc`: Number of processes. Defaults to 8.
+- `--save-ext`: Extension of the saved image. Defaults to `png`
+- `--overwrite`: Whether to allow overwrite if annotation folder exist.
+
+Based on the configuration in the DOTA paper, we provide two commonly used split config.
+
+- `./split_config/single_scale.json` means single-scale split.
+- `./split_config/multi_scale.json` means multi-scale split.
+
+DOTA dataset usually uses the trainval set for training and the test set for online evaluation, since most papers
+provide the results of online evaluation. If you want to evaluate the model performance locally firstly, please split
+the train set and val set.
+
+Examples:
+
+Split DOTA trainval set and test set with single scale.
+
+```shell
+python tools/dataset_converters/dota/dota_split.py
+    --split-config 'tools/dataset_converters/dota/split_config/single_scale.json'
+    --data-root ${DATA_ROOT} \
+    --out-dir ${OUT_DIR}
+```
+
+If you want to split DOTA-v1.5 dataset, which have different annotation dir 'labelTxt-v1.5'.
+
+```shell
+python tools/dataset_converters/dota/dota_split.py
+    --split-config 'tools/dataset_converters/dota/split_config/single_scale.json'
+    --data-root ${DATA_ROOT} \
+    --out-dir ${OUT_DIR} \
+    --ann-subdir 'labelTxt-v1.5'
+```
+
+If you want to split DOTA train and val set with single scale.
+
+```shell
+python tools/dataset_converters/dota/dota_split.py
+    --split-config 'tools/dataset_converters/dota/split_config/single_scale.json'
+    --data-root ${DATA_ROOT} \
+    --phase train val \
+    --out-dir ${OUT_DIR}
+```
+
+For multi scale split:
+
+```shell
+python tools/dataset_converters/dota/dota_split.py
+    --split-config 'tools/dataset_converters/dota/split_config/multi_scale.json'
+    --data-root ${DATA_ROOT} \
+    --out-dir ${OUT_DIR}
+```
+
+The new data structure is as follows:
+
+```none
+${OUT_DIR}
+├── trainval
+│   ├── images
+│   │   ├── P0000__1024__0___0.png
+│   │   ├── ...
+│   ├── annfiles
+│   │   ├── P0000__1024__0___0.txt
+│   │   ├── ...
+├── test
+│   ├── images
+│   │   ├── P0006__1024__0___0.png
+│   │   ├── ...
+│   ├── annfiles
+│   │   ├── P0006__1024__0___0.txt
+│   │   ├── ...
+```
+
+Then change `data_root` to ${OUT_DIR}.
diff --git a/mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/deploy/easydeploy_guide.md b/mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/deploy/easydeploy_guide.md
new file mode 100644
index 0000000..46fab86
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/deploy/easydeploy_guide.md
@@ -0,0 +1 @@
+# EasyDeploy Deployment
diff --git a/mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/deploy/index.rst b/mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/deploy/index.rst
new file mode 100644
index 0000000..f21f353
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/deploy/index.rst
@@ -0,0 +1,16 @@
+MMDeploy deployment tutorial
+********************************
+
+.. toctree::
+   :maxdepth: 1
+
+   mmdeploy_guide.md
+   mmdeploy_yolov5.md
+
+EasyDeploy deployment tutorial
+************************************
+
+.. toctree::
+   :maxdepth: 1
+
+   easydeploy_guide.md
diff --git a/mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/deploy/mmdeploy_guide.md b/mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/deploy/mmdeploy_guide.md
new file mode 100644
index 0000000..096d39f
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/deploy/mmdeploy_guide.md
@@ -0,0 +1,414 @@
+# Basic Deployment Guide
+
+## Introduction of MMDeploy
+
+MMDeploy is an open-source deep learning model deployment toolset. It is a part of the [OpenMMLab](https://openmmlab.com/) project, and provides **a unified experience of exporting different models** to various platforms and devices of the OpenMMLab series libraries. Using MMDeploy, developers can easily export the specific compiled SDK they need from the training result, which saves a lot of effort.
+
+More detailed introduction and guides can be found [here](https://mmdeploy.readthedocs.io/en/latest/get_started.html)
+
+## Supported Algorithms
+
+Currently our deployment kit supports on the following models and backends:
+
+| Model  | Task            | OnnxRuntime | TensorRT |                              Model config                               |
+| :----- | :-------------- | :---------: | :------: | :---------------------------------------------------------------------: |
+| YOLOv5 | ObjectDetection |      Y      |    Y     | [config](https://github.com/open-mmlab/mmyolo/tree/main/configs/yolov5) |
+| YOLOv6 | ObjectDetection |      Y      |    Y     | [config](https://github.com/open-mmlab/mmyolo/tree/main/configs/yolov6) |
+| YOLOX  | ObjectDetection |      Y      |    Y     | [config](https://github.com/open-mmlab/mmyolo/tree/main/configs/yolox)  |
+| RTMDet | ObjectDetection |      Y      |    Y     | [config](https://github.com/open-mmlab/mmyolo/tree/main/configs/rtmdet) |
+
+Note: ncnn and other inference backends support are coming soon.
+
+## Installation
+
+Please install mmdeploy by following [this](https://mmdeploy.readthedocs.io/en/latest/get_started.html) guide.
+
+```{note}
+If you install mmdeploy prebuilt package, please also clone its repository by 'git clone https://github.com/open-mmlab/mmdeploy.git --depth=1' to get the 'tools' file for deployment.
+```
+
+## How to Write Config for MMYOLO
+
+All config files related to the deployment are located at [`configs/deploy`](../../../configs/deploy/).
+
+You only need to change the relative data processing part in the model config file to support either static or dynamic input for your model. Besides, MMDeploy integrates the post-processing parts as customized ops, you can modify the strategy in `post_processing` parameter in `codebase_config`.
+
+Here is the detail description:
+
+```python
+codebase_config = dict(
+    type='mmyolo',
+    task='ObjectDetection',
+    model_type='end2end',
+    post_processing=dict(
+        score_threshold=0.05,
+        confidence_threshold=0.005,
+        iou_threshold=0.5,
+        max_output_boxes_per_class=200,
+        pre_top_k=5000,
+        keep_top_k=100,
+        background_label_id=-1),
+    module=['mmyolo.deploy'])
+```
+
+- `score_threshold`: set the score threshold to filter candidate bboxes before `nms`
+- `confidence_threshold`: set the confidence threshold to filter candidate bboxes before `nms`
+- `iou_threshold`: set the `iou` threshold for removing duplicates in `nms`
+- `max_output_boxes_per_class`: set the maximum number of bboxes for each class
+- `pre_top_k`: set the number of fixedcandidate bboxes before `nms`, sorted by scores
+- `keep_top_k`: set the number of output candidate bboxs after `nms`
+- `background_label_id`: set to `-1` as MMYOLO has no background class information
+
+### Configuration for Static Inputs
+
+#### 1. Model Config
+
+Taking `YOLOv5` of MMYOLO as an example, here are the details:
+
+```python
+_base_ = '../../yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py'
+
+test_pipeline = [
+    dict(type='LoadImageFromFile', backend_args=_base_.backend_args),
+    dict(
+        type='LetterResize',
+        scale=_base_.img_scale,
+        allow_scale_up=False,
+        use_mini_pad=False,
+    ),
+    dict(type='LoadAnnotations', with_bbox=True, _scope_='mmdet'),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                   'scale_factor', 'pad_param'))
+]
+
+test_dataloader = dict(
+    dataset=dict(pipeline=test_pipeline, batch_shapes_cfg=None))
+```
+
+`_base_ = '../../yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py'` inherits the model config in the training stage.
+
+`test_pipeline` adds the data processing piple for the deployment, `LetterResize` controls the size of the input images and the input for the converted model
+
+`test_dataloader` adds the dataloader config for the deployment, `batch_shapes_cfg` decides whether to use the `batch_shapes` strategy. More details can be found at [yolov5 configs](../user_guides/config.md)
+
+#### 2. Deployment Config
+
+Here we still use the `YOLOv5` in MMYOLO as the example. We can use [`detection_onnxruntime_static.py`](https://github.com/open-mmlab/mmyolo/blob/main/configs/deploy/detection_onnxruntime_static.py) as the config to deploy `YOLOv5` to `ONNXRuntime` with static inputs.
+
+```python
+_base_ = ['./base_static.py']
+codebase_config = dict(
+    type='mmyolo',
+    task='ObjectDetection',
+    model_type='end2end',
+    post_processing=dict(
+        score_threshold=0.05,
+        confidence_threshold=0.005,
+        iou_threshold=0.5,
+        max_output_boxes_per_class=200,
+        pre_top_k=5000,
+        keep_top_k=100,
+        background_label_id=-1),
+    module=['mmyolo.deploy'])
+backend_config = dict(type='onnxruntime')
+```
+
+`backend_config` indicates the deployment backend with `type='onnxruntime'`, other information can be referred from the third section.
+
+To deploy the `YOLOv5` to `TensorRT`, please refer to the [`detection_tensorrt_static-640x640.py`](https://github.com/open-mmlab/mmyolo/blob/main/configs/deploy/detection_tensorrt_static-640x640.py) as follows.
+
+```python
+_base_ = ['./base_static.py']
+onnx_config = dict(input_shape=(640, 640))
+backend_config = dict(
+    type='tensorrt',
+    common_config=dict(fp16_mode=False, max_workspace_size=1 << 30),
+    model_inputs=[
+        dict(
+            input_shapes=dict(
+                input=dict(
+                    min_shape=[1, 3, 640, 640],
+                    opt_shape=[1, 3, 640, 640],
+                    max_shape=[1, 3, 640, 640])))
+    ])
+use_efficientnms = False
+```
+
+`backend_config` indices the backend with `type='tensorrt'`.
+
+Different from `ONNXRuntime` deployment configuration, `TensorRT` needs to specify the input image size and the parameters required to build the engine file, including:
+
+- `onnx_config` specifies the input shape as `input_shape=(640, 640)`
+- `fp16_mode=False` and `max_workspace_size=1 << 30` in `backend_config['common_config']` indicates whether to build the engine in the parameter format of `fp16`, and the maximum video memory for the current `gpu` device, respectively. The unit is in `GB`. For detailed configuration of `fp16`, please refer to the [`detection_tensorrt-fp16_static-640x640.py`](https://github.com/open-mmlab/mmyolo/blob/main/configs/deploy/detection_tensorrt-fp16_static-640x640.py)
+- The `min_shape`/`opt_shape`/`max_shape` in `backend_config['model_inputs']['input_shapes']['input']` should remain the same under static input, the default is `[1, 3, 640, 640]`.
+
+`use_efficientnms` is a new configuration introduced by the `MMYOLO` series, indicating whether to enable `Efficient NMS Plugin` to replace `TRTBatchedNMS plugin` in `MMDeploy` when exporting `onnx`.
+
+You can refer to the official [efficient NMS plugins](https://github.com/NVIDIA/TensorRT/blob/main/plugin/efficientNMSPlugin/README.md) by `TensorRT` for more details.
+
+Note: this out-of-box feature is **only available in TensorRT>=8.0**, no need to compile it by yourself.
+
+### Configuration for Dynamic Inputs
+
+#### 1. Model Config
+
+When you deploy a dynamic input model, you don't need to modify any model configuration files but the deployment configuration files.
+
+#### 2. Deployment Config
+
+To deploy the `YOLOv5` in MMYOLO to `ONNXRuntime`, please refer to the [`detection_onnxruntime_dynamic.py`](https://github.com/open-mmlab/mmyolo/blob/main/configs/deploy/detection_onnxruntime_dynamic.py).
+
+```python
+_base_ = ['./base_dynamic.py']
+codebase_config = dict(
+    type='mmyolo',
+    task='ObjectDetection',
+    model_type='end2end',
+    post_processing=dict(
+        score_threshold=0.05,
+        confidence_threshold=0.005,
+        iou_threshold=0.5,
+        max_output_boxes_per_class=200,
+        pre_top_k=5000,
+        keep_top_k=100,
+        background_label_id=-1),
+    module=['mmyolo.deploy'])
+backend_config = dict(type='onnxruntime')
+```
+
+`backend_config` indicates the backend with `type='onnxruntime'`. Other parameters stay the same as the static input section.
+
+To deploy the `YOLOv5` to `TensorRT`, please refer to the [`detection_tensorrt_dynamic-192x192-960x960.py`](https://github.com/open-mmlab/mmyolo/blob/main/configs/deploy/detection_tensorrt_dynamic-192x192-960x960.py).
+
+```python
+_base_ = ['./base_dynamic.py']
+backend_config = dict(
+    type='tensorrt',
+    common_config=dict(fp16_mode=False, max_workspace_size=1 << 30),
+    model_inputs=[
+        dict(
+            input_shapes=dict(
+                input=dict(
+                    min_shape=[1, 3, 192, 192],
+                    opt_shape=[1, 3, 640, 640],
+                    max_shape=[1, 3, 960, 960])))
+    ])
+use_efficientnms = False
+```
+
+`backend_config` indicates the backend with `type='tensorrt'`. Since the dynamic and static inputs are different in `TensorRT`, please check the details at [TensorRT dynamic input official introduction](https://docs.nvidia.com/deeplearning/tensorrt/archives/tensorrt-843/developer-guide/index.html#work_dynamic_shapes).
+
+`TensorRT` deployment requires you to specify `min_shape`, `opt_shape` , and `max_shape`. `TensorRT` limits the size of the input image between `min_shape` and `max_shape`.
+
+`min_shape` is the minimum size of the input image. `opt_shape` is the common size of the input image, inference performance is best under this size. `max_shape` is the maximum size of the input image.
+
+`use_efficientnms` configuration is the same as the `TensorRT` static input configuration in the previous section.
+
+### INT8 Quantization Support
+
+Note: Int8 quantization support will soon be released.
+
+## How to Convert Model
+
+### Usage
+
+#### Deploy with MMDeploy Tools
+
+Set the root directory of `MMDeploy` as an env parameter `MMDEPLOY_DIR` using `export MMDEPLOY_DIR=/the/root/path/of/MMDeploy` command.
+
+```shell
+python3 ${MMDEPLOY_DIR}/tools/deploy.py \
+    ${DEPLOY_CFG_PATH} \
+    ${MODEL_CFG_PATH} \
+    ${MODEL_CHECKPOINT_PATH} \
+    ${INPUT_IMG} \
+    --test-img ${TEST_IMG} \
+    --work-dir ${WORK_DIR} \
+    --calib-dataset-cfg ${CALIB_DATA_CFG} \
+    --device ${DEVICE} \
+    --log-level INFO \
+    --show \
+    --dump-info
+```
+
+### Parameter Description
+
+- `deploy_cfg`: set the deployment config path of MMDeploy for the model, including the type of inference framework, whether quantize, whether the input shape is dynamic, etc. There may be a reference relationship between configuration files, e.g. `configs/deploy/detection_onnxruntime_static.py`
+- `model_cfg`: set the MMYOLO model config path, e.g. `configs/deploy/model/yolov5_s-deploy.py`, regardless of the path to MMDeploy
+- `checkpoint`: set the torch model path. It can start with `http/https`, more details are available in `mmengine.fileio` apis
+- `img`: set the path to the image or point cloud file used for testing during model conversion
+- `--test-img`: set the image file that used to test model. If not specified, it will be set to `None`
+- `--work-dir`: set the work directory that used to save logs and models
+- `--calib-dataset-cfg`: use for calibration only for INT8 mode. If not specified, it will be set to None and use “val” dataset in model config for calibration
+- `--device`: set the device used for model conversion. The default is `cpu`, for TensorRT used `cuda:0`
+- `--log-level`: set log level which in `'CRITICAL', 'FATAL', 'ERROR', 'WARN', 'WARNING', 'INFO', 'DEBUG', 'NOTSET'`. If not specified, it will be set to `INFO`
+- `--show`: show the result on screen or not
+- `--dump-info`: output SDK information or not
+
+#### Deploy with MMDeploy API
+
+Suppose the working directory is the root path of mmyolo. Take [YoloV5](https://github.com/open-mmlab/mmyolo/blob/main/configs/yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py) model as an example. You can download its checkpoint from [here](https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth), and then convert it to onnx model as follows:
+
+```python
+from mmdeploy.apis import torch2onnx
+from mmdeploy.backend.sdk.export_info import export2SDK
+
+img = 'demo/demo.jpg'
+work_dir = 'mmdeploy_models/mmyolo/onnx'
+save_file = 'end2end.onnx'
+deploy_cfg = 'configs/deploy/detection_onnxruntime_dynamic.py'
+model_cfg = 'configs/yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py'
+model_checkpoint = 'checkpoints/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth'
+device = 'cpu'
+
+# 1. convert model to onnx
+torch2onnx(img, work_dir, save_file, deploy_cfg, model_cfg,
+           model_checkpoint, device)
+
+# 2. extract pipeline info for inference by MMDeploy SDK
+export2SDK(deploy_cfg, model_cfg, work_dir, pth=model_checkpoint,
+           device=device)
+```
+
+## Model specification
+
+Before moving on to model inference chapter, let's know more about the converted result structure which is very important for model inference. It is saved in the directory specified with `--wodk_dir`.
+
+The converted results are saved in the working directory `mmdeploy_models/mmyolo/onnx` in the previous example. It includes:
+
+```
+mmdeploy_models/mmyolo/onnx
+├── deploy.json
+├── detail.json
+├── end2end.onnx
+└── pipeline.json
+```
+
+in which,
+
+- **end2end.onnx**: backend model which can be inferred by ONNX Runtime
+- ***xxx*.json**: the necessary information for mmdeploy SDK
+
+The whole package **mmdeploy_models/mmyolo/onnx** is defined as **mmdeploy SDK model**, i.e., **mmdeploy SDK model** includes both backend model and inference meta information.
+
+## Model inference
+
+### Backend model inference
+
+Take the previous converted `end2end.onnx` model as an example, you can use the following code to inference the model and visualize the results.
+
+```python
+from mmdeploy.apis.utils import build_task_processor
+from mmdeploy.utils import get_input_shape, load_config
+import torch
+
+deploy_cfg = 'configs/deploy/detection_onnxruntime_dynamic.py'
+model_cfg = 'configs/yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py'
+device = 'cpu'
+backend_model = ['mmdeploy_models/mmyolo/onnx/end2end.onnx']
+image = 'demo/demo.jpg'
+
+# read deploy_cfg and model_cfg
+deploy_cfg, model_cfg = load_config(deploy_cfg, model_cfg)
+
+# build task and backend model
+task_processor = build_task_processor(model_cfg, deploy_cfg, device)
+model = task_processor.build_backend_model(backend_model)
+
+# process input image
+input_shape = get_input_shape(deploy_cfg)
+model_inputs, _ = task_processor.create_input(image, input_shape)
+
+# do model inference
+with torch.no_grad():
+    result = model.test_step(model_inputs)
+
+# visualize results
+task_processor.visualize(
+    image=image,
+    model=model,
+    result=result[0],
+    window_name='visualize',
+    output_file='work_dir/output_detection.png')
+```
+
+With the above code, you can find the inference result `output_detection.png` in `work_dir`.
+
+### SDK model inference
+
+You can also perform SDK model inference like following,
+
+```python
+from mmdeploy_runtime import Detector
+import cv2
+
+img = cv2.imread('demo/demo.jpg')
+
+# create a detector
+detector = Detector(model_path='mmdeploy_models/mmyolo/onnx',
+                    device_name='cpu', device_id=0)
+# perform inference
+bboxes, labels, masks = detector(img)
+
+# visualize inference result
+indices = [i for i in range(len(bboxes))]
+for index, bbox, label_id in zip(indices, bboxes, labels):
+    [left, top, right, bottom], score = bbox[0:4].astype(int), bbox[4]
+    if score < 0.3:
+        continue
+
+    cv2.rectangle(img, (left, top), (right, bottom), (0, 255, 0))
+
+cv2.imwrite('work_dir/output_detection.png', img)
+```
+
+Besides python API, mmdeploy SDK also provides other FFI (Foreign Function Interface), such as C, C++, C#, Java and so on. You can learn their usage from [demos](https://github.com/open-mmlab/mmdeploy/tree/main/demo).
+
+## How to Evaluate Model
+
+### Usage
+
+After the model is converted to your backend, you can use `${MMDEPLOY_DIR}/tools/test.py` to evaluate the performance.
+
+```shell
+python3 ${MMDEPLOY_DIR}/tools/test.py \
+    ${DEPLOY_CFG} \
+    ${MODEL_CFG} \
+    --model ${BACKEND_MODEL_FILES} \
+    --device ${DEVICE} \
+    --work-dir ${WORK_DIR} \
+    [--cfg-options ${CFG_OPTIONS}] \
+    [--show] \
+    [--show-dir ${OUTPUT_IMAGE_DIR}] \
+    [--interval ${INTERVAL}] \
+    [--wait-time ${WAIT_TIME}] \
+    [--log2file work_dirs/output.txt]
+    [--speed-test] \
+    [--warmup ${WARM_UP}] \
+    [--log-interval ${LOG_INTERVERL}] \
+    [--batch-size ${BATCH_SIZE}] \
+    [--uri ${URI}]
+```
+
+### Parameter Description
+
+- `deploy_cfg`: set the deployment config file path.
+- `model_cfg`: set the MMYOLO model config file path.
+- `--model`: set the converted model. For example, if we exported a TensorRT model, we need to pass in the file path with the suffix ".engine".
+- `--device`: indicate the device to run the model. Note that some backends limit the running devices. For example, TensorRT must run on CUDA.
+- `--work-dir`: the directory to save the file containing evaluation metrics.
+- `--cfg-options`: pass in additional configs, which will override the current deployment configs.
+- `--show`: show the evaluation result on screen or not.
+- `--show-dir`: save the evaluation result to this directory, valid only when specified.
+- `--interval`: set the display interval between each two evaluation results.
+- `--wait-time`: set the display time of each window.
+- `--log2file`: log evaluation results and speed to file.
+- `--speed-test`: test the inference speed or not.
+- `--warmup`: warm up before speed test or not, works only when `speed-test` is specified.
+- `--log-interval`: the interval between each log, works only when `speed-test` is specified.
+- `--batch-size`: set the batch size for inference, which will override the `samples_per_gpu` in data config. The default value is `1`, however, not every model supports `batch_size > 1`.
+- `--uri`: Remote ipv4:port or ipv6:port for inference on edge device.
+
+Note: other parameters in `${MMDEPLOY_DIR}/tools/test.py` are used for speed test, they will not affect the evaluation results.
diff --git a/mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/deploy/mmdeploy_yolov5.md b/mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/deploy/mmdeploy_yolov5.md
new file mode 100644
index 0000000..321a673
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/deploy/mmdeploy_yolov5.md
@@ -0,0 +1,572 @@
+# YOLOv5 Deployment
+
+Please check the [basic_deployment_guide](mmdeploy_guide.md) to get familiar with the configurations.
+
+## Model Training and Validation
+
+TODO
+
+## MMDeploy Environment Setup
+
+Please check the installation document of `MMDeploy` at [build_from_source](https://github.com/open-mmlab/mmdeploy/blob/dev-1.x/docs/en/01-how-to-build/build_from_source.md). Please build both `MMDeploy` and the customized Ops to your specific platform.
+
+Note: please check at `MMDeploy` [FAQ](https://github.com/open-mmlab/mmdeploy/blob/dev-1.x/docs/en/faq.md) or create new issues in `MMDeploy` when you come across any problems.
+
+## How to Prepare Configuration File
+
+This deployment guide uses the `YOLOv5` model trained on `COCO` dataset in MMYOLO to illustrate the whole process, including both static and dynamic inputs and different procedures for `TensorRT` and `ONNXRuntime`.
+
+### For Static Input
+
+#### 1. Model Config
+
+To deploy the model with static inputs, you need to ensure that the model inputs are in fixed size, e.g. the input size is set to `640x640` while uploading data in the test pipeline and test dataloader.
+
+Here is a example in [`yolov5_s-static.py`](https://github.com/open-mmlab/mmyolo/tree/main/configs/deploy/model/yolov5_s-static.py)
+
+```python
+_base_ = '../../yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py'
+
+test_pipeline = [
+    dict(type='LoadImageFromFile', backend_args=_base_.backend_args),
+    dict(
+        type='LetterResize',
+        scale=_base_.img_scale,
+        allow_scale_up=False,
+        use_mini_pad=False,
+    ),
+    dict(type='LoadAnnotations', with_bbox=True, _scope_='mmdet'),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                   'scale_factor', 'pad_param'))
+]
+
+test_dataloader = dict(
+    dataset=dict(pipeline=test_pipeline, batch_shapes_cfg=None))
+```
+
+As the `YOLOv5` will turn on `allow_scale_up` and `use_mini_pad` during the test to change the size of the input image in order to achieve higher accuracy. However, it will cause the input size mismatch problem when deploying in the static input model.
+
+Compared with the original configuration file, this configuration has been modified as follows:
+
+- turn off the settings related to reshaping the image in `test_pipeline`, e.g. setting `allow_scale_up=False` and `use_mini_pad=False` in `LetterResize`
+- turn off the `batch_shapes` in `test_dataloader` as `batch_shapes_cfg=None`.
+
+#### 2. Deployment Cofnig
+
+To deploy the model to `ONNXRuntime`, please refer to the [`detection_onnxruntime_static.py`](https://github.com/open-mmlab/mmyolo/tree/main/configs/deploy/detection_onnxruntime_static.py) as follows:
+
+```python
+_base_ = ['./base_static.py']
+codebase_config = dict(
+    type='mmyolo',
+    task='ObjectDetection',
+    model_type='end2end',
+    post_processing=dict(
+        score_threshold=0.05,
+        confidence_threshold=0.005,
+        iou_threshold=0.5,
+        max_output_boxes_per_class=200,
+        pre_top_k=5000,
+        keep_top_k=100,
+        background_label_id=-1),
+    module=['mmyolo.deploy'])
+backend_config = dict(type='onnxruntime')
+```
+
+The `post_processing` in the default configuration aligns the accuracy of the current model with the trained `pytorch` model. If you need to modify the relevant parameters, you can refer to the detailed introduction of [dasic_deployment_guide](mmdeploy_guide.md).
+
+To deploy the model to `TensorRT`, please refer to the [`detection_tensorrt_static-640x640.py`](https://github.com/open-mmlab/mmyolo/tree/main/configs/deploy/detection_tensorrt_static-640x640.p).
+
+```python
+_base_ = ['./base_static.py']
+onnx_config = dict(input_shape=(640, 640))
+backend_config = dict(
+    type='tensorrt',
+    common_config=dict(fp16_mode=False, max_workspace_size=1 << 30),
+    model_inputs=[
+        dict(
+            input_shapes=dict(
+                input=dict(
+                    min_shape=[1, 3, 640, 640],
+                    opt_shape=[1, 3, 640, 640],
+                    max_shape=[1, 3, 640, 640])))
+    ])
+use_efficientnms = False
+```
+
+In this guide, we use the default settings such as  `input_shape=(640, 640)` and `fp16_mode=False` to build in network in `fp32` mode. Moreover, we set `max_workspace_size=1 << 30` for the gpu memory which allows `TensorRT` to build the engine with maximum `1GB` memory.
+
+### For Dynamic Input
+
+#### 1. Model Confige
+
+As `TensorRT` limits the minimum and maximum input size, we can use any size for the inputs when deploy the model in dynamic mode. In this way, we can keep the default settings in [`yolov5_s-v61_syncbn_8xb16-300e_coco.py`](https://github.com/open-mmlab/mmyolo/tree/main/configs/yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py). The data processing and dataloader parts are as follows.
+
+```python
+batch_shapes_cfg = dict(
+    type='BatchShapePolicy',
+    batch_size=val_batch_size_per_gpu,
+    img_size=img_scale[0],
+    size_divisor=32,
+    extra_pad_ratio=0.5)
+
+test_pipeline = [
+    dict(type='LoadImageFromFile', backend_args=_base_.backend_args),
+    dict(type='YOLOv5KeepRatioResize', scale=img_scale),
+    dict(
+        type='LetterResize',
+        scale=img_scale,
+        allow_scale_up=False,
+        pad_val=dict(img=114)),
+    dict(type='LoadAnnotations', with_bbox=True, _scope_='mmdet'),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                   'scale_factor', 'pad_param'))
+]
+
+val_dataloader = dict(
+    batch_size=val_batch_size_per_gpu,
+    num_workers=val_num_workers,
+    persistent_workers=persistent_workers,
+    pin_memory=True,
+    drop_last=False,
+    sampler=dict(type='DefaultSampler', shuffle=False),
+    dataset=dict(
+        type=dataset_type,
+        data_root=data_root,
+        test_mode=True,
+        data_prefix=dict(img='val2017/'),
+        ann_file='annotations/instances_val2017.json',
+        pipeline=test_pipeline,
+        batch_shapes_cfg=batch_shapes_cfg))
+```
+
+We use `allow_scale_up=False` to control when the input small images will be upsampled or not in the initialization of `LetterResize`. At the same time, the default `use_mini_pad=False` turns off the minimum padding strategy of the image, and `val_dataloader['dataset']` is passed in` batch_shapes_cfg=batch_shapes_cfg` to ensure that the minimum padding is performed according to the input size in `batch`. These configs will change the dimensions of the input image, so the converted model can support dynamic inputs according to the above dataset loader when testing.
+
+#### 2. Deployment Cofnig
+
+To deploy the model to `ONNXRuntime`, please refer to the [`detection_onnxruntime_dynamic.py`](https://github.com/open-mmlab/mmyolo/blob/main/configs/deploy/detection_onnxruntime_dynamic.py) for more details.
+
+```python
+_base_ = ['./base_dynamic.py']
+codebase_config = dict(
+    type='mmyolo',
+    task='ObjectDetection',
+    model_type='end2end',
+    post_processing=dict(
+        score_threshold=0.05,
+        confidence_threshold=0.005,
+        iou_threshold=0.5,
+        max_output_boxes_per_class=200,
+        pre_top_k=5000,
+        keep_top_k=100,
+        background_label_id=-1),
+    module=['mmyolo.deploy'])
+backend_config = dict(type='onnxruntime')
+```
+
+Differs from the static input config we introduced in previous section, dynamic input config additionally inherits the `dynamic_axes`. The rest of the configuration stays the same as the static inputs.
+
+To deploy the model to `TensorRT`, please refer to the [`detection_tensorrt_dynamic-192x192-960x960.py`](https://github.com/open-mmlab/mmyolo/tree/main/configs/deploy/detection_tensorrt_dynamic-192x192-960x960.py) for more details.
+
+```python
+_base_ = ['./base_dynamic.py']
+backend_config = dict(
+    type='tensorrt',
+    common_config=dict(fp16_mode=False, max_workspace_size=1 << 30),
+    model_inputs=[
+        dict(
+            input_shapes=dict(
+                input=dict(
+                    min_shape=[1, 3, 192, 192],
+                    opt_shape=[1, 3, 640, 640],
+                    max_shape=[1, 3, 960, 960])))
+    ])
+use_efficientnms = False
+```
+
+In our example, the network is built in `fp32` mode as `fp16_mode=False`, and the maximum graphic memory is `1GB` for building the `TensorRT` engine as `max_workspace_size=1 << 30`.
+
+At the same time, `min_shape=[1, 3, 192, 192]`, `opt_shape=[1, 3, 640, 640]`, and `max_shape=[1, 3, 960, 960]` in the default setting set  the model with minimum input size to `192x192`, the maximum size to `960x960`, and the most common size to `640x640`.
+
+When you deploy the model, it can adopt to the input image dimensions automatically.
+
+## How to Convert Model
+
+Note: The `MMDeploy` root directory used in this guide is `/home/openmmlab/dev/mmdeploy`, please modify it to your `MMDeploy` directory.
+
+Use the following command to download the pretrained YOLOv5 weight and save it to your device:
+
+```shell
+wget https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth -O /home/openmmlab/dev/mmdeploy/yolov5s.pth
+```
+
+Set the relevant env parameters using the following command as well:
+
+```shell
+export MMDEPLOY_DIR=/home/openmmlab/dev/mmdeploy
+export PATH_TO_CHECKPOINTS=/home/openmmlab/dev/mmdeploy/yolov5s.pth
+```
+
+### YOLOv5 Static Model Deployment
+
+#### ONNXRuntime
+
+```shell
+python3 ${MMDEPLOY_DIR}/tools/deploy.py \
+    configs/deploy/detection_onnxruntime_static.py \
+    configs/deploy/model/yolov5_s-static.py \
+    ${PATH_TO_CHECKPOINTS} \
+    demo/demo.jpg \
+    --work-dir work_dir \
+    --show \
+    --device cpu
+```
+
+#### TensorRT
+
+```shell
+python3 ${MMDEPLOY_DIR}/tools/deploy.py \
+    configs/deploy/detection_tensorrt_static-640x640.py \
+    configs/deploy/model/yolov5_s-static.py \
+    ${PATH_TO_CHECKPOINTS} \
+    demo/demo.jpg \
+    --work-dir work_dir \
+    --show \
+    --device cuda:0
+```
+
+### YOLOv5 Dynamic Model Deployment
+
+#### ONNXRuntime
+
+```shell
+python3 ${MMDEPLOY_DIR}/tools/deploy.py \
+    configs/deploy/detection_onnxruntime_dynamic.py \
+    configs/yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py \
+    ${PATH_TO_CHECKPOINTS} \
+    demo/demo.jpg \
+    --work-dir work_dir \
+    --show \
+    --device cpu
+    --dump-info
+```
+
+#### TensorRT
+
+```shell
+python3 ${MMDEPLOY_DIR}/tools/deploy.py \
+    configs/deploy/detection_tensorrt_dynamic-192x192-960x960.py \
+    configs/yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py \
+    ${PATH_TO_CHECKPOINTS} \
+    demo/demo.jpg \
+    --work-dir work_dir \
+    --show \
+    --device cuda:0
+    --dump-info
+```
+
+When convert the model using the above commands, you will find the following files under the `work_dir` folder:
+
+![image](https://github.com/open-mmlab/mmdeploy/assets/110151316/760f3f7f-aa23-46cf-987c-717d3490246f)
+
+or
+
+![image](https://github.com/open-mmlab/mmdeploy/assets/110151316/732bcd9a-fca0-40ba-b5af-540a47eb9c35)
+
+After exporting to `onnxruntime`, you will get six files as shown in Figure 1, where `end2end.onnx` represents the exported `onnxruntime` model. The `xxx.json` are the meta info for `MMDeploy SDK` inference.
+
+After exporting to `TensorRT`, you will get the seven files as shown in Figure 2, where `end2end.onnx` represents the exported intermediate model. `MMDeploy` uses this model to automatically continue to convert the `end2end.engine` model for `TensorRT `Deployment. The `xxx.json` are the meta info for `MMDeploy SDK` inference.
+
+## How to Evaluate Model
+
+After successfully convert the model, you can use `${MMDEPLOY_DIR}/tools/test.py` to evaluate the converted model. The following part shows how to evaluate the static models of `ONNXRuntime` and `TensorRT`. For dynamic model evaluation, please modify the configuration of the inputs.
+
+### ONNXRuntime
+
+```shell
+python3 ${MMDEPLOY_DIR}/tools/test.py \
+        configs/deploy/detection_onnxruntime_static.py \
+        configs/deploy/model/yolov5_s-static.py \
+        --model work_dir/end2end.onnx  \
+        --device cpu \
+        --work-dir work_dir
+```
+
+Once the process is done, you can get the output results as this:
+
+![image](https://user-images.githubusercontent.com/92794867/199380483-cf8d867b-7309-4994-938a-f743f4cada77.png)
+
+### TensorRT
+
+Note: `TensorRT` must run on `CUDA` devices!
+
+```shell
+python3 ${MMDEPLOY_DIR}/tools/test.py \
+        configs/deploy/detection_tensorrt_static-640x640.py \
+        configs/deploy/model/yolov5_s-static.py \
+        --model work_dir/end2end.engine  \
+        --device cuda:0 \
+        --work-dir work_dir
+```
+
+Once the process is done, you can get the output results as this:
+
+![image](https://user-images.githubusercontent.com/92794867/199380370-da15cfca-2723-4e5b-b6cf-0afb5f44a66a.png)
+
+More useful evaluation tools will be released in the future.
+
+# Deploy using Docker
+
+`MMYOLO` provides a deployment [`Dockerfile`](https://github.com/open-mmlab/mmyolo/blob/main/docker/Dockerfile_deployment) for deployment purpose. Please make sure your local docker version is greater than `19.03`.
+
+Note: users in mainland China can comment out the `Optional` part in the dockerfile for better experience.
+
+```dockerfile
+# (Optional)
+RUN sed -i 's/http:\/\/archive.ubuntu.com\/ubuntu\//http:\/\/mirrors.aliyun.com\/ubuntu\//g' /etc/apt/sources.list && \
+    pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
+```
+
+To build the docker image,
+
+```bash
+# build an image with PyTorch 1.12, CUDA 11.6, TensorRT 8.2.4 ONNXRuntime 1.8.1
+docker build -f docker/Dockerfile_deployment -t mmyolo:v1 .
+```
+
+To run the docker image,
+
+```bash
+export DATA_DIR=/path/to/your/dataset
+docker run --gpus all --shm-size=8g -it --name mmyolo -v ${DATA_DIR}:/openmmlab/mmyolo/data/coco mmyolo:v1
+```
+
+`DATA_DIR` is the path of your `COCO` dataset.
+
+We provide a `script.sh` file for you which runs the whole pipeline. Create the script under `/openmmlab/mmyolo` directory in your docker container using the following content.
+
+```bash
+#!/bin/bash
+wget -q https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth \
+  -O yolov5s.pth
+export MMDEPLOY_DIR=/openmmlab/mmdeploy
+export PATH_TO_CHECKPOINTS=/openmmlab/mmyolo/yolov5s.pth
+
+python3 ${MMDEPLOY_DIR}/tools/deploy.py \
+  configs/deploy/detection_tensorrt_static-640x640.py \
+  configs/deploy/model/yolov5_s-static.py \
+  ${PATH_TO_CHECKPOINTS} \
+  demo/demo.jpg \
+  --work-dir work_dir_trt \
+  --device cuda:0
+
+python3 ${MMDEPLOY_DIR}/tools/test.py \
+  configs/deploy/detection_tensorrt_static-640x640.py \
+  configs/deploy/model/yolov5_s-static.py \
+  --model work_dir_trt/end2end.engine \
+  --device cuda:0 \
+  --work-dir work_dir_trt
+
+python3 ${MMDEPLOY_DIR}/tools/deploy.py \
+  configs/deploy/detection_onnxruntime_static.py \
+  configs/deploy/model/yolov5_s-static.py \
+  ${PATH_TO_CHECKPOINTS} \
+  demo/demo.jpg \
+  --work-dir work_dir_ort \
+  --device cpu
+
+python3 ${MMDEPLOY_DIR}/tools/test.py \
+  configs/deploy/detection_onnxruntime_static.py \
+  configs/deploy/model/yolov5_s-static.py \
+  --model work_dir_ort/end2end.onnx \
+  --device cpu \
+  --work-dir work_dir_ort
+```
+
+Then run the script under `/openmmlab/mmyolo`.
+
+```bash
+sh script.sh
+```
+
+This script automatically downloads the `YOLOv5` pretrained weights in `MMYOLO` and convert the model using `MMDeploy`. You will get the output result as follows.
+
+- TensorRT:
+
+  ![image](https://user-images.githubusercontent.com/92794867/199657349-1bad9196-c00b-4a65-84f5-80f51e65a2bd.png)
+
+- ONNXRuntime:
+
+  ![image](https://user-images.githubusercontent.com/92794867/199657283-95412e84-3ba4-463f-b4b2-4bf52ec4acbd.png)
+
+We can see from the above images that the accuracy of converted models shrink within 1% compared with the pytorch [MMYOLO-YOLOv5](https://github.com/open-mmlab/mmyolo/tree/main/configs/yolov5#results-and-models) models.
+
+If you need to test the inference speed of the converted model, you can use the following commands.
+
+- TensorRT
+
+```shell
+python3 ${MMDEPLOY_DIR}/tools/profiler.py \
+  configs/deploy/detection_tensorrt_static-640x640.py \
+  configs/deploy/model/yolov5_s-static.py \
+  data/coco/val2017 \
+  --model work_dir_trt/end2end.engine \
+  --device cuda:0
+```
+
+- ONNXRuntime
+
+```shell
+python3 ${MMDEPLOY_DIR}/tools/profiler.py \
+  configs/deploy/detection_onnxruntime_static.py \
+  configs/deploy/model/yolov5_s-static.py \
+  data/coco/val2017 \
+  --model work_dir_ort/end2end.onnx \
+  --device cpu
+```
+
+## Model Inference
+
+### Backend Model Inference
+
+#### ONNXRuntime
+
+For the converted model `end2end.onnx`,you can do the inference with the following code:
+
+```python
+from mmdeploy.apis.utils import build_task_processor
+from mmdeploy.utils import get_input_shape, load_config
+import torch
+
+deploy_cfg = './configs/deploy/detection_onnxruntime_dynamic.py'
+model_cfg = '../mmyolo/configs/yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py'
+device = 'cpu'
+backend_model = ['./work_dir/end2end.onnx']
+image = '../mmyolo/demo/demo.jpg'
+
+# read deploy_cfg and model_cfg
+deploy_cfg, model_cfg = load_config(deploy_cfg, model_cfg)
+
+# build task and backend model
+task_processor = build_task_processor(model_cfg, deploy_cfg, device)
+model = task_processor.build_backend_model(backend_model)
+
+# process input image
+input_shape = get_input_shape(deploy_cfg)
+model_inputs, _ = task_processor.create_input(image, input_shape)
+
+# do model inference
+with torch.no_grad():
+    result = model.test_step(model_inputs)
+
+# visualize results
+task_processor.visualize(
+    image=image,
+    model=model,
+    result=result[0],
+    window_name='visualize',
+    output_file='work_dir/output_detection.png')
+```
+
+#### TensorRT
+
+For the converted model `end2end.engine`,you can do the inference with the following code:
+
+```python
+from mmdeploy.apis.utils import build_task_processor
+from mmdeploy.utils import get_input_shape, load_config
+import torch
+
+deploy_cfg = './configs/deploy/detection_tensorrt_dynamic-192x192-960x960.py'
+model_cfg = '../mmyolo/configs/yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py'
+device = 'cuda:0'
+backend_model = ['./work_dir/end2end.engine']
+image = '../mmyolo/demo/demo.jpg'
+
+# read deploy_cfg and model_cfg
+deploy_cfg, model_cfg = load_config(deploy_cfg, model_cfg)
+
+# build task and backend model
+task_processor = build_task_processor(model_cfg, deploy_cfg, device)
+model = task_processor.build_backend_model(backend_model)
+
+# process input image
+input_shape = get_input_shape(deploy_cfg)
+model_inputs, _ = task_processor.create_input(image, input_shape)
+
+# do model inference
+with torch.no_grad():
+    result = model.test_step(model_inputs)
+
+# visualize results
+task_processor.visualize(
+    image=image,
+    model=model,
+    result=result[0],
+    window_name='visualize',
+    output_file='work_dir/output_detection.png')
+```
+
+### SDK Model Inference
+
+#### ONNXRuntime
+
+For the converted model `end2end.onnx`,you can do the SDK inference with the following code:
+
+```python
+from mmdeploy_runtime import Detector
+import cv2
+
+img = cv2.imread('../mmyolo/demo/demo.jpg')
+
+# create a detector
+detector = Detector(model_path='work_dir',
+                    device_name='cpu', device_id=0)
+# perform inference
+bboxes, labels, masks = detector(img)
+
+# visualize inference result
+indices = [i for i in range(len(bboxes))]
+for index, bbox, label_id in zip(indices, bboxes, labels):
+    [left, top, right, bottom], score = bbox[0:4].astype(int), bbox[4]
+    if score < 0.3:
+        continue
+
+    cv2.rectangle(img, (left, top), (right, bottom), (0, 255, 0))
+
+cv2.imwrite('work_dir/output_detection.png', img)
+```
+
+#### TensorRT
+
+For the converted model `end2end.engine`,you can do the SDK inference with the following code:
+
+```python
+from mmdeploy_runtime import Detector
+import cv2
+
+img = cv2.imread('../mmyolo/demo/demo.jpg')
+
+# create a detector
+detector = Detector(model_path='work_dir',
+                    device_name='cuda', device_id=0)
+# perform inference
+bboxes, labels, masks = detector(img)
+
+# visualize inference result
+indices = [i for i in range(len(bboxes))]
+for index, bbox, label_id in zip(indices, bboxes, labels):
+    [left, top, right, bottom], score = bbox[0:4].astype(int), bbox[4]
+    if score < 0.3:
+        continue
+
+    cv2.rectangle(img, (left, top), (right, bottom), (0, 255, 0))
+
+cv2.imwrite('work_dir/output_detection.png', img)
+```
+
+Besides python API, mmdeploy SDK also provides other FFI (Foreign Function Interface), such as C, C++, C#, Java and so on. You can learn their usage from [demos](https://github.com/open-mmlab/mmdeploy/tree/main/demo).
diff --git a/mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/labeling_to_deployment_tutorials.md b/mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/labeling_to_deployment_tutorials.md
new file mode 100644
index 0000000..bce5d53
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/labeling_to_deployment_tutorials.md
@@ -0,0 +1,1331 @@
+# Annotation-to-deployment workflow for custom dataset
+
+In our daily work and study, we often encounter some tasks that need to train custom dataset. There are few scenarios in which open-source datasets can be used as online models, so we need to carry out a series of operations on our custom datasets to ensure that the models can be put into production and serve users.
+
+```{SeeAlso}
+The video of this document has been posted on Bilibili: [A nanny level tutorials for custom datasets from annotationt to deployment](https://www.bilibili.com/video/BV1RG4y137i5)
+```
+
+```{Note}
+All instructions in this document are done on Linux and are fully available on Windows, only slightly different in commands and operations.
+```
+
+Default that you have completed the installation of MMYOLO, if not installed, please refer to the document [GET STARTED](https://mmyolo.readthedocs.io/en/latest/get_started.html) for installation.
+
+In this tutorial, we will introduce the whole process from annotating custom dataset to final training, testing and deployment. The overview steps are as below:
+
+01. Prepare dataset: `tools/misc/download_dataset.py`
+02. Use the software of [labelme](https://github.com/wkentaro/labelme) to annotate: `demo/image_demo.py` + labelme
+03. Convert the dataset into COCO format: `tools/dataset_converters/labelme2coco.py`
+04. Split dataset:`tools/misc/coco_split.py`
+05. Creat a config file based on dataset
+06. Dataset visualization analysis: `tools/analysis_tools/dataset_analysis.py`
+07. Optimize Anchor size: `tools/analysis_tools/optimize_anchors.py`
+08. Visualization the data processing part of config: `tools/analysis_tools/browse_dataset.py`
+09. Train: `tools/train.py`
+10. Inference: `demo/image_demo.py`
+11. Deployment
+
+```{Note}
+After obtaining the model weight and the mAP of validation set, users need to deep analyse the  bad cases of incorrect predictions in order to optimize model. MMYOLO will add this function in the future. Expect.
+```
+
+Each step is described in detail below.
+
+## 1. Prepare custom dataset
+
+- If you don't have your own dataset, or want to use a small dataset to run the whole process, you can use the 144 images `cat` dataset provided with this tutorial (the raw picture of this dataset is supplied by @RangeKing, cleaned by @PeterH0323). This `cat` dataset will be used as an example for the rest tutorial.
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/25873202/205423220-c4b8f2fd-22ba-4937-8e47-1b3f6a8facd8.png" alt="cat dataset"/>
+</div>
+
+The download is also very simple, requiring only one command (dataset compression package size `217 MB`):
+
+```shell
+python tools/misc/download_dataset.py --dataset-name cat --save-dir ./data/cat --unzip --delete
+```
+
+This dataset is automatically downloaded to the `./data/cat` dir with the following directory structure:
+
+```shell
+.
+└── ./data/cat
+    ├── images # image files
+    │    ├── image1.jpg
+    │    ├── image2.png
+    │    └── ...
+    ├── labels # labelme files
+    │    ├── image1.json
+    │    ├── image2.json
+    │    └── ...
+    ├── annotations # annotated files of COCO
+    │    ├── annotations_all.json # all labels of COCO
+    │    ├── trainval.json # 80% labels of the dataset
+    │    └── test.json # 20% labels of the dataset
+    └── class_with_id.txt # id + class_name file
+```
+
+This dataset can be trained directly. You can remove everything **outside** the `images` dir if you want to go through the whole process.
+
+- If you already have a dataset, you can compose it into the following structure:
+
+```shell
+.
+└── $DATA_ROOT
+    └── images
+         ├── image1.jpg
+         ├── image2.png
+         └── ...
+```
+
+## 2. Use the software of labelme to annotate
+
+In general, there are two annotation methods:
+
+- Software or algorithmic assistance + manual correction (Recommend, reduce costs and speed up)
+- Only manual annotation
+
+```{Note}
+At present, we also consider to access third-party libraries to support the integration of algorithm-assisted annotation and manual optimized annotation by calling MMYOLO inference API through GUI interface.
+If you have any interest or ideas, please leave a comment in the issue or contact us directly!
+```
+
+### 2.1 Software or algorithmic assistance + manual correction
+
+The principle is using the existing model to inference, and save the result as label file. Manually operating the software and loading the generated label files, you only need to check whether each image is correctly labeled and whether there are missing objects.【assistance + manual correction】you can save a lot of time in order to **reduce costs and speed up** by this way.
+
+```{Note}
+If the existing model doesn't have the categories defined in your dataset, such as COCO pre-trained model, you can manually annotate 100 images to train an initial model, and then software assistance.
+```
+
+The process is described below:
+
+#### 2.1.1 Software or algorithmic assistance
+
+MMYOLO provide model inference script `demo/image_demo.py`. Setting `--to-labelme` to generate labelme format label file:
+
+```shell
+python demo/image_demo.py img \
+                          config \
+                          checkpoint
+                          [--out-dir OUT_DIR] \
+                          [--device DEVICE] \
+                          [--show] \
+                          [--deploy] \
+                          [--score-thr SCORE_THR] \
+                          [--class-name CLASS_NAME]
+                          [--to-labelme]
+```
+
+These include:
+
+- `img`: image path, supported by dir, file, URL;
+- `config`:config file path of model;
+- `checkpoint`:weight file path of model;
+- `--out-dir`:inference results saved in this dir, default as `./output`, if set this `--show` parameter, the detection results are not saved;
+- `--device`:cumputing resources, including `CUDA`, `CPU` etc., default as `cuda:0`;
+- `--show`:display the detection results, default as `False`;
+- `--deploy`:whether to switch to deploy mode;
+- `--score-thr`:confidence threshold, default as `0.3`;
+- `--to-labelme`:whether to export label files in `labelme` format, shouldn't exist with the `--show` at the same time.
+
+For example:
+
+Here, we'll use YOLOv5-s as an example to help us label the 'cat' dataset we just downloaded. First, download the weights for YOLOv5-s:
+
+```shell
+mkdir work_dirs
+wget https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth -P ./work_dirs
+```
+
+Since the COCO 80 dataset already includes the `cat` class, we can directly load the COCO pre-trained model for assistant annotation.
+
+```shell
+python demo/image_demo.py ./data/cat/images \
+                          ./configs/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py \
+                          ./work_dirs/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth \
+                          --out-dir ./data/cat/labels \
+                          --class-name cat \
+                          --to-labelme
+```
+
+```{Tip}
+- If your dataset needs to label with multiclass, you can use this `--class-name class1 class2` format;
+- Removing the `--class-name` flag to output all classes.
+```
+
+the generated label files saved in `--out-dir`:
+
+```shell
+.
+└── $OUT_DIR
+    ├── image1.json
+    ├── image1.json
+    └── ...
+```
+
+Here is an example of the original image and it's generating json file:
+
+<div align=center>
+  <img src="https://user-images.githubusercontent.com/25873202/205471430-dcc882dd-16bb-45e4-938f-6b62ab3dff19.jpg" alt="Image" width="45%"/>
+  <img src="https://user-images.githubusercontent.com/25873202/205471559-643aecc8-7fa3-4fff-be51-2fb0a570fdd3.png" alt="Image" width="45%"/>
+</div>
+
+#### 2.1.2 Manual annotation
+
+In this tutorial, we use [labelme](https://github.com/wkentaro/labelme) to annotate
+
+- Install labelme
+
+```shell
+conda create -n labelme python=3.8
+conda activate labelme
+pip install labelme==5.1.1
+```
+
+- Start labelme
+
+```shell
+labelme ${image dir path (same as the previous step)} \
+        --output ${the dir path of label file(same as --out-dir)} \
+        --autosave \
+        --nodata
+```
+
+These include:
+
+- `--output`:saved path of labelme file. If there already exists label file of some images, it will be loaded;
+- `--autosave`:auto-save label file, and some tedioys steps will be omitted.
+- `--nodata`:doesn't store the base64 encoding of each image, so setting this flag will greatly reduce the size of the label file.
+
+For example:
+
+```shell
+cd /path/to/mmyolo
+labelme ./data/cat/images --output ./data/cat/labels --autosave --nodata
+```
+
+Type in command and labelme will start, and then check label. If labelme fails to start, type `export QT_DEBUG_PLUGINS=1` in command to see which libraries are missing and install it.
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/25873202/205432185-54407d83-3cee-473f-8743-656da157cf80.png" alt="label UI"/>
+</div>
+
+```{warning}
+Make sure to use `rectangle` with the shortcut `Ctrl + R` (see below).
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/25873202/204076212-86dab4fa-13dd-42cd-93d8-46b04b864449.png" alt="rectangle"/>
+</div>
+```
+
+### 2.2 Only manual annotation
+
+The procedure is the same as 【2.1.2 Manual annotation】, except that this is a direct labeling, there is no pre-generated label.
+
+## 3. Convert the dataset into COCO format
+
+### 3.1 Using scripts to convert
+
+MMYOLO provides scripts to convert labelme labels to COCO labels
+
+```shell
+python tools/dataset_converters/labelme2coco.py --img-dir ${image dir path} \
+                                                --labels-dir ${label dir location} \
+                                                --out ${output COCO label json path} \
+                                                [--class-id-txt ${class_with_id.txt path}]
+```
+
+These include:
+`--class-id-txt`: is the `.txt` file of `id class_name` dataset:
+
+- If not specified, the script will be generated automatically in the same directory as `--out`, and save it as `class_with_id.txt`;
+
+- If specified, the script will read but not add or overwrite. It will also check if there are any other classes in the `.txt` file and will give you an error if there are any. Please check the `.txt` file and add the new class and its `id`.
+
+An example `.txt` file looks like this (`id` start at `1`, just like COCO):
+
+```text
+1 cat
+2 dog
+3 bicycle
+4 motorcycle
+
+```
+
+For example:
+
+Coonsider the `cat` dataset for this tutorial:
+
+```shell
+python tools/dataset_converters/labelme2coco.py --img-dir ./data/cat/images \
+                                                --labels-dir ./data/cat/labels \
+                                                --out ./data/cat/annotations/annotations_all.json
+```
+
+For the `cat` dataset in this demo (note that we don't need to include the background class), we can see that the generated `class_with_id.txt` has only the `1` class:
+
+```text
+1 cat
+
+```
+
+### 3.2 Check the converted COCO label
+
+Using the following command, we can display the COCO label on the image, which will verify that there are no problems with the conversion:
+
+```shell
+python tools/analysis_tools/browse_coco_json.py --img-dir ${image dir path} \
+                                                --ann-file ${COCO label json path}
+```
+
+For example:
+
+```shell
+python tools/analysis_tools/browse_coco_json.py --img-dir ./data/cat/images \
+                                                --ann-file ./data/cat/annotations/annotations_all.json
+```
+
+<div align=center>
+<img alt="Image" src="https://user-images.githubusercontent.com/25873202/205429166-a6e48d20-c60b-4571-b00e-54439003ad3b.png">
+</div>
+
+```{SeeAlso}
+See [Visualizing COCO label](https://mmyolo.readthedocs.io/en/latest/user_guides/useful_tools.html#coco) for more information on `tools/analysis_tools/browse_coco_json.py`.
+```
+
+## 4. Divide dataset into training set, validation set and test set
+
+Usually, custom dataset is a large folder with full of images. We need to divide the dataset into training set, validation set and test set by ourselves. If the amount of data is small, we can not divide the validation set. Here's how the split script works:
+
+```shell
+python tools/misc/coco_split.py --json ${COCO label json path} \
+                                --out-dir ${divide label json saved path} \
+                                --ratios ${ratio of division} \
+                                [--shuffle] \
+                                [--seed ${random seed for division}]
+```
+
+These include:
+
+- `--ratios`: ratio of division. If only 2 are set, the split is `trainval + test`, and if 3 are set, the split is `train + val + test`. Two formats are supported - integer and decimal:
+
+  - Integer: divide the dataset in proportion after normalization. Example: `--ratio 2 1 1` (the code will convert to `0.5 0.25 0.25`) or `--ratio 3 1`(the code will convert to `0.75 0.25`)
+
+  - Decimal: divide the dataset in proportion. **If the sum does not add up to 1, the script performs an automatic normalization correction.** Example: `--ratio 0.8 0.1 0.1` or `--ratio 0.8 0.2`
+
+- `--shuffle`: whether to shuffle the dataset before splitting.
+
+- `--seed`: the random seed of dataset division. If not set, this will be generated automatically.
+
+For example:
+
+```shell
+python tools/misc/coco_split.py --json ./data/cat/annotations/annotations_all.json \
+                                --out-dir ./data/cat/annotations \
+                                --ratios 0.8 0.2 \
+                                --shuffle \
+                                --seed 10
+```
+
+<div align=center>
+<img alt="Image" src="https://user-images.githubusercontent.com/25873202/205428346-5fdfbfca-0682-47aa-b0be-fa467cd0c5f8.png">
+</div>
+
+## 5. Create a new config file based on the dataset
+
+Make sure the dataset directory looks like this:
+
+```shell
+.
+└── $DATA_ROOT
+    ├── annotations
+    │    ├── trainval.json # only divide into trainval + test according to the above commands; If you use 3 groups to divide the ratio, here is train.json、val.json、test.json
+    │    └── test.json
+    ├── images
+    │    ├── image1.jpg
+    │    ├── image1.png
+    │    └── ...
+    └── ...
+```
+
+Since this is custom dataset, we need to create a new config and add some information we want to change.
+
+About naming the new config:
+
+- This config inherits from `yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py`;
+- We will train the class `cat` from the dataset provided with this tutorial (if you are using your own dataset, you can define the class name of your own dataset);
+- The GPU tested in this tutorial is 1 x 3080Ti with 12G video memory, and the computer memory is 32G. The maximum batch size for YOLOv5-s training is `batch size = 32` (see the Appendix for detailed machine information);
+- Training epoch is `100 epoch`.
+
+To sum up: you can name it `yolov5_s-v61_syncbn_fast_1xb32-100e_cat.py` and place it into the dir of `configs/custom_dataset`.
+
+Create a new directory named `custom_dataset` inside configs dir, and add config file with the following content:
+
+<div align=center>
+<img alt="Image" src="https://user-images.githubusercontent.com/25873202/205428358-e32fb455-480a-4f14-9613-e4cc3193fb4d.png">
+</div>
+
+```python
+_base_ = '../yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py'
+
+max_epochs = 100  # maximum epochs for training
+data_root = './data/cat/'  # absolute path to the dataset directory
+# data_root = '/root/workspace/mmyolo/data/cat/'  # absolute path to the dataset dir inside the Docker container
+
+# the path of result save, can be omitted, omitted save file name is located under work_dirs with the same name of config file.
+# If a config variable changes only part of its parameters, changing this variable will save the new training file elsewhere
+work_dir = './work_dirs/yolov5_s-v61_syncbn_fast_1xb32-100e_cat'
+
+# load_from can specify a local path or URL, setting the URL will automatically download, because the above has been downloaded, we set the local path here
+# since this tutorial is fine-tuning on the cat dataset, we need to use `load_from` to load the pre-trained model from MMYOLO. This allows for faster convergence and accuracy
+load_from = './work_dirs/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth'  # noqa
+
+# according to your GPU situation, modify the batch size, and YOLOv5-s defaults to 8 cards x 16bs
+train_batch_size_per_gpu = 32
+train_num_workers = 4  # recommend to use train_num_workers = nGPU x 4
+
+save_epoch_intervals = 2  # save weights every interval round
+
+# according to your GPU situation, modify the base_lr, modification ratio is base_lr_default * (your_bs / default_bs)
+base_lr = _base_.base_lr / 4
+
+anchors = [  # the anchor has been updated according to the characteristics of dataset. The generation of anchor will be explained in the following section.
+    [(68, 69), (154, 91), (143, 162)],  # P3/8
+    [(242, 160), (189, 287), (391, 207)],  # P4/16
+    [(353, 337), (539, 341), (443, 432)]  # P5/32
+]
+
+class_name = ('cat', )  # according to the label information of class_with_id.txt, set the class_name
+num_classes = len(class_name)
+metainfo = dict(
+    classes=class_name,
+    palette=[(220, 20, 60)]  # the color of drawing, free to set
+)
+
+train_cfg = dict(
+    max_epochs=max_epochs,
+    val_begin=20,  # number of epochs to start validation.  Here 20 is set because the accuracy of the first 20 epochs is not high and the test is not meaningful, so it is skipped
+    val_interval=save_epoch_intervals  # the test evaluation is performed  iteratively every val_interval round
+)
+
+model = dict(
+    bbox_head=dict(
+        head_module=dict(num_classes=num_classes),
+        prior_generator=dict(base_sizes=anchors),
+
+        # loss_cls is dynamically adjusted based on num_classes, but when num_classes = 1, loss_cls is always 0
+        loss_cls=dict(loss_weight=0.5 *
+                      (num_classes / 80 * 3 / _base_.num_det_layers))))
+
+train_dataloader = dict(
+    batch_size=train_batch_size_per_gpu,
+    num_workers=train_num_workers,
+    dataset=dict(
+        _delete_=True,
+        type='RepeatDataset',
+        # if the dataset is too small, you can use RepeatDataset, which repeats the current dataset n times per epoch, where 5 is set.
+        times=5,
+        dataset=dict(
+            type=_base_.dataset_type,
+            data_root=data_root,
+            metainfo=metainfo,
+            ann_file='annotations/trainval.json',
+            data_prefix=dict(img='images/'),
+            filter_cfg=dict(filter_empty_gt=False, min_size=32),
+            pipeline=_base_.train_pipeline)))
+
+val_dataloader = dict(
+    dataset=dict(
+        metainfo=metainfo,
+        data_root=data_root,
+        ann_file='annotations/trainval.json',
+        data_prefix=dict(img='images/')))
+
+test_dataloader = val_dataloader
+
+val_evaluator = dict(ann_file=data_root + 'annotations/trainval.json')
+test_evaluator = val_evaluator
+
+optim_wrapper = dict(optimizer=dict(lr=base_lr))
+
+default_hooks = dict(
+    # set how many epochs to save the model, and the maximum number of models to save,`save_best` is also the best model (recommended).
+    checkpoint=dict(
+        type='CheckpointHook',
+        interval=save_epoch_intervals,
+        max_keep_ckpts=5,
+        save_best='auto'),
+    param_scheduler=dict(max_epochs=max_epochs),
+    # logger output interval
+    logger=dict(type='LoggerHook', interval=10))
+
+```
+
+```{Note}
+We put an identical config file in `projects/misc/custom_dataset/yolov5_s-v61_syncbn_fast_1xb32-100e_cat.py`. You can choose to copy to `configs/custom_dataset/yolov5_s-v61_syncbn_fast_1xb32-100e_cat.py` to start training directly.
+```
+
+## 6. Visual analysis of datasets
+
+The script `tools/analysis_tools/dataset_analysis.py` will helo you get a plot of your dataset. The script can generate four types of analysis graphs:
+
+- A distribution plot showing categories and the number of bbox instances: `show_bbox_num`
+- A distribution plot showing categories and the width and height of bbox instances: `show_bbox_wh`
+- A distribution plot showing categories and the width/height ratio of bbox instances: `show_bbox_wh_ratio`
+- A distribution plot showing categories and the area of bbox instances based on the area rule: `show_bbox_area`
+
+Here's how the script works:
+
+```shell
+python tools/analysis_tools/dataset_analysis.py ${CONFIG} \
+                                                [--val-dataset ${TYPE}] \
+                                                [--class-name ${CLASS_NAME}] \
+                                                [--area-rule ${AREA_RULE}] \
+                                                [--func ${FUNC}] \
+                                                [--out-dir ${OUT_DIR}]
+```
+
+For example:
+
+Consider the config of `cat` dataset in this tutorial:
+
+Check the distribution of the training data:
+
+```shell
+python tools/analysis_tools/dataset_analysis.py configs/custom_dataset/yolov5_s-v61_syncbn_fast_1xb32-100e_cat.py \
+                                                --out-dir work_dirs/dataset_analysis_cat/train_dataset
+```
+
+Check the distribution of the validation data:
+
+```shell
+python tools/analysis_tools/dataset_analysis.py configs/custom_dataset/yolov5_s-v61_syncbn_fast_1xb32-100e_cat.py \
+                                                --out-dir work_dirs/dataset_analysis_cat/val_dataset \
+                                                --val-dataset
+```
+
+Effect (click on the image to view a larger image):
+
+<table align="center">
+  <tbody>
+    <tr align="center" valign="center">
+      <td>
+        <b>A distribution plot showing categories and the area of bbox instances based on the area rule</b>
+      </td>
+      <td>
+        <b>A distribution plot showing categories and the width and height of bbox instances</b>
+      </td>
+    </tr>
+    <tr align="center" valign="center">
+      <td>
+        <img alt="YOLOv5CocoDataset_bbox_area" src="https://user-images.githubusercontent.com/25873202/206709093-1ed40f4e-cae3-4383-b120-79ad44c12312.jpg" width="60%">
+      </td>
+      <td>
+        <img alt="YOLOv5CocoDataset_bbox_wh" src="https://user-images.githubusercontent.com/25873202/206709127-aebbb238-4af8-46c8-b71e-8540ed5f5de1.jpg" width="60%">
+      </td>
+    </tr>
+    <tr align="center" valign="center">
+      <td>
+        <b>A distribution plot showing categories and the number of bbox instances</b>
+      </td>
+      <td>
+        <b>A distribution plot showing categories and the width/height ratio of bbox instances</b>
+      </td>
+    </tr>
+    <tr align="center" valign="center">
+      <td>
+        <img alt="YOLOv5CocoDataset_bbox_num" src="https://user-images.githubusercontent.com/25873202/206709108-8cee54f3-3102-4ca2-a10a-e4adb760881b.jpg" width="60%">
+      </td>
+      <td>
+        <img alt="YOLOv5CocoDataset_bbox_ratio" src="https://user-images.githubusercontent.com/25873202/206709115-17aeba09-4ff1-4697-8842-94fbada6c428.jpg" width="60%">
+      </td>
+    </tr>
+  </tbody>
+</table>
+
+```{Note}
+Due to the cat dataset used in this tutorial is relatively small, we use RepeatDataset in config. The numbers shown are actually repeated five times. If you want a repeat-free analysis, you can change the `times` argument in RepeatDataset from `5` to `1` for now.
+```
+
+From the analysis output, we can conclude that the training set of the `cat` dataset used in this tutorial has the following characteristics:
+
+- The images are all `large object`;
+- The number of categories cat is `655`;
+- The width and height ratio of bbox is mostly concentrated in `1.0 ~ 1.11`, the minimum ratio is `0.36` and the maximum ratio is `2.9`;
+- The width of bbox is about `500 ~ 600` , and the height is about `500 ~ 600`.
+
+```{SeeAlso}
+See [Visualizing Dataset Analysis](https://mmyolo.readthedocs.io/en/latest/user_guides/useful_tools.html#id4) for more information on `tools/analysis_tools/dataset_analysis.py`
+```
+
+## 7. Optimize Anchor size
+
+```{Warning}
+This step only works for anchor-base models such as YOLOv5;
+
+This step can be skipped for Anchor-free models, such as YOLOv6, YOLOX.
+```
+
+The `tools/analysis_tools/optimize_anchors.py` script supports three anchor generation methods from YOLO series: `k-means`, `Differential Evolution` and `v5-k-means`.
+
+In this tutorial, we will use YOLOv5 for training, with an input size of `640 x 640`, and `v5-k-means` to optimize anchor:
+
+```shell
+python tools/analysis_tools/optimize_anchors.py configs/custom_dataset/yolov5_s-v61_syncbn_fast_1xb32-100e_cat.py \
+                                                --algorithm v5-k-means \
+                                                --input-shape 640 640 \
+                                                --prior-match-thr 4.0 \
+                                                --out-dir work_dirs/dataset_analysis_cat
+```
+
+```{Note}
+Because this command uses the k-means clustering algorithm, there is some randomness, which is related to the initialization. Therefore, the Anchor obtained by each execution will be somewhat different, but it is generated based on the dataset passed in, so it will not have any adverse effects.
+```
+
+The calculated anchors are as follows:
+
+<div align=center>
+<img alt="Anchor" src="https://user-images.githubusercontent.com/25873202/205422434-1a68cded-b055-42e9-b01c-3e51f8f5ef81.png">
+</div>
+
+Modify the `anchors` variable in config file:
+
+```python
+anchors = [
+    [(68, 69), (154, 91), (143, 162)],  # P3/8
+    [(242, 160), (189, 287), (391, 207)],  # P4/16
+    [(353, 337), (539, 341), (443, 432)]  # P5/32
+]
+```
+
+```{SeeAlso}
+See [Optimize Anchor Sizes](https://mmyolo.readthedocs.io/en/latest/user_guides/useful_tools.html#id8) for more information on `tools/analysis_tools/optimize_anchors.py`
+```
+
+## 8. Visualization the data processing part of config
+
+The script `tools/analysis_tools/browse_dataset.py` allows you to visualize the data processing part of config directly in the window, with the option to save the visualization to a specific directory.
+
+Let's use the config file we just created `configs/custom_dataset/yolov5_s-v61_syncbn_fast_1xb32-100e_cat.py` to visualize the images. Each image lasts for `3` seconds, and the images are not saved:
+
+```shell
+python tools/analysis_tools/browse_dataset.py configs/custom_dataset/yolov5_s-v61_syncbn_fast_1xb32-100e_cat.py \
+                                              --show-interval 3
+```
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/25873202/205472078-c958e90d-8204-4c01-821a-8b6a006f05b2.png" alt="image" width="60%"/>
+</div>
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/25873202/205472197-8228c75e-6046-404a-89b4-ed55eeb2cb95.png" alt="image" width="60%"/>
+</div>
+
+```{SeeAlso}
+See [Visualizing Datasets](https://mmyolo.readthedocs.io/en/latest/user_guides/useful_tools.html#id3) for more information on `tools/analysis_tools/browse_dataset.py`
+```
+
+## 9. Train
+
+Here are three points to explain:
+
+1. Training visualization
+2. YOLOv5 model training
+3. Switching YOLO model training
+
+### 9.1 Training visualization
+
+If you need to use a browser to visualize the training process, MMYOLO currently offers two ways [wandb](https://wandb.ai/site) and [TensorBoard](https://tensorflow.google.cn/tensorboard). Pick one according to your own situation (we'll expand support for more visualization backends in the future).
+
+#### 9.1.1 wandb
+
+Wandb visualization need registered in [website](https://wandb.ai/site), and in the https://wandb.ai/settings for wandb API Keys.
+
+<div align=center>
+<img src="https://cdn.vansin.top/img/20220913212628.png" alt="image"/>
+</div>
+
+Then install it from the command line:
+
+```shell
+pip install wandb
+# After running wandb login, enter the API Keys obtained above, and the login is successful.
+wandb login
+```
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/25873202/206070473-201795e0-c81f-4247-842a-16d6acae0474.png" alt="Image"/>
+</div>
+
+Add the `wandb` configuration at the end of config file we just created, `configs/custom_dataset/yolov5_s-v61_syncbn_fast_1xb32-100e_cat.py`.
+
+```python
+visualizer = dict(vis_backends=[dict(type='LocalVisBackend'), dict(type='WandbVisBackend')])
+```
+
+#### 9.1.2 TensorBoard
+
+Install Tensorboard environment
+
+```shell
+pip install tensorboard
+```
+
+Add the `tensorboard` configuration at the end of config file we just created, `configs/custom_dataset/yolov5_s-v61_syncbn_fast_1xb32-100e_cat.py`.
+
+```python
+visualizer = dict(vis_backends=[dict(type='LocalVisBackend'),dict(type='TensorboardVisBackend')])
+```
+
+After running the training command, Tensorboard files will be generated in the visualization folder `work_dirs/yolov5_s-v61_syncbn_fast_1xb32-100e_cat/${TIMESTAMP}/vis_data`. We can use Tensorboard to view the loss, learning rate, and coco/bbox_mAP visualizations from a web link by running the following command:
+
+```shell
+tensorboard --logdir=work_dirs/yolov5_s-v61_syncbn_fast_1xb32-100e_cat
+```
+
+### 9.2 Perform training
+
+Let's start the training with the following command (training takes about 2.5 hours) :
+
+```shell
+python tools/train.py configs/custom_dataset/yolov5_s-v61_syncbn_fast_1xb32-100e_cat.py
+```
+
+If you have enabled wandb, you can log in to your account to view the details of this training in wandb:
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/25873202/206097557-7b10cf0f-8a16-4ba6-8563-b0a3cb149537.png" alt="Image"/>
+</div>
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/25873202/206097706-7e131bf7-f3bf-43fb-9fe5-5589a324de69.png" alt="Image"/>
+</div>
+
+The following is `1 x 3080Ti`, `batch size = 32`, training `100 epoch` optimal precision weight `work_dirs/yolov5_s-v61_syncbn_fast_1xb32-100e_cat/best_coco/bbox_mAP_epoch_98.pth` obtained accuracy (see Appendix for detailed machine information):
+
+```shell
+ Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.968
+ Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 1.000
+ Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 1.000
+ Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = -1.000
+ Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = -1.000
+ Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.968
+ Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.886
+ Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.977
+ Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.977
+ Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = -1.000
+ Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = -1.000
+ Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.977
+
+bbox_mAP_copypaste: 0.968 1.000 1.000 -1.000 -1.000 0.968
+Epoch(val) [98][116/116]  coco/bbox_mAP: 0.9680  coco/bbox_mAP_50: 1.0000  coco/bbox_mAP_75: 1.0000  coco/bbox_mAP_s: -1.0000  coco/bbox_mAP_m: -1.0000  coco/bbox_mAP_l: 0.9680
+```
+
+```{Tip}
+In general finetune best practice, it is recommended that backbone be left out of training and that the learning rate lr be scaled accordingly. However, in this tutorial, we found this approach can fall short to some extent. The possible reason is that the cat category is already in the COCO dataset, and the cat dataset used in this tutorial is relatively small
+```
+
+The following table shows the test accuracy of the MMYOLO YOLOv5 pre-trained model `yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth` without finetune on the cat dataset. It can be seen that the mAP of the `cat` category is only `0.866`, which improve to `0.968` after finetune, improved by '10.2%', which proves that the training was very successful:
+
+```shell
++---------------+-------+--------------+-----+----------------+------+
+| category      | AP    | category     | AP  | category       | AP   |
++---------------+-------+--------------+-----+----------------+------+
+| person        | nan   | bicycle      | nan | car            | nan  |
+| motorcycle    | nan   | airplane     | nan | bus            | nan  |
+| train         | nan   | truck        | nan | boat           | nan  |
+| traffic light | nan   | fire hydrant | nan | stop sign      | nan  |
+| parking meter | nan   | bench        | nan | bird           | nan  |
+| cat           | 0.866 | dog          | nan | horse          | nan  |
+| sheep         | nan   | cow          | nan | elephant       | nan  |
+| bear          | nan   | zebra        | nan | giraffe        | nan  |
+| backpack      | nan   | umbrella     | nan | handbag        | nan  |
+| tie           | nan   | suitcase     | nan | frisbee        | nan  |
+| skis          | nan   | snowboard    | nan | sports ball    | nan  |
+| kite          | nan   | baseball bat | nan | baseball glove | nan  |
+| skateboard    | nan   | surfboard    | nan | tennis racket  | nan  |
+| bottle        | nan   | wine glass   | nan | cup            | nan  |
+| fork          | nan   | knife        | nan | spoon          | nan  |
+| bowl          | nan   | banana       | nan | apple          | nan  |
+| sandwich      | nan   | orange       | nan | broccoli       | nan  |
+| carrot        | nan   | hot dog      | nan | pizza          | nan  |
+| donut         | nan   | cake         | nan | chair          | nan  |
+| couch         | nan   | potted plant | nan | bed            | nan  |
+| dining table  | nan   | toilet       | nan | tv             | nan  |
+| laptop        | nan   | mouse        | nan | remote         | nan  |
+| keyboard      | nan   | cell phone   | nan | microwave      | nan  |
+| oven          | nan   | toaster      | nan | sink           | nan  |
+| refrigerator  | nan   | book         | nan | clock          | nan  |
+| vase          | nan   | scissors     | nan | teddy bear     | nan  |
+| hair drier    | nan   | toothbrush   | nan | None           | None |
++---------------+-------+--------------+-----+----------------+------+
+```
+
+```{SeeAlso}
+For details on how to get the accuracy of the pre-trained weights, see the appendix【2. How to test the accuracy of dataset on pre-trained weights】
+```
+
+### 9.3 Switch other models in MMYOLO
+
+MMYOLO integrates multiple YOLO algorithms, which makes switching between YOLO models very easy. There is no need to reacquaint with a new repo. You can easily switch between YOLO models by simply modifying the config file:
+
+1. Create a new config file
+2. Download the pre-trained weights
+3. Starting training
+
+Let's take YOLOv6-s as an example.
+
+1. Create a new config file:
+
+```python
+_base_ = '../yolov6/yolov6_s_syncbn_fast_8xb32-400e_coco.py'
+
+max_epochs = 100  # maximum of training epoch
+data_root = './data/cat/'  # absolute path to the dataset directory
+
+# the path of result save, can be omitted, omitted save file name is located under work_dirs with the same name of config file.
+# If a config variable changes only part of its parameters, changing this variable will save the new training file elsewhere
+work_dir = './work_dirs/yolov6_s_syncbn_fast_1xb32-100e_cat'
+
+# load_from can specify a local path or URL, setting the URL will automatically download, because the above has been downloaded, we set the local path here
+# since this tutorial is fine-tuning on the cat dataset, we need to use `load_from` to load the pre-trained model from MMYOLO. This allows for faster convergence and accuracy
+load_from = './work_dirs/yolov6_s_syncbn_fast_8xb32-400e_coco_20221102_203035-932e1d91.pth'  # noqa
+
+# according to your GPU situation, modify the batch size, and YOLOv6-s defaults to 8 cards x 32bs
+train_batch_size_per_gpu = 32
+train_num_workers = 4  # recommend to use  train_num_workers = nGPU x 4
+
+save_epoch_intervals = 2  # save weights every interval round
+
+# according to your GPU situation, modify the base_lr, modification ratio is base_lr_default * (your_bs / default_bs)
+base_lr = _base_.base_lr / 8
+
+class_name = ('cat', )  # according to the label information of class_with_id.txt, set the class_name
+num_classes = len(class_name)
+metainfo = dict(
+    classes=class_name,
+    palette=[(220, 20, 60)]  # the color of drawing, free to set
+)
+
+train_cfg = dict(
+    max_epochs=max_epochs,
+    val_begin=20,  # number of epochs to start validation.  Here 20 is set because the accuracy of the first 20 epochs is not high and the test is not meaningful, so it is skipped
+    val_interval=save_epoch_intervals,  # the test evaluation is performed  iteratively every val_interval round
+    dynamic_intervals=[(max_epochs - _base_.num_last_epochs, 1)]
+)
+
+model = dict(
+    bbox_head=dict(
+        head_module=dict(num_classes=num_classes)),
+    train_cfg=dict(
+        initial_assigner=dict(num_classes=num_classes),
+        assigner=dict(num_classes=num_classes))
+)
+
+train_dataloader = dict(
+    batch_size=train_batch_size_per_gpu,
+    num_workers=train_num_workers,
+    dataset=dict(
+        _delete_=True,
+        type='RepeatDataset',
+        # if the dataset is too small, you can use RepeatDataset, which repeats the current dataset n times per epoch, where 5 is set.
+        times=5,
+        dataset=dict(
+            type=_base_.dataset_type,
+            data_root=data_root,
+            metainfo=metainfo,
+            ann_file='annotations/trainval.json',
+            data_prefix=dict(img='images/'),
+            filter_cfg=dict(filter_empty_gt=False, min_size=32),
+            pipeline=_base_.train_pipeline)))
+
+val_dataloader = dict(
+    dataset=dict(
+        metainfo=metainfo,
+        data_root=data_root,
+        ann_file='annotations/trainval.json',
+        data_prefix=dict(img='images/')))
+
+test_dataloader = val_dataloader
+
+val_evaluator = dict(ann_file=data_root + 'annotations/trainval.json')
+test_evaluator = val_evaluator
+
+optim_wrapper = dict(optimizer=dict(lr=base_lr))
+
+default_hooks = dict(
+    # set how many epochs to save the model, and the maximum number of models to save,`save_best` is also the best model (recommended).
+    checkpoint=dict(
+        type='CheckpointHook',
+        interval=save_epoch_intervals,
+        max_keep_ckpts=5,
+        save_best='auto'),
+    param_scheduler=dict(max_epochs=max_epochs),
+    # logger output interval
+    logger=dict(type='LoggerHook', interval=10))
+
+custom_hooks = [
+    dict(
+        type='EMAHook',
+        ema_type='ExpMomentumEMA',
+        momentum=0.0001,
+        update_buffers=True,
+        strict_load=False,
+        priority=49),
+    dict(
+        type='mmdet.PipelineSwitchHook',
+        switch_epoch=max_epochs - _base_.num_last_epochs,
+        switch_pipeline=_base_.train_pipeline_stage2)
+]
+
+```
+
+```{Note}
+Similarly, We put an identical config file in `projects/misc/custom_dataset/yolov6_s_syncbn_fast_1xb32-100e_cat.py`. You can choose to copy to `configs/custom_dataset/yolov6_s_syncbn_fast_1xb32-100e_cat.py` to start training directly.
+
+Even though the new config looks like a lot of stuff, it's actually a lot of duplication. You can use a comparison software to see that most of the configuration is identical to 'yolov5_s-v61_syncbn_fast_1xb32-100e_cat.py'. Because the two config files need to inherit from different config files, you still need to add the necessary configuration.
+```
+
+2. Download the pre-trained weights
+
+```bash
+wget https://download.openmmlab.com/mmyolo/v0/yolov6/yolov6_s_syncbn_fast_8xb32-400e_coco/yolov6_s_syncbn_fast_8xb32-400e_coco_20221102_203035-932e1d91.pth -P work_dirs/
+```
+
+3. Starting training
+
+```shell
+python tools/train.py configs/custom_dataset/yolov6_s_syncbn_fast_1xb32-100e_cat.py
+```
+
+In my experiments, the best model is `work_dirs/yolov6_s_syncbn_fast_1xb32-100e_cat/best_coco/bbox_mAP_epoch_96.pth`,which accuracy is as follows:
+
+```bash
+ Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.987
+ Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 1.000
+ Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 1.000
+ Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = -1.000
+ Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = -1.000
+ Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.987
+ Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.895
+ Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.989
+ Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.989
+ Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = -1.000
+ Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = -1.000
+ Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.989
+
+bbox_mAP_copypaste: 0.987 1.000 1.000 -1.000 -1.000 0.987
+Epoch(val) [96][116/116]  coco/bbox_mAP: 0.9870  coco/bbox_mAP_50: 1.0000  coco/bbox_mAP_75: 1.0000  coco/bbox_mAP_s: -1.0000  coco/bbox_mAP_m: -1.0000  coco/bbox_mAP_l: 0.9870
+```
+
+The above demonstrates how to switch models in MMYOLO, you can quickly compare the accuracy of different models, and the model with high accuracy can be put into production. In my experiment, the best accuracy of YOLOv6 `0.9870` is `1.9 %` higher than the best accuracy of YOLOv5 `0.9680` , so we will use YOLOv6 for explanation.
+
+## 10. Inference
+
+Using the best model for inference, the best model path in the following command is `./work_dirs/yolov6_s_syncbn_fast_1xb32-100e_cat/best_coco/bbox_mAP_epoch_96.pth`, please modify the best model path you trained.
+
+```shell
+python demo/image_demo.py ./data/cat/images \
+                          ./configs/custom_dataset/yolov6_s_syncbn_fast_1xb32-100e_cat.py \
+                          ./work_dirs/yolov6_s_syncbn_fast_1xb32-100e_cat/best_coco/bbox_mAP_epoch_96.pth \
+                          --out-dir ./data/cat/pred_images
+```
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/25873202/204773727-5d3cbbad-1265-45a0-822a-887713555049.jpg" alt="Image"/>
+</div>
+
+```{Tip}
+If the inference result is not ideal, here are two cases:
+
+1. Model underfitting:
+
+   First, we need to determine if there is not enough training epochs resulting in underfitting. If there is not enough training, we need to change the `max_epochs` and `work_dir` parameters in the config file, or create a new config file named as above and start the training again.
+
+2. The dataset needs to be optimized:
+   If adding epochs still doesn't work, we can increase the number of datasets and re-examine and refine the annotations of the dataset before retraining.
+```
+
+## 11. Deployment
+
+MMYOLO provides two deployment options:
+
+1. [MMDeploy](https://github.com/open-mmlab/mmdeploy) framework for deployment
+2. Using `projects/easydeploy` to deployment
+
+### 11.1 MMDeploy framework for deployment
+
+Considering that the wide variety of machine deployments, there are many times when a local machine will work, but not in production. Here, we recommended to use Docker, so that the environment can be deployed once and used for life, saving the time of operation and maintenance to build the environment and deploy production.
+
+In this part, we will introduce the following steps:
+
+1. Building a Docker image
+2. Creating a Docker container
+3. Transforming TensorRT models
+4. Deploying model and performing inference
+
+```{SeeAlso}
+If you are not familiar with Docker, you can refer to the MMDeploy [source manual installation].(https://mmdeploy.readthedocs.io/en/latest/01-how-to-build/build_from_source.html) file to compile directly locally. Once installed, you can skip to【11.1.3 Transforming TensorRT models】
+```
+
+#### 11.1.1 Building a Docker image
+
+```shell
+git clone -b dev-1.x https://github.com/open-mmlab/mmdeploy.git
+cd mmdeploy
+docker build docker/GPU/ -t mmdeploy:gpu --build-arg USE_SRC_INSIDE=true
+```
+
+Where `USE_SRC_INSIDE=true` is to pull the basis after switching the domestic source, the build speed will be faster.
+
+After executing the script, the build will start, which will take a while:
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/25873202/205482447-329186c8-eba3-443f-b1fa-b33c2ab3d5da.png" alt="Image"/>
+</div>
+
+#### 11.1.2 Creating a Docker container
+
+```shell
+export MMYOLO_PATH=/path/to/local/mmyolo # write the path to MMYOLO on your machine to an environment variable
+docker run --gpus all --name mmyolo-deploy -v ${MMYOLO_PATH}:/root/workspace/mmyolo -it mmdeploy:gpu /bin/bash
+```
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/25873202/205536974-1eeb2901-9b14-4851-9c96-5046cd05f171.png" alt="Image"/>
+</div>
+
+You can see your local MMYOLO environment mounted inside the container
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/25873202/205537473-0afc16c3-c6d4-451a-96d7-1a2388341b60.png" alt="Image"/>
+</div>
+
+```{SeeAlso}
+You can read more about this in the MMDeploy official documentation [Using Docker Images](https://mmdeploy.readthedocs.io/en/latest/01-how-to-build/build_from_docker.html#docker)
+```
+
+#### 11.1.3 Transforming TensorRT models
+
+The first step is to install MMYOLO and `pycuda` in a Docker container:
+
+```shell
+export MMYOLO_PATH=/root/workspace/mmyolo # path in the image, which doesn't need to modify
+cd ${MMYOLO_PATH}
+export MMYOLO_VERSION=$(python -c "import mmyolo.version as v; print(v.__version__)")  # Check the version number of MMYOLO used for training
+echo "Using MMYOLO ${MMYOLO_VERSION}"
+mim install --no-cache-dir mmyolo==${MMYOLO_VERSION}
+pip install --no-cache-dir pycuda==2022.2
+```
+
+Performing model transformations
+
+```shell
+cd /root/workspace/mmdeploy
+python ./tools/deploy.py \
+    ${MMYOLO_PATH}/configs/deploy/detection_tensorrt-fp16_dynamic-192x192-960x960.py \
+    ${MMYOLO_PATH}/configs/custom_dataset/yolov6_s_syncbn_fast_1xb32-100e_cat.py \
+    ${MMYOLO_PATH}/work_dirs/yolov6_s_syncbn_fast_1xb32-100e_cat/best_coco/bbox_mAP_epoch_96.pth \
+    ${MMYOLO_PATH}/data/cat/images/mmexport1633684751291.jpg \
+    --test-img ${MMYOLO_PATH}/data/cat/images/mmexport1633684751291.jpg \
+    --work-dir ./work_dir/yolov6_s_syncbn_fast_1xb32-100e_cat_deploy_dynamic_fp16 \
+    --device cuda:0 \
+    --log-level INFO \
+    --show \
+    --dump-info
+```
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/25873202/206736259-72b76698-cba4-4472-909d-0fd866b45d55.png" alt="Image"/>
+</div>
+
+Wait for a few minutes, `All process success.` appearance indicates success:
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/25873202/206736030-3b702929-4fcb-4cec-a6ce-f22a94777f6c.png" alt="Image"/>
+</div>
+
+Looking at the exported path, you can see the file structure as shown in the following screenshot:
+
+```shell
+$WORK_DIR
+  ├── deploy.json
+  ├── detail.json
+  ├── end2end.engine
+  ├── end2end.onnx
+  └── pipeline.json
+```
+
+```{SeeAlso}
+For a detailed description of transforming models, see [How to Transform Models](https://mmdeploy.readthedocs.io/en/latest/02-how-to-run/convert_model.html)
+```
+
+#### 11.1.4 Deploying model and performing inference
+
+We need to change the `data_root` in `${MMYOLO_PATH}/configs/custom_dataset/yolov6_s_syncbn_fast_1xb32-100e_cat.py` to the path in the Docker container:
+
+```python
+data_root = '/root/workspace/mmyolo/data/cat/'  # absolute path of the dataset dir in the Docker container.
+```
+
+Execute speed and accuracy tests:
+
+```shell
+python tools/test.py \
+    ${MMYOLO_PATH}/configs/deploy/detection_tensorrt-fp16_dynamic-192x192-960x960.py \
+    ${MMYOLO_PATH}/configs/custom_dataset/yolov6_s_syncbn_fast_1xb32-100e_cat.py \
+    --model ./work_dir/yolov6_s_syncbn_fast_1xb32-100e_cat_deploy_dynamic_fp16/end2end.engine \
+    --speed-test \
+    --device cuda
+```
+
+The speed test is as follows, we can see that the average inference speed is `24.10ms`, which is a speed improvement compared to PyTorch inference, but also reduce lots of video memory usage:
+
+```shell
+Epoch(test) [ 10/116]    eta: 0:00:20  time: 0.1919  data_time: 0.1330  memory: 12
+Epoch(test) [ 20/116]    eta: 0:00:15  time: 0.1220  data_time: 0.0939  memory: 12
+Epoch(test) [ 30/116]    eta: 0:00:12  time: 0.1168  data_time: 0.0850  memory: 12
+Epoch(test) [ 40/116]    eta: 0:00:10  time: 0.1241  data_time: 0.0940  memory: 12
+Epoch(test) [ 50/116]    eta: 0:00:08  time: 0.0974  data_time: 0.0696  memory: 12
+Epoch(test) [ 60/116]    eta: 0:00:06  time: 0.0865  data_time: 0.0547  memory: 16
+Epoch(test) [ 70/116]    eta: 0:00:05  time: 0.1521  data_time: 0.1226  memory: 16
+Epoch(test) [ 80/116]    eta: 0:00:04  time: 0.1364  data_time: 0.1056  memory: 12
+Epoch(test) [ 90/116]    eta: 0:00:03  time: 0.0923  data_time: 0.0627  memory: 12
+Epoch(test) [100/116]    eta: 0:00:01  time: 0.0844  data_time: 0.0583  memory: 12
+[tensorrt]-110 times per count: 24.10 ms, 41.50 FPS
+Epoch(test) [110/116]    eta: 0:00:00  time: 0.1085  data_time: 0.0832  memory: 12
+```
+
+Accuracy test is as follows. This configuration uses FP16 format inference, which has some drop points, but it is faster and uses less video memory:
+
+```shell
+ Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.954
+ Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 1.000
+ Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.975
+ Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = -1.000
+ Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = -1.000
+ Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.954
+ Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.860
+ Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.965
+ Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.965
+ Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = -1.000
+ Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = -1.000
+ Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.965
+
+INFO - bbox_mAP_copypaste: 0.954 1.000 0.975 -1.000 -1.000 0.954
+INFO - Epoch(test) [116/116]  coco/bbox_mAP: 0.9540  coco/bbox_mAP_50: 1.0000  coco/bbox_mAP_75: 0.9750  coco/bbox_mAP_s: -1.0000  coco/bbox_mAP_m: -1.0000  coco/bbox_mAP_l: 0.9540
+```
+
+Deployment model and inference demonstration:
+
+```{Note}
+You can use the MMDeploy SDK for deployment and use C++ to further improve inference speed.
+```
+
+```shell
+cd ${MMYOLO_PATH}/demo
+python deploy_demo.py \
+    ${MMYOLO_PATH}/data/cat/images/mmexport1633684900217.jpg \
+    ${MMYOLO_PATH}/configs/custom_dataset/yolov6_s_syncbn_fast_1xb32-100e_cat.py \
+    /root/workspace/mmdeploy/work_dir/yolov6_s_syncbn_fast_1xb32-100e_cat_deploy_dynamic_fp16/end2end.engine \
+    --deploy-cfg ${MMYOLO_PATH}/configs/deploy/detection_tensorrt-fp16_dynamic-192x192-960x960.py \
+    --out-dir ${MMYOLO_PATH}/work_dirs/deploy_predict_out \
+    --device cuda:0 \
+    --score-thr 0.5
+```
+
+```{Warning}
+The script `deploy_demo.py` doesn't achieve batch inference, and the pre-processing code needs to be improved. It cannot fully show the inference speed at the moment, only demonstrate the inference results. we will optimize in the future. Expect!
+```
+
+After executing, you can see the inference image results in `--out-dir` :
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/25873202/205815829-6f85e655-722a-47c8-9e23-2a74437c0923.jpg" alt="Image"/>
+</div>
+
+```{Note}
+You can also use other optimizations like increasing batch size, int8 quantization, etc.
+```
+
+#### 11.1.5 Save and load the Docker container
+
+It would be a waste of time to build a docker image every time. At this point you can consider using docker's packaging api for packaging and loading.
+
+```shell
+# save, the result tar package can be placed on mobile hard disk
+docker save mmyolo-deploy > mmyolo-deploy.tar
+
+# load image to system
+docker load < /path/to/mmyolo-deploy.tar
+```
+
+### 11.2 Using `projects/easydeploy` to deploy
+
+```{SeeAlso}
+See [deployment documentation](https://github.com/open-mmlab/mmyolo/blob/dev/projects/easydeploy/README.md) for details.
+```
+
+TODO: This part will be improved in the next version...
+
+## Appendix
+
+### 1. The detailed environment for training the machine in this tutorial is as follows:
+
+```shell
+sys.platform: linux
+Python: 3.9.13 | packaged by conda-forge | (main, May 27 2022, 16:58:50) [GCC 10.3.0]
+CUDA available: True
+numpy_random_seed: 2147483648
+GPU 0: NVIDIA GeForce RTX 3080 Ti
+CUDA_HOME: /usr/local/cuda
+NVCC: Cuda compilation tools, release 11.5, V11.5.119
+GCC: gcc (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0
+PyTorch: 1.10.0
+PyTorch compiling details: PyTorch built with:
+  - GCC 7.3
+  - C++ Version: 201402
+  - Intel(R) oneAPI Math Kernel Library Version 2021.4-Product Build 20210904 for Intel(R) 64 architecture applications
+  - Intel(R) MKL-DNN v2.2.3 (Git Hash 7336ca9f055cf1bfa13efb658fe15dc9b41f0740)
+  - OpenMP 201511 (a.k.a. OpenMP 4.5)
+  - LAPACK is enabled (usually provided by MKL)
+  - NNPACK is enabled
+  - CPU capability usage: AVX2
+  - CUDA Runtime 11.3
+  - NVCC architecture flags: -gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;
+                             arch=compute_60,code=sm_60;-gencode;arch=compute_61,code=sm_61;-gencode;arch=compute_70,code=sm_70;
+                             -gencode;arch=compute_75,code=sm_75;-gencode;arch=compute_80,code=sm_80;-gencode;
+                             arch=compute_86,code=sm_86;-gencode;arch=compute_37,code=compute_37
+  - CuDNN 8.2
+  - Magma 2.5.2
+  - Build settings: BLAS_INFO=mkl, BUILD_TYPE=Release, CUDA_VERSION=11.3, CUDNN_VERSION=8.2.0,
+                    CXX_COMPILER=/opt/rh/devtoolset-7/root/usr/bin/c++, CXX_FLAGS= -Wno-deprecated -fvisibility-inlines-hidden
+                    -DUSE_PTHREADPOOL -fopenmp -DNDEBUG -DUSE_KINETO -DUSE_FBGEMM -DUSE_QNNPACK -DUSE_PYTORCH_QNNPACK -DUSE_XNNPACK
+                    -DSYMBOLICATE_MOBILE_DEBUG_HANDLE -DEDGE_PROFILER_USE_KINETO -O2 -fPIC -Wno-narrowing -Wall -Wextra
+                    -Werror=return-type -Wno-missing-field-initializers -Wno-type-limits -Wno-array-bounds -Wno-unknown-pragmas
+                    -Wno-sign-compare -Wno-error=deprecated-declarations -Wno-stringop-overflow -Wno-psabi -Wno-error=pedantic
+                    -Wno-error=redundant-decls -Wno-error=old-style-cast -fdiagnostics-color=always -faligned-new
+                    -Wno-unused-but-set-variable -Wno-maybe-uninitialized -fno-math-errno -fno-trapping-math -Werror=format
+                    -Wno-stringop-overflow, LAPACK_INFO=mkl, PERF_WITH_AVX=1, PERF_WITH_AVX2=1, PERF_WITH_AVX512=1,
+                    TORCH_VERSION=1.10.0, USE_CUDA=ON, USE_CUDNN=ON, USE_EXCEPTION_PTR=1, USE_GFLAGS=OFF, USE_GLOG=OFF, USE_MKL=ON,
+                    USE_MKLDNN=ON, USE_MPI=OFF, USE_NCCL=ON, USE_NNPACK=ON, USE_OPENMP=ON,
+
+TorchVision: 0.11.0
+OpenCV: 4.6.0
+MMEngine: 0.3.1
+MMCV: 2.0.0rc3
+MMDetection: 3.0.0rc3
+MMYOLO: 0.2.0+cf279a5
+```
+
+### 2. How to test the accuracy of our dataset on the pre-trained weights:
+
+```{Warning}
+Premise: The class is in the COCO 80 class!
+```
+
+In this part, we will use the `cat` dataset as an example, using:
+
+- config file: `configs/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py`
+- weight `yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth`
+
+1. modify the path in config file
+
+Because `configs/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py` is inherited from `configs/yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py`. Therefore, you can mainly modify the `configs/yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py` file.
+
+| before modification                                                            | after modification                                                          |
+| ------------------------------------------------------------------------------ | --------------------------------------------------------------------------- |
+| `data_root = 'data/coco/'`                                                     | `data_root = './data/cat/'`                                                 |
+| `ann_file='annotations/instances_train2017.json'`                              | `ann_file='annotations/trainval.json'`                                      |
+| data_prefix=dict(img='train2017/')\`                                           | `data_prefix=dict(img='images/')`                                           |
+| `val_evaluator` of `ann_file=data_root + 'annotations/instances_val2017.json'` | `val_evaluator` of `dict(ann_file=data_root + 'annotations/trainval.json')` |
+
+2. modify label
+
+```{note}
+It is recommended to make a copy of the label directly to prevent damage to original label
+```
+
+Change the `categories` in `trainval.json` to COCO's original:
+
+```json
+  "categories": [{"supercategory": "person","id": 1,"name": "person"},{"supercategory": "vehicle","id": 2,"name": "bicycle"},{"supercategory": "vehicle","id": 3,"name": "car"},{"supercategory": "vehicle","id": 4,"name": "motorcycle"},{"supercategory": "vehicle","id": 5,"name": "airplane"},{"supercategory": "vehicle","id": 6,"name": "bus"},{"supercategory": "vehicle","id": 7,"name": "train"},{"supercategory": "vehicle","id": 8,"name": "truck"},{"supercategory": "vehicle","id": 9,"name": "boat"},{"supercategory": "outdoor","id": 10,"name": "traffic light"},{"supercategory": "outdoor","id": 11,"name": "fire hydrant"},{"supercategory": "outdoor","id": 13,"name": "stop sign"},{"supercategory": "outdoor","id": 14,"name": "parking meter"},{"supercategory": "outdoor","id": 15,"name": "bench"},{"supercategory": "animal","id": 16,"name": "bird"},{"supercategory": "animal","id": 17,"name": "cat"},{"supercategory": "animal","id": 18,"name": "dog"},{"supercategory": "animal","id": 19,"name": "horse"},{"supercategory": "animal","id": 20,"name": "sheep"},{"supercategory": "animal","id": 21,"name": "cow"},{"supercategory": "animal","id": 22,"name": "elephant"},{"supercategory": "animal","id": 23,"name": "bear"},{"supercategory": "animal","id": 24,"name": "zebra"},{"supercategory": "animal","id": 25,"name": "giraffe"},{"supercategory": "accessory","id": 27,"name": "backpack"},{"supercategory": "accessory","id": 28,"name": "umbrella"},{"supercategory": "accessory","id": 31,"name": "handbag"},{"supercategory": "accessory","id": 32,"name": "tie"},{"supercategory": "accessory","id": 33,"name": "suitcase"},{"supercategory": "sports","id": 34,"name": "frisbee"},{"supercategory": "sports","id": 35,"name": "skis"},{"supercategory": "sports","id": 36,"name": "snowboard"},{"supercategory": "sports","id": 37,"name": "sports ball"},{"supercategory": "sports","id": 38,"name": "kite"},{"supercategory": "sports","id": 39,"name": "baseball bat"},{"supercategory": "sports","id": 40,"name": "baseball glove"},{"supercategory": "sports","id": 41,"name": "skateboard"},{"supercategory": "sports","id": 42,"name": "surfboard"},{"supercategory": "sports","id": 43,"name": "tennis racket"},{"supercategory": "kitchen","id": 44,"name": "bottle"},{"supercategory": "kitchen","id": 46,"name": "wine glass"},{"supercategory": "kitchen","id": 47,"name": "cup"},{"supercategory": "kitchen","id": 48,"name": "fork"},{"supercategory": "kitchen","id": 49,"name": "knife"},{"supercategory": "kitchen","id": 50,"name": "spoon"},{"supercategory": "kitchen","id": 51,"name": "bowl"},{"supercategory": "food","id": 52,"name": "banana"},{"supercategory": "food","id": 53,"name": "apple"},{"supercategory": "food","id": 54,"name": "sandwich"},{"supercategory": "food","id": 55,"name": "orange"},{"supercategory": "food","id": 56,"name": "broccoli"},{"supercategory": "food","id": 57,"name": "carrot"},{"supercategory": "food","id": 58,"name": "hot dog"},{"supercategory": "food","id": 59,"name": "pizza"},{"supercategory": "food","id": 60,"name": "donut"},{"supercategory": "food","id": 61,"name": "cake"},{"supercategory": "furniture","id": 62,"name": "chair"},{"supercategory": "furniture","id": 63,"name": "couch"},{"supercategory": "furniture","id": 64,"name": "potted plant"},{"supercategory": "furniture","id": 65,"name": "bed"},{"supercategory": "furniture","id": 67,"name": "dining table"},{"supercategory": "furniture","id": 70,"name": "toilet"},{"supercategory": "electronic","id": 72,"name": "tv"},{"supercategory": "electronic","id": 73,"name": "laptop"},{"supercategory": "electronic","id": 74,"name": "mouse"},{"supercategory": "electronic","id": 75,"name": "remote"},{"supercategory": "electronic","id": 76,"name": "keyboard"},{"supercategory": "electronic","id": 77,"name": "cell phone"},{"supercategory": "appliance","id": 78,"name": "microwave"},{"supercategory": "appliance","id": 79,"name": "oven"},{"supercategory": "appliance","id": 80,"name": "toaster"},{"supercategory": "appliance","id": 81,"name": "sink"},{"supercategory": "appliance","id": 82,"name": "refrigerator"},{"supercategory": "indoor","id": 84,"name": "book"},{"supercategory": "indoor","id": 85,"name": "clock"},{"supercategory": "indoor","id": 86,"name": "vase"},{"supercategory": "indoor","id": 87,"name": "scissors"},{"supercategory": "indoor","id": 88,"name": "teddy bear"},{"supercategory": "indoor","id": 89,"name": "hair drier"},{"supercategory": "indoor","id": 90,"name": "toothbrush"}],
+```
+
+Also, change the `category_id` in the `annotations` to the `id` corresponding to COCO, for example, `cat` is `17` in this example. Here are some of the results:
+
+```json
+  "annotations": [
+    {
+      "iscrowd": 0,
+      "category_id": 17, # This "category_id" is changed to the id corresponding to COCO, for example, cat is 17
+      "id": 32,
+      "image_id": 32,
+      "bbox": [
+        822.49072265625,
+        958.3897094726562,
+        1513.693115234375,
+        988.3231811523438
+      ],
+      "area": 1496017.9949368387,
+      "segmentation": [
+        [
+          822.49072265625,
+          958.3897094726562,
+          822.49072265625,
+          1946.712890625,
+          2336.183837890625,
+          1946.712890625,
+          2336.183837890625,
+          958.3897094726562
+        ]
+      ]
+    }
+  ]
+```
+
+3. executive command
+
+```shell
+python tools\test.py configs/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py \
+                     work_dirs/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth \
+                     --cfg-options test_evaluator.classwise=True
+```
+
+After executing it, we can see the test metrics:
+
+```shell
++---------------+-------+--------------+-----+----------------+------+
+| category      | AP    | category     | AP  | category       | AP   |
++---------------+-------+--------------+-----+----------------+------+
+| person        | nan   | bicycle      | nan | car            | nan  |
+| motorcycle    | nan   | airplane     | nan | bus            | nan  |
+| train         | nan   | truck        | nan | boat           | nan  |
+| traffic light | nan   | fire hydrant | nan | stop sign      | nan  |
+| parking meter | nan   | bench        | nan | bird           | nan  |
+| cat           | 0.866 | dog          | nan | horse          | nan  |
+| sheep         | nan   | cow          | nan | elephant       | nan  |
+| bear          | nan   | zebra        | nan | giraffe        | nan  |
+| backpack      | nan   | umbrella     | nan | handbag        | nan  |
+| tie           | nan   | suitcase     | nan | frisbee        | nan  |
+| skis          | nan   | snowboard    | nan | sports ball    | nan  |
+| kite          | nan   | baseball bat | nan | baseball glove | nan  |
+| skateboard    | nan   | surfboard    | nan | tennis racket  | nan  |
+| bottle        | nan   | wine glass   | nan | cup            | nan  |
+| fork          | nan   | knife        | nan | spoon          | nan  |
+| bowl          | nan   | banana       | nan | apple          | nan  |
+| sandwich      | nan   | orange       | nan | broccoli       | nan  |
+| carrot        | nan   | hot dog      | nan | pizza          | nan  |
+| donut         | nan   | cake         | nan | chair          | nan  |
+| couch         | nan   | potted plant | nan | bed            | nan  |
+| dining table  | nan   | toilet       | nan | tv             | nan  |
+| laptop        | nan   | mouse        | nan | remote         | nan  |
+| keyboard      | nan   | cell phone   | nan | microwave      | nan  |
+| oven          | nan   | toaster      | nan | sink           | nan  |
+| refrigerator  | nan   | book         | nan | clock          | nan  |
+| vase          | nan   | scissors     | nan | teddy bear     | nan  |
+| hair drier    | nan   | toothbrush   | nan | None           | None |
++---------------+-------+--------------+-----+----------------+------+
+```
diff --git a/mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/mm_basics.md b/mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/mm_basics.md
new file mode 100644
index 0000000..9f23cfe
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/mm_basics.md
@@ -0,0 +1 @@
+# MM series repo essential basics
diff --git a/mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/model_design.md b/mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/model_design.md
new file mode 100644
index 0000000..e1fc5b8
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/model_design.md
@@ -0,0 +1,106 @@
+# Model design instructions
+
+## YOLO series model basic class
+
+The structural figure is provided by RangeKing@GitHub. Thank you RangeKing!
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/27466624/199999337-0544a4cb-3cbd-4f3e-be26-bcd9e74db7ff.jpg" alt="BaseModule-P5">
+Figure 1: P5 model structure
+</div>
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/27466624/200850066-0c434173-2d40-4c12-8de3-eda473ff172f.jpg" alt="BaseModule-P6">
+Figure 2: P6 model structure
+</div>
+
+Most YOLO series algorithms adopt a unified algorithm-building structure, typically as Darknet + PAFPN. In order to let users quickly understand the YOLO series algorithm architecture, we deliberately designed the `BaseBackbone` + `BaseYOLONeck` structure, as shown in the above figure.
+
+The benefits of the abstract `BaseBackbone` include:
+
+1. Subclasses do not need to be concerned about the forward process. Just build the model as a builder pattern.
+2. It can be configured to achieve custom plug-in functions. Users can easily insert some similar attention modules.
+3. All subclasses automatically support freezing certain stages and bn functions.
+
+`BaseYOLONeck` has the same benefits as `BaseBackbone`.
+
+### BaseBackbone
+
+- As shown in Figure 1, for P5, `BaseBackbone` includes 1 stem layer and 4 stage layers which are similar to the basic structure of ResNet.
+- As shown in Figure 2, for P6, `BaseBackbone` includes 1 stem layer and 5 stage layers.
+  Different backbone network algorithms inherit the `BaseBackbone`. Users can build each layer of the whole network by implementing customized basic modules through the internal `build_xx` method.
+
+### BaseYOLONeck
+
+We reproduce the YOLO series Neck components in the similar way as the `BaseBackbone`, and we can mainly divide them into `Reduce layer`, `UpSample layer`, `TopDown layer`, `DownSample layer`, `BottomUP layer` and `output convolution layer`. Each layer can be customized its internal construction by the inheritance and rewrite from the `build_xx` method.
+
+### BaseDenseHead
+
+MMYOLO uses the `BaseDenseHead` designed in MMDetection as the base class of the Head structure. Take YOLOv5 as an example, the forward function of its [HeadModule](https://github.com/open-mmlab/mmyolo/blob/main/mmyolo/models/dense_heads/yolov5_head.py#L2) replaces the original forward method.
+
+## HeadModule
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/33799979/190407754-c725fe85-a71b-4e45-912b-34513d1ff128.png" width=800 alt="image">
+</div>
+
+As shown in the above graph, the solid line is the implementation in [MMYOLO](https://github.com/open-mmlab/mmyolo/blob/main/mmyolo/models/dense_heads/yolov5_head.py), whereas the original implementation in [MMDetection](https://github.com/open-mmlab/mmdetection) is shown in the dotted line. MMYOLO has the following advantages over the original implementation:
+
+1. In MMDetection, `bbox_head` is split into three large components: `assigner` + `box coder` + `sampler`. But because the transfer between these three components is universal, it is necessary to encapsulate additional objects. With the unification in MMYOLO, users do not need to separate them. The advantages of not deliberately forcing the division of the three components are: data encapsulation of internal data is no longer required, code logic is simplified, and the difficulty of community use and algorithm reproduction is reduced.
+2. MMYOLO is Faster. When users customize the implementation algorithm, they can deeply optimize part of the code without relying on the original framework.
+
+In general, with the partly decoupled model + `loss_by_feat` part in MMYOLO, users can construct any model with any `loss_by_feat` by modifying the configuration. For example, applying the `loss_by_feat` of YOLOX to the YOLOv5 model, etc.
+
+Take the YOLOX configuration in MMDetection as an example, the Head module configuration is written as follows:
+
+```python
+bbox_head=dict(
+    type='YOLOXHead',
+    num_classes=80,
+    in_channels=128,
+    feat_channels=128,
+    stacked_convs=2,
+    strides=(8, 16, 32),
+    use_depthwise=False,
+    norm_cfg=dict(type='BN', momentum=0.03, eps=0.001),
+    act_cfg=dict(type='Swish'),
+    ...
+    loss_obj=dict(
+        type='CrossEntropyLoss',
+        use_sigmoid=True,
+        reduction='sum',
+        loss_weight=1.0),
+    loss_l1=dict(type='L1Loss', reduction='sum', loss_weight=1.0)),
+train_cfg=dict(assigner=dict(type='SimOTAAssigner', center_radius=2.5)),
+```
+
+For the head_module in MMYOLO, the new configuration is written as follows:
+
+```python
+bbox_head=dict(
+    type='YOLOXHead',
+    head_module=dict(
+        type='YOLOXHeadModule',
+        num_classes=80,
+        in_channels=256,
+        feat_channels=256,
+        widen_factor=widen_factor,
+        stacked_convs=2,
+        featmap_strides=(8, 16, 32),
+        use_depthwise=False,
+        norm_cfg=dict(type='BN', momentum=0.03, eps=0.001),
+        act_cfg=dict(type='SiLU', inplace=True),
+    ),
+    ...
+    loss_obj=dict(
+        type='mmdet.CrossEntropyLoss',
+        use_sigmoid=True,
+        reduction='sum',
+        loss_weight=1.0),
+    loss_bbox_aux=dict(type='mmdet.L1Loss', reduction='sum', loss_weight=1.0)),
+train_cfg=dict(
+    assigner=dict(
+        type='mmdet.SimOTAAssigner',
+        center_radius=2.5,
+        iou_calculator=dict(type='mmdet.BboxOverlaps2D'))),
+```
diff --git a/mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/replace_backbone.md b/mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/replace_backbone.md
new file mode 100644
index 0000000..82d2046
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/replace_backbone.md
@@ -0,0 +1,306 @@
+# Replace the backbone network
+
+```{note}
+1. When using other backbone networks, you need to ensure that the output channels of the backbone network match the input channels of the neck network.
+2. The configuration files given below only ensure that the training will work correctly, and their training performance may not be optimal. Because some backbones require specific learning rates, optimizers, and other hyperparameters. Related contents will be added in the "Training Tips" section later.
+```
+
+## Use backbone network implemented in MMYOLO
+
+Suppose you want to use `YOLOv6EfficientRep` as the backbone network of `YOLOv5`, the example config is as the following:
+
+```python
+_base_ = './yolov5_s-v61_syncbn_8xb16-300e_coco.py'
+
+model = dict(
+    backbone=dict(
+        type='YOLOv6EfficientRep',
+        norm_cfg=dict(type='BN', momentum=0.03, eps=0.001),
+        act_cfg=dict(type='ReLU', inplace=True))
+)
+```
+
+## Use backbone network implemented in other OpenMMLab repositories
+
+The model registry in MMYOLO, MMDetection, MMClassification, and MMSegmentation all inherit from the root registry in MMEngine in the OpenMMLab 2.0 system, allowing these repositories to directly use modules already implemented by each other. Therefore, in MMYOLO, users can use backbone networks from MMDetection and MMClassification without reimplementation.
+
+### Use backbone network implemented in MMDetection
+
+1. Suppose you want to use `ResNet-50` as the backbone network of `YOLOv5`, the example config is as the following:
+
+```python
+_base_ = './yolov5_s-v61_syncbn_8xb16-300e_coco.py'
+
+deepen_factor = _base_.deepen_factor
+widen_factor = 1.0
+channels = [512, 1024, 2048]
+
+model = dict(
+    backbone=dict(
+        _delete_=True, # Delete the backbone field in _base_
+        type='mmdet.ResNet', # Using ResNet from mmdet
+        depth=50,
+        num_stages=4,
+        out_indices=(1, 2, 3),
+        frozen_stages=1,
+        norm_cfg=dict(type='BN', requires_grad=True),
+        norm_eval=True,
+        style='pytorch',
+        init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50')),
+    neck=dict(
+        type='YOLOv5PAFPN',
+        widen_factor=widen_factor,
+        in_channels=channels, # Note: The 3 channels of ResNet-50 output are [512, 1024, 2048], which do not match the original yolov5-s neck and need to be changed.
+        out_channels=channels),
+    bbox_head=dict(
+        type='YOLOv5Head',
+        head_module=dict(
+            type='YOLOv5HeadModule',
+            in_channels=channels, # input channels of head need to be changed accordingly
+            widen_factor=widen_factor))
+)
+```
+
+2. Suppose you want to use `SwinTransformer-Tiny` as the backbone network of `YOLOv5`, the example config is as the following:
+
+```python
+_base_ = './yolov5_s-v61_syncbn_8xb16-300e_coco.py'
+
+deepen_factor = _base_.deepen_factor
+widen_factor = 1.0
+channels = [192, 384, 768]
+checkpoint_file = 'https://github.com/SwinTransformer/storage/releases/download/v1.0.0/swin_tiny_patch4_window7_224.pth'  # noqa
+
+model = dict(
+    backbone=dict(
+        _delete_=True, # Delete the backbone field in _base_
+        type='mmdet.SwinTransformer', # Using SwinTransformer from mmdet
+        embed_dims=96,
+        depths=[2, 2, 6, 2],
+        num_heads=[3, 6, 12, 24],
+        window_size=7,
+        mlp_ratio=4,
+        qkv_bias=True,
+        qk_scale=None,
+        drop_rate=0.,
+        attn_drop_rate=0.,
+        drop_path_rate=0.2,
+        patch_norm=True,
+        out_indices=(1, 2, 3),
+        with_cp=False,
+        convert_weights=True,
+        init_cfg=dict(type='Pretrained', checkpoint=checkpoint_file)),
+    neck=dict(
+        type='YOLOv5PAFPN',
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+        in_channels=channels, # Note: The 3 channels of SwinTransformer-Tiny output are [192, 384, 768], which do not match the original yolov5-s neck and need to be changed.
+        out_channels=channels),
+    bbox_head=dict(
+        type='YOLOv5Head',
+        head_module=dict(
+            type='YOLOv5HeadModule',
+            in_channels=channels, # input channels of head need to be changed accordingly
+            widen_factor=widen_factor))
+)
+```
+
+### Use backbone network implemented in MMClassification
+
+1. Suppose you want to use `ConvNeXt-Tiny` as the backbone network of `YOLOv5`, the example config is as the following:
+
+```python
+_base_ = './yolov5_s-v61_syncbn_8xb16-300e_coco.py'
+
+# please run the command, mim install "mmcls>=1.0.0rc2", to install mmcls
+# import mmcls.models to trigger register_module in mmcls
+custom_imports = dict(imports=['mmcls.models'], allow_failed_imports=False)
+checkpoint_file = 'https://download.openmmlab.com/mmclassification/v0/convnext/downstream/convnext-tiny_3rdparty_32xb128-noema_in1k_20220301-795e9634.pth'  # noqa
+deepen_factor = _base_.deepen_factor
+widen_factor = 1.0
+channels = [192, 384, 768]
+
+model = dict(
+    backbone=dict(
+        _delete_=True, # Delete the backbone field in _base_
+        type='mmcls.ConvNeXt', # Using ConvNeXt from mmcls
+        arch='tiny',
+        out_indices=(1, 2, 3),
+        drop_path_rate=0.4,
+        layer_scale_init_value=1.0,
+        gap_before_final_norm=False,
+        init_cfg=dict(
+            type='Pretrained', checkpoint=checkpoint_file,
+            prefix='backbone.')), # The pre-trained weights of backbone network in MMCls have prefix='backbone.'. The prefix in the keys will be removed so that these weights can be normally loaded.
+    neck=dict(
+        type='YOLOv5PAFPN',
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+        in_channels=channels, # Note: The 3 channels of ConvNeXt-Tiny output are [192, 384, 768], which do not match the original yolov5-s neck and need to be changed.
+        out_channels=channels),
+    bbox_head=dict(
+        type='YOLOv5Head',
+        head_module=dict(
+            type='YOLOv5HeadModule',
+            in_channels=channels, # input channels of head need to be changed accordingly
+            widen_factor=widen_factor))
+)
+```
+
+2. Suppose you want to use `MobileNetV3-small` as the backbone network of `YOLOv5`, the example config is as the following:
+
+```python
+_base_ = './yolov5_s-v61_syncbn_8xb16-300e_coco.py'
+
+# please run the command, mim install "mmcls>=1.0.0rc2", to install mmcls
+# import mmcls.models to trigger register_module in mmcls
+custom_imports = dict(imports=['mmcls.models'], allow_failed_imports=False)
+checkpoint_file = 'https://download.openmmlab.com/mmclassification/v0/mobilenet_v3/convert/mobilenet_v3_small-8427ecf0.pth'  # noqa
+deepen_factor = _base_.deepen_factor
+widen_factor = 1.0
+channels = [24, 48, 96]
+
+model = dict(
+    backbone=dict(
+        _delete_=True, # Delete the backbone field in _base_
+        type='mmcls.MobileNetV3', # Using MobileNetV3 from mmcls
+        arch='small',
+        out_indices=(3, 8, 11), # Modify out_indices
+        init_cfg=dict(
+            type='Pretrained',
+            checkpoint=checkpoint_file,
+            prefix='backbone.')), # The pre-trained weights of backbone network in MMCls have prefix='backbone.'. The prefix in the keys will be removed so that these weights can be normally loaded.
+    neck=dict(
+        type='YOLOv5PAFPN',
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+        in_channels=channels, # Note: The 3 channels of MobileNetV3 output are [24, 48, 96], which do not match the original yolov5-s neck and need to be changed.
+        out_channels=channels),
+    bbox_head=dict(
+        type='YOLOv5Head',
+        head_module=dict(
+            type='YOLOv5HeadModule',
+            in_channels=channels, # input channels of head need to be changed accordingly
+            widen_factor=widen_factor))
+)
+```
+
+### Use backbone network in `timm` through MMClassification
+
+MMClassification also provides a wrapper for the Py**T**orch **Im**age **M**odels (`timm`) backbone network, users can directly use the backbone network in `timm` through MMClassification. Suppose you want to use `EfficientNet-B1` as the backbone network of `YOLOv5`, the example config is as the following:
+
+```python
+_base_ = './yolov5_s-v61_syncbn_8xb16-300e_coco.py'
+
+# please run the command, mim install "mmcls>=1.0.0rc2", to install mmcls
+# and the command, pip install timm, to install timm
+# import mmcls.models to trigger register_module in mmcls
+custom_imports = dict(imports=['mmcls.models'], allow_failed_imports=False)
+
+deepen_factor = _base_.deepen_factor
+widen_factor = 1.0
+channels = [40, 112, 320]
+
+model = dict(
+    backbone=dict(
+        _delete_=True, # Delete the backbone field in _base_
+        type='mmcls.TIMMBackbone', # Using timm from mmcls
+        model_name='efficientnet_b1', # Using efficientnet_b1 in timm
+        features_only=True,
+        pretrained=True,
+        out_indices=(2, 3, 4)),
+    neck=dict(
+        type='YOLOv5PAFPN',
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+        in_channels=channels, # Note: The 3 channels of EfficientNet-B1 output are [40, 112, 320], which do not match the original yolov5-s neck and need to be changed.
+        out_channels=channels),
+    bbox_head=dict(
+        type='YOLOv5Head',
+        head_module=dict(
+            type='YOLOv5HeadModule',
+            in_channels=channels, # input channels of head need to be changed accordingly
+            widen_factor=widen_factor))
+)
+```
+
+### Use backbone network implemented in MMSelfSup
+
+Suppose you want to use `ResNet-50` which is self-supervised trained by `MoCo v3` in MMSelfSup as the backbone network of `YOLOv5`, the example config is as the following:
+
+```python
+_base_ = './yolov5_s-v61_syncbn_8xb16-300e_coco.py'
+
+# please run the command, mim install "mmselfsup>=1.0.0rc3", to install mmselfsup
+# import mmselfsup.models to trigger register_module in mmselfsup
+custom_imports = dict(imports=['mmselfsup.models'], allow_failed_imports=False)
+checkpoint_file = 'https://download.openmmlab.com/mmselfsup/1.x/mocov3/mocov3_resnet50_8xb512-amp-coslr-800e_in1k/mocov3_resnet50_8xb512-amp-coslr-800e_in1k_20220927-e043f51a.pth'  # noqa
+deepen_factor = _base_.deepen_factor
+widen_factor = 1.0
+channels = [512, 1024, 2048]
+
+model = dict(
+    backbone=dict(
+        _delete_=True, # Delete the backbone field in _base_
+        type='mmselfsup.ResNet',
+        depth=50,
+        num_stages=4,
+        out_indices=(2, 3, 4), # Note: out_indices of ResNet in MMSelfSup are 1 larger than those in MMdet and MMCls
+        frozen_stages=1,
+        norm_cfg=dict(type='BN', requires_grad=True),
+        norm_eval=True,
+        style='pytorch',
+        init_cfg=dict(type='Pretrained', checkpoint=checkpoint_file)),
+    neck=dict(
+        type='YOLOv5PAFPN',
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+        in_channels=channels, # Note: The 3 channels of ResNet-50 output are [512, 1024, 2048], which do not match the original yolov5-s neck and need to be changed.
+        out_channels=channels),
+    bbox_head=dict(
+        type='YOLOv5Head',
+        head_module=dict(
+            type='YOLOv5HeadModule',
+            in_channels=channels, # input channels of head need to be changed accordingly
+            widen_factor=widen_factor))
+)
+```
+
+### Don't used pre-training weights
+
+When we replace the backbone network, the model initialization is trained by default loading the pre-training weight of the backbone network. Instead of using the pre-training weights of the backbone network, if you want to train the time model from scratch,
+You can set `init_cfg` in 'backbone' to 'None'. In this case, the backbone network will be initialized with the default initialization method, instead of using the trained pre-training weight.
+
+```python
+_base_ = './yolov5_s-v61_syncbn_8xb16-300e_coco.py'
+
+deepen_factor = _base_.deepen_factor
+widen_factor = 1.0
+channels = [512, 1024, 2048]
+
+model = dict(
+   backbone=dict(
+       _delete_=True, # Delete the backbone field in _base_
+       type='mmdet.ResNet', # Using ResNet from mmdet
+       depth=50,
+       num_stages=4,
+       out_indices=(1, 2, 3),
+       frozen_stages=1,
+       norm_cfg=dict(type='BN', requires_grad=True),
+       norm_eval=True,
+       style='pytorch',
+       init_cfg=None # If init_cfg is set to None, backbone will not be initialized with pre-trained weights
+   ),
+   neck=dict(
+       type='YOLOv5PAFPN',
+       widen_factor=widen_factor,
+       in_channels=channels, # Note: The 3 channels of ResNet-50 output are [512, 1024, 2048], which do not match the original yolov5-s neck and need to be changed.
+       out_channels=channels),
+   bbox_head=dict(
+       type='YOLOv5Head',
+       head_module=dict(
+           type='YOLOv5HeadModule',
+           in_channels=channels, # input channels of head need to be changed accordingly
+           widen_factor=widen_factor))
+)
+```
diff --git a/mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/training_testing_tricks.md b/mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/training_testing_tricks.md
new file mode 100644
index 0000000..48ce25f
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/training_testing_tricks.md
@@ -0,0 +1,310 @@
+# Training testing tricks
+
+MMYOLO has already supported most of the YOLO series object detection related algorithms. Different algorithms may involve some practical tricks. This section will describe in detail the commonly used training and testing tricks supported by MMYOLO based on the implemented object detection algorithms.
+
+## Training tricks
+
+### Improve performance of detection
+
+#### 1. Multi-scale training
+
+In the field of object detection, multi-scale training is a very common trick. However, in YOLO, most of the models are trained with a single-scale input of 640x640. There are two reasons for this:
+
+1. Single-scale training is faster than multi-scale training. When the training epoch is at 300 or 500, training efficiency is a major concern for users. Multi-scale training will be slower.
+2. Multi-scale augmentation is implied in the training pipeline, which is equivalent to the application of multi-scale training, such as the 'Mosaic', 'RandomAffine' and 'Resize', so there is no need to introduce the multi-scale training of model input again.
+
+Through experiments on the COCO dataset, it is founded that the multi-scale training is introduced directly after the output of YOLOv5's DataLoader, the actual performance improvement is very small. If you want to start multi-scale training for YOLO series algorithms in MMYOLO, you can refer to [ms_training_testing](../common_usage/ms_training_testing.md),
+however, this does not mean that there are no significant gains in user-defined dataset fine-tuning mode
+
+#### 2 Use Mask annotation to optimize object detection performance
+
+When the dataset annotation is complete, such as boundary box annotation and instance segmentation annotation exist at the same time, but only part of the annotation is required for the task, the task can be trained with complete data annotation to improve the performance.
+In object detection, we can also learn from instance segmentation annotation to improve the performance of object detection. The following is the detection result of additional instance segmentation annotation optimization introduced by YOLOv8. The performance gains are shown below:
+
+<div align="center">
+<img src="https://user-images.githubusercontent.com/17425982/224920799-597ee962-5997-48b3-9499-25f885d7a421.png" width="1000"/>
+</div>
+
+As shown in the figure, different scale models have different degrees of performance improvement.
+It is important to note that 'Mask Refine' only functions in the data enhancement phase and does not require any changes to other training parts of the model and does not affect the speed of training. The details are as follows:
+
+<div align="center">
+<img src="https://user-images.githubusercontent.com/17425982/224922191-a52cb410-d08d-455a-bd38-08b83266cc5f.png" width="1000"/>
+</div>
+
+The above-mentioned Mask represents a data augmentation transformation in which instance segmentation annotations play a key role.
+The application of this technique to other YOLO series has varying degrees of increase.
+
+#### 3 Turn off strong augmentation in the later stage of training to improve detection performance
+
+This strategy is proposed for the first time in YOLOX algorithm and can greatly improve the detection performance.
+The paper points out that Mosaic+MixUp can greatly improve the target detection performance, but the training pictures are far from the real distribution of natural pictures, and Mosaic's large number of cropping operations will bring many inaccurate label boxes,
+therefore, YOLOX proposes to turn off the strong enhancement in the last 15 epochs and use the weaker enhancement instead, so that the detector can avoid the influence of inaccurate labeled boxes and complete the final convergence under the data distribution of the natural picture.
+
+This strategy has been applied to most YOLO algorithms. Taking YOLOv8 as an example, its data augmentation pipeline is shown as follows:
+
+<div align="center">
+<img src="https://user-images.githubusercontent.com/17425982/224923285-dd23e419-1d9d-4ee6-bec6-af0a6ef5fed0.png" width="400"/>
+</div>
+
+However, when to turn off the strong augmentation is a hyper-parameter. If you turn off the strong augmentation too early, it may not give full play to Mosaic and other strong augmentation effects. If you turn off the strong enhancement too late, it will have no gain because it has been overfitted before. This phenomenon can be observed in YOLOv8 experiment
+
+| Backbone | Mask Refine |   box AP    | Epoch of best mAP |
+| :------: | :---------: | :---------: | :---------------: |
+| YOLOv8-n |     No      |    37.2     |        500        |
+| YOLOv8-n |     Yes     | 37.4 (+0.2) |        499        |
+| YOLOv8-s |     No      |    44.2     |        430        |
+| YOLOv8-s |     Yes     | 45.1 (+0.9) |        460        |
+| YOLOv8-m |     No      |    49.8     |        460        |
+| YOLOv8-m |     Yes     | 50.6 (+0.8) |        480        |
+| YOLOv8-l |     No      |    52.1     |        460        |
+| YOLOv8-l |     Yes     | 53.0 (+0.9) |        491        |
+| YOLOv8-x |     No      |    52.7     |        450        |
+| YOLOv8-x |     Yes     | 54.0 (+1.3) |        460        |
+
+As can be seen from the above table:
+
+- Large models trained on COCO dataset for 500 epochs are prone to overfitting, and disabling strong augmentations such as Mosaic may not be effective in reducing overfitting in such cases.
+- Using Mask annotations can alleviate overfitting and improve performance
+
+#### 4 Add pure background images to suppress false positives
+
+For non-open-world datasets in object detection, both training and testing are conducted on a fixed set of classes, and there is a possibility of producing false positives when applied to images with classes that have not been trained. A common mitigation strategy is to add a certain proportion of pure background images.
+In most YOLO series, the function of suppressing false positives by adding pure background images is enabled by default. Users only need to set train_dataloader.dataset.filter_cfg.filter_empty_gt to False, indicating that pure background images should not be filtered out during training.
+
+#### 5 Maybe the AdamW works wonders
+
+YOLOv5, YOLOv6, YOLOv7 and YOLOv8 all adopt the SGD optimizer, which is strict about parameter settings, while AdamW is on the contrary, which is not so sensitive to learning rate. If user fine-tune a custom-dataset can try to select the AdamW optimizer. We did a simple trial in YOLOX and found that replacing the optimizer with AdamW on the tiny, s, and m scale models all had some improvement.
+
+|  Backbone  | Size | Batch Size | RTMDet-Hyp |   Box AP    |
+| :--------: | :--: | :--------: | :--------: | :---------: |
+| YOLOX-tiny | 416  |    8xb8    |     No     |    32.7     |
+| YOLOX-tiny | 416  |   8xb32    |    Yes     | 34.3 (+1.6) |
+|  YOLOX-s   | 640  |    8xb8    |     No     |    40.7     |
+|  YOLOX-s   | 640  |   8xb32    |    Yes     | 41.9 (+1.2) |
+|  YOLOX-m   | 640  |    8xb8    |     No     |    46.9     |
+|  YOLOX-m   | 640  |   8xb32    |    Yes     | 47.5 (+0.6) |
+
+More details can be found in [configs/yolox/README.md](https://github.com/open-mmlab/mmyolo/blob/main/configs/yolox/README.md#--results-and-models).
+
+#### 6 Consider ignore scenarios to avoid uncertain annotations
+
+Take CrowdHuman as an example, a crowded pedestrian detection dataset. Here's a typical image:
+
+<div align="center">
+<img src="https://user-images.githubusercontent.com/17425982/224928241-89dac006-392b-445d-87e8-a9e268825401.png" width="1000"/>
+</div>
+
+The image is sourced from [detectron2 issue](https://github.com/facebookresearch/detectron2/issues/1909). The area marked with a yellow cross indicates the `iscrowd` label. There are two reasons for this:
+
+- This area is not a real person, such as the person on the poster
+- The area is too crowded to mark
+
+In this scenario, you cannot simply delete such annotations, because once you delete them, it means treating them as background areas during training. However, they are different from the background. Firstly, the people on the posters are very similar to real people, and there are indeed people in crowded areas that are difficult to annotate. If you simply train them as background, it will cause false negatives. The best approach is to treat the crowded area as an ignored region, where any output in this area is directly ignored, with no loss calculated and no model fitting enforced.
+
+MMYOLO quickly and easily verifies the function of 'iscrowd' annotation on YOLOv5. The performance is as follows:
+
+| Backbone | ignore_iof_thr | box AP50(CrowDHuman Metric) |  MR  |  JI   |
+| :------: | :------------: | :-------------------------: | :--: | :---: |
+| YOLOv5-s |       -1       |            85.79            | 48.7 | 75.33 |
+| YOLOv5-s |      0.5       |            86.17            | 48.8 | 75.87 |
+
+`ignore_iof_thr` set to -1 indicates that the ignored labels are not considered, and it can be seen that the performance is improved to a certain extent, more details can be found in  [CrowdHuman results](https://github.com/open-mmlab/mmyolo/blob/main/configs/yolov5/README.md#crowdhuman). If you encounter similar situations in your custom dataset, it is recommended that you consider using `ignore` labels to avoid uncertain annotations.
+
+#### 7 Use knowledge distillation
+
+Knowledge distillation is a widely used technique that can transfer the performance of a large model to a smaller model, thereby improving the detection performance of the smaller model. Currently, MMYOLO and MMRazor have supported this feature and conducted initial verification on RTMDet.
+
+|     Model      |   box AP    |
+| :------------: | :---------: |
+|  RTMDet-tiny   |    41.0     |
+| RTMDet-tiny \* | 41.8 (+0.8) |
+|    RTMDet-s    |    44.6     |
+|  RTMDet-s \*   | 45.7 (+1.1) |
+|    RTMDet-m    |    49.3     |
+|  RTMDet-m \*   | 50.2 (+0.9) |
+|    RTMDet-l    |    51.4     |
+|  RTMDet-l \*   | 52.3 (+0.9) |
+
+`*` indicates the result of using the large model distillation, more details can be found in [Distill RTMDet](https://github.com/open-mmlab/mmyolo/tree/main/configs/rtmdet/distillation).
+
+#### 8 Stronger augmentation parameters are used for larger models
+
+If you have modified the model based on the default configuration or replaced the backbone network, it is recommended to scale the data augmentation parameters based on the current model size. Generally, larger models require stronger augmentation parameters, otherwise they may not fully leverage the benefits of large models. Conversely, if strong augmentations are applied to small models, it may result in underfitting. Taking RTMDet as an example, we can observe the data augmentation parameters for different model sizes.
+
+<div align="center">
+<img src="https://user-images.githubusercontent.com/17425982/224936237-a31add46-77ff-4595-b3d9-c7b574f59c84.png" width="800"/>
+</div>
+
+`random_resize_ratio_range` represents the random scaling range of `RandomResize`, and `mosaic_max_cached_images/mixup_max_cached_images` represents the number of cached images during `Mosaic/MixUp` augmentation, which can be used to adjust the strength of augmentation. The YOLO series models all follow the same set of parameter settings principles.
+
+### Accelerate training speed
+
+#### 1 Enable cudnn_benchmark for single-scale training
+
+Most of the input image sizes in the YOLO series algorithms are fixed, which is single-scale training. In this case, you can turn on cudnn_benchmark to accelerate the training speed. This parameter is mainly set for PyTorch's cuDNN underlying library, and setting this flag can allow the built-in cuDNN to automatically find the most efficient algorithm that is best suited for the current configuration to optimize the running efficiency. If this flag is turned on in multi-scale mode, it will continuously search for the optimal algorithm, which may slow down the training speed instead.
+
+To enable `cudnn_benchmark` in MMYOLO, you can set `env_cfg = dict(cudnn_benchmark=True)` in the configuration.
+
+#### 2 Use Mosaic and MixUp with caching
+
+If you have applied Mosaic and MixUp in your data augmentation, and after investigating the training bottleneck, it is found that the random image reading is causing the issue, then it is recommended to replace the regular Mosaic and MixUp with the cache-enabled versions proposed in RTMDet.
+
+| Data Aug | Use cache | ms/100 imgs |
+| :------: | :-------: | :---------: |
+|  Mosaic  |    No     |    87.1     |
+|  Mosaic  |    Yes    |    24.0     |
+|  MixUp   |    No     |    19.3     |
+|  MixUp   |    Yes    |    12.4     |
+
+Mosaic and MixUp involve mixing multiple images, and their time consumption is K times that of ordinary data augmentation (K is the number of images mixed). For example, in YOLOv5, when doing Mosaic each time, the information of 4 images needs to be reloaded from the hard disk. However, the cached version of Mosaic and MixUp only needs to reload the current image, while the remaining images involved in the mixed augmentation are obtained from the cache queue, greatly improving efficiency by sacrificing a certain amount of memory space.
+
+<div align=center>
+<img alt="data cache" src="https://user-images.githubusercontent.com/33799979/192730011-90e2a28d-e163-4399-bf87-d3012007d8c3.png" width=800 />
+</div>
+
+As shown in the figure, N preloaded images and label data are stored in the cache queue. In each training step, only one new image and its label data need to be loaded and updated in the cache queue. (Images in the cache queue can be duplicated, as shown in the figure with img3 appearing twice.) If the length of the cache queue exceeds the preset length, a random image will be popped out. When it is necessary to perform mixed data augmentation, only the required images need to be randomly selected from the cache for concatenation or other processing, without the need to load all images from the hard disk, thus saving image loading time.
+
+### Reduce the number of hyperparameter
+
+YOLOv5 provides some practical methods for reducing the number of hyperparameter, which are described below.
+
+#### 1 Adaptive loss weighting, reducing one hyperparameter
+
+In general, it can be challenging to set hyperparameters specifically for different tasks or categories. YOLOv5 proposes some adaptive methods for scaling loss weights based on the number of classes and the number of detection output layers have been proposed based on practical experience, as shown below:
+
+```python
+# scaled based on number of detection layers
+loss_cls=dict(
+    type='mmdet.CrossEntropyLoss',
+    use_sigmoid=True,
+    reduction='mean',
+    loss_weight=loss_cls_weight *
+    (num_classes / 80 * 3 / num_det_layers)),
+loss_bbox=dict(
+    type='IoULoss',
+    iou_mode='ciou',
+    bbox_format='xywh',
+    eps=1e-7,
+    reduction='mean',
+    loss_weight=loss_bbox_weight * (3 / num_det_layer
+    return_iou=True),
+loss_obj=dict(
+    type='mmdet.CrossEntropyLoss',
+    use_sigmoid=True,
+    reduction='mean',
+    loss_weight=loss_obj_weight *
+    ((img_scale[0] / 640)**2 * 3 / num_det_layers)),
+```
+
+`loss_cls` can adaptively scale `loss_weight` based on the custom number of classes and the number of detection layers, `loss_bbox` can adaptively calculate based on the number of detection layers, and `loss_obj` can adaptively scale based on the input image size and the number of detection layers. This strategy allows users to avoid setting Loss weight hyperparameters.
+It should be noted that this is only an empirical principle and not necessarily the optimal setting combination, it should be used as a reference.
+
+#### 2 Adaptive Weight Decay and Loss output values base on Batch Size, reducing two hyperparameters
+
+In general,when training on different `Batch Size`, it is necessary to follow the rule of automatic learning rate scaling. However, validation on various datasets shows that YOLOv5 can achieve good results without scaling the learning rate when changing the Batch Size, and sometimes scaling can even lead to worse results. The reason lies in the technique of `Weight Decay` and Loss output based on `Batch Size` adaptation in the code. In YOLOv5, `Weight Decay` and Loss output values will be scaled based on the total `Batch Size` being trained. The corresponding code is:
+
+```python
+# https://github.com/open-mmlab/mmyolo/blob/dev/mmyolo/engine/optimizers/yolov5_optim_constructor.py#L86
+if 'batch_size_per_gpu' in optimizer_cfg:
+    batch_size_per_gpu = optimizer_cfg.pop('batch_size_per_gpu')
+    # No scaling if total_batch_size is less than
+    # base_total_batch_size, otherwise linear scaling.
+    total_batch_size = get_world_size() * batch_size_per_gpu
+    accumulate = max(
+        round(self.base_total_batch_size / total_batch_size), 1)
+    scale_factor = total_batch_size * \
+        accumulate / self.base_total_batch_size
+    if scale_factor != 1:
+        weight_decay *= scale_factor
+        print_log(f'Scaled weight_decay to {weight_decay}', 'current')
+```
+
+```python
+# https://github.com/open-mmlab/mmyolo/blob/dev/mmyolo/models/dense_heads/yolov5_head.py#L635
+ _, world_size = get_dist_info()
+ return dict(
+     loss_cls=loss_cls * batch_size * world_size,
+     loss_obj=loss_obj * batch_size * world_size,
+     loss_bbox=loss_box * batch_size * world_size)
+```
+
+The weight of Loss varies in different Batch Sizes, and generally, the larger Batch Size means most larger the Loss and gradient. I personally speculate that this can be equivalent to a scenario of linearly increasing learning rate when Batch Size increases.
+In fact, from the [YOLOv5 Study: mAP vs Batch-Size](https://github.com/ultralytics/yolov5/discussions/2452) of YOLOv5, it can be found that it is desirable for users to achieve similar performance without modifying other parameters when modifying the Batch Size. The above two strategies are very good training techniques.
+
+### Save memory on GPU
+
+How to reduce training memory usage is a frequently discussed issue, and there are many techniques involved. The training executor of MMYOLO comes from MMEngine, so you can refer to the MMEngine documentation for how to reduce training memory usage. Currently, MMEngine supports gradient accumulation, gradient checkpointing, and large model training techniques, details of which can be found in the
+[SAVE MEMORY ON GPU](https://mmengine.readthedocs.io/zh_CN/latest/common_usage/save_gpu_memory.html).
+
+## Testing trick
+
+### Balance between inference speed and testing accuracy
+
+During model performance testing, we generally require a higher mAP, but in practical applications or inference, we want the model to perform faster while maintaining low false positive and false negative rates. In other words, the testing only focuses on mAP while ignoring post-processing and evaluation speed, while in practical applications, a balance between speed and accuracy is pursued.
+In the YOLO series, it is possible to achieve a balance between speed and accuracy by controlling certain parameters. In this example, we will describe this in detail using YOLOv5.
+
+#### 1 Avoiding multiple class outputs for a single detection box during inference
+
+YOLOv5 uses BCE Loss (use_sigmoid=True) during the training of the classification branch. Assuming there are 4 object categories, the number of categories output by the classification branch is 4 instead of 5. Moreover, due to the use of sigmoid instead of softmax prediction, it is possible to predict multiple detection boxes that meet the filtering threshold at a certain position, which means that there may be a situation where one predicted bbox corresponds to multiple predicted labels. This is shown in the figure below:
+
+<div align=center>
+<img alt="multi-label" src="https://user-images.githubusercontent.com/17425982/226282295-8ef53a89-e33e-4fd5-8d60-417db2d5a140.png" width=800 />
+</div>
+
+Generally, when calculating mAP, the filtering threshold is set to 0.001. Due to the non-competitive prediction mode of sigmoid, one box may correspond to multiple labels. This calculation method can increase the recall rate when calculating mAP, but it may not be convenient for practical applications.
+
+One common approach is to increase the filtering threshold. However, if you don't want to have many false negatives, it is recommended to set the `multi_label` parameter to False. It is located in the configuration file at `mode.test_cfg.multi_label` and its default value is True, which allows one detection box to correspond to multiple labels.
+
+#### 2 Simplify test pipeline
+
+Note that the test pipeline for YOLOv5 is as follows:
+
+```python
+test_pipeline = [
+    dict(type='LoadImageFromFile'),
+    dict(type='YOLOv5KeepRatioResize', scale=img_scale),
+    dict(
+        type='LetterResize',
+        scale=img_scale,
+        allow_scale_up=False,
+        pad_val=dict(img=114)),
+    dict(type='LoadAnnotations', with_bbox=True, _scope_='mmdet'),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                   'scale_factor', 'pad_param'))
+]
+```
+
+It uses two different Resizes with different functions, with the aim of improving the mAP value during evaluation. In actual deployment, you can simplify this pipeline as shown below:
+
+```python
+test_pipeline = [
+    dict(type='LoadImageFromFile'),
+    dict(
+        type='LetterResize',
+        scale=_base_.img_scale,
+        allow_scale_up=True,
+        use_mini_pad=True),
+    dict(type='LoadAnnotations', with_bbox=True),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                   'scale_factor', 'pad_param'))
+]
+```
+
+In practical applications, YOLOv5 algorithm uses a simplified pipeline with multi_label set to False, score_thr increased to 0.25, and iou_threshold reduced to 0.45.
+In the YOLOv5 configuration, we provide a set of configuration parameters for detection on the ground, as detailed in [yolov5_s-v61_syncbn-detect_8xb16-300e_coco.py](https://github.com/open-mmlab/mmyolo/blob/main/configs/yolov5/yolov5_s-v61_syncbn-detect_8xb16-300e_coco.py).
+
+#### 3 Batch Shape speeds up the testing speed
+
+Batch Shape is a testing technique proposed in YOLOv5 that can speed up inference. The idea is to no longer require that all images in the testing process be 640x640, but to test at variable scales, as long as the shapes within the current batch are the same. This approach can reduce additional image pixel padding and speed up the inference process. The specific implementation of Batch Shape can be found in the [link](https://github.com/open-mmlab/mmyolo/blob/main/mmyolo/datasets/utils.py#L55).
+Almost all algorithms in MMYOLO default to enabling the Batch Shape strategy during testing. If users want to disable this feature, you can set `val_dataloader.dataset.batch_shapes_cfg=None`.
+
+In practical applications, because dynamic shape is not as fast and efficient as fixed shape. Therefore, this strategy is generally not used in real-world scenarios.
+
+### TTA improves test accuracy
+
+Data augmentation with TTA (Test Time Augmentation) is a versatile trick that can improve the performance of object detection models and is particularly useful in competition scenarios. MMYOLO has already supported TTA, and it can be enabled simply by adding `--tta` when testing. For more details, please refer to the [TTA](https://github.com/open-mmlab/mmyolo/blob/dev/docs/zh_cn/common_usage/tta.md).
diff --git a/mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/troubleshooting_steps.md b/mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/troubleshooting_steps.md
new file mode 100644
index 0000000..60cc114
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/troubleshooting_steps.md
@@ -0,0 +1 @@
+# Troubleshooting steps for common errors
diff --git a/mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/visualization.md b/mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/visualization.md
new file mode 100644
index 0000000..f986648
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/en/recommended_topics/visualization.md
@@ -0,0 +1,346 @@
+# Visualization
+
+This article includes feature map visualization and Grad-Based and Grad-Free CAM visualization
+
+## Feature map visualization
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/89863442/190903635-27bbc619-9bf8-43a8-aea8-ea13b9dad28c.jpg" width="1000" alt="image"/>
+</div>
+
+Visualization provides an intuitive explanation of the training and testing process of the deep learning model.
+
+In MMYOLO, you can use the `Visualizer` provided in MMEngine for feature map visualization, which has the following features:
+
+- Support basic drawing interfaces and feature map visualization.
+- Support selecting different layers in the model to get the feature map. The display methods include `squeeze_mean`, `select_max`, and `topk`. Users can also customize the layout of the feature map display with `arrangement`.
+
+### Feature map generation
+
+You can use `demo/featmap_vis_demo.py` to get a quick view of the visualization results. To better understand all functions, we list all primary parameters and their features here as follows:
+
+- `img`: the image to visualize. Can be either a single image file or a list of image file paths.
+
+- `config`: the configuration file for the algorithm.
+
+- `checkpoint`: the weight file of the corresponding algorithm.
+
+- `--out-file`: the file path to save the obtained feature map on your device.
+
+- `--device`: the hardware used for image inference. For example, `--device cuda:0` means use the first GPU, whereas `--device cpu` means use CPU.
+
+- `--score-thr`: the confidence score threshold. Only bboxes whose confidence scores are higher than this threshold will be displayed.
+
+- `--preview-model`: if there is a need to preview the model. This could make users understand the structure of the feature layer more straightforwardly.
+
+- `--target-layers`: the specific layer to get the visualized feature map result.
+
+  - If there is only one parameter, the feature map of that specific layer will be visualized. For example, `--target-layers backbone` ,  `--target-layers neck` ,  `--target-layers backbone.stage4`, etc.
+  - If the parameter is a list, all feature maps of the corresponding layers will be visualized. For example, `--target-layers backbone.stage4 neck` means that the stage4 layer of the backbone and the three layers of the neck are output simultaneously, a total of four layers of feature maps.
+
+- `--channel-reduction`: if needs to compress multiple channels into a single channel and then display it overlaid with the picture as the input tensor usually has multiple channels. Three parameters can be used here:
+
+  - `squeeze_mean`: The input channel C will be compressed into one channel using the mean function, and the output dimension becomes (1, H, W).
+  - `select_max`: Sum the input channel C in the spatial space, and the dimension becomes (C, ). Then select the channel with the largest value.
+  - `None`: Indicates that no compression is required. In this case, the `topk` feature maps with the highest activation degree can be selected to display through the `topk` parameter.
+
+- `--topk`: only valid when the `channel_reduction` parameter is `None`. It selects the `topk` channels according to the activation degree and then displays it overlaid with the image. The display layout can be specified using the `--arrangement` parameter, which is an array of two numbers separated by space. For example, `--topk 5 --arrangement 2 3` means the five feature maps with the highest activation degree are displayed in `2 rows and 3 columns`. Similarly, `--topk 7 --arrangement 3 3` means the seven feature maps with the highest activation degree are displayed in `3 rows and 3 columns`.
+
+  - If `topk` is not -1, topk channels will be selected to display in order of the activation degree.
+  - If `topk` is -1, channel number C must be either 1 or 3 to indicate that the input data is a picture. Otherwise, an error will prompt the user to compress the channel with `channel_reduction`.
+
+- Considering that the input feature map is usually very small, the function will upsample the feature map by default for easy visualization.
+
+**Note: When the image and feature map scales are different, the `draw_featmap` function will automatically perform an upsampling alignment. If your image has an operation such as `Pad` in the preprocessing during the inference, the feature map obtained is processed with `Pad`, which may cause misalignment problems if you directly upsample the image.**
+
+### Usage examples
+
+Take the pre-trained YOLOv5-s model as an example. Please download the model weight file to the root directory.
+
+```shell
+cd mmyolo
+wget https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth
+```
+
+(1) Compress the multi-channel feature map into a single channel with `select_max` and display it. By extracting the output of the `backbone` layer for visualization, the feature maps of the three output layers in the `backbone` will be generated:
+
+```shell
+python demo/featmap_vis_demo.py demo/dog.jpg \
+                                configs/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py \
+                                yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth \
+                                --target-layers backbone \
+                                --channel-reduction select_max
+```
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/17425982/198520580-c1b24d50-2e90-4ba5-af51-5a7dcb9db945.png" width="800" alt="image"/>
+</div>
+
+The above code has the problem that the image and the feature map need to be aligned. There are two solutions for this:
+
+1. Change the post-process to simple `Resize` in the YOLOv5 configuration, which does not affect visualization.
+
+2. Use the images after the pre-process stage instead of before the pre-process when visualizing.
+
+**For simplicity purposes, we take the first solution in this demo. However, the second solution will be made in the future so that everyone can use it without extra modification on the configuration file**.  More specifically, change the original `test_pipeline` with the version with Resize process only.
+
+The original `test_pipeline` is:
+
+```python
+test_pipeline = [
+    dict(
+        type='LoadImageFromFile',
+        backend_args=_base_.backend_args),
+    dict(type='YOLOv5KeepRatioResize', scale=img_scale),
+    dict(
+        type='LetterResize',
+        scale=img_scale,
+        allow_scale_up=False,
+        pad_val=dict(img=114)),
+    dict(type='LoadAnnotations', with_bbox=True, _scope_='mmdet'),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                   'scale_factor', 'pad_param'))
+]
+```
+
+Change to the following version:
+
+```python
+test_pipeline = [
+    dict(
+        type='LoadImageFromFile',
+        backend_args=_base_.backend_args),
+    dict(type='mmdet.Resize', scale=img_scale, keep_ratio=False), # change the  LetterResize to mmdet.Resize
+    dict(type='LoadAnnotations', with_bbox=True, _scope_='mmdet'),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                   'scale_factor'))
+]
+```
+
+The correct result is shown as follows:
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/17425982/198521116-dbccade4-370c-4051-92bf-923ca8f60f24.png" width="800" alt="image"/>
+</div>
+
+(2) Compress the multi-channel feature map into a single channel using the `squeeze_mean` parameter and display it. By extracting the output of the `neck` layer for visualization, the feature maps of the three output layers of `neck` will be generated:
+
+```shell
+python demo/featmap_vis_demo.py demo/dog.jpg \
+                                configs/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py \
+                                yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth \
+                                --target-layers neck \
+                                --channel-reduction squeeze_mean
+```
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/17425982/198521267-20202e3d-b1bc-4559-9085-e0af287636c8.png" width="800" alt="image"/>
+</div>
+
+(3) Compress the multi-channel feature map into a single channel using the `squeeze_mean` parameter and display it. Then, visualize the feature map by extracting the outputs of the `backbone.stage4` and `backbone.stage3` layers, and the feature maps of the two output layers will be generated:
+
+```shell
+python demo/featmap_vis_demo.py demo/dog.jpg \
+                                configs/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py \
+                                yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth \
+                                --target-layers backbone.stage4 backbone.stage3 \
+                                --channel-reduction squeeze_mean
+```
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/17425982/198522004-c5782807-166a-45f3-96e3-7e6df5dc70ac.png" width="800" alt="image"/>
+</div>
+
+(4) Use the `--topk 3 --arrangement 2 2` parameter to select the top 3 channels with the highest activation degree in the multi-channel feature map and display them in a `2x2` layout. Users can change the layout to what they want through the `arrangement` parameter, and the feature map will be automatically formatted. First, the `top3` feature map in each layer is formatted in a `2x2` shape, and then each layer is formatted in `2x2` as well:
+
+```shell
+python demo/featmap_vis_demo.py demo/dog.jpg \
+                                configs/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py \
+                                yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth \
+                                --target-layers backbone.stage3 backbone.stage4 \
+                                --channel-reduction None \
+                                --topk 3 \
+                                --arrangement 2 2
+```
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/17425982/198522489-8adee6ae-9915-4e9d-bf50-167b8a12c275.png" width="800" alt="image"/>
+</div>
+
+(5) When the visualization process finishes, you can choose to display the result or store it locally. You only need to add the parameter `--out-file xxx.jpg`:
+
+```shell
+python demo/featmap_vis_demo.py demo/dog.jpg \
+                                configs/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py \
+                                yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth \
+                                --target-layers backbone \
+                                --channel-reduction select_max \
+                                --out-file featmap_backbone.jpg
+```
+
+## Grad-Based and Grad-Free CAM Visualization
+
+Object detection CAM visualization is much more complex and different than classification CAM.
+This article only briefly explains the usage, and a separate document will be opened to describe the implementation principles and precautions in detail later.
+
+You can call `demo/boxmap_vis_demo.py` to get the AM visualization results at the Box level easily and quickly. Currently, `YOLOv5/YOLOv6/YOLOX/RTMDet` is supported.
+
+Taking YOLOv5 as an example, as with the feature map visualization, you need to modify the `test_pipeline` first, otherwise there will be a problem of misalignment between the feature map and the original image.
+
+The original `test_pipeline` is:
+
+```python
+test_pipeline = [
+    dict(
+        type='LoadImageFromFile',
+        backend_args=_base_.backend_args),
+    dict(type='YOLOv5KeepRatioResize', scale=img_scale),
+    dict(
+        type='LetterResize',
+        scale=img_scale,
+        allow_scale_up=False,
+        pad_val=dict(img=114)),
+    dict(type='LoadAnnotations', with_bbox=True, _scope_='mmdet'),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                   'scale_factor', 'pad_param'))
+]
+```
+
+Change to the following version:
+
+```python
+test_pipeline = [
+    dict(
+        type='LoadImageFromFile',
+        backend_args=_base_.backend_args),
+    dict(type='mmdet.Resize', scale=img_scale, keep_ratio=False), # change the  LetterResize to mmdet.Resize
+    dict(type='LoadAnnotations', with_bbox=True, _scope_='mmdet'),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                   'scale_factor'))
+]
+```
+
+(1) Use the `GradCAM` method to visualize the AM of the last output layer of the neck module
+
+```shell
+python demo/boxam_vis_demo.py \
+        demo/dog.jpg \
+        configs/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py \
+        yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth
+```
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/17425982/203775584-c4aebf11-4ff8-4530-85fe-7dda897e95a8.jpg" width="800" alt="image"/>
+</div>
+
+The corresponding feature AM is as follows:
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/17425982/203774801-1555bcfb-a8f9-4688-8ed6-982d6ad38e1d.jpg" width="800" alt="image"/>
+</div>
+
+It can be seen that the `GradCAM` effect can highlight the AM information at the box level.
+
+You can choose to visualize only the top prediction boxes with the highest prediction scores via the `--topk` parameter
+
+```shell
+python demo/boxam_vis_demo.py \
+        demo/dog.jpg \
+        configs/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py \
+        yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth \
+        --topk 2
+```
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/17425982/203778700-3165aa72-ecaf-40cc-b470-6911646e6046.jpg" width="800" alt="image"/>
+</div>
+
+(2) Use the AblationCAM method to visualize the AM of the last output layer of the neck module
+
+```shell
+python demo/boxam_vis_demo.py \
+        demo/dog.jpg \
+        configs/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py \
+        yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth \
+        --method ablationcam
+```
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/17425982/203776978-b5a9b383-93b4-4b35-9e6a-7cac684b372c.jpg" width="800" alt="image"/>
+</div>
+
+Since `AblationCAM` is weighted by the contribution of each channel to the score, it is impossible to visualize only the AM information at the box level like `GradCAN`. But you can use `--norm-in-bbox` to only show bbox inside AM
+
+```shell
+python demo/boxam_vis_demo.py \
+        demo/dog.jpg \
+        configs/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py \
+        yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth \
+        --method ablationcam \
+        --norm-in-bbox
+```
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/17425982/203777566-7c74e82f-b477-488e-958f-91e1d10833b9.jpg" width="800" alt="image"/>
+</div>
+
+## Perform inference on large images
+
+First install [`sahi`](https://github.com/obss/sahi) with:
+
+```shell
+pip install -U sahi>=0.11.4
+```
+
+Perform MMYOLO inference on large images (as satellite imagery) as:
+
+```shell
+wget -P checkpoint https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_m-v61_syncbn_fast_8xb16-300e_coco/yolov5_m-v61_syncbn_fast_8xb16-300e_coco_20220917_204944-516a710f.pth
+
+python demo/large_image_demo.py \
+    demo/large_image.jpg \
+    configs/yolov5/yolov5_m-v61_syncbn_fast_8xb16-300e_coco.py \
+    checkpoint/yolov5_m-v61_syncbn_fast_8xb16-300e_coco_20220917_204944-516a710f.pth \
+```
+
+Arrange slicing parameters as:
+
+```shell
+python demo/large_image_demo.py \
+    demo/large_image.jpg \
+    configs/yolov5/yolov5_m-v61_syncbn_fast_8xb16-300e_coco.py \
+    checkpoint/yolov5_m-v61_syncbn_fast_8xb16-300e_coco_20220917_204944-516a710f.pth \
+    --patch-size 512
+    --patch-overlap-ratio 0.25
+```
+
+Export debug visuals while performing inference on large images as:
+
+```shell
+python demo/large_image_demo.py \
+    demo/large_image.jpg \
+    configs/yolov5/yolov5_m-v61_syncbn_fast_8xb16-300e_coco.py \
+    checkpoint/yolov5_m-v61_syncbn_fast_8xb16-300e_coco_20220917_204944-516a710f.pth \
+    --debug
+```
+
+[`sahi`](https://github.com/obss/sahi) citation:
+
+```
+@article{akyon2022sahi,
+  title={Slicing Aided Hyper Inference and Fine-tuning for Small Object Detection},
+  author={Akyon, Fatih Cagatay and Altinuc, Sinan Onur and Temizel, Alptekin},
+  journal={2022 IEEE International Conference on Image Processing (ICIP)},
+  doi={10.1109/ICIP46576.2022.9897990},
+  pages={966-970},
+  year={2022}
+}
+```
diff --git a/mmdetection_practice/third_party/mmyolo/docs/en/stat.py b/mmdetection_practice/third_party/mmyolo/docs/en/stat.py
new file mode 100755
index 0000000..6c8afcc
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/en/stat.py
@@ -0,0 +1,66 @@
+#!/usr/bin/env python
+import functools as func
+import glob
+import os.path as osp
+import re
+
+import numpy as np
+
+url_prefix = 'https://github.com/open-mmlab/mmdetection/blob/3.x/configs'
+
+files = sorted(glob.glob('../../configs/*/README.md'))
+
+stats = []
+titles = []
+num_ckpts = 0
+
+for f in files:
+    url = osp.dirname(f.replace('../../configs', url_prefix))
+
+    with open(f) as content_file:
+        content = content_file.read()
+
+    title = content.split('\n')[0].replace('# ', '').strip()
+    ckpts = {
+        x.lower().strip()
+        for x in re.findall(r'\[model\]\((https?.*)\)', content)
+    }
+
+    if len(ckpts) == 0:
+        continue
+
+    _papertype = [x for x in re.findall(r'\[([A-Z]+)\]', content)]
+    assert len(_papertype) > 0
+    papertype = _papertype[0]
+
+    paper = {(papertype, title)}
+
+    titles.append(title)
+    num_ckpts += len(ckpts)
+
+    statsmsg = f"""
+\t* [{papertype}] [{title}]({url}) ({len(ckpts)} ckpts)
+"""
+    stats.append((paper, ckpts, statsmsg))
+
+allpapers = func.reduce(lambda a, b: a.union(b), [p for p, _, _ in stats])
+msglist = '\n'.join(x for _, _, x in stats)
+
+papertypes, papercounts = np.unique([t for t, _ in allpapers],
+                                    return_counts=True)
+countstr = '\n'.join(
+    [f'   - {t}: {c}' for t, c in zip(papertypes, papercounts)])
+
+modelzoo = f"""
+# Model Zoo Statistics
+
+* Number of papers: {len(set(titles))}
+{countstr}
+
+* Number of checkpoints: {num_ckpts}
+
+{msglist}
+"""
+
+with open('modelzoo_statistics.md', 'w') as f:
+    f.write(modelzoo)
diff --git a/mmdetection_practice/third_party/mmyolo/docs/en/switch_language.md b/mmdetection_practice/third_party/mmyolo/docs/en/switch_language.md
new file mode 100644
index 0000000..57b71eb
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/en/switch_language.md
@@ -0,0 +1,3 @@
+## <a href='https://mmyolo.readthedocs.io/en/latest/'>English</a>
+
+## <a href='https://mmyolo.readthedocs.io/zh_CN/latest/'>简体中文</a>
diff --git a/mmdetection_practice/third_party/mmyolo/docs/en/tutorials/config.md b/mmdetection_practice/third_party/mmyolo/docs/en/tutorials/config.md
new file mode 100644
index 0000000..4484522
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/en/tutorials/config.md
@@ -0,0 +1,556 @@
+# Learn about Configs with YOLOv5
+
+MMYOLO and other OpenMMLab repositories use [MMEngine's config system](https://mmengine.readthedocs.io/en/latest/tutorials/config.html). It has a modular and inheritance design, which is convenient to conduct various experiments.
+
+## Config file content
+
+MMYOLO uses a modular design, all modules with different functions can be configured through the config. Taking [yolov5_s-v61_syncbn_8xb16-300e_coco.py](https://github.com/open-mmlab/mmyolo/blob/main/configs/yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py) as an example, we will introduce each field in the config according to different function modules:
+
+### Important parameters
+
+When changing the training configuration, it is usually necessary to modify the following parameters. For example, the scaling factors `deepen_factor` and `widen_factor` are used by the network to control the size of the model in MMYOLO. So we recommend defining these parameters separately in the configuration file.
+
+```python
+img_scale = (640, 640)            # height of image, width of image
+deepen_factor = 0.33              # The scaling factor that controls the depth of the network structure, 0.33 for YOLOv5-s
+widen_factor = 0.5                # The scaling factor that controls the width of the network structure, 0.5 for YOLOv5-s
+max_epochs = 300                  # Maximum training epochs: 300 epochs
+save_epoch_intervals = 10         # Validation intervals. Run validation every 10 epochs.
+train_batch_size_pre_gpu = 16     # Batch size of a single GPU during training
+train_num_workers = 8             # Worker to pre-fetch data for each single GPU
+val_batch_size_pre_gpu = 1        # Batch size of a single GPU during validation.
+val_num_workers = 2               # Worker to pre-fetch data for each single GPU during validation
+```
+
+### Model config
+
+In MMYOLO's config, we use `model` to set up detection algorithm components. In addition to neural network components such as `backbone`, `neck`, etc, it also requires `data_preprocessor`, `train_cfg`, and `test_cfg`. `data_preprocessor` is responsible for processing a batch of data output by the dataloader. `train_cfg` and `test_cfg` in the model config are for training and testing hyperparameters of the components.
+
+```python
+anchors = [[(10, 13), (16, 30), (33, 23)], # Basic size of multi-scale prior box
+           [(30, 61), (62, 45), (59, 119)],
+           [(116, 90), (156, 198), (373, 326)]]
+strides = [8, 16, 32] # Strides of multi-scale prior box
+
+model = dict(
+    type='YOLODetector', # The name of detector
+    data_preprocessor=dict(  # The config of data preprocessor, usually includes image normalization and padding
+        type='mmdet.DetDataPreprocessor',  # The type of the data preprocessor, refer to https://mmdetection.readthedocs.io/en/dev-3.x/api.html#module-mmdet.models.data_preprocessors. It is worth noticing that using `YOLOv5DetDataPreprocessor` achieves faster training speed.
+        mean=[0., 0., 0.],  # Mean values used to pre-training the pre-trained backbone models, ordered in R, G, B
+        std=[255., 255., 255.], # Standard variance used to pre-training the pre-trained backbone models, ordered in R, G, B
+        bgr_to_rgb=True),  # whether to convert image from BGR to RGB
+    backbone=dict(  # The config of backbone
+        type='YOLOv5CSPDarknet',  # The type of backbone, currently it is available candidates are 'YOLOv5CSPDarknet', 'YOLOv6EfficientRep', 'YOLOXCSPDarknet'
+        deepen_factor=deepen_factor, # The scaling factor that controls the depth of the network structure
+        widen_factor=widen_factor, # The scaling factor that controls the width of the network structure
+        norm_cfg=dict(type='BN', momentum=0.03, eps=0.001), # The config of normalization layers.
+        act_cfg=dict(type='SiLU', inplace=True)), # The config of activation function
+    neck=dict(
+        type='YOLOv5PAFPN',  # The neck of detector is YOLOv5FPN, We also support 'YOLOv6RepPAFPN', 'YOLOXPAFPN'.
+        deepen_factor=deepen_factor, # The scaling factor that controls the depth of the network structure
+        widen_factor=widen_factor, # The scaling factor that controls the width of the network structure
+        in_channels=[256, 512, 1024], # The input channels, this is consistent with the output channels of backbone
+        out_channels=[256, 512, 1024], # The output channels of each level of the pyramid feature map, this is consistent with the input channels of head
+        num_csp_blocks=3, # The number of bottlenecks of CSPLayer
+        norm_cfg=dict(type='BN', momentum=0.03, eps=0.001), # The config of normalization layers.
+        act_cfg=dict(type='SiLU', inplace=True)), # The config of activation function
+    bbox_head=dict(
+        type='YOLOv5Head', # The type of BBox head is 'YOLOv5Head', we also support 'YOLOv6Head', 'YOLOXHead'
+        head_module=dict(
+            type='YOLOv5HeadModule', # The type of Head module is 'YOLOv5HeadModule', we also support 'YOLOv6HeadModule', 'YOLOXHeadModule'
+            num_classes=80, # Number of classes for classification
+            in_channels=[256, 512, 1024], # The input channels, this is consistent with the input channels of neck
+            widen_factor=widen_factor, # The scaling factor that controls the width of the network structure
+            featmap_strides=[8, 16, 32], # The strides of the multi-scale feature maps
+            num_base_priors=3), # The number of prior boxes on a certain point
+        prior_generator=dict( # The config of prior generator
+            type='mmdet.YOLOAnchorGenerator', # The prior generator uses 'YOLOAnchorGenerator. Refer to https://github.com/open-mmlab/mmdetection/blob/dev-3.x/mmdet/models/task_modules/prior_generators/anchor_generator.py for more details
+            base_sizes=anchors, # Basic scale of the anchor
+            strides=strides), # The strides of the anchor generator. This is consistent with the FPN feature strides. The strides will be taken as base_sizes if base_sizes is not set.
+    ),
+    test_cfg=dict(
+        multi_label=True, # The config of multi-label for multi-clas prediction. The default setting is True.
+        nms_pre=30000,  # The number of boxes before NMS
+        score_thr=0.001, # Threshold to filter out boxes.
+        nms=dict(type='nms', # Type of NMS
+                 iou_threshold=0.65), # NMS threshold
+        max_per_img=300)) # Max number of detections of each image
+```
+
+### Dataset and evaluator config
+
+[Dataloaders](https://pytorch.org/docs/stable/data.html?highlight=data%20loader#torch.utils.data.DataLoader) are required for the training, validation, and testing of the [runner](https://mmengine.readthedocs.io/en/latest/tutorials/runner.html). Dataset and data pipeline need to be set to build the dataloader. Due to the complexity of this part, we use intermediate variables to simplify the writing of dataloader configs. More complex data augmentation methods are adopted for the lightweight object detection algorithms in MMYOLO. Therefore, MMYOLO has a wider range of dataset configurations than other models in MMDetection.
+
+The training and testing data flow of YOLOv5 have a certain difference. We will introduce them separately here.
+
+```python
+dataset_type = 'CocoDataset'  # Dataset type, this will be used to define the dataset
+data_root = 'data/coco/'  # Root path of data
+
+pre_transform = [ # Training data loading pipeline
+    dict(
+        type='LoadImageFromFile'), # First pipeline to load images from file path
+    dict(type='LoadAnnotations', # Second pipeline to load annotations for current image
+         with_bbox=True) # Whether to use bounding box, True for detection
+]
+
+albu_train_transforms = [		     # Albumentation is introduced for image data augmentation. We follow the code of YOLOv5-v6.1, please make sure its version is 1.0.+
+    dict(type='Blur', p=0.01),       # Blur augmentation, the probability is 0.01
+    dict(type='MedianBlur', p=0.01), # Median blue augmentation, the probability is 0.01
+    dict(type='ToGray', p=0.01),	 # Randomly convert RGB to gray-scale image, the probability is 0.01
+    dict(type='CLAHE', p=0.01)		 # CLAHE(Limited Contrast Adaptive Histogram Equalization) augmentation, the probability is 0.01
+]
+train_pipeline = [				# Training data processing pipeline
+    *pre_transform,				# Introduce the pre-defined training data loading processing
+    dict(
+        type='Mosaic',          # Mosaic augmentation
+        img_scale=img_scale,    # The image scale after Mosaic augmentation
+        pad_val=114.0,          # Pixel values filled with empty areas
+        pre_transform=pre_transform), # Pre-defined training data loading pipeline
+    dict(
+        type='YOLOv5RandomAffine',	    # Random Affine augmentation for YOLOv5
+        max_rotate_degree=0.0,          # Maximum degrees of rotation transform
+        max_shear_degree=0.0,           # Maximum degrees of shear transform
+        scaling_ratio_range=(0.5, 1.5), # Minimum and maximum ratio of scaling transform
+        border=(-img_scale[0] // 2, -img_scale[1] // 2), # Distance from height and width sides of input image to adjust output shape. Only used in mosaic dataset.
+        border_val=(114, 114, 114)), # Border padding values of 3 channels.
+    dict(
+        type='mmdet.Albu',			# Albumentation of MMDetection
+        transforms=albu_train_transforms, # Pre-defined albu_train_transforms
+        bbox_params=dict(
+            type='BboxParams',
+            format='pascal_voc',
+            label_fields=['gt_bboxes_labels', 'gt_ignore_flags']),
+        keymap={
+            'img': 'image',
+            'gt_bboxes': 'bboxes'
+        }),
+    dict(type='YOLOv5HSVRandomAug'),            # Random augmentation on HSV channel
+    dict(type='mmdet.RandomFlip', prob=0.5),	# Random flip, the probability is 0.5
+    dict(
+        type='mmdet.PackDetInputs',				# Pipeline that formats the annotation data and decides which keys in the data should be packed into data_samples
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                   'flip_direction'))
+]
+train_dataloader = dict( # Train dataloader config
+    batch_size=train_batch_size_pre_gpu, # Batch size of a single GPU during training
+    num_workers=train_num_workers, # Worker to pre-fetch data for each single GPU during training
+    persistent_workers=True, # If ``True``, the dataloader will not shut down the worker processes after an epoch end, which can accelerate training speed.
+    pin_memory=True, # If ``True``, the dataloader will allow pinned memory, which can reduce copy time between CPU and memory
+    sampler=dict( # training data sampler
+        type='DefaultSampler', # DefaultSampler which supports both distributed and non-distributed training. Refer to https://github.com/open-mmlab/mmengine/blob/main/mmengine/dataset/sampler.py
+        shuffle=True), # randomly shuffle the training data in each epoch
+    dataset=dict( # Train dataset config
+        type=dataset_type,
+        data_root=data_root,
+        ann_file='annotations/instances_train2017.json', # Path of annotation file
+        data_prefix=dict(img='train2017/'), # Prefix of image path
+        filter_cfg=dict(filter_empty_gt=False, min_size=32), # Config of filtering images and annotations
+        pipeline=train_pipeline))
+```
+
+In the testing phase of YOLOv5, the [Letter Resize](https://github.com/open-mmlab/mmyolo/blob/main/mmyolo/datasets/transforms/transforms.py#L116) method resizes all the test images to the same scale, which preserves the aspect ratio of all testing images. Therefore, the validation and testing phases share the same data pipeline.
+
+```python
+test_pipeline = [ # Validation/ Testing dataloader config
+    dict(
+        type='LoadImageFromFile'), # First pipeline to load images from file path
+    dict(type='YOLOv5KeepRatioResize', # Second pipeline to resize images with the same aspect ratio
+         scale=img_scale), # Pipeline that resizes the images
+    dict(
+        type='LetterResize', # Third pipeline to rescale images to meet the requirements of different strides
+        scale=img_scale, # Target scale of image
+        allow_scale_up=False, # Allow scale up when radio > 1
+        pad_val=dict(img=114)), # Padding value
+    dict(type='LoadAnnotations', with_bbox=True), # Forth pipeline to load annotations for current image
+    dict(
+        type='mmdet.PackDetInputs', # Pipeline that formats the annotation data and decides which keys in the data should be packed into data_samples
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                   'scale_factor', 'pad_param'))
+]
+
+val_dataloader = dict(
+    batch_size=val_batch_size_pre_gpu, # Batch size of a single GPU
+    num_workers=val_num_workers, # Worker to pre-fetch data for each single GPU
+    persistent_workers=True, # If ``True``, the dataloader will not shut down the worker processes after an epoch end, which can accelerate training speed.
+    pin_memory=True, # If ``True``, the dataloader will allow pinned memory, which can reduce copy time between CPU and memory
+    drop_last=False, # IF ``True``, the dataloader will drop data, which fails to make a batch
+    sampler=dict(
+        type='DefaultSampler', # Default sampler for both distributed and normal training
+        shuffle=False), # not shuffle during validation and testing
+    dataset=dict(
+        type=dataset_type,
+        data_root=data_root,
+        test_mode=True, # # Turn on test mode of the dataset to avoid filtering annotations or images
+        data_prefix=dict(img='val2017/'), # Prefix of image path
+        ann_file='annotations/instances_val2017.json', # Path of annotation file
+        pipeline=test_pipeline,
+        batch_shapes_cfg=dict(  # Config of batch shapes
+            type='BatchShapePolicy', # Policy that makes paddings with least pixels during batch inference process, which does not require the image scales of all batches to be the same throughout validation.
+            batch_size=val_batch_size_pre_gpu, # Batch size for batch shapes strategy, equals to validation batch size on single GPU
+            img_size=img_scale[0], # Image scale
+            size_divisor=32, # The image scale of padding should be divided by pad_size_divisor
+            extra_pad_ratio=0.5))) # additional paddings for pixel scale
+
+test_dataloader = val_dataloader
+```
+
+[Evaluators](https://mmengine.readthedocs.io/en/latest/design/evaluation.html) are used to compute the metrics of the trained model on the validation and testing datasets. The config of evaluators consists of one or a list of metric configs:
+
+```python
+val_evaluator = dict(  # Validation evaluator config
+    type='mmdet.CocoMetric',  # The coco metric used to evaluate AR, AP, and mAP for detection
+    proposal_nums=(100, 1, 10),	# The number of proposal used to evaluate for detection
+    ann_file=data_root + 'annotations/instances_val2017.json',  # Annotation file path
+    metric='bbox',  # Metrics to be evaluated, `bbox` for detection
+)
+test_evaluator = val_evaluator  # Testing evaluator config
+```
+
+Since the test dataset has no annotation files, the test_dataloader and test_evaluator config in MMYOLO are generally the same as the val's. If you want to save the detection results on the test dataset, you can write the config like this:
+
+```python
+# inference on test dataset and
+# format the output results for submission.
+test_dataloader = dict(
+    batch_size=1,
+    num_workers=2,
+    persistent_workers=True,
+    drop_last=False,
+    sampler=dict(type='DefaultSampler', shuffle=False),
+    dataset=dict(
+        type=dataset_type,
+        data_root=data_root,
+        ann_file=data_root + 'annotations/image_info_test-dev2017.json',
+        data_prefix=dict(img='test2017/'),
+        test_mode=True,
+        pipeline=test_pipeline))
+test_evaluator = dict(
+    type='mmdet.CocoMetric',
+    ann_file=data_root + 'annotations/image_info_test-dev2017.json',
+    metric='bbox',
+    format_only=True,  # Only format and save the results to coco json file
+    outfile_prefix='./work_dirs/coco_detection/test')  # The prefix of output json files
+```
+
+### Training and testing config
+
+MMEngine's runner uses Loop to control the training, validation, and testing processes.
+Users can set the maximum training epochs and validation intervals with these fields.
+
+```python
+max_epochs = 300 # Maximum training epochs: 300 epochs
+save_epoch_intervals = 10 # Validation intervals. Run validation every 10 epochs.
+
+train_cfg = dict(
+    type='EpochBasedTrainLoop',  # The training loop type. Refer to https://github.com/open-mmlab/mmengine/blob/main/mmengine/runner/loops.py
+    max_epochs=max_epochs,  # Maximum training epochs: 300 epochs
+    val_interval=save_epoch_intervals)  # Validation intervals. Run validation every 10 epochs.
+val_cfg = dict(type='ValLoop')  # The validation loop type
+test_cfg = dict(type='TestLoop')  # The testing loop type
+```
+
+MMEngine also supports dynamic intervals for evaluation. For example, you can run validation every 10 epochs on the first 280 epochs, and run validation every epoch on the final 20 epochs. The configurations are as follows.
+
+```python
+max_epochs = 300 # Maximum training epochs: 300 epochs
+save_epoch_intervals = 10 # Validation intervals. Run validation every 10 epochs.
+
+train_cfg = dict(
+    type='EpochBasedTrainLoop',  # The training loop type. Refer to https://github.com/open-mmlab/mmengine/blob/main/mmengine/runner/loops.py
+    max_epochs=max_epochs,  # Maximum training epochs: 300 epochs
+    val_interval=save_epoch_intervals,  # Validation intervals. Run validation every 10 epochs.
+    dynamic_intervals=[(280, 1)]) # Switch evaluation on 280 epoch and switch the interval to 1.
+val_cfg = dict(type='ValLoop')  # The validation loop type
+test_cfg = dict(type='TestLoop')  # The testing loop type
+```
+
+### Optimization config
+
+`optim_wrapper` is the field to configure optimization-related settings. The optimizer wrapper not only provides the functions of the optimizer but also supports functions such as gradient clipping, mixed precision training, etc. Find out more in the [optimizer wrapper tutorial](https://mmengine.readthedocs.io/en/latest/tutorials/optim_wrapper.html).
+
+```python
+optim_wrapper = dict(  # Optimizer wrapper config
+    type='OptimWrapper',  # Optimizer wrapper type, switch to AmpOptimWrapper to enable mixed precision training.
+    optimizer=dict(  # Optimizer config. Support all kinds of optimizers in PyTorch. Refer to https://pytorch.org/docs/stable/optim.html#algorithms
+        type='SGD',  # Stochastic gradient descent optimizer
+        lr=0.01,  # The base learning rate
+        momentum=0.937, # Stochastic gradient descent with momentum
+        weight_decay=0.0005, # Weight decay of SGD
+        nesterov=True, # Enable Nesterov momentum, Refer to http://www.cs.toronto.edu/~hinton/absps/momentum.pdf
+        batch_size_pre_gpu=train_batch_size_pre_gpu),  # Enable automatic learning rate scaling
+    clip_grad=None,  # Gradient clip option. Set None to disable gradient clip. Find usage in https://mmengine.readthedocs.io/en/latest/tutorials/optim_wrapper.html
+    constructor='YOLOv5OptimizerConstructor') # The constructor for YOLOv5 optimizer
+```
+
+`param_scheduler` is the field that configures methods of adjusting optimization hyperparameters such as learning rate and momentum. Users can combine multiple schedulers to create a desired parameter adjustment strategy. Find more in the [parameter scheduler tutorial](https://mmengine.readthedocs.io/en/latest/tutorials/param_scheduler.html). In YOLOv5, parameter scheduling is complex to implement and difficult to implement with `param_scheduler`. So we use `YOLOv5ParamSchedulerHook` to implement it (see next section), which is simpler but less versatile.
+
+```python
+param_scheduler = None
+```
+
+### Hook config
+
+Users can attach hooks to training, validation, and testing loops to insert some operations during running. There are two different hook fields, one is `default_hooks` and the other is `custom_hooks`.
+
+`default_hooks` is a dict of hook configs for the hooks that must be required at the runtime. They have default priority which should not be modified. If not set, the runner will use the default values. To disable a default hook, users can set its config to `None`.
+
+```python
+default_hooks = dict(
+    param_scheduler=dict(
+        type='YOLOv5ParamSchedulerHook', # MMYOLO uses `YOLOv5ParamSchedulerHook` to adjust hyper-parameters in optimizers
+        scheduler_type='linear',
+        lr_factor=0.01,
+        max_epochs=max_epochs),
+    checkpoint=dict(
+        type='CheckpointHook', # Hook to save model checkpoint on specific intervals
+        interval=save_epoch_intervals, # Save model checkpoint every 10 epochs.
+        max_keep_ckpts=3)) # The maximum checkpoints to keep.
+```
+
+`custom_hooks` is a list of hook configs. Users can develop their hooks and insert them in this field.
+
+```python
+custom_hooks = [
+    dict(
+        type='EMAHook', # A Hook to apply Exponential Moving Average (EMA) on the model during training.
+        ema_type='ExpMomentumEMA', # The type of EMA strategy to use.
+        momentum=0.0001, # The momentum of EMA
+        update_buffers=True, # # If ``True``, calculate the running averages of model parameters
+        priority=49) # Priority higher than NORMAL(50)
+]
+```
+
+### Runtime config
+
+```python
+default_scope = 'mmyolo'  # The default registry scope to find modules. Refer to https://mmengine.readthedocs.io/en/latest/tutorials/registry.html
+
+env_cfg = dict(
+    cudnn_benchmark=True,  # Whether to enable cudnn benchmark
+    mp_cfg=dict(  # Multi-processing config
+        mp_start_method='fork',  # Use fork to start multi-processing threads. 'fork' is usually faster than 'spawn' but may be unsafe. See discussion in https://github.com/pytorch/pytorch/issues/1355
+        opencv_num_threads=0),  # Disable opencv multi-threads to avoid system being overloaded
+    dist_cfg=dict(backend='nccl'),  # Distribution configs
+)
+
+vis_backends = [dict(type='LocalVisBackend')]  # Visualization backends. Refer to: https://mmengine.readthedocs.io/zh_CN/latest/advanced_tutorials/visualization.html
+visualizer = dict(
+    type='mmdet.DetLocalVisualizer', vis_backends=vis_backends, name='visualizer')
+log_processor = dict(
+    type='LogProcessor',  # Log processor to process runtime logs
+    window_size=50,  # Smooth interval of log values
+    by_epoch=True)  # Whether to format logs with epoch style. Should be consistent with the train loop's type.
+
+log_level = 'INFO'  # The level of logging.
+load_from = None  # Load model checkpoint as a pre-trained model from a given path. This will not resume training.
+resume = False  # Whether to resume from the checkpoint defined in `load_from`. If `load_from` is None, it will resume the latest checkpoint in the `work_dir`.
+```
+
+## Config file inheritance
+
+`config/_base_` contains default runtime. The configs that are composed of components from `_base_` are called _primitive_.
+
+For all configs under the same folder, it is recommended to have only **one** _primitive_ config. All other configs should be inherited  from the _primitive_ config. In this way, the maximum inheritance level is 3.
+
+For easy understanding, we recommend contributors inherit from existing methods.
+For example, if some modification is made based on YOLOv5-s, such as modifying the depth of the network, users may first inherit the `_base_ = ./yolov5_s-v61_syncbn_8xb16-300e_coco.py `, then modify the necessary fields in the config files.
+
+If you are building an entirely new method that does not share the structure with any of the existing methods, you may create a folder `yolov100` under `configs`,
+
+Please refer to the [mmengine config tutorial](https://mmengine.readthedocs.io/en/latest/tutorials/config.html) for more details.
+
+By setting the `_base_` field, we can set which files the current configuration file inherits from.
+
+When `_base_` is a string of a file path, it means inheriting the contents of one config file.
+
+```python
+_base_ = '../_base_/default_runtime.py'
+```
+
+When `_base_` is a list of multiple file paths, it means inheriting multiple files.
+
+```python
+_base_ = [
+    './yolov5_s-v61_syncbn_8xb16-300e_coco.py',
+    '../_base_/default_runtime.py'
+]
+```
+
+If you wish to inspect the config file, you may run `mim run mmdet print_config /PATH/TO/CONFIG` to see the complete config.
+
+### Ignore some fields in the base configs
+
+Sometimes, you may set `_delete_=True` to ignore some of the fields in base configs.
+You may refer to the [mmengine config tutorial](https://mmengine.readthedocs.io/en/latest/tutorials/config.html) for a simple illustration.
+
+In MMYOLO, for example, to change the backbone of RTMDet with the following config.
+
+```python
+model = dict(
+    type='YOLODetector',
+    data_preprocessor=dict(...),
+    backbone=dict(
+        type='CSPNeXt',
+        arch='P5',
+        expand_ratio=0.5,
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+        channel_attention=True,
+        norm_cfg=dict(type='BN'),
+        act_cfg=dict(type='SiLU', inplace=True)),
+    neck=dict(...),
+    bbox_head=dict(...))
+```
+
+If you want to change `CSPNeXt` to `YOLOv6EfficientRep` for the RTMDet backbone, because there are different fields (`channel_attention` and `expand_ratio`) in `CSPNeXt` and `YOLOv6EfficientRep`, you need to use `_delete_=True` to replace all the old keys in the `backbone` field with the new keys.
+
+```python
+_base_ = '../rtmdet/rtmdet_l_syncbn_8xb32-300e_coco.py'
+model = dict(
+    backbone=dict(
+        _delete_=True,
+        type='YOLOv6EfficientRep',
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+        norm_cfg=dict(type='BN', momentum=0.03, eps=0.001),
+        act_cfg=dict(type='ReLU', inplace=True)),
+    neck=dict(...),
+    bbox_head=dict(...))
+```
+
+### Use intermediate variables in configs
+
+Some intermediate variables are used in the configs files, like `train_pipeline` and `test_pipeline` in datasets. It's worth noting that when modifying intermediate variables in the children configs, users need to pass the intermediate variables into corresponding fields again.
+For example, we would like to change the `image_scale` during training and add `YOLOv5MixUp` data augmentation, `img_scale/train_pipeline/test_pipeline` are intermediate variables we would like to modify.
+
+```python
+_base_ = './yolov5_s-v61_syncbn_8xb16-300e_coco.py'
+
+img_scale = (1280, 1280)  # image height, image width
+affine_scale = 0.9
+
+mosaic_affine_pipeline = [
+    dict(
+        type='Mosaic',
+        img_scale=img_scale,
+        pad_val=114.0,
+        pre_transform=pre_transform),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        scaling_ratio_range=(1 - affine_scale, 1 + affine_scale),
+        border=(-img_scale[0] // 2, -img_scale[1] // 2),
+        border_val=(114, 114, 114))
+]
+
+train_pipeline = [
+    *pre_transform, *mosaic_affine_pipeline,
+    dict(
+        type='YOLOv5MixUp',	# MixUp augmentation of YOLOv5
+        prob=0.1, # the probability of YOLOv5MixUp
+        pre_transform=[*pre_transform,*mosaic_affine_pipeline]), # Pre-defined Training data pipeline and MixUp augmentation.
+    dict(
+        type='mmdet.Albu',
+        transforms=albu_train_transforms,
+        bbox_params=dict(
+            type='BboxParams',
+            format='pascal_voc',
+            label_fields=['gt_bboxes_labels', 'gt_ignore_flags']),
+        keymap={
+            'img': 'image',
+            'gt_bboxes': 'bboxes'
+        }),
+    dict(type='YOLOv5HSVRandomAug'),
+    dict(type='mmdet.RandomFlip', prob=0.5),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                   'flip_direction'))
+]
+
+test_pipeline = [
+    dict(
+        type='LoadImageFromFile'),
+    dict(type='YOLOv5KeepRatioResize', scale=img_scale),
+    dict(
+        type='LetterResize',
+        scale=img_scale,
+        allow_scale_up=False,
+        pad_val=dict(img=114)),
+    dict(type='LoadAnnotations', with_bbox=True),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                   'scale_factor', 'pad_param'))
+]
+
+train_dataloader = dict(dataset=dict(pipeline=train_pipeline))
+val_dataloader = dict(dataset=dict(pipeline=test_pipeline))
+test_dataloader = dict(dataset=dict(pipeline=test_pipeline))
+```
+
+We first define a new `train_pipeline`/`test_pipeline` and pass it into `data`.
+
+Likewise, if we want to switch from `SyncBN` to `BN` or `MMSyncBN`, we need to modify every `norm_cfg` in the configuration file.
+
+```python
+_base_ = './yolov5_s-v61_syncbn_8xb16-300e_coco.py'
+norm_cfg = dict(type='BN', requires_grad=True)
+model = dict(
+    backbone=dict(norm_cfg=norm_cfg),
+    neck=dict(norm_cfg=norm_cfg),
+    ...)
+```
+
+### Reuse variables in \_base\_ file
+
+If the users want to reuse the variables in the base file, they can get a copy of the corresponding variable by using `{{_base_.xxx}}`. The latest version of MMEngine also supports reusing variables without `{{}}` usage.
+
+E.g:
+
+```python
+_base_ = '../_base_/default_runtime.py'
+
+pre_transform = _base_.pre_transform # `pre_transform` equals to `pre_transform` in the _base_ config
+```
+
+## Modify config through script arguments
+
+When submitting jobs using `tools/train.py` or `tools/test.py`, you may specify `--cfg-options` to in-place modify the config.
+
+- Update config keys of dict chains.
+
+  The config options can be specified following the order of the dict keys in the original config.
+  For example, `--cfg-options model.backbone.norm_eval=False` changes the all BN modules in model backbones to `train` mode.
+
+- Update keys inside a list of configs.
+
+  Some config dicts are composed as a list in your config. For example, the training pipeline `train_dataloader.dataset.pipeline` is normally a list, e.g. `[dict(type='LoadImageFromFile'), ...]`. If you want to change `'LoadImageFromFile'` to `'LoadImageFromNDArray'` in the pipeline, you may specify `--cfg-options data.train.pipeline.0.type=LoadImageFromNDArray`.
+
+- Update values of list/tuples.
+
+  Sometimes the value to update is a list or a tuple, for example, the config file normally sets `model.data_preprocessor.mean=[123.675, 116.28, 103.53]`. If you want to change the mean values, you may specify `--cfg-options model.data_preprocessor.mean="[127,127,127]"`. Note that the quotation mark `"` is necessary to support list/tuple data types, and that **NO** white space is allowed inside the quotation marks in the specified value.
+
+## Config name style
+
+We follow the below style to name config files. Contributors are advised to follow the same style.
+
+```
+{algorithm name}_{model component names [component1]_[component2]_[...]}-[version id]_[norm setting]_[data preprocessor type]_{training settings}_{training dataset information}_[testing dataset information].py
+```
+
+The file name is divided into 8 name fields, which have 4 required parts and 4 optional parts. All parts and components are connected with `_` and words of each part or component should be connected with `-`. `{}` indicates the required name field, and `[]` indicates the optional name field.
+
+- `{algorithm name}`: The name of the algorithm. It can be a detector name such as `yolov5`, `yolov6`, `yolox`, etc.
+- `{component names}`:  Names of the components used in the algorithm such as backbone, neck, etc. For example, `yolov5_s` means its `deepen_factor` is `0.33` and its `widen_factor` is `0.5`.
+- `[version_id]` (optional): Since the evolution of the YOLO series is much faster than traditional object detection algorithms, `version id` is used to distinguish the differences between different sub-versions. E.g, YOLOv5-3.0 uses the `Focus` layer as the stem layer, and YOLOv5-6.0 uses the `Conv` layer as the stem layer.
+- `[norm_setting]` (optional): `bn` indicates `Batch Normalization`, `syncbn` indicates `Synchronized Batch Normalization`。
+- `[data preprocessor type]` (optional): `fast` incorporates  [YOLOv5DetDataPreprocessor](https://github.com/open-mmlab/mmyolo/blob/main/mmyolo/models/data_preprocessors/data_preprocessor.py#L9)  and [yolov5_collate](https://github.com/open-mmlab/mmyolo/blob/main/mmyolo/datasets/utils.py#L12) to preprocess data. The training speed is faster than the default `mmdet.DetDataPreprocessor`, while results in extending the overall pipeline to multi-task learning.
+- `{training settings}`: Information of training settings such as batch size, augmentations, loss trick, scheduler, and epochs/iterations. For example: `8xb16-300e_coco` means using 8-GPUs x 16-images-per-GPU, and train 300 epochs.
+  Some abbreviations:
+  - `{gpu x batch_per_gpu}`:  GPUs and samples per GPU.  For example, `4xb4` is the short term of 4-GPUs x 4-images-per-GPU.
+  - `{schedule}`: training schedule, default option in MMYOLO is 300 epochs.
+- `{training dataset information}`: Training dataset names like `coco`, `cityscapes`, `voc-0712`, `wider-face`, and `balloon`.
+- `[testing dataset information]` (optional): Testing dataset name for models trained on one dataset but tested on another. If not mentioned, it means the model was trained and tested on the same dataset type.
diff --git a/mmdetection_practice/third_party/mmyolo/docs/en/tutorials/custom_installation.md b/mmdetection_practice/third_party/mmyolo/docs/en/tutorials/custom_installation.md
new file mode 100644
index 0000000..604a77a
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/en/tutorials/custom_installation.md
@@ -0,0 +1,109 @@
+# Customize Installation
+
+## CUDA versions
+
+When installing PyTorch, you need to specify the version of CUDA. If you are not clear on which to choose, follow our recommendations:
+
+- For Ampere-based NVIDIA GPUs, such as GeForce 30 series and NVIDIA A100, CUDA 11 is a must.
+- For older NVIDIA GPUs, CUDA 11 is backward compatible, but CUDA 10.2 offers better compatibility and is more lightweight.
+
+Please make sure the GPU driver satisfies the minimum version requirements. See [this table](https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html#cuda-major-component-versions__table-cuda-toolkit-driver-versions) for more information.
+
+```{note}
+Installing CUDA runtime libraries is enough if you follow our best practices, because no CUDA code will be compiled locally. However, if you hope to compile MMCV from source or develop other CUDA operators, you need to install the complete CUDA toolkit from NVIDIA's [website](https://developer.nvidia.com/cuda-downloads), and its version should match the CUDA version of PyTorch. i.e., the specified version of cudatoolkit in `conda install` command.
+```
+
+## Install MMEngine without MIM
+
+To install MMEngine with pip instead of MIM, please follow \[MMEngine installation guides\](https://mmengine.readthedocs.io/en/latest/get_started/installation.html).
+
+For example, you can install MMEngine by the following command.
+
+```shell
+pip install "mmengine>=0.6.0"
+```
+
+## Install MMCV without MIM
+
+MMCV contains C++ and CUDA extensions, thus depending on PyTorch in a complex way. MIM solves such dependencies automatically and makes the installation easier. However, it is not a must.
+
+To install MMCV with pip instead of MIM, please follow [MMCV installation guides](https://mmcv.readthedocs.io/en/2.x/get_started/installation.html). This requires manually specifying a find-url based on the PyTorch version and its CUDA version.
+
+For example, the following command installs MMCV built for PyTorch 1.12.x and CUDA 11.6.
+
+```shell
+pip install "mmcv>=2.0.0rc4" -f https://download.openmmlab.com/mmcv/dist/cu116/torch1.12.0/index.html
+```
+
+## Install on CPU-only platforms
+
+MMDetection can be built for the CPU-only environment. In CPU mode you can train (requires MMCV version >= `2.0.0rc1`), test, or infer a model.
+
+However, some functionalities are gone in this mode:
+
+- Deformable Convolution
+- Modulated Deformable Convolution
+- ROI pooling
+- Deformable ROI pooling
+- CARAFE
+- SyncBatchNorm
+- CrissCrossAttention
+- MaskedConv2d
+- Temporal Interlace Shift
+- nms_cuda
+- sigmoid_focal_loss_cuda
+- bbox_overlaps
+
+If you try to train/test/infer a model containing the above ops, an error will be raised.
+The following table lists affected algorithms.
+
+|                        Operator                         |                                          Model                                           |
+| :-----------------------------------------------------: | :--------------------------------------------------------------------------------------: |
+| Deformable Convolution/Modulated Deformable Convolution | DCN、Guided Anchoring、RepPoints、CentripetalNet、VFNet、CascadeRPN、NAS-FCOS、DetectoRS |
+|                      MaskedConv2d                       |                                     Guided Anchoring                                     |
+|                         CARAFE                          |                                          CARAFE                                          |
+|                      SyncBatchNorm                      |                                         ResNeSt                                          |
+
+## Install on Google Colab
+
+[Google Colab](https://research.google.com/) usually has PyTorch installed,
+thus we only need to install MMEngine, MMCV, MMDetection, and MMYOLO with the following commands.
+
+**Step 1.** Install [MMEngine](https://github.com/open-mmlab/mmengine) and [MMCV](https://github.com/open-mmlab/mmcv) using [MIM](https://github.com/open-mmlab/mim).
+
+```shell
+!pip3 install openmim
+!mim install "mmengine>=0.6.0"
+!mim install "mmcv>=2.0.0rc4,<2.1.0"
+!mim install "mmdet>=3.0.0,<4.0.0"
+```
+
+**Step 2.** Install MMYOLO from the source.
+
+```shell
+!git clone https://github.com/open-mmlab/mmyolo.git
+%cd mmyolo
+!pip install -e .
+```
+
+**Step 3.** Verification.
+
+```python
+import mmyolo
+print(mmyolo.__version__)
+# Example output: 0.1.0, or an another version.
+```
+
+```{note}
+Within Jupyter, the exclamation mark `!` is used to call external executables and `%cd` is a [magic command](https://ipython.readthedocs.io/en/stable/interactive/magics.html#magic-cd) to change the current working directory of Python.
+```
+
+## Develop using multiple MMYOLO versions
+
+The training and testing scripts have been modified in `PYTHONPATH` to ensure that the scripts use MMYOLO in the current directory.
+
+To have the default MMYOLO installed in your environment instead of what is currently in use, you can remove the code that appears in the relevant script:
+
+```shell
+PYTHONPATH="$(dirname $0)/..":$PYTHONPATH
+```
diff --git a/mmdetection_practice/third_party/mmyolo/docs/en/tutorials/data_flow.md b/mmdetection_practice/third_party/mmyolo/docs/en/tutorials/data_flow.md
new file mode 100644
index 0000000..ab0e2e6
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/en/tutorials/data_flow.md
@@ -0,0 +1,121 @@
+# Mixed image data augmentation update
+
+Mixed image data augmentation is similar to Mosaic and MixUp, in which the annotation information of multiple images needs to be obtained for fusion during the running process. In the OpenMMLab data augmentation pipeline, other indexes of the dataset are generally not available. In order to achieve the above function, in the YOLOX reproduced in MMDetection, the concept of [MultiImageMixDataset](https://github.com/open-mmlab/mmdetection/blob/master/mmdet/datasets/dataset_wrappers.py#L338) dataset wrapper is proposed.
+
+`MultiImageMixDataset` dataset wrapper will include some data augmentation methods such as `Mosaic` and `RandAffine`, while `CocoDataset` will also need to include a `pipeline` to achieve the image and annotation loading function. In this way, we can achieve mixed data augmentation quickly. The configuration method is as follows:
+
+```python
+train_pipeline = [
+    dict(type='Mosaic', img_scale=img_scale, pad_val=114.0),
+    dict(
+        type='RandomAffine',
+        scaling_ratio_range=(0.1, 2),
+        border=(-img_scale[0] // 2, -img_scale[1] // 2)),
+    dict(
+        type='MixUp',
+        img_scale=img_scale,
+        ratio_range=(0.8, 1.6),
+        pad_val=114.0),
+    ...
+]
+train_dataset = dict(
+    # use MultiImageMixDataset wrapper to support mosaic and mixup
+    type='MultiImageMixDataset',
+    dataset=dict(
+        type='CocoDataset',
+        pipeline=[
+            dict(type='LoadImageFromFile'),
+            dict(type='LoadAnnotations', with_bbox=True)
+        ]),
+    pipeline=train_pipeline)
+
+```
+
+However, this implementation has a disadvantage: users unfamiliar with MMDetection will forget those data augmentation methods like Mosaic must be used together with `MultiImageMixDataset`, increasing the usage complexity. Moreover, it is hard to understand as well.
+
+To address this problem, further simplifications are made in MMYOLO, which directly lets `pipeline` get `dataset`. In this way, the implementation of `Mosaic` and other data augmentation methods can be achieved and used just as the random flip, without a data wrapper anymore. The new configuration method is as follows:
+
+```python
+pre_transform = [
+    dict(type='LoadImageFromFile'),
+    dict(type='LoadAnnotations', with_bbox=True)
+]
+train_pipeline = [
+    *pre_transform,
+    dict(
+        type='Mosaic',
+        img_scale=img_scale,
+        pad_val=114.0,
+        pre_transform=pre_transform),
+    dict(
+        type='mmdet.RandomAffine',
+        scaling_ratio_range=(0.1, 2),
+        border=(-img_scale[0] // 2, -img_scale[1] // 2)),
+    dict(
+        type='YOLOXMixUp',
+        img_scale=img_scale,
+        ratio_range=(0.8, 1.6),
+        pad_val=114.0,
+        pre_transform=pre_transform),
+    ...
+]
+```
+
+A more complex YOLOv5-m configuration including MixUp is shown as follows:
+
+```python
+mosaic_affine_pipeline = [
+    dict(
+        type='Mosaic',
+        img_scale=img_scale,
+        pad_val=114.0,
+        pre_transform=pre_transform),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        scaling_ratio_range=(1 - affine_scale, 1 + affine_scale),
+        border=(-img_scale[0] // 2, -img_scale[1] // 2),
+        border_val=(114, 114, 114))
+]
+
+# enable mixup
+train_pipeline = [
+    *pre_transform, *mosaic_affine_pipeline,
+    dict(
+        type='YOLOv5MixUp',
+        prob=0.1,
+        pre_transform=[*pre_transform, *mosaic_affine_pipeline]),
+    dict(
+        type='mmdet.Albu',
+        transforms=albu_train_transforms,
+        bbox_params=dict(
+            type='BboxParams',
+            format='pascal_voc',
+            label_fields=['gt_bboxes_labels', 'gt_ignore_flags']),
+        keymap={
+            'img': 'image',
+            'gt_bboxes': 'bboxes'
+        }),
+    dict(type='YOLOv5HSVRandomAug'),
+    dict(type='mmdet.RandomFlip', prob=0.5),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                   'flip_direction'))
+]
+```
+
+It is very easy to use, just pass the object of Dataset to the pipeline.
+
+```python
+def prepare_data(self, idx) -> Any:
+   """Pass the dataset to the pipeline during training to support mixed
+   data augmentation, such as Mosaic and MixUp."""
+   if self.test_mode is False:
+        data_info = self.get_data_info(idx)
+        data_info['dataset'] = self
+        return self.pipeline(data_info)
+    else:
+        return super().prepare_data(idx)
+```
diff --git a/mmdetection_practice/third_party/mmyolo/docs/en/tutorials/faq.md b/mmdetection_practice/third_party/mmyolo/docs/en/tutorials/faq.md
new file mode 100644
index 0000000..ca2a0b2
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/en/tutorials/faq.md
@@ -0,0 +1,101 @@
+# Frequently Asked Questions
+
+We list some common problems many users face and their corresponding solutions here. Feel free to enrich the list if you find any frequent issues and have ways to help others to solve them. If the contents here do not cover your issue, please create an [issue](https://github.com/open-mmlab/mmyolo/issues/new/choose) and make sure you fill in all the required information in the template.
+
+## Why do we need to launch MMYOLO?
+
+Why do we need to launch MMYOLO? Why do we need to open a separate repository instead of putting it directly into MMDetection? Since the open source, we have been receiving similar questions from our community partners, and the answers can be summarized in the following three points.
+
+**(1) Unified operation and inference platform**
+
+At present, there are very many improved algorithms for YOLO in the field of target detection, and they are very popular, but such algorithms are based on different frameworks for different back-end implementations, and there are significant differences, lacking a unified and convenient fair evaluation process from training to deployment.
+
+**(2) Protocol limitations**
+
+As we all know, YOLOv5 and its derived algorithms, such as YOLOv6 and YOLOv7 are GPL 3.0 protocols, which differ from the Apache protocol of MMDetection. Therefore, due to the protocol issue, it is not possible to incorporate MMYOLO directly into MMDetection.
+
+**(3) Multitasking support**
+
+There is another far-reaching reason: **MMYOLO tasks are not limited to MMDetection**, and more tasks will be supported in the future, such as MMPose based keypoint-related applications and MMTracking based tracking related applications, so it is not suitable to be directly incorporated into MMDetection.
+
+## What is the projects folder used for?
+
+The `projects` folder is newly introduced in OpenMMLab 2.0. There are three primary purposes:
+
+1. facilitate community contributors: Since OpenMMLab series codebases have a rigorous code management process, this inevitably leads to long algorithm reproduction cycles, which is not friendly to community contributions.
+2. facilitate rapid support for new algorithms: A long development cycle can also lead to another problem users may not be able to experience the latest algorithms as soon as possible.
+3. facilitate rapid support for new approaches and features: New approaches or new features may be incompatible with the current design of the codebases and cannot be quickly incorporated.
+
+In summary, the `projects` folder solves the problems of slow support for new algorithms and complicated support for new features due to the long algorithm reproduction cycle. Each folder in `projects` is an entirely independent project, and community users can quickly support some algorithms in the current version through `projects`. This allows the community to quickly use new algorithms and features that are difficult to adapt in the current version. When the design is stable or the code meets the merge specification, it will be considered to merge into the main branch.
+
+## Why does the performance drop significantly by switching the YOLOv5 backbone to Swin?
+
+In [Replace the backbone network](../recommended_topics/replace_backbone.md), we provide many tutorials on replacing the backbone module. However, you may not get a desired result once you replace the module and start directly training the model. This is because different networks have very distinct hyperparameters. Take the backbones of Swin and YOLOv5 as an example. Swin belongs to the transformer family, and the YOLOv5 is a convolutional network. Their training optimizers, learning rates, and other hyperparameters are different. If we force using Swin as the backbone of YOLOv5 and try to get a moderate performance, we must modify many parameters.
+
+## How to use the components implemented in all MM series repositories?
+
+In OpenMMLab 2.0, we have enhanced the ability to use different modules across MM series libraries. Currently, users can call any module that has been registered in MM series algorithm libraries via `MM Algorithm Library A. Module Name`. We demonstrated using MMClassification backbones in the [Replace the backbone network](../recommended_topics/replace_backbone.md). Other modules can be used in the same way.
+
+## Can pure background pictures be added in MMYOLO for training?
+
+Adding pure background images to training can suppress the false positive rate in most scenarios, and this feature has already been supported for most datasets. Take `YOLOv5CocoDataset` as an example. The control parameter is `train_dataloader.dataset.filter_cfg.filter_empty_gt`. If `filter_empty_gt` is True, the pure background images will be filtered out and not used in training, and vice versa. Most of the algorithms in MMYOLO have added this feature by default.
+
+## Is there a script to calculate the inference FPS in MMYOLO?
+
+MMYOLO is based on MMDet 3.x, which provides a [benchmark script](https://github.com/open-mmlab/mmdetection/blob/3.x/tools/analysis_tools/benchmark.py) to calculate the inference FPS. We recommend using `mim` to run the script in MMDet directly across the library instead of copying them to MMYOLO. More details about `mim` usages can be found at [Use mim to run scripts from other OpenMMLab repositories](../common_usage/mim_usage.md).
+
+## What is the difference between MMDeploy and EasyDeploy?
+
+MMDeploy is developed and maintained by the OpenMMLab deployment team to provide model deployment solutions for the OpenMMLab series algorithms, which support various inference backends and customization features. EasyDeploy is an easier and more lightweight deployment project provided by the community. However, it does not support as many features as MMDeploy. Users can choose which one to use in MMYOLO according to their needs.
+
+## How to check the AP of every category in COCOMetric?
+
+Just set `test_evaluator.classwise` to True or add `--cfg-options test_evaluator.classwise=True` when running the test script.
+
+## Why doesn't MMYOLO support the auto-learning rate scaling feature as MMDet?
+
+It is because the YOLO series algorithms are not very well suited for linear scaling. We have verified on several datasets that the performance is better without the auto-scaling based on batch size.
+
+## Why is the weight size of my trained model larger than the official one?
+
+The reason is that user-trained weights usually include extra data such as `optimizer`, `ema_state_dict`, and `message_hub`, which are removed when we publish the models. While on the contrary, the weight users trained by themselves are kept. You can use the [publish_model.py](https://github.com/open-mmlab/mmyolo/blob/main/tools/misc/publish_model.py) to remove these unnecessary components.
+
+## Why does the RTMDet cost more graphics memory during the training than YOLOv5?
+
+It is due to the assigner in RTMDet. YOLOv5 uses a simple and efficient shape-matching assigner, while RTMDet uses a dynamic soft label assigner for entire batch computation. Therefore, it consumes more memory in its internal cost matrix, especially when there are too many labeled bboxes in the current batch. We are considering solving this problem soon.
+
+## Do I need to reinstall MMYOLO after modifying some code?
+
+Without adding any new python code, and if you installed the MMYOLO by `mim install -v -e .`, any new modifications will take effect without reinstalling. However, if you add new python codes and are using them, you need to reinstall with `mim install -v -e .`.
+
+## How to use multiple versions of MMYOLO to develop?
+
+If users have multiple versions of the MMYOLO, such as mmyolo-v1 and mmyolo-v2. They can specify the target version of their MMYOLO by using this command in the shell:
+
+```shell
+PYTHONPATH="$(dirname $0)/..":$PYTHONPATH
+```
+
+Users can unset the `PYTHONPATH` when they want to reset to the default MMYOLO by this command:
+
+```shell
+unset PYTHONPATH
+```
+
+## How to save the best checkpoints during the training?
+
+Users can choose what metrics to filter the best models by setting the `default_hooks.checkpoint.save_best` in the configuration. Take the COCO dataset detection task as an example. Users can customize the `default_hooks.checkpoint.save_best` with these parameters:
+
+1. `auto` works based on the first evaluation metric in the validation set.
+2. `coco/bbox_mAP` works based on `bbox_mAP`.
+3. `coco/bbox_mAP_50` works based on `bbox_mAP_50`.
+4. `coco/bbox_mAP_75` works based on `bbox_mAP_75`.
+5. `coco/bbox_mAP_s` works based on `bbox_mAP_s`.
+6. `coco/bbox_mAP_m` works based on `bbox_mAP_m`.
+7. `coco/bbox_mAP_l` works based on `bbox_mAP_l`.
+
+In addition, users can also choose the filtering logic by setting `default_hooks.checkpoint.rule` in the configuration. For example, `default_hooks.checkpoint.rule=greater` means that the larger the indicator is, the better it is. More details can be found at [checkpoint_hook](https://github.com/open-mmlab/mmengine/blob/main/mmengine/hooks/checkpoint_hook.py).
+
+## How to train and test with non-square input sizes?
+
+The default configurations of the YOLO series algorithms are mostly squares like 640x640 or 1280x1280. However, if users want to train with a non-square shape, they can modify the `image_scale` to the desired value in the configuration. A more detailed example could be found at [yolov5_s-v61_fast_1xb12-40e_608x352_cat.py](https://github.com/open-mmlab/mmyolo/tree/dev/configs/yolov5/yolov5_s-v61_fast_1xb12-40e_608x352_cat.py).
diff --git a/mmdetection_practice/third_party/mmyolo/docs/en/tutorials/rotated_detection.md b/mmdetection_practice/third_party/mmyolo/docs/en/tutorials/rotated_detection.md
new file mode 100644
index 0000000..c0addb0
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/en/tutorials/rotated_detection.md
@@ -0,0 +1,3 @@
+# Rotated Object Detection
+
+TODO
diff --git a/mmdetection_practice/third_party/mmyolo/docs/en/tutorials/warning_notes.md b/mmdetection_practice/third_party/mmyolo/docs/en/tutorials/warning_notes.md
new file mode 100644
index 0000000..791cd9d
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/en/tutorials/warning_notes.md
@@ -0,0 +1,24 @@
+# Common Warning Notes
+
+The purpose of this document is to collect warning messages that users often find confusing, and provide explanations to facilitate understanding.
+
+## xxx registry in mmyolo did not set import location
+
+The warning message complete information is that The xxx registry in mmyolo did not set import location. Fallback to call `mmyolo.utils.register_all_modules` instead.
+
+This warning means that a module was not set with an import location when importing it, making it impossible to determine its location. Therefore, `mmyolo.utils.register_all_modules` is automatically called to trigger the package import.
+This warning belongs to the very low-level module warning in MMEngine, which may be difficult for users to understand, but it has no impact on the actual use and can be ignored directly.
+
+## save_param_schedulers is true but self.param_schedulers is None
+
+The following information is an example using the YOLOv5 algorithm. This is because the parameter scheduler strategy `YOLOv5ParamSchedulerHook` has been rewritten in YOLOv5, so the ParamScheduler designed in MMEngine is not used. However, `save_param_schedulers` is not set to False in the YOLOv5 configuration.
+
+First of all, this warning has no impact on performance and resuming training. If users think this warning affects experience, you can set `default_hooks.checkpoint.save_param_scheduler` to False, or set `--cfg-options default_hooks.checkpoint.save_param_scheduler=False` when training via the command line.
+
+## The loss_cls will be 0. This is a normal phenomenon.
+
+This is related to specific algorithms. Taking YOLOv5 as an example, its classification loss only considers positive samples. If the number of classes is 1, then the classification loss and object loss are functionally redundant. Therefore, in the design, when the number of classes is 1, the loss_cls is not calculated and is always 0. This is a normal phenomenon.
+
+## The model and loaded state dict do not match exactly
+
+Whether this warning will affect performance needs to be determined based on more information. If it occurs during fine-tuning, it is a normal phenomenon that the COCO pre-trained weights of the Head module cannot be loaded due to the user's custom class differences, and it will not affect performance.
diff --git a/mmdetection_practice/third_party/mmyolo/docs/en/useful_tools/browse_coco_json.md b/mmdetection_practice/third_party/mmyolo/docs/en/useful_tools/browse_coco_json.md
new file mode 100644
index 0000000..772b8a5
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/en/useful_tools/browse_coco_json.md
@@ -0,0 +1,62 @@
+# Visualize COCO labels
+
+`tools/analysis_tools/browse_coco_json.py` is a script that can visualization to display the COCO label in the picture.
+
+```shell
+python tools/analysis_tools/browse_coco_json.py [--data-root ${DATA_ROOT}] \
+                                                [--img-dir ${IMG_DIR}] \
+                                                [--ann-file ${ANN_FILE}] \
+                                                [--wait-time ${WAIT_TIME}] \
+                                                [--disp-all] [--category-names CATEGORY_NAMES [CATEGORY_NAMES ...]] \
+                                                [--shuffle]
+```
+
+If images and labels are in the same folder, you can specify `--data-root` to the folder, and then `--img-dir` and `--ann-file` to specify the relative path of the folder. The code will be automatically spliced.
+If the image and label files are not in the same folder, you do not need to specify `--data-root`, but directly specify `--img-dir` and `--ann-file` of the absolute path.
+
+E.g:
+
+1. Visualize all categories of `COCO` and display all types of annotations such as `bbox` and `mask`:
+
+```shell
+python tools/analysis_tools/browse_coco_json.py --data-root './data/coco' \
+                                                --img-dir 'train2017' \
+                                                --ann-file 'annotations/instances_train2017.json' \
+                                                --disp-all
+```
+
+If images and labels are not in the same folder, you can use a absolutely path:
+
+```shell
+python tools/analysis_tools/browse_coco_json.py --img-dir '/dataset/image/coco/train2017' \
+                                                --ann-file '/label/instances_train2017.json' \
+                                                --disp-all
+```
+
+2. Visualize all categories of `COCO`, and display only the `bbox` type labels, and shuffle the image to show:
+
+```shell
+python tools/analysis_tools/browse_coco_json.py --data-root './data/coco' \
+                                                --img-dir 'train2017' \
+                                                --ann-file 'annotations/instances_train2017.json' \
+                                                --shuffle
+```
+
+3. Only visualize the `bicycle` and `person` categories of `COCO` and only the `bbox` type labels are displayed:
+
+```shell
+python tools/analysis_tools/browse_coco_json.py --data-root './data/coco' \
+                                                --img-dir 'train2017' \
+                                                --ann-file 'annotations/instances_train2017.json' \
+                                                --category-names 'bicycle' 'person'
+```
+
+4. Visualize all categories of `COCO`, and display all types of label such as `bbox`, `mask`, and shuffle the image to show:
+
+```shell
+python tools/analysis_tools/browse_coco_json.py --data-root './data/coco' \
+                                                --img-dir 'train2017' \
+                                                --ann-file 'annotations/instances_train2017.json' \
+                                                --disp-all \
+                                                --shuffle
+```
diff --git a/mmdetection_practice/third_party/mmyolo/docs/en/useful_tools/browse_dataset.md b/mmdetection_practice/third_party/mmyolo/docs/en/useful_tools/browse_dataset.md
new file mode 100644
index 0000000..f066d22
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/en/useful_tools/browse_dataset.md
@@ -0,0 +1,42 @@
+# Visualize Datasets
+
+`tools/analysis_tools/browse_dataset.py` helps the user to browse a detection dataset (both images and bounding box annotations) visually, or save the image to a designated directory.
+
+```shell
+python tools/analysis_tools/browse_dataset.py ${CONFIG} \
+                                              [--out-dir ${OUT_DIR}] \
+                                              [--not-show] \
+                                              [--show-interval ${SHOW_INTERVAL}]
+```
+
+E,g:
+
+1. Use `config` file `configs/yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py` to visualize the picture. The picture will pop up directly and be saved to the directory `work_dirs/browse_ dataset` at the same time:
+
+```shell
+python tools/analysis_tools/browse_dataset.py 'configs/yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py' \
+                                              --out-dir 'work_dirs/browse_dataset'
+```
+
+2. Use `config` file `configs/yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py` to visualize the picture. The picture will pop up and display directly. Each picture lasts for `10` seconds. At the same time, it will be saved to the directory `work_dirs/browse_ dataset`:
+
+```shell
+python tools/analysis_tools/browse_dataset.py 'configs/yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py' \
+                                              --out-dir 'work_dirs/browse_dataset' \
+                                              --show-interval 10
+```
+
+3. Use `config` file `configs/yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py` to visualize the picture. The picture will pop up and display directly. Each picture lasts for `10` seconds and the picture will not be saved:
+
+```shell
+python tools/analysis_tools/browse_dataset.py 'configs/yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py' \
+                                              --show-interval 10
+```
+
+4. Use `config` file `configs/yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py` to visualize the picture. The picture will not pop up directly, but only saved to the directory `work_dirs/browse_ dataset`:
+
+```shell
+python tools/analysis_tools/browse_dataset.py 'configs/yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py' \
+                                              --out-dir 'work_dirs/browse_dataset' \
+                                              --not-show
+```
diff --git a/mmdetection_practice/third_party/mmyolo/docs/en/useful_tools/dataset_analysis.md b/mmdetection_practice/third_party/mmyolo/docs/en/useful_tools/dataset_analysis.md
new file mode 100644
index 0000000..c6149e9
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/en/useful_tools/dataset_analysis.md
@@ -0,0 +1,79 @@
+# Visualize dataset analysis
+
+`tools/analysis_tools/dataset_analysis.py` help users get the renderings of the four functions, and save the pictures to the `dataset_analysis` folder under the current running directory.
+
+Description of the script's functions:
+
+The data required by each sub function is obtained through the data preparation of `main()`.
+
+Function 1: Generated by the sub function `show_bbox_num` to display the distribution of categories and bbox instances.
+
+<img src="https://user-images.githubusercontent.com/90811472/200314770-4fb21626-72f2-4a4c-be5d-bf860ad830ec.jpg"/>
+
+Function 2: Generated by the sub function `show_bbox_wh` to display the width and height distribution of categories and bbox instances.
+
+<img src="https://user-images.githubusercontent.com/90811472/200315007-96e8e795-992a-4c72-90fa-f6bc00b3f2c7.jpg"/>
+
+Function 3: Generated by the sub function `show_bbox_wh_ratio` to display the width to height ratio distribution of categories and bbox instances.
+
+<img src="https://user-images.githubusercontent.com/90811472/200315044-4bdedcf6-087a-418e-8fe8-c2d3240ceba8.jpg"/>
+
+Function 3: Generated by the sub function `show_bbox_area` to display the distribution map of category and bbox instance area based on area rules.
+
+<img src="https://user-images.githubusercontent.com/90811472/200315075-71680fe2-db6f-4981-963e-a035c1281fc1.jpg"/>
+
+Print List: Generated by the sub function `show_class_list` and `show_data_list`.
+
+<img src="https://user-images.githubusercontent.com/90811472/200315152-9d6df91c-f2d2-4bba-9f95-b790fac37b62.jpg"/>
+
+```shell
+python tools/analysis_tools/dataset_analysis.py ${CONFIG} \
+                                                [--type ${TYPE}] \
+                                                [--class-name ${CLASS_NAME}] \
+                                                [--area-rule ${AREA_RULE}] \
+                                                [--func ${FUNC}] \
+                                                [--out-dir ${OUT_DIR}]
+```
+
+E,g:
+
+1.Use `config` file `configs/yolov5/voc/yolov5_s-v61_fast_1xb64-50e_voc.py` analyze the dataset, By default,the data loading type is `train_dataset`, the area rule is `[0,32,96,1e5]`, generate a result graph containing all functions and save the graph to the current running directory `./dataset_analysis` folder:
+
+```shell
+python tools/analysis_tools/dataset_analysis.py configs/yolov5/voc/yolov5_s-v61_fast_1xb64-50e_voc.py
+```
+
+2.Use `config` file `configs/yolov5/voc/yolov5_s-v61_fast_1xb64-50e_voc.py` analyze the dataset, change the data loading type from the default `train_dataset` to `val_dataset` through the `--val-dataset` setting:
+
+```shell
+python tools/analysis_tools/dataset_analysis.py configs/yolov5/voc/yolov5_s-v61_fast_1xb64-50e_voc.py \
+                                                --val-dataset
+```
+
+3.Use `config` file `configs/yolov5/voc/yolov5_s-v61_fast_1xb64-50e_voc.py` analyze the dataset, change the display of all generated classes to specific classes. Take the display of `person` classes as an example:
+
+```shell
+python tools/analysis_tools/dataset_analysis.py configs/yolov5/voc/yolov5_s-v61_fast_1xb64-50e_voc.py \
+                                                --class-name person
+```
+
+4.Use `config` file `configs/yolov5/voc/yolov5_s-v61_fast_1xb64-50e_voc.py` analyze the dataset, redefine the area rule through `--area-rule` . Take `30 70 125` as an example, the area rule becomes `[0,30,70,125,1e5]`:
+
+```shell
+python tools/analysis_tools/dataset_analysis.py configs/yolov5/voc/yolov5_s-v61_fast_1xb64-50e_voc.py \
+                                                --area-rule 30 70 125
+```
+
+5.Use `config` file `configs/yolov5/voc/yolov5_s-v61_fast_1xb64-50e_voc.py` analyze the dataset, change the display of four function renderings to only display `Function 1` as an example:
+
+```shell
+python tools/analysis_tools/dataset_analysis.py configs/yolov5/voc/yolov5_s-v61_fast_1xb64-50e_voc.py \
+                                                --func show_bbox_num
+```
+
+6.Use `config` file `configs/yolov5/voc/yolov5_s-v61_fast_1xb64-50e_voc.py` analyze the dataset, modify the picture saving address to `work_dirs/dataset_analysis`:
+
+```shell
+python tools/analysis_tools/dataset_analysis.py configs/yolov5/voc/yolov5_s-v61_fast_1xb64-50e_voc.py \
+                                                --out-dir work_dirs/dataset_analysis
+```
diff --git a/mmdetection_practice/third_party/mmyolo/docs/en/useful_tools/dataset_converters.md b/mmdetection_practice/third_party/mmyolo/docs/en/useful_tools/dataset_converters.md
new file mode 100644
index 0000000..72ad968
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/en/useful_tools/dataset_converters.md
@@ -0,0 +1,55 @@
+# Dataset Conversion
+
+The folder `tools/data_converters` currently contains `ballon2coco.py`, `yolo2coco.py`, and `labelme2coco.py` - three dataset conversion tools.
+
+- `ballon2coco.py` converts the `balloon` dataset (this small dataset is for starters only) to COCO format.
+
+```shell
+python tools/dataset_converters/balloon2coco.py
+```
+
+- `yolo2coco.py` converts a dataset from `yolo-style` **.txt** format to COCO format, please use it as follows:
+
+```shell
+python tools/dataset_converters/yolo2coco.py /path/to/the/root/dir/of/your_dataset
+```
+
+Instructions:
+
+1. `image_dir` is the root directory of the yolo-style dataset you need to pass to the script, which should contain `images`, `labels`, and `classes.txt`. `classes.txt` is the class declaration corresponding to the current dataset. One class a line. The structure of the root directory should be formatted as this example shows:
+
+```bash
+.
+└── $ROOT_PATH
+    ├── classes.txt
+    ├── labels
+    │    ├── a.txt
+    │    ├── b.txt
+    │    └── ...
+    ├── images
+    │    ├── a.jpg
+    │    ├── b.png
+    │    └── ...
+    └── ...
+```
+
+2. The script will automatically check if `train.txt`, `val.txt`, and `test.txt` have already existed under `image_dir`. If these files are located, the script will organize the dataset accordingly. Otherwise, the script will convert the dataset into one file. The image paths in these files must be **ABSOLUTE** paths.
+3. By default, the script will create a folder called `annotations` in the `image_dir` directory which stores the converted JSON file. If `train.txt`, `val.txt`, and `test.txt` are not found, the output file is `result.json`. Otherwise, the corresponding JSON file will be generated, named as `train.json`, `val.json`, and `test.json`. The `annotations` folder may look similar to this:
+
+```bash
+.
+└── $ROOT_PATH
+    ├── annotations
+    │    ├── result.json
+    │    └── ...
+    ├── classes.txt
+    ├── labels
+    │    ├── a.txt
+    │    ├── b.txt
+    │    └── ...
+    ├── images
+    │    ├── a.jpg
+    │    ├── b.png
+    │    └── ...
+    └── ...
+```
diff --git a/mmdetection_practice/third_party/mmyolo/docs/en/useful_tools/download_dataset.md b/mmdetection_practice/third_party/mmyolo/docs/en/useful_tools/download_dataset.md
new file mode 100644
index 0000000..8a3e57e
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/en/useful_tools/download_dataset.md
@@ -0,0 +1,11 @@
+# Download Dataset
+
+`tools/misc/download_dataset.py` supports downloading datasets such as `COCO`, `VOC`, `LVIS` and `Balloon`.
+
+```shell
+python tools/misc/download_dataset.py --dataset-name coco2017
+python tools/misc/download_dataset.py --dataset-name voc2007
+python tools/misc/download_dataset.py --dataset-name voc2012
+python tools/misc/download_dataset.py --dataset-name lvis
+python tools/misc/download_dataset.py --dataset-name balloon [--save-dir ${SAVE_DIR}] [--unzip]
+```
diff --git a/mmdetection_practice/third_party/mmyolo/docs/en/useful_tools/extract_subcoco.md b/mmdetection_practice/third_party/mmyolo/docs/en/useful_tools/extract_subcoco.md
new file mode 100644
index 0000000..b2c7e06
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/en/useful_tools/extract_subcoco.md
@@ -0,0 +1,60 @@
+# Extracts a subset of COCO
+
+The training dataset of the COCO2017 dataset includes 118K images, and the validation set includes 5K images, which is a relatively large dataset. Loading JSON in debugging or quick verification scenarios will consume more resources and bring slower startup speed.
+
+The `extract_subcoco.py` script provides the ability to extract a specified number/classes/area-size of images. The user can use the `--num-img`, `--classes`, `--area-size` parameter to get a COCO subset of the specified condition of images.
+
+For example, extract images use scripts as follows:
+
+```shell
+python tools/misc/extract_subcoco.py \
+    ${ROOT} \
+    ${OUT_DIR} \
+    --num-img 20 \
+    --classes cat dog person \
+    --area-size small
+```
+
+It gone be extract 20 images, and only includes annotations which belongs to cat(or dog/person) and bbox area size is small, after filter by class and area size, the empty annotation images won't be chosen, guarantee the images be extracted definitely has annotation info.
+
+Currently, only support COCO2017. In the future will support user-defined datasets of standard coco JSON format.
+
+The root path folder format is as follows:
+
+```text
+├── root
+│   ├── annotations
+│   ├── train2017
+│   ├── val2017
+│   ├── test2017
+```
+
+1. Extract 10 training images and 10 validation images using only 5K validation sets.
+
+```shell
+python tools/misc/extract_subcoco.py ${ROOT} ${OUT_DIR} --num-img 10
+```
+
+2. Extract 20 training images using the training set and 20 validation images using the validation set.
+
+```shell
+python tools/misc/extract_subcoco.py ${ROOT} ${OUT_DIR} --num-img 20 --use-training-set
+```
+
+3. Set the global seed to 1. The default is no setting.
+
+```shell
+python tools/misc/extract_subcoco.py ${ROOT} ${OUT_DIR} --num-img 20 --use-training-set --seed 1
+```
+
+4. Extract images by specify classes
+
+```shell
+python tools/misc/extract_subcoco.py ${ROOT} ${OUT_DIR} --classes cat dog person
+```
+
+5. Extract images by specify anchor size
+
+```shell
+python tools/misc/extract_subcoco.py ${ROOT} ${OUT_DIR} --area-size small
+```
diff --git a/mmdetection_practice/third_party/mmyolo/docs/en/useful_tools/log_analysis.md b/mmdetection_practice/third_party/mmyolo/docs/en/useful_tools/log_analysis.md
new file mode 100644
index 0000000..c45170a
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/en/useful_tools/log_analysis.md
@@ -0,0 +1,82 @@
+# Log Analysis
+
+## Curve plotting
+
+`tools/analysis_tools/analyze_logs.py` in MMDetection plots loss/mAP curves given a training log file. Run `pip install seaborn` first to install the dependency.
+
+```shell
+mim run mmdet analyze_logs plot_curve \
+    ${LOG} \                                     # path of train log in json format
+    [--keys ${KEYS}] \                           # the metric that you want to plot, default to 'bbox_mAP'
+    [--start-epoch ${START_EPOCH}]               # the epoch that you want to start, default to 1
+    [--eval-interval ${EVALUATION_INTERVAL}] \   # the evaluation interval when training, default to 1
+    [--title ${TITLE}] \                         # title of figure
+    [--legend ${LEGEND}] \                       # legend of each plot, default to None
+    [--backend ${BACKEND}] \                     # backend of plt, default to None
+    [--style ${STYLE}] \                         # style of plt, default to 'dark'
+    [--out ${OUT_FILE}]                          # the path of output file
+# [] stands for optional parameters, when actually entering the command line, you do not need to enter []
+```
+
+Examples:
+
+- Plot the classification loss of some run.
+
+  ```shell
+  mim run mmdet analyze_logs plot_curve \
+      yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700.log.json \
+      --keys loss_cls \
+      --legend loss_cls
+  ```
+
+  <img src="https://user-images.githubusercontent.com/27466624/204747359-754555df-1f97-4d5c-87ca-9ad3a0badcce.png" width="600"/>
+
+- Plot the classification and regression loss of some run, and save the figure to a pdf.
+
+  ```shell
+  mim run mmdet analyze_logs plot_curve \
+      yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700.log.json \
+      --keys loss_cls loss_bbox \
+      --legend loss_cls loss_bbox \
+      --out losses_yolov5_s.pdf
+  ```
+
+  <img src="https://user-images.githubusercontent.com/27466624/204748560-2d17ce4b-fb5f-4732-a962-329109e73aad.png" width="600"/>
+
+- Compare the bbox mAP of two runs in the same figure.
+
+  ```shell
+  mim run mmdet analyze_logs plot_curve \
+      yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700.log.json \
+      yolov5_n-v61_syncbn_fast_8xb16-300e_coco_20220919_090739.log.json \
+      --keys bbox_mAP \
+      --legend yolov5_s yolov5_n \
+      --eval-interval 10 # Note that the evaluation interval must be the same as during training. Otherwise, it will raise an error.
+  ```
+
+<img src="https://user-images.githubusercontent.com/27466624/204748704-21db9f9e-386e-449c-91c7-2ce3f8b51f24.png" width="600"/>
+
+## Compute the average training speed
+
+```shell
+mim run mmdet analyze_logs cal_train_time \
+    ${LOG} \                                # path of train log in json format
+    [--include-outliers]                    # include the first value of every epoch when computing the average time
+```
+
+Examples:
+
+```shell
+mim run mmdet analyze_logs cal_train_time \
+    yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700.log.json
+```
+
+The output is expected to be like the following.
+
+```text
+-----Analyze train time of yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700.log.json-----
+slowest epoch 278, average time is 0.1705 s/iter
+fastest epoch 300, average time is 0.1510 s/iter
+time std over epochs is 0.0026
+average iter time: 0.1556 s/iter
+```
diff --git a/mmdetection_practice/third_party/mmyolo/docs/en/useful_tools/model_converters.md b/mmdetection_practice/third_party/mmyolo/docs/en/useful_tools/model_converters.md
new file mode 100644
index 0000000..09fb52d
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/en/useful_tools/model_converters.md
@@ -0,0 +1,54 @@
+# Convert Model
+
+The six scripts under the `tools/model_converters` directory can help users convert the keys in the official pre-trained model of YOLO to the format of MMYOLO, and use MMYOLO to fine-tune the model.
+
+## YOLOv5
+
+Take conversion `yolov5s.pt` as an example:
+
+1. Clone the official YOLOv5 code to the local (currently the maximum supported version is `v6.1`):
+
+```shell
+git clone -b v6.1 https://github.com/ultralytics/yolov5.git
+cd yolov5
+```
+
+2. Download official weight file:
+
+```shell
+wget https://github.com/ultralytics/yolov5/releases/download/v6.1/yolov5s.pt
+```
+
+3. Copy file `tools/model_converters/yolov5_to_mmyolo.py` to the path of YOLOv5 official code clone:
+
+```shell
+cp ${MMDET_YOLO_PATH}/tools/model_converters/yolov5_to_mmyolo.py yolov5_to_mmyolo.py
+```
+
+4. Conversion
+
+```shell
+python yolov5_to_mmyolo.py --src ${WEIGHT_FILE_PATH} --dst mmyolov5.pt
+```
+
+The converted `mmyolov5.pt` can be used by MMYOLO. The official weight conversion of YOLOv6 is also used in the same way.
+
+## YOLOX
+
+The conversion of YOLOX model **does not need** to download the official YOLOX code, just download the weight.
+
+Take conversion `yolox_s.pth` as an example:
+
+1. Download official weight file:
+
+```shell
+wget https://github.com/Megvii-BaseDetection/YOLOX/releases/download/0.1.1rc0/yolox_s.pth
+```
+
+2. Conversion
+
+```shell
+python tools/model_converters/yolox_to_mmyolo.py --src yolox_s.pth --dst mmyolox.pt
+```
+
+The converted `mmyolox.pt` can be used by MMYOLO.
diff --git a/mmdetection_practice/third_party/mmyolo/docs/en/useful_tools/optimize_anchors.md b/mmdetection_practice/third_party/mmyolo/docs/en/useful_tools/optimize_anchors.md
new file mode 100644
index 0000000..460bc6e
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/en/useful_tools/optimize_anchors.md
@@ -0,0 +1,38 @@
+# Optimize anchors size
+
+Script `tools/analysis_tools/optimize_anchors.py` supports three methods to optimize YOLO anchors including `k-means`
+anchor cluster, `Differential Evolution` and `v5-k-means`.
+
+## k-means
+
+In k-means method, the distance criteria is based IoU, python shell as follow:
+
+```shell
+python tools/analysis_tools/optimize_anchors.py ${CONFIG} \
+                                                --algorithm k-means \
+                                                --input-shape ${INPUT_SHAPE [WIDTH HEIGHT]} \
+                                                --out-dir ${OUT_DIR}
+```
+
+## Differential Evolution
+
+In differential_evolution method, based differential evolution algorithm, use `avg_iou_cost` as minimum target function, python shell as follow:
+
+```shell
+python tools/analysis_tools/optimize_anchors.py ${CONFIG} \
+                                                --algorithm DE \
+                                                --input-shape ${INPUT_SHAPE [WIDTH HEIGHT]} \
+                                                --out-dir ${OUT_DIR}
+```
+
+## v5-k-means
+
+In v5-k-means method, clustering standard as same with YOLOv5 which use shape-match, python shell as follow:
+
+```shell
+python tools/analysis_tools/optimize_anchors.py ${CONFIG} \
+                                                --algorithm v5-k-means \
+                                                --input-shape ${INPUT_SHAPE [WIDTH HEIGHT]} \
+                                                --prior_match_thr ${PRIOR_MATCH_THR} \
+                                                --out-dir ${OUT_DIR}
+```
diff --git a/mmdetection_practice/third_party/mmyolo/docs/en/useful_tools/print_config.md b/mmdetection_practice/third_party/mmyolo/docs/en/useful_tools/print_config.md
new file mode 100644
index 0000000..2a6ee79
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/en/useful_tools/print_config.md
@@ -0,0 +1,20 @@
+# Print the whole config
+
+`print_config.py` in MMDetection prints the whole config verbatim, expanding all its imports. The command is as following.
+
+```shell
+mim run mmdet print_config \
+    ${CONFIG} \                              # path of the config file
+    [--save-path] \                          # save path of whole config, suffixed with .py, .json or .yml
+    [--cfg-options ${OPTIONS [OPTIONS...]}]  # override some settings in the used config
+```
+
+Examples:
+
+```shell
+mim run mmdet print_config \
+    configs/yolov5/yolov5_s-v61_syncbn_fast_1xb4-300e_balloon.py \
+    --save-path ./work_dirs/yolov5_s-v61_syncbn_fast_1xb4-300e_balloon.py
+```
+
+Running the above command will save the `yolov5_s-v61_syncbn_fast_1xb4-300e_balloon.py` config file with the inheritance relationship expanded to \`\`yolov5_s-v61_syncbn_fast_1xb4-300e_balloon_whole.py`in the`./work_dirs\` folder.
diff --git a/mmdetection_practice/third_party/mmyolo/docs/en/useful_tools/vis_scheduler.md b/mmdetection_practice/third_party/mmyolo/docs/en/useful_tools/vis_scheduler.md
new file mode 100644
index 0000000..f152634
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/en/useful_tools/vis_scheduler.md
@@ -0,0 +1,44 @@
+# Hyper-parameter Scheduler Visualization
+
+`tools/analysis_tools/vis_scheduler` aims to help the user to check the hyper-parameter scheduler of the optimizer(without training), which support the "learning rate", "momentum", and "weight_decay".
+
+```bash
+python tools/analysis_tools/vis_scheduler.py \
+    ${CONFIG_FILE} \
+    [-p, --parameter ${PARAMETER_NAME}] \
+    [-d, --dataset-size ${DATASET_SIZE}] \
+    [-n, --ngpus ${NUM_GPUs}] \
+    [-o, --out-dir ${OUT_DIR}] \
+    [--title ${TITLE}] \
+    [--style ${STYLE}] \
+    [--window-size ${WINDOW_SIZE}] \
+    [--cfg-options]
+```
+
+**Description of all arguments**:
+
+- `config`: The path of a model config file.
+- **`-p, --parameter`**: The param to visualize its change curve, choose from "lr", "momentum" or "wd". Default to use "lr".
+- **`-d, --dataset-size`**: The size of the datasets. If set,`DATASETS.build` will be skipped and `${DATASET_SIZE}` will be used as the size. Default to use the function `DATASETS.build`.
+- **`-n, --ngpus`**: The number of GPUs used in training, default to be 1.
+- **`-o, --out-dir`**: The output path of the curve plot, default not to output.
+- `--title`: Title of figure. If not set, default to be config file name.
+- `--style`: Style of plt. If not set, default to be `whitegrid`.
+- `--window-size`: The shape of the display window. If not specified, it will be set to `12*7`. If used, it must be in the format `'W*H'`.
+- `--cfg-options`: Modifications to the configuration file, refer to [Learn about Configs](../tutorials/config.md).
+
+```{note}
+Loading annotations maybe consume much time, you can directly specify the size of the dataset with `-d, dataset-size` to save time.
+```
+
+You can use the following command to plot the step learning rate schedule used in the config `configs/rtmdet/rtmdet_s_syncbn_fast_8xb32-300e_coco.py`:
+
+```shell
+python tools/analysis_tools/vis_scheduler.py \
+    configs/rtmdet/rtmdet_s_syncbn_fast_8xb32-300e_coco.py \
+    --dataset-size 118287 \
+    --ngpus 8 \
+    --out-dir ./output
+```
+
+<div align=center><img src="https://user-images.githubusercontent.com/27466624/213091635-d322d2b3-6e28-4755-b871-ef0a89a67a6b.jpg" style=" width: auto; height: 40%; "></div>
diff --git a/mmdetection_practice/third_party/mmyolo/docs/zh_cn/Makefile b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/Makefile
new file mode 100644
index 0000000..d4bb2cb
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/Makefile
@@ -0,0 +1,20 @@
+# Minimal makefile for Sphinx documentation
+#
+
+# You can set these variables from the command line, and also
+# from the environment for the first two.
+SPHINXOPTS    ?=
+SPHINXBUILD   ?= sphinx-build
+SOURCEDIR     = .
+BUILDDIR      = _build
+
+# Put it first so that "make" without argument is like "make help".
+help:
+	@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
+
+.PHONY: help Makefile
+
+# Catch-all target: route all unknown targets to Sphinx using the new
+# "make mode" option.  $(O) is meant as a shortcut for $(SPHINXOPTS).
+%: Makefile
+	@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
diff --git a/mmdetection_practice/third_party/mmyolo/docs/zh_cn/_static/css/readthedocs.css b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/_static/css/readthedocs.css
new file mode 100644
index 0000000..353aa9e
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/_static/css/readthedocs.css
@@ -0,0 +1,6 @@
+.header-logo {
+    background-image: url("../image/mmyolo-logo.png");
+    background-size: 115px 40px;
+    height: 40px;
+    width: 115px;
+}
diff --git a/mmdetection_practice/third_party/mmyolo/docs/zh_cn/_static/image/mmyolo-logo.png b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/_static/image/mmyolo-logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..41318aec92d86749d327bc5f9b9c689632ffc735
GIT binary patch
literal 30145
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
Gp$PzrcXhV_

literal 0
HcmV?d00001

diff --git a/mmdetection_practice/third_party/mmyolo/docs/zh_cn/advanced_guides/cross-library_application.md b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/advanced_guides/cross-library_application.md
new file mode 100644
index 0000000..d95f68c
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/advanced_guides/cross-library_application.md
@@ -0,0 +1 @@
+# MMYOLO 跨库应用解析
diff --git a/mmdetection_practice/third_party/mmyolo/docs/zh_cn/api.rst b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/api.rst
new file mode 100644
index 0000000..39223a3
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/api.rst
@@ -0,0 +1,80 @@
+mmyolo.datasets
+--------------------
+
+datasets
+^^^^^^^^^^
+.. automodule:: mmyolo.datasets
+    :members:
+
+transforms
+^^^^^^^^^^^^
+.. automodule:: mmyolo.datasets.transforms
+    :members:
+
+mmyolo.engine
+--------------
+
+hooks
+^^^^^^^^^^
+.. automodule:: mmyolo.engine.hooks
+    :members:
+
+optimizers
+^^^^^^^^^^
+.. automodule:: mmyolo.engine.optimizers
+    :members:
+
+mmyolo.models
+--------------
+
+backbones
+^^^^^^^^^^
+.. automodule:: mmyolo.models.backbones
+    :members:
+
+data_preprocessor
+^^^^^^^^^^^^^^^^^^^
+.. automodule:: mmyolo.models.data_preprocessor
+    :members:
+
+dense_heads
+^^^^^^^^^^^^
+.. automodule:: mmyolo.models.dense_heads
+    :members:
+
+detectors
+^^^^^^^^^^
+.. automodule:: mmyolo.models.detectors
+    :members:
+
+layers
+^^^^^^^^^^
+.. automodule:: mmyolo.models.layers
+    :members:
+
+losses
+^^^^^^^^^^
+.. automodule:: mmyolo.models.losses
+    :members:
+
+necks
+^^^^^^^^^^^^
+.. automodule:: mmyolo.models.necks
+    :members:
+
+
+task_modules
+^^^^^^^^^^^^^^^
+.. automodule:: mmyolo.models.task_modules
+    :members:
+
+utils
+^^^^^^^^^^
+.. automodule:: mmyolo.models.utils
+    :members:
+
+
+mmyolo.utils
+--------------
+.. automodule:: mmyolo.utils
+    :members:
diff --git a/mmdetection_practice/third_party/mmyolo/docs/zh_cn/common_usage/amp_training.md b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/common_usage/amp_training.md
new file mode 100644
index 0000000..c7803ab
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/common_usage/amp_training.md
@@ -0,0 +1,13 @@
+# 自动混合精度(AMP)训练
+
+如果要开启自动混合精度(AMP)训练,在训练命令最后加上 `--amp` 即可, 命令如下:
+
+```shell
+python tools/train.py python ./tools/train.py ${CONFIG} --amp
+```
+
+具体例子如下:
+
+```shell
+python tools/train.py configs/yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py --amp
+```
diff --git a/mmdetection_practice/third_party/mmyolo/docs/zh_cn/common_usage/freeze_layers.md b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/common_usage/freeze_layers.md
new file mode 100644
index 0000000..ca06139
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/common_usage/freeze_layers.md
@@ -0,0 +1,28 @@
+# 冻结指定网络层权重
+
+## 冻结 backbone 权重
+
+在 MMYOLO 中我们可以通过设置 `frozen_stages` 参数去冻结主干网络的部分 `stage`, 使这些 `stage` 的参数不参与模型的更新。
+需要注意的是:`frozen_stages = i` 表示的意思是指从最开始的 `stage` 开始到第 `i` 层 `stage` 的所有参数都会被冻结。下面是 `YOLOv5` 的例子,其他算法也是同样的逻辑:
+
+```python
+_base_ = './yolov5_s-v61_syncbn_8xb16-300e_coco.py'
+
+model = dict(
+    backbone=dict(
+        frozen_stages=1 # 表示第一层 stage 以及它之前的所有 stage 中的参数都会被冻结
+    ))
+```
+
+## 冻结 neck 权重
+
+MMYOLO 中也可以通过参数 `freeze_all` 去冻结整个 `neck` 的参数。下面是 `YOLOv5` 的例子,其他算法也是同样的逻辑:
+
+```python
+_base_ = './yolov5_s-v61_syncbn_8xb16-300e_coco.py'
+
+model = dict(
+    neck=dict(
+        freeze_all=True # freeze_all=True 时表示整个 neck 的参数都会被冻结
+    ))
+```
diff --git a/mmdetection_practice/third_party/mmyolo/docs/zh_cn/common_usage/mim_usage.md b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/common_usage/mim_usage.md
new file mode 100644
index 0000000..aaf2692
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/common_usage/mim_usage.md
@@ -0,0 +1,89 @@
+# 使用 mim 跨库调用其他 OpenMMLab 仓库的脚本
+
+```{note}
+1. 目前暂不支持跨库调用所有脚本,正在修复中。等修复完成,本文档会添加更多的例子。
+2. 绘制 mAP 和 计算平均训练速度 两项功能在 MMDetection dev-3.x 分支中修复,目前需要通过源码安装该分支才能成功调用。
+```
+
+## 日志分析
+
+### 曲线图绘制
+
+MMDetection 中的 `tools/analysis_tools/analyze_logs.py` 可利用指定的训练 log 文件绘制 loss/mAP 曲线图, 第一次运行前请先运行 `pip install seaborn` 安装必要依赖。
+
+```shell
+mim run mmdet analyze_logs plot_curve \
+    ${LOG} \                                     # 日志文件路径
+    [--keys ${KEYS}] \                           # 需要绘制的指标,默认为 'bbox_mAP'
+    [--start-epoch ${START_EPOCH}]               # 起始的 epoch,默认为 1
+    [--eval-interval ${EVALUATION_INTERVAL}] \   # 评估间隔,默认为 1
+    [--title ${TITLE}] \                         # 图片标题,无默认值
+    [--legend ${LEGEND}] \                       # 图例,默认为 None
+    [--backend ${BACKEND}] \                     # 绘制后端,默认为 None
+    [--style ${STYLE}] \                         # 绘制风格,默认为 'dark'
+    [--out ${OUT_FILE}]                          # 输出文件路径
+# [] 代表可选参数,实际输入命令行时,不用输入 []
+```
+
+样例:
+
+- 绘制分类损失曲线图
+
+  ```shell
+  mim run mmdet analyze_logs plot_curve \
+      yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700.log.json \
+      --keys loss_cls \
+      --legend loss_cls
+  ```
+
+  <img src="https://user-images.githubusercontent.com/27466624/204747359-754555df-1f97-4d5c-87ca-9ad3a0badcce.png" width="600"/>
+
+- 绘制分类损失、回归损失曲线图,保存图片为对应的 pdf 文件
+
+  ```shell
+  mim run mmdet analyze_logs plot_curve \
+      yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700.log.json \
+      --keys loss_cls loss_bbox \
+      --legend loss_cls loss_bbox \
+      --out losses_yolov5_s.pdf
+  ```
+
+  <img src="https://user-images.githubusercontent.com/27466624/204748560-2d17ce4b-fb5f-4732-a962-329109e73aad.png" width="600"/>
+
+- 在同一图像中比较两次运行结果的 bbox mAP
+
+  ```shell
+  mim run mmdet analyze_logs plot_curve \
+      yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700.log.json \
+      yolov5_n-v61_syncbn_fast_8xb16-300e_coco_20220919_090739.log.json \
+      --keys bbox_mAP \
+      --legend yolov5_s yolov5_n \
+      --eval-interval 10 # 注意评估间隔必须和训练时设置的一致,否则会报错
+  ```
+
+<img src="https://user-images.githubusercontent.com/27466624/204748704-21db9f9e-386e-449c-91c7-2ce3f8b51f24.png" width="600"/>
+
+### 计算平均训练速度
+
+```shell
+mim run mmdet analyze_logs cal_train_time \
+    ${LOG} \                                # 日志文件路径
+    [--include-outliers]                    # 计算时包含每个 epoch 的第一个数据
+```
+
+样例:
+
+```shell
+mim run mmdet analyze_logs cal_train_time \
+    yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700.log.json
+```
+
+输出以如下形式展示:
+
+```text
+-----Analyze train time of yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700.log.json-----
+slowest epoch 278, average time is 0.1705 s/iter
+fastest epoch 300, average time is 0.1510 s/iter
+time std over epochs is 0.0026
+average iter time: 0.1556 s/iter
+```
diff --git a/mmdetection_practice/third_party/mmyolo/docs/zh_cn/common_usage/module_combination.md b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/common_usage/module_combination.md
new file mode 100644
index 0000000..011836f
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/common_usage/module_combination.md
@@ -0,0 +1,280 @@
+# 算法组合替换教程
+
+## Loss 组合替换教程
+
+OpenMMLab 2.0 体系中 MMYOLO、MMDetection、MMClassification 中的 loss 注册表都继承自 MMEngine 中的根注册表。 因此用户可以在 MMYOLO 中使用来自 MMDetection、MMClassification 中实现的 loss 而无需重新实现。
+
+### 替换 YOLOv5 Head 中的 loss_cls 函数
+
+1. 假设我们想使用 `LabelSmoothLoss` 作为 `loss_cls` 的损失函数。因为 `LabelSmoothLoss` 已经在 MMClassification 中实现了,所以可以直接在配置文件中进行替换。配置文件如下:
+
+```python
+# 请先使用命令: mim install "mmcls>=1.0.0rc2",安装 mmcls
+_base_ = './yolov5_s-v61_syncbn_8xb16-300e_coco.py'
+model = dict(
+    bbox_head=dict(
+      loss_cls=dict(
+        _delete_=True,
+        _scope_='mmcls', #  临时替换 scope 为 mmcls
+        type='LabelSmoothLoss',
+        label_smooth_val=0.1,
+        mode='multi_label',
+        reduction='mean',
+        loss_weight=0.5)))
+```
+
+2. 假设我们想使用 `VarifocalLoss` 作为 `loss_cls` 的损失函数。因为 `VarifocalLoss` 在 MMDetection 已经实现好了,所以可以直接替换。配置文件如下:
+
+```python
+model = dict(
+    bbox_head=dict(
+        loss_cls=dict(
+            _delete_=True,
+            _scope_='mmdet',
+            type='VarifocalLoss',
+            loss_weight=1.0)))
+```
+
+3. 假设我们想使用 `FocalLoss` 作为 `loss_cls` 的损失函数。配置文件如下:
+
+```python
+_base_ = './yolov5_s-v61_syncbn_8xb16-300e_coco.py'
+model = dict(
+    bbox_head=dict(
+        loss_cls= dict(
+            _delete_=True,
+            _scope_='mmdet',
+            type='FocalLoss',
+            loss_weight=1.0)))
+```
+
+4. 假设我们想使用 `QualityFocalLoss` 作为 `loss_cls` 的损失函数。配置文件如下:
+
+```python
+_base_ = './yolov5_s-v61_syncbn_8xb16-300e_coco.py'
+model = dict(
+    bbox_head=dict(
+      loss_cls= dict(
+        _delete_=True,
+        _scope_='mmdet',
+        type='QualityFocalLoss',
+        loss_weight=1.0)))
+```
+
+### 替换 YOLOv5 Head 中的 loss_obj 函数
+
+`loss_obj` 的替换与 `loss_cls` 的替换类似,我们可以使用已经实现好的损失函数对 `loss_obj` 的损失函数进行替换
+
+1. 假设我们想使用 `VarifocalLoss` 作为 `loss_obj` 的损失函数
+
+```python
+model = dict(
+    bbox_head=dict(
+        loss_obj=dict(
+            _delete_=True,
+            _scope_='mmdet',
+            type='VarifocalLoss',
+            loss_weight=1.0)))
+```
+
+2. 假设我们想使用 `FocalLoss` 作为 `loss_obj` 的损失函数。
+
+```python
+_base_ = './yolov5_s-v61_syncbn_8xb16-300e_coco.py'
+model = dict(
+    bbox_head=dict(
+        loss_cls= dict(
+            _delete_=True,
+            _scope_='mmdet',
+            type='FocalLoss',
+            loss_weight=1.0)))
+```
+
+3. 假设我们想使用 `QualityFocalLoss` 作为 `loss_obj` 的损失函数。
+
+```python
+_base_ = './yolov5_s-v61_syncbn_8xb16-300e_coco.py'
+model = dict(
+    bbox_head=dict(
+      loss_cls= dict(
+        _delete_=True,
+        _scope_='mmdet',
+        type='QualityFocalLoss',
+        loss_weight=1.0)))
+```
+
+#### 注意
+
+1. 在本教程中损失函数的替换是运行不报错的,但无法保证性能一定会上升。
+2. 本次损失函数的替换都是以 YOLOv5 算法作为例子的,但是 MMYOLO 下的多个算法,如 YOLOv6,YOLOX 等算法都可以按照上述的例子进行替换。
+
+## Model 和 Loss 组合替换
+
+在 MMYOLO 中,model 即网络本身和 loss 是解耦的,用户可以简单的通过修改配置文件中 model 和 loss 来组合不同模块。下面给出两个具体例子。
+
+(1) YOLOv5 model 组合 YOLOv7 loss,配置文件如下:
+
+```python
+_base_ = './yolov5_s-v61_syncbn_8xb16-300e_coco.py'
+model = dict(
+    bbox_head=dict(
+        _delete_=True,
+        type='YOLOv7Head',
+        head_module=dict(
+            type='YOLOv5HeadModule',
+            num_classes=80,
+            in_channels=[256, 512, 1024],
+            widen_factor=0.5,
+            featmap_strides=[8, 16, 32],
+            num_base_priors=3)))
+```
+
+(2) RTMDet model 组合 YOLOv6 loss,配置文件如下:
+
+```python
+_base_ = './rtmdet_l_syncbn_8xb32-300e_coco.py'
+model = dict(
+    bbox_head=dict(
+        _delete_=True,
+        type='YOLOv6Head',
+        head_module=dict(
+            type='RTMDetSepBNHeadModule',
+            num_classes=80,
+            in_channels=256,
+            stacked_convs=2,
+            feat_channels=256,
+            norm_cfg=dict(type='BN'),
+            act_cfg=dict(type='SiLU', inplace=True),
+            share_conv=True,
+            pred_kernel_size=1,
+            featmap_strides=[8, 16, 32]),
+        loss_bbox=dict(
+            type='IoULoss',
+            iou_mode='giou',
+            bbox_format='xyxy',
+            reduction='mean',
+            loss_weight=2.5,
+            return_iou=False)),
+    train_cfg=dict(
+        _delete_=True,
+        initial_epoch=4,
+        initial_assigner=dict(
+            type='BatchATSSAssigner',
+            num_classes=80,
+            topk=9,
+            iou_calculator=dict(type='mmdet.BboxOverlaps2D')),
+        assigner=dict(
+            type='BatchTaskAlignedAssigner',
+            num_classes=80,
+            topk=13,
+            alpha=1,
+            beta=6)
+    ))
+```
+
+## Backbone + Neck + HeadModule 的组合替换
+
+### 1. YOLOv5 Backbone 替换
+
+(1) 假设想将 `RTMDet backbone + yolov5 neck + yolov5 head` 作为 `YOLOv5` 的完整网络,则配置文件如下:
+
+```python
+_base_ = './yolov5_s-v61_syncbn_8xb16-300e_coco.py'
+
+widen_factor = 0.5
+deepen_factor = 0.33
+
+model = dict(
+    backbone=dict(
+        _delete_=True,
+        type='CSPNeXt',
+        arch='P5',
+        expand_ratio=0.5,
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+        channel_attention=True,
+        norm_cfg=dict(type='BN'),
+        act_cfg=dict(type='SiLU', inplace=True))
+)
+```
+
+(2)  `YOLOv6EfficientRep backbone + yolov5 neck + yolov5 head` 作为 `YOLOv5` 的完整网络,则配置文件如下:
+
+```python
+_base_ = './yolov5_s-v61_syncbn_8xb16-300e_coco.py'
+
+model = dict(
+    backbone=dict(
+        type='YOLOv6EfficientRep',
+        norm_cfg=dict(type='BN', momentum=0.03, eps=0.001),
+        act_cfg=dict(type='ReLU', inplace=True))
+)
+```
+
+### 2. YOLOv5 Neck 替换
+
+(1) 假设想将 `yolov5 backbone + yolov6 neck + yolov5 head` 作为 `YOLOv5` 的完整网络,则配置文件如下:
+
+```python
+_base_ = './yolov5_s-v61_syncbn_8xb16-300e_coco.py'
+
+model = dict(
+    neck = dict(
+        type = 'YOLOv6RepPAFPN',
+        in_channels = [256, 512, 1024],
+        out_channels = [128, 256, 512], # 注意 YOLOv6RepPAFPN 的输出通道是[128, 256, 512]
+        num_csp_blocks = 12,
+        act_cfg = dict(type='ReLU', inplace = True),
+    ),
+    bbox_head = dict(
+        head_module = dict(
+            in_channels = [128, 256, 512])) # head 部分输入通道要做相应更改
+)
+```
+
+(2) 假设想将 `yolov5 backbone + yolov7 neck + yolov5 head` 作为 `YOLOv5` 的完整网络,则配置文件如下:
+
+```python
+_base_ = './yolov5_s-v61_syncbn_8xb16-300e_coco.py'
+
+deepen_factor = _base_.deepen_factor
+widen_factor = _base_.widen_factor
+
+model = dict(
+    neck = dict(
+        _delete_=True, # 将 _base_ 中关于 neck 的字段删除
+        type = 'YOLOv7PAFPN',
+        deepen_factor = deepen_factor,
+        widen_factor = widen_factor,
+        upsample_feats_cat_first = False,
+        in_channels = [256, 512, 1024],
+        out_channels = [128, 256, 512],
+        norm_cfg=dict(type='BN', momentum=0.03, eps=0.001),
+        act_cfg = dict(type='SiLU', inplace=True),
+    ),
+    bbox_head = dict(
+        head_module = dict(
+            in_channels = [256, 512, 1024])) # 注意使用 YOLOv7PAFPN 后 head 部分输入通道数是 neck 输出通道数的两倍
+)
+```
+
+### 3. YOLOv5 HeadModule 替换
+
+(1) 假设想将 `yolov5 backbone + yolov5 neck + yolo7 headmodule` 作为 `YOLOv5` 的完整网络,则配置文件如下:
+
+```python
+_base_ = './yolov5_s-v61_syncbn_8xb16-300e_coco.py'
+
+strides = [8, 16, 32]
+num_classes = 1 # 根据自己的数据集调整
+
+model = dict(
+    bbox_head=dict(
+        type='YOLOv7Head',
+        head_module=dict(
+            type='YOLOv7HeadModule',
+            num_classes=num_classes,
+            in_channels=[256, 512, 1024],
+            featmap_strides=strides,
+            num_base_priors=3)))
+```
diff --git a/mmdetection_practice/third_party/mmyolo/docs/zh_cn/common_usage/ms_training_testing.md b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/common_usage/ms_training_testing.md
new file mode 100644
index 0000000..1f271c5
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/common_usage/ms_training_testing.md
@@ -0,0 +1,41 @@
+# 多尺度训练和测试
+
+## 多尺度训练
+
+MMYOLO 中目前支持了主流的 YOLOv5、YOLOv6、YOLOv7、YOLOv8 和 RTMDet 等算法,其默认配置均为单尺度 640x640 训练。 在 MM 系列开源库中常用的多尺度训练有两种实现方式:
+
+1. 在 `train_pipeline` 中输出的每张图都是不定尺度的,然后在 [DataPreprocessor](https://github.com/open-mmlab/mmdetection/blob/3.x/mmdet/models/data_preprocessors/data_preprocessor.py) 中将不同尺度的输入图片
+   通过 [stack_batch](https://github.com/open-mmlab/mmengine/blob/dbae83c52fa54d6dda08b6692b124217fe3b2135/mmengine/model/base_model/data_preprocessor.py#L260-L261) 函数填充到同一尺度,从而组成 batch 进行训练。MMDet 中大部分算法都是采用这个实现方式。
+2. 在 `train_pipeline` 中输出的每张图都是固定尺度的,然后直接在 `DataPreprocessor` 中进行 batch 张图片的上下采样,从而实现多尺度训练功能
+
+在 MMYOLO 中两种多尺度训练方式都是支持的。理论上第一种实现方式所生成的尺度会更加丰富,但是由于其对单张图进行独立增强,训练效率不如第二种方式。所以我们更推荐使用第二种方式。
+
+以 `configs/yolov5/yolov5_s-v61_fast_1xb12-40e_cat.py` 配置为例,其默认配置采用的是 640x640 固定尺度训练,假设想实现以 32 为倍数,且多尺度范围为 (480, 800) 的训练方式,则可以参考 YOLOX 做法通过 DataPreprocessor 中的 [YOLOXBatchSyncRandomResize](https://github.com/open-mmlab/mmyolo/blob/dc85144fab20a970341550794857a2f2f9b11564/mmyolo/models/data_preprocessors/data_preprocessor.py#L20) 实现。
+
+在 `configs/yolov5` 路径下新建配置,命名为 `configs/yolov5/yolov5_s-v61_fast_1xb12-ms-40e_cat.py`,其内容如下:
+
+```python
+_base_ = 'yolov5_s-v61_fast_1xb12-40e_cat.py'
+
+model = dict(
+    data_preprocessor=dict(
+        type='YOLOv5DetDataPreprocessor',
+        pad_size_divisor=32,
+        batch_augments=[
+            dict(
+                type='YOLOXBatchSyncRandomResize',
+                # 多尺度范围是 480~800
+                random_size_range=(480, 800),
+                # 输出尺度需要被 32 整除
+                size_divisor=32,
+                # 每隔 1 个迭代改变一次输出输出
+                interval=1)
+        ])
+)
+```
+
+上述配置就可以实现多尺度训练了。为了方便,我们已经在 `configs/yolov5/` 下已经提供了该配置。其余 YOLO 系列算法也是类似做法。
+
+## 多尺度测试
+
+MMYOLO 多尺度测试功能等同于测试时增强 TTA,目前已经支持,详情请查看 [测试时增强 TTA](./tta.md) 。
diff --git a/mmdetection_practice/third_party/mmyolo/docs/zh_cn/common_usage/multi_necks.md b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/common_usage/multi_necks.md
new file mode 100644
index 0000000..a4a1705
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/common_usage/multi_necks.md
@@ -0,0 +1,40 @@
+# 应用多个 Neck
+
+如果你想堆叠多个 Neck,可以直接在配置文件中的 Neck 参数,MMYOLO 支持以 `List` 形式拼接多个 Neck 配置,你需要保证上一个 Neck 的输出通道与下一个 Neck
+的输入通道相匹配。如需要调整通道,可以插入 `mmdet.ChannelMapper` 模块用来对齐多个 Neck 之间的通道数量。具体配置如下:
+
+```python
+_base_ = './yolov5_s-v61_syncbn_8xb16-300e_coco.py'
+
+deepen_factor = _base_.deepen_factor
+widen_factor = _base_.widen_factor
+model = dict(
+    type='YOLODetector',
+    neck=[
+        dict(
+            type='YOLOv5PAFPN',
+            deepen_factor=deepen_factor,
+            widen_factor=widen_factor,
+            in_channels=[256, 512, 1024],
+            out_channels=[256, 512, 1024],
+            # 因为 out_channels 由 widen_factor 控制,YOLOv5PAFPN 的 out_channels = out_channels * widen_factor
+            num_csp_blocks=3,
+            norm_cfg=dict(type='BN', momentum=0.03, eps=0.001),
+            act_cfg=dict(type='SiLU', inplace=True)),
+        dict(
+            type='mmdet.ChannelMapper',
+            in_channels=[128, 256, 512],
+            out_channels=128,
+        ),
+        dict(
+            type='mmdet.DyHead',
+            in_channels=128,
+            out_channels=256,
+            num_blocks=2,
+            # disable zero_init_offset to follow official implementation
+            zero_init_offset=False)
+    ],
+    bbox_head=dict(head_module=dict(in_channels=[512, 512, 512]))
+    # 因为 out_channels 由 widen_factor 控制,YOLOv5HeadModuled 的 in_channels * widen_factor 才会等于最后一个 neck 的 out_channels
+)
+```
diff --git a/mmdetection_practice/third_party/mmyolo/docs/zh_cn/common_usage/output_predictions.md b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/common_usage/output_predictions.md
new file mode 100644
index 0000000..b11f856
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/common_usage/output_predictions.md
@@ -0,0 +1,40 @@
+# 输出模型预测结果
+
+如果想将预测结果保存为特定的文件,用于离线评估,目前 MMYOLO 支持 json 和 pkl 两种格式。
+
+```{note}
+json 文件仅保存 `image_id`、`bbox`、`score` 和 `category_id`; json 文件可以使用 json 库读取。
+pkl 保存内容比 json 文件更多,还会保存预测图片的文件名和尺寸等一系列信息; pkl 文件可以使用 pickle 库读取。
+```
+
+## 输出为 json 文件
+
+如果想将预测结果输出为 json 文件,则命令如下:
+
+```shell
+python tools/test.py ${CONFIG} ${CHECKPOINT} --json-prefix ${JSON_PREFIX}
+```
+
+`--json-prefix` 后的参数输入为文件名前缀(无需输入 `.json` 后缀),也可以包含路径。举一个具体例子:
+
+```shell
+python tools/test.py configs\yolov5\yolov5_s-v61_syncbn_8xb16-300e_coco.py yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth --json-prefix work_dirs/demo/json_demo
+```
+
+运行以上命令会在 `work_dirs/demo` 文件夹下,输出 `json_demo.bbox.json` 文件。
+
+## 输出为 pkl 文件
+
+如果想将预测结果输出为 pkl 文件,则命令如下:
+
+```shell
+python tools/test.py ${CONFIG} ${CHECKPOINT} --out ${OUTPUT_FILE} [--cfg-options ${OPTIONS [OPTIONS...]}]
+```
+
+`--out` 后的参数输入为完整文件名(**必须输入** `.pkl` 或 `.pickle` 后缀),也可以包含路径。举一个具体例子:
+
+```shell
+python tools/test.py configs\yolov5\yolov5_s-v61_syncbn_8xb16-300e_coco.py yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth --out work_dirs/demo/pkl_demo.pkl
+```
+
+运行以上命令会在 `work_dirs/demo` 文件夹下,输出 `pkl_demo.pkl` 文件。
diff --git a/mmdetection_practice/third_party/mmyolo/docs/zh_cn/common_usage/plugins.md b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/common_usage/plugins.md
new file mode 100644
index 0000000..337111f
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/common_usage/plugins.md
@@ -0,0 +1,34 @@
+# 给主干网络增加插件
+
+MMYOLO 支持在 Backbone 的不同 Stage 后增加如 `none_local`、`dropblock` 等插件,用户可以直接通过修改 config 文件中 `backbone` 的 `plugins`参数来实现对插件的管理。例如为 `YOLOv5` 增加`GeneralizedAttention` 插件,其配置文件如下:
+
+```python
+_base_ = './yolov5_s-v61_syncbn_8xb16-300e_coco.py'
+
+model = dict(
+    backbone=dict(
+        plugins=[
+            dict(
+                cfg=dict(
+                    type='GeneralizedAttention',
+                    spatial_range=-1,
+                    num_heads=8,
+                    attention_type='0011',
+                    kv_stride=2),
+                stages=(False, False, True, True))
+        ]))
+```
+
+`cfg` 参数表示插件的具体配置, `stages` 参数表示是否在 backbone 对应的 stage 后面增加插件,长度需要和 backbone 的 stage 数量相同。
+
+目前 `MMYOLO` 支持了如下插件:
+
+<details open>
+<summary><b>支持的插件</b></summary>
+
+1. [CBAM](https://github.com/open-mmlab/mmyolo/blob/dev/mmyolo/models/plugins/cbam.py#L86)
+2. [GeneralizedAttention](https://github.com/open-mmlab/mmcv/blob/2.x/mmcv/cnn/bricks/generalized_attention.py#L13)
+3. [NonLocal2d](https://github.com/open-mmlab/mmcv/blob/2.x/mmcv/cnn/bricks/non_local.py#L250)
+4. [ContextBlock](https://github.com/open-mmlab/mmcv/blob/2.x/mmcv/cnn/bricks/context_block.py#L18)
+
+</details>
diff --git a/mmdetection_practice/third_party/mmyolo/docs/zh_cn/common_usage/registries_info.md b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/common_usage/registries_info.md
new file mode 100644
index 0000000..4a9d184
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/common_usage/registries_info.md
@@ -0,0 +1,788 @@
+# MM 系列开源库注册表
+
+(注意:本文档是通过 .dev_scripts/print_registers.py 脚本自动生成)
+
+## MMdetection (3.0.0rc6)
+
+<details open><div align='center'><b>MMdetection Module Components</b></div>
+<div align='center'>
+<style type="text/css">
+#T_2775b thead th {
+  align: center;
+  text-align: center;
+  vertical-align: bottom;
+}
+#T_2775b_row0_col0, #T_2775b_row0_col1, #T_2775b_row0_col2, #T_2775b_row0_col3, #T_2775b_row0_col4 {
+  text-align: left;
+  align: center;
+  vertical-align: top;
+}
+</style>
+<table id="T_2775b">
+  <thead>
+    <tr>
+      <th id="T_2775b_level0_col0" class="col_heading level0 col0" >visualizer</th>
+      <th id="T_2775b_level0_col1" class="col_heading level0 col1" >optimizer constructor</th>
+      <th id="T_2775b_level0_col2" class="col_heading level0 col2" >loop</th>
+      <th id="T_2775b_level0_col3" class="col_heading level0 col3" >parameter scheduler</th>
+      <th id="T_2775b_level0_col4" class="col_heading level0 col4" >data sampler</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td id="T_2775b_row0_col0" class="data row0 col0" ><ul><li>DetLocalVisualizer</li></ul></td>
+      <td id="T_2775b_row0_col1" class="data row0 col1" ><ul><li>LearningRateDecayOptimizerConstructor</li></ul></td>
+      <td id="T_2775b_row0_col2" class="data row0 col2" ><ul><li>TeacherStudentValLoop</li></ul></td>
+      <td id="T_2775b_row0_col3" class="data row0 col3" ><ul><li>QuadraticWarmupParamScheduler</li><li>QuadraticWarmupLR</li><li>QuadraticWarmupMomentum</li></ul></td>
+      <td id="T_2775b_row0_col4" class="data row0 col4" ><ul><li>AspectRatioBatchSampler</li><li>ClassAwareSampler</li><li>MultiSourceSampler</li><li>GroupMultiSourceSampler</li></ul></td>
+    </tr>
+  </tbody>
+</table>
+</div><div align='center'>
+<style type="text/css">
+#T_00a84 thead th {
+  align: center;
+  text-align: center;
+  vertical-align: bottom;
+}
+#T_00a84_row0_col0, #T_00a84_row0_col1, #T_00a84_row0_col2, #T_00a84_row0_col3, #T_00a84_row0_col4 {
+  text-align: left;
+  align: center;
+  vertical-align: top;
+}
+</style>
+<table id="T_00a84">
+  <thead>
+    <tr>
+      <th id="T_00a84_level0_col0" class="col_heading level0 col0" >metric</th>
+      <th id="T_00a84_level0_col1" class="col_heading level0 col1" >hook</th>
+      <th id="T_00a84_level0_col2" class="col_heading level0 col2" >dataset</th>
+      <th id="T_00a84_level0_col3" class="col_heading level0 col3" >task util (part 1)</th>
+      <th id="T_00a84_level0_col4" class="col_heading level0 col4" >task util (part 2)</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td id="T_00a84_row0_col0" class="data row0 col0" ><ul><li>CityScapesMetric</li><li>CocoMetric</li><li>CocoOccludedSeparatedMetric</li><li>CocoPanopticMetric</li><li>CrowdHumanMetric</li><li>DumpDetResults</li><li>DumpProposals</li><li>LVISMetric</li><li>OpenImagesMetric</li><li>VOCMetric</li></ul></td>
+      <td id="T_00a84_row0_col1" class="data row0 col1" ><ul><li>CheckInvalidLossHook</li><li>MeanTeacherHook</li><li>MemoryProfilerHook</li><li>NumClassCheckHook</li><li>PipelineSwitchHook</li><li>SetEpochInfoHook</li><li>SyncNormHook</li><li>DetVisualizationHook</li><li>YOLOXModeSwitchHook</li><li>FastStopTrainingHook</li></ul></td>
+      <td id="T_00a84_row0_col2" class="data row0 col2" ><ul><li>BaseDetDataset</li><li>CocoDataset</li><li>CityscapesDataset</li><li>CocoPanopticDataset</li><li>CrowdHumanDataset</li><li>MultiImageMixDataset</li><li>DeepFashionDataset</li><li>LVISV05Dataset</li><li>LVISDataset</li><li>LVISV1Dataset</li><li>Objects365V1Dataset</li><li>Objects365V2Dataset</li><li>OpenImagesDataset</li><li>OpenImagesChallengeDataset</li><li>XMLDataset</li><li>VOCDataset</li><li>WIDERFaceDataset</li></ul></td>
+      <td id="T_00a84_row0_col3" class="data row0 col3" ><ul><li>MaxIoUAssigner</li><li>ApproxMaxIoUAssigner</li><li>ATSSAssigner</li><li>CenterRegionAssigner</li><li>DynamicSoftLabelAssigner</li><li>GridAssigner</li><li>HungarianAssigner</li><li>BboxOverlaps2D</li><li>BBoxL1Cost</li><li>IoUCost</li><li>ClassificationCost</li><li>FocalLossCost</li><li>DiceCost</li><li>CrossEntropyLossCost</li><li>MultiInstanceAssigner</li></ul></td>
+      <td id="T_00a84_row0_col4" class="data row0 col4" ><ul><li>PointAssigner</li><li>AnchorGenerator</li><li>SSDAnchorGenerator</li><li>LegacyAnchorGenerator</li><li>LegacySSDAnchorGenerator</li><li>YOLOAnchorGenerator</li><li>PointGenerator</li><li>MlvlPointGenerator</li><li>RegionAssigner</li><li>SimOTAAssigner</li><li>TaskAlignedAssigner</li><li>UniformAssigner</li><li>BucketingBBoxCoder</li><li>DeltaXYWHBBoxCoder</li></ul></td>
+    </tr>
+  </tbody>
+</table>
+</div><div align='center'>
+<style type="text/css">
+#T_cd536 thead th {
+  align: center;
+  text-align: center;
+  vertical-align: bottom;
+}
+#T_cd536_row0_col0, #T_cd536_row0_col1, #T_cd536_row0_col2, #T_cd536_row0_col3 {
+  text-align: left;
+  align: center;
+  vertical-align: top;
+}
+</style>
+<table id="T_cd536">
+  <thead>
+    <tr>
+      <th id="T_cd536_level0_col0" class="col_heading level0 col0" >task util (part 3)</th>
+      <th id="T_cd536_level0_col1" class="col_heading level0 col1" >transform (part 1)</th>
+      <th id="T_cd536_level0_col2" class="col_heading level0 col2" >transform (part 2)</th>
+      <th id="T_cd536_level0_col3" class="col_heading level0 col3" >transform (part 3)</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td id="T_cd536_row0_col0" class="data row0 col0" ><ul><li>DistancePointBBoxCoder</li><li>LegacyDeltaXYWHBBoxCoder</li><li>PseudoBBoxCoder</li><li>TBLRBBoxCoder</li><li>YOLOBBoxCoder</li><li>CombinedSampler</li><li>RandomSampler</li><li>InstanceBalancedPosSampler</li><li>IoUBalancedNegSampler</li><li>MaskPseudoSampler</li><li>MultiInsRandomSampler</li><li>OHEMSampler</li><li>PseudoSampler</li><li>ScoreHLRSampler</li></ul></td>
+      <td id="T_cd536_row0_col1" class="data row0 col1" ><ul><li>AutoAugment</li><li>RandAugment</li><li>ColorTransform</li><li>Color</li><li>Brightness</li><li>Contrast</li><li>Sharpness</li><li>Solarize</li><li>SolarizeAdd</li><li>Posterize</li><li>Equalize</li><li>AutoContrast</li><li>Invert</li><li>PackDetInputs</li><li>ToTensor</li><li>ImageToTensor</li><li>Transpose</li><li>WrapFieldsToLists</li><li>GeomTransform</li><li>ShearX</li></ul></td>
+      <td id="T_cd536_row0_col2" class="data row0 col2" ><ul><li>ShearY</li><li>Rotate</li><li>TranslateX</li><li>TranslateY</li><li>InstaBoost</li><li>LoadImageFromNDArray</li><li>LoadMultiChannelImageFromFiles</li><li>LoadAnnotations</li><li>LoadPanopticAnnotations</li><li>LoadProposals</li><li>FilterAnnotations</li><li>LoadEmptyAnnotations</li><li>InferencerLoader</li><li>Resize</li><li>FixShapeResize</li><li>RandomFlip</li><li>RandomShift</li><li>Pad</li><li>RandomCrop</li></ul></td>
+      <td id="T_cd536_row0_col3" class="data row0 col3" ><ul><li>SegRescale</li><li>PhotoMetricDistortion</li><li>Expand</li><li>MinIoURandomCrop</li><li>Corrupt</li><li>Albu</li><li>RandomCenterCropPad</li><li>CutOut</li><li>Mosaic</li><li>MixUp</li><li>RandomAffine</li><li>YOLOXHSVRandomAug</li><li>CopyPaste</li><li>RandomErasing</li><li>CachedMosaic</li><li>CachedMixUp</li><li>MultiBranch</li><li>RandomOrder</li><li>ProposalBroadcaster</li></ul></td>
+    </tr>
+  </tbody>
+</table>
+</div><div align='center'>
+<style type="text/css">
+#T_bb293 thead th {
+  align: center;
+  text-align: center;
+  vertical-align: bottom;
+}
+#T_bb293_row0_col0, #T_bb293_row0_col1, #T_bb293_row0_col2, #T_bb293_row0_col3 {
+  text-align: left;
+  align: center;
+  vertical-align: top;
+}
+</style>
+<table id="T_bb293">
+  <thead>
+    <tr>
+      <th id="T_bb293_level0_col0" class="col_heading level0 col0" >model (part 1)</th>
+      <th id="T_bb293_level0_col1" class="col_heading level0 col1" >model (part 2)</th>
+      <th id="T_bb293_level0_col2" class="col_heading level0 col2" >model (part 3)</th>
+      <th id="T_bb293_level0_col3" class="col_heading level0 col3" >model (part 4)</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td id="T_bb293_row0_col0" class="data row0 col0" ><ul><li>SiLU</li><li>DropBlock</li><li>ExpMomentumEMA</li><li>SinePositionalEncoding</li><li>LearnedPositionalEncoding</li><li>DynamicConv</li><li>MSDeformAttnPixelDecoder</li><li>Linear</li><li>NormedLinear</li><li>NormedConv2d</li><li>PixelDecoder</li><li>TransformerEncoderPixelDecoder</li><li>CSPDarknet</li><li>CSPNeXt</li><li>Darknet</li><li>ResNet</li><li>ResNetV1d</li><li>DetectoRS_ResNet</li><li>DetectoRS_ResNeXt</li><li>EfficientNet</li></ul></td>
+      <td id="T_bb293_row0_col1" class="data row0 col1" ><ul><li>HourglassNet</li><li>HRNet</li><li>MobileNetV2</li><li>PyramidVisionTransformer</li><li>PyramidVisionTransformerV2</li><li>ResNeXt</li><li>RegNet</li><li>Res2Net</li><li>ResNeSt</li><li>BFP</li><li>ChannelMapper</li><li>CSPNeXtPAFPN</li><li>CTResNetNeck</li><li>DilatedEncoder</li><li>DyHead</li><li>FPG</li><li>FPN</li><li>FPN_CARAFE</li><li>HRFPN</li><li>NASFPN</li></ul></td>
+      <td id="T_bb293_row0_col2" class="data row0 col2" ><ul><li>NASFCOS_FPN</li><li>PAFPN</li><li>RFP</li><li>SSDNeck</li><li>SSH</li><li>YOLOV3Neck</li><li>YOLOXPAFPN</li><li>SSDVGG</li><li>SwinTransformer</li><li>TridentResNet</li><li>DetDataPreprocessor</li><li>BatchSyncRandomResize</li><li>BatchFixedSizePad</li><li>MultiBranchDataPreprocessor</li><li>BatchResize</li><li>BoxInstDataPreprocessor</li><li>AnchorFreeHead</li><li>AnchorHead</li><li>ATSSHead</li><li>FCOSHead</li></ul></td>
+      <td id="T_bb293_row0_col3" class="data row0 col3" ><ul><li>AutoAssignHead</li><li>CondInstBboxHead</li><li>CondInstMaskHead</li><li>BoxInstBboxHead</li><li>BoxInstMaskHead</li><li>RPNHead</li><li>StageCascadeRPNHead</li><li>CascadeRPNHead</li><li>CenterNetHead</li><li>CenterNetUpdateHead</li><li>CornerHead</li><li>CentripetalHead</li><li>DETRHead</li><li>ConditionalDETRHead</li><li>DABDETRHead</li><li>DDODHead</li><li>DeformableDETRHead</li><li>DINOHead</li><li>EmbeddingRPNHead</li><li>FoveaHead</li></ul></td>
+    </tr>
+  </tbody>
+</table>
+</div><div align='center'>
+<style type="text/css">
+#T_39d04 thead th {
+  align: center;
+  text-align: center;
+  vertical-align: bottom;
+}
+#T_39d04_row0_col0, #T_39d04_row0_col1, #T_39d04_row0_col2, #T_39d04_row0_col3 {
+  text-align: left;
+  align: center;
+  vertical-align: top;
+}
+</style>
+<table id="T_39d04">
+  <thead>
+    <tr>
+      <th id="T_39d04_level0_col0" class="col_heading level0 col0" >model (part 5)</th>
+      <th id="T_39d04_level0_col1" class="col_heading level0 col1" >model (part 6)</th>
+      <th id="T_39d04_level0_col2" class="col_heading level0 col2" >model (part 7)</th>
+      <th id="T_39d04_level0_col3" class="col_heading level0 col3" >model (part 8)</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td id="T_39d04_row0_col0" class="data row0 col0" ><ul><li>RetinaHead</li><li>FreeAnchorRetinaHead</li><li>AssociativeEmbeddingLoss</li><li>BalancedL1Loss</li><li>CrossEntropyLoss</li><li>DiceLoss</li><li>FocalLoss</li><li>GaussianFocalLoss</li><li>QualityFocalLoss</li><li>DistributionFocalLoss</li><li>GHMC</li><li>GHMR</li><li>IoULoss</li><li>BoundedIoULoss</li><li>GIoULoss</li><li>DIoULoss</li><li>CIoULoss</li><li>EIoULoss</li><li>KnowledgeDistillationKLDivLoss</li><li>MSELoss</li></ul></td>
+      <td id="T_39d04_row0_col1" class="data row0 col1" ><ul><li>SeesawLoss</li><li>SmoothL1Loss</li><li>L1Loss</li><li>VarifocalLoss</li><li>FSAFHead</li><li>GuidedAnchorHead</li><li>GARetinaHead</li><li>GARPNHead</li><li>GFLHead</li><li>PAAHead</li><li>LADHead</li><li>LDHead</li><li>MaskFormerHead</li><li>Mask2FormerHead</li><li>NASFCOSHead</li><li>PISARetinaHead</li><li>SSDHead</li><li>PISASSDHead</li><li>RepPointsHead</li><li>RetinaSepBNHead</li></ul></td>
+      <td id="T_39d04_row0_col2" class="data row0 col2" ><ul><li>RTMDetHead</li><li>RTMDetSepBNHead</li><li>RTMDetInsHead</li><li>RTMDetInsSepBNHead</li><li>SABLRetinaHead</li><li>SOLOHead</li><li>DecoupledSOLOHead</li><li>DecoupledSOLOLightHead</li><li>SOLOV2Head</li><li>TOODHead</li><li>VFNetHead</li><li>YOLACTHead</li><li>YOLACTProtonet</li><li>YOLOV3Head</li><li>YOLOFHead</li><li>YOLOXHead</li><li>SingleStageDetector</li><li>ATSS</li><li>AutoAssign</li></ul></td>
+      <td id="T_39d04_row0_col3" class="data row0 col3" ><ul><li>DetectionTransformer</li><li>SingleStageInstanceSegmentor</li><li>BoxInst</li><li>TwoStageDetector</li><li>CascadeRCNN</li><li>CenterNet</li><li>CondInst</li><li>DETR</li><li>ConditionalDETR</li><li>CornerNet</li><li>CrowdDet</li><li>Detectron2Wrapper</li><li>DABDETR</li><li>DDOD</li><li>DeformableDETR</li><li>DINO</li><li>FastRCNN</li><li>FasterRCNN</li><li>FCOS</li></ul></td>
+    </tr>
+  </tbody>
+</table>
+</div><div align='center'>
+<style type="text/css">
+#T_1d4b5 thead th {
+  align: center;
+  text-align: center;
+  vertical-align: bottom;
+}
+#T_1d4b5_row0_col0, #T_1d4b5_row0_col1, #T_1d4b5_row0_col2, #T_1d4b5_row0_col3 {
+  text-align: left;
+  align: center;
+  vertical-align: top;
+}
+</style>
+<table id="T_1d4b5">
+  <thead>
+    <tr>
+      <th id="T_1d4b5_level0_col0" class="col_heading level0 col0" >model (part 9)</th>
+      <th id="T_1d4b5_level0_col1" class="col_heading level0 col1" >model (part 10)</th>
+      <th id="T_1d4b5_level0_col2" class="col_heading level0 col2" >model (part 11)</th>
+      <th id="T_1d4b5_level0_col3" class="col_heading level0 col3" >model (part 12)</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td id="T_1d4b5_row0_col0" class="data row0 col0" ><ul><li>FOVEA</li><li>FSAF</li><li>GFL</li><li>GridRCNN</li><li>HybridTaskCascade</li><li>KnowledgeDistillationSingleStageDetector</li><li>LAD</li><li>MaskFormer</li><li>Mask2Former</li><li>MaskRCNN</li><li>MaskScoringRCNN</li><li>NASFCOS</li><li>PAA</li><li>TwoStagePanopticSegmentor</li><li>PanopticFPN</li><li>PointRend</li><li>SparseRCNN</li><li>QueryInst</li><li>RepPointsDetector</li></ul></td>
+      <td id="T_1d4b5_row0_col1" class="data row0 col1" ><ul><li>RetinaNet</li><li>RPN</li><li>RTMDet</li><li>SCNet</li><li>SemiBaseDetector</li><li>SoftTeacher</li><li>SOLO</li><li>SOLOv2</li><li>TOOD</li><li>TridentFasterRCNN</li><li>VFNet</li><li>YOLACT</li><li>YOLOV3</li><li>YOLOF</li><li>YOLOX</li><li>BBoxHead</li><li>ConvFCBBoxHead</li><li>Shared2FCBBoxHead</li><li>Shared4Conv1FCBBoxHead</li></ul></td>
+      <td id="T_1d4b5_row0_col2" class="data row0 col2" ><ul><li>DIIHead</li><li>DoubleConvFCBBoxHead</li><li>MultiInstanceBBoxHead</li><li>SABLHead</li><li>SCNetBBoxHead</li><li>CascadeRoIHead</li><li>StandardRoIHead</li><li>DoubleHeadRoIHead</li><li>DynamicRoIHead</li><li>GridRoIHead</li><li>HybridTaskCascadeRoIHead</li><li>FCNMaskHead</li><li>CoarseMaskHead</li><li>DynamicMaskHead</li><li>FeatureRelayHead</li><li>FusedSemanticHead</li><li>GlobalContextHead</li><li>GridHead</li><li>HTCMaskHead</li></ul></td>
+      <td id="T_1d4b5_row0_col3" class="data row0 col3" ><ul><li>MaskPointHead</li><li>MaskIoUHead</li><li>SCNetMaskHead</li><li>SCNetSemanticHead</li><li>MaskScoringRoIHead</li><li>MultiInstanceRoIHead</li><li>PISARoIHead</li><li>PointRendRoIHead</li><li>GenericRoIExtractor</li><li>SingleRoIExtractor</li><li>SCNetRoIHead</li><li>ResLayer</li><li>SparseRoIHead</li><li>TridentRoIHead</li><li>BaseSemanticHead</li><li>PanopticFPNHead</li><li>BasePanopticFusionHead</li><li>HeuristicFusionHead</li><li>MaskFormerFusionHead</li></ul></td>
+    </tr>
+  </tbody>
+</table>
+</div></details>
+<details open><div align='center'><b>MMdetection Tools</b></div>
+<div align='center'>
+<style type="text/css">
+#T_a7e06 thead th {
+  align: center;
+  text-align: center;
+  vertical-align: bottom;
+}
+#T_a7e06_row0_col0, #T_a7e06_row0_col1, #T_a7e06_row0_col2, #T_a7e06_row0_col3 {
+  text-align: left;
+  align: center;
+  vertical-align: top;
+}
+</style>
+<table id="T_a7e06">
+  <thead>
+    <tr>
+      <th id="T_a7e06_level0_col0" class="col_heading level0 col0" >tools/dataset_converters</th>
+      <th id="T_a7e06_level0_col1" class="col_heading level0 col1" >tools/deployment</th>
+      <th id="T_a7e06_level0_col2" class="col_heading level0 col2" >tools</th>
+      <th id="T_a7e06_level0_col3" class="col_heading level0 col3" >tools/misc</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td id="T_a7e06_row0_col0" class="data row0 col0" ><ul><li>pascal_voc.py</li><li>images2coco.py</li><li>cityscapes.py</li></ul></td>
+      <td id="T_a7e06_row0_col1" class="data row0 col1" ><ul><li>mmdet2torchserve.py</li><li>test_torchserver.py</li><li>mmdet_handler.py</li></ul></td>
+      <td id="T_a7e06_row0_col2" class="data row0 col2" ><ul><li>dist_test.sh</li><li>slurm_test.sh</li><li>test.py</li><li>dist_train.sh</li><li>train.py</li><li>slurm_train.sh</li></ul></td>
+      <td id="T_a7e06_row0_col3" class="data row0 col3" ><ul><li>download_dataset.py</li><li>get_image_metas.py</li><li>gen_coco_panoptic_test_info.py</li><li>split_coco.py</li><li>get_crowdhuman_id_hw.py</li><li>print_config.py</li></ul></td>
+    </tr>
+  </tbody>
+</table>
+</div><div align='center'>
+<style type="text/css">
+#T_63a8e thead th {
+  align: center;
+  text-align: center;
+  vertical-align: bottom;
+}
+#T_63a8e_row0_col0, #T_63a8e_row0_col1, #T_63a8e_row0_col2, #T_63a8e_row0_col3 {
+  text-align: left;
+  align: center;
+  vertical-align: top;
+}
+</style>
+<table id="T_63a8e">
+  <thead>
+    <tr>
+      <th id="T_63a8e_level0_col0" class="col_heading level0 col0" >tools/model_converters</th>
+      <th id="T_63a8e_level0_col1" class="col_heading level0 col1" >tools/analysis_tools</th>
+      <th id="T_63a8e_level0_col2" class="col_heading level0 col2" >.dev_scripts (part 1)</th>
+      <th id="T_63a8e_level0_col3" class="col_heading level0 col3" >.dev_scripts (part 2)</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td id="T_63a8e_row0_col0" class="data row0 col0" ><ul><li>upgrade_model_version.py</li><li>upgrade_ssd_version.py</li><li>detectron2_to_mmdet.py</li><li>selfsup2mmdet.py</li><li>detectron2pytorch.py</li><li>regnet2mmdet.py</li><li>publish_model.py</li></ul></td>
+      <td id="T_63a8e_row0_col1" class="data row0 col1" ><ul><li>benchmark.py</li><li>eval_metric.py</li><li>robustness_eval.py</li><li>confusion_matrix.py</li><li>optimize_anchors.py</li><li>browse_dataset.py</li><li>test_robustness.py</li><li>coco_error_analysis.py</li><li>coco_occluded_separated_recall.py</li><li>analyze_results.py</li><li>analyze_logs.py</li><li>get_flops.py</li></ul></td>
+      <td id="T_63a8e_row0_col2" class="data row0 col2" ><ul><li>convert_test_benchmark_script.py</li><li>gather_test_benchmark_metric.py</li><li>benchmark_valid_flops.py</li><li>benchmark_train.py</li><li>test_benchmark.sh</li><li>download_checkpoints.py</li><li>benchmark_test_image.py</li><li>covignore.cfg</li><li>benchmark_full_models.txt</li><li>test_init_backbone.py</li><li>batch_train_list.txt</li><li>diff_coverage_test.sh</li></ul></td>
+      <td id="T_63a8e_row0_col3" class="data row0 col3" ><ul><li>batch_test_list.py</li><li>linter.sh</li><li>gather_train_benchmark_metric.py</li><li>train_benchmark.sh</li><li>benchmark_inference_fps.py</li><li>benchmark_options.py</li><li>check_links.py</li><li>benchmark_test.py</li><li>benchmark_train_models.txt</li><li>convert_train_benchmark_script.py</li><li>gather_models.py</li><li>benchmark_filter.py</li></ul></td>
+    </tr>
+  </tbody>
+</table>
+</div></details>
+
+## MMclassification (1.0.0rc5)
+
+<details open><div align='center'><b>MMclassification Module Components</b></div>
+<div align='center'>
+<style type="text/css">
+#T_0c9eb thead th {
+  align: center;
+  text-align: center;
+  vertical-align: bottom;
+}
+#T_0c9eb_row0_col0, #T_0c9eb_row0_col1, #T_0c9eb_row0_col2, #T_0c9eb_row0_col3, #T_0c9eb_row0_col4 {
+  text-align: left;
+  align: center;
+  vertical-align: top;
+}
+</style>
+<table id="T_0c9eb">
+  <thead>
+    <tr>
+      <th id="T_0c9eb_level0_col0" class="col_heading level0 col0" >visualizer</th>
+      <th id="T_0c9eb_level0_col1" class="col_heading level0 col1" >data sampler</th>
+      <th id="T_0c9eb_level0_col2" class="col_heading level0 col2" >optimizer</th>
+      <th id="T_0c9eb_level0_col3" class="col_heading level0 col3" >batch augment</th>
+      <th id="T_0c9eb_level0_col4" class="col_heading level0 col4" >metric</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td id="T_0c9eb_row0_col0" class="data row0 col0" ><ul><li>ClsVisualizer</li></ul></td>
+      <td id="T_0c9eb_row0_col1" class="data row0 col1" ><ul><li>RepeatAugSampler</li></ul></td>
+      <td id="T_0c9eb_row0_col2" class="data row0 col2" ><ul><li>Adan</li><li>Lamb</li></ul></td>
+      <td id="T_0c9eb_row0_col3" class="data row0 col3" ><ul><li>Mixup</li><li>CutMix</li><li>ResizeMix</li></ul></td>
+      <td id="T_0c9eb_row0_col4" class="data row0 col4" ><ul><li>Accuracy</li><li>SingleLabelMetric</li><li>MultiLabelMetric</li><li>AveragePrecision</li><li>MultiTasksMetric</li><li>VOCMultiLabelMetric</li><li>VOCAveragePrecision</li></ul></td>
+    </tr>
+  </tbody>
+</table>
+</div><div align='center'>
+<style type="text/css">
+#T_896f9 thead th {
+  align: center;
+  text-align: center;
+  vertical-align: bottom;
+}
+#T_896f9_row0_col0, #T_896f9_row0_col1, #T_896f9_row0_col2, #T_896f9_row0_col3 {
+  text-align: left;
+  align: center;
+  vertical-align: top;
+}
+</style>
+<table id="T_896f9">
+  <thead>
+    <tr>
+      <th id="T_896f9_level0_col0" class="col_heading level0 col0" >hook</th>
+      <th id="T_896f9_level0_col1" class="col_heading level0 col1" >dataset</th>
+      <th id="T_896f9_level0_col2" class="col_heading level0 col2" >transform (part 1)</th>
+      <th id="T_896f9_level0_col3" class="col_heading level0 col3" >transform (part 2)</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td id="T_896f9_row0_col0" class="data row0 col0" ><ul><li>ClassNumCheckHook</li><li>EMAHook</li><li>SetAdaptiveMarginsHook</li><li>PreciseBNHook</li><li>PrepareProtoBeforeValLoopHook</li><li>SwitchRecipeHook</li><li>VisualizationHook</li></ul></td>
+      <td id="T_896f9_row0_col1" class="data row0 col1" ><ul><li>BaseDataset</li><li>CIFAR10</li><li>CIFAR100</li><li>CUB</li><li>CustomDataset</li><li>KFoldDataset</li><li>ImageNet</li><li>ImageNet21k</li><li>MNIST</li><li>FashionMNIST</li><li>MultiLabelDataset</li><li>MultiTaskDataset</li><li>VOC</li></ul></td>
+      <td id="T_896f9_row0_col2" class="data row0 col2" ><ul><li>AutoAugment</li><li>RandAugment</li><li>Shear</li><li>Translate</li><li>Rotate</li><li>AutoContrast</li><li>Invert</li><li>Equalize</li><li>Solarize</li><li>SolarizeAdd</li><li>Posterize</li><li>Contrast</li><li>ColorTransform</li><li>Brightness</li><li>Sharpness</li><li>Cutout</li></ul></td>
+      <td id="T_896f9_row0_col3" class="data row0 col3" ><ul><li>PackClsInputs</li><li>PackMultiTaskInputs</li><li>Transpose</li><li>ToPIL</li><li>ToNumpy</li><li>Collect</li><li>RandomCrop</li><li>RandomResizedCrop</li><li>EfficientNetRandomCrop</li><li>RandomErasing</li><li>EfficientNetCenterCrop</li><li>ResizeEdge</li><li>ColorJitter</li><li>Lighting</li><li>Albumentations</li><li>Albu</li></ul></td>
+    </tr>
+  </tbody>
+</table>
+</div><div align='center'>
+<style type="text/css">
+#T_74e1e thead th {
+  align: center;
+  text-align: center;
+  vertical-align: bottom;
+}
+#T_74e1e_row0_col0, #T_74e1e_row0_col1, #T_74e1e_row0_col2, #T_74e1e_row0_col3 {
+  text-align: left;
+  align: center;
+  vertical-align: top;
+}
+</style>
+<table id="T_74e1e">
+  <thead>
+    <tr>
+      <th id="T_74e1e_level0_col0" class="col_heading level0 col0" >model (part 1)</th>
+      <th id="T_74e1e_level0_col1" class="col_heading level0 col1" >model (part 2)</th>
+      <th id="T_74e1e_level0_col2" class="col_heading level0 col2" >model (part 3)</th>
+      <th id="T_74e1e_level0_col3" class="col_heading level0 col3" >model (part 4)</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td id="T_74e1e_row0_col0" class="data row0 col0" ><ul><li>AlexNet</li><li>ShiftWindowMSA</li><li>ClsDataPreprocessor</li><li>VisionTransformer</li><li>BEiT</li><li>Conformer</li><li>ConvMixer</li><li>ResNet</li><li>ResNetV1c</li><li>ResNetV1d</li><li>ResNeXt</li><li>CSPDarkNet</li><li>CSPResNet</li><li>CSPResNeXt</li><li>DaViT</li><li>DistilledVisionTransformer</li><li>DeiT3</li><li>DenseNet</li><li>PoolFormer</li><li>EfficientFormer</li></ul></td>
+      <td id="T_74e1e_row0_col1" class="data row0 col1" ><ul><li>EfficientNet</li><li>EfficientNetV2</li><li>HorNet</li><li>HRNet</li><li>InceptionV3</li><li>LeNet5</li><li>MixMIMTransformer</li><li>MlpMixer</li><li>MobileNetV2</li><li>MobileNetV3</li><li>MobileOne</li><li>MViT</li><li>RegNet</li><li>RepLKNet</li><li>RepMLPNet</li><li>RepVGG</li><li>Res2Net</li><li>ResNeSt</li><li>ResNet_CIFAR</li><li>RevVisionTransformer</li></ul></td>
+      <td id="T_74e1e_row0_col2" class="data row0 col2" ><ul><li>SEResNet</li><li>SEResNeXt</li><li>ShuffleNetV1</li><li>ShuffleNetV2</li><li>SwinTransformer</li><li>SwinTransformerV2</li><li>T2T_ViT</li><li>TIMMBackbone</li><li>TNT</li><li>PCPVT</li><li>SVT</li><li>VAN</li><li>VGG</li><li>HuggingFaceClassifier</li><li>ImageClassifier</li><li>TimmClassifier</li><li>ClsHead</li><li>ConformerHead</li><li>VisionTransformerClsHead</li><li>DeiTClsHead</li></ul></td>
+      <td id="T_74e1e_row0_col3" class="data row0 col3" ><ul><li>EfficientFormerClsHead</li><li>LinearClsHead</li><li>AsymmetricLoss</li><li>CrossEntropyLoss</li><li>FocalLoss</li><li>LabelSmoothLoss</li><li>SeesawLoss</li><li>ArcFaceClsHead</li><li>MultiLabelClsHead</li><li>CSRAClsHead</li><li>MultiLabelLinearClsHead</li><li>MultiTaskHead</li><li>StackedLinearClsHead</li><li>GlobalAveragePooling</li><li>GeneralizedMeanPooling</li><li>HRFuseScales</li><li>LinearReduction</li><li>ImageToImageRetriever</li><li>AverageClsScoreTTA</li></ul></td>
+    </tr>
+  </tbody>
+</table>
+</div></details>
+<details open><div align='center'><b>MMclassification Tools</b></div>
+<div align='center'>
+<style type="text/css">
+#T_ba612 thead th {
+  align: center;
+  text-align: center;
+  vertical-align: bottom;
+}
+#T_ba612_row0_col0, #T_ba612_row0_col1, #T_ba612_row0_col2, #T_ba612_row0_col3, #T_ba612_row0_col4 {
+  text-align: left;
+  align: center;
+  vertical-align: top;
+}
+</style>
+<table id="T_ba612">
+  <thead>
+    <tr>
+      <th id="T_ba612_level0_col0" class="col_heading level0 col0" >tools/misc</th>
+      <th id="T_ba612_level0_col1" class="col_heading level0 col1" >tools/visualizations</th>
+      <th id="T_ba612_level0_col2" class="col_heading level0 col2" >tools/torchserve</th>
+      <th id="T_ba612_level0_col3" class="col_heading level0 col3" >.dev_scripts</th>
+      <th id="T_ba612_level0_col4" class="col_heading level0 col4" >tools/analysis_tools</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td id="T_ba612_row0_col0" class="data row0 col0" ><ul><li>verify_dataset.py</li><li>print_config.py</li></ul></td>
+      <td id="T_ba612_row0_col1" class="data row0 col1" ><ul><li>browse_dataset.py</li><li>vis_scheduler.py</li><li>vis_cam.py</li></ul></td>
+      <td id="T_ba612_row0_col2" class="data row0 col2" ><ul><li>mmcls_handler.py</li><li>mmcls2torchserve.py</li><li>test_torchserver.py</li></ul></td>
+      <td id="T_ba612_row0_col3" class="data row0 col3" ><ul><li>compare_init.py</li><li>ckpt_tree.py</li><li>generate_readme.py</li></ul></td>
+      <td id="T_ba612_row0_col4" class="data row0 col4" ><ul><li>eval_metric.py</li><li>analyze_results.py</li><li>analyze_logs.py</li><li>get_flops.py</li></ul></td>
+    </tr>
+  </tbody>
+</table>
+</div><div align='center'>
+<style type="text/css">
+#T_3bd40 thead th {
+  align: center;
+  text-align: center;
+  vertical-align: bottom;
+}
+#T_3bd40_row0_col0, #T_3bd40_row0_col1, #T_3bd40_row0_col2, #T_3bd40_row0_col3 {
+  text-align: left;
+  align: center;
+  vertical-align: top;
+}
+</style>
+<table id="T_3bd40">
+  <thead>
+    <tr>
+      <th id="T_3bd40_level0_col0" class="col_heading level0 col0" >.dev_scripts/benchmark_regression</th>
+      <th id="T_3bd40_level0_col1" class="col_heading level0 col1" >tools</th>
+      <th id="T_3bd40_level0_col2" class="col_heading level0 col2" >tools/model_converters (part 1)</th>
+      <th id="T_3bd40_level0_col3" class="col_heading level0 col3" >tools/model_converters (part 2)</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td id="T_3bd40_row0_col0" class="data row0 col0" ><ul><li>bench_train.yml</li><li>4-benchmark_speed.py</li><li>3-benchmark_train.py</li><li>1-benchmark_valid.py</li><li>2-benchmark_test.py</li></ul></td>
+      <td id="T_3bd40_row0_col1" class="data row0 col1" ><ul><li>dist_test.sh</li><li>slurm_test.sh</li><li>test.py</li><li>dist_train.sh</li><li>train.py</li><li>slurm_train.sh</li><li>kfold-cross-valid.py</li></ul></td>
+      <td id="T_3bd40_row0_col2" class="data row0 col2" ><ul><li>efficientnet_to_mmcls.py</li><li>repvgg_to_mmcls.py</li><li>clip_to_mmcls.py</li><li>reparameterize_model.py</li><li>shufflenetv2_to_mmcls.py</li><li>van2mmcls.py</li><li>hornet2mmcls.py</li><li>mixmimx_to_mmcls.py</li><li>edgenext_to_mmcls.py</li><li>torchvision_to_mmcls.py</li><li>twins2mmcls.py</li><li>revvit_to_mmcls.py</li></ul></td>
+      <td id="T_3bd40_row0_col3" class="data row0 col3" ><ul><li>convnext_to_mmcls.py</li><li>replknet_to_mmcls.py</li><li>efficientnetv2_to_mmcls.py</li><li>mobilenetv2_to_mmcls.py</li><li>mlpmixer_to_mmcls.py</li><li>davit_to_mmcls.py</li><li>vgg_to_mmcls.py</li><li>deit3_to_mmcls.py</li><li>eva_to_mmcls.py</li><li>publish_model.py</li><li>tinyvit_to_mmcls.py</li></ul></td>
+    </tr>
+  </tbody>
+</table>
+</div></details>
+
+## MMsegmentation (1.0.0rc5)
+
+<details open><div align='center'><b>MMsegmentation Module Components</b></div>
+<div align='center'>
+<style type="text/css">
+#T_aa436 thead th {
+  align: center;
+  text-align: center;
+  vertical-align: bottom;
+}
+#T_aa436_row0_col0, #T_aa436_row0_col1, #T_aa436_row0_col2, #T_aa436_row0_col3, #T_aa436_row0_col4 {
+  text-align: left;
+  align: center;
+  vertical-align: top;
+}
+</style>
+<table id="T_aa436">
+  <thead>
+    <tr>
+      <th id="T_aa436_level0_col0" class="col_heading level0 col0" >task util</th>
+      <th id="T_aa436_level0_col1" class="col_heading level0 col1" >visualizer</th>
+      <th id="T_aa436_level0_col2" class="col_heading level0 col2" >hook</th>
+      <th id="T_aa436_level0_col3" class="col_heading level0 col3" >optimizer wrapper constructor</th>
+      <th id="T_aa436_level0_col4" class="col_heading level0 col4" >metric</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td id="T_aa436_row0_col0" class="data row0 col0" ><ul><li>OHEMPixelSampler</li></ul></td>
+      <td id="T_aa436_row0_col1" class="data row0 col1" ><ul><li>SegLocalVisualizer</li></ul></td>
+      <td id="T_aa436_row0_col2" class="data row0 col2" ><ul><li>SegVisualizationHook</li></ul></td>
+      <td id="T_aa436_row0_col3" class="data row0 col3" ><ul><li>LearningRateDecayOptimizerConstructor</li><li>LayerDecayOptimizerConstructor</li></ul></td>
+      <td id="T_aa436_row0_col4" class="data row0 col4" ><ul><li>CitysMetric</li><li>IoUMetric</li></ul></td>
+    </tr>
+  </tbody>
+</table>
+</div><div align='center'>
+<style type="text/css">
+#T_f41af thead th {
+  align: center;
+  text-align: center;
+  vertical-align: bottom;
+}
+#T_f41af_row0_col0, #T_f41af_row0_col1, #T_f41af_row0_col2, #T_f41af_row0_col3 {
+  text-align: left;
+  align: center;
+  vertical-align: top;
+}
+</style>
+<table id="T_f41af">
+  <thead>
+    <tr>
+      <th id="T_f41af_level0_col0" class="col_heading level0 col0" >dataset (part 1)</th>
+      <th id="T_f41af_level0_col1" class="col_heading level0 col1" >dataset (part 2)</th>
+      <th id="T_f41af_level0_col2" class="col_heading level0 col2" >transform (part 1)</th>
+      <th id="T_f41af_level0_col3" class="col_heading level0 col3" >transform (part 2)</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td id="T_f41af_row0_col0" class="data row0 col0" ><ul><li>BaseSegDataset</li><li>ADE20KDataset</li><li>ChaseDB1Dataset</li><li>CityscapesDataset</li><li>COCOStuffDataset</li><li>DarkZurichDataset</li><li>MultiImageMixDataset</li><li>DecathlonDataset</li><li>DRIVEDataset</li><li>HRFDataset</li><li>iSAIDDataset</li></ul></td>
+      <td id="T_f41af_row0_col1" class="data row0 col1" ><ul><li>ISPRSDataset</li><li>LIPDataset</li><li>LoveDADataset</li><li>NightDrivingDataset</li><li>PascalContextDataset</li><li>PascalContextDataset59</li><li>PotsdamDataset</li><li>STAREDataset</li><li>SynapseDataset</li><li>PascalVOCDataset</li></ul></td>
+      <td id="T_f41af_row0_col2" class="data row0 col2" ><ul><li>PackSegInputs</li><li>LoadAnnotations</li><li>LoadImageFromNDArray</li><li>LoadBiomedicalImageFromFile</li><li>LoadBiomedicalAnnotation</li><li>LoadBiomedicalData</li><li>ResizeToMultiple</li><li>Rerange</li><li>CLAHE</li><li>RandomCrop</li><li>RandomRotate</li><li>RGB2Gray</li><li>AdjustGamma</li></ul></td>
+      <td id="T_f41af_row0_col3" class="data row0 col3" ><ul><li>SegRescale</li><li>PhotoMetricDistortion</li><li>RandomCutOut</li><li>RandomRotFlip</li><li>RandomMosaic</li><li>GenerateEdge</li><li>ResizeShortestEdge</li><li>BioMedical3DRandomCrop</li><li>BioMedicalGaussianNoise</li><li>BioMedicalGaussianBlur</li><li>BioMedicalRandomGamma</li><li>BioMedical3DPad</li><li>BioMedical3DRandomFlip</li></ul></td>
+    </tr>
+  </tbody>
+</table>
+</div><div align='center'>
+<style type="text/css">
+#T_d6c05 thead th {
+  align: center;
+  text-align: center;
+  vertical-align: bottom;
+}
+#T_d6c05_row0_col0, #T_d6c05_row0_col1, #T_d6c05_row0_col2, #T_d6c05_row0_col3 {
+  text-align: left;
+  align: center;
+  vertical-align: top;
+}
+</style>
+<table id="T_d6c05">
+  <thead>
+    <tr>
+      <th id="T_d6c05_level0_col0" class="col_heading level0 col0" >model (part 1)</th>
+      <th id="T_d6c05_level0_col1" class="col_heading level0 col1" >model (part 2)</th>
+      <th id="T_d6c05_level0_col2" class="col_heading level0 col2" >model (part 3)</th>
+      <th id="T_d6c05_level0_col3" class="col_heading level0 col3" >model (part 4)</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td id="T_d6c05_row0_col0" class="data row0 col0" ><ul><li>VisionTransformer</li><li>BEiT</li><li>BiSeNetV1</li><li>BiSeNetV2</li><li>CGNet</li><li>ERFNet</li><li>CrossEntropyLoss</li><li>DiceLoss</li><li>FocalLoss</li><li>LovaszLoss</li><li>TverskyLoss</li><li>ANNHead</li><li>APCHead</li><li>ASPPHead</li><li>FCNHead</li><li>CCHead</li><li>DAHead</li><li>DMHead</li><li>DNLHead</li></ul></td>
+      <td id="T_d6c05_row0_col1" class="data row0 col1" ><ul><li>DPTHead</li><li>EMAHead</li><li>EncHead</li><li>FPNHead</li><li>GCHead</li><li>ISAHead</li><li>KernelUpdator</li><li>KernelUpdateHead</li><li>IterativeDecodeHead</li><li>LRASPPHead</li><li>Mask2FormerHead</li><li>MaskFormerHead</li><li>NLHead</li><li>OCRHead</li><li>PointHead</li><li>PSAHead</li><li>PSPHead</li><li>SegformerHead</li><li>SegmenterMaskTransformerHead</li></ul></td>
+      <td id="T_d6c05_row0_col2" class="data row0 col2" ><ul><li>DepthwiseSeparableASPPHead</li><li>DepthwiseSeparableFCNHead</li><li>SETRMLAHead</li><li>SETRUPHead</li><li>STDCHead</li><li>UPerHead</li><li>FastSCNN</li><li>ResNet</li><li>ResNetV1c</li><li>ResNetV1d</li><li>HRNet</li><li>ICNet</li><li>MAE</li><li>MixVisionTransformer</li><li>MobileNetV2</li><li>MobileNetV3</li><li>ResNeSt</li><li>ResNeXt</li><li>STDCNet</li></ul></td>
+      <td id="T_d6c05_row0_col3" class="data row0 col3" ><ul><li>STDCContextPathNet</li><li>SwinTransformer</li><li>TIMMBackbone</li><li>PCPVT</li><li>SVT</li><li>DeconvModule</li><li>InterpConv</li><li>UNet</li><li>SegDataPreProcessor</li><li>Feature2Pyramid</li><li>FPN</li><li>ICNeck</li><li>JPU</li><li>MLANeck</li><li>MultiLevelNeck</li><li>EncoderDecoder</li><li>CascadeEncoderDecoder</li><li>SegTTAModel</li></ul></td>
+    </tr>
+  </tbody>
+</table>
+</div></details>
+<details open><div align='center'><b>MMsegmentation Tools</b></div>
+<div align='center'>
+<style type="text/css">
+#T_2c057 thead th {
+  align: center;
+  text-align: center;
+  vertical-align: bottom;
+}
+#T_2c057_row0_col0, #T_2c057_row0_col1, #T_2c057_row0_col2, #T_2c057_row0_col3 {
+  text-align: left;
+  align: center;
+  vertical-align: top;
+}
+</style>
+<table id="T_2c057">
+  <thead>
+    <tr>
+      <th id="T_2c057_level0_col0" class="col_heading level0 col0" >tools/deployment</th>
+      <th id="T_2c057_level0_col1" class="col_heading level0 col1" >tools/misc</th>
+      <th id="T_2c057_level0_col2" class="col_heading level0 col2" >tools/torchserve</th>
+      <th id="T_2c057_level0_col3" class="col_heading level0 col3" >tools/analysis_tools</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td id="T_2c057_row0_col0" class="data row0 col0" ><ul><li>pytorch2torchscript.py</li></ul></td>
+      <td id="T_2c057_row0_col1" class="data row0 col1" ><ul><li>browse_dataset.py</li><li>publish_model.py</li><li>print_config.py</li></ul></td>
+      <td id="T_2c057_row0_col2" class="data row0 col2" ><ul><li>mmseg_handler.py</li><li>mmseg2torchserve.py</li><li>test_torchserve.py</li></ul></td>
+      <td id="T_2c057_row0_col3" class="data row0 col3" ><ul><li>benchmark.py</li><li>confusion_matrix.py</li><li>analyze_logs.py</li><li>get_flops.py</li></ul></td>
+    </tr>
+  </tbody>
+</table>
+</div><div align='center'>
+<style type="text/css">
+#T_bf7a6 thead th {
+  align: center;
+  text-align: center;
+  vertical-align: bottom;
+}
+#T_bf7a6_row0_col0, #T_bf7a6_row0_col1, #T_bf7a6_row0_col2 {
+  text-align: left;
+  align: center;
+  vertical-align: top;
+}
+</style>
+<table id="T_bf7a6">
+  <thead>
+    <tr>
+      <th id="T_bf7a6_level0_col0" class="col_heading level0 col0" >tools</th>
+      <th id="T_bf7a6_level0_col1" class="col_heading level0 col1" >tools/model_converters</th>
+      <th id="T_bf7a6_level0_col2" class="col_heading level0 col2" >tools/dataset_converters</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td id="T_bf7a6_row0_col0" class="data row0 col0" ><ul><li>dist_test.sh</li><li>slurm_test.sh</li><li>test.py</li><li>dist_train.sh</li><li>train.py</li><li>slurm_train.sh</li></ul></td>
+      <td id="T_bf7a6_row0_col1" class="data row0 col1" ><ul><li>swin2mmseg.py</li><li>vitjax2mmseg.py</li><li>twins2mmseg.py</li><li>stdc2mmseg.py</li><li>vit2mmseg.py</li><li>mit2mmseg.py</li><li>beit2mmseg.py</li></ul></td>
+      <td id="T_bf7a6_row0_col2" class="data row0 col2" ><ul><li>voc_aug.py</li><li>hrf.py</li><li>drive.py</li><li>pascal_context.py</li><li>vaihingen.py</li><li>stare.py</li><li>synapse.py</li><li>isaid.py</li><li>cityscapes.py</li><li>loveda.py</li><li>potsdam.py</li><li>chase_db1.py</li><li>coco_stuff164k.py</li><li>coco_stuff10k.py</li></ul></td>
+    </tr>
+  </tbody>
+</table>
+</div></details>
+
+## MMengine (0.6.0)
+
+<details open><div align='center'><b>MMengine Module Components</b></div>
+<div align='center'>
+<style type="text/css">
+#T_41b5b thead th {
+  align: center;
+  text-align: center;
+  vertical-align: bottom;
+}
+#T_41b5b_row0_col0, #T_41b5b_row0_col1, #T_41b5b_row0_col2, #T_41b5b_row0_col3, #T_41b5b_row0_col4 {
+  text-align: left;
+  align: center;
+  vertical-align: top;
+}
+</style>
+<table id="T_41b5b">
+  <thead>
+    <tr>
+      <th id="T_41b5b_level0_col0" class="col_heading level0 col0" >log_processor</th>
+      <th id="T_41b5b_level0_col1" class="col_heading level0 col1" >visualizer</th>
+      <th id="T_41b5b_level0_col2" class="col_heading level0 col2" >metric</th>
+      <th id="T_41b5b_level0_col3" class="col_heading level0 col3" >evaluator</th>
+      <th id="T_41b5b_level0_col4" class="col_heading level0 col4" >runner</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td id="T_41b5b_row0_col0" class="data row0 col0" ><ul><li>LogProcessor</li></ul></td>
+      <td id="T_41b5b_row0_col1" class="data row0 col1" ><ul><li>Visualizer</li></ul></td>
+      <td id="T_41b5b_row0_col2" class="data row0 col2" ><ul><li>DumpResults</li></ul></td>
+      <td id="T_41b5b_row0_col3" class="data row0 col3" ><ul><li>Evaluator</li></ul></td>
+      <td id="T_41b5b_row0_col4" class="data row0 col4" ><ul><li>Runner</li></ul></td>
+    </tr>
+  </tbody>
+</table>
+</div><div align='center'>
+<style type="text/css">
+#T_f32ce thead th {
+  align: center;
+  text-align: center;
+  vertical-align: bottom;
+}
+#T_f32ce_row0_col0, #T_f32ce_row0_col1, #T_f32ce_row0_col2, #T_f32ce_row0_col3, #T_f32ce_row0_col4 {
+  text-align: left;
+  align: center;
+  vertical-align: top;
+}
+</style>
+<table id="T_f32ce">
+  <thead>
+    <tr>
+      <th id="T_f32ce_level0_col0" class="col_heading level0 col0" >optimizer wrapper constructor</th>
+      <th id="T_f32ce_level0_col1" class="col_heading level0 col1" >Collate Functions</th>
+      <th id="T_f32ce_level0_col2" class="col_heading level0 col2" >data sampler</th>
+      <th id="T_f32ce_level0_col3" class="col_heading level0 col3" >vis_backend</th>
+      <th id="T_f32ce_level0_col4" class="col_heading level0 col4" >dataset</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td id="T_f32ce_row0_col0" class="data row0 col0" ><ul><li>DefaultOptimWrapperConstructor</li></ul></td>
+      <td id="T_f32ce_row0_col1" class="data row0 col1" ><ul><li>pseudo_collate</li><li>default_collate</li></ul></td>
+      <td id="T_f32ce_row0_col2" class="data row0 col2" ><ul><li>DefaultSampler</li><li>InfiniteSampler</li></ul></td>
+      <td id="T_f32ce_row0_col3" class="data row0 col3" ><ul><li>LocalVisBackend</li><li>WandbVisBackend</li><li>TensorboardVisBackend</li></ul></td>
+      <td id="T_f32ce_row0_col4" class="data row0 col4" ><ul><li>ConcatDataset</li><li>RepeatDataset</li><li>ClassBalancedDataset</li></ul></td>
+    </tr>
+  </tbody>
+</table>
+</div><div align='center'>
+<style type="text/css">
+#T_467b9 thead th {
+  align: center;
+  text-align: center;
+  vertical-align: bottom;
+}
+#T_467b9_row0_col0, #T_467b9_row0_col1, #T_467b9_row0_col2, #T_467b9_row0_col3, #T_467b9_row0_col4 {
+  text-align: left;
+  align: center;
+  vertical-align: top;
+}
+</style>
+<table id="T_467b9">
+  <thead>
+    <tr>
+      <th id="T_467b9_level0_col0" class="col_heading level0 col0" >optim_wrapper</th>
+      <th id="T_467b9_level0_col1" class="col_heading level0 col1" >loop</th>
+      <th id="T_467b9_level0_col2" class="col_heading level0 col2" >model_wrapper</th>
+      <th id="T_467b9_level0_col3" class="col_heading level0 col3" >model</th>
+      <th id="T_467b9_level0_col4" class="col_heading level0 col4" >weight initializer</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td id="T_467b9_row0_col0" class="data row0 col0" ><ul><li>OptimWrapper</li><li>AmpOptimWrapper</li><li>ApexOptimWrapper</li></ul></td>
+      <td id="T_467b9_row0_col1" class="data row0 col1" ><ul><li>EpochBasedTrainLoop</li><li>IterBasedTrainLoop</li><li>ValLoop</li><li>TestLoop</li></ul></td>
+      <td id="T_467b9_row0_col2" class="data row0 col2" ><ul><li>DistributedDataParallel</li><li>DataParallel</li><li>MMDistributedDataParallel</li><li>MMSeparateDistributedDataParallel</li></ul></td>
+      <td id="T_467b9_row0_col3" class="data row0 col3" ><ul><li>StochasticWeightAverage</li><li>ExponentialMovingAverage</li><li>MomentumAnnealingEMA</li><li>BaseDataPreprocessor</li><li>ImgDataPreprocessor</li><li>BaseTTAModel</li><li>ToyModel</li></ul></td>
+      <td id="T_467b9_row0_col4" class="data row0 col4" ><ul><li>Constant</li><li>Xavier</li><li>Normal</li><li>TruncNormal</li><li>Uniform</li><li>Kaiming</li><li>Caffe2Xavier</li><li>Pretrained</li></ul></td>
+    </tr>
+  </tbody>
+</table>
+</div><div align='center'>
+<style type="text/css">
+#T_d5b59 thead th {
+  align: center;
+  text-align: center;
+  vertical-align: bottom;
+}
+#T_d5b59_row0_col0, #T_d5b59_row0_col1, #T_d5b59_row0_col2, #T_d5b59_row0_col3 {
+  text-align: left;
+  align: center;
+  vertical-align: top;
+}
+</style>
+<table id="T_d5b59">
+  <thead>
+    <tr>
+      <th id="T_d5b59_level0_col0" class="col_heading level0 col0" >hook</th>
+      <th id="T_d5b59_level0_col1" class="col_heading level0 col1" >optimizer</th>
+      <th id="T_d5b59_level0_col2" class="col_heading level0 col2" >parameter scheduler (part 1)</th>
+      <th id="T_d5b59_level0_col3" class="col_heading level0 col3" >parameter scheduler (part 2)</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td id="T_d5b59_row0_col0" class="data row0 col0" ><ul><li>CheckpointHook</li><li>EMAHook</li><li>EmptyCacheHook</li><li>IterTimerHook</li><li>LoggerHook</li><li>NaiveVisualizationHook</li><li>ParamSchedulerHook</li><li>ProfilerHook</li><li>NPUProfilerHook</li><li>RuntimeInfoHook</li><li>DistSamplerSeedHook</li><li>SyncBuffersHook</li><li>PrepareTTAHook</li></ul></td>
+      <td id="T_d5b59_row0_col1" class="data row0 col1" ><ul><li>ASGD</li><li>Adadelta</li><li>Adagrad</li><li>Adam</li><li>AdamW</li><li>Adamax</li><li>LBFGS</li><li>Optimizer</li><li>RMSprop</li><li>Rprop</li><li>SGD</li><li>SparseAdam</li><li>ZeroRedundancyOptimizer</li></ul></td>
+      <td id="T_d5b59_row0_col2" class="data row0 col2" ><ul><li>StepParamScheduler</li><li>MultiStepParamScheduler</li><li>ConstantParamScheduler</li><li>ExponentialParamScheduler</li><li>CosineAnnealingParamScheduler</li><li>LinearParamScheduler</li><li>PolyParamScheduler</li><li>OneCycleParamScheduler</li><li>CosineRestartParamScheduler</li><li>ReduceOnPlateauParamScheduler</li><li>ConstantLR</li><li>CosineAnnealingLR</li><li>ExponentialLR</li><li>LinearLR</li><li>MultiStepLR</li></ul></td>
+      <td id="T_d5b59_row0_col3" class="data row0 col3" ><ul><li>StepLR</li><li>PolyLR</li><li>OneCycleLR</li><li>CosineRestartLR</li><li>ReduceOnPlateauLR</li><li>ConstantMomentum</li><li>CosineAnnealingMomentum</li><li>ExponentialMomentum</li><li>LinearMomentum</li><li>MultiStepMomentum</li><li>StepMomentum</li><li>PolyMomentum</li><li>CosineRestartMomentum</li><li>ReduceOnPlateauMomentum</li></ul></td>
+    </tr>
+  </tbody>
+</table>
+</div></details>
+
+## MMCV (2.0.0rc4)
+
+<details open><div align='center'><b>MMCV Module Components</b></div>
+<div align='center'>
+<style type="text/css">
+#T_be596 thead th {
+  align: center;
+  text-align: center;
+  vertical-align: bottom;
+}
+#T_be596_row0_col0, #T_be596_row0_col1, #T_be596_row0_col2, #T_be596_row0_col3 {
+  text-align: left;
+  align: center;
+  vertical-align: top;
+}
+</style>
+<table id="T_be596">
+  <thead>
+    <tr>
+      <th id="T_be596_level0_col0" class="col_heading level0 col0" >transform</th>
+      <th id="T_be596_level0_col1" class="col_heading level0 col1" >model (part 1)</th>
+      <th id="T_be596_level0_col2" class="col_heading level0 col2" >model (part 2)</th>
+      <th id="T_be596_level0_col3" class="col_heading level0 col3" >model (part 3)</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td id="T_be596_row0_col0" class="data row0 col0" ><ul><li>LoadImageFromFile</li><li>LoadAnnotations</li><li>Compose</li><li>KeyMapper</li><li>TransformBroadcaster</li><li>RandomChoice</li><li>RandomApply</li><li>Normalize</li><li>Resize</li><li>Pad</li><li>CenterCrop</li><li>RandomGrayscale</li><li>MultiScaleFlipAug</li><li>TestTimeAug</li><li>RandomChoiceResize</li><li>RandomFlip</li><li>RandomResize</li><li>ToTensor</li><li>ImageToTensor</li></ul></td>
+      <td id="T_be596_row0_col1" class="data row0 col1" ><ul><li>ReLU</li><li>LeakyReLU</li><li>PReLU</li><li>RReLU</li><li>ReLU6</li><li>ELU</li><li>Sigmoid</li><li>Tanh</li><li>SiLU</li><li>Clamp</li><li>Clip</li><li>GELU</li><li>ContextBlock</li><li>Conv1d</li><li>Conv2d</li><li>Conv3d</li><li>Conv</li><li>Conv2dAdaptivePadding</li></ul></td>
+      <td id="T_be596_row0_col2" class="data row0 col2" ><ul><li>BN</li><li>BN1d</li><li>BN2d</li><li>BN3d</li><li>SyncBN</li><li>GN</li><li>LN</li><li>IN</li><li>IN1d</li><li>IN2d</li><li>IN3d</li><li>zero</li><li>reflect</li><li>replicate</li><li>ConvModule</li><li>ConvWS</li><li>ConvAWS</li><li>DropPath</li></ul></td>
+      <td id="T_be596_row0_col3" class="data row0 col3" ><ul><li>Dropout</li><li>GeneralizedAttention</li><li>HSigmoid</li><li>HSwish</li><li>NonLocal2d</li><li>Swish</li><li>nearest</li><li>bilinear</li><li>pixel_shuffle</li><li>deconv</li><li>ConvTranspose2d</li><li>deconv3d</li><li>ConvTranspose3d</li><li>MultiheadAttention</li><li>FFN</li><li>BaseTransformerLayer</li><li>TransformerLayerSequence</li></ul></td>
+    </tr>
+  </tbody>
+</table>
+</div></details>
+<details open><div align='center'><b>MMCV Tools</b></div>
+<div align='center'>
+<style type="text/css">
+#T_ea8ce thead th {
+  align: center;
+  text-align: center;
+  vertical-align: bottom;
+}
+#T_ea8ce_row0_col0 {
+  text-align: left;
+  align: center;
+  vertical-align: top;
+}
+</style>
+<table id="T_ea8ce">
+  <thead>
+    <tr>
+      <th id="T_ea8ce_level0_col0" class="col_heading level0 col0" >.dev_scripts</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td id="T_ea8ce_row0_col0" class="data row0 col0" ><ul><li>check_installation.py</li></ul></td>
+    </tr>
+  </tbody>
+</table>
+</div></details>
diff --git a/mmdetection_practice/third_party/mmyolo/docs/zh_cn/common_usage/resume_training.md b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/common_usage/resume_training.md
new file mode 100644
index 0000000..36431e3
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/common_usage/resume_training.md
@@ -0,0 +1,9 @@
+# 恢复训练
+
+恢复训练是指从之前某次训练保存下来的状态开始继续训练,这里的状态包括模型的权重、优化器和优化器参数调整策略的状态。
+
+用户可以在训练命令最后加上 `--resume` 恢复训练,程序会自动从 `work_dirs` 中加载最新的权重文件恢复训练。如果 `work_dir` 中有最新的 checkpoint(例如该训练在上一次训练时被中断),则会从该 checkpoint 恢复训练,否则(例如上一次训练还没来得及保存 checkpoint 或者启动了新的训练任务)会重新开始训练。下面是一个恢复训练的示例:
+
+```shell
+python tools/train.py configs/yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py --resume
+```
diff --git a/mmdetection_practice/third_party/mmyolo/docs/zh_cn/common_usage/set_random_seed.md b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/common_usage/set_random_seed.md
new file mode 100644
index 0000000..6f747c5
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/common_usage/set_random_seed.md
@@ -0,0 +1,20 @@
+# 设置随机种子
+
+如果想要在训练时指定随机种子,可以使用以下命令:
+
+```shell
+python ./tools/train.py \
+    ${CONFIG} \                               # 配置文件路径
+    --cfg-options randomness.seed=2023 \      # 设置随机种子为 2023
+    [randomness.diff_rank_seed=True] \        # 根据 rank 来设置不同的种子。
+    [randomness.deterministic=True]           # 把 cuDNN 后端确定性选项设置为 True
+# [] 代表可选参数,实际输入命令行时,不用输入 []
+```
+
+`randomness` 有三个参数可设置,具体含义如下:
+
+- `randomness.seed=2023` ,设置随机种子为 2023。
+
+- `randomness.diff_rank_seed=True`,根据 rank 来设置不同的种子,`diff_rank_seed` 默认为 False。
+
+- `randomness.deterministic=True`,把 cuDNN 后端确定性选项设置为 True,即把`torch.backends.cudnn.deterministic` 设为 True,把 `torch.backends.cudnn.benchmark` 设为False。`deterministic` 默认为 False。更多细节见 https://pytorch.org/docs/stable/notes/randomness.html。
diff --git a/mmdetection_practice/third_party/mmyolo/docs/zh_cn/common_usage/set_syncbn.md b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/common_usage/set_syncbn.md
new file mode 100644
index 0000000..a654a2b
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/common_usage/set_syncbn.md
@@ -0,0 +1 @@
+# 开启和关闭 SyncBatchNorm
diff --git a/mmdetection_practice/third_party/mmyolo/docs/zh_cn/common_usage/single_multi_channel_applications.md b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/common_usage/single_multi_channel_applications.md
new file mode 100644
index 0000000..a20ef90
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/common_usage/single_multi_channel_applications.md
@@ -0,0 +1,188 @@
+# 单通道和多通道应用案例
+
+## 在单通道图像数据集上训练示例
+
+MMYOLO 中默认的训练图片均为彩色三通道数据,如果希望采用单通道数据集进行训练和测试,预计需要修改的地方包括:
+
+1. 所有的图片处理 pipeline 都要支持单通道运算
+2. 模型的骨干网络的第一个卷积层输入通道需要从 3 改成 1
+3. 如果希望加载 COCO 预训练权重,则需要处理第一个卷积层权重尺寸不匹配问题
+
+下面以 `cat` 数据集为例,描述整个修改过程,如果你使用的是自定义灰度图像数据集,你可以跳过数据集预处理这一步。
+
+### 1 数据集预处理
+
+自定义数据集的处理训练可参照[自定义数据集 标注+训练+测试+部署 全流程](../recommended_topics/labeling_to_deployment_tutorials.md)。
+
+`cat` 是一个三通道彩色图片数据集,为了方便演示,你可以运行下面的代码和命令,将数据集图片替换为单通道图片,方便后续验证。
+
+**1. 下载 `cat` 数据集进行解压**
+
+```shell
+python tools/misc/download_dataset.py --dataset-name cat --save-dir ./data/cat --unzip --delete
+```
+
+**2. 将数据集转换为灰度图**
+
+```python
+import argparse
+import imghdr
+import os
+from typing import List
+import cv2
+
+def parse_args():
+    parser = argparse.ArgumentParser(description='data_path')
+    parser.add_argument('path', type=str, help='Original dataset path')
+    return parser.parse_args()
+
+def main():
+    args = parse_args()
+
+    path = args.path + '/images/'
+    save_path = path
+    file_list: List[str] = os.listdir(path)
+    # Grayscale conversion of each imager
+    for file in file_list:
+        if imghdr.what(path + '/' + file) != 'jpeg':
+            continue
+        img = cv2.imread(path + '/' + file)
+        img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
+        cv2.imwrite(save_path + '/' + file, img)
+
+if __name__ == '__main__':
+    main()
+```
+
+将上述脚本命名为 `cvt_single_channel.py`, 运行命令为:
+
+```shell
+python cvt_single_channel.py data/cat
+```
+
+### 2 修改 base 配置文件
+
+**目前 MMYOLO 的一些图像处理函数例如颜色空间变换还不兼容单通道图片,如果直接采用单通道数据训练需要修改部分 pipeline,工作量较大**。为了解决不兼容问题,推荐的做法是将单通道图片作为采用三通道图片方式读取将其加载为三通道数据,但是在输入到网络前将其转换为单通道格式。这种做法会稍微增加一些运算负担,但是用户基本不需要修改代码即可使用。
+
+以 `projects/misc/custom_dataset/yolov5_s-v61_syncbn_fast_1xb32-100e_cat.py`为 `base` 配置,将其复制到 `configs/yolov5` 目录下,在同级配置路径下新增 `yolov5_s-v61_syncbn_fast_1xb32-100e_cat_single_channel.py` 文件。 我们可以 `mmyolo/models/data_preprocessors/data_preprocessor.py` 文件中继承 `YOLOv5DetDataPreprocessor` 并命名新类为 `YOLOv5SCDetDataPreprocessor`, 在其中将图片转成单通道,添加依赖库并在`mmyolo/models/data_preprocessors/__init__.py`中注册新类。 `YOLOv5SCDetDataPreprocessor` 示例代码为:
+
+```python
+@MODELS.register_module()
+class YOLOv5SCDetDataPreprocessor(YOLOv5DetDataPreprocessor):
+    """Rewrite collate_fn to get faster training speed.
+
+    Note: It must be used together with `mmyolo.datasets.utils.yolov5_collate`
+    """
+
+    def forward(self, data: dict, training: bool = False) -> dict:
+        """Perform normalization, padding, bgr2rgb conversion and convert to single channel image based on ``DetDataPreprocessor``.
+
+        Args:
+            data (dict): Data sampled from dataloader.
+            training (bool): Whether to enable training time augmentation.
+
+        Returns:
+            dict: Data in the same format as the model input.
+        """
+        if not training:
+            return super().forward(data, training)
+
+        data = self.cast_data(data)
+        inputs, data_samples = data['inputs'], data['data_samples']
+        assert isinstance(data['data_samples'], dict)
+
+        # TODO: Supports multi-scale training
+        if self._channel_conversion and inputs.shape[1] == 3:
+            inputs = inputs[:, [2, 1, 0], ...]
+
+        if self._enable_normalize:
+            inputs = (inputs - self.mean) / self.std
+
+        if self.batch_augments is not None:
+            for batch_aug in self.batch_augments:
+                inputs, data_samples = batch_aug(inputs, data_samples)
+
+        img_metas = [{'batch_input_shape': inputs.shape[2:]}] * len(inputs)
+        data_samples = {
+            'bboxes_labels': data_samples['bboxes_labels'],
+            'img_metas': img_metas
+        }
+
+        # Convert to single channel image
+        inputs = inputs.mean(dim=1, keepdim=True)
+
+        return {'inputs': inputs, 'data_samples': data_samples}
+```
+
+此时 `yolov5_s-v61_syncbn_fast_1xb32-100e_cat_single_channel.py`配置文件内容为如下所示:
+
+```python
+_base_ = 'yolov5_s-v61_syncbn_fast_1xb32-100e_cat.py'
+
+_base_.model.data_preprocessor.type = 'YOLOv5SCDetDataPreprocessor'
+```
+
+### 3 预训练模型加载问题
+
+直接使用原三通道的预训练模型,理论上会导致精度有所降低(未实验验证)。可采用的解决思路:将输入层 3 通道每个通道的权重调整为原 3 通道权重的平均值, 或将输入层每个通道的权重调整为原3通道某一通道权重,也可以对输入层权重不做修改直接训练,具体效果根据实际情况有所不同。这里采用将输入层 3 个通道权重调整为预训练 3 通道权重平均值的方式。
+
+```python
+import torch
+
+def main():
+    # 加载权重文件
+    state_dict = torch.load(
+        'checkpoints/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth'
+    )
+
+    # 修改输入层权重
+    weights = state_dict['state_dict']['backbone.stem.conv.weight']
+    avg_weight = weights.mean(dim=1, keepdim=True)
+    state_dict['state_dict']['backbone.stem.conv.weight'] = avg_weight
+
+    # 保存修改后的权重到新文件
+    torch.save(
+        state_dict,
+        'checkpoints/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187_single_channel.pth'
+    )
+
+if __name__ == '__main__':
+    main()
+```
+
+此时 `yolov5_s-v61_syncbn_fast_1xb32-100e_cat_single_channel.py`配置文件内容为如下所示:
+
+```python
+_base_ = 'yolov5_s-v61_syncbn_fast_1xb32-100e_cat.py'
+
+_base_.model.data_preprocessor.type = 'YOLOv5SCDetDataPreprocessor'
+
+load_from = './checkpoints/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187_single_channel.pth'
+```
+
+### 4 模型训练效果
+
+<img src="https://raw.githubusercontent.com/landhill/mmyolo/main/resources/cat_single_channel_test.jpeg"/>
+
+左图是实际标签,右图是目标检测结果。
+
+```shell
+ Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.958
+ Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 1.000
+ Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 1.000
+ Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = -1.000
+ Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = -1.000
+ Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.958
+ Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.881
+ Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.969
+ Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.969
+ Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = -1.000
+ Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = -1.000
+ Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.969
+bbox_mAP_copypaste: 0.958 1.000 1.000 -1.000 -1.000 0.958
+Epoch(val) [100][116/116]  coco/bbox_mAP: 0.9580  coco/bbox_mAP_50: 1.0000  coco/bbox_mAP_75: 1.0000  coco/bbox_mAP_s: -1.0000  coco/bbox_mAP_m: -1.0000  coco/bbox_mAP_l: 0.9580
+```
+
+## 在多通道图像数据集上训练示例
+
+TODO
diff --git a/mmdetection_practice/third_party/mmyolo/docs/zh_cn/common_usage/specify_device.md b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/common_usage/specify_device.md
new file mode 100644
index 0000000..772e43d
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/common_usage/specify_device.md
@@ -0,0 +1,23 @@
+# 指定特定设备训练或推理
+
+如果你有多张 GPU,比如 8 张,其编号分别为 `0, 1, 2, 3, 4, 5, 6, 7`,使用单卡训练或推理时会默认使用卡 0。如果想指定其他卡进行训练或推理,可以使用以下命令:
+
+```shell
+CUDA_VISIBLE_DEVICES=5 python ./tools/train.py ${CONFIG} #train
+CUDA_VISIBLE_DEVICES=5 python ./tools/test.py ${CONFIG} ${CHECKPOINT_FILE} #test
+```
+
+如果设置`CUDA_VISIBLE_DEVICES`为 -1 或者一个大于 GPU 最大编号的数,比如 8,将会使用 CPU 进行训练或者推理。
+
+如果你想使用其中几张卡并行训练,可以使用如下命令:
+
+```shell
+CUDA_VISIBLE_DEVICES=0,1,2,3 ./tools/dist_train.sh ${CONFIG} ${GPU_NUM}
+```
+
+这里 `GPU_NUM` 为 4。另外如果在一台机器上多个任务同时多卡训练,需要设置不同的端口,比如以下命令:
+
+```shell
+CUDA_VISIBLE_DEVICES=0,1,2,3 PORT=29500 ./tools/dist_train.sh ${CONFIG} 4
+CUDA_VISIBLE_DEVICES=4,5,6,7 PORT=29501 ./tools/dist_train.sh ${CONFIG} 4
+```
diff --git a/mmdetection_practice/third_party/mmyolo/docs/zh_cn/common_usage/tta.md b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/common_usage/tta.md
new file mode 100644
index 0000000..7baf7a4
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/common_usage/tta.md
@@ -0,0 +1,87 @@
+# 测试时增强相关说明
+
+## 测试时增强 TTA
+
+MMYOLO 在 v0.5.0+ 版本中增加对 TTA 的支持,用户可以在进行评估时候指定 `--tta` 参数使用。 以 `YOLOv5-s` 为例,其单卡 TTA 测试命令为:
+
+```shell
+python tools/test.py configs/yolov5/yolov5_n-v61_syncbn_fast_8xb16-300e_coco.py https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_n-v61_syncbn_fast_8xb16-300e_coco/yolov5_n-v61_syncbn_fast_8xb16-300e_coco_20220919_090739-b804c1ad.pth  --tta
+```
+
+TTA 功能的正常运行必须确保配置中存在 `tta_model` 和 `tta_pipeline` 两个变量,详情可以参考 [det_p5_tta.py](https://github.com/open-mmlab/mmyolo/blob/dev/configs/_base_/det_p5_tta.py)。
+
+MMYOLO 中默认的 TTA 会先执行 3 个多尺度增强,然后在每个尺度中执行 2 种水平翻转增强,一共 6 个并行的 pipeline。以 `YOLOv5-s` 为例,其 TTA 配置为:
+
+```python
+img_scales = [(640, 640), (320, 320), (960, 960)]
+
+_multiscale_resize_transforms = [
+    dict(
+        type='Compose',
+        transforms=[
+            dict(type='YOLOv5KeepRatioResize', scale=s),
+            dict(
+                type='LetterResize',
+                scale=s,
+                allow_scale_up=False,
+                pad_val=dict(img=114))
+        ]) for s in img_scales
+]
+
+tta_pipeline = [
+    dict(type='LoadImageFromFile'),
+    dict(
+        type='TestTimeAug',
+        transforms=[
+            _multiscale_resize_transforms,
+            [
+                dict(type='mmdet.RandomFlip', prob=1.),
+                dict(type='mmdet.RandomFlip', prob=0.)
+            ], [dict(type='mmdet.LoadAnnotations', with_bbox=True)],
+            [
+                dict(
+                    type='mmdet.PackDetInputs',
+                    meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                               'scale_factor', 'pad_param', 'flip',
+                               'flip_direction'))
+            ]
+        ])
+]
+```
+
+其示意图如下所示:
+
+```text
+                               LoadImageFromFile
+                    /                 |                     \
+(RatioResize,LetterResize) (RatioResize,LetterResize) (RatioResize,LetterResize)
+       /      \                    /      \                    /        \
+ RandomFlip RandomFlip      RandomFlip RandomFlip        RandomFlip RandomFlip
+     |          |                |         |                  |         |
+ LoadAnn    LoadAnn           LoadAnn    LoadAnn           LoadAnn    LoadAnn
+     |          |                |         |                  |         |
+ PackDetIn  PackDetIn         PackDetIn  PackDetIn        PackDetIn  PackDetIn
+```
+
+你可以修改 `img_scales` 来支持不同的多尺度增强,也可以插入新的 pipeline 从而实现自定义 TTA 需求。 假设你只想进行水平翻转增强,则配置应该修改为如下:
+
+```python
+tta_pipeline = [
+    dict(type='LoadImageFromFile'),
+    dict(
+        type='TestTimeAug',
+        transforms=[
+            [
+                dict(type='mmdet.RandomFlip', prob=1.),
+                dict(type='mmdet.RandomFlip', prob=0.)
+            ], [dict(type='mmdet.LoadAnnotations', with_bbox=True)],
+            [
+                dict(
+                    type='mmdet.PackDetInputs',
+                    meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                               'scale_factor', 'pad_param', 'flip',
+                               'flip_direction'))
+            ]
+        ])
+]
+```
diff --git a/mmdetection_practice/third_party/mmyolo/docs/zh_cn/conf.py b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/conf.py
new file mode 100644
index 0000000..70eb0c0
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/conf.py
@@ -0,0 +1,117 @@
+# Configuration file for the Sphinx documentation builder.
+#
+# This file only contains a selection of the most common options. For a full
+# list see the documentation:
+# https://www.sphinx-doc.org/en/master/usage/configuration.html
+
+# -- Path setup --------------------------------------------------------------
+
+# If extensions (or modules to document with autodoc) are in another directory,
+# add these directories to sys.path here. If the directory is relative to the
+# documentation root, use os.path.abspath to make it absolute, like shown here.
+#
+import os
+import subprocess
+import sys
+
+import pytorch_sphinx_theme
+
+sys.path.insert(0, os.path.abspath('../../'))
+
+# -- Project information -----------------------------------------------------
+
+project = 'MMYOLO'
+copyright = '2022, OpenMMLab'
+author = 'MMYOLO Authors'
+version_file = '../../mmyolo/version.py'
+
+
+def get_version():
+    with open(version_file) as f:
+        exec(compile(f.read(), version_file, 'exec'))
+    return locals()['__version__']
+
+
+# The full version, including alpha/beta/rc tags
+release = get_version()
+
+# -- General configuration ---------------------------------------------------
+
+# Add any Sphinx extension module names here, as strings. They can be
+# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
+# ones.
+extensions = [
+    'sphinx.ext.autodoc',
+    'sphinx.ext.napoleon',
+    'sphinx.ext.viewcode',
+    'myst_parser',
+    'sphinx_markdown_tables',
+    'sphinx_copybutton',
+]
+
+myst_enable_extensions = ['colon_fence']
+myst_heading_anchors = 3
+
+autodoc_mock_imports = [
+    'matplotlib', 'pycocotools', 'terminaltables', 'mmyolo.version', 'mmcv.ops'
+]
+
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ['_templates']
+
+# The suffix(es) of source filenames.
+# You can specify multiple suffix as a list of string:
+#
+source_suffix = {
+    '.rst': 'restructuredtext',
+    '.md': 'markdown',
+}
+
+# The master toctree document.
+master_doc = 'index'
+
+# List of patterns, relative to source directory, that match files and
+# directories to ignore when looking for source files.
+# This pattern also affects html_static_path and html_extra_path.
+exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']
+
+# -- Options for HTML output -------------------------------------------------
+
+# The theme to use for HTML and HTML Help pages.  See the documentation for
+# a list of builtin themes.
+#
+# html_theme = 'sphinx_rtd_theme'
+html_theme = 'pytorch_sphinx_theme'
+html_theme_path = [pytorch_sphinx_theme.get_html_theme_path()]
+
+html_theme_options = {
+    'menu': [
+        {
+            'name': 'GitHub',
+            'url': 'https://github.com/open-mmlab/mmyolo'
+        },
+    ],
+    # Specify the language of shared menu
+    'menu_lang': 'cn',
+}
+
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+html_static_path = ['_static']
+html_css_files = ['css/readthedocs.css']
+
+language = 'zh_CN'
+
+# -- Extension configuration -------------------------------------------------
+# Ignore >>> when copying code
+copybutton_prompt_text = r'>>> |\.\.\. '
+copybutton_prompt_is_regexp = True
+
+
+def builder_inited_handler(app):
+    subprocess.run(['./stat.py'])
+
+
+def setup(app):
+    app.connect('builder-inited', builder_inited_handler)
diff --git a/mmdetection_practice/third_party/mmyolo/docs/zh_cn/get_started/15_minutes_instance_segmentation.md b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/get_started/15_minutes_instance_segmentation.md
new file mode 100644
index 0000000..2b9e6aa
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/get_started/15_minutes_instance_segmentation.md
@@ -0,0 +1,330 @@
+# 15 分钟上手 MMYOLO 实例分割
+
+实例分割是计算机视觉中的一个任务,旨在将图像中的每个对象都分割出来,并为每个对象分配一个唯一的标识符。与语义分割不同,实例分割不仅分割出图像中的不同类别,还将同一类别的不同实例分开。
+
+<div align=center>
+<img src="https://github.com/open-mmlab/mmyolo/assets/87774050/6fd6316f-d78d-48a5-a413-86e7a74583fd" alt="Instance Segmentation" width="100%"/>
+</div>
+
+以可供下载的气球 balloon 小数据集为例,带大家 15 分钟轻松上手 MMYOLO 实例分割。整个流程包含如下步骤:
+
+- [环境安装](#环境安装)
+- [数据集准备](#数据集准备)
+- [配置准备](#配置准备)
+- [模型训练](#模型训练)
+- [模型测试](#模型测试)
+- [EasyDeploy 模型部署](#easydeploy-模型部署)
+
+本文以 YOLOv5-s 为例,其余 YOLO 系列算法的气球 balloon 小数据集 demo 配置请查看对应的算法配置文件夹下。
+
+## 环境安装
+
+假设你已经提前安装好了 Conda,接下来安装 PyTorch
+
+```shell
+conda create -n mmyolo python=3.8 -y
+conda activate mmyolo
+# 如果你有 GPU
+conda install pytorch torchvision -c pytorch
+# 如果你是 CPU
+# conda install pytorch torchvision cpuonly -c pytorch
+```
+
+安装 MMYOLO 和依赖库
+
+```shell
+git clone https://github.com/open-mmlab/mmyolo.git
+cd mmyolo
+pip install -U openmim
+mim install -r requirements/mminstall.txt
+# Install albumentations
+mim install -r requirements/albu.txt
+# Install MMYOLO
+mim install -v -e .
+# "-v" 指详细说明,或更多的输出
+# "-e" 表示在可编辑模式下安装项目,因此对代码所做的任何本地修改都会生效,从而无需重新安装。
+```
+
+```{note}
+温馨提醒:由于本仓库采用的是 OpenMMLab 2.0,请最好新建一个 conda 虚拟环境,防止和 OpenMMLab 1.0 已经安装的仓库冲突。
+```
+
+详细环境配置操作请查看 [安装和验证](./installation.md)
+
+## 数据集准备
+
+Balloon 数据集是一个包括 74 张图片的单类别数据集, 包括了训练所需的标注信息。 样例图片如下所示:
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/87774050/236993643-f581b087-9231-48a5-810b-97a5f31abe63.png" alt="balloon dataset"/>
+</div>
+
+你只需执行如下命令即可下载并且直接用起来
+
+```shell
+python tools/misc/download_dataset.py --dataset-name balloon --save-dir ./data/balloon --unzip --delete
+python ./tools/dataset_converters/balloon2coco.py
+```
+
+data 位于 mmyolo 工程目录下, `train.json`, `val.json` 中存放的是 COCO 格式的标注,`data/balloon/train`, `data/balloon/val` 中存放的是所有图片
+
+## 配置准备
+
+以 YOLOv5 算法为例,考虑到用户显存和内存有限,我们需要修改一些默认训练参数来让大家愉快的跑起来,核心需要修改的参数如下
+
+- YOLOv5 是 Anchor-Based 类算法,不同的数据集需要自适应计算合适的 Anchor
+- 默认配置是 8 卡,每张卡 batch size 为 16,现将其改成单卡,每张卡 batch size 为 4
+- 原则上 batch size 改变后,学习率也需要进行线性缩放,但是实测发现不需要
+
+具体操作为在 `configs/yolov5/ins_seg` 文件夹下新建 `yolov5_ins_s-v61_syncbn_fast_8xb16-300e_balloon_instance.py` 配置文件(为了方便大家直接使用,我们已经提供了该配置),并把以下内容复制配置文件中。
+
+```python
+_base_ = './yolov5_ins_s-v61_syncbn_fast_8xb16-300e_coco_instance.py'  # noqa
+
+data_root = 'data/balloon/'
+# 训练集标注路径
+train_ann_file = 'train.json'
+train_data_prefix = 'train/'  # 训练集图片路径
+# 测试集标注路径
+val_ann_file = 'val.json'
+val_data_prefix = 'val/'  # 验证集图片路径
+metainfo = {
+    'classes': ('balloon', ), # 数据集类别名称
+    'palette': [
+        (220, 20, 60),
+    ]
+}
+num_classes = 1
+# 批处理大小batch size设置为 4
+train_batch_size_per_gpu = 4
+# dataloader 加载进程数
+train_num_workers = 2
+log_interval = 1
+#####################
+train_dataloader = dict(
+    batch_size=train_batch_size_per_gpu,
+    num_workers=train_num_workers,
+    dataset=dict(
+        data_root=data_root,
+        metainfo=metainfo,
+        data_prefix=dict(img=train_data_prefix),
+        ann_file=train_ann_file))
+val_dataloader = dict(
+    dataset=dict(
+        data_root=data_root,
+        metainfo=metainfo,
+        data_prefix=dict(img=val_data_prefix),
+        ann_file=val_ann_file))
+test_dataloader = val_dataloader
+val_evaluator = dict(ann_file=data_root + val_ann_file)
+test_evaluator = val_evaluator
+default_hooks = dict(logger=dict(interval=log_interval))
+#####################
+
+model = dict(bbox_head=dict(head_module=dict(num_classes=num_classes)))
+```
+
+以上配置从 `yolov5_ins_s-v61_syncbn_fast_8xb16-300e_coco_instance.py` 中继承,并根据 balloon 数据的特点更新了 `data_root`、`metainfo`、`train_dataloader`、`val_dataloader`、`num_classes` 等配置。
+
+## 模型训练
+
+```shell
+python tools/train.py configs/yolov5/ins_seg/yolov5_ins_s-v61_syncbn_fast_8xb16-300e_balloon_instance.py
+```
+
+运行以上训练命令 `work_dirs/yolov5_ins_s-v61_syncbn_fast_8xb16-300e_balloon_instance` 文件夹会被自动生成,权重文件以及此次的训练配置文件将会保存在此文件夹中。 在 1660 低端显卡上,整个训练过程大概需要 30 分钟。
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/87774050/236995027-00a16a9e-2a2d-44cc-be8a-e2c8a36ff77f.png" alt="image"/>
+</div>
+
+在 `val.json` 上性能如下所示:
+
+```text
+ Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.330
+ Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.509
+ Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.317
+ Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.000
+ Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.103
+ Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.417
+ Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.150
+ Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.396
+ Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.454
+ Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.000
+ Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.317
+ Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.525
+```
+
+上述性能是通过 COCO API 打印,其中 -1 表示不存在对于尺度的物体。
+
+### 一些注意事项
+
+在训练过程中会打印如下关键警告:
+
+- You are using `YOLOv5Head` with num_classes == 1. The loss_cls will be 0. This is a normal phenomenon.
+
+这个警告都不会对性能有任何影响。第一个警告是说明由于当前训练的类别数是 1,根据 YOLOv5 算法的社区, 分类分支的 loss 始终是 0,这是正常现象。
+
+### 中断后恢复训练
+
+如果训练中途停止,可以在训练命令最后加上 `--resume` ,程序会自动从 `work_dirs` 中加载最新的权重文件恢复训练。
+
+```shell
+python tools/train.py configs/yolov5/ins_seg/yolov5_ins_s-v61_syncbn_fast_8xb16-300e_balloon_instance.py --resume
+```
+
+### 节省显存策略
+
+上述配置大概需要 1.0G 显存,如果你的显存不够,可以考虑开启混合精度训练
+
+```shell
+python tools/train.py configs/yolov5/ins_seg/yolov5_ins_s-v61_syncbn_fast_8xb16-300e_balloon_instance.py --amp
+```
+
+### 训练可视化
+
+MMYOLO 目前支持本地、TensorBoard 以及 WandB 等多种后端可视化,默认是采用本地可视化方式,你可以切换为 WandB 等实时可视化训练过程中各类指标。
+
+#### 1 WandB 可视化使用
+
+WandB 官网注册并在 https://wandb.ai/settings 获取到 WandB 的 API Keys。
+
+<div align=center>
+<img src="https://cdn.vansin.top/img/20220913212628.png" alt="image"/>
+</div>
+
+```shell
+pip install wandb
+# 运行了 wandb login 后输入上文中获取到的 API Keys ,便登录成功。
+wandb login
+```
+
+在 `configs/yolov5/ins_seg/yolov5_ins_s-v61_syncbn_fast_8xb16-300e_balloon_instance.py` 配置文件最后添加 WandB 配置
+
+```python
+visualizer = dict(vis_backends = [dict(type='LocalVisBackend'), dict(type='WandbVisBackend')])
+```
+
+重新运行训练命令便可以在命令行中提示的网页链接中看到 loss、学习率和 coco/bbox_mAP 等数据可视化了。
+
+```shell
+python tools/train.py configs/yolov5/ins_seg/yolov5_ins_s-v61_syncbn_fast_8xb16-300e_balloon_instance.py
+```
+
+#### 2 Tensorboard 可视化使用
+
+安装 Tensorboard 环境
+
+```shell
+pip install tensorboard
+```
+
+同上述在配置文件 `configs/yolov5/ins_seg/yolov5_ins_s-v61_syncbn_fast_8xb16-300e_balloon_instance.py`配置的最后添加 `tensorboard` 配置
+
+```python
+visualizer = dict(vis_backends=[dict(type='LocalVisBackend'), dict(type='TensorboardVisBackend')])
+```
+
+重新运行训练命令后,Tensorboard 文件会生成在可视化文件夹 `work_dirs/yolov5_ins_s-v61_syncbn_fast_8xb16-300e_balloon_instance/{timestamp}/vis_data` 下,
+运行下面的命令便可以在网页链接使用 Tensorboard 查看 loss、学习率和 coco/bbox_mAP 等可视化数据了:
+
+```shell
+tensorboard --logdir=work_dirs/yolov5_ins_s-v61_syncbn_fast_8xb16-300e_balloon_instance
+```
+
+## 模型测试
+
+```shell
+python tools/test.py configs/yolov5/ins_seg/yolov5_ins_s-v61_syncbn_fast_8xb16-300e_balloon_instance.py \
+                     work_dirs/yolov5_ins_s-v61_syncbn_fast_8xb16-300e_balloon_instance/best_coco_bbox_mAP_epoch_300.pth \
+                     --show-dir show_results
+```
+
+运行以上测试命令, 你不仅可以得到**模型训练**部分所打印的 AP 性能,还可以将推理结果图片自动保存至 `work_dirs/yolov5_ins_s-v61_syncbn_fast_8xb16-300e_balloon_instance/{timestamp}/show_results` 文件夹中。下面为其中一张结果图片,左图为实际标注,右图为模型推理结果。
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/87774050/236996421-46cfd38c-0827-4251-8216-408dfa9e03dd.jpg" alt="result_img"/>
+</div>
+
+如果你使用了 `WandbVisBackend` 或者 `TensorboardVisBackend`,则还可以在浏览器窗口可视化模型推理结果。
+
+## 特征图相关可视化
+
+MMYOLO 中提供了特征图相关可视化脚本,用于分析当前模型训练效果。 详细使用流程请参考 [特征图可视化](../recommended_topics/visualization.md)
+
+由于 `test_pipeline` 直接可视化会存在偏差,故将需要 `configs/yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py` 中 `test_pipeline`
+
+```python
+test_pipeline = [
+    dict(
+        type='LoadImageFromFile',
+        backend_args=_base_.backend_args),
+    dict(type='YOLOv5KeepRatioResize', scale=img_scale),
+    dict(
+        type='LetterResize',
+        scale=img_scale,
+        allow_scale_up=False,
+        pad_val=dict(img=114)),
+    dict(type='LoadAnnotations', with_bbox=True, _scope_='mmdet'),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                   'scale_factor', 'pad_param'))
+]
+```
+
+修改为如下配置:
+
+```python
+test_pipeline = [
+    dict(
+        type='LoadImageFromFile',
+        backend_args=_base_.backend_args),
+    dict(type='mmdet.Resize', scale=img_scale, keep_ratio=False), # 删除 YOLOv5KeepRatioResize, 将 LetterResize 修改成 mmdet.Resize
+    dict(type='LoadAnnotations', with_bbox=True, _scope_='mmdet'),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                   'scale_factor'))  # 删除 pad_param
+]
+```
+
+我们选择 `data/balloon/train/3927754171_9011487133_b.jpg` 图片作为例子,可视化 YOLOv5 backbone 和 neck 层的输出特征图。
+
+```shell
+python demo/featmap_vis_demo.py data/balloon/train/3927754171_9011487133_b.jpg \
+    configs/yolov5/ins_seg/yolov5_ins_s-v61_syncbn_fast_8xb16-300e_balloon_instance.py \
+    work_dirs/yolov5_ins_s-v61_syncbn_fast_8xb16-300e_balloon_instance/best_coco_bbox_mAP_epoch_300.pth \ --target-layers backbone \
+    --channel-reduction squeeze_mean
+```
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/87774050/236997582-233e292f-5e96-4e44-9e92-9e0787f302fc.jpg" width="800" alt="image"/>
+</div>
+
+结果会保存到当前路径的 output 文件夹下。上图中绘制的 3 个输出特征图对应大中小输出特征图。
+
+**2. 可视化 YOLOv5 neck 输出的 3 个通道**
+
+```shell
+python demo/featmap_vis_demo.py data/balloon/train/3927754171_9011487133_b.jpg \
+    configs/yolov5/ins_seg/yolov5_ins_s-v61_syncbn_fast_8xb16-300e_balloon_instance.py \
+    work_dirs/yolov5_ins_s-v61_syncbn_fast_8xb16-300e_balloon_instance/best_coco_bbox_mAP_epoch_300.pth \ --target-layers neck \
+    --channel-reduction squeeze_mean
+```
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/87774050/236997860-719d2e18-7767-4129-a072-b21c97a5502a.jpg" width="800" alt="image"/>
+</div>
+
+**3. Grad-Based CAM 可视化**
+
+TODO
+
+## EasyDeploy 模型部署
+
+TODO
+
+至此本教程结束。
+
+以上完整内容可以查看 [15_minutes_instance_segmentation.ipynb](../../../demo/15_minutes_instance_segmentation.ipynb)。 如果你在训练或者测试过程中碰到问题,请先查看 [常见错误排除步骤](../recommended_topics/troubleshooting_steps.md), 如果依然无法解决欢迎提 issue。
diff --git a/mmdetection_practice/third_party/mmyolo/docs/zh_cn/get_started/15_minutes_object_detection.md b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/get_started/15_minutes_object_detection.md
new file mode 100644
index 0000000..51022ba
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/get_started/15_minutes_object_detection.md
@@ -0,0 +1,533 @@
+# 15 分钟上手 MMYOLO 目标检测
+
+目标检测任务是指给定一张图片,网络预测出图片中所包括的所有物体类别和对应的边界框
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/17425982/220232979-fffa480b-9ae6-4601-8af6-4116265dc650.png" alt="object detection" width="100%"/>
+</div>
+
+以我们提供的猫 cat 小数据集为例,带大家 15 分钟轻松上手 MMYOLO 目标检测。整个流程包含如下步骤:
+
+- [环境安装](#环境安装)
+- [数据集准备](#数据集准备)
+- [配置准备](#配置准备)
+- [模型训练](#模型训练)
+- [模型测试](#模型测试)
+- [EasyDeploy 模型部署](#easydeploy-模型部署)
+
+本文以 YOLOv5-s 为例,其余 YOLO 系列算法的猫 cat 小数据集 demo 配置请查看对应的算法配置文件夹下。
+
+## 环境安装
+
+假设你已经提前安装好了 Conda,接下来安装 PyTorch
+
+```shell
+conda create -n mmyolo python=3.8 -y
+conda activate mmyolo
+# 如果你有 GPU
+conda install pytorch torchvision -c pytorch
+# 如果你是 CPU
+# conda install pytorch torchvision cpuonly -c pytorch
+```
+
+安装 MMYOLO 和依赖库
+
+```shell
+git clone https://github.com/open-mmlab/mmyolo.git
+cd mmyolo
+pip install -U openmim
+mim install -r requirements/mminstall.txt
+# Install albumentations
+mim install -r requirements/albu.txt
+# Install MMYOLO
+mim install -v -e .
+# "-v" 指详细说明,或更多的输出
+# "-e" 表示在可编辑模式下安装项目,因此对代码所做的任何本地修改都会生效,从而无需重新安装。
+```
+
+```{note}
+温馨提醒:由于本仓库采用的是 OpenMMLab 2.0,请最好新建一个 conda 虚拟环境,防止和 OpenMMLab 1.0 已经安装的仓库冲突。
+```
+
+详细环境配置操作请查看 [安装和验证](./installation.md)
+
+## 数据集准备
+
+Cat 数据集是一个包括 144 张图片的单类别数据集(本 cat 数据集由 @RangeKing 提供原始图片,由 @PeterH0323 进行数据清洗), 包括了训练所需的标注信息。 样例图片如下所示:
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/25873202/205423220-c4b8f2fd-22ba-4937-8e47-1b3f6a8facd8.png" alt="cat dataset"/>
+</div>
+
+你只需执行如下命令即可下载并且直接用起来
+
+```shell
+python tools/misc/download_dataset.py --dataset-name cat --save-dir ./data/cat --unzip --delete
+```
+
+数据集组织格式如下所示:
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/17425982/220072078-48b88a08-6179-483e-b8d3-0549e1b465de.png" alt="image"/>
+</div>
+
+data 位于 mmyolo 工程目录下, `data/cat/annotations` 中存放的是 COCO 格式的标注,`data/cat/images` 中存放的是所有图片
+
+## 配置准备
+
+以 YOLOv5 算法为例,考虑到用户显存和内存有限,我们需要修改一些默认训练参数来让大家愉快的跑起来,核心需要修改的参数如下
+
+- YOLOv5 是 Anchor-Based 类算法,不同的数据集需要自适应计算合适的 Anchor
+- 默认配置是 8 卡,每张卡 batch size 为 16,现将其改成单卡,每张卡 batch size 为 12
+- 默认训练 epoch 是 300,将其改成 40 epoch
+- 由于数据集太小,我们选择固定 backbone 网络权重
+- 原则上 batch size 改变后,学习率也需要进行线性缩放,但是实测发现不需要
+
+具体操作为在 `configs/yolov5` 文件夹下新建 `yolov5_s-v61_fast_1xb12-40e_cat.py` 配置文件(为了方便大家直接使用,我们已经提供了该配置),并把以下内容复制配置文件中。
+
+```python
+# 基于该配置进行继承并重写部分配置
+_base_ = 'yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py'
+
+data_root = './data/cat/' # 数据集根路径
+class_name = ('cat', ) # 数据集类别名称
+num_classes = len(class_name) # 数据集类别数
+# metainfo 必须要传给后面的 dataloader 配置,否则无效
+# palette 是可视化时候对应类别的显示颜色
+# palette 长度必须大于或等于 classes 长度
+metainfo = dict(classes=class_name, palette=[(20, 220, 60)])
+
+# 基于 tools/analysis_tools/optimize_anchors.py 自适应计算的 anchor
+anchors = [
+    [(68, 69), (154, 91), (143, 162)],  # P3/8
+    [(242, 160), (189, 287), (391, 207)],  # P4/16
+    [(353, 337), (539, 341), (443, 432)]  # P5/32
+]
+# 最大训练 40 epoch
+max_epochs = 40
+# bs 为 12
+train_batch_size_per_gpu = 12
+# dataloader 加载进程数
+train_num_workers = 4
+
+# 加载 COCO 预训练权重
+load_from = 'https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth'  # noqa
+
+model = dict(
+    # 固定整个 backbone 权重,不进行训练
+    backbone=dict(frozen_stages=4),
+    bbox_head=dict(
+        head_module=dict(num_classes=num_classes),
+        prior_generator=dict(base_sizes=anchors)
+    ))
+
+train_dataloader = dict(
+    batch_size=train_batch_size_per_gpu,
+    num_workers=train_num_workers,
+    dataset=dict(
+        data_root=data_root,
+        metainfo=metainfo,
+        # 数据集标注文件 json 路径
+        ann_file='annotations/trainval.json',
+        # 数据集前缀
+        data_prefix=dict(img='images/')))
+
+val_dataloader = dict(
+    dataset=dict(
+        metainfo=metainfo,
+        data_root=data_root,
+        ann_file='annotations/test.json',
+        data_prefix=dict(img='images/')))
+
+test_dataloader = val_dataloader
+
+_base_.optim_wrapper.optimizer.batch_size_per_gpu = train_batch_size_per_gpu
+
+val_evaluator = dict(ann_file=data_root + 'annotations/test.json')
+test_evaluator = val_evaluator
+
+default_hooks = dict(
+    # 每隔 10 个 epoch 保存一次权重,并且最多保存 2 个权重
+    # 模型评估时候自动保存最佳模型
+    checkpoint=dict(interval=10, max_keep_ckpts=2, save_best='auto'),
+    # warmup_mim_iter 参数非常关键,因为 cat 数据集非常小,默认的最小 warmup_mim_iter 是 1000,导致训练过程学习率偏小
+    param_scheduler=dict(max_epochs=max_epochs, warmup_mim_iter=10),
+    # 日志打印间隔为 5
+    logger=dict(type='LoggerHook', interval=5))
+# 评估间隔为 10
+train_cfg = dict(max_epochs=max_epochs, val_interval=10)
+```
+
+以上配置从 `yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py` 中继承,并根据 cat 数据的特点更新了 `data_root`、`metainfo`、`train_dataloader`、`val_dataloader`、`num_classes` 等配置。
+
+## 模型训练
+
+```shell
+python tools/train.py configs/yolov5/yolov5_s-v61_fast_1xb12-40e_cat.py
+```
+
+运行以上训练命令 `work_dirs/yolov5_s-v61_fast_1xb12-40e_cat` 文件夹会被自动生成,权重文件以及此次的训练配置文件将会保存在此文件夹中。 在 1660 低端显卡上,整个训练过程大概需要 8 分钟。
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/17425982/220236361-bd113606-248e-4a0e-a484-c0dc9e355b5b.png" alt="image"/>
+</div>
+
+在 `test.json` 上性能如下所示:
+
+```text
+ Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.631
+ Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.909
+ Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.747
+ Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = -1.000
+ Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = -1.000
+ Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.631
+ Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.627
+ Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.703
+ Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.703
+ Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = -1.000
+ Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = -1.000
+ Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.703
+```
+
+上述性能是通过 COCO API 打印,其中 -1 表示不存在对于尺度的物体。根据 COCO 定义的规则,Cat 数据集里面全部是大物体,不存在小和中等规模物体。
+
+### 一些注意事项
+
+在训练过程中会打印如下两个关键警告:
+
+- You are using `YOLOv5Head` with num_classes == 1. The loss_cls will be 0. This is a normal phenomenon.
+- The model and loaded state dict do not match exactly
+
+这两个警告都不会对性能有任何影响。第一个警告是说明由于当前训练的类别数是 1,根据 YOLOv5 算法的社区, 分类分支的 loss 始终是 0,这是正常现象。第二个警告是因为目前是采用微调模式进行训练,我们加载了 COCO 80 个类的预训练权重,
+这会导致最后的 Head 模块卷积通道数不对应,从而导致这部分权重无法加载,这也是正常现象。
+
+### 中断后恢复训练
+
+如果训练中途停止,可以在训练命令最后加上 `--resume` ,程序会自动从 `work_dirs` 中加载最新的权重文件恢复训练。
+
+```shell
+python tools/train.py configs/yolov5/yolov5_s-v61_fast_1xb12-40e_cat.py --resume
+```
+
+### 节省显存策略
+
+上述配置大概需要 3.0G 显存,如果你的显存不够,可以考虑开启混合精度训练
+
+```shell
+python tools/train.py configs/yolov5/yolov5_s-v61_fast_1xb12-40e_cat.py --amp
+```
+
+### 训练可视化
+
+MMYOLO 目前支持本地、TensorBoard 以及 WandB 等多种后端可视化,默认是采用本地可视化方式,你可以切换为 WandB 等实时可视化训练过程中各类指标。
+
+#### 1 WandB 可视化使用
+
+WandB 官网注册并在 https://wandb.ai/settings 获取到 WandB 的 API Keys。
+
+<div align=center>
+<img src="https://cdn.vansin.top/img/20220913212628.png" alt="image"/>
+</div>
+
+```shell
+pip install wandb
+# 运行了 wandb login 后输入上文中获取到的 API Keys ,便登录成功。
+wandb login
+```
+
+在 `configs/yolov5/yolov5_s-v61_fast_1xb12-40e_cat.py` 配置文件最后添加 WandB 配置
+
+```python
+visualizer = dict(vis_backends = [dict(type='LocalVisBackend'), dict(type='WandbVisBackend')])
+```
+
+重新运行训练命令便可以在命令行中提示的网页链接中看到 loss、学习率和 coco/bbox_mAP 等数据可视化了。
+
+```shell
+python tools/train.py configs/yolov5/yolov5_s-v61_fast_1xb12-40e_cat.py
+```
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/17425982/222131114-30a79285-56bc-427d-a38d-8d6a6982ad60.png" alt="image"/>
+</div>
+<div align=center>
+<img src="https://user-images.githubusercontent.com/17425982/222132585-4b4962f1-211b-46f7-86b3-7534fc52a1b4.png" alt="image"/>
+</div>
+
+#### 2 Tensorboard 可视化使用
+
+安装 Tensorboard 依赖
+
+```shell
+pip install tensorboard
+```
+
+同上述在配置文件 `configs/yolov5/yolov5_s-v61_fast_1xb12-40e_cat.py`配置的最后添加 `tensorboard` 配置
+
+```python
+visualizer = dict(vis_backends=[dict(type='LocalVisBackend'), dict(type='TensorboardVisBackend')])
+```
+
+重新运行训练命令后,Tensorboard 文件会生成在可视化文件夹 `work_dirs/yolov5_s-v61_fast_1xb12-40e_cat/{timestamp}/vis_data` 下,
+运行下面的命令便可以在网页链接使用 Tensorboard 查看 loss、学习率和 coco/bbox_mAP 等可视化数据了:
+
+```shell
+tensorboard --logdir=work_dirs/yolov5_s-v61_fast_1xb12-40e_cat
+```
+
+## 模型测试
+
+```shell
+python tools/test.py configs/yolov5/yolov5_s-v61_fast_1xb12-40e_cat.py \
+                     work_dirs/yolov5_s-v61_fast_1xb12-40e_cat/epoch_40.pth \
+                     --show-dir show_results
+```
+
+运行以上测试命令, 你不仅可以得到**模型训练**部分所打印的 AP 性能,还可以将推理结果图片自动保存至 `work_dirs/yolov5_s-v61_fast_1xb12-40e_cat/{timestamp}/show_results` 文件夹中。下面为其中一张结果图片,左图为实际标注,右图为模型推理结果。
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/17425982/220251677-6c7e5c8f-9417-4803-97fc-a968d0172ab7.png" alt="result_img"/>
+</div>
+
+如果你使用了 `WandbVisBackend` 或者 `TensorboardVisBackend`,则还可以在浏览器窗口可视化模型推理结果。
+
+## 特征图相关可视化
+
+MMYOLO 中提供了特征图相关可视化脚本,用于分析当前模型训练效果。 详细使用流程请参考 [特征图可视化](../recommended_topics/visualization.md)
+
+由于 `test_pipeline` 直接可视化会存在偏差,故将需要 `configs/yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py` 中 `test_pipeline`
+
+```python
+test_pipeline = [
+    dict(
+        type='LoadImageFromFile',
+        backend_args=_base_.backend_args),
+    dict(type='YOLOv5KeepRatioResize', scale=img_scale),
+    dict(
+        type='LetterResize',
+        scale=img_scale,
+        allow_scale_up=False,
+        pad_val=dict(img=114)),
+    dict(type='LoadAnnotations', with_bbox=True, _scope_='mmdet'),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                   'scale_factor', 'pad_param'))
+]
+```
+
+修改为如下配置:
+
+```python
+test_pipeline = [
+    dict(
+        type='LoadImageFromFile',
+        backend_args=_base_.backend_args),
+    dict(type='mmdet.Resize', scale=img_scale, keep_ratio=False), # 删除 YOLOv5KeepRatioResize, 将 LetterResize 修改成 mmdet.Resize
+    dict(type='LoadAnnotations', with_bbox=True, _scope_='mmdet'),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                   'scale_factor'))  # 删除 pad_param
+]
+```
+
+我们选择 `data/cat/images/IMG_20221020_112705.jpg` 图片作为例子,可视化 YOLOv5 backbone 和 neck 层的输出特征图。
+
+**1. 可视化 YOLOv5 backbone 输出的 3 个通道**
+
+```shell
+python demo/featmap_vis_demo.py data/cat/images/IMG_20221020_112705.jpg \
+                                configs/yolov5/yolov5_s-v61_fast_1xb12-40e_cat.py \
+                                work_dirs/yolov5_s-v61_fast_1xb12-40e_cat/epoch_40.pth \
+                                --target-layers backbone \
+                                --channel-reduction squeeze_mean
+```
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/17425982/220292217-b343a6f4-0c88-4fdb-9680-35d0ff8e5bdb.png" width="800" alt="image"/>
+</div>
+
+结果会保存到当前路径的 output 文件夹下。上图中绘制的 3 个输出特征图对应大中小输出特征图。由于本次训练的 backbone 实际上没有参与训练,从上图可以看到,大物体 cat 是在小特征图进行预测,这符合目标检测分层检测思想。
+
+**2. 可视化 YOLOv5 neck 输出的 3 个通道**
+
+```shell
+python demo/featmap_vis_demo.py data/cat/images/IMG_20221020_112705.jpg \
+                                configs/yolov5/yolov5_s-v61_fast_1xb12-40e_cat.py \
+                                work_dirs/yolov5_s-v61_fast_1xb12-40e_cat/epoch_40.pth \
+                                --target-layers neck \
+                                --channel-reduction squeeze_mean
+```
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/17425982/220293382-0a241415-e717-4688-a718-5f6d5c844785.png" width="800" alt="image"/>
+</div>
+
+从上图可以看出,由于 neck 是参与训练的,并且由于我们重新设置了 anchor, 强行让 3 个输出特征图都拟合同一个尺度的物体,导致 neck 输出的 3 个图类似,破坏了 backbone 原先的预训练分布。同时也可以看出 40 epoch 训练上述数据集是不够的,特征图效果不佳。
+
+**3. Grad-Based CAM 可视化**
+
+基于上述特征图可视化效果,我们可以分析特征层 bbox 级别的 Grad CAM。
+
+安装 `grad-cam` 依赖:
+
+```shell
+pip install "grad-cam"
+```
+
+(a) 查看 neck 输出的最小输出特征图的 Grad CAM
+
+```shell
+python demo/boxam_vis_demo.py data/cat/images/IMG_20221020_112705.jpg \
+                                configs/yolov5/yolov5_s-v61_fast_1xb12-40e_cat.py \
+                                work_dirs/yolov5_s-v61_fast_1xb12-40e_cat/epoch_40.pth \
+                                --target-layer neck.out_layers[2]
+```
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/17425982/220298462-b0631f27-2366-4864-915a-a4ee21acd4b9.png" width="800" alt="image"/>
+</div>
+
+(b) 查看 neck 输出的中等输出特征图的 Grad CAM
+
+```shell
+python demo/boxam_vis_demo.py data/cat/images/IMG_20221020_112705.jpg \
+                                configs/yolov5/yolov5_s-v61_fast_1xb12-40e_cat.py \
+                                work_dirs/yolov5_s-v61_fast_1xb12-40e_cat/epoch_40.pth \
+                                --target-layer neck.out_layers[1]
+```
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/17425982/220298090-6f335786-0b35-4ab8-9c5a-0dbdb6b6c967.png" width="800" alt="image"/>
+</div>
+
+(c) 查看 neck 输出的最大输出特征图的 Grad CAM
+
+```shell
+python demo/boxam_vis_demo.py data/cat/images/IMG_20221020_112705.jpg \
+                                configs/yolov5/yolov5_s-v61_fast_1xb12-40e_cat.py \
+                                work_dirs/yolov5_s-v61_fast_1xb12-40e_cat/epoch_40.pth \
+                                --target-layer neck.out_layers[0]
+```
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/17425982/220297905-e23369db-d383-48f9-b15e-528a70ec7b23.png" width="800" alt="image"/>
+</div>
+
+## EasyDeploy 模型部署
+
+此处我们将通过 MMYOLO 的 [EasyDeploy](../../../projects/easydeploy/) 来演示模型的转换部署和基本推理。
+
+首先需要在当前 MMYOLO 的虚拟环境中按照 EasyDeploy 的 [基本文档](../../../projects/easydeploy/docs/model_convert.md) 对照自己的设备安装好所需的各个库。
+
+```shell
+pip install onnx onnxruntime
+pip install onnx-simplifier # 如果需要使用 simplify 功能需要安装
+pip install tensorrt        # 如果有 GPU 环境并且需要输出 TensorRT 模型需要继续执行
+```
+
+完成安装后就可以用以下命令对已经训练好的针对 cat 数据集的模型一键转换部署,当前设备的 ONNX 版本为 1.13.0,TensorRT 版本为 8.5.3.1,故可保持 `--opset` 为 11,其余各项参数的具体含义和参数值需要对照使用的 config 文件进行调整。此处我们先导出 CPU 版本的 ONNX 模型,`--backend` 为 ONNXRUNTIME。
+
+```shell
+python projects/easydeploy/tools/export_onnx.py \
+    configs/yolov5/yolov5_s-v61_fast_1xb12-40e_cat.py \
+    work_dirs/yolov5_s-v61_fast_1xb12-40e_cat/epoch_40.pth \
+    --work-dir work_dirs/yolov5_s-v61_fast_1xb12-40e_cat \
+    --img-size 640 640 \
+    --batch 1 \
+    --device cpu \
+    --simplify \
+    --opset 11 \
+    --backend ONNXRUNTIME \
+    --pre-topk 1000 \
+    --keep-topk 100 \
+    --iou-threshold 0.65 \
+    --score-threshold 0.25
+```
+
+成功运行后就可以在 `work-dir` 下得到转换后的 ONNX 模型,默认使用 `end2end.onnx` 命名。
+
+接下来我们使用此 `end2end.onnx` 模型来进行一个基本的图片推理:
+
+```shell
+python projects/easydeploy/tools/image-demo.py \
+    data/cat/images/IMG_20210728_205117.jpg \
+    configs/yolov5/yolov5_s-v61_fast_1xb12-40e_cat.py \
+    work_dirs/yolov5_s-v61_fast_1xb12-40e_cat/end2end.onnx \
+    --device cpu
+```
+
+成功完成推理后会在默认的 MMYOLO 根目录下的 `output` 文件夹生成推理结果图,如果想直观看到结果而不需要保存,可以在上述命令结尾加上 `--show` ,为了方便展示,下图是生成结果的截取部分。
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/7219519/221061210-b91e0b5b-652d-4dfc-8451-86a9a36f7d04.png" width="800" alt="image"/>
+</div>
+
+我们继续转换对应 TensorRT 的 engine 文件,因为 TensorRT 需要对应当前环境以及部署使用的版本进行,所以一定要确认导出参数,这里我们导出对应 TensorRT8 版本的文件,`--backend` 为 2。
+
+```shell
+python projects/easydeploy/tools/export.py \
+    configs/yolov5/yolov5_s-v61_fast_1xb12-40e_cat.py \
+    work_dirs/yolov5_s-v61_fast_1xb12-40e_cat/epoch_40.pth \
+    --work-dir work_dirs/yolov5_s-v61_fast_1xb12-40e_cat \
+    --img-size 640 640 \
+    --batch 1 \
+    --device cuda:0 \
+    --simplify \
+    --opset 11 \
+    --backend 2 \
+    --pre-topk 1000 \
+    --keep-topk 100 \
+    --iou-threshold 0.65 \
+    --score-threshold 0.25
+```
+
+成功执行后得到的 `end2end.onnx` 就是对应 TensorRT8 部署需要的 ONNX 文件,我们使用这个文件完成 TensorRT engine 的转换。
+
+```shell
+python projects/easydeploy/tools/build_engine.py \
+    work_dirs/yolov5_s-v61_fast_1xb12-40e_cat/end2end.onnx \
+    --img-size 640 640 \
+    --device cuda:0
+```
+
+成功执行后会在 `work-dir` 下生成 `end2end.engine` 文件:
+
+```text
+work_dirs/yolov5_s-v61_fast_1xb12-40e_cat
+├── 202302XX_XXXXXX
+│   ├── 202302XX_XXXXXX.log
+│   └── vis_data
+│       ├── 202302XX_XXXXXX.json
+│       ├── config.py
+│       └── scalars.json
+├── best_coco
+│   └── bbox_mAP_epoch_40.pth
+├── end2end.engine
+├── end2end.onnx
+├── epoch_30.pth
+├── epoch_40.pth
+├── last_checkpoint
+└── yolov5_s-v61_fast_1xb12-40e_cat.py
+```
+
+我们继续使用 `image-demo.py` 进行图片推理:
+
+```shell
+python projects/easydeploy/tools/image-demo.py \
+    data/cat/images/IMG_20210728_205312.jpg \
+    configs/yolov5/yolov5_s-v61_fast_1xb12-40e_cat.py \
+    work_dirs/yolov5_s-v61_fast_1xb12-40e_cat/end2end.engine \
+    --device cuda:0
+```
+
+此处依旧选择在 `output` 下保存推理结果而非直接显示结果,同样为了方便展示,下图是生成结果的截取部分。
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/7219519/221061291-e7490bb6-5f0c-45ab-9fc4-caf2b62419d6.png" width="800" alt="image"/>
+</div>
+
+这样我们就完成了将训练完成的模型进行转换部署并且检查推理结果的工作。至此本教程结束。
+
+以上完整内容可以查看 [15_minutes_object_detection.ipynb](../../..//demo/15_minutes_object_detection.ipynb)。 如果你在训练或者测试过程中碰到问题,请先查看 [常见错误排除步骤](../recommended_topics/troubleshooting_steps.md),如果依然无法解决欢迎提 [issue](https://github.com/open-mmlab/mmyolo/issues/new/choose)。
diff --git a/mmdetection_practice/third_party/mmyolo/docs/zh_cn/get_started/15_minutes_rotated_object_detection.md b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/get_started/15_minutes_rotated_object_detection.md
new file mode 100644
index 0000000..ce4455c
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/get_started/15_minutes_rotated_object_detection.md
@@ -0,0 +1,3 @@
+# 15 分钟上手 MMYOLO 旋转框目标检测
+
+TODO
diff --git a/mmdetection_practice/third_party/mmyolo/docs/zh_cn/get_started/article.md b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/get_started/article.md
new file mode 100644
index 0000000..07f75e4
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/get_started/article.md
@@ -0,0 +1,105 @@
+# 中文解读资源汇总
+
+本文汇总了 MMYOLO 或相关的 [OpenMMLab](https://www.zhihu.com/people/openmmlab) 解读的部分文章(更多文章和视频见 [OpenMMLabCourse](https://github.com/open-mmlab/OpenMMLabCourse) ),如果您有推荐的文章(不一定是 OpenMMLab 发布的文章,可以是自己写的文章),非常欢迎提 Pull Request 添加到这里。
+
+## MMYOLO 解读文章和资源
+
+### 脚本命令速查表
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/27466624/213104312-3580c783-2423-442f-b5f6-79204a06adb5.png">
+</div>
+
+你可以点击[链接](https://pan.baidu.com/s/1QEaqT7YayUdEvh1an0gjHg?pwd=yolo),下载高清版 PDF 文件。
+
+### 文章
+
+- [社区协作,简洁易用,快来开箱新一代 YOLO 系列开源库](https://zhuanlan.zhihu.com/p/575615805)
+- [MMYOLO 社区倾情贡献,RTMDet 原理社区开发者解读来啦!](https://zhuanlan.zhihu.com/p/569777684)
+- [MMYOLO 自定义数据集从标注到部署保姆级教程](https://zhuanlan.zhihu.com/p/595497726)
+- [满足一切需求的 MMYOLO 可视化:测试过程可视化](https://zhuanlan.zhihu.com/p/593179372)
+- [MMYOLO 想你所想: 训练过程可视化](https://zhuanlan.zhihu.com/p/608586878)
+- [YOLOv8 深度详解!一文看懂,快速上手](https://zhuanlan.zhihu.com/p/598566644)
+- [玩转 MMYOLO 基础类第一期: 配置文件太复杂?继承用法看不懂?配置全解读来了](https://zhuanlan.zhihu.com/p/577715188)
+- [玩转 MMYOLO 工具类第一期: 特征图可视化](https://zhuanlan.zhihu.com/p/578141381?)
+- [玩转 MMYOLO 实用类第一期:源码阅读和调试「必备」技巧文档](https://zhuanlan.zhihu.com/p/580885852)
+- [玩转 MMYOLO 基础类第二期:工程文件结构简析](https://zhuanlan.zhihu.com/p/584807195)
+- [玩转 MMYOLO 实用类第二期:10分钟换遍主干网络文档](https://zhuanlan.zhihu.com/p/585641598)
+
+### 视频
+
+#### 工具类
+
+|       |         内容         |                                                                                                                                                                                                      视频                                                                                                                                                                                                       |                                                                                                                                      课程中的代码/文档                                                                                                                                      |
+| :---: | :------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: |
+| 第1讲 |     特征图可视化     |  [![Link](https://i2.hdslb.com/bfs/archive/480a0eb41fce26e0acb65f82a74501418eee1032.jpg@112w_63h_1c.webp)](https://www.bilibili.com/video/BV188411s7o8)  [![bilibili](https://img.shields.io/badge/dynamic/json?label=views&style=social&logo=bilibili&query=data.stat.view&url=https%3A%2F%2Fapi.bilibili.com%2Fx%2Fweb-interface%2Fview%3Fbvid%3DBV188411s7o8)](https://www.bilibili.com/video/BV188411s7o8)  | [特征图可视化文档](https://zhuanlan.zhihu.com/p/578141381)<br>[特征图可视化.ipynb](https://github.com/open-mmlab/OpenMMLabCourse/blob/main/codes/MMYOLO_tutorials/%5B%E5%B7%A5%E5%85%B7%E7%B1%BB%E7%AC%AC%E4%B8%80%E6%9C%9F%5D%E7%89%B9%E5%BE%81%E5%9B%BE%E5%8F%AF%E8%A7%86%E5%8C%96.ipynb) |
+| 第2讲 | 基于 sahi 的大图推理 | [![Link](https://i0.hdslb.com/bfs/archive/62c41f508dbcf63a4c721738171612d2d7069ac2.jpg@112w_63h_1c.webp)](https://www.bilibili.com/video/BV1EK411R7Ws/)  [![bilibili](https://img.shields.io/badge/dynamic/json?label=views&style=social&logo=bilibili&query=data.stat.view&url=https%3A%2F%2Fapi.bilibili.com%2Fx%2Fweb-interface%2Fview%3Fbvid%3DBV1EK411R7Ws)](https://www.bilibili.com/video/BV1EK411R7Ws/) |                                                                  [10分钟轻松掌握大图推理.ipynb](https://github.com/open-mmlab/OpenMMLabCourse/blob/main/codes/MMYOLO_tutorials/[工具类第二期]10分钟轻松掌握大图推理.ipynb)                                                                  |
+
+#### 基础类
+
+|       |       内容       |                                                                                                                                                                                                     视频                                                                                                                                                                                                      |                       课程中的代码/文档                        |
+| :---: | :--------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------: |
+| 第1讲 |    配置全解读    | [![Link](https://i1.hdslb.com/bfs/archive/e06daf640ea39b3c0700bb4dc758f1a253f33e13.jpg@112w_63h_1c.webp)](https://www.bilibili.com/video/BV1214y157ck)  [![bilibili](https://img.shields.io/badge/dynamic/json?label=views&style=social&logo=bilibili&query=data.stat.view&url=https%3A%2F%2Fapi.bilibili.com%2Fx%2Fweb-interface%2Fview%3Fbvid%3DBV1214y157ck)](https://www.bilibili.com/video/BV1214y157ck) |    [配置全解读文档](https://zhuanlan.zhihu.com/p/577715188)    |
+| 第2讲 | 工程文件结构简析 |  [![Link](https://i2.hdslb.com/bfs/archive/41030efb84d0cada06d5451c1e6e9bccc0cdb5a3.jpg@112w_63h_1c.webp)](https://www.bilibili.com/video/BV1LP4y117jS)[![bilibili](https://img.shields.io/badge/dynamic/json?label=views&style=social&logo=bilibili&query=data.stat.view&url=https%3A%2F%2Fapi.bilibili.com%2Fx%2Fweb-interface%2Fview%3Fbvid%3DBV1LP4y117jS)](https://www.bilibili.com/video/BV1LP4y117jS)  | [工程文件结构简析文档](https://zhuanlan.zhihu.com/p/584807195) |
+
+#### 实用类
+
+|       |                内容                |                                                                                                                                                                                                     视频                                                                                                                                                                                                      |                                                                                                   课程中的代码/文档                                                                                                   |
+| :---: | :--------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: |
+| 第1讲 |     源码阅读和调试「必备」技巧     | [![Link](https://i2.hdslb.com/bfs/archive/790d2422c879ff20488910da1c4422b667ea6af7.jpg@112w_63h_1c.webp)](https://www.bilibili.com/video/BV1N14y1V7mB)  [![bilibili](https://img.shields.io/badge/dynamic/json?label=views&style=social&logo=bilibili&query=data.stat.view&url=https%3A%2F%2Fapi.bilibili.com%2Fx%2Fweb-interface%2Fview%3Fbvid%3DBV1N14y1V7mB)](https://www.bilibili.com/video/BV1N14y1V7mB) |                                                                       [源码阅读和调试「必备」技巧文档](https://zhuanlan.zhihu.com/p/580885852)                                                                        |
+| 第2讲 |         10分钟换遍主干网络         | [![Link](https://i0.hdslb.com/bfs/archive/c51f1aef7c605856777249a7b4478f44bd69f3bd.jpg@112w_63h_1c.webp)](https://www.bilibili.com/video/BV1JG4y1d7GC)  [![bilibili](https://img.shields.io/badge/dynamic/json?label=views&style=social&logo=bilibili&query=data.stat.view&url=https%3A%2F%2Fapi.bilibili.com%2Fx%2Fweb-interface%2Fview%3Fbvid%3DBV1JG4y1d7GC)](https://www.bilibili.com/video/BV1JG4y1d7GC) | [10分钟换遍主干网络文档](https://zhuanlan.zhihu.com/p/585641598)<br>[10分钟换遍主干网络.ipynb](https://github.com/open-mmlab/OpenMMLabCourse/blob/main/codes/MMYOLO_tutorials/[实用类第二期]10分钟换遍主干网络.ipynb) |
+| 第3讲 | 自定义数据集从标注到部署保姆级教程 | [![Link](https://i2.hdslb.com/bfs/archive/13f566c89a18c9c881713b63ec14da952d4c0b14.jpg@112w_63h_1c.webp)](https://www.bilibili.com/video/BV1RG4y137i5)  [![bilibili](https://img.shields.io/badge/dynamic/json?label=views&style=social&logo=bilibili&query=data.stat.view&url=https%3A%2F%2Fapi.bilibili.com%2Fx%2Fweb-interface%2Fview%3Fbvid%3DBV1RG4y137i5)](https://www.bilibili.com/video/BV1RG4y137i5) |                                                            [自定义数据集从标注到部署保姆级教程](../recommended_topics/labeling_to_deployment_tutorials.md)                                                            |
+| 第4讲 |      顶会第一步 · 模块自定义       | [![Link](http://i2.hdslb.com/bfs/archive/5b23d41ac57466824eaf185ef806ef734414e93b.jpg@112w_63h_1c.webp)](https://www.bilibili.com/video/BV1yd4y1j7VD)  [![bilibili](https://img.shields.io/badge/dynamic/json?label=views&style=social&logo=bilibili&query=data.stat.view&url=https%3A%2F%2Fapi.bilibili.com%2Fx%2Fweb-interface%2Fview%3Fbvid%3DBV1yd4y1j7VD)](https://www.bilibili.com/video/BV1yd4y1j7VD)  |                                [顶会第一步·模块自定义.ipynb](https://github.com/open-mmlab/OpenMMLabCourse/blob/main/codes/MMYOLO_tutorials/[实用类第四期]顶会第一步·模块自定义.ipynb)                                |
+
+#### 源码解读类
+
+#### 演示类
+
+|       |     内容     |                                                                                                                                                                                                      视频                                                                                                                                                                                                       |
+| :---: | :----------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: |
+| 第1期 | 特征图可视化 | [![Link](https://i0.hdslb.com/bfs/archive/081f300c84d6556f40d984cfbe801fc0644ff449.jpg@112w_63h_1c.webp)](https://www.bilibili.com/video/BV1je4y1478R/)  [![bilibili](https://img.shields.io/badge/dynamic/json?label=views&style=social&logo=bilibili&query=data.stat.view&url=https%3A%2F%2Fapi.bilibili.com%2Fx%2Fweb-interface%2Fview%3Fbvid%3DBV1je4y1478R)](https://www.bilibili.com/video/BV1je4y1478R/) |
+
+## MMDetection 解读文章和资源
+
+### 文章
+
+- [MMDetection 3.0:目标检测新基准与前沿](https://zhuanlan.zhihu.com/p/575246786)
+- [目标检测、实例分割、旋转框样样精通!详解高性能检测算法 RTMDet](https://zhuanlan.zhihu.com/p/598846422)
+- [MMDetection 支持数据增强神器 Simple Copy Paste 全过程](https://zhuanlan.zhihu.com/p/559940982)
+
+### 知乎问答和资源
+
+- [深度学习科研,如何高效进行代码和实验管理?](https://www.zhihu.com/question/269707221/answer/2480772257)
+- [深度学习方面的科研工作中的实验代码有什么规范和写作技巧?如何妥善管理实验数据?](https://www.zhihu.com/question/268193800/answer/2586000037)
+- [COCO 数据集上 1x 模式下为什么不采用多尺度训练?](https://www.zhihu.com/question/462170786/answer/1915119662)
+- [MMDetection 中 SOTA 论文源码中将训练过程中 BN 层的 eval 打开?](https://www.zhihu.com/question/471189603/answer/2195540892)
+- [基于 PyTorch 的 MMDetection 中训练的随机性来自何处?](https://www.zhihu.com/question/453511684/answer/1839683634)
+
+## MMEngine 解读文章和资源
+
+- [从 MMCV 到 MMEngine,架构升级,体验升级!](https://zhuanlan.zhihu.com/p/571830155)
+
+## MMCV 解读文章和资源
+
+- [MMCV 全新升级,新增超全数据变换功能,还有两大变化](https://zhuanlan.zhihu.com/p/572550592)
+- [手把手教你如何高效地在 MMCV 中贡献算子](https://zhuanlan.zhihu.com/p/464492627)
+
+## PyTorch 解读文章和资源
+
+- [PyTorch1.11 亮点一览:TorchData、functorch、DDP 静态图](https://zhuanlan.zhihu.com/p/486222256)
+- [PyTorch1.12 亮点一览:DataPipe + TorchArrow 新的数据加载与处理范式](https://zhuanlan.zhihu.com/p/537868554)
+- [PyTorch 源码解读之 nn.Module:核心网络模块接口详解](https://zhuanlan.zhihu.com/p/340453841)
+- [PyTorch 源码解读之 torch.autograd:梯度计算详解](https://zhuanlan.zhihu.com/p/321449610)
+- [PyTorch 源码解读之 torch.utils.data:解析数据处理全流程](https://zhuanlan.zhihu.com/p/337850513)
+- [PyTorch 源码解读之 torch.optim:优化算法接口详解](https://zhuanlan.zhihu.com/p/346205754)
+- [PyTorch 源码解读之 DP & DDP:模型并行和分布式训练解析](https://zhuanlan.zhihu.com/p/343951042)
+- [PyTorch 源码解读之 BN & SyncBN:BN 与 多卡同步 BN 详解](https://zhuanlan.zhihu.com/p/337732517)
+- [PyTorch 源码解读之 torch.cuda.amp: 自动混合精度详解](https://zhuanlan.zhihu.com/p/348554267)
+- [PyTorch 源码解读之 cpp_extension:揭秘 C++/CUDA 算子实现和调用全流程](https://zhuanlan.zhihu.com/p/348555597)
+- [PyTorch 源码解读之即时编译篇](https://zhuanlan.zhihu.com/p/361101354)
+- [PyTorch 源码解读之分布式训练了解一下?](https://zhuanlan.zhihu.com/p/361314953)
+- [PyTorch 源码解读之 torch.serialization & torch.hub](https://zhuanlan.zhihu.com/p/364239544)
+
+## 其他
+
+- [Type Hints 入门教程,让代码更加规范整洁](https://zhuanlan.zhihu.com/p/519335398)
diff --git a/mmdetection_practice/third_party/mmyolo/docs/zh_cn/get_started/dependencies.md b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/get_started/dependencies.md
new file mode 100644
index 0000000..8713c13
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/get_started/dependencies.md
@@ -0,0 +1,60 @@
+# 依赖
+
+下表为 MMYOLO 和 MMEngine, MMCV, MMDetection 依赖库的版本要求,请安装正确的版本以避免安装问题。
+
+| MMYOLO version |   MMDetection version    |     MMEngine version     |      MMCV version       |
+| :------------: | :----------------------: | :----------------------: | :---------------------: |
+|      main      |  mmdet>=3.0.0, \<3.1.0   | mmengine>=0.7.1, \<1.0.0 | mmcv>=2.0.0rc4, \<2.1.0 |
+|     0.6.0      |  mmdet>=3.0.0, \<3.1.0   | mmengine>=0.7.1, \<1.0.0 | mmcv>=2.0.0rc4, \<2.1.0 |
+|     0.5.0      | mmdet>=3.0.0rc6, \<3.1.0 | mmengine>=0.6.0, \<1.0.0 | mmcv>=2.0.0rc4, \<2.1.0 |
+|     0.4.0      | mmdet>=3.0.0rc5, \<3.1.0 | mmengine>=0.3.1, \<1.0.0 | mmcv>=2.0.0rc0, \<2.1.0 |
+|     0.3.0      | mmdet>=3.0.0rc5, \<3.1.0 | mmengine>=0.3.1, \<1.0.0 | mmcv>=2.0.0rc0, \<2.1.0 |
+|     0.2.0      | mmdet>=3.0.0rc3, \<3.1.0 | mmengine>=0.3.1, \<1.0.0 | mmcv>=2.0.0rc0, \<2.1.0 |
+|     0.1.3      | mmdet>=3.0.0rc3, \<3.1.0 | mmengine>=0.3.1, \<1.0.0 | mmcv>=2.0.0rc0, \<2.1.0 |
+|     0.1.2      | mmdet>=3.0.0rc2, \<3.1.0 | mmengine>=0.3.0, \<1.0.0 | mmcv>=2.0.0rc0, \<2.1.0 |
+|     0.1.1      |     mmdet==3.0.0rc1      | mmengine>=0.1.0, \<0.2.0 | mmcv>=2.0.0rc0, \<2.1.0 |
+|     0.1.0      |     mmdet==3.0.0rc0      | mmengine>=0.1.0, \<0.2.0 | mmcv>=2.0.0rc0, \<2.1.0 |
+
+本节中,我们将演示如何用 PyTorch 准备一个环境。
+
+MMYOLO 支持在 Linux,Windows 和 macOS 上运行。它的基本环境依赖为:
+
+- Python 3.7+
+- PyTorch 1.7+
+- CUDA 9.2+
+- GCC 5.4+
+
+```{note}
+如果你对 PyTorch 有经验并且已经安装了它,你可以直接跳转到下一小节。否则,你可以按照下述步骤进行准备
+```
+
+**步骤 0.** 从 [官方网站](https://docs.conda.io/en/latest/miniconda.html) 下载并安装 Miniconda。
+
+**步骤 1.** 创建并激活一个 conda 环境。
+
+```shell
+conda create -n mmyolo python=3.8 -y
+conda activate mmyolo
+```
+
+**步骤 2.** 基于 [PyTorch 官方说明](https://pytorch.org/get-started/locally/) 安装 PyTorch。
+
+在 GPU 平台上:
+
+```shell
+conda install pytorch torchvision -c pytorch
+```
+
+在 CPU 平台上:
+
+```shell
+conda install pytorch torchvision cpuonly -c pytorch
+```
+
+**步骤 3.** 验证 PyTorch 安装
+
+```shell
+python -c "import torch; print(torch.__version__); print(torch.cuda.is_available())"
+```
+
+如果是在 GPU 平台上,那么会打印版本信息和 True 字符,否则打印版本信息和 False 字符。
diff --git a/mmdetection_practice/third_party/mmyolo/docs/zh_cn/get_started/installation.md b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/get_started/installation.md
new file mode 100644
index 0000000..be77bcc
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/get_started/installation.md
@@ -0,0 +1,129 @@
+# 安装和验证
+
+## 最佳实践
+
+**步骤 0.** 使用 [MIM](https://github.com/open-mmlab/mim) 安装 [MMEngine](https://github.com/open-mmlab/mmengine)、 [MMCV](https://github.com/open-mmlab/mmcv) 和 [MMDetection](https://github.com/open-mmlab/mmdetection) 。
+
+```shell
+pip install -U openmim
+mim install "mmengine>=0.6.0"
+mim install "mmcv>=2.0.0rc4,<2.1.0"
+mim install "mmdet>=3.0.0,<4.0.0"
+```
+
+如果你当前已经处于 mmyolo 工程目录下,则可以采用如下简化写法
+
+```shell
+cd mmyolo
+pip install -U openmim
+mim install -r requirements/mminstall.txt
+```
+
+**注意:**
+
+a. 在 MMCV-v2.x 中,`mmcv-full` 改名为 `mmcv`,如果你想安装不包含 CUDA 算子精简版,可以通过 `mim install mmcv-lite>=2.0.0rc1` 来安装。
+
+b. 如果使用 `albumentations`,我们建议使用 `pip install -r requirements/albu.txt` 或者 `pip install -U albumentations --no-binary qudida,albumentations` 进行安装。 如果简单地使用 `pip install albumentations==1.0.1` 进行安装,则会同时安装 `opencv-python-headless`(即便已经安装了 `opencv-python` 也会再次安装)。我们建议在安装 albumentations 后检查环境,以确保没有同时安装 `opencv-python` 和 `opencv-python-headless`,因为同时安装可能会导致一些问题。更多细节请参考 [官方文档](https://albumentations.ai/docs/getting_started/installation/#note-on-opencv-dependencies) 。
+
+**步骤 1.** 安装 MMYOLO
+
+方案 1. 如果你基于 MMYOLO 框架开发自己的任务,建议从源码安装
+
+```shell
+git clone https://github.com/open-mmlab/mmyolo.git
+cd mmyolo
+# Install albumentations
+mim install -r requirements/albu.txt
+# Install MMYOLO
+mim install -v -e .
+# "-v" 指详细说明,或更多的输出
+# "-e" 表示在可编辑模式下安装项目,因此对代码所做的任何本地修改都会生效,从而无需重新安装。
+```
+
+方案 2. 如果你将 MMYOLO 作为依赖或第三方 Python 包,使用 MIM 安装
+
+```shell
+mim install "mmyolo"
+```
+
+## 验证安装
+
+为了验证 MMYOLO 是否安装正确,我们提供了一些示例代码来执行模型推理。
+
+**步骤 1.** 我们需要下载配置文件和模型权重文件。
+
+```shell
+mim download mmyolo --config yolov5_s-v61_syncbn_fast_8xb16-300e_coco --dest .
+```
+
+下载将需要几秒钟或更长时间,这取决于你的网络环境。完成后,你会在当前文件夹中发现两个文件 `yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py` 和 `yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth`。
+
+**步骤 2.** 推理验证
+
+方案 1. 如果你通过源码安装的 MMYOLO,那么直接运行以下命令进行验证:
+
+```shell
+python demo/image_demo.py demo/demo.jpg \
+                          yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py \
+                          yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth
+
+# 可选参数
+# --out-dir ./output *检测结果输出到指定目录下,默认为./output, 当--show参数存在时,不保存检测结果
+# --device cuda:0    *使用的计算资源,包括cuda, cpu等,默认为cuda:0
+# --show             *使用该参数表示在屏幕上显示检测结果,默认为False
+# --score-thr 0.3    *置信度阈值,默认为0.3
+```
+
+运行结束后,在 `output` 文件夹中可以看到检测结果图像,图像中包含有网络预测的检测框。
+
+支持输入类型包括
+
+- 单张图片, 支持 `jpg`, `jpeg`, `png`, `ppm`, `bmp`, `pgm`, `tif`, `tiff`, `webp`。
+- 文件目录,会遍历文件目录下所有图片文件,并输出对应结果。
+- 网址,会自动从对应网址下载图片,并输出结果。
+
+方案 2. 如果你通过 MIM 安装的 MMYOLO, 那么可以打开你的 Python 解析器,复制并粘贴以下代码:
+
+```python
+from mmdet.apis import init_detector, inference_detector
+
+config_file = 'yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py'
+checkpoint_file = 'yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth'
+model = init_detector(config_file, checkpoint_file, device='cpu')  # or device='cuda:0'
+inference_detector(model, 'demo/demo.jpg')
+```
+
+你将会看到一个包含 `DetDataSample` 的列表,预测结果在 `pred_instance` 里,包含有预测框、预测分数 和 预测类别。
+
+## 通过 Docker 使用 MMYOLO
+
+我们提供了一个 [Dockerfile](https://github.com/open-mmlab/mmyolo/blob/main/docker/Dockerfile) 来构建一个镜像。请确保你的 [docker 版本](https://docs.docker.com/engine/install/) >=`19.03`。
+
+温馨提示;国内用户建议取消掉 [Dockerfile](https://github.com/open-mmlab/mmyolo/blob/main/docker/Dockerfile#L19-L20) 里面 `Optional` 后两行的注释,可以获得火箭一般的下载提速:
+
+```dockerfile
+# (Optional)
+RUN sed -i 's/http:\/\/archive.ubuntu.com\/ubuntu\//http:\/\/mirrors.aliyun.com\/ubuntu\//g' /etc/apt/sources.list && \
+    pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
+```
+
+构建命令:
+
+```shell
+# build an image with PyTorch 1.9, CUDA 11.1
+# If you prefer other versions, just modified the Dockerfile
+docker build -t mmyolo docker/
+```
+
+用以下命令运行 Docker 镜像:
+
+```shell
+export DATA_DIR=/path/to/your/dataset
+docker run --gpus all --shm-size=8g -it -v ${DATA_DIR}:/mmyolo/data mmyolo
+```
+
+其余自定义安装流程请查看 [自定义安装](../tutorials/custom_installation.md)
+
+## 排除故障
+
+如果你在安装过程中遇到一些问题,你可以在 GitHub 上 [打开一个问题](https://github.com/open-mmlab/mmyolo/issues/new/choose)。
diff --git a/mmdetection_practice/third_party/mmyolo/docs/zh_cn/get_started/overview.md b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/get_started/overview.md
new file mode 100644
index 0000000..a6adc41
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/get_started/overview.md
@@ -0,0 +1,81 @@
+# 概述
+
+## MMYOLO 介绍
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/45811724/190993591-bd3f1f11-1c30-4b93-b5f4-05c9ff64ff7f.gif" alt="图片"/>
+</div>
+
+MMYOLO 是一个基于 PyTorch 和 MMDetection 的 YOLO 系列算法开源工具箱,它是 [OpenMMLab](https://openmmlab.com/) 项目的一部分。 MMYOLO 定位为 YOLO 系列热门开源库以及工业应用核心库,其愿景图如下所示:
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/17425982/220060451-d50414e5-a239-45b7-a4db-ed8699820300.png" alt="愿景图"/>
+</div>
+
+目前支持的任务如下:
+
+<details open>
+<summary><b>支持的任务</b></summary>
+
+- 目标检测
+- 旋转框目标检测
+
+</details>
+
+目前支持的 YOLO 系列算法如下:
+
+<details open>
+<summary><b>支持的算法</b></summary>
+
+- YOLOv5
+- YOLOX
+- RTMDet
+- RTMDet-Rotated
+- YOLOv6
+- YOLOv7
+- PPYOLOE
+- YOLOv8
+
+</details>
+
+目前支持的数据集如下:
+
+<details open>
+<summary><b>支持的数据集</b></summary>
+
+- COCO Dataset
+- VOC Dataset
+- CrowdHuman Dataset
+- DOTA 1.0 Dataset
+
+</details>
+
+MMYOLO 支持在 Linux、Windows、macOS 上运行, 支持 PyTorch 1.7 及其以上版本运行。它具有如下三个特性:
+
+- 🕹️ **统一便捷的算法评测**
+
+  MMYOLO 统一了各类 YOLO 算法模块的实现,并提供了统一的评测流程,用户可以公平便捷地进行对比分析。
+
+- 📚 **丰富的入门和进阶文档**
+
+  MMYOLO 提供了从入门到部署到进阶和算法解析等一系列文档,方便不同用户快速上手和扩展。
+
+- 🧩 **模块化设计**
+
+  MMYOLO 将框架解耦成不同的模块组件,通过组合不同的模块和训练测试策略,用户可以便捷地构建自定义模型。
+
+<img src="https://user-images.githubusercontent.com/27466624/199999337-0544a4cb-3cbd-4f3e-be26-bcd9e74db7ff.jpg" alt="基类-P5"/>
+  图为 RangeKing@GitHub 提供,非常感谢!
+
+## 本文档使用指南
+
+MMYOLO 中将文档结构分成 6 个部分,对应不同需求的用户。
+
+- **开启 MMYOLO 之旅**。本部分是第一次使用 MMYOLO 用户的必读文档,请全文仔细阅读
+- **推荐专题**。本部分是 MMYOLO 中提供的以主题形式的精华文档,包括了 MMYOLO 中大量的特性等。强烈推荐使用 MMYOLO 的所有用户阅读
+- **常用功能**。本部分提供了训练测试过程中用户经常会用到的各类常用功能,用户可以在用到时候再次查阅
+- **实用工具**。本部分是 tools 下使用工具的汇总文档,便于大家能够快速的愉快使用 MMYOLO 中提供的各类脚本
+- **基础和进阶教程**。本部分涉及到 MMYOLO 中的一些基本概念和进阶教程等,适合想详细了解 MMYOLO 设计思想和结构设计的用户
+- **其他**。其余部分包括模型仓库、说明和接口文档等等
+
+不同需求的用户可以按需选择你心怡的内容阅读。如果你对本文档有异议或者更好的优化办法,欢迎给 MMYOLO 提 PR ~, 请参考 [如何给 MMYOLO 贡献代码](../recommended_topics/contributing.md)
diff --git a/mmdetection_practice/third_party/mmyolo/docs/zh_cn/index.rst b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/index.rst
new file mode 100644
index 0000000..9f150ac
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/index.rst
@@ -0,0 +1,122 @@
+欢迎来到 MMYOLO 中文文档!
+=======================================
+您可以在页面右上角切换中英文文档。
+
+.. toctree::
+   :maxdepth: 2
+   :caption: 开启 MMYOLO 之旅
+
+   get_started/overview.md
+   get_started/dependencies.md
+   get_started/installation.md
+   get_started/15_minutes_object_detection.md
+   get_started/15_minutes_rotated_object_detection.md
+   get_started/15_minutes_instance_segmentation.md
+   get_started/article.md
+
+.. toctree::
+   :maxdepth: 2
+   :caption: 推荐专题
+
+   recommended_topics/contributing.md
+   recommended_topics/training_testing_tricks.md
+   recommended_topics/model_design.md
+   recommended_topics/algorithm_descriptions/index.rst
+   recommended_topics/application_examples/index.rst
+   recommended_topics/replace_backbone.md
+   recommended_topics/complexity_analysis.md
+   recommended_topics/labeling_to_deployment_tutorials.md
+   recommended_topics/visualization.md
+   recommended_topics/deploy/index.rst
+   recommended_topics/troubleshooting_steps.md
+   recommended_topics/mm_basics.md
+   recommended_topics/dataset_preparation.md
+
+.. toctree::
+   :maxdepth: 2
+   :caption: 常用功能
+
+   common_usage/resume_training.md
+   common_usage/syncbn.md
+   common_usage/amp_training.md
+   common_usage/ms_training_testing.md
+   common_usage/tta.md
+   common_usage/plugins.md
+   common_usage/freeze_layers.md
+   common_usage/output_predictions.md
+   common_usage/set_random_seed.md
+   common_usage/module_combination.md
+   common_usage/mim_usage.md
+   common_usage/multi_necks.md
+   common_usage/specify_device.md
+   common_usage/single_multi_channel_applications.md
+   common_usage/registries_info.md
+
+
+.. toctree::
+   :maxdepth: 2
+   :caption: 实用工具
+
+   useful_tools/browse_coco_json.md
+   useful_tools/browse_dataset.md
+   useful_tools/print_config.md
+   useful_tools/dataset_analysis.md
+   useful_tools/optimize_anchors.md
+   useful_tools/extract_subcoco.md
+   useful_tools/vis_scheduler.md
+   useful_tools/dataset_converters.md
+   useful_tools/download_dataset.md
+   useful_tools/log_analysis.md
+   useful_tools/model_converters.md
+
+.. toctree::
+   :maxdepth: 2
+   :caption: 基础教程
+
+   tutorials/config.md
+   tutorials/data_flow.md
+   tutorials/rotated_detection.md
+   tutorials/custom_installation.md
+   tutorials/warning_notes.md
+   tutorials/faq.md
+
+
+.. toctree::
+   :maxdepth: 2
+   :caption: 进阶教程
+
+   advanced_guides/cross-library_application.md
+
+
+.. toctree::
+   :maxdepth: 2
+   :caption: 模型仓库
+
+   model_zoo.md
+
+.. toctree::
+   :maxdepth: 1
+   :caption: 说明
+
+   notes/changelog.md
+   notes/compatibility.md
+   notes/conventions.md
+   notes/code_style.md
+
+.. toctree::
+   :maxdepth: 1
+   :caption: 接口文档(英文)
+
+   api.rst
+
+.. toctree::
+   :caption: 语言切换
+
+   switch_language.md
+
+
+Indices and tables
+==================
+
+* :ref:`genindex`
+* :ref:`search`
diff --git a/mmdetection_practice/third_party/mmyolo/docs/zh_cn/make.bat b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/make.bat
new file mode 100644
index 0000000..922152e
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/make.bat
@@ -0,0 +1,35 @@
+@ECHO OFF
+
+pushd %~dp0
+
+REM Command file for Sphinx documentation
+
+if "%SPHINXBUILD%" == "" (
+	set SPHINXBUILD=sphinx-build
+)
+set SOURCEDIR=.
+set BUILDDIR=_build
+
+if "%1" == "" goto help
+
+%SPHINXBUILD% >NUL 2>NUL
+if errorlevel 9009 (
+	echo.
+	echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
+	echo.installed, then set the SPHINXBUILD environment variable to point
+	echo.to the full path of the 'sphinx-build' executable. Alternatively you
+	echo.may add the Sphinx directory to PATH.
+	echo.
+	echo.If you don't have Sphinx installed, grab it from
+	echo.http://sphinx-doc.org/
+	exit /b 1
+)
+
+%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
+goto end
+
+:help
+%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
+
+:end
+popd
diff --git a/mmdetection_practice/third_party/mmyolo/docs/zh_cn/model_zoo.md b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/model_zoo.md
new file mode 100644
index 0000000..1091f9f
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/model_zoo.md
@@ -0,0 +1,94 @@
+# 模型库和评测
+
+本页面用于汇总 MMYOLO 中支持的各类模型性能和相关评测指标,方便用户对比分析。
+
+## COCO 数据集
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/17425982/222087414-168175cc-dae6-4c5c-a8e3-3109a152dd19.png"/>
+</div>
+
+|      Model       | Arch | Size | Batch Size | Epoch | SyncBN | AMP | Mem (GB) | Params(M) | FLOPs(G) | TRT-FP16-GPU-Latency(ms) | Box AP | TTA Box AP |
+| :--------------: | :--: | :--: | :--------: | :---: | :----: | :-: | :------: | :-------: | :------: | :----------------------: | :----: | :--------: |
+|     YOLOv5-n     |  P5  | 640  |   8xb16    |  300  |  Yes   | Yes |   1.5    |   1.87    |   2.26   |           1.14           |  28.0  |    30.7    |
+|  YOLOv6-v2.0-n   |  P5  | 640  |   8xb32    |  400  |  Yes   | Yes |   6.04   |   4.32    |   5.52   |           1.37           |  36.2  |            |
+|     YOLOv8-n     |  P5  | 640  |   8xb16    |  500  |  Yes   | Yes |   2.5    |   3.16    |   4.4    |           1.53           |  37.4  |    39.9    |
+|   RTMDet-tiny    |  P5  | 640  |   8xb32    |  300  |  Yes   | No  |   11.9   |   4.90    |   8.09   |           2.31           |  41.8  |    43.2    |
+| YOLOv6-v2.0-tiny |  P5  | 640  |   8xb32    |  400  |  Yes   | Yes |   8.13   |   9.70    |  12.37   |           2.19           |  41.0  |            |
+|   YOLOv7-tiny    |  P5  | 640  |   8xb16    |  300  |  Yes   | Yes |   2.7    |   6.23    |   6.89   |           1.88           |  37.5  |            |
+|    YOLOX-tiny    |  P5  | 416  |   8xb32    |  300  |   No   | Yes |   4.9    |   5.06    |   7.63   |           1.19           |  34.3  |            |
+|     RTMDet-s     |  P5  | 640  |   8xb32    |  300  |  Yes   | No  |   16.3   |   8.89    |  14.84   |           2.89           |  45.7  |    47.3    |
+|     YOLOv5-s     |  P5  | 640  |   8xb16    |  300  |  Yes   | Yes |   2.7    |   7.24    |   8.27   |           1.89           |  37.7  |    40.2    |
+|  YOLOv6-v2.0-s   |  P5  | 640  |   8xb32    |  400  |  Yes   | Yes |   8.88   |   17.22   |  21.94   |           2.67           |  44.0  |            |
+|     YOLOv8-s     |  P5  | 640  |   8xb16    |  500  |  Yes   | Yes |   4.0    |   11.17   |  14.36   |           2.61           |  45.1  |    46.8    |
+|     YOLOX-s      |  P5  | 640  |   8xb32    |  300  |   No   | Yes |   9.8    |   8.97    |  13.40   |           2.38           |  41.9  |            |
+|   PPYOLOE+ -s    |  P5  | 640  |    8xb8    |  80   |  Yes   | No  |   4.7    |   7.93    |   8.68   |           2.54           |  43.5  |            |
+|     RTMDet-m     |  P5  | 640  |   8xb32    |  300  |  Yes   | No  |   29.0   |   24.71   |  39.21   |           6.23           |  50.2  |    51.9    |
+|     YOLOv5-m     |  P5  | 640  |   8xb16    |  300  |  Yes   | Yes |   5.0    |   21.19   |  24.53   |           4.28           |  45.3  |    46.9    |
+|  YOLOv6-v2.0-m   |  P5  | 640  |   8xb32    |  300  |  Yes   | Yes |  16.69   |   34.25   |   40.7   |           5.12           |  48.4  |            |
+|     YOLOv8-m     |  P5  | 640  |   8xb16    |  500  |  Yes   | Yes |   7.0    |   25.9    |  39.57   |           5.78           |  50.6  |    52.3    |
+|     YOLOX-m      |  P5  | 640  |   8xb32    |  300  |   No   | Yes |   17.6   |   25.33   |  36.88   |           5.31           |  47.5  |            |
+|   PPYOLOE+ -m    |  P5  | 640  |    8xb8    |  80   |  Yes   | No  |   8.4    |   23.43   |  24.97   |           5.47           |  49.5  |            |
+|     RTMDet-l     |  P5  | 640  |   8xb32    |  300  |  Yes   | No  |   45.2   |   52.32   |  80.12   |          10.13           |  52.3  |    53.7    |
+|     YOLOv5-l     |  P5  | 640  |   8xb16    |  300  |  Yes   | Yes |   8.1    |   46.56   |  54.65   |           6.8            |  48.8  |    49.9    |
+|  YOLOv6-v2.0-l   |  P5  | 640  |   8xb32    |  300  |  Yes   | Yes |  20.86   |   58.53   |  71.43   |           8.78           |  51.0  |            |
+|     YOLOv7-l     |  P5  | 640  |   8xb16    |  300  |  Yes   | Yes |   10.3   |   36.93   |  52.42   |           6.63           |  50.9  |            |
+|     YOLOv8-l     |  P5  | 640  |   8xb16    |  500  |  Yes   | Yes |   9.1    |   43.69   |  82.73   |           8.97           |  53.0  |    54.4    |
+|     YOLOX-l      |  P5  | 640  |    8xb8    |  300  |   No   | Yes |   8.0    |   54.21   |  77.83   |           9.23           |  50.1  |            |
+|   PPYOLOE+ -l    |  P5  | 640  |    8xb8    |  80   |  Yes   | No  |   13.2   |   52.20   |  55.05   |           8.2            |  52.6  |            |
+|     RTMDet-x     |  P5  | 640  |   8xb32    |  300  |  Yes   | No  |   63.4   |   94.86   |  145.41  |          17.89           |  52.8  |    54.2    |
+|     YOLOv7-x     |  P5  | 640  |   8xb16    |  300  |  Yes   | Yes |   13.7   |   71.35   |  95.06   |          11.63           |  52.8  |            |
+|     YOLOv8-x     |  P5  | 640  |   8xb16    |  500  |  Yes   | Yes |   12.4   |   68.23   |  132.10  |          14.22           |  54.0  |    55.0    |
+|     YOLOX-x      |  P5  | 640  |    8xb8    |  300  |   No   | Yes |   9.8    |   99.07   |  144.39  |          15.35           |  51.4  |            |
+|   PPYOLOE+ -x    |  P5  | 640  |    8xb8    |  80   |  Yes   | No  |   19.1   |   98.42   |  105.48  |          14.02           |  54.2  |            |
+|     YOLOv5-n     |  P6  | 1280 |   8xb16    |  300  |  Yes   | Yes |   5.8    |   3.25    |   2.30   |                          |  35.9  |            |
+|     YOLOv5-s     |  P6  | 1280 |   8xb16    |  300  |  Yes   | Yes |   10.5   |   12.63   |   8.45   |                          |  44.4  |            |
+|     YOLOv5-m     |  P6  | 1280 |   8xb16    |  300  |  Yes   | Yes |   19.1   |   35.73   |  25.05   |                          |  51.3  |            |
+|     YOLOv5-l     |  P6  | 1280 |   8xb16    |  300  |  Yes   | Yes |   30.5   |   76.77   |  55.77   |                          |  53.7  |            |
+|     YOLOv7-w     |  P6  | 1280 |   8xb16    |  300  |  Yes   | Yes |   27.0   |   82.31   |  45.07   |                          |  54.1  |            |
+|     YOLOv7-e     |  P6  | 1280 |   8xb16    |  300  |  Yes   | Yes |   42.5   |  114.69   |  64.48   |                          |  55.1  |            |
+
+- 所有模型均使用 COCO train2017 作为训练集,在 COCO val2017 上验证精度
+- TRT-FP16-GPU-Latency(ms) 是指在 NVIDIA Tesla T4 设备上采用 TensorRT 8.4,batch size 为 1, 测试 shape 为 640x640 且仅包括模型 forward 的 GPU Compute time (YOLOX-tiny 测试 shape 是 416x416)
+- 模型参数量和 FLOPs 是采用 [get_flops](https://github.com/open-mmlab/mmyolo/blob/dev/tools/analysis_tools/get_flops.py) 脚本得到,不同的运算方式可能略有不同
+- RTMDet 性能是通过 [MMRazor 知识蒸馏](https://github.com/open-mmlab/mmyolo/blob/dev/configs/rtmdet/distillation/README.md) 训练后的结果
+- MMYOLO 中暂时只实现了 YOLOv6 2.0 版本,并且 L 和 M 为没有经过知识蒸馏的结果
+- YOLOv8 是引入了实例分割标注优化后的结果,YOLOv5、YOLOv6 和 YOLOv7 没有采用实例分割标注优化
+- PPYOLOE+ 使用 Obj365 作为预训练权重,因此 COCO 训练的 epoch 数只需要 80
+- YOLOX-tiny、YOLOX-s 和 YOLOX-m 为采用了 RTMDet 中所提优化器参数训练所得,性能相比原始实现有不同程度提升
+
+详情见如下内容
+
+- [RTMDet](https://github.com/open-mmlab/mmyolo/blob/main/configs/rtmdet)
+- [YOLOv5](https://github.com/open-mmlab/mmyolo/blob/main/configs/yolov5)
+- [YOLOv6](https://github.com/open-mmlab/mmyolo/blob/main/configs/yolov6)
+- [YOLOv7](https://github.com/open-mmlab/mmyolo/blob/main/configs/yolov7)
+- [YOLOv8](https://github.com/open-mmlab/mmyolo/blob/main/configs/yolov8)
+- [YOLOX](https://github.com/open-mmlab/mmyolo/blob/main/configs/yolox)
+- [PPYOLO-E](https://github.com/open-mmlab/mmyolo/blob/main/configs/ppyoloe)
+
+## VOC 数据集
+
+| Backbone | size | Batchsize | AMP | Mem (GB) | box AP(COCO metric) |
+| :------: | :--: | :-------: | :-: | :------: | :-----------------: |
+| YOLOv5-n | 512  |    64     | Yes |   3.5    |        51.2         |
+| YOLOv5-s | 512  |    64     | Yes |   6.5    |        62.7         |
+| YOLOv5-m | 512  |    64     | Yes |   12.0   |        70.1         |
+| YOLOv5-l | 512  |    32     | Yes |   10.0   |        73.1         |
+
+详情见如下内容
+
+- [YOLOv5](https://github.com/open-mmlab/mmyolo/blob/main/configs/yolov5)
+
+## CrowdHuman 数据集
+
+| Backbone | size | SyncBN | AMP | Mem (GB) | ignore_iof_thr | box AP50(CrowDHuman Metric) |  MR  |  JI   |
+| :------: | :--: | :----: | :-: | :------: | :------------: | :-------------------------: | :--: | :---: |
+| YOLOv5-s | 640  |  Yes   | Yes |   2.6    |       -1       |            85.79            | 48.7 | 75.33 |
+| YOLOv5-s | 640  |  Yes   | Yes |   2.6    |      0.5       |            86.17            | 48.8 | 75.87 |
+
+详情见如下内容
+
+- [YOLOv5](https://github.com/open-mmlab/mmyolo/blob/main/configs/yolov5)
+
+## DOTA 1.0 数据集
diff --git a/mmdetection_practice/third_party/mmyolo/docs/zh_cn/notes/changelog.md b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/notes/changelog.md
new file mode 100644
index 0000000..90fef59
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/notes/changelog.md
@@ -0,0 +1,365 @@
+# 更新日志
+
+## v0.6.0 (15/8/2023)
+
+### 亮点
+
+- 支持 YOLOv5 实例分割
+- 基于 MMPose 支持 YOLOX-Pose
+- 添加 15 分钟的实例分割教程
+- YOLOv5 支持使用 mask 标注来优化边界框
+- 添加多尺度训练和测试文档
+
+### 新特性
+
+- 添加训练和测试技巧文档 (#659)
+- 支持设置 `cache_size_limit` 参数,并支持 mmdet 3.0.0 (#707)
+- 支持 YOLOv5u 和 YOLOv6 3.0 推理 (#624, #744)
+- 支持仅模型推断 (#733)
+- 添加 YOLOv8 deepstream 配置 (#633)
+- 在 MMYOLO 应用程序中添加电离图示例 (#643)
+
+### Bug 修复
+
+- 修复 browse_dataset 以可视化测试和验证集的问题 (#641)
+- 修复安装文档错误 (#662)
+- 修复 yolox-l ckpt 链接 (#677)
+- 修正 YOLOv7 和 YOLOv8 图表中的拼写错误 (#621, #710)
+- 调整 `boxam_vis_demo.py` 中包导入的顺序 (#655)
+
+### 完善
+
+- 优化 `convert_kd_ckpt_to_student.py` 文件 (#647)
+- 添加 FAQ 和 training_testing_tricks 的英文文档 (#691, #693)
+
+### 贡献者
+
+总共 21 位开发者参与了本次版本
+
+感谢 @Lum1104,@azure-wings,@FeiGeChuanShu,@Lingrui Gu,@Nioolek,@huayuan4396,@RangeKing,@danielhonies,@yechenzhi,@JosonChan1998,@kitecats,@Qingrenn,@triple-Mu,@kikefdezl,@zhangrui-wolf,@xin-li-67,@Ben-Louis,@zgzhengSEU,@VoyagerXvoyagerx,@tang576225574,@hhaAndroid
+
+## v0.5.0 (2/3/2023)
+
+### 亮点
+
+1. 支持了 [RTMDet-R](https://github.com/open-mmlab/mmyolo/blob/dev/configs/rtmdet/README.md#rotated-object-detection) 旋转框目标检测任务和算法
+2. [YOLOv8](https://github.com/open-mmlab/mmyolo/blob/dev/configs/yolov8/README.md) 支持使用 mask 标注提升目标检测模型性能
+3. 支持 [MMRazor](https://github.com/open-mmlab/mmyolo/blob/dev/configs/razor/subnets/README.md) 搜索的 NAS 子网络作为 YOLO 系列算法的 backbone
+4. 支持调用 [MMRazor](https://github.com/open-mmlab/mmyolo/blob/dev/configs/rtmdet/distillation/README.md) 对 RTMDet 进行知识蒸馏
+5. [MMYOLO](https://mmyolo.readthedocs.io/zh_CN/dev/) 文档结构优化,内容全面升级
+6. 基于 RTMDet 训练超参提升 YOLOX 精度和训练速度
+7. 支持模型参数量、FLOPs 计算和提供 T4 设备上 GPU 延时数据,并更新了 [Model Zoo](https://github.com/open-mmlab/mmyolo/blob/dev/docs/zh_cn/model_zoo.md)
+8. 支持测试时增强 TTA
+9. 支持 RTMDet、YOLOv8 和 YOLOv7 assigner 可视化
+
+### 新特性
+
+01. 支持 RTMDet 实例分割任务的推理 (#583)
+02. 美化 MMYOLO 中配置文件并增加更多注释 (#501, #506, #516, #529, #531, #539)
+03. 重构并优化中英文文档 (#568, #573, #579, #584, #587, #589, #596, #599, #600)
+04. 支持 fast 版本的 YOLOX (#518)
+05. EasyDeploy 中支持 DeepStream,并添加说明文档 (#485, #545, #571)
+06. 新增混淆矩阵绘制脚本 (#572)
+07. 新增单通道应用案例 (#460)
+08. 支持 auto registration (#597)
+09. Box CAM 支持 YOLOv7、YOLOv8 和 PPYOLOE (#601)
+10. 新增自动化生成 MM 系列 repo 注册信息和 tools 脚本 (#559)
+11. 新增 YOLOv7 模型结构图 (#504)
+12. 新增如何指定特定 GPU 训练和推理文档 (#503)
+13. 新增训练或者测试时检查 `metainfo` 是否全为小写 (#535)
+14. 增加 Twitter、Discord、Medium 和 YouTube 等链接 (#555)
+
+### Bug 修复
+
+1. 修复 isort 版本问题 (#492, #497)
+2. 修复 assigner 可视化模块的 type 错误 (#509)
+3. 修复 YOLOv8 文档链接错误 (#517)
+4. 修复 EasyDeploy 中的 RTMDet Decoder 错误 (#519)
+5. 修复一些文档链接错误 (#537)
+6. 修复 RTMDet-Tiny 权重路径错误 (#580)
+
+### 完善
+
+1. 完善更新 `contributing.md`
+2. 优化 `DetDataPreprocessor` 支使其支持多任务 (#511)
+3. 优化 `gt_instances_preprocess` 使其可以用于其他 YOLO 算法 (#532)
+4. 新增 `yolov7-e6e` 权重转换脚本 (#570)
+5. 参考 YOLOv8 推理代码修改 PPYOLOE (#614)
+
+### 贡献者
+
+总共 22 位开发者参与了本次版本
+
+@triple-Mu, @isLinXu, @Audrey528, @TianWen580, @yechenzhi, @RangeKing, @lyviva, @Nioolek, @PeterH0323, @tianleiSHI, @aptsunny, @satuoqaq, @vansin, @xin-li-67, @VoyagerXvoyagerx,
+@landhill, @kitecats, @tang576225574, @HIT-cwh, @AI-Tianlong, @RangiLyu, @hhaAndroid
+
+## v0.4.0 (18/1/2023)
+
+### 亮点
+
+1. 实现了 [YOLOv8](https://github.com/open-mmlab/mmyolo/blob/dev/configs/yolov8/README.md) 目标检测模型,并通过 [projects/easydeploy](https://github.com/open-mmlab/mmyolo/blob/dev/projects/easydeploy) 支持了模型部署
+2. 新增了中英文版本的 [YOLOv8 原理和实现全解析文档](https://github.com/open-mmlab/mmyolo/blob/dev/docs/zh_cn/algorithm_descriptions/yolov8_description.md)
+
+### 新特性
+
+1. 新增 YOLOv8 和 PPYOLOE 模型结构图 (#459, #471)
+2. 调整最低支持 Python 版本从 3.6 升级为 3.7 (#449)
+3. TensorRT-8 中新增新的 YOLOX decoder 写法 (#450)
+4. 新增学习率可视化曲线脚本 (#479)
+5. 新增脚本命令速查表 (#481)
+
+### Bug 修复
+
+1. 修复 `optimize_anchors.py` 脚本导入错误问题 (#452)
+2. 修复 `get_started.md` 中安装步骤错误问题 (#474)
+3. 修复使用 `RTMDet` P6 模型时候 neck 报错问题 (#480)
+
+### 视频
+
+1. 发布了 [玩转 MMYOLO 之实用篇(四):顶会第一步 · 模块自定义](https://www.bilibili.com/video/BV1yd4y1j7VD/)
+
+### 贡献者
+
+总共 9 位开发者参与了本次版本
+
+谢谢 @VoyagerXvoyagerx, @tianleiSHI, @RangeKing, @PeterH0323, @Nioolek, @triple-Mu, @lyviva, @Zheng-LinXiao, @hhaAndroid
+
+## v0.3.0 (8/1/2023)
+
+### 亮点
+
+1. 实现了 [RTMDet](https://github.com/open-mmlab/mmyolo/blob/dev/configs/rtmdet/README.md) 的快速版本。RTMDet-s 8xA100 训练只需要 14 个小时,训练速度相比原先版本提升 2.6 倍。
+2. 支持 [PPYOLOE](https://github.com/open-mmlab/mmyolo/blob/dev/configs/ppyoloe/README.md) 训练。
+3. 支持 [YOLOv5](https://github.com/open-mmlab/mmyolo/blob/dev/configs/yolov5/crowdhuman/yolov5_s-v61_8xb16-300e_ignore_crowdhuman.py) 的 `iscrowd` 属性训练。
+4. 支持 [YOLOv5 正样本分配结果可视化](https://github.com/open-mmlab/mmyolo/blob/dev/projects/assigner_visualization/README.md)
+5. 新增 [YOLOv6 原理和实现全解析文档](https://github.com/open-mmlab/mmyolo/blob/dev/docs/zh_cn/algorithm_descriptions/yolov6_description.md)
+
+### 新特性
+
+01. 新增 `crowdhuman` 数据集 (#368)
+02. EasyDeploy 中支持 TensorRT 推理 (#377)
+03. 新增 `YOLOX` 结构图描述 (#402)
+04. 新增视频推理脚本 (#392)
+05. EasyDeploy 中支持 `YOLOv7` 部署 (#427)
+06. 支持从 CLI 中的特定检查点恢复训练 (#393)
+07. 将元信息字段设置为小写(#362、#412)
+08. 新增模块组合文档 (#349, #352, #345)
+09. 新增关于如何冻结 backbone 或 neck 权重的文档 (#418)
+10. 在 `how_to.md` 中添加不使用预训练权重的文档 (#404)
+11. 新增关于如何设置随机种子的文档 (#386)
+12. 将 `rtmdet_description.md` 文档翻译成英文 (#353)
+
+### Bug 修复
+
+01. 修复设置 `--class-id-txt` 时输出注释文件中的错误 (#430)
+02. 修复 `YOLOv5` head 中的批量推理错误 (#413)
+03. 修复某些 head 的类型提示(#415、#416、#443)
+04. 修复 expected a non-empty list of Tensors 错误 (#376)
+05. 修复 `YOLOv7` 训练中的设备不一致错误(#397)
+06. 修复 `LetterResize` 中的 `scale_factor` 和 `pad_param` 值 (#387)
+07. 修复 readthedocs 的 docstring 图形渲染错误 (#400)
+08. 修复 `YOLOv6` 从训练到验证时的断言错误 (#378)
+09. 修复 `np.int` 和旧版 builder.py 导致的 CI 错误 (#389)
+10. 修复 MMDeploy 重写器 (#366)
+11. 修复 MMYOLO 单元测试错误 (#351)
+12. 修复 `pad_param` 错误 (#354)
+13. 修复 head 推理两次的错误(#342)
+14. 修复自定义数据集训练 (#428)
+
+### 完善
+
+01. 更新 `useful_tools.md` (#384)
+02. 更新英文版 `custom_dataset.md` (#381)
+03. 重写函数删除上下文参数 (#395)
+04. 弃用 `np.bool` 类型别名 (#396)
+05. 为自定义数据集添加新的视频链接 (#365)
+06. 仅为模型导出 onnx (#361)
+07. 添加 MMYOLO 回归测试 yml (#359)
+08. 更新 `article.md` 中的视频教程 (#350)
+09. 添加部署 demo (#343)
+10. 优化 debug 模式下大图的可视化效果(#346)
+11. 改进 `browse_dataset` 的参数并支持 `RepeatDataset` (#340, #338)
+
+### 视频
+
+1. 发布了 [基于 sahi 的大图推理](https://www.bilibili.com/video/BV1EK411R7Ws/)
+2. 发布了 [自定义数据集从标注到部署保姆级教程](https://www.bilibili.com/video/BV1RG4y137i5)
+
+### 贡献者
+
+总共 28 位开发者参与了本次版本
+
+谢谢 @RangeKing, @PeterH0323, @Nioolek, @triple-Mu, @matrixgame2018, @xin-li-67, @tang576225574, @kitecats, @Seperendity, @diplomatist, @vaew, @wzr-skn, @VoyagerXvoyagerx, @MambaWong, @tianleiSHI, @caj-github, @zhubochao, @lvhan028, @dsghaonan, @lyviva, @yuewangg, @wang-tf, @satuoqaq, @grimoire, @RunningLeon, @hanrui1sensetime, @RangiLyu, @hhaAndroid
+
+## v0.2.0(1/12/2022)
+
+### 亮点
+
+1. 支持 [YOLOv7](https://github.com/open-mmlab/mmyolo/tree/dev/configs/yolov7) P5 和 P6 模型
+2. 支持 [YOLOv6](https://github.com/open-mmlab/mmyolo/blob/dev/configs/yolov6/README.md) 中的 ML 大模型
+3. 支持 [Grad-Based CAM 和 Grad-Free CAM](https://github.com/open-mmlab/mmyolo/blob/dev/demo/boxam_vis_demo.py)
+4. 基于 sahi 支持 [大图推理](https://github.com/open-mmlab/mmyolo/blob/dev/demo/large_image_demo.py)
+5. projects 文件夹下新增 [easydeploy](https://github.com/open-mmlab/mmyolo/blob/dev/projects/easydeploy/README.md) 项目
+6. 新增 [自定义数据集教程](https://github.com/open-mmlab/mmyolo/blob/dev/docs/zh_cn/user_guides/custom_dataset.md)
+
+### 新特性
+
+1. `browse_dataset.py` 脚本支持可视化原图、数据增强后和中间结果功能 (#304)
+2. `image_demo.py` 新增预测结果保存为 labelme 格式功能 (#288, #314)
+3. 新增 labelme 格式转 COCO 格式脚本 `labelme2coco` (#308, #313)
+4. 新增 COCO 数据集切分脚本 `coco_split.py` (#311)
+5. `how-to.md` 文档中新增两个 backbone 替换案例以及更新 `plugin.md` (#291)
+6. 新增贡献者文档 `contributing.md` and 代码规范文档 `code_style.md` (#322)
+7. 新增如何通过 mim 跨库调用脚本文档 (#321)
+8. `YOLOv5` 支持 RV1126 设备部署 (#262)
+
+### Bug 修复
+
+1. 修复 `MixUp` padding 错误 (#319)
+2. 修复 `LetterResize` 和 `YOLOv5KeepRatioResize` 中 `scale_factor` 参数顺序错误 (#305)
+3. 修复 `YOLOX Nano` 模型训练错误问题 (#285)
+4. 修复 `RTMDet` 部署没有导包的错误 (#287)
+5. 修复 int8 部署配置错误 (#315)
+6. 修复 `basebackbone` 中 `make_stage_plugins` 注释 (#296)
+7. 部署模块支持切换为 deploy 模式功能 (#324)
+8. 修正 `RTMDet` 模型结构图中的错误 (#317)
+
+### 完善
+
+1. `test.py` 中新增 json 格式导出选项 (#316)
+2. `extract_subcoco.py` 脚本中新增基于面积阈值过滤规则 (#286)
+3. 部署相关中文文档翻译为英文 (#289)
+4. 新增 `YOLOv6` 算法描述大纲文档 (#252)
+5. 完善 `config.md` (#297, #303)
+6. 完善 `mosiac9` 的 docstring (#307)
+7. 完善 `browse_coco_json.py` 脚本输入参数 (#309)
+8. 重构 `dataset_analysis.py` 中部分函数使其更加通用 (#294)
+
+### 视频
+
+1. 发布了 [工程文件结构简析](https://www.bilibili.com/video/BV1LP4y117jS)
+2. 发布了 [10分钟换遍主干网络文档](https://www.bilibili.com/video/BV1JG4y1d7GC)
+
+### 贡献者
+
+总共 14 位开发者参与了本次版本
+
+谢谢 @fcakyon, @matrixgame2018, @MambaWong, @imAzhou, @triple-Mu, @RangeKing, @PeterH0323, @xin-li-67, @kitecats, @hanrui1sensetime, @AllentDan, @Zheng-LinXiao, @hhaAndroid, @wanghonglie
+
+## v0.1.3(10/11/2022)
+
+### 新特性
+
+1. 支持 CBAM 插件并提供插件文档 (#246)
+2. 新增 YOLOv5 P6 模型结构图和相关说明 (#273)
+
+### Bug 修复
+
+1. 基于 mmengine 0.3.1 修复保存最好权重时训练失败问题
+2. 基于 mmdet 3.0.0rc3 修复 `add_dump_metric` 报错 (#253)
+3. 修复 backbone 不支持 `init_cfg` 问题 (#272)
+4. 基于 mmdet 3.0.0rc3 改变 typing 导入方式 (#261)
+
+### 完善
+
+1. `featmap_vis_demo` 支持文件夹和 url 输入 (#248)
+2. 部署 docker 文件完善 (#242)
+
+### 贡献者
+
+总共 10 位开发者参与了本次版本
+
+谢谢 @kitecats, @triple-Mu, @RangeKing, @PeterH0323, @Zheng-LinXiao, @tkhe, @weikai520, @zytx121, @wanghonglie, @hhaAndroid
+
+## v0.1.2(3/11/2022)
+
+### 亮点
+
+1. 支持 ONNXRuntime 和 TensorRT 的 [YOLOv5/YOLOv6/YOLOX/RTMDet 部署](https://github.com/open-mmlab/mmyolo/blob/main/configs/deploy)
+2. 支持 [YOLOv6](https://github.com/open-mmlab/mmyolo/blob/main/configs/yolov6) s/t/n 模型训练
+3. YOLOv5 支持 [P6 大分辨率 1280 尺度训练](https://github.com/open-mmlab/mmyolo/blob/main/configs/yolov5)
+4. YOLOv5 支持 [VOC 数据集训练](https://github.com/open-mmlab/mmyolo/blob/main/configs/yolov5/voc)
+5. 支持 [PPYOLOE](https://github.com/open-mmlab/mmyolo/blob/main/configs/ppyoloe) 和 [YOLOv7](https://github.com/open-mmlab/mmyolo/blob/main/configs/yolov7) 模型推理和官方权重转化
+6. How-to 文档中新增 YOLOv5 替换 [backbone 教程](https://github.com/open-mmlab/mmyolo/blob/dev/docs/zh_cn/advanced_guides/how_to.md#%E8%B7%A8%E5%BA%93%E4%BD%BF%E7%94%A8%E4%B8%BB%E5%B9%B2%E7%BD%91%E7%BB%9C)
+
+### 新特性
+
+1. 新增 `optimize_anchors` 脚本 (#175)
+2. 新增 `extract_subcoco` 脚本 (#186)
+3. 新增 `yolo2coco` 转换脚本 (#161)
+4. 新增 `dataset_analysis` 脚本 (#172)
+5. 移除 Albu 版本限制 (#187)
+
+### Bug 修复
+
+1. 修复当设置 `cfg.resume` 时候不生效问题 (#221)
+2. 修复特征图可视化脚本中不显示 bbox 问题 (#204)
+3. 更新 RTMDet 的 metafile (#188)
+4. 修复 test_pipeline 中的可视化错误 (#166)
+5. 更新 badges (#140)
+
+### 完善
+
+1. 优化 Readthedoc 显示页面 (#209)
+2. 为 base model 添加模块结构图的 docstring (#196)
+3. 支持 LoadAnnotations 中不包括任何实例逻辑 (#161)
+4. 更新 `image_demo` 脚本以支持文件夹和 url 路径 (#128)
+5. 更新 pre-commit hook (#129)
+
+### 文档
+
+1. 将 `yolov5_description.md`、 `yolov5_tutorial.md` 和 `visualization.md` 翻译为英文 (#138, #198, #206)
+2. 新增部署相关中文文档 (#220)
+3. 更新 `config.md`、`faq.md` 和 `pull_request_template.md` (#190, #191, #200)
+4. 更新 `article` 页面 (#133)
+
+### 视频
+
+1. 发布了[特征图可视化视频](https://www.bilibili.com/video/BV188411s7o8)
+2. 发布了 [YOLOv5 配置文件解读视频](https://www.bilibili.com/video/BV1214y157ck)
+3. 发布了 [RTMDet-s 特征图可视化 demo 视频](https://www.bilibili.com/video/BV1je4y1478R)
+4. 发布了[源码解读和必备调试技巧视频](https://www.bilibili.com/video/BV1N14y1V7mB)
+
+### 贡献者
+
+总共 14 位开发者参与了本次版本
+
+谢谢 @imAzhou, @triple-Mu, @RangeKing, @PeterH0323, @xin-li-67, @Nioolek, @kitecats, @Bin-ze, @JiayuXu0, @cydiachen, @zhiqwang, @Zheng-LinXiao, @hhaAndroid, @wanghonglie
+
+## v0.1.1(29/9/2022)
+
+基于 MMDetection 的 RTMDet 高精度低延时目标检测算法,我们也同步发布了 RTMDet,并提供了 RTMDet 原理和实现全解析中文文档
+
+### 亮点
+
+1. 支持了 [RTMDet](https://github.com/open-mmlab/mmyolo/blob/main/configs/rtmdet)
+2. 新增了 [RTMDet 原理和实现全解析中文文档](https://github.com/open-mmlab/mmyolo/blob/main/docs/zh_cn/algorithm_descriptions/rtmdet_description.md)
+3. 支持对 backbone 自定义插件,并更新了 How-to 文档 (#75)
+
+### Bug 修复
+
+1. 修复一些文档错误 (#66, #72, #76, #83, #86)
+2. 修复权重链接错误 (#63)
+3. 修复 `LetterResize` 使用 `imscale` api 时候输出不符合预期的 bug (#105)
+
+### 完善
+
+1. 缩减 docker 镜像尺寸 (#67)
+2. 简化 BaseMixImageTransform 中 Compose 逻辑 (#71)
+3. test 脚本支持 dump 结果 (#84)
+
+#### 贡献者
+
+总共 13 位开发者参与了本次版本
+
+谢谢 @wanghonglie, @hhaAndroid, @yang-0201, @PeterH0323, @RangeKing, @satuoqaq, @Zheng-LinXiao, @xin-li-67, @suibe-qingtian, @MambaWong, @MichaelCai0912, @rimoire, @Nioolek
+
+## v0.1.0(21/9/2022)
+
+我们发布了 MMYOLO 开源库,其基于 MMEngine, MMCV 2.x 和 MMDetection 3.x 库. 目前实现了目标检测功能,后续会扩展为多任务。
+
+### 亮点
+
+1. 支持 YOLOv5/YOLOX 训练,支持 YOLOv6 推理。部署即将支持。
+2. 重构了 MMDetection 的 YOLOX,提供了更快的训练和推理速度。
+3. 提供了详细入门和进阶教程, 包括 YOLOv5 从入门到部署、YOLOv5 算法原理和实现全解析、 特征图可视化等教程。
diff --git a/mmdetection_practice/third_party/mmyolo/docs/zh_cn/notes/code_style.md b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/notes/code_style.md
new file mode 100644
index 0000000..6e169b3
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/notes/code_style.md
@@ -0,0 +1,606 @@
+# 代码规范
+
+## 代码规范标准
+
+### PEP 8 —— Python 官方代码规范
+
+[Python 官方的代码风格指南](https://www.python.org/dev/peps/pep-0008/),包含了以下几个方面的内容:
+
+- 代码布局,介绍了 Python 中空行、断行以及导入相关的代码风格规范。比如一个常见的问题:当我的代码较长,无法在一行写下时,何处可以断行?
+
+- 表达式,介绍了 Python 中表达式空格相关的一些风格规范。
+
+- 尾随逗号相关的规范。当列表较长,无法一行写下而写成如下逐行列表时,推荐在末项后加逗号,从而便于追加选项、版本控制等。
+
+  ```python
+  # Correct:
+  FILES = ['setup.cfg', 'tox.ini']
+  # Correct:
+  FILES = [
+      'setup.cfg',
+      'tox.ini',
+  ]
+  # Wrong:
+  FILES = ['setup.cfg', 'tox.ini',]
+  # Wrong:
+  FILES = [
+      'setup.cfg',
+      'tox.ini'
+  ]
+  ```
+
+- 命名相关规范、注释相关规范、类型注解相关规范,我们将在后续章节中做详细介绍。
+
+  "A style guide is about consistency. Consistency with this style guide is important. Consistency within a project is more important. Consistency within one module or function is the most important." PEP 8 -- Style Guide for Python Code
+
+:::{note}
+PEP 8 的代码规范并不是绝对的,项目内的一致性要优先于 PEP 8 的规范。OpenMMLab 各个项目都在 setup.cfg 设定了一些代码规范的设置,请遵照这些设置。一个例子是在 PEP 8 中有如下一个例子:
+
+```python
+# Correct:
+hypot2 = x*x + y*y
+# Wrong:
+hypot2 = x * x + y * y
+```
+
+这一规范是为了指示不同优先级,但 OpenMMLab 的设置中通常没有启用 yapf 的 `ARITHMETIC_PRECEDENCE_INDICATION` 选项,因而格式规范工具不会按照推荐样式格式化,以设置为准。
+:::
+
+### Google 开源项目风格指南
+
+[Google 使用的编程风格指南](https://google.github.io/styleguide/pyguide.html),包括了 Python 相关的章节。相较于 PEP 8,该指南提供了更为详尽的代码指南。该指南包括了语言规范和风格规范两个部分。
+
+其中,语言规范对 Python 中很多语言特性进行了优缺点的分析,并给出了使用指导意见,如异常、Lambda 表达式、列表推导式、metaclass 等。
+
+风格规范的内容与 PEP 8 较为接近,大部分约定建立在 PEP 8 的基础上,也有一些更为详细的约定,如函数长度、TODO 注释、文件与 socket 对象的访问等。
+
+推荐将该指南作为参考进行开发,但不必严格遵照,一来该指南存在一些 Python 2 兼容需求,例如指南中要求所有无基类的类应当显式地继承 Object, 而在仅使用 Python 3 的环境中,这一要求是不必要的,依本项目中的惯例即可。二来 OpenMMLab 的项目作为框架级的开源软件,不必对一些高级技巧过于避讳,尤其是 MMCV。但尝试使用这些技巧前应当认真考虑是否真的有必要,并寻求其他开发人员的广泛评估。
+
+另外需要注意的一处规范是关于包的导入,在该指南中,要求导入本地包时必须使用路径全称,且导入的每一个模块都应当单独成行,通常这是不必要的,而且也不符合目前项目的开发惯例,此处进行如下约定:
+
+```python
+# Correct
+from mmcv.cnn.bricks import (Conv2d, build_norm_layer, DropPath, MaxPool2d,
+                             Linear)
+from ..utils import ext_loader
+
+# Wrong
+from mmcv.cnn.bricks import Conv2d, build_norm_layer, DropPath, MaxPool2d, \
+                            Linear  # 使用括号进行连接,而不是反斜杠
+from ...utils import is_str  # 最多向上回溯一层,过多的回溯容易导致结构混乱
+```
+
+OpenMMLab 项目使用 pre-commit 工具自动格式化代码,详情见[贡献代码](../recommended_topics/contributing.md#代码风格)。
+
+## 命名规范
+
+### 命名规范的重要性
+
+优秀的命名是良好代码可读的基础。基础的命名规范对各类变量的命名做了要求,使读者可以方便地根据代码名了解变量是一个类 / 局部变量 / 全局变量等。而优秀的命名则需要代码作者对于变量的功能有清晰的认识,以及良好的表达能力,从而使读者根据名称就能了解其含义,甚至帮助了解该段代码的功能。
+
+### 基础命名规范
+
+| 类型            | 公有             | 私有               |
+| --------------- | ---------------- | ------------------ |
+| 模块            | lower_with_under | \_lower_with_under |
+| 包              | lower_with_under |                    |
+| 类              | CapWords         | \_CapWords         |
+| 异常            | CapWordsError    |                    |
+| 函数(方法)    | lower_with_under | \_lower_with_under |
+| 函数 / 方法参数 | lower_with_under |                    |
+| 全局 / 类内常量 | CAPS_WITH_UNDER  | \_CAPS_WITH_UNDER  |
+| 全局 / 类内变量 | lower_with_under | \_lower_with_under |
+| 变量            | lower_with_under | \_lower_with_under |
+| 局部变量        | lower_with_under |                    |
+
+注意:
+
+- 尽量避免变量名与保留字冲突,特殊情况下如不可避免,可使用一个后置下划线,如 class\_
+- 尽量不要使用过于简单的命名,除了约定俗成的循环变量 i,文件变量 f,错误变量 e 等。
+- 不会被用到的变量可以命名为 \_,逻辑检查器会将其忽略。
+
+### 命名技巧
+
+良好的变量命名需要保证三点:
+
+1. 含义准确,没有歧义
+2. 长短适中
+3. 前后统一
+
+```python
+# Wrong
+class Masks(metaclass=ABCMeta):  # 命名无法表现基类;Instance or Semantic?
+    pass
+
+# Correct
+class BaseInstanceMasks(metaclass=ABCMeta):
+    pass
+
+# Wrong,不同地方含义相同的变量尽量用统一的命名
+def __init__(self, inplanes, planes):
+    pass
+
+def __init__(self, in_channels, out_channels):
+    pass
+```
+
+常见的函数命名方法:
+
+- 动宾命名法:crop_img, init_weights
+- 动宾倒置命名法:imread, bbox_flip
+
+注意函数命名与参数的顺序,保证主语在前,符合语言习惯:
+
+- check_keys_exist(key, container)
+- check_keys_contain(container, key)
+
+注意避免非常规或统一约定的缩写,如 nb -> num_blocks,in_nc -> in_channels
+
+## docstring 规范
+
+### 为什么要写 docstring
+
+docstring 是对一个类、一个函数功能与 API 接口的详细描述,有两个功能,一是帮助其他开发者了解代码功能,方便 debug 和复用代码;二是在 Readthedocs 文档中自动生成相关的 API reference 文档,帮助不了解源代码的社区用户使用相关功能。
+
+### 如何写 docstring
+
+与注释不同,一份规范的 docstring 有着严格的格式要求,以便于 Python 解释器以及 sphinx 进行文档解析,详细的 docstring 约定参见 [PEP 257](https://www.python.org/dev/peps/pep-0257/)。此处以例子的形式介绍各种文档的标准格式,参考格式为 [Google 风格](https://zh-google-styleguide.readthedocs.io/en/latest/google-python-styleguide/python_style_rules/#comments)。
+
+1. 模块文档
+
+   代码风格规范推荐为每一个模块(即 Python 文件)编写一个 docstring,但目前 OpenMMLab 项目大部分没有此类 docstring,因此不做硬性要求。
+
+   ```python
+   """A one line summary of the module or program, terminated by a period.
+
+   Leave one blank line. The rest of this docstring should contain an
+   overall description of the module or program. Optionally, it may also
+   contain a brief description of exported classes and functions and/or usage
+   examples.
+
+   Typical usage example:
+
+   foo = ClassFoo()
+   bar = foo.FunctionBar()
+   """
+   ```
+
+2. 类文档
+
+   类文档是我们最常需要编写的,此处,按照 OpenMMLab 的惯例,我们使用了与 Google 风格不同的写法。如下例所示,文档中没有使用 Attributes 描述类属性,而是使用 Args 描述 __init__ 函数的参数。
+
+   在 Args 中,遵照 `parameter (type): Description.` 的格式,描述每一个参数类型和功能。其中,多种类型可使用 `(float or str)` 的写法,可以为 None 的参数可以写为 `(int, optional)`。
+
+   ```python
+   class BaseRunner(metaclass=ABCMeta):
+       """The base class of Runner, a training helper for PyTorch.
+
+       All subclasses should implement the following APIs:
+
+       - ``run()``
+       - ``train()``
+       - ``val()``
+       - ``save_checkpoint()``
+
+       Args:
+           model (:obj:`torch.nn.Module`): The model to be run.
+           batch_processor (callable, optional): A callable method that process
+               a data batch. The interface of this method should be
+               ``batch_processor(model, data, train_mode) -> dict``.
+               Defaults to None.
+           optimizer (dict or :obj:`torch.optim.Optimizer`, optional): It can be
+               either an optimizer (in most cases) or a dict of optimizers
+               (in models that requires more than one optimizer, e.g., GAN).
+               Defaults to None.
+           work_dir (str, optional): The working directory to save checkpoints
+               and logs. Defaults to None.
+           logger (:obj:`logging.Logger`): Logger used during training.
+                Defaults to None. (The default value is just for backward
+                compatibility)
+           meta (dict, optional): A dict records some import information such as
+               environment info and seed, which will be logged in logger hook.
+               Defaults to None.
+           max_epochs (int, optional): Total training epochs. Defaults to None.
+           max_iters (int, optional): Total training iterations. Defaults to None.
+       """
+
+       def __init__(self,
+                    model,
+                    batch_processor=None,
+                    optimizer=None,
+                    work_dir=None,
+                    logger=None,
+                    meta=None,
+                    max_iters=None,
+                    max_epochs=None):
+           ...
+   ```
+
+   另外,在一些算法实现的主体类中,建议加入原论文的链接;如果参考了其他开源代码的实现,则应加入 modified from,而如果是直接复制了其他代码库的实现,则应加入 copied from ,并注意源码的 License。如有必要,也可以通过 .. math:: 来加入数学公式
+
+   ```python
+   # 参考实现
+   # This func is modified from `detectron2
+   # <https://github.com/facebookresearch/detectron2/blob/ffff8acc35ea88ad1cb1806ab0f00b4c1c5dbfd9/detectron2/structures/masks.py#L387>`_.
+
+   # 复制代码
+   # This code was copied from the `ubelt
+   # library<https://github.com/Erotemic/ubelt>`_.
+
+   # 引用论文 & 添加公式
+   class LabelSmoothLoss(nn.Module):
+       r"""Initializer for the label smoothed cross entropy loss.
+
+       Refers to `Rethinking the Inception Architecture for Computer Vision
+       <https://arxiv.org/abs/1512.00567>`_.
+
+       This decreases gap between output scores and encourages generalization.
+       Labels provided to forward can be one-hot like vectors (NxC) or class
+       indices (Nx1).
+       And this accepts linear combination of one-hot like labels from mixup or
+       cutmix except multi-label task.
+
+       Args:
+           label_smooth_val (float): The degree of label smoothing.
+           num_classes (int, optional): Number of classes. Defaults to None.
+           mode (str): Refers to notes, Options are "original", "classy_vision",
+               "multi_label". Defaults to "classy_vision".
+           reduction (str): The method used to reduce the loss.
+               Options are "none", "mean" and "sum". Defaults to 'mean'.
+           loss_weight (float):  Weight of the loss. Defaults to 1.0.
+
+       Note:
+           if the ``mode`` is "original", this will use the same label smooth
+           method as the original paper as:
+
+           .. math::
+               (1-\epsilon)\delta_{k, y} + \frac{\epsilon}{K}
+
+           where :math:`\epsilon` is the ``label_smooth_val``, :math:`K` is
+           the ``num_classes`` and :math:`\delta_{k,y}` is Dirac delta,
+           which equals 1 for k=y and 0 otherwise.
+
+           if the ``mode`` is "classy_vision", this will use the same label
+           smooth method as the `facebookresearch/ClassyVision
+           <https://github.com/facebookresearch/ClassyVision/blob/main/classy_vision/losses/label_smoothing_loss.py>`_ repo as:
+
+           .. math::
+               \frac{\delta_{k, y} + \epsilon/K}{1+\epsilon}
+
+           if the ``mode`` is "multi_label", this will accept labels from
+           multi-label task and smoothing them as:
+
+           .. math::
+               (1-2\epsilon)\delta_{k, y} + \epsilon
+   ```
+
+```{note}
+注意 \`\`here\`\`、\`here\`、"here" 三种引号功能是不同。
+
+在 reStructured 语法中,\`\`here\`\` 表示一段代码;\`here\` 表示斜体;"here" 无特殊含义,一般可用来表示字符串。其中 \`here\` 的用法与 Markdown 中不同,需要多加留意。
+另外还有 :obj:\`type\` 这种更规范的表示类的写法,但鉴于长度,不做特别要求,一般仅用于表示非常用类型。
+```
+
+3. 方法(函数)文档
+
+   函数文档与类文档的结构基本一致,但需要加入返回值文档。对于较为复杂的函数和类,可以使用 Examples 字段加入示例;如果需要对参数加入一些较长的备注,可以加入 Note 字段进行说明。
+
+   对于使用较为复杂的类或函数,比起看大段大段的说明文字和参数文档,添加合适的示例更能帮助用户迅速了解其用法。需要注意的是,这些示例最好是能够直接在 Python 交互式环境中运行的,并给出一些相对应的结果。如果存在多个示例,可以使用注释简单说明每段示例,也能起到分隔作用。
+
+   ```python
+   def import_modules_from_strings(imports, allow_failed_imports=False):
+       """Import modules from the given list of strings.
+
+       Args:
+           imports (list | str | None): The given module names to be imported.
+           allow_failed_imports (bool): If True, the failed imports will return
+               None. Otherwise, an ImportError is raise. Defaults to False.
+
+       Returns:
+           List[module] | module | None: The imported modules.
+           All these three lines in docstring will be compiled into the same
+           line in readthedocs.
+
+       Examples:
+           >>> osp, sys = import_modules_from_strings(
+           ...     ['os.path', 'sys'])
+           >>> import os.path as osp_
+           >>> import sys as sys_
+           >>> assert osp == osp_
+           >>> assert sys == sys_
+       """
+       ...
+   ```
+
+   如果函数接口在某个版本发生了变化,需要在 docstring 中加入相关的说明,必要时添加 Note 或者 Warning 进行说明,例如:
+
+   ```python
+   class CheckpointHook(Hook):
+       """Save checkpoints periodically.
+
+       Args:
+           out_dir (str, optional): The root directory to save checkpoints. If
+               not specified, ``runner.work_dir`` will be used by default. If
+               specified, the ``out_dir`` will be the concatenation of
+               ``out_dir`` and the last level directory of ``runner.work_dir``.
+               Defaults to None. `Changed in version 1.3.15.`
+
+       Warning:
+           Before v1.3.15, the ``out_dir`` argument indicates the path where the
+           checkpoint is stored. However, in v1.3.15 and later, ``out_dir``
+           indicates the root directory and the final path to save checkpoint is
+           the concatenation of out_dir and the last level directory of
+           ``runner.work_dir``. Suppose the value of ``out_dir`` is
+           "/path/of/A" and the value of ``runner.work_dir`` is "/path/of/B",
+           then the final path will be "/path/of/A/B".
+   ```
+
+   如果参数或返回值里带有需要展开描述字段的 dict,则应该采用如下格式:
+
+   ```python
+   def func(x):
+       r"""
+       Args:
+           x (None): A dict with 2 keys, ``padded_targets``, and ``targets``.
+
+               - ``targets`` (list[Tensor]): A list of tensors.
+                 Each tensor has the shape of :math:`(T_i)`. Each
+                 element is the index of a character.
+               - ``padded_targets`` (Tensor): A tensor of shape :math:`(N)`.
+                 Each item is the length of a word.
+
+       Returns:
+           dict: A dict with 2 keys, ``padded_targets``, and ``targets``.
+
+           - ``targets`` (list[Tensor]): A list of tensors.
+             Each tensor has the shape of :math:`(T_i)`. Each
+             element is the index of a character.
+           - ``padded_targets`` (Tensor): A tensor of shape :math:`(N)`.
+             Each item is the length of a word.
+       """
+       return x
+   ```
+
+```{important}
+为了生成 readthedocs 文档,文档的编写需要按照 ReStructrued 文档格式,否则会产生文档渲染错误,在提交 PR 前,最好生成并预览一下文档效果。
+语法规范参考:
+
+- [reStructuredText Primer - Sphinx documentation](https://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html#)
+- [Example Google Style Python Docstrings ‒ napoleon 0.7 documentation](https://sphinxcontrib-napoleon.readthedocs.io/en/latest/example_google.html#example-google)
+```
+
+## 注释规范
+
+### 为什么要写注释
+
+对于一个开源项目,团队合作以及社区之间的合作是必不可少的,因而尤其要重视合理的注释。不写注释的代码,很有可能过几个月自己也难以理解,造成额外的阅读和修改成本。
+
+### 如何写注释
+
+最需要写注释的是代码中那些技巧性的部分。如果你在下次代码审查的时候必须解释一下,那么你应该现在就给它写注释。对于复杂的操作,应该在其操作开始前写上若干行注释。对于不是一目了然的代码,应在其行尾添加注释。
+—— Google 开源项目风格指南
+
+```python
+# We use a weighted dictionary search to find out where i is in
+# the array. We extrapolate position based on the largest num
+# in the array and the array size and then do binary search to
+# get the exact number.
+if i & (i-1) == 0:  # True if i is 0 or a power of 2.
+```
+
+为了提高可读性, 注释应该至少离开代码2个空格.
+另一方面, 绝不要描述代码. 假设阅读代码的人比你更懂Python, 他只是不知道你的代码要做什么.
+—— Google 开源项目风格指南
+
+```python
+# Wrong:
+# Now go through the b array and make sure whenever i occurs
+# the next element is i+1
+
+# Wrong:
+if i & (i-1) == 0:  # True if i bitwise and i-1 is 0.
+```
+
+在注释中,可以使用 Markdown 语法,因为开发人员通常熟悉 Markdown 语法,这样可以便于交流理解,如可使用单反引号表示代码和变量(注意不要和 docstring 中的 ReStructured 语法混淆)
+
+```python
+# `_reversed_padding_repeated_twice` is the padding to be passed to
+# `F.pad` if needed (e.g., for non-zero padding types that are
+# implemented as two ops: padding + conv). `F.pad` accepts paddings in
+# reverse order than the dimension.
+self._reversed_padding_repeated_twice = _reverse_repeat_tuple(self.padding, 2)
+```
+
+### 注释示例
+
+1. 出自 `mmcv/utils/registry.py`,对于较为复杂的逻辑结构,通过注释,明确了优先级关系。
+
+   ```python
+   # self.build_func will be set with the following priority:
+   # 1. build_func
+   # 2. parent.build_func
+   # 3. build_from_cfg
+   if build_func is None:
+       if parent is not None:
+           self.build_func = parent.build_func
+       else:
+           self.build_func = build_from_cfg
+   else:
+       self.build_func = build_func
+   ```
+
+2. 出自 `mmcv/runner/checkpoint.py`,对于 bug 修复中的一些特殊处理,可以附带相关的 issue 链接,帮助其他人了解 bug 背景。
+
+   ```python
+   def _save_ckpt(checkpoint, file):
+       # The 1.6 release of PyTorch switched torch.save to use a new
+       # zipfile-based file format. It will cause RuntimeError when a
+       # checkpoint was saved in high version (PyTorch version>=1.6.0) but
+       # loaded in low version (PyTorch version<1.6.0). More details at
+       # https://github.com/open-mmlab/mmpose/issues/904
+       if digit_version(TORCH_VERSION) >= digit_version('1.6.0'):
+           torch.save(checkpoint, file, _use_new_zipfile_serialization=False)
+       else:
+           torch.save(checkpoint, file)
+   ```
+
+## 类型注解
+
+### 为什么要写类型注解
+
+类型注解是对函数中变量的类型做限定或提示,为代码的安全性提供保障、增强代码的可读性、避免出现类型相关的错误。
+Python 没有对类型做强制限制,类型注解只起到一个提示作用,通常你的 IDE 会解析这些类型注解,然后在你调用相关代码时对类型做提示。另外也有类型注解检查工具,这些工具会根据类型注解,对代码中可能出现的问题进行检查,减少 bug 的出现。
+需要注意的是,通常我们不需要注释模块中的所有函数:
+
+1. 公共的 API 需要注释
+2. 在代码的安全性,清晰性和灵活性上进行权衡是否注释
+3. 对于容易出现类型相关的错误的代码进行注释
+4. 难以理解的代码请进行注释
+5. 若代码中的类型已经稳定,可以进行注释. 对于一份成熟的代码,多数情况下,即使注释了所有的函数,也不会丧失太多的灵活性.
+
+### 如何写类型注解
+
+1. 函数 / 方法类型注解,通常不对 self 和 cls 注释。
+
+   ```python
+   from typing import Optional, List, Tuple
+
+   # 全部位于一行
+   def my_method(self, first_var: int) -> int:
+       pass
+
+   # 另起一行
+   def my_method(
+           self, first_var: int,
+           second_var: float) -> Tuple[MyLongType1, MyLongType1, MyLongType1]:
+       pass
+
+   # 单独成行(具体的应用场合与行宽有关,建议结合 yapf 自动化格式使用)
+   def my_method(
+       self, first_var: int, second_var: float
+   ) -> Tuple[MyLongType1, MyLongType1, MyLongType1]:
+       pass
+
+   # 引用尚未被定义的类型
+   class MyClass:
+       def __init__(self,
+                    stack: List["MyClass"]) -> None:
+           pass
+   ```
+
+   注:类型注解中的类型可以是 Python 内置类型,也可以是自定义类,还可以使用 Python 提供的 wrapper 类对类型注解进行装饰,一些常见的注解如下:
+
+   ```python
+   # 数值类型
+   from numbers import Number
+
+   # 可选类型,指参数可以为 None
+   from typing import Optional
+   def foo(var: Optional[int] = None):
+       pass
+
+   # 联合类型,指同时接受多种类型
+   from typing import Union
+   def foo(var: Union[float, str]):
+       pass
+
+   from typing import Sequence  # 序列类型
+   from typing import Iterable  # 可迭代类型
+   from typing import Any  # 任意类型
+   from typing import Callable  # 可调用类型
+
+   from typing import List, Dict  # 列表和字典的泛型类型
+   from typing import Tuple  # 元组的特殊格式
+   # 虽然在 Python 3.9 中,list, tuple 和 dict 本身已支持泛型,但为了支持之前的版本
+   # 我们在进行类型注解时还是需要使用 List, Tuple, Dict 类型
+   # 另外,在对参数类型进行注解时,尽量使用 Sequence & Iterable & Mapping
+   # List, Tuple, Dict 主要用于返回值类型注解
+   # 参见 https://docs.python.org/3/library/typing.html#typing.List
+   ```
+
+2. 变量类型注解,一般用于难以直接推断其类型时
+
+   ```python
+   # Recommend: 带类型注解的赋值
+   a: Foo = SomeUndecoratedFunction()
+   a: List[int]: [1, 2, 3]         # List 只支持单一类型泛型,可使用 Union
+   b: Tuple[int, int] = (1, 2)     # 长度固定为 2
+   c: Tuple[int, ...] = (1, 2, 3)  # 变长
+   d: Dict[str, int] = {'a': 1, 'b': 2}
+
+   # Not Recommend:行尾类型注释
+   # 虽然这种方式被写在了 Google 开源指南中,但这是一种为了支持 Python 2.7 版本
+   # 而补充的注释方式,鉴于我们只支持 Python 3, 为了风格统一,不推荐使用这种方式。
+   a = SomeUndecoratedFunction()  # type: Foo
+   a = [1, 2, 3]  # type: List[int]
+   b = (1, 2, 3)  # type: Tuple[int, ...]
+   c = (1, "2", 3.5)  # type: Tuple[int, Text, float]
+   ```
+
+3. 泛型
+
+   上文中我们知道,typing 中提供了 list 和 dict 的泛型类型,那么我们自己是否可以定义类似的泛型呢?
+
+   ```python
+   from typing import TypeVar, Generic
+
+   KT = TypeVar('KT')
+   VT = TypeVar('VT')
+
+   class Mapping(Generic[KT, VT]):
+       def __init__(self, data: Dict[KT, VT]):
+           self._data = data
+
+       def __getitem__(self, key: KT) -> VT:
+           return self._data[key]
+   ```
+
+   使用上述方法,我们定义了一个拥有泛型能力的映射类,实际用法如下:
+
+   ```python
+   mapping = Mapping[str, float]({'a': 0.5})
+   value: float = example['a']
+   ```
+
+   另外,我们也可以利用 TypeVar 在函数签名中指定联动的多个类型:
+
+   ```python
+   from typing import TypeVar, List
+
+   T = TypeVar('T')  # Can be anything
+   A = TypeVar('A', str, bytes)  # Must be str or bytes
+
+
+   def repeat(x: T, n: int) -> List[T]:
+       """Return a list containing n references to x."""
+       return [x]*n
+
+
+   def longest(x: A, y: A) -> A:
+       """Return the longest of two strings."""
+       return x if len(x) >= len(y) else y
+   ```
+
+更多关于类型注解的写法请参考 [typing](https://docs.python.org/3/library/typing.html)。
+
+### 类型注解检查工具
+
+[mypy](https://mypy.readthedocs.io/en/stable/) 是一个 Python 静态类型检查工具。根据你的类型注解,mypy 会检查传参、赋值等操作是否符合类型注解,从而避免可能出现的 bug。
+
+例如如下的一个  Python 脚本文件 test.py:
+
+```python
+def foo(var: int) -> float:
+    return float(var)
+
+a: str = foo('2.0')
+b: int = foo('3.0')  # type: ignore
+```
+
+运行 mypy test.py 可以得到如下检查结果,分别指出了第 4 行在函数调用和返回值赋值两处类型错误。而第 5 行同样存在两个类型错误,由于使用了 type: ignore 而被忽略了,只有部分特殊情况可能需要此类忽略。
+
+```
+test.py:4: error: Incompatible types in assignment (expression has type "float", variable has type "int")
+test.py:4: error: Argument 1 to "foo" has incompatible type "str"; expected "int"
+Found 2 errors in 1 file (checked 1 source file)
+```
diff --git a/mmdetection_practice/third_party/mmyolo/docs/zh_cn/notes/compatibility.md b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/notes/compatibility.md
new file mode 100644
index 0000000..a92521e
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/notes/compatibility.md
@@ -0,0 +1,47 @@
+# MMYOLO 兼容性说明
+
+## MMYOLO v0.3.0
+
+### METAINFO 修改
+
+为了和 OpenMMLab 其他仓库统一,将 Dataset 里 `METAINFO` 的所有键从大写改为小写。
+
+| 在 v0.3.0 之前 | v0.3.0 及之后 |
+| :------------: | :-----------: |
+|    CLASSES     |    classes    |
+|    PALETTE     |    palette    |
+|  DATASET_TYPE  | dataset_type  |
+
+### 关于图片 shape 顺序的说明
+
+在 OpenMMLab 2.0 中, 为了与 OpenCV 的输入参数相一致,图片处理 pipeline 中关于图像 shape 的输入参数总是以 `(width, height)` 的顺序排列。
+相反,为了计算方便,经过 pipeline 和 model 的字段的顺序是 `(height, width)`。具体来说在每个数据 pipeline 处理的结果中,字段和它们的值含义如下:
+
+- img_shape: (height, width)
+- ori_shape: (height, width)
+- pad_shape: (height, width)
+- batch_input_shape: (height, width)
+
+以 `Mosaic` 为例,其初始化参数如下所示:
+
+```python
+@TRANSFORMS.register_module()
+class Mosaic(BaseTransform):
+    def __init__(self,
+                img_scale: Tuple[int, int] = (640, 640),
+                center_ratio_range: Tuple[float, float] = (0.5, 1.5),
+                bbox_clip_border: bool = True,
+                pad_val: float = 114.0,
+                prob: float = 1.0) -> None:
+       ...
+
+       # img_scale 顺序应该是 (width, height)
+       self.img_scale = img_scale
+
+    def transform(self, results: dict) -> dict:
+        ...
+
+        results['img'] = mosaic_img
+        # (height, width)
+        results['img_shape'] = mosaic_img.shape[:2]
+```
diff --git a/mmdetection_practice/third_party/mmyolo/docs/zh_cn/notes/conventions.md b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/notes/conventions.md
new file mode 100644
index 0000000..7c2370f
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/notes/conventions.md
@@ -0,0 +1,37 @@
+# 默认约定
+
+如果你想把 MMYOLO 修改为自己的项目,请遵循下面的约定。
+
+## 关于图片 shape 顺序的说明
+
+在OpenMMLab 2.0中, 为了与 OpenCV 的输入参数相一致,图片处理 pipeline 中关于图像 shape 的输入参数总是以 `(width, height)` 的顺序排列。
+相反,为了计算方便,经过 pipeline 和 model 的字段的顺序是 `(height, width)`。具体来说在每个数据 pipeline 处理的结果中,字段和它们的值含义如下:
+
+- img_shape: (height, width)
+- ori_shape: (height, width)
+- pad_shape: (height, width)
+- batch_input_shape: (height, width)
+
+以 `Mosaic` 为例,其初始化参数如下所示:
+
+```python
+@TRANSFORMS.register_module()
+class Mosaic(BaseTransform):
+    def __init__(self,
+                img_scale: Tuple[int, int] = (640, 640),
+                center_ratio_range: Tuple[float, float] = (0.5, 1.5),
+                bbox_clip_border: bool = True,
+                pad_val: float = 114.0,
+                prob: float = 1.0) -> None:
+       ...
+
+       # img_scale 顺序应该是 (width, height)
+       self.img_scale = img_scale
+
+    def transform(self, results: dict) -> dict:
+        ...
+
+        results['img'] = mosaic_img
+        # (height, width)
+        results['img_shape'] = mosaic_img.shape[:2]
+```
diff --git a/mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/algorithm_descriptions/index.rst b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/algorithm_descriptions/index.rst
new file mode 100644
index 0000000..54bc8b8
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/algorithm_descriptions/index.rst
@@ -0,0 +1,10 @@
+算法原理和实现全解析
+********************
+
+.. toctree::
+   :maxdepth: 1
+
+   yolov5_description.md
+   yolov6_description.md
+   rtmdet_description.md
+   yolov8_description.md
diff --git a/mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/algorithm_descriptions/rtmdet_description.md b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/algorithm_descriptions/rtmdet_description.md
new file mode 100644
index 0000000..a13c7f5
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/algorithm_descriptions/rtmdet_description.md
@@ -0,0 +1,645 @@
+# RTMDet 原理和实现全解析
+
+## 0 简介
+
+高性能,低延时的单阶段目标检测器
+
+<div align=center>
+<img alt="RTMDet_structure_v1.3" src="https://user-images.githubusercontent.com/27466624/204126145-cb4ff4f1-fb16-455e-96b5-17620081023a.jpg"/>
+</div>
+
+以上结构图由 RangeKing@github 绘制。
+
+最近一段时间,开源界涌现出了大量的高精度目标检测项目,其中最突出的就是 YOLO 系列,OpenMMLab 也在与社区的合作下推出了 MMYOLO。
+在调研了当前 YOLO 系列的诸多改进模型后,MMDetection 核心开发者针对这些设计以及训练方式进行了经验性的总结,并进行了优化,推出了高精度、低延时的单阶段目标检测器 RTMDet, **R**eal-**t**ime **M**odels for Object **Det**ection
+(**R**elease **t**o **M**anufacture)
+
+RTMDet 由 tiny/s/m/l/x 一系列不同大小的模型组成,为不同的应用场景提供了不同的选择。
+其中,RTMDet-x 在 52.6 mAP 的精度下达到了 300+ FPS 的推理速度。
+
+```{note}
+注:推理速度和精度测试(不包含 NMS)是在 1 块 NVIDIA 3090 GPU 上的 `TensorRT 8.4.3, cuDNN 8.2.0, FP16, batch size=1` 条件里测试的。
+```
+
+而最轻量的模型 RTMDet-tiny,在仅有 4M 参数量的情况下也能够达到 40.9 mAP,且推理速度 \< 1 ms。
+
+<div align=center>
+<img alt="RTMDet_精度图" src="https://user-images.githubusercontent.com/12907710/192182907-f9a671d6-89cb-4d73-abd8-c2b9dada3c66.png"/>
+</div>
+
+上图中的精度是和 300 epoch 训练下的公平对比,为不使用蒸馏的结果。
+
+|                            | mAP             | Params         | Flops        | Inference speed |
+| -------------------------- | --------------- | -------------- | ------------ | --------------- |
+| Baseline(YOLOX)            | 40.2            | 9M             | 13.4G        | 1.2ms           |
+| + AdamW + Flat Cosine      | 40.6 (+0.4)     | 9M             | 13.4G        | 1.2ms           |
+| + CSPNeXt backbone & PAFPN | 41.8 (+1.2)     | 10.07M (+1.07) | 14.8G (+1.4) | 1.22ms (+0.02)  |
+| + SepBNHead                | 41.8 (+0)       | 8.89M (-1.18)  | 14.8G        | 1.22ms          |
+| + Label Assign & Loss      | 42.9 (+1.1)     | 8.89M          | 14.8G        | 1.22ms          |
+| + Cached Mosaic & MixUp    | 44.2 (+1.3)     | 8.89M          | 14.8G        | 1.22ms          |
+| + RSB-pretrained backbone  | **44.5 (+0.3)** | 8.89M          | 14.8G        | 1.22ms          |
+
+- 官方开源地址: https://github.com/open-mmlab/mmdetection/blob/3.x/configs/rtmdet/README.md
+- MMYOLO 开源地址: https://github.com/open-mmlab/mmyolo/blob/main/configs/rtmdet/README.md
+
+## 1 v1.0 算法原理和 MMYOLO 实现解析
+
+### 1.1 数据增强模块
+
+RTMDet 采用了多种数据增强的方式来增加模型的性能,主要包括单图数据增强:
+
+- **RandomResize 随机尺度变换**
+- **RandomCrop 随机裁剪**
+- **HSVRandomAug 颜色空间增强**
+- **RandomFlip 随机水平翻转**
+
+以及混合类数据增强:
+
+- **Mosaic 马赛克**
+- **MixUp 图像混合**
+
+数据增强流程如下:
+
+<div align=center>
+<img alt="image" src="https://user-images.githubusercontent.com/33799979/192956011-78f89d89-ac9f-4a40-b4f1-056b49b704ef.png" width=800 />
+</div>
+
+其中 RandomResize 超参在大模型 M,L,X 和小模型 S, Tiny 上是不一样的,大模型由于参数较多,可以使用 large scale jitter 策略即参数为 (0.1,2.0),而小模型采用 stand scale jitter 策略即 (0.5, 2.0) 策略。
+MMDetection 开源库中已经对单图数据增强进行了封装,用户通过简单的修改配置即可使用库中提供的任何数据增强功能,且都是属于比较常规的数据增强,不需要特殊介绍。下面将具体介绍混合类数据增强的具体实现。
+
+与 YOLOv5 不同的是,YOLOv5 认为在 S 和 Nano 模型上使用 MixUp 是过剩的,小模型不需要这么强的数据增强。而 RTMDet 在 S 和 Tiny 上也使用了 MixUp,这是因为 RTMDet 在最后 20 epoch 会切换为正常的 aug, 并通过训练证明这个操作是有效的。 并且 RTMDet 为混合类数据增强引入了 Cache 方案,有效地减少了图像处理的时间, 和引入了可调超参 `max_cached_images` ,当使用较小的 cache 时,其效果类似 `repeated augmentation`。具体介绍如下:
+
+|        | Use cache | ms / 100 imgs |
+| ------ | --------- | ------------- |
+| Mosaic |           | 87.1          |
+| Mosaic | √         | **24.0**      |
+| MixUp  |           | 19.3          |
+| MixUp  | √         | **12.4**      |
+
+|                               | RTMDet-s | RTMDet-l |
+| ----------------------------- | -------- | -------- |
+| Mosaic + MixUp + 20e finetune | 43.9     | **51.3** |
+
+#### 1.1.1 为图像混合数据增强引入 Cache
+
+Mosaic&MixUp 涉及到多张图片的混合,它们的耗时会是普通数据增强的 K 倍(K 为混入图片的数量)。 如在 YOLOv5 中,每次做 Mosaic 时, 4 张图片的信息都需要从硬盘中重新加载。 而 RTMDet 只需要重新载入当前的一张图片,其余参与混合增强的图片则从缓存队列中获取,通过牺牲一定内存空间的方式大幅提升了效率。 另外通过调整 cache 的大小以及 pop 的方式,也可以调整增强的强度。
+
+<div align=center>
+<img alt="data cache" src="https://user-images.githubusercontent.com/33799979/192730011-90e2a28d-e163-4399-bf87-d3012007d8c3.png" width=800 />
+</div>
+
+如图所示,cache 队列中预先储存了 N 张已加载的图像与标签数据,每一个训练 step 中只需加载一张新的图片及其标签数据并更新到 cache 队列中(cache 队列中的图像可重复,如图中出现两次 img3),同时如果 cache 队列长度超过预设长度,则随机 pop 一张图(为了 Tiny 模型训练更稳定,在 Tiny 模型中不采用随机 pop 的方式, 而是移除最先加入的图片),当需要进行混合数据增强时,只需要从 cache 中随机选择需要的图像进行拼接等处理,而不需要全部从硬盘中加载,节省了图像加载的时间。
+
+```{note}
+cache 队列的最大长度 N 为可调整参数,根据经验性的原则,当为每一张需要混合的图片提供十个缓存时,可以认为提供了足够的随机性,而 Mosaic 增强是四张图混合,因此 cache 数量默认 N=40, 同理 MixUp 的 cache 数量默认为20, tiny 模型需要更稳定的训练条件,因此其 cache 数量也为其余规格模型的一半( MixUp 为10,Mosaic 为20)
+```
+
+在具体实现中,MMYOLO 设计了 `BaseMiximageTransform` 类来支持多张图像混合数据增强:
+
+```python
+if self.use_cached:
+    # Be careful: deep copying can be very time-consuming
+    # if results includes dataset.
+    dataset = results.pop('dataset', None)
+    self.results_cache.append(copy.deepcopy(results))  # 将当前加载的图片数据缓存到 cache 中
+    if len(self.results_cache) > self.max_cached_images:
+        if self.random_pop: # 除了tiny模型,self.random_pop=True
+            index = random.randint(0, len(self.results_cache) - 1)
+        else:
+            index = 0
+        self.results_cache.pop(index)
+
+    if len(self.results_cache) <= 4:
+        return results
+else:
+    assert 'dataset' in results
+    # Be careful: deep copying can be very time-consuming
+    # if results includes dataset.
+    dataset = results.pop('dataset', None)
+```
+
+#### 1.1.2 Mosaic
+
+Mosaic 是将 4 张图拼接为 1 张大图,相当于变相的增加了 batch size,具体步骤为:
+
+1. 根据索引随机从自定义数据集中再采样3个图像,可能重复
+
+```python
+def get_indexes(self, dataset: Union[BaseDataset, list]) -> list:
+    """Call function to collect indexes.
+
+    Args:
+        dataset (:obj:`Dataset` or list): The dataset or cached list.
+
+    Returns:
+        list: indexes.
+    """
+    indexes = [random.randint(0, len(dataset)) for _ in range(3)]
+    return indexes
+```
+
+2. 随机选出 4 幅图像相交的中点。
+
+```python
+# mosaic center x, y
+center_x = int(
+    random.uniform(*self.center_ratio_range) * self.img_scale[1])
+center_y = int(
+    random.uniform(*self.center_ratio_range) * self.img_scale[0])
+center_position = (center_x, center_y)
+```
+
+3. 根据采样的 index 读取图片并拼接, 拼接前会先进行 `keep-ratio` 的 resize 图片(即为最大边一定是 640)。
+
+```python
+# keep_ratio resize
+scale_ratio_i = min(self.img_scale[0] / h_i,
+                    self.img_scale[1] / w_i)
+img_i = mmcv.imresize(
+    img_i, (int(w_i * scale_ratio_i), int(h_i * scale_ratio_i)))
+```
+
+4. 拼接后,把 bbox 和 label 全部拼接起来,然后对 bbox 进行裁剪但是不过滤(可能出现一些无效框)
+
+```python
+mosaic_bboxes.clip_([2 * self.img_scale[0], 2 * self.img_scale[1]])
+```
+
+更多的关于 Mosaic 原理的详情可以参考 [YOLOv5 原理和实现全解析](./yolov5_description.md) 中的 Mosaic 原理分析。
+
+#### 1.1.3 MixUp
+
+RTMDet 的 MixUp 实现方式与 YOLOX 中一样,只不过增加了类似上文中提到的 cache 功能。
+
+更多的关于 MixUp 原理的详情也可以参考 [YOLOv5 原理和实现全解析](./yolov5_description.md) 中的 MixUp 原理分析。
+
+#### 1.1.4 强弱两阶段训练
+
+Mosaic+MixUp 失真度比较高,持续用太强的数据增强对模型并不一定有益。YOLOX 中率先使用了强弱两阶段的训练方式,但由于引入了旋转,错切导致 box 标注产生误差,需要在第二阶段引入额外的 L1 loss 来纠正回归分支的性能。
+
+为了使数据增强的方式更为通用,RTMDet 在前 280 epoch 使用不带旋转的 Mosaic+MixUp, 且通过混入 8 张图片来提升强度以及正样本数。后 20 epoch 使用比较小的学习率在比较弱的增强下进行微调,同时在 EMA 的作用下将参数缓慢更新至模型,能够得到比较大的提升。
+
+|                               | RTMDet-s | RTMDet-l |
+| ----------------------------- | -------- | -------- |
+| LSJ + rand crop               | 42.3     | 46.7     |
+| Mosaic+MixUp                  | 41.9     | 49.8     |
+| Mosaic + MixUp + 20e finetune | 43.9     | **51.3** |
+
+### 1.2 模型结构
+
+RTMDet 模型整体结构和 [YOLOX](https://arxiv.org/abs/2107.08430) 几乎一致,由 `CSPNeXt` + `CSPNeXtPAFPN` + `共享卷积权重但分别计算 BN 的 SepBNHead` 构成。内部核心模块也是 `CSPLayer`,但对其中的  `Basic Block` 进行了改进,提出了 `CSPNeXt Block`。
+
+#### 1.2.1 Backbone
+
+`CSPNeXt` 整体以 `CSPDarknet` 为基础,共 5 层结构,包含 1 个 `Stem Layer` 和 4 个 `Stage Layer`:
+
+- `Stem Layer` 是 3 层 3x3 kernel 的 `ConvModule` ,不同于之前的 `Focus` 模块或者 1 层 6x6 kernel 的 `ConvModule` 。
+
+- `Stage Layer` 总体结构与已有模型类似,前 3 个 `Stage Layer` 由 1 个 `ConvModule` 和 1 个 `CSPLayer`  组成。第 4 个 `Stage Layer` 在 `ConvModule`  和  `CSPLayer` 中间增加了 `SPPF` 模块(MMDetection 版本为 `SPP` 模块)。
+
+- 如模型图 Details 部分所示,`CSPLayer` 由 3 个 `ConvModule` + n 个 `CSPNeXt Block`(带残差连接) + 1 个  `Channel Attention` 模块组成。`ConvModule` 为 1 层 3x3 `Conv2d` + `BatchNorm` + `SiLU` 激活函数。`Channel Attention` 模块为 1 层 `AdaptiveAvgPool2d` + 1 层 1x1 `Conv2d` + `Hardsigmoid` 激活函数。`CSPNeXt Block` 模块在下节详细讲述。
+
+- 如果想阅读 Backbone - `CSPNeXt` 的源码,可以 [**点此**](https://github.com/open-mmlab/mmyolo/blob/main/mmyolo/models/backbones/cspnext.py#L16-L171) 跳转。
+
+#### 1.2.2 CSPNeXt Block
+
+Darknet (图 a)使用 1x1 与 3x3 卷积的 `Basic Block`。[YOLOv6](https://arxiv.org/abs/2209.02976) 、[YOLOv7](https://arxiv.org/abs/2207.02696) 、[PPYOLO-E](https://arxiv.org/abs/2203.16250) (图 b & c)使用了重参数化 Block。但重参数化的训练代价高,且不易量化,需要其他方式来弥补量化误差。
+RTMDet 则借鉴了最近比较热门的 [ConvNeXt](https://arxiv.org/abs/2201.03545) 、[RepLKNet](https://arxiv.org/abs/2203.06717) 的做法,为 `Basic Block` 加入了大 kernel 的 `depth-wise` 卷积(图 d),并将其命名为 `CSPNeXt Block`。
+
+<div align=center>
+<img alt="BasicBlock" src="https://user-images.githubusercontent.com/27466624/192752976-4c20f944-1ef0-4746-892e-ba814cdcda20.png"/>
+</div>
+
+关于不同 kernel 大小的实验结果,如下表所示。
+
+| Kernel  size | params     | flops     | latency-bs1-TRT-FP16 / ms | mAP      |
+| ------------ | ---------- | --------- | ------------------------- | -------- |
+| 3x3          | 50.8       | 79.61G    | 2.1                       | 50.0     |
+| **5x5**      | **50.92M** | **79.7G** | **2.11**                  | **50.9** |
+| 7x7          | 51.1       | 80.34G    | 2.73                      | 51.1     |
+
+如果想阅读 `Basic Block` 和 `CSPNeXt Block` 源码,可以[**点此**](https://github.com/open-mmlab/mmdetection/blob/3.x/mmdet/models/layers/csp_layer.py#L79-L146)跳转。
+
+#### 1.2.3 调整检测器不同 stage 间的 block 数
+
+由于 `CSPNeXt Block` 内使用了 `depth-wise` 卷积,单个 block 内的层数增多。如果保持原有的 stage 内的 block 数,则会导致模型的推理速度大幅降低。
+
+RTMDet 重新调整了不同 stage 间的 block 数,并调整了通道的超参,在保证了精度的情况下提升了推理速度。
+
+关于不同 block 数的实验结果,如下表所示。
+
+| Num  blocks                        | params    | flops     | latency-bs1-TRT-FP16 / ms | mAP      |
+| ---------------------------------- | --------- | --------- | ------------------------- | -------- |
+| L+3-9-9-3                          | 53.4      | 86.28     | 2.6                       | 51.4     |
+| L+3-6-6-3                          | 50.92M    | 79.7G     | 2.11                      | 50.9     |
+| **L+3-6-6-3  + channel attention** | **52.3M** | **79.9G** | **2.4**                   | **51.3** |
+
+最后不同大小模型的 block 数设置,可以参见[源码](https://github.com/open-mmlab/mmyolo/blob/main/mmyolo/models/backbones/cspnext.py#L50-L56) 。
+
+#### 1.2.4 Neck
+
+Neck 模型结构和 YOLOX 几乎一样,只不过内部的 block 进行了替换。
+
+#### 1.2.5 Backbone 与 Neck 之间的参数量和计算量的均衡
+
+[EfficientDet](https://arxiv.org/abs/1911.09070) 、[NASFPN](https://arxiv.org/abs/1904.07392) 等工作在改进 Neck 时往往聚焦于如何修改特征融合的方式。 但引入过多的连接会增加检测器的延时,并增加内存开销。
+
+所以 RTMDet 选择不引入额外的连接,而是改变 Backbone 与 Neck 间参数量的配比。该配比是通过手动调整 Backbone 和 Neck 的 `expand_ratio` 参数来实现的,其数值在 Backbone 和 Neck 中都为 0.5。`expand_ratio`  实际上是改变  `CSPLayer`  中各层通道数的参数(具体可见模型图 `CSPLayer` 部分)。如果想进行不同配比的实验,可以通过调整配置文件中的 [backbone {expand_ratio}](https://github.com/open-mmlab/mmyolo/blob/main/configs/rtmdet/rtmdet_l_8xb32-300e_coco.py#L32) 和 [neck {expand_ratio}](https://github.com/open-mmlab/mmyolo/blob/main/configs/rtmdet/rtmdet_l_8xb32-300e_coco.py#L45) 参数完成。
+
+实验发现,当 Neck 在整个模型中的参数量占比更高时,延时更低,且对精度的影响很小。作者在直播答疑时回复,RTMDet 在 Neck 这一部分的实验参考了 [GiraffeDet](https://arxiv.org/abs/2202.04256) 的做法,但没有像 GiraffeDet 一样引入额外连接(详细可参见 [RTMDet 发布视频](https://www.bilibili.com/video/BV1e841147GD) 31分40秒左右的内容)。
+
+关于不同参数量配比的实验结果,如下表所示。
+
+| Model  size | Backbone | Neck    | params     | flops      | latency  / ms | mAP      |
+| ----------- | -------- | ------- | ---------- | ---------- | ------------- | -------- |
+| **S**       | **47%**  | **45%** | **8.54M**  | **15.76G** | **1.21**      | **43.9** |
+| S           | 63%      | 29%     | 9.01M      | 15.85G     | 1.37          | 43.7     |
+| **L**       | **47%**  | **45%** | **50.92M** | **79.7G**  | **2.11**      | **50.9** |
+| L           | 63%      | 29%     | 57.43M     | 93.73      | 2.57          | 51.0     |
+
+如果想阅读 Neck - `CSPNeXtPAFPN` 的源码,可以[**点此**](https://github.com/open-mmlab/mmyolo/blob/main/mmyolo/models/necks/cspnext_pafpn.py#L15-L201) 跳转。
+
+#### 1.2.6 Head
+
+传统的 YOLO 系列都使用同一 Head 进行分类和回归。YOLOX 则将分类和回归分支解耦,PPYOLO-E 和 YOLOv6 则引入了 [TOOD](https://arxiv.org/abs/2108.07755) 中的结构。它们在不同特征层级之间都使用独立的 Head,因此 Head 在模型中也占有较多的参数量。
+
+RTMDet 参考了 [NAS-FPN](https://arxiv.org/abs/1904.07392) 中的做法,使用了 `SepBNHead`,在不同层之间共享卷积权重,但是独立计算 BN(BatchNorm) 的统计量。
+
+关于不同结构 Head 的实验结果,如下表所示。
+
+| Head  type         | params    | flops     | latency  / ms | mAP      |
+| ------------------ | --------- | --------- | ------------- | -------- |
+| Fully-shared  head | 52.32     | 80.23     | 2.44          | 48.0     |
+| Separated  head    | 57.03     | 80.23     | 2.44          | 51.2     |
+| **SepBN** **head** | **52.32** | **80.23** | **2.44**      | **51.3** |
+
+同时,RTMDet 也延续了作者之前在 [NanoDet](https://zhuanlan.zhihu.com/p/306530300) 中的思想,使用 [Quality Focal Loss](https://arxiv.org/abs/2011.12885) ,并去掉 Objectness 分支,进一步将 Head 轻量化。
+
+如果想阅读 Head 中 `RTMDetSepBNHeadModule` 的源码,可以[**点此**](https://github.com/open-mmlab/mmyolo/blob/main/mmyolo/models/dense_heads/rtmdet_head.py#L24-L189) 跳转。
+
+```{note}
+注:MMYOLO 和 MMDetection 中 Neck 和 Head 的具体实现稍有不同。
+```
+
+### 1.3 正负样本匹配策略
+
+正负样本匹配策略或者称为标签匹配策略 `Label Assignment` 是目标检测模型训练中最核心的问题之一, 更好的标签匹配策略往往能够使得网络更好学习到物体的特征以提高检测能力。
+
+早期的样本标签匹配策略一般都是基于 `空间以及尺度信息的先验` 来决定样本的选取。 典型案例如下:
+
+- `FCOS` 中先限定网格中心点在 `GT` 内筛选后然后再通过不同特征层限制尺寸来决定正负样本
+- `RetinaNet` 则是通过 `Anchor` 与 `GT` 的最大 `IOU` 匹配来划分正负样本
+- `YOLOV5` 的正负样本则是通过样本的宽高比先筛选一部分, 然后通过位置信息选取 `GT` 中心落在的 `Grid` 以及临近的两个作为正样本
+
+但是上述方法都是属于基于 `先验` 的静态匹配策略, 就是样本的选取方式是根据人的经验规定的。 不会随着网络的优化而进行自动优化选取到更好的样本, 近些年涌现了许多优秀的动态标签匹配策略:
+
+- `OTA` 提出使用 `Sinkhorn` 迭代求解匹配中的最优传输问题
+- `YOLOX` 中使用 `OTA` 的近似算法 `SimOTA` , `TOOD` 将分类分数以及 `IOU` 相乘计算 `Cost` 矩阵进行标签匹配等等
+
+这些算法将 `预测的 Bboxes 与 GT 的 IOU ` 和 `分类分数` 或者是对应 `分类 Loss` 和 `回归 Loss` 拿来计算 `Matching Cost` 矩阵再通过 `top-k` 的方式动态决定样本选取以及样本个数。通过这种方式,
+在网络优化的过程中会自动选取对分类或者回归更加敏感有效的位置的样本, 它不再只依赖先验的静态的信息, 而是使用当前的预测结果去动态寻找最优的匹配, 只要模型的预测越准确, 匹配算法求得的结果也会更优秀。但是在网络训练的初期, 网络的分类以及回归是随机初始化, 这个时候还是需要 `先验` 来约束, 以达到 `冷启动` 的效果。
+
+`RTMDet` 作者也是采用了动态的 `SimOTA` 做法,不过其对动态的正负样本分配策略进行了改进。 之前的动态匹配策略( `HungarianAssigner` 、`OTA` )往往使用与 `Loss` 完全一致的代价函数作为匹配的依据,但我们经过实验发现这并不一定时最优的。 使用更多 `Soften` 的 `Cost` 以及先验,能够提升性能。
+
+#### 1.3.1 Bbox 编解码过程
+
+RTMDet 的 BBox Coder 采用的是 `mmdet.DistancePointBBoxCoder`。
+
+该类的 docstring 为 `This coder encodes gt bboxes (x1, y1, x2, y2) into (top, bottom, left, right) and decode it back to the original.`
+
+编码器将 gt bboxes (x1, y1, x2, y2) 编码为 (top, bottom, left, right),并且解码至原图像上。
+
+MMDet 编码的核心源码:
+
+```python
+def bbox2distance(points: Tensor, bbox: Tensor, ...) -> Tensor:
+    """
+        points (Tensor): 相当于 scale 值 stride ,且每个预测点仅为一个正方形 anchor 的 anchor point [x, y],Shape (n, 2) or (b, n, 2).
+        bbox (Tensor): Bbox 为乘上 stride 的网络预测值,格式为 xyxy,Shape (n, 4) or (b, n, 4).
+    """
+    # 计算点距离四边的距离
+    left = points[..., 0] - bbox[..., 0]
+    top = points[..., 1] - bbox[..., 1]
+    right = bbox[..., 2] - points[..., 0]
+    bottom = bbox[..., 3] - points[..., 1]
+
+    ...
+
+    return torch.stack([left, top, right, bottom], -1)
+```
+
+MMDetection 解码的核心源码:
+
+```python
+def distance2bbox(points: Tensor, distance: Tensor, ...) -> Tensor:
+    """
+        通过距离反算 bbox 的 xyxy
+        points (Tensor): 正方形的预测 anchor 的 anchor point [x, y],Shape (B, N, 2) or (N, 2).
+        distance (Tensor): 距离四边的距离。(left, top, right, bottom). Shape (B, N, 4) or (N, 4)
+    """
+
+    # 反算 bbox xyxy
+    x1 = points[..., 0] - distance[..., 0]
+    y1 = points[..., 1] - distance[..., 1]
+    x2 = points[..., 0] + distance[..., 2]
+    y2 = points[..., 1] + distance[..., 3]
+
+    bboxes = torch.stack([x1, y1, x2, y2], -1)
+
+    ...
+
+    return bboxes
+```
+
+#### 1.3.2 匹配策略
+
+`RTMDet` 提出了 `Dynamic Soft Label Assigner` 来实现标签的动态匹配策略, 该方法主要包括使用 **位置先验信息损失** , **样本回归损失** , **样本分类损失** , 同时对三个损失进行了 `Soft` 处理进行参数调优, 以达到最佳的动态匹配效果。
+
+该方法 Matching Cost 矩阵由如下损失构成:
+
+```python
+cost_matrix = soft_cls_cost + iou_cost + soft_center_prior
+```
+
+1. Soft_Center_Prior
+
+```{math}
+C\_{center} = \\alpha^{|x\_{pred}-x\_{gt}|-\\beta}
+```
+
+```python
+# valid_prior Tensor[N,4] 表示anchor point
+# 4分别表示 x, y, 以及对应的特征层的 stride, stride
+gt_center = (gt_bboxes[:, :2] + gt_bboxes[:, 2:]) / 2.0
+valid_prior = priors[valid_mask]
+strides = valid_prior[:, 2]
+# 计算gt与anchor point的中心距离并转换到特征图尺度
+distance = (valid_prior[:, None, :2] - gt_center[None, :, :]
+                    ).pow(2).sum(-1).sqrt() / strides[:, None]
+# 以10为底计算位置的软化损失,限定在gt的6个单元格以内
+soft_center_prior = torch.pow(10, distance - 3)
+```
+
+2. IOU_Cost
+
+```{math}
+C\_{reg} = -log(IOU)
+```
+
+```python
+# 计算回归 bboxes 和 gts 的 iou
+pairwise_ious = self.iou_calculator(valid_decoded_bbox, gt_bboxes)
+# 将 iou 使用 log 进行 soft , iou 越小 cost 更小
+iou_cost = -torch.log(pairwise_ious + EPS) * 3
+```
+
+3. Soft_Cls_Cost
+
+```{math}
+C\_{cls} = CE(P,Y\_{soft}) \*(Y\_{soft}-P)^2
+```
+
+```python
+# 生成分类标签
+ gt_onehot_label = (
+    F.one_hot(gt_labels.to(torch.int64),
+              pred_scores.shape[-1]).float().unsqueeze(0).repeat(
+                  num_valid, 1, 1))
+valid_pred_scores = valid_pred_scores.unsqueeze(1).repeat(1, num_gt, 1)
+# 不单单将分类标签为01,而是换成与 gt 的 iou
+soft_label = gt_onehot_label * pairwise_ious[..., None]
+# 使用 quality focal loss 计算分类损失 cost ,与实际的分类损失计算保持一致
+scale_factor = soft_label - valid_pred_scores.sigmoid()
+soft_cls_cost = F.binary_cross_entropy_with_logits(
+    valid_pred_scores, soft_label,
+    reduction='none') * scale_factor.abs().pow(2.0)
+soft_cls_cost = soft_cls_cost.sum(dim=-1)
+```
+
+通过计算上述三个损失的和得到最终的 `cost_matrix` 后, 再使用 `SimOTA` 决定每一个 `GT` 匹配的样本的个数并决定最终的样本。具体操作如下所示:
+
+1. 首先通过自适应计算每一个 `gt` 要选取的样本数量: 取每一个 `gt` 与所有 `bboxes` 前 `13` 大的 `iou`, 得到它们的和取整后作为这个 `gt` 的 `样本数目` , 最少为 `1` 个, 记为 `dynamic_ks`。
+2. 对于每一个 `gt` , 将其 `cost_matrix` 矩阵前 `dynamic_ks` 小的位置作为该 `gt` 的正样本。
+3. 对于某一个 `bbox`, 如果被匹配到多个 `gt` 就将与这些 `gts` 的 `cost_marix` 中最小的那个作为其 `label`。
+
+在网络训练初期,因参数初始化,回归和分类的损失值 `Cost` 往往较大, 这时候 `IOU` 比较小, 选取的样本较少,主要起作用的是 `Soft_center_prior` 也就是位置信息,优先选取位置距离 `GT` 比较近的样本作为正样本,这也符合人们的理解,在网络前期给少量并且有足够质量的样本,以达到冷启动。
+当网络进行训练一段时间过后,分类分支和回归分支都进行了一定的优化后,这时 `IOU` 变大, 选取的样本也逐渐增多,这时网络也有能力学习到更多的样本,同时因为 `IOU_Cost` 以及 `Soft_Cls_Cost` 变小,网络也会动态的找到更有利优化分类以及回归的样本点。
+
+在 `Resnet50-1x` 的三种损失的消融实验:
+
+| Soft_cls_cost | Soft_center_prior | Log_IoU_cost | mAP  |
+| :------------ | :---------------- | :----------- | :--- |
+| ×             | ×                 | ×            | 39.9 |
+| √             | ×                 | ×            | 40.3 |
+| √             | √                 | ×            | 40.8 |
+| √             | √                 | √            | 41.3 |
+
+与其他主流 `Assign` 方法在 `Resnet50-1x` 的对比实验:
+
+|    method     | mAP  |
+| :-----------: | :--- |
+|     ATSS      | 39.2 |
+|      PAA      | 40.4 |
+|      OTA      | 40.7 |
+| TOOD(w/o TAH) | 40.7 |
+|     Ours      | 41.3 |
+
+无论是 `Resnet50-1x` 还是标准的设置下,还是在`300epoch` + `havy augmentation`,  相比于 `SimOTA` 、 `OTA` 以及 `TOOD` 中的 `TAL` 均有提升。
+
+| 300e + Mosaic & MixUP | mAP  |
+| :-------------------- | :--- |
+| RTMDet-s + SimOTA     | 43.2 |
+| RTMDet-s + DSLA       | 44.5 |
+
+### 1.4 Loss 设计
+
+参与 Loss 计算的共有两个值:`loss_cls` 和 `loss_bbox`,其各自使用的 Loss 方法如下:
+
+- `loss_cls`:`mmdet.QualityFocalLoss`
+- `loss_bbox`:`mmdet.GIoULoss`
+
+权重比例是:`loss_cls` : `loss_bbox` = `1 : 2`
+
+#### QualityFocalLoss
+
+Quality Focal Loss (QFL) 是 [Generalized Focal Loss: Learning Qualified and Distributed Bounding Boxes for Dense Object Detection](https://arxiv.org/abs/2006.04388) 的一部分。
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/25873202/192767279-4e69f935-1685-4089-82a3-0add201f98cc.png" alt="image"/>
+</div>
+
+普通的 Focal Loss 公式:
+
+```{math}
+{FL}(p) = -(1-p_t)^\gamma\log(p_t),p_t = \begin{cases}
+p, & {when} \ y = 1 \\
+1 - p, & {when} \ y = 0
+\end{cases}
+```
+
+其中 {math}`y\in{1,0}` 指定真实类,{math}`p\in[0,1]` 表示标签 {math}`y = 1` 的类估计概率。{math}`\gamma` 是可调聚焦参数。具体来说,FL 由标准交叉熵部分 {math}`-\log(p_t)` 和动态比例因子部分 {math}`-(1-p_t)^\gamma` 组成,其中比例因子 {math}`-(1-p_t)^\gamma` 在训练期间自动降低简单类对于 loss 的比重,并且迅速将模型集中在困难类上。
+
+首先 {math}`y = 0` 表示质量得分为 0 的负样本,{math}`0 < y \leq 1` 表示目标 IoU 得分为 y 的正样本。为了针对连续的标签,扩展 FL 的两个部分:
+
+1. 交叉熵部分 {math}`-\log(p_t)` 扩展为完整版本 {math}`-((1-y)\log(1-\sigma)+y\log(\sigma))`
+2. 比例因子部分 {math}`-(1-p_t)^\gamma` 被泛化为估计 {math}`\gamma` 与其连续标签 {math}`y` 的绝对距离,即 {math}`|y-\sigma|^\beta (\beta \geq 0)` 。
+
+结合上面两个部分之后,我们得出 QFL 的公式:
+
+```{math}
+{QFL}(\sigma) = -|y-\sigma|^\beta((1-y)\log(1-\sigma)+y\log(\sigma))
+```
+
+具体作用是:可以将离散标签的 `focal loss` 泛化到连续标签上,将 bboxes 与 gt 的 IoU 的作为分类分数的标签,使得分类分数为表征回归质量的分数。
+
+MMDetection 实现源码的核心部分:
+
+```python
+@weighted_loss
+def quality_focal_loss(pred, target, beta=2.0):
+    """
+        pred (torch.Tensor): 用形状(N,C)联合表示预测分类和质量(IoU),C是类的数量。
+        target (tuple([torch.Tensor])): 目标类别标签的形状为(N,),目标质量标签的形状是(N,,)。
+        beta (float): 计算比例因子的 β 参数.
+    """
+    ...
+
+    # label表示类别id,score表示质量分数
+    label, score = target
+
+    # 负样本质量分数0来进行监督
+    pred_sigmoid = pred.sigmoid()
+    scale_factor = pred_sigmoid
+    zerolabel = scale_factor.new_zeros(pred.shape)
+
+    # 计算交叉熵部分的值
+    loss = F.binary_cross_entropy_with_logits(
+        pred, zerolabel, reduction='none') * scale_factor.pow(beta)
+
+    # 得出 IoU 在区间 (0,1] 的 bbox
+    # FG cat_id: [0, num_classes -1], BG cat_id: num_classes
+    bg_class_ind = pred.size(1)
+    pos = ((label >= 0) & (label < bg_class_ind)).nonzero().squeeze(1)
+    pos_label = label[pos].long()
+
+    # 正样本由 IoU 范围在 (0,1] 的 bbox 来监督
+    # 计算动态比例因子
+    scale_factor = score[pos] - pred_sigmoid[pos, pos_label]
+
+    # 计算两部分的 loss
+    loss[pos, pos_label] = F.binary_cross_entropy_with_logits(
+        pred[pos, pos_label], score[pos],
+        reduction='none') * scale_factor.abs().pow(beta)
+
+    # 得出最终 loss
+    loss = loss.sum(dim=1, keepdim=False)
+    return loss
+```
+
+#### GIoULoss
+
+论文:[Generalized Intersection over Union: A Metric and A Loss for Bounding Box Regression](https://arxiv.org/abs/1902.09630)
+
+GIoU Loss 用于计算两个框重叠区域的关系,重叠区域越大,损失越小,反之越大。而且 GIoU 是在 \[0,2\] 之间,因为其值被限制在了一个较小的范围内,所以网络不会出现剧烈的波动,证明了其具有比较好的稳定性。
+
+下图是基本的实现流程图:
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/25873202/192568784-3884b677-d8e1-439c-8bd2-20943fcedd93.png" alt="image"/>
+</div>
+
+MMDetection 实现源码的核心部分:
+
+```python
+def bbox_overlaps(bboxes1, bboxes2, mode='iou', is_aligned=False, eps=1e-6):
+    ...
+
+    # 求两个区域的面积
+    area1 = (bboxes1[..., 2] - bboxes1[..., 0]) * (
+        bboxes1[..., 3] - bboxes1[..., 1])
+    area2 = (bboxes2[..., 2] - bboxes2[..., 0]) * (
+        bboxes2[..., 3] - bboxes2[..., 1])
+
+    if is_aligned:
+        # 得出两个 bbox 重合的左上角 lt 和右下角 rb
+        lt = torch.max(bboxes1[..., :2], bboxes2[..., :2])  # [B, rows, 2]
+        rb = torch.min(bboxes1[..., 2:], bboxes2[..., 2:])  # [B, rows, 2]
+
+        # 求重合面积
+        wh = fp16_clamp(rb - lt, min=0)
+        overlap = wh[..., 0] * wh[..., 1]
+
+        if mode in ['iou', 'giou']:
+            ...
+        else:
+            union = area1
+        if mode == 'giou':
+            # 得出两个 bbox 最小凸闭合框的左上角 lt 和右下角 rb
+            enclosed_lt = torch.min(bboxes1[..., :2], bboxes2[..., :2])
+            enclosed_rb = torch.max(bboxes1[..., 2:], bboxes2[..., 2:])
+    else:
+        ...
+
+    # 求重合面积 / gt bbox 面积 的比率,即 IoU
+    eps = union.new_tensor([eps])
+    union = torch.max(union, eps)
+    ious = overlap / union
+
+    ...
+
+    # 求最小凸闭合框面积
+    enclose_wh = fp16_clamp(enclosed_rb - enclosed_lt, min=0)
+    enclose_area = enclose_wh[..., 0] * enclose_wh[..., 1]
+    enclose_area = torch.max(enclose_area, eps)
+
+    # 计算 giou
+    gious = ious - (enclose_area - union) / enclose_area
+    return gious
+
+@weighted_loss
+def giou_loss(pred, target, eps=1e-7):
+    gious = bbox_overlaps(pred, target, mode='giou', is_aligned=True, eps=eps)
+    loss = 1 - gious
+    return loss
+```
+
+### 1.5 优化策略和训练过程
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/89863442/192943607-74952731-4eb7-45f5-b86d-2dad46732614.png" width="800"/>
+</div>
+
+### 1.6 推理和后处理过程
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/89863442/192943600-98c3a8f9-e42c-47ea-8e12-d20f686e9318.png" width="800"/>
+</div>
+
+**(1) 特征图输入**
+
+预测的图片输入大小为 640 x 640, 通道数为 3 ,经过 CSPNeXt, CSPNeXtPAFPN 层的 8 倍、16 倍、32 倍下采样得到 80 x 80, 40 x 40, 20 x 20 三个尺寸的特征图。以 rtmdet-l 模型为例,此时三层通道数都为 256,经过 `bbox_head` 层得到两个分支,分别为 `rtm_cls` 类别预测分支,将通道数从 256 变为 80,80 对应所有类别数量; `rtm_reg` 边框回归分支将通道数从 256 变为 4,4 代表框的坐标。
+
+**(2) 初始化网格**
+
+根据特征图尺寸初始化三个网格,大小分别为 6400 (80 x 80)、1600 (40 x 40)、400 (20 x 20),如第一个层 shape 为 torch.Size(\[ 6400, 2 \]),最后一个维度是 2,为网格点的横纵坐标,而 6400 表示当前特征层的网格点数量。
+
+**(3) 维度变换**
+
+经过 `_predict_by_feat_single` 函数,将从 head 提取的单一图像的特征转换为 bbox 结果输入,得到三个列表 `cls_score_list`,`bbox_pred_list`,`mlvl_priors`,详细大小如图所示。之后分别遍历三个特征层,分别对 class 类别预测分支、bbox 回归分支进行处理。以第一层为例,对 bbox 预测分支 \[ 4,80,80 \] 维度变换为 \[ 6400,4 \],对类别预测分支 \[ 80,80,80 \] 变化为 \[ 6400,80 \],并对其做归一化,确保类别置信度在 0 - 1 之间。
+
+**(4) 阈值过滤**
+
+先使用一个 `nms_pre` 操作,先过滤大部分置信度比较低的预测结果(比如 `score_thr` 阈值设置为 0.05,则去除当前预测置信度低于 0.05 的结果),然后得到 bbox 坐标、所在网格的坐标、置信度、标签的信息。经过三个特征层遍历之后,分别整合这三个层得到的的四个信息放入 results 列表中。
+
+**(5) 还原到原图尺度**
+
+最后将网络的预测结果映射到整图当中,得到 bbox 在整图中的坐标值
+
+**(6) NMS**
+
+进行 nms 操作,最终预测得到的返回值为经过后处理的每张图片的检测结果,包含分类置信度,框的 labels,框的四个坐标
+
+## 2 总结
+
+本文对 RTMDet 原理和在 MMYOLO 实现进行了详细解析,希望能帮助用户理解算法实现过程。同时请注意:由于 RTMDet 本身也在不断更新,
+本开源库也会不断迭代,请及时阅读和同步最新版本。
diff --git a/mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/algorithm_descriptions/yolov5_description.md b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/algorithm_descriptions/yolov5_description.md
new file mode 100644
index 0000000..2ef0111
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/algorithm_descriptions/yolov5_description.md
@@ -0,0 +1,652 @@
+# YOLOv5 原理和实现全解析
+
+## 0 简介
+
+<div align=center >
+<img alt="YOLOv5-P5_structure_v3.4" src="https://user-images.githubusercontent.com/27466624/200000324-70ae078f-cea7-4189-8baa-440656797dad.jpg"/>
+图 1:YOLOv5-l-P5 模型结构
+</div>
+
+<div align=center >
+<img alt="YOLOv5-P6_structure_v1.1" src="https://user-images.githubusercontent.com/27466624/211143533-1725c1b2-6189-4c3a-a046-ad968e03cb9d.jpg"/>
+图 2:YOLOv5-l-P6 模型结构
+</div>
+
+以上结构图由 RangeKing@github 绘制。
+
+YOLOv5 是一个面向实时工业应用而开源的目标检测算法,受到了广泛关注。我们认为让 YOLOv5 爆火的原因不单纯在于 YOLOv5 算法本身的优异性,更多的在于开源库的实用和鲁棒性。简单来说 YOLOv5 开源库的主要特点为:
+
+1. **友好和完善的部署支持**
+2. **算法训练速度极快**,在 300 epoch 情况下训练时长和大部分 one-stage 算法如 RetinaNet、ATSS 和 two-stage 算法如 Faster R-CNN 在 12 epoch 的训练时间接近
+3. 框架进行了**非常多的 corner case 优化**,功能和文档也比较丰富
+
+如图 1 和 2 所示,YOLOv5 的 P5 和 P6 版本主要差异在于网络结构和图片输入分辨率。其他区别,如 anchors 个数和 loss 权重可详见[配置文件](https://github.com/open-mmlab/mmyolo/blob/main/configs/yolov5/yolov5_s-p6-v62_syncbn_fast_8xb16-300e_coco.py)。本文将从 YOLOv5 算法本身原理讲起,然后重点分析 MMYOLO 中的实现。关于 YOLOv5 的使用指南和速度等对比请阅读本文的后续内容。
+
+```{hint}
+没有特殊说明情况下,本文默认描述的是 P5 模型。
+```
+
+希望本文能够成为你入门和掌握 YOLOv5 的核心文档。由于 YOLOv5 本身也在不断迭代更新,我们也会不断的更新本文档。请注意阅读最新版本。
+
+MMYOLO 实现配置:https://github.com/open-mmlab/mmyolo/blob/main/configs/yolov5/
+
+YOLOv5 官方开源库地址:https://github.com/ultralytics/yolov5
+
+## 1 v6.1 算法原理和 MMYOLO 实现解析
+
+YOLOv5 官方 release 地址:https://github.com/ultralytics/yolov5/releases/tag/v6.1
+
+<div align=center >
+<img alt="YOLOv5精度图" src="https://user-images.githubusercontent.com/40284075/190542120-29d46b7e-ce3c-436a-9933-cfc9f86787bf.png"/>
+</div>
+
+<div align=center >
+<img alt="YOLOv5精度速度图" src="https://user-images.githubusercontent.com/40284075/190542279-37734629-2b59-4bd8-a9bf-757875a93eed.png"/>
+</div>
+
+性能如上表所示。YOLOv5 有 P5 和 P6 两个不同训练输入尺度的模型,P6 即为 1280x1280 输入的大模型,通常用的是 P5 常规模型,输入尺寸是 640x640 。本文解读的也是 P5 模型结构。
+
+通常来说,目标检测算法都可以分成数据增强、模型结构、loss 计算等组件,YOLOv5 也一样,如下所示:
+
+<div align=center >
+<img alt="训练测试策略" src="https://user-images.githubusercontent.com/40284075/190542423-f6b20d8e-c82a-4a34-9065-c161c5e29e7c.png"/>
+</div>
+
+下面将从原理和结合 MMYOLO 的具体实现方面进行简要分析。
+
+### 1.1 数据增强模块
+
+YOLOv5 目标检测算法中使用的数据增强比较多,包括:
+
+- **Mosaic 马赛克**
+- **RandomAffine 随机仿射变换**
+- **MixUp**
+- **图像模糊等采用 Albu 库实现的变换**
+- **HSV 颜色空间增强**
+- **随机水平翻转**
+
+其中 Mosaic 数据增强概率为 1,表示一定会触发,而对于 small 和 nano 两个版本的模型不使用 MixUp,其他的 l/m/x 系列模型则采用了 0.1 的概率触发 MixUp。小模型能力有限,一般不会采用 MixUp 等强数据增强策略。
+
+其核心的 Mosaic + RandomAffine + MixUp 过程简要绘制如下:
+
+<div align=center >
+<img alt="image" src="https://user-images.githubusercontent.com/40284075/190542598-bbf4a159-cc9d-4bac-892c-46ef99267994.png"/>
+</div>
+
+下面对其进行简要分析。
+
+#### 1.1.1 Mosaic 马赛克
+
+<div align=center >
+<img alt="image" src="https://user-images.githubusercontent.com/40284075/190542619-d777894f-8928-4244-b39a-158eea416ccd.png"/>
+</div>
+
+Mosaic 属于混合类数据增强,因为它在运行时候需要 4 张图片拼接,变相的相当于增加了训练的 batch size。其运行过程简要概况为:
+
+1. 随机生成拼接后 4 张图的交接中心点坐标,此时就相当于确定了 4 张拼接图片的交接点
+2. 随机选出另外 3 张图片的索引以及读取对应的标注
+3. 对每张图片采用保持宽高比的 resize 操作将其缩放到指定大小
+4. 按照上下左右规则,计算每张图片在待输出图片中应该放置的位置,因为图片可能出界故还需要计算裁剪坐标
+5. 利用裁剪坐标将缩放后的图片裁剪,然后贴到前面计算出的位置,其余位置全部补 114 像素值
+6. 对每张图片的标注也进行相应处理
+
+注意:由于拼接了 4 张图,所以输出图片面积会扩大 4 倍,从 640x640 变成 1280x1280,因此要想恢复为 640x640,
+必须要再接一个 **RandomAffine 随机仿射变换,否则图片面积就一直是扩大 4 倍的**。
+
+#### 1.1.2 RandomAffine 随机仿射变换
+
+<div align=center >
+<img alt="image" src="https://user-images.githubusercontent.com/40284075/190542871-14e91a42-329f-4084-aec5-b3e412e5364b.png"/>
+</div>
+
+随机仿射变换有两个目的:
+
+1. 对图片进行随机几何仿射变换
+2. 将 Mosaic 输出的扩大 4 倍的图片还原为 640x640 尺寸
+
+随机仿射变换包括平移、旋转、缩放、错切等几何增强操作,同时由于 Mosaic 和 RandomAffine 属于比较强的增强操作,会引入较大噪声,因此需要对增强后的标注进行处理,过滤规则为:
+
+1. 增强后的 gt bbox 宽高要大于 wh_thr
+2. 增强后的 gt bbox 面积和增强前的 gt bbox 面积比要大于 ar_thr,防止增强太严重
+3. 最大宽高比要小于 area_thr,防止宽高比改变太多
+
+由于旋转后标注框会变大导致不准确,因此目标检测里面很少会使用旋转数据增强。
+
+#### 1.1.3 MixUp
+
+<div align=center >
+<img alt="image" src="https://user-images.githubusercontent.com/40284075/190543076-db60e4b2-0552-4cf4-ab45-259d1ccbd5a6.png"/>
+</div>
+
+MixUp 和 Mosaic 类似也属于混合图片类增强方法。随机选出另外一张图后将两图再随机混合。具体实现方法有多种,常见的做法是要么将 label 直接拼接起来,要么将 label 也采用 alpha 方法混合。原作者的做法非常简单,对 label 即直接拼接,而图片通过分布采样混合。
+
+需要特别注意的是:
+**YOLOv5 实现的 MixUp 中,随机出来的另一张图也需要经过 Mosaic 马赛克 + RandomAffine 随机仿射变换 的增强后才能混合。这个和其他开源库实现可能不太一样**。
+
+#### 1.1.4 图像模糊和其他数据增强策略
+
+<div align=center >
+<img alt="image" src="https://user-images.githubusercontent.com/40284075/190543533-8b9ece51-676b-4a7d-a7d0-597e2dd1d42e.png"/>
+</div>
+
+剩下的数据增强包括
+
+- **图像模糊等采用 Albu 库实现的变换**
+- **HSV 颜色空间增强**
+- **随机水平翻转**
+
+MMDetection 开源库中已经对 Albu 第三方数据增强库进行了封装,使用户可以简单的通过配置即可使用 Albu 库中提供的任何数据增强功能。而 HSV 颜色空间增强和随机水平翻转都是属于比较常规的数据增强,不需要特殊介绍。
+
+#### 1.1.5 MMYOLO 实现解析
+
+常规的单图数据增强例如随机翻转等比较容易实现,而 Mosaic 类的混合数据增强则不太容易。在 MMDetection 复现的 YOLOX 算法中提出了 MultiImageMixDataset 数据集包装器的概念,其实现过程如下:
+
+<div align=center >
+<img alt="image" src="https://user-images.githubusercontent.com/40284075/190543666-d5a22ed7-46a0-4696-990a-12ebde7f8907.png"/>
+</div>
+
+对于 Mosaic 等混合类数据增强策略,会需要额外实现一个 `get_indexes` 方法来获取其他图片索引,然后用得到的 4 张图片信息就可以进行 Mosaic 增强了。
+以 MMDetection 中实现的 YOLOX 为例,其配置文件写法如下所示:
+
+```python
+train_pipeline = [
+    dict(type='Mosaic', img_scale=img_scale, pad_val=114.0),
+    dict(
+        type='RandomAffine',
+        scaling_ratio_range=(0.1, 2),
+        border=(-img_scale[0] // 2, -img_scale[1] // 2)),
+    dict(
+        type='MixUp',
+        img_scale=img_scale,
+        ratio_range=(0.8, 1.6),
+        pad_val=114.0),
+    ...
+]
+
+train_dataset = dict(
+    # use MultiImageMixDataset wrapper to support mosaic and mixup
+    type='MultiImageMixDataset',
+    dataset=dict(
+        type='CocoDataset',
+        pipeline=[
+            dict(type='LoadImageFromFile'),
+            dict(type='LoadAnnotations', with_bbox=True)
+        ]),
+    pipeline=train_pipeline)
+```
+
+MultiImageMixDataset 数据集包装器传入一个包括 Mosaic 和 RandAffine 等数据增强,而 CocoDataset 中也需要传入一个包括图片和标注加载的 pipeline。通过这种方式就可以快速的实现混合类数据增强。
+
+但是上述实现有一个缺点:
+**对于不熟悉 MMDetection 的用户来说,其经常会忘记 Mosaic 必须要和 MultiImageMixDataset 配合使用,否则会报错,而且这样会加大复杂度和理解难度**。
+
+为了解决这个问题,在 MMYOLO 中我们进一步进行了简化。直接让 pipeline 能够获取到 dataset 对象,此时就可以将 Mosaic 等混合类数据增强的实现和使用变成和随机翻转一样。
+此时在 MMYOLO 中 YOLOX 的配置写法变成如下所示:
+
+```python
+pre_transform = [
+    dict(type='LoadImageFromFile'),
+    dict(type='LoadAnnotations', with_bbox=True)
+]
+
+train_pipeline = [
+    *pre_transform,
+    dict(
+        type='Mosaic',
+        img_scale=img_scale,
+        pad_val=114.0,
+        pre_transform=pre_transform),
+    dict(
+        type='mmdet.RandomAffine',
+        scaling_ratio_range=(0.1, 2),
+        border=(-img_scale[0] // 2, -img_scale[1] // 2)),
+    dict(
+        type='YOLOXMixUp',
+        img_scale=img_scale,
+        ratio_range=(0.8, 1.6),
+        pad_val=114.0,
+        pre_transform=pre_transform),
+    ...
+]
+```
+
+这样就不再需要 MultiImageMixDataset 了,使用和理解上会更加简单。
+
+回到 YOLOv5 配置上,因为 YOLOv5 实现的 MixUp 中,随机选出来的另一张图也需要经过 Mosaic 马赛克+RandomAffine 随机仿射变换 增强后才能混合,故YOLOv5-m 数据增强配置如下所示:
+
+```python
+pre_transform = [
+    dict(type='LoadImageFromFile'),
+    dict(type='LoadAnnotations', with_bbox=True)
+]
+
+mosaic_transform= [
+    dict(
+        type='Mosaic',
+        img_scale=img_scale,
+        pad_val=114.0,
+        pre_transform=pre_transform),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        scaling_ratio_range=(0.1, 1.9),  # scale = 0.9
+        border=(-img_scale[0] // 2, -img_scale[1] // 2),
+        border_val=(114, 114, 114))
+]
+
+train_pipeline = [
+    *pre_transform,
+    *mosaic_transform,
+    dict(
+        type='YOLOv5MixUp',
+        prob=0.1,
+        pre_transform=[
+            *pre_transform,
+            *mosaic_transform
+        ]),
+    ...
+]
+```
+
+### 1.2 网络结构
+
+本小结由 RangeKing@github 撰写,非常感谢!!!
+
+YOLOv5 网络结构是标准的 `CSPDarknet` + `PAFPN` + `非解耦 Head`。
+
+YOLOv5 网络结构大小由 `deepen_factor` 和 `widen_factor` 两个参数决定。其中 `deepen_factor` 控制网络结构深度,即 `CSPLayer` 中 `DarknetBottleneck` 模块堆叠的数量;`widen_factor` 控制网络结构宽度,即模块输出特征图的通道数。以 YOLOv5-l 为例,其 `deepen_factor = widen_factor = 1.0` 。P5 和 P6 的模型整体结构分别如图 1 和图 2 所示。
+
+图的上半部分为模型总览;下半部分为具体网络结构,其中的模块均标有序号,方便用户与 YOLOv5 官方仓库的配置文件对应;中间部分为各子模块的具体构成。
+
+如果想使用 netron 可视化网络结构图细节,可以直接在 netron 中将 MMDeploy 导出的 ONNX 文件格式文件打开。
+
+```{hint}
+1.2 小节涉及的特征维度(shape)都为 (B, C, H, W)。
+```
+
+#### 1.2.1 Backbone
+
+在 MMYOLO 中 `CSPDarknet` 继承自 `BaseBackbone`,整体结构和 `ResNet` 类似。P5 模型共 5 层结构,包含 1 个 `Stem Layer` 和 4 个 `Stage Layer`:
+
+- `Stem Layer` 是 1 个 6x6 kernel 的 `ConvModule`,相较于 v6.1 版本之前的 `Focus` 模块更加高效。
+- 除了最后一个 `Stage Layer`,其他均由 1 个 `ConvModule` 和 1 个 `CSPLayer` 组成。如上图 Details 部分所示。
+  其中 `ConvModule` 为 3x3的 `Conv2d` + `BatchNorm` + `SiLU 激活函数`。`CSPLayer` 即 YOLOv5 官方仓库中的 C3 模块,由 3 个 `ConvModule` + n 个 `DarknetBottleneck`(带残差连接) 组成。
+- 最后一个 `Stage Layer` 在最后增加了 `SPPF` 模块。`SPPF` 模块是将输入串行通过多个 5x5 大小的 `MaxPool2d` 层,与 `SPP` 模块效果相同,但速度更快。
+- P5 模型会在 `Stage Layer` 2-4 之后分别输出一个特征图进入 `Neck` 结构。以 640x640 输入图片为例,其输出特征为 (B,256,80,80)、(B,512,40,40) 和 (B,1024,20,20),对应的 stride 分别为 8/16/32。
+- P6 模型会在 `Stage Layer` 2-5 之后分别输出一个特征图进入 `Neck` 结构。以 1280x1280 输入图片为例,其输出特征为 (B,256,160,160)、(B,512,80,80)、(B,768,40,40) 和 (B,1024,20,20),对应的 stride 分别为 8/16/32/64。
+
+#### 1.2.2 Neck
+
+YOLOv5 官方仓库的配置文件中并没有 Neck 部分,为方便用户与其他目标检测网络结构相对应,我们将官方仓库的 `Head` 拆分成 `PAFPN` 和 `Head` 两部分。
+
+基于 `BaseYOLONeck` 结构,YOLOv5 `Neck` 也是遵循同一套构建流程,对于不存在的模块,我们采用 `nn.Identity` 代替。
+
+Neck 模块输出的特征图和 Backbone 完全一致。即 P5 模型为 (B,256,80,80)、 (B,512,40,40) 和 (B,1024,20,20);P6 模型为 (B,256,160,160)、(B,512,80,80)、(B,768,40,40) 和 (B,1024,20,20)。
+
+#### 1.2.3 Head
+
+YOLOv5 Head 结构和 YOLOv3 完全一样,为 `非解耦 Head`。Head 模块只包括 3 个不共享权重的卷积,用于将输入特征图进行变换而已。
+
+前面的 PAFPN 依然是输出 3 个不同尺度的特征图,shape 为 (B,256,80,80)、 (B,512,40,40) 和 (B,1024,20,20)。
+由于 YOLOv5 是非解耦输出,即分类和 bbox 检测等都是在同一个卷积的不同通道中完成。以 COCO 80 类为例:
+
+- P5 模型在输入为 640x640 分辨率情况下,其 Head 模块输出的 shape 分别为 `(B, 3x(4+1+80),80,80)`, `(B, 3x(4+1+80),40,40)` 和 `(B, 3x(4+1+80),20,20)`。
+- P6 模型在输入为 1280x1280 分辨率情况下,其 Head 模块输出的 shape 分别为 `(B, 3x(4+1+80),160,160)`, `(B, 3x(4+1+80),80,80)`, `(B, 3x(4+1+80),40,40)` 和 `(B, 3x(4+1+80),20,20)`。
+  其中 3 表示 3 个 anchor,4 表示 bbox 预测分支,1 表示 obj 预测分支,80 表示 COCO 数据集类别预测分支。
+
+### 1.3 正负样本匹配策略
+
+正负样本匹配策略的核心是确定预测特征图的所有位置中哪些位置应该是正样本,哪些是负样本,甚至有些是忽略样本。
+匹配策略是目标检测算法的核心,一个好的匹配策略可以显著提升算法性能。
+
+YOLOV5 的匹配策略简单总结为:**采用了 anchor 和 gt_bbox 的 shape 匹配度作为划分规则,同时引入跨邻域网格策略来增加正样本**。
+其主要包括如下两个核心步骤:
+
+1. 对于任何一个输出层,抛弃了常用的基于 Max IoU 匹配的规则,而是直接采用 shape 规则匹配,也就是该 GT Bbox 和当前层的 Anchor 计算宽高比,如果宽高比例大于设定阈值,则说明该 GT Bbox 和 Anchor 匹配度不够,将该 GT Bbox 暂时丢掉,在该层预测中该 GT Bbox 对应的网格内的预测位置认为是负样本
+2. 对于剩下的 GT Bbox(也就是匹配上的 GT Bbox),计算其落在哪个网格内,同时利用四舍五入规则,找出最近的两个网格,将这三个网格都认为是负责预测该 GT Bbox 的,可以粗略估计正样本数相比之前的 YOLO 系列,至少增加了三倍
+
+下面会对每个部分进行详细说明,部分描述和图示直接或间接参考自官方 [Repo](https://github.com/ultralytics/YOLOv5/issues/6998#44)。
+
+#### 1.3.1 Anchor 设置
+
+YOLOv5 是 Anchor-based 的目标检测算法,其 Anchor size 的获取方式与 YOLOv3 类似,也是使用聚类获得,其不同之处在于聚类使用的标准不再是基于 IoU 的,而是使用形状上的宽高比作为聚类准则(即 shape-match )。
+
+在用户更换了数据集后,可以使用 MMYOLO 里带有的 Anchor 分析工具,对自己的数据集进行分析,确定合适的 Anchor size。
+
+```shell
+python tools/analysis_tools/optimize_anchors.py ${CONFIG} --algorithm v5-k-means
+ --input-shape ${INPUT_SHAPE [WIDTH HEIGHT]} --output-dir ${OUTPUT_DIR}
+```
+
+然后在 [config 文件](https://github.com/open-mmlab/mmyolo/blob/main/configs/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py) 里修改默认 Anchor size:
+
+```python
+anchors = [[(10, 13), (16, 30), (33, 23)], [(30, 61), (62, 45), (59, 119)],
+           [(116, 90), (156, 198), (373, 326)]]
+```
+
+#### 1.3.2 Bbox 编解码过程
+
+在 Anchor-based 算法中,预测框通常会基于 Anchor 进行变换,然后预测变换量,这对应 GT Bbox 编码过程,而在预测后需要进行 Pred Bbox 解码,还原为真实尺度的 Bbox,这对应 Pred Bbox 解码过程。
+
+在 YOLOv3 中,回归公式为:
+
+```{math}
+b_x=\sigma(t_x)+c_x  \\
+b_y=\sigma(t_y)+c_y  \\
+b_w=a_w\cdot e^{t_w} \\
+b_h=a_h\cdot e^{t_h} \\
+```
+
+公式中,
+
+```{math}
+a_w 代表 Anchor 的宽度 \\
+c_x 代表 Grid 所处的坐标 \\
+\sigma 代表 Sigmoid 公式。
+```
+
+而在 YOLOv5 中,回归公式为:
+
+```{math}
+b_x=(2\cdot\sigma(t_x)-0.5)+c_x   \\
+b_y=(2\cdot\sigma(t_y)-0.5)+c_y   \\
+b_w=a_w\cdot(2\cdot\sigma(t_w))^2   \\
+b_h=a_h\cdot(2\cdot\sigma(t_h))^2
+```
+
+改进之处主要有以下两点:
+
+- 中心点坐标范围从 (0, 1) 调整至 (-0.5, 1.5)
+- 宽高范围从
+
+```{math}
+(0,+\infty)
+```
+
+调整至
+
+```{math}
+(0,4a_{wh})
+```
+
+这个改进具有以下好处:
+
+- **新的中心点设置能更好的预测到 0 和 1**。这有助于更精准回归出 box 坐标。
+
+<div align=center >
+<img alt="image" src="https://user-images.githubusercontent.com/40284075/190546778-83001bac-4e71-4b9a-8de8-bd41146495af.png"/>
+</div>
+
+- 宽高回归公式中 exp(x) 是无界的,这会导致**梯度失去控制**,造成训练不稳定。YOLOv5 中改进后的宽高回归公式优化了此问题。
+
+<div align=center >
+<img alt="image" src="https://user-images.githubusercontent.com/40284075/190546793-5364d6d3-7891-4af3-98e3-9f06970f3163.png"/>
+</div>
+
+#### 1.3.3 匹配策略
+
+在 MMYOLO 设计中,无论网络是 Anchor-based 还是 Anchor-free,**我们统一使用 prior 称呼 Anchor**。
+
+正样本匹配包含以下两步:
+
+**(1) “比例”比较**
+
+将 GT Bbox 的 WH 与 Prior 的 WH 进行“比例”比较。
+
+比较流程:
+
+```{math}
+r_w = w\_{gt} / w\_{pt}    \\
+r_h = h\_{gt} / h\_{pt}    \\
+r_w^{max}=max(r_w, 1/r_w)  \\
+r_h^{max}=max(r_h, 1/r_h)  \\
+r^{max}=max(r_w^{max}, r_h^{max})   \\
+if\ \ r_{max} < prior\_match\_thr:   match!
+```
+
+此处我们用一个 GT Bbox 与 P3 特征图的 Prior 进行匹配的案例进行讲解和图示:
+
+<div align=center >
+<img alt="image" src="https://user-images.githubusercontent.com/40284075/190547195-60d6cd7a-b12a-4c6f-9cc8-13f48c8ab1e0.png"/>
+</div>
+
+prior1 匹配失败的原因是
+
+```{math}
+h\_{gt}\ /\ h\_{prior}\ =\ 4.8\ >\ prior\_match\_thr
+```
+
+**(2) 为步骤 1 中 match 的 GT 分配对应的正样本**
+
+依然沿用上面的例子:
+
+GT Bbox (cx, cy, w, h) 值为 (26, 37, 36, 24),
+
+Prior WH 值为 \[(15, 5), (24, 16), (16, 24)\],在 P3 特征图上,stride 为 8。通过计算,prior2 和 prior3 能够 match。
+
+计算过程如下:
+
+**(2.1) 将 GT Bbox 的中心点坐标对应到 P3 的 grid 上**
+
+```{math}
+GT_x^{center_grid}=26/8=3.25  \\
+GT_y^{center_grid}=37/8=4.625
+```
+
+<div align=center >
+<img alt="image" src="https://user-images.githubusercontent.com/40284075/190549304-020ec19e-6d54-4d40-8f43-f78b8d6948aa.png"/>
+</div>
+
+**(2.2)** 将 GT Bbox 中心点所在的 grid 分成四个象限,**由于中心点落在了左下角的象限当中,那么会将物体的左、下两个 grid 也认为是正样本**
+
+<div align=center >
+<img alt="image" src="https://user-images.githubusercontent.com/40284075/190549310-e5da53e3-eae3-4085-bd0a-1843ac8ca653.png"/>
+</div>
+
+下图展示中心点落到不同位置时的正样本分配情况:
+
+<div align=center >
+<img alt="image" src="https://user-images.githubusercontent.com/40284075/190549613-eb47e70a-a2c1-4729-9fb7-f5ce7007842b.png"/>
+</div>
+
+那么 YOLOv5 的 Assign 方式具体带来了哪些改进?
+
+- 一个 GT Bbox 能够匹配多个 Prior
+
+- 一个 GT Bbox 和一个Prior 匹配时,能分配 1-3 个正样本
+
+- 以上策略能**适度缓解目标检测中常见的正负样本不均衡问题**。
+
+而 YOLOv5 中的回归方式,和 Assign 方式是相互呼应的:
+
+1. 中心点回归方式:
+
+<div align=center >
+<img alt="image" src="https://user-images.githubusercontent.com/40284075/190549684-21776c33-9ef8-4818-9530-14f750a18d63.png"/>
+</div>
+
+2. WH 回归方式:
+
+<div align=center >
+<img alt="image" src="https://user-images.githubusercontent.com/40284075/190549696-3da08c06-753a-4108-be47-64495ea480f2.png"/>
+</div>
+
+### 1.4 Loss 设计
+
+YOLOv5 中总共包含 3 个 Loss,分别为:
+
+- Classes loss:使用的是 BCE loss
+- Objectness loss:使用的是 BCE loss
+- Location loss:使用的是 CIoU loss
+
+三个 loss 按照一定比例汇总:
+
+```{math}
+Loss=\lambda_1L_{cls}+\lambda_2L_{obj}+\lambda_3L_{loc}
+```
+
+P3、P4、P5 层对应的 Objectness loss 按照不同权重进行相加,默认的设置是
+
+```python
+obj_level_weights=[4., 1., 0.4]
+```
+
+```{math}
+L_{obj}=4.0\cdot L_{obj}^{small}+1.0\cdot L_{obj}^{medium}+0.4\cdot L_{obj}^{large}
+```
+
+在复现中我们发现 YOLOv5 中使用的 CIoU 与目前最新官方 CIoU 存在一定的差距,差距体现在 alpha 参数的计算。
+
+官方版本:
+
+参考资料:https://github.com/Zzh-tju/CIoU/blob/master/layers/modules/multibox_loss.py#L53-L55
+
+```python
+alpha = (ious > 0.5).float() * v / (1 - ious + v)
+```
+
+YOLOv5 版本:
+
+```python
+alpha = v / (v - ious + (1 + eps))
+```
+
+这是一个有趣的细节,后续需要测试不同 alpha 计算方式情况下带来的精度差距。
+
+### 1.5 优化策略和训练过程
+
+YOLOv5 对每个优化器的参数组进行非常精细的控制,简单来说包括如下部分。
+
+#### 1.5.1 优化器分组
+
+将优化参数分成 Conv/Bias/BN 三组,在 WarmUp 阶段,不同组采用不同的 lr 以及 momentum 更新曲线。
+同时在 WarmUp 阶段采用的是 iter-based 更新策略,而在非 WarmUp 阶段则变成 epoch-based 更新策略,可谓是 trick 十足。
+
+MMYOLO 中是采用 YOLOv5OptimizerConstructor 优化器构造器实现优化器参数分组。优化器构造器的作用就是对一些特殊的参数组初始化过程进行精细化控制,因此可以很好的满足需求。
+
+而不同的参数组采用不同的调度曲线功能则是通过 YOLOv5ParamSchedulerHook 实现。而不同的参数组采用不同的调度曲线功能则是通过 YOLOv5ParamSchedulerHook 实现。
+
+#### 1.5.2 weight decay 参数自适应
+
+作者针对不同的 batch size 采用了不同的 weight decay 策略,具体来说为:
+
+1. 当训练 batch size \<= 64 时,weight decay 不变
+2. 当训练 batch size > 64 时,weight decay 会根据总 batch size 进行线性缩放
+
+MMYOLO 也是通过 YOLOv5OptimizerConstructor 实现。
+
+#### 1.5.3 梯度累加
+
+为了最大化不同 batch size 情况下的性能,作者设置总 batch size 小于 64 时候会自动开启梯度累加功能。
+
+训练过程和大部分 YOLO 类似,包括如下策略:
+
+1. 没有使用预训练权重
+2. 没有采用多尺度训练策略,同时可以开启 cudnn.benchmark 进一步加速训练
+3. 使用了 EMA 策略平滑模型
+4. 默认采用 AMP 自动混合精度训练
+
+需要特意说明的是:YOLOv5 官方对于 small 模型是采用单卡 v100 训练,bs 为 128,而 m/l/x 等是采用不同数目的多卡实现的,
+这种训练策略不太规范,**为此在 MMYOLO 中全部采用了 8 卡,每卡 16 bs 的设置,同时为了避免性能差异,训练时候开启了 SyncBN**。
+
+### 1.6 推理和后处理过程
+
+YOLOv5 后处理过程和 YOLOv3 非常类似,实际上 YOLO 系列的后处理逻辑都是类似的。
+
+#### 1.6.1 核心控制参数
+
+1. **multi_label**
+
+对于多类别预测来说需要考虑是否是多标签任务,也就是同一个预测位置会预测的多个类别概率,和是否当作单类处理。因为 YOLOv5 采用 sigmoid 预测模式,在考虑多标签情况下可能会出现一个物体检测出两个不同类别的框,这有助于评估指标 mAP,但是不利于实际应用。
+因此在需要算评估指标时候 multi_label 是 True,而推理或者实际应用时候是 False
+
+2. **score_thr 和 nms_thr**
+
+score_thr 阈值用于过滤类别分值,低于分值的检测框当做背景处理,nms_thr 是 nms 时阈值。同样的,在计算评估指标 mAP 阶段可以将 score_thr 设置的非常低,这通常能够提高召回率,从而提升 mAP,但是对于实际应用来说没有意义,且会导致推理过程极慢。为此在测试和推理阶段会设置不同的阈值
+
+3. **nms_pre 和 max_per_img**
+
+nms_pre 表示 nms 前的最大保留检测框数目,这通常是为了防止 nms 运行时候输入框过多导致速度过慢问题,默认值是 30000。
+max_per_img 表示最终保留的最大检测框数目,通常设置为 300。
+
+以 COCO 80 类为例,假设输入图片大小为 640x640
+
+<div align=center >
+<img alt="image" src="https://user-images.githubusercontent.com/17425982/192942249-96b0fcfb-059f-48fe-862f-7d526a3a06d7.png"/>
+</div>
+
+其推理和后处理过程为:
+
+**(1) 维度变换**
+
+YOLOv5 输出特征图尺度为 80x80、40x40 和 20x20 的三个特征图,每个位置共 3 个 anchor,因此输出特征图通道为 3x(5+80)=255。
+YOLOv5 是非解耦输出头,而其他大部分算法都是解耦输出头,为了统一后处理逻辑,我们提前将其进行解耦,分成了类别预测分支、bbox 预测分支和 obj 预测分支。
+
+将三个不同尺度的类别预测分支、bbox 预测分支和 obj 预测分支进行拼接,并进行维度变换。为了后续方便处理,会将原先的通道维度置换到最后,类别预测分支、bbox 预测分支和 obj 预测分支的 shape 分别为 (b, 3x80x80+3x40x40+3x20x20, 80)=(b,25200,80),(b,25200,4),(b,25200,1)。
+
+**(2) 解码还原到原图尺度**
+
+分类预测分支和 obj 分支需要进行 sigmoid 计算,而 bbox 预测分支需要进行解码,还原为真实的原图解码后 xyxy 格式
+
+**(3) 第一次阈值过滤**
+
+遍历 batch 中的每张图,然后用 score_thr 对类别预测分值进行阈值过滤,去掉低于 score_thr 的预测结果
+
+**(4) 第二次阈值过滤**
+
+将 obj 预测分值和过滤后的类别预测分值相乘,然后依然采用 score_thr 进行阈值过滤。
+在这过程中还需要考虑 **multi_label 和 nms_pre,确保过滤后的检测框数目不会多于 nms_pre**。
+
+**(5) 还原到原图尺度和 nms**
+
+基于前处理过程,将剩下的检测框还原到网络输出前的原图尺度,然后进行 nms 即可。最终输出的检测框不能多于 **max_per_img**。
+
+#### 1.6.2 batch shape 策略
+
+为了加速验证集的推理过程,作者提出了 batch shape 策略,其核心原则是:**确保在 batch 推理过程中同一个 batch 内的图片 pad 像素最少,不要求整个验证过程中所有 batch 的图片尺度一样**。
+
+其大概流程是:将整个测试或者验证数据的宽高比进行排序,然后依据 batch 设置将排序后的图片组成一个 batch,
+同时计算这个 batch 内最佳的 batch shape,防止 pad 像素过多。最佳 batch shape 计算原则为在保持宽高比的情况下进行 pad,不追求正方形图片输出。
+
+```python
+        image_shapes = []
+        for data_info in data_list:
+            image_shapes.append((data_info['width'], data_info['height']))
+
+        image_shapes = np.array(image_shapes, dtype=np.float64)
+
+        n = len(image_shapes)  # number of images
+        batch_index = np.floor(np.arange(n) / self.batch_size).astype(
+            np.int64)  # batch index
+        number_of_batches = batch_index[-1] + 1  # number of batches
+
+        aspect_ratio = image_shapes[:, 1] / image_shapes[:, 0]  # aspect ratio
+        irect = aspect_ratio.argsort()
+
+        data_list = [data_list[i] for i in irect]
+
+        aspect_ratio = aspect_ratio[irect]
+        # Set training image shapes
+        shapes = [[1, 1]] * number_of_batches
+        for i in range(number_of_batches):
+            aspect_ratio_index = aspect_ratio[batch_index == i]
+            min_index, max_index = aspect_ratio_index.min(
+            ), aspect_ratio_index.max()
+            if max_index < 1:
+                shapes[i] = [max_index, 1]
+            elif min_index > 1:
+                shapes[i] = [1, 1 / min_index]
+
+        batch_shapes = np.ceil(
+            np.array(shapes) * self.img_size / self.size_divisor +
+            self.pad).astype(np.int64) * self.size_divisor
+
+        for i, data_info in enumerate(data_list):
+            data_info['batch_shape'] = batch_shapes[batch_index[i]]
+```
+
+## 2 总结
+
+本文对 YOLOv5 原理和在 MMYOLO 实现进行了详细解析,希望能帮助用户理解算法实现过程。同时请注意:由于 YOLOv5 本身也在不断更新,本开源库也会不断迭代,请及时阅读和同步最新版本。
diff --git a/mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/algorithm_descriptions/yolov6_description.md b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/algorithm_descriptions/yolov6_description.md
new file mode 100644
index 0000000..29bede3
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/algorithm_descriptions/yolov6_description.md
@@ -0,0 +1,452 @@
+# YOLOv6 原理和实现全解析
+
+## 0 简介
+
+<div align=center >
+<img alt="YOLOv6-S" src="https://user-images.githubusercontent.com/58845482/209790152-21c29d42-30cc-4c48-a723-39b198286c4d.png"/>
+图 1:YOLOv6-S 模型结构
+</div>
+
+<div align=center >
+<img alt="YOLOv6-L" src="https://user-images.githubusercontent.com/58845482/209787949-d57691c0-a2ea-4a0a-829f-e8a64ac29c7e.png"/>
+图 2:YOLOv6-L 模型结构
+</div>
+
+以上结构图由 wzr-skn@github 绘制。
+
+YOLOv6 提出了一系列适用于各种工业场景的模型,包括 N/T/S/M/L,考虑到模型的大小,其架构有所不同,以获得更好的精度-速度权衡。本算法专注于检测的精度和推理效率,并在网络结构、训练策略等算法层面进行了多项改进和优化。
+
+简单来说 YOLOv6 开源库的主要特点为:
+
+1. 统一设计了更高效的 Backbone 和 Neck:受到硬件感知神经网络设计思想的启发,基于 RepVGG style 设计了可重参数化、更高效的骨干网络 EfficientRep Backbone 和 Rep-PAN Neck。
+2. 相比于 YOLOX 的 Decoupled Head,进一步优化设计了简洁有效的 Efficient Decoupled Head,在维持精度的同时,降低了一般解耦头带来的额外延时开销。
+3. 在训练策略上,采用 Anchor-free 的策略,同时辅以 SimOTA 标签分配策略以及 SIoU 边界框回归损失来进一步提高检测精度。
+
+本文将从 YOLOv6 算法本身原理讲起,然后重点分析 MMYOLO 中的实现。关于 YOLOv6 的使用指南和速度等对比请阅读本文的后续内容。
+
+希望本文能够成为你入门和掌握 YOLOv6 的核心文档。由于 YOLOv6 本身也在不断迭代更新,我们也会不断的更新本文档。请注意阅读最新版本。
+
+MMYOLO 实现配置:https://github.com/open-mmlab/mmyolo/blob/main/configs/yolov6/
+
+YOLOv6 官方开源库地址:https://github.com/meituan/YOLOv6
+
+## 1 YOLOv6 2.0 算法原理和 MMYOLO 实现解析
+
+YOLOv6 2.0 官方 release 地址:https://github.com/meituan/YOLOv6/releases/tag/0.2.0
+
+<div align=center >
+<img alt="YOLOv6精度图" src="https://github.com/meituan/YOLOv6/blob/main/assets/speed_comparision_v2.png"/>
+</div>
+
+<div align=center >
+<img alt="YOLOv6精度速度图" src="https://user-images.githubusercontent.com/25873202/201611723-0d3d02be-d778-4bdd-8010-fbcb9df8740e.png"/>
+</div>
+
+YOLOv6 和 YOLOv5 一样也可以分成数据增强、模型结构、loss 计算等组件,如下所示:
+
+<div align=center >
+<img alt="训练测试策略" src="https://user-images.githubusercontent.com/40284075/190542423-f6b20d8e-c82a-4a34-9065-c161c5e29e7c.png"/>
+</div>
+
+下面将从原理和结合 MMYOLO 的具体实现方面进行简要分析。
+
+### 1.1 数据增强模块
+
+YOLOv6 目标检测算法中使用的数据增强与 YOLOv5 基本一致,唯独不一样的是没有使用 Albu 的数据增强方式:
+
+- **Mosaic 马赛克**
+- **RandomAffine 随机仿射变换**
+- **MixUp**
+- ~~**图像模糊等采用 Albu 库实现的变换**~~
+- **HSV 颜色空间增强**
+- **随机水平翻转**
+
+关于每一个增强的详细解释,详情请看 [YOLOv5 数据增强模块](yolov5_description.md)
+
+另外,YOLOv6 参考了 YOLOX 的数据增强方式,分为 2 种增强方法组,一开始和 YOLOv5 一致,但是在最后 15 个 epoch 的时候将 `Mosaic` 使用 `YOLOv5KeepRatioResize` + `LetterResize` 替代了,个人感觉是为了拟合真实情况。
+
+### 1.2 网络结构
+
+YOLOv6 N/T/S 模型的网络结构由 `EfficientRep` + `Rep-PAN` + `Efficient decoupled Head` 构成,M/L 模型的网络结构则由 `CSPBep` + `CSPRepPAFPN` +  `Efficient decoupled Head` 构成。其中,Backbone 和 Neck 部分的结构与 YOLOv5 较为相似,但不同的是其采用了重参数化结构 `RepVGG Block` 替换掉了原本的 `ConvModule`,在此基础上,将 `CSPLayer` 改进为了多个 `RepVGG` 堆叠的 `RepStageBlock`(N/T/S 模型)或 `BepC3StageBlock`(M/L 模型);Head 部分则参考了 FCOS 和 YOLOX 的检测头,将回归与分类分支解耦成两个分支进行预测。YOLOv6-S 和 YOLOv6-L 整体结构分别如图 1 和图 2 所示。
+
+#### 1.2.1 Backbone
+
+已有研究表明,多分支的网络结构通常比单分支网络性能更加优异,例如 YOLOv5 的 `CSPDarknet`,但是这种结构会导致并行度降低进而增加推理延时;相反,类似于 `VGG` 的单分支网络则具有并行度高、内存占用小的优点,因此推理效率更高。而 `RepVGG` 则同时具备上述两种结构的优点,在训练时可解耦成多分支拓扑结构提升模型精度,实际部署时可等效融合为单个 3×3 卷积提升推理速度,`RepVGG` 示意图如下。因此,YOLOv6 基于 `RepVGG` 重参数化结构设计了高效的骨干网络 `EfficientRep` 和 `CSPBep`,其可以充分利用硬件算力,提升模型表征能力的同时降低推理延时。
+
+<img src="https://user-images.githubusercontent.com/58845482/209788313-05e3870b-9b25-4dbb-89c8-7c9502c84577.png" alt="image" style="zoom: 40%;" />
+
+在 N/T/S 模型中,YOLOv6 使用了 `EfficientRep` 作为骨干网络,其包含 1 个 `Stem Layer` 和 4 个 `Stage Layer`,具体细节如下:
+
+- `Stem Layer` 中采用 stride=2 的 `RepVGGBlock` 替换了 stride=2 的 6×6 `ConvModule`。
+- `Stage Layer` 结构与 YOLOv5 基本相似,将每个 `Stage layer` 的 1 个 `ConvModule` 和 1 个 `CSPLayer` 分别替换为 1 个 `RepVGGBlock` 和 1 个 `RepStageBlock`,如上图 Details 部分所示。其中,第一个 `RepVGGBlock` 会做下采样和 `Channel` 维度变换,而每个 `RepStageBlock` 则由 n 个 `RepVGGBlock` 组成。此外,仍然在第 4 个 `Stage Layer` 最后增加 `SPPF` 模块后输出。
+
+在 M/L 模型中,由于模型容量进一步增大,直接使用多个 `RepVGGBlock` 堆叠的 `RepStageBlock` 结构计算量和参数量呈现指数增长。因此,为了权衡计算负担和模型精度,在 M/L 模型中使用了 `CSPBep` 骨干网络,其采用 `BepC3StageBlock` 替换了小模型中的 `RepStageBlock` 。如下图所示,`BepC3StageBlock` 由 3 个 1×1 的 `ConvModule` 和多个子块(每个子块由两个 `RepVGGBlock` 残差连接)组成。
+
+<img src="https://user-images.githubusercontent.com/58845482/208235469-a85865a5-5d15-435d-bb74-0be6f56dd03f.png" alt="image" style="zoom: 67%;" />
+
+#### 1.2.2 Neck
+
+Neck 部分结构仍然在 YOLOv5 基础上进行了模块的改动,同样采用 `RepStageBlock` 或 `BepC3StageBlock` 对原本的 `CSPLayer` 进行了替换,需要注意的是,Neck 中 `Down Sample` 部分仍然使用了 stride=2 的 3×3 `ConvModule`,而不是像 Backbone 一样替换为 `RepVGGBlock`。
+
+#### 1.2.3 Head
+
+不同于传统的 YOLO 系列检测头,YOLOv6 参考了 FCOS 和 YOLOX 中的做法,将分类和回归分支解耦成两个分支进行预测并且去掉了 obj 分支。同时,采用了 hybrid-channel 策略构建了更高效的解耦检测头,将中间 3×3 的 `ConvModule` 减少为 1 个,在维持精度的同时进一步减少了模型耗费,降低了推理延时。此外,需要说明的是,YOLOv6 在 Backobone 和 Neck 部分使用的激活函数是 `ReLU`,而在 Head 部分则使用的是 `SiLU`。
+
+由于 YOLOv6 是解耦输出,分类和 bbox 检测通过不同卷积完成。以 COCO 80 类为例:
+
+- P5 模型在输入为 640x640 分辨率情况下,其 Head 模块输出的 shape 分别为 `(B,4,80,80)`, `(B,80,80,80)`, `(B,4,40,40)`, `(B,80,40,40)`, `(B,4,20,20)`, `(B,80,20,20)`。
+
+### 1.3 正负样本匹配策略
+
+YOLOv6 采用的标签匹配策略与 [TOOD](https://arxiv.org/abs/2108.07755)
+相同, 前 4 个 epoch 采用 `ATSSAssigner` 作为标签匹配策略的 `warm-up` ,
+后续使用 `TaskAlignedAssigner` 算法选择正负样本, 基于官方开源代码,  `MMYOLO` 中也对两个 assigner 算法进行了优化, 改进为 `Batch` 维度进行计算,
+能够一定程度的加快速度。 下面会对每个部分进行详细说明。
+
+#### 1.3.1 Anchor 设置
+
+YOLOv6 采用与 YOLOX 一样的 Anchor-free 无锚范式,省略了聚类和繁琐的 Anchor 超参设定,泛化能力强,解码逻辑简单。在训练的过程中会根据 feature size 去自动生成先验框。
+
+使用 `mmdet.MlvlPointGenerator` 生成 anchor points。
+
+```python
+prior_generator: ConfigType = dict(
+                     type='mmdet.MlvlPointGenerator',
+                     offset=0.5, # 网格中心点
+                     strides=[8, 16, 32]) ,
+
+# 调用生成多层 anchor points: list[torch.Tensor]
+# 每一层都是 (featrue_h*feature_w,4), 4 表示 (x,y,stride_h,stride_w)
+self.mlvl_priors = self.prior_generator.grid_priors(
+                self.featmap_sizes,
+                with_stride=True)
+```
+
+#### 1.3.2 Bbox 编解码过程
+
+YOLOv6 的 BBox Coder 采用的是 `DistancePointBBoxCoder`。
+
+网络 bbox 预测的值为 (top, bottom, left, right),解码器将 `anchor point` 通过四个距离解码到坐标 (x1,y1,x2,y2)。
+
+MMYOLO 中解码的核心源码:
+
+```python
+def decode(points: torch.Tensor, pred_bboxes: torch.Tensor, stride: torch.Tensor) -> torch.Tensor:
+    """
+        将预测值解码转化 bbox 的 xyxy
+        points (Tensor): 生成的 anchor point [x, y],Shape (B, N, 2) or (N, 2).
+        pred_bboxes (Tensor): 预测距离四边的距离。(left, top, right, bottom). Shape (B, N, 4) or (N, 4)
+        stride (Tensor): 特征图下采样倍率.
+    """
+    # 首先将预测值转化为原图尺度
+    distance = pred_bboxes * stride[None, :, None]
+    # 根据点以及到四条边距离转为 bbox 的 x1y1x2y2
+    x1 = points[..., 0] - distance[..., 0]
+    y1 = points[..., 1] - distance[..., 1]
+    x2 = points[..., 0] + distance[..., 2]
+    y2 = points[..., 1] + distance[..., 3]
+
+    bboxes = torch.stack([x1, y1, x2, y2], -1)
+
+    return bboxes
+```
+
+#### 1.3.3 匹配策略
+
+- 0 \<= epoch \< 4,使用 `BatchATSSAssigner`
+- epoch >= 4,使用 `BatchTaskAlignedAssigner`
+
+#### ATSSAssigner
+
+ATSSAssigner 是 [ATSS](https://arxiv.org/abs/1912.02424) 中提出的标签匹配策略。
+ATSS 的匹配策略简单总结为:**通过中心点距离先验对样本进行初筛,然后自适应生成 IoU 阈值筛选正样本。**
+YOLOv6 的实现种主要包括如下三个核心步骤:
+
+1. 因为 YOLOv6 是 Anchor-free,所以首先将 `anchor point` 转化为大小为 `5*strdie` 的 `anchor`。
+2. 对于每一个 `GT`,在 `FPN` 的每一个特征层上, 计算与该层所有 `anchor` 中心点距离(位置先验),
+   然后优先选取距离 `topK` 近的样本,作为 **初筛样本**。
+3. 对于每一个 `GT`,计算其 **初筛样本** 的 `IoU` 的均值 `mean`与标准差 `std`,将 `mean + std`
+   作为该 `GT` 的正样本的 **自适应 IoU 阈值** ,大于该 **自适应阈值** 且中心点在 `GT` 内部的 `anchor`
+   才作为正样本,使得样本能够被 `assign` 到合适的 `FPN` 特征层上。
+
+下图中,(a) 所示中等大小物体被 assign 到 FPN 的中层,(b) 所示偏大的物体被 assign 到 FPN 中检测大物体和偏大物体的两个层。
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/52028100/204796892-6df4fb85-e2cf-4d84-b85f-d8e8efccc644.png" alt="image"/>
+</div>
+
+```python
+# 1. 首先将anchor points 转化为 anchors
+# priors为(point_x,point_y,stride_w,stride_h), shape 为(N,4)
+cell_half_size = priors[:, 2:] * 2.5
+priors_gen = torch.zeros_like(priors)
+priors_gen[:, :2] = priors[:, :2] - cell_half_size
+priors_gen[:, 2:] = priors[:, :2] + cell_half_size
+priors = priors_gen
+# 2. 计算 anchors 与 GT 的 IoU
+overlaps = self.iou_calculator(gt_bboxes.reshape([-1, 4]), priors)
+# 3. 计算 anchor 与 GT 的中心距离
+distances, priors_points = bbox_center_distance(
+        gt_bboxes.reshape([-1, 4]), priors)
+# 4. 根据中心点距离,在 FPN 的每一层选取 TopK 临近的样本作为初筛样本
+is_in_candidate, candidate_idxs = self.select_topk_candidates(
+        distances, num_level_priors, pad_bbox_flag)
+# 5. 对于每一个 GT 计算其对应初筛样本的均值与标准差的和, 作为该GT的样本阈值
+overlaps_thr_per_gt, iou_candidates = self.threshold_calculator(
+        is_in_candidate, candidate_idxs, overlaps, num_priors, batch_size,
+        num_gt)
+# 6. 筛选大于阈值的样本作为正样本
+is_pos = torch.where(
+        iou_candidates > overlaps_thr_per_gt.repeat([1, 1, num_priors]),
+        is_in_candidate, torch.zeros_like(is_in_candidate))
+# 6. 保证样本中心点在 GT 内部且不超图像边界
+pos_mask = is_pos * is_in_gts * pad_bbox_flag
+```
+
+#### TaskAlignedAssigner
+
+TaskAlignedAssigner 是 [TOOD](https://arxiv.org/abs/2108.07755) 中提出的一种动态样本匹配策略。
+由于 `ATSSAssigner` 是属于静态标签匹配策略,其选取正样本的策略主要根据 `anchor` 的位置进行挑选,
+并不会随着网络的优化而选取到更好的样本。在目标检测中,分类和回归的任务最终作用于同一个目标,所以
+`TaskAlignedAssigner` 认为样本的选取应该更加关注到对分类以及回归都友好的样本点。
+
+`TaskAlignedAssigner` 的匹配策略简单总结为: **根据分类与回归的分数加权的分数选择正样本**。
+
+1. 对于每一个 `GT`,对所有的 `预测框` 基于 **GT类别对应分类分数** 与 **预测框与 GT 的 IoU** 的加权得到一个关联分类以及回归的对齐分数 `alignment_metrics`。
+2. 对于每一个 `GT`,直接基于 `alignment_metrics` 对齐分数选取 `topK` 大的作为正样本。
+
+因为在网络初期参数随机, `分类分数` 和 `预测框与 GT 的 IoU` 都不准确,所以需要经过前 4 个 `epoch` 的 `ATSSAssigner`
+的 `warm-up`。经过预热之后的 `TaskAlignedAssigner` 标签匹配策略就不使用中心距离的先验,
+而是直接对每一个`GT` 选取 `alignment_metrics` 中 `topK` 大的样本作为正样本。
+
+```python
+# 1. 基于分类分数与回归的 IoU 计算对齐分数 alignment_metrics
+alignment_metrics = bbox_scores.pow(self.alpha) * overlaps.pow(
+            self.beta)
+# 2. 保证中心点在 GT 内部的 mask
+is_in_gts = select_candidates_in_gts(priors, gt_bboxes)
+# 3. 选取 TopK 大的对齐分数的样本
+topk_metric = self.select_topk_candidates(
+            alignment_metrics * is_in_gts,
+            topk_mask=pad_bbox_flag.repeat([1, 1, self.topk]).bool())
+```
+
+### 1.4 Loss 设计
+
+参与 Loss 计算的共有两个值:loss_cls 和 loss_bbox,其各自使用的 Loss 方法如下:
+
+- Classes loss:使用的是 `mmdet.VarifocalLoss`
+- BBox loss:l/m/s使用的是 `GIoULoss`,  t/n 用的是 `SIoULoss`
+
+权重比例是:`loss_cls` : `loss_bbox` = `1 : 2.5`
+
+#### 分类损失函数 VarifocalLoss
+
+Varifocal Loss (VFL) 是 [VarifocalNet: An IoU-aware Dense Object Detector](https://arxiv.org/abs/2008.13367)
+中的损失函数。
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/52028100/204796751-3b1ed7d7-9185-4894-9832-147f84220cdf.png" alt="image"/>
+</div>
+
+`VFL` 是在 `GFL` 的基础上做的改进,`GFL`详情请看 [GFL详解](rtmdet_description.md)
+
+在上述标签匹配策略中提到过选择样本应该优先考虑分类回归都友好的样本点,
+这是由于目标检测包含的分类与回归两个子任务都是作用于同一个物体。
+与 `GFL` 思想相同,都是将 **预测框与 `GT` 的 `IoU` 软化作为分类的标签**,使得分类分数关联回归质量,
+使其在后处理 NMS 阶段有**分类回归一致性很强的分值排序策略**,以达到选取优秀预测框的目的。
+
+Varifocal Loss 原本的公式:
+
+```{math}
+{VFL}(p,q)= \begin{cases}
+-q(qlog(p) +(1-q)log(1-p)), &  q > 0 \\
+-\alpha p^\gamma log(1-p), &  q = 0
+\end{cases}
+```
+
+其中 {math}`q` 是预测 `bboxes` 与 `GT` 的 `IoU`,使用软标签的形式作为分类的标签。
+{math}`p\in[0,1]` 表示分类分数。
+
+1. 对于负样本,即当 {math}`q = 0` 时,标准交叉熵部分为 {math}`-\log(p)`,负样本权重使用 {math}`\alpha p^\gamma` 作为 `focal weight`
+   使样本聚焦与困难样本上,这与 `Focal Loss` 基本一致。
+2. 对于正样本,即当 {math}`q > 0` 时,首先计算标准二值交叉熵部分 {math}`-(qlog(p) +(1-q)log(1-p))`,
+   但是针对正样本的权重设置,`Varifocal Loss` 中并没有采用类似 {math}`\alpha p^\gamma`的方式降权,
+   而是认为在网络的学习过程中正样本相对于负样本的学习信号来说更为重要,所以使用了分类的标签 {math}`q`,
+   即 `IoU` 作为 `focal weight`, 使得聚焦到具有高质量的样本上。
+
+但是 YOLOv6 中的 Varifocal Loss 公式采用 `TOOD` 中的 `Task ALignment Learning (TAL)`,
+将预测的 `IoU` 根据之前标签匹配策略中的分类对齐度 `alignment_metrics` 进行了归一化,
+得到归一化 {math}`\hat{t}`。
+具体实现方式为:
+
+对于每一个 `Gt`,找到所有样本中与 `Gt` 最大的 `IoU`,具有最大 `alignment_metrics` 的样本位置的 {math}`\hat{t} = max(Iou)`
+
+```{math}
+\hat{t} = AlignmentMetrics / max(AlignmentMetrics) * max(IoU)
+```
+
+最终 YOLOv6 分类损失损失函数为:
+
+```{math}
+{VFL}(p,\hat{t})= \begin{cases}
+-\hat{t}(\hat{t}log(p) +(1-\hat{t})log(1-p)), &  \hat{t} > 0 \\
+-\alpha p^\gamma log(1-p), &  \hat{t} = 0
+\end{cases}
+```
+
+MMDetection 实现源码的核心部分:
+
+```python
+def varifocal_loss(pred, target, alpha=0.75, gamma=2.0, iou_weighted=True):
+    """
+        pred (torch.Tensor): 预测的分类分数,形状为 (B,N,C) , N 表示 anchor 数量, C 表示类别数
+        target (torch.Tensor): 经过对齐度归一化后的 IoU 分数,形状为 (B,N,C),数值范围为 0~1
+        alpha (float, optional): 调节正负样本之间的平衡因子,默认 0.75.
+        gamma (float, optional): 负样本 focal 权重因子, 默认 2.0.
+        iou_weighted (bool, optional): 正样本是否用 IoU 加权
+    """
+    pred_sigmoid = pred.sigmoid()
+    target = target.type_as(pred)
+    if iou_weighted:
+        # 计算权重,正样本(target > 0)中权重为 target,
+        # 负样本权重为 alpha*pred_simogid^2
+        focal_weight = target * (target > 0.0).float() + \
+            alpha * (pred_sigmoid - target).abs().pow(gamma) * \
+            (target <= 0.0).float()
+    else:
+        focal_weight = (target > 0.0).float() + \
+            alpha * (pred_sigmoid - target).abs().pow(gamma) * \
+            (target <= 0.0).float()
+    # 计算二值交叉熵后乘以权重
+    loss = F.binary_cross_entropy_with_logits(
+        pred, target, reduction='none') * focal_weight
+    loss = weight_reduce_loss(loss, weight, reduction, avg_factor)
+    return loss
+```
+
+#### 回归损失函数 GIoU Loss / SIoU Loss
+
+在 YOLOv6 中,针对不同大小的模型采用了不同的回归损失函数,其中 l/m/s使用的是 `GIoULoss`,  t/n 用的是 `SIoULoss`。
+
+其中` GIoULoss` 详情请看 [GIoU详解](rtmdet_description.md)。
+
+##### SIou Loss
+
+SIoU 损失函数是 [SIoU Loss: More Powerful Learning for Bounding Box Regression](https://arxiv.org/pdf/2205.12740.pdf)
+中提出的度量预测框与 `GT` 的匹配度的指标,由于之前的`GIoU`, `CIoU`, `DIoU` 都没有考虑预测框向 `GT`
+框回归的角度,然而角度也确实是回归中一个重要的影响因素,因此提出了全新的`SIoU`。
+
+SIoU 损失主要由四个度量方面组成:
+
+- IoU成本
+- 角度成本
+- 距离成本
+- 形状成本
+
+如下图所示,**角度成本** 就是指图中预测框 {math}`B` 向 {math}`B^{GT}` 的回归过程中,
+尽可能去使得优化过程中的不确定性因素减少,比如现将图中的角度 {math}`\alpha` 或者 {math}`\beta`
+变为 0 ,再去沿着 `x` 轴或者 `y` 轴去回归边界。
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/52028100/207532021-6a4660bf-be94-4c21-a608-a44fc3b3ccb8.png" alt="image"/>
+</div>
+
+MMYOLO 实现源码的核心部分:
+
+```python
+
+def bbox_overlaps(bboxes1, bboxes2, mode='siou', is_aligned=False, eps=1e-6):
+    # 两个box的顶点x1,y1,x2,y2
+    bbox1_x1, bbox1_y1 = pred[:, 0], pred[:, 1]
+    bbox1_x2, bbox1_y2 = pred[:, 2], pred[:, 3]
+    bbox2_x1, bbox2_y1 = target[:, 0], target[:, 1]
+    bbox2_x2, bbox2_y2 = target[:, 2], target[:, 3]
+    # 交集
+    overlap = (torch.min(bbox1_x2, bbox2_x2) -
+               torch.max(bbox1_x1, bbox2_x1)).clamp(0) * \
+              (torch.min(bbox1_y2, bbox2_y2) -
+               torch.max(bbox1_y1, bbox2_y1)).clamp(0)
+    # 并集
+    w1, h1 = bbox1_x2 - bbox1_x1, bbox1_y2 - bbox1_y1
+    w2, h2 = bbox2_x2 - bbox2_x1, bbox2_y2 - bbox2_y1
+    union = (w1 * h1) + (w2 * h2) - overlap + eps
+    # IoU = 交集/并集
+    ious = overlap / union
+    # 最小外界矩的宽高
+    enclose_x1y1 = torch.min(pred[:, :2], target[:, :2])
+    enclose_x2y2 = torch.max(pred[:, 2:], target[:, 2:])
+    enclose_wh = (enclose_x2y2 - enclose_x1y1).clamp(min=0)
+    enclose_w = enclose_wh[:, 0]  # enclose_w
+    enclose_h = enclose_wh[:, 1]  # enclose_h
+    elif iou_mode == 'siou':
+        # 1.计算 σ (两个box中心点距离):
+        # sigma_cw,sigma_ch:上图中cw,ch
+        sigma_cw = (bbox2_x1 + bbox2_x2) / 2 - (bbox1_x1 + bbox1_x2) / 2 + eps
+        sigma_ch = (bbox2_y1 + bbox2_y2) / 2 - (bbox1_y1 + bbox1_y2) / 2 + eps
+        sigma = torch.pow(sigma_cw**2 + sigma_ch**2, 0.5)
+
+        # 2. 在 α 和 β 中选择一个小的角度(小于π/4)去优化
+        sin_alpha = torch.abs(sigma_ch) / sigma
+        sin_beta = torch.abs(sigma_cw) / sigma
+        sin_alpha = torch.where(sin_alpha <= math.sin(math.pi / 4), sin_alpha,
+                                sin_beta)
+
+        # 角度损失 = 1 - 2 * ( sin^2 ( arcsin(x) - (π / 4) ) ) = cos(2α-π/2) = sin(2α)
+        # 这里就是角度损失,当 α=0 或者 α=90° 时损失为 0, 当 α=45° 损失为 1
+        angle_cost = torch.cos(torch.arcsin(sin_alpha) * 2 - math.pi / 2)
+
+        # 3.这里将角度损失与距离损失进行融合
+        # Distance cost = Σ_(t=x,y) (1 - e ^ (- γ ρ_t))
+        rho_x = (sigma_cw / enclose_w)**2  # ρ_x:x轴中心点距离距离损失
+        rho_y = (sigma_ch / enclose_h)**2  # ρ_y:y轴中心点距离距离损失
+        gamma = 2 - angle_cost  # γ
+        # 当 α=0, angle_cost=0, gamma=2, dis_cost_x =  1 - e ^ (-2 p_x),因为 ρ_x>0, 主要优化距离
+        # 当 α=45°,angle_cost=1, gamma=1, dis_cost_x =  1 - e ^ (-1* p_x),因为 ρ_x<1, 主要优化角度
+        distance_cost = (1 - torch.exp(-1 * gamma * rho_x)) + (
+            1 - torch.exp(-1 * gamma * rho_y))
+
+        # 4.形状损失 就是两个box之间的宽高比
+        # Shape cost = Ω = Σ_(t=w,h) ( ( 1 - ( e ^ (-ω_t) ) ) ^ θ )
+        omiga_w = torch.abs(w1 - w2) / torch.max(w1, w2)  # ω_w
+        omiga_h = torch.abs(h1 - h2) / torch.max(h1, h2)  # ω_h
+        shape_cost = torch.pow(1 - torch.exp(-1 * omiga_w),
+                               siou_theta) + torch.pow(
+                                   1 - torch.exp(-1 * omiga_h), siou_theta)
+
+        # 5.综合 IoU、角度、距离以及形状信息
+        # SIoU = IoU - ( (Distance Cost + Shape Cost) / 2 )
+        ious = ious - ((distance_cost + shape_cost) * 0.5)
+
+    return ious.clamp(min=-1.0, max=1.0)
+
+@weighted_loss
+def siou_loss(pred, target, eps=1e-7):
+    sious = bbox_overlaps(pred, target, mode='siou', is_aligned=True, eps=eps)
+    loss = 1 - sious
+    return loss
+```
+
+#### Object Loss
+
+在 YOLOv6 中,由于额外的置信度预测头可能与 `Aligned Head` 有所冲突,经实验验证在不同大小的模型上也都有掉点,
+所以最后选择弃用 `Objectness` 分支。
+
+### 1.5 优化策略和训练过程
+
+#### 1.5.1 优化器分组
+
+与 YOLOv5 一致,详情请看 [YOLOv5 优化器分组](yolov5_description.md)
+
+#### 1.5.2 weight decay 参数自适应
+
+与 YOLOv5 一致,详情请看 [YOLOv5 weight decay 参数自适应](yolov5_description.md)
+
+### 1.6 推理和后处理过程
+
+YOLOv6 后处理过程和 YOLOv5 高度类似,实际上 YOLO 系列的后处理逻辑都是类似的。
+详情请看 [YOLOv5 推理和后处理过程](yolov5_description.md)
+
+## 2 总结
+
+本文对 YOLOv6 原理和在 MMYOLO 实现进行了详细解析,希望能帮助用户理解算法实现过程。同时请注意:由于 YOLOv6 本身也在不断更新,本开源库也会不断迭代,请及时阅读和同步最新版本。
diff --git a/mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/algorithm_descriptions/yolov8_description.md b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/algorithm_descriptions/yolov8_description.md
new file mode 100644
index 0000000..fb5e218
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/algorithm_descriptions/yolov8_description.md
@@ -0,0 +1,244 @@
+# YOLOv8 原理和实现全解析
+
+## 0 简介
+
+<div align=center >
+<img alt="YOLOv8-P5_structure" src="https://user-images.githubusercontent.com/27466624/222869864-1955f054-aa6d-4a80-aed3-92f30af28849.jpg"/>
+图 1:YOLOv8-P5 模型结构
+</div>
+
+以上结构图由 RangeKing@github 绘制。
+
+YOLOv8 是 Ultralytics 公司在 2023 年 1月 10 号开源的 YOLOv5 的下一个重大更新版本,目前支持图像分类、物体检测和实例分割任务,在还没有开源时就收到了用户的广泛关注。
+
+按照官方描述,YOLOv8 是一个 SOTA 模型,它建立在以前 YOLO 版本的成功基础上,并引入了新的功能和改进,以进一步提升性能和灵活性。具体创新包括一个新的骨干网络、一个新的 Ancher-Free 检测头和一个新的损失函数,可以在从 CPU 到 GPU 的各种硬件平台上运行。
+不过 Ultralytics 并没有直接将开源库命名为 YOLOv8,而是直接使用 Ultralytics 这个词,原因是 Ultralytics 将这个库定位为算法框架,而非某一个特定算法,一个主要特点是可扩展性。其希望这个库不仅仅能够用于 YOLO 系列模型,而是能够支持非 YOLO 模型以及分类分割姿态估计等各类任务。
+总而言之,Ultralytics 开源库的两个主要优点是:
+
+- **融合众多当前 SOTA 技术于一体**
+- **未来将支持其他 YOLO 系列以及 YOLO 之外的更多算法**
+
+<div align=center >
+<img alt="YOLOv8-table" src="https://user-images.githubusercontent.com/17425982/212007736-f592bc70-3959-4ff6-baf7-a93c7ad1d882.png"/>
+图 2:YOLOv8 性能曲线
+</div>
+
+下表为官方在 COCO Val 2017 数据集上测试的 mAP、参数量和 FLOPs 结果。可以看出 YOLOv8 相比 YOLOv5 精度提升非常多,但是 N/S/M 模型相应的参数量和 FLOPs 都增加了不少,从上图也可以看出相比 YOLOV5 大部分模型推理速度变慢了。
+
+| **模型** | **YOLOv5**  | **params(M)** | **FLOPs@640 (B)** | **YOLOv8**  | **params(M)** | **FLOPs@640 (B)** |
+| -------- | ----------- | ------------- | ----------------- | ----------- | ------------- | ----------------- |
+| n        | 28.0(300e)  | 1.9           | 4.5               | 37.3 (500e) | 3.2           | 8.7               |
+| s        | 37.4 (300e) | 7.2           | 16.5              | 44.9 (500e) | 11.2          | 28.6              |
+| m        | 45.4 (300e) | 21.2          | 49.0              | 50.2 (500e) | 25.9          | 78.9              |
+| l        | 49.0 (300e) | 46.5          | 109.1             | 52.9 (500e) | 43.7          | 165.2             |
+| x        | 50.7 (300e) | 86.7          | 205.7             | 53.9 (500e) | 68.2          | 257.8             |
+
+额外提一句,现在各个 YOLO 系列改进算法都在 COCO 上面有明显性能提升,但是在自定义数据集上面的泛化性还没有得到广泛验证,至今依然听到不少关于 YOLOv5 泛化性能较优异的说法。**对各系列 YOLO 泛化性验证也是 MMYOLO 中一个特别关心和重点发力的方向。**
+
+阅读本文前,如果你对 YOLOv5、YOLOv6 和 RTMDet 不熟悉,可以先看下如下文档:
+
+1. [YOLOv5 原理和实现全解析](https://mmyolo.readthedocs.io/zh_CN/latest/algorithm_descriptions/yolov5_description.html)
+2. [YOLOv6 原理和实现全解析](https://mmyolo.readthedocs.io/zh_CN/latest/algorithm_descriptions/yolov6_description.html)
+3. [RTMDet 原理和实现全解析](https://mmyolo.readthedocs.io/zh_CN/latest/algorithm_descriptions/rtmdet_description.html)
+
+## 1 YOLOv8 概述
+
+YOLOv8 算法的核心特性和改动可以归结为如下:
+
+1. **提供了一个全新的 SOTA 模型,包括 P5 640 和 P6 1280 分辨率的目标检测网络和基于 YOLACT 的实例分割模型。和 YOLOv5 一样,基于缩放系数也提供了 N/S/M/L/X 尺度的不同大小模型,用于满足不同场景需求**
+2. **骨干网络和 Neck 部分可能参考了 YOLOv7 ELAN 设计思想,将 YOLOv5 的 C3 结构换成了梯度流更丰富的 C2f 结构,并对不同尺度模型调整了不同的通道数,属于对模型结构精心微调,不再是无脑一套参数应用所有模型,大幅提升了模型性能。不过这个 C2f 模块中存在 Split 等操作对特定硬件部署没有之前那么友好了**
+3. **Head 部分相比 YOLOv5 改动较大,换成了目前主流的解耦头结构,将分类和检测头分离,同时也从 Anchor-Based 换成了 Anchor-Free**
+4. **Loss 计算方面采用了 TaskAlignedAssigner 正样本分配策略,并引入了 Distribution Focal Loss**
+5. **训练的数据增强部分引入了 YOLOX 中的最后 10 epoch 关闭 Mosiac 增强的操作,可以有效地提升精度**
+
+从上面可以看出,YOLOv8 主要参考了最近提出的诸如 YOLOX、YOLOv6、YOLOv7 和 PPYOLOE 等算法的相关设计,本身的创新点不多,偏向工程实践,主推的还是 ultralytics 这个框架本身。
+
+下面将按照模型结构设计、Loss 计算、训练数据增强、训练策略和模型推理过程共 5 个部分详细介绍 YOLOv8 目标检测的各种改进,实例分割部分暂时不进行描述。
+
+## 2 模型结构设计
+
+模型完整图示可以看图 1。
+
+在暂时不考虑 Head 情况下,对比 YOLOv5 和 YOLOv8 的 yaml 配置文件可以发现改动较小。
+
+<div align=center >
+<img alt="yaml" src="https://user-images.githubusercontent.com/17425982/212008977-28c3fc7b-ee00-4d56-b912-d77ded585d78.png"/>
+图 3:YOLOv5 和 YOLOv8 YAML 文件对比
+</div>
+
+左侧为 YOLOv5-s,右侧为 YOLOv8-s
+
+骨干网络和 Neck 的具体变化为:
+
+- 第一个卷积层的 kernel 从 6x6 变成了 3x3
+- 所有的 C3 模块换成 C2f,结构如下所示,可以发现多了更多的跳层连接和额外的 Split 操作
+
+<div align=center >
+<img alt="module" src="https://user-images.githubusercontent.com/17425982/212009208-92f45c23-a024-49bb-a2ee-bb6f87adcc92.png"/>
+图 4:YOLOv5 和 YOLOv8 模块对比
+</div>
+
+- 去掉了 Neck 模块中的 2 个卷积连接层
+- Backbone 中 C2f 的 block 数从 3-6-9-3 改成了 3-6-6-3
+- 查看 N/S/M/L/X 等不同大小模型,可以发现 N/S 和 L/X 两组模型只是改了缩放系数,但是 S/M/L 等骨干网络的通道数设置不一样,没有遵循同一套缩放系数。如此设计的原因应该是同一套缩放系数下的通道设置不是最优设计,YOLOv7 网络设计时也没有遵循一套缩放系数作用于所有模型
+
+Head 部分变化最大,从原先的耦合头变成了解耦头,并且从 YOLOv5 的 Anchor-Based 变成了 Anchor-Free。其结构如下所示:
+
+<div align=center >
+<img alt="head" src="https://user-images.githubusercontent.com/17425982/212009547-189e14aa-6f93-4af0-8446-adf604a46b95.png"/>
+图 5:YOLOv8 Head 结构
+</div>
+
+可以看出,不再有之前的 objectness 分支,只有解耦的分类和回归分支,并且其回归分支使用了 Distribution Focal Loss 中提出的积分形式表示法。
+
+## 3 Loss 计算
+
+Loss 计算过程包括 2 个部分: 正负样本分配策略和 Loss 计算。
+现代目标检测器大部分都会在正负样本分配策略上面做文章,典型的如 YOLOX 的 simOTA、TOOD 的 TaskAlignedAssigner 和 RTMDet 的 DynamicSoftLabelAssigner,这类 Assigner 大都是动态分配策略,而 YOLOv5 采用的依然是静态分配策略。考虑到动态分配策略的优异性,YOLOv8 算法中则直接引用了 TOOD 的 TaskAlignedAssigner。
+TaskAlignedAssigner 的匹配策略简单总结为: 根据分类与回归的分数加权的分数选择正样本。
+
+```{math}
+t=s^\alpha+u^\beta
+```
+
+`s` 是标注类别对应的预测分值,`u` 是预测框和 gt 框的 iou,两者相乘就可以衡量对齐程度。
+
+1. 对于每一个 GT,对所有的预测框基于 GT 类别对应分类分数,预测框与 GT 的 IoU  的加权得到一个关联分类以及回归的对齐分数 `alignment_metrics`
+2. 对于每一个 GT,直接基于 `alignment_metrics` 对齐分数选取 topK 大的作为正样本
+
+Loss 计算包括 2 个分支: **分类和回归分支,没有了之前的 objectness 分支**。
+
+- 分类分支依然采用 BCE Loss
+- 回归分支需要和 Distribution Focal Loss 中提出的积分形式表示法绑定,因此使用了 Distribution Focal Loss, 同时还使用了 CIoU Loss
+
+3 个 Loss 采用一定权重比例加权即可。
+
+## 4 训练数据增强
+
+数据增强方面和 YOLOv5 差距不大,只不过引入了 YOLOX 中提出的最后 10 个 epoch 关闭 Mosaic 的操作。假设训练 epoch 是 500,其示意图如下所示:
+
+<div align=center >
+<img alt="head" src="https://user-images.githubusercontent.com/17425982/212815248-38384da9-b289-468e-8414-ab3c27ee2026.png"/>
+图 6:pipeline
+</div>
+
+考虑到不同模型应该采用的数据增强强度不一样,因此对于不同大小模型,有部分超参会进行修改,典型的如大模型会开启 MixUp 和 CopyPaste。数据增强后典型效果如下所示:
+
+<div align=center >
+<img alt="head" src="https://user-images.githubusercontent.com/17425982/212815840-063524e1-d754-46b1-9efc-61d17c03fd0e.png"/>
+图 7:results
+</div>
+
+上述效果可以运行 [browse_dataset](https://github.com/open-mmlab/mmyolo/blob/dev/tools/analysis_tools/browse_dataset.py) 脚本得到。由于每个 pipeline 都是比较常规的操作,本文不再赘述。如果想了解每个 pipeline 的细节,可以查看 MMYOLO 中 [YOLOv5 的算法解析文档](https://mmyolo.readthedocs.io/zh_CN/latest/algorithm_descriptions/yolov5_description.html#id2) 。
+
+## 5 训练策略
+
+YOLOv8 的训练策略和 YOLOv5 没有啥区别,最大区别就是**模型的训练总 epoch 数从 300 提升到了 500**,这也导致训练时间急剧增加。以 YOLOv8-S 为例,其训练策略汇总如下:
+
+| 配置                   | YOLOv8-s P5 参数                |
+| ---------------------- | ------------------------------- |
+| optimizer              | SGD                             |
+| base learning rate     | 0.01                            |
+| Base weight decay      | 0.0005                          |
+| optimizer momentum     | 0.937                           |
+| batch size             | 128                             |
+| learning rate schedule | linear                          |
+| training epochs        | **500**                         |
+| warmup iterations      | max(1000,3 * iters_per_epochs) |
+| input size             | 640x640                         |
+| EMA decay              | 0.9999                          |
+
+## 6 模型推理过程
+
+YOLOv8 的推理过程和 YOLOv5 几乎一样,唯一差别在于前面需要对 Distribution Focal Loss 中的积分表示 bbox 形式进行解码,变成常规的 4 维度 bbox,后续计算过程就和 YOLOv5 一样了。
+
+以 COCO 80 类为例,假设输入图片大小为 640x640,MMYOLO 中实现的推理过程示意图如下所示:
+
+<div align=center >
+<img alt="head" src="https://user-images.githubusercontent.com/17425982/212816206-33815716-3c12-49a2-9c37-0bd85f941bec.png"/>
+图 8:results
+</div>
+
+其推理和后处理过程为:
+
+**(1) bbox 积分形式转换为 4d bbox 格式**
+
+对 Head 输出的 bbox 分支进行转换,利用 Softmax 和 Conv 计算将积分形式转换为 4 维 bbox 格式
+
+**(2) 维度变换**
+
+YOLOv8 输出特征图尺度为 `80x80`、`40x40` 和 `20x20` 的三个特征图。Head 部分输出分类和回归共 6 个尺度的特征图。
+将 3 个不同尺度的类别预测分支、bbox 预测分支进行拼接,并进行维度变换。为了后续方便处理,会将原先的通道维度置换到最后,类别预测分支 和 bbox 预测分支 shape 分别为 (b, 80x80+40x40+20x20, 80)=(b,8400,80),(b,8400,4)。
+
+**(3) 解码还原到原图尺度**
+
+分类预测分支进行 Sigmoid 计算,而 bbox 预测分支需要进行解码,还原为真实的原图解码后 xyxy 格式。
+
+**(4) 阈值过滤**
+
+遍历 batch 中的每张图,采用 `score_thr` 进行阈值过滤。在这过程中还需要考虑 **multi_label 和 nms_pre,确保过滤后的检测框数目不会多于 nms_pre。**
+
+**(5) 还原到原图尺度和 nms**
+
+基于前处理过程,将剩下的检测框还原到网络输出前的原图尺度,然后进行 nms 即可。最终输出的检测框不能多于 **max_per_img。**
+
+有一个特别注意的点:**YOLOv5 中采用的 Batch shape 推理策略,在 YOLOv8 推理中暂时没有开启,不清楚后面是否会开启,在 MMYOLO 中快速测试了下,如果开启 Batch shape 会涨大概 0.1~0.2。**
+
+## 7 特征图可视化
+
+MMYOLO 中提供了一套完善的特征图可视化工具,可以帮助用户可视化特征的分布情况。 为了和官方性能对齐,此处依然采用官方权重进行可视化。
+
+以 YOLOv8-s 模型为例,第一步需要下载官方权重,然后将该权重通过 [yolov8_to_mmyolo](https://github.com/open-mmlab/mmyolo/blob/dev/tools/model_converters/yolov8_to_mmyolo.py) 脚本将去转换到 MMYOLO 中,注意必须要将脚本置于官方仓库下才能正确运行,假设得到的权重名字为 mmyolov8s.pth。
+
+假设想可视化 backbone 输出的 3 个特征图效果,则只需要
+
+```bash
+cd mmyolo
+python demo/featmap_vis_demo.py demo/demo.jpg configs/yolov8/yolov8_s_syncbn_fast_8xb16-500e_coco.py mmyolov8s.pth --channel-reductio squeeze_mean
+```
+
+需要特别注意,为了确保特征图和图片叠加显示能对齐效果,需要先将原先的 `test_pipeline` 替换为如下:
+
+```Python
+test_pipeline = [
+    dict(
+        type='LoadImageFromFile',
+        backend_args=_base_.backend_args),
+    dict(type='mmdet.Resize', scale=img_scale, keep_ratio=False), # 这里将 LetterResize 修改成 mmdet.Resize
+    dict(type='LoadAnnotations', with_bbox=True, _scope_='mmdet'),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                   'scale_factor'))
+]
+```
+
+<div align=center >
+<img alt="head" src="https://user-images.githubusercontent.com/17425982/212816319-9ac19484-987a-40ac-a0fe-2c13a7048df7.png"/>
+图 9:featmap
+</div>
+
+从上图可以看出**不同输出特征图层主要负责预测不同尺度的物体**。
+
+我们也可以可视化 Neck 层的 3 个输出层特征图:
+
+```bash
+cd mmyolo
+python demo/featmap_vis_demo.py demo/demo.jpg configs/yolov8/yolov8_s_syncbn_fast_8xb16-500e_coco.py mmyolov8s.pth --channel-reductio squeeze_mean --target-layers neck
+```
+
+<div align=center >
+<img alt="head" src="https://user-images.githubusercontent.com/17425982/212816458-a4e4600a-5f50-49c6-864b-0254a2720f3c.png"/>
+图 10:featmap
+</div>
+
+**从上图可以发现物体处的特征更加聚焦。**
+
+## 总结
+
+本文详细分析和总结了最新的 YOLOv8 算法,从整体设计到模型结构、Loss 计算、训练数据增强、训练策略和推理过程进行了详细的说明,并提供了大量的示意图供大家方便理解。
+简单来说 YOLOv8 是一个包括了图像分类、Anchor-Free 物体检测和实例分割的高效算法,检测部分设计参考了目前大量优异的最新的 YOLO 改进算法,实现了新的 SOTA。不仅如此还推出了一个全新的框架。不过这个框架还处于早期阶段,还需要不断完善。
+
+MMYOLO 开源地址: https://github.com/open-mmlab/mmyolo/blob/dev/configs/yolov8/README.md
+
+MMYOLO 算法解析教程:https://mmyolo.readthedocs.io/zh_CN/latest/algorithm_descriptions/index.html#id2
diff --git a/mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/application_examples/index.rst b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/application_examples/index.rst
new file mode 100644
index 0000000..f552dbe
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/application_examples/index.rst
@@ -0,0 +1,7 @@
+MMYOLO 应用范例介绍
+********************
+
+.. toctree::
+   :maxdepth: 1
+
+   ionogram_detection.md
diff --git a/mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/application_examples/ionogram_detection.md b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/application_examples/ionogram_detection.md
new file mode 100644
index 0000000..84e6daf
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/application_examples/ionogram_detection.md
@@ -0,0 +1,306 @@
+# 基于 MMYOLO 的频高图实时目标检测 benchmark
+
+## 数据集构建
+
+数字频高图是获取电离层实时信息最重要的途径。电离层结构检测对精准提取电离层关键参数,具有非常重要的研究意义。
+
+利用中国科学院在海南、武汉、怀来获取的不同季节的 4311 张频高图建立数据集,使用 [labelme](https://github.com/wkentaro/labelme) 人工标注出 E 层、Es-c 层、Es-l 层、F1 层、F2 层、Spread F 层共 6 种结构。[数据集下载](https://github.com/VoyagerXvoyagerx/Ionogram_detection/releases/download/Dataset/Iono4311.zip)
+
+<div align=center>
+<img width="40%" src="https://user-images.githubusercontent.com/67947949/223638535-c4583d88-aa5a-4f21-b35a-e6e8328c9bd4.jpg"/>
+
+使用 labelme 标注的图像预览
+
+</div>
+
+1. 数据集准备
+
+下载数据后,放置在 MMYOLO 仓库的根目录下,使用 `unzip test.zip` 命令(linux)解压至当前文件夹。解压后的文件夹结构为:
+
+```shell
+Iono4311/
+├── images
+|      ├── 20130401005200.png
+|      └── ...
+└── labels
+       ├── 20130401005200.json
+       └── ...
+```
+
+其中,`images` 目录下存放输入图片,`labels` 目录下存放使用 labelme 标注得到的 json 文件。
+
+2. 数据集格式转换
+
+使用MMYOLO提供的 `tools/dataset_converters/labelme2coco.py` 脚本将 labelme 格式的标注文件转换为 COCO 格式的标注文件。
+
+```shell
+python tools/dataset_converters/labelme2coco.py --img-dir ./Iono4311/images \
+                                                --labels-dir ./Iono4311/labels \
+                                                --out ./Iono4311/annotations/annotations_all.json
+```
+
+3. 浏览数据集
+
+使用下面的命令可以将 COCO 的 label 在图片上进行显示,这一步可以验证刚刚转换是否有问题。
+
+```shell
+python tools/analysis_tools/browse_coco_json.py --img-dir ./Iono4311/images \
+                                                --ann-file ./Iono4311/annotations/annotations_all.json
+```
+
+4. 划分训练集、验证集、测试集
+
+设置 70% 的图片为训练集,15% 作为验证集,15% 为测试集。
+
+```shell
+python tools/misc/coco_split.py --json ./Iono4311/annotations/annotations_all.json \
+                                --out-dir ./Iono4311/annotations \
+                                --ratios 0.7 0.15 0.15 \
+                                --shuffle \
+                                --seed 14
+```
+
+划分后的文件夹结构:
+
+```shell
+Iono4311/
+├── annotations
+│   ├── annotations_all.json
+│   ├── class_with_id.txt
+│   ├── test.json
+│   ├── train.json
+│   └── val.json
+├── classes_with_id.txt
+├── images
+├── labels
+├── test_images
+├── train_images
+└── val_images
+```
+
+## 配置文件
+
+配置文件存放在目录 `/projects/misc/ionogram_detection/` 下。
+
+1. 数据集分析
+
+使用 `tools/analysis_tools/dataset_analysis.py` 从数据集中采样 200 张图片进行可视化分析:
+
+```shell
+python tools/analysis_tools/dataset_analysis.py projects/misc/ionogram_detection/yolov5/yolov5_s-v61_fast_1xb96-100e_ionogram.py \
+                                                --out-dir output
+```
+
+得到以下输出:
+
+```shell
+The information obtained is as follows:
++------------------------------+
+| Information of dataset class |
++---------------+--------------+
+| Class name    | Bbox num     |
++---------------+--------------+
+| E             | 98           |
+| Es-l          | 27           |
+| Es-c          | 46           |
+| F1            | 100          |
+| F2            | 194          |
+| Spread-F      | 6            |
++---------------+--------------+
+```
+
+说明本数据集存在样本不均衡的现象。
+
+<div align=center>
+<img width="100%" src="https://user-images.githubusercontent.com/67947949/223640412-4008a0a1-0626-419d-90bf-fb7ce6f26fc9.jpg"/>
+
+各类别目标大小统计
+
+</div>
+
+根据统计结果,E、Es-l、Esc、F1 类别以小目标居多,F2、Spread F 类主要是中等大小目标。
+
+2. 可视化 config 中的数据处理部分
+
+以 YOLOv5-s 为例,根据配置文件中的 `train_pipeline`,训练时采用的数据增强策略包括:
+
+- 马赛克增强
+- 随机仿射变换
+- Albumentations 数据增强工具包(包括多种数字图像处理方法)
+- HSV 随机增强图像
+- 随机水平翻转
+
+使用 `tools/analysis_tools/browse_dataset.py` 脚本的 **'pipeline'** 模式,可以可视化每个 pipeline 的输出效果:
+
+```shell
+python tools/analysis_tools/browse_dataset.py projects/misc/ionogram_detection/yolov5/yolov5_s-v61_fast_1xb96-100e_ionogram.py \
+                                              -m pipeline \
+                                              --out-dir output
+```
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/67947949/223914228-abcd017d-a068-4dcd-9d91-e6b546540060.png"/>
+
+pipeline 输出可视化
+
+</div>
+
+3. 优化 Anchor 尺寸
+
+使用分析工具中的 `tools/analysis_tools/optimize_anchors.py` 脚本得到适用于本数据集的先验锚框尺寸。
+
+```shell
+python tools/analysis_tools/optimize_anchors.py projects/misc/ionogram_detection/yolov5/yolov5_s-v61_fast_1xb96-100e_ionogram.py \
+                                                --algorithm v5-k-means \
+                                                --input-shape 640 640 \
+                                                --prior-match-thr 4.0 \
+                                                --out-dir work_dirs/dataset_analysis_5_s
+```
+
+4. 模型复杂度分析
+
+根据配置文件,使用分析工具中的 `tools/analysis_tools/get_flops.py` 脚本可以得到模型的参数量、浮点计算量等信息。以 YOLOv5-s 为例:
+
+```shell
+python tools/analysis_tools/get_flops.py projects/misc/ionogram_detection/yolov5/yolov5_s-v61_fast_1xb96-100e_ionogram.py
+```
+
+得到如下输出,表示模型的浮点运算量为 7.947G,一共有 7.036M 个可学习参数。
+
+```shell
+==============================
+Input shape: torch.Size([640, 640])
+Model Flops: 7.947G
+Model Parameters: 7.036M
+==============================
+```
+
+## 训练和测试
+
+1. 训练
+
+训练可视化:本范例按照[标注+训练+测试+部署全流程](https://mmyolo.readthedocs.io/zh_CN/dev/recommended_topics/labeling_to_deployment_tutorials.html#id11)中的步骤安装和配置 [wandb](https://wandb.ai/site)。
+
+调试技巧:在调试代码的过程中,有时需要训练几个 epoch,例如调试验证过程或者权重的保存是否符合期望。对于继承自 `BaseDataset` 的数据集(如本范例中的 `YOLOv5CocoDataset`),在 `train_dataloader` 中的 `dataset` 字段增加 `indices` 参数,即可指定每个 epoch 迭代的样本数,减少迭代时间。
+
+```python
+train_dataloader = dict(
+    batch_size=train_batch_size_per_gpu,
+    num_workers=train_num_workers,
+    dataset=dict(
+        _delete_=True,
+        type='RepeatDataset',
+        times=1,
+        dataset=dict(
+            type=_base_.dataset_type,
+            indices=200,  # 设置 indices=200,表示每个 epoch 只迭代 200 个样本
+            data_root=data_root,
+            metainfo=metainfo,
+            ann_file=train_ann_file,
+            data_prefix=dict(img=train_data_prefix),
+            filter_cfg=dict(filter_empty_gt=False, min_size=32),
+            pipeline=_base_.train_pipeline)))
+```
+
+启动训练:
+
+```shell
+python tools/train.py projects/misc/ionogram_detection/yolov5/yolov5_s-v61_fast_1xb96-100e_ionogram.py
+```
+
+2. 测试
+
+指定配置文件和模型的路径以启动测试:
+
+```shell
+python tools/test.py projects/misc/ionogram_detection/yolov5/yolov5_s-v61_fast_1xb96-100e_ionogram.py \
+                     work_dirs/yolov5_s-v61_fast_1xb96-100e_ionogram/xxx
+```
+
+## 实验与结果分析
+
+### 选择合适的 batch size
+
+- Batch size 主导了训练速度。通常,理想的 batch size 是是硬件能支持的最大 batch size。
+- 当显存占用没有达到饱和时,如果 batch size 翻倍,训练吞吐量也应该翻倍(或接近翻倍),训练时间应该减半或接近减半。
+- 使用**混合精度训练**可以加快训练速度、减小显存。在执行 `train.py` 脚本时添加 `--amp` 参数即可开启。
+
+硬件信息:
+
+- GPU:V100,显存 32G
+- CPU:10核,内存 40G
+
+实验结果:
+
+| Model    | Epoch(best) | AMP   | Batchsize | Num workers | Memory Allocated | Training Time | Val mAP |
+| -------- | ----------- | ----- | --------- | ----------- | ---------------- | ------------- | ------- |
+| YOLOv5-s | 100(82)     | False | 32        | 6           | 35.07%           | 54 min        | 0.575   |
+| YOLOv5-s | 100(96)     | True  | 32        | 6           | 24.93%           | 49 min        | 0.578   |
+| YOLOv5-s | 100(100)    | False | 96        | 6           | 96.64%           | 48 min        | 0.571   |
+| YOLOv5-s | 100(100)    | True  | 96        | 6           | 54.66%           | **37** min    | 0.575   |
+| YOLOv5-s | 100(90)     | True  | 144       | 6           | 77.06%           | 39 min        | 0.573   |
+| YOLOv5-s | 200(148)    | True  | 96        | 6           | 54.66%           | 72 min        | 0.575   |
+| YOLOv5-s | 200(188)    | True  | 96        | **8**       | 54.66%           | 67 min        | 0.576   |
+
+<div align=center>
+<img width="60%" src="https://user-images.githubusercontent.com/67947949/223635966-948c8424-1ba8-4df0-92d7-079029dc1231.png">
+
+不同 batch size 的训练过程中,数据加载时间 `data_time` 占每步总时长的比例
+
+</div>
+
+分析结果,可以得出以下结论:
+
+- 混合精度训练对模型的精度几乎没有影响,并且可以明显减少显存占用。
+- Batch size 增加 3 倍,和训练时长并没有相应地减小 3 倍。根据训练过程中 `data_time` 的记录,batch size 越大,`data_time` 也越大,说明数据加载成为了限制训练速度的瓶颈。增大加载数据的进程数 `num_workers` 可以加快数据加载。
+
+### 消融实验
+
+为了得到适用于本数据集的训练流水线,以 YOLOv5-s 模型为例,进行以下消融实验。
+
+#### 不同数据增强方法
+
+| Aug Method | [config](/projects/misc/ionogram_detection/yolov5/yolov5_s-v61_fast_1xb96-100e_ionogram_aug0.py) | [config](/projects/misc/ionogram_detection/yolov5/yolov5_s-v61_fast_1xb32-100e_ionogram_mosaic.py) | [config](/projects/misc/ionogram_detection/yolov5/yolov5_s-v61_fast_1xb96-100e_ionogram_mosaic_affine.py) | [config](/projects/misc/ionogram_detection/yolov5/yolov5_s-v61_fast_1xb96-100e_ionogram_mosaic_affine_albu_hsv.py) | [config](/projects/misc/ionogram_detection/yolov5/yolov5_s-v61_fast_1xb96-100e_ionogram.py) |
+| ---------- | ------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------- |
+| Mosaic     |                                                                                                  | √                                                                                                  | √                                                                                                         | √                                                                                                                  | √                                                                                           |
+| Affine     |                                                                                                  |                                                                                                    | √                                                                                                         | √                                                                                                                  | √                                                                                           |
+| Albu       |                                                                                                  |                                                                                                    |                                                                                                           | √                                                                                                                  | √                                                                                           |
+| HSV        |                                                                                                  |                                                                                                    |                                                                                                           | √                                                                                                                  | √                                                                                           |
+| Flip       |                                                                                                  |                                                                                                    |                                                                                                           |                                                                                                                    | √                                                                                           |
+| Val mAP    | 0.507                                                                                            | 0.550                                                                                              | 0.572                                                                                                     | 0.567                                                                                                              | 0.575                                                                                       |
+
+结果表明,马赛克增强和随机仿射变换可以对验证集表现带来明显的提升。
+
+#### 是否使用预训练权重
+
+在配置文件中,修改 `load_from = None` 即可不使用预训练权重。对不使用预训练权重的实验,将基础学习率增大四倍,训练轮数增加至 200 轮,使模型得到较为充分的训练。
+
+| Model    | Epoch(best) | FLOPs(G) | Params(M) | Pretrain | Val mAP | Config                                                                                           |
+| -------- | ----------- | -------- | --------- | -------- | ------- | ------------------------------------------------------------------------------------------------ |
+| YOLOv5-s | 100(82)     | 7.95     | 7.04      | Coco     | 0.575   | [config](/projects/misc/ionogram_detection/yolov5/yolov5_s-v61_fast_1xb96-100e_ionogram.py)      |
+| YOLOv5-s | 200(145)    | 7.95     | 7.04      | None     | 0.565   | [config](/projects/misc/ionogram_detection/yolov5/yolov5_s-v61_fast_1xb96-200e_ionogram_pre0.py) |
+| YOLOv6-s | 100(54)     | 24.2     | 18.84     | Coco     | 0.584   | [config](/projects/misc/ionogram_detection/yolov6/yolov6_s_fast_1xb32-100e_ionogram.py)          |
+| YOLOv6-s | 200(188)    | 24.2     | 18.84     | None     | 0.557   | [config](/projects/misc/ionogram_detection/yolov6/yolov6_s_fast_1xb32-200e_ionogram_pre0.py)     |
+
+<div align=center>
+<img width="60%" src="https://user-images.githubusercontent.com/67947949/223641016-9ded0d11-62b8-45f4-be5b-bd4ffae3ec21.png">
+
+训练过程中的损失下降对比图
+
+</div>
+
+损失下降曲线表明,使用预训练权重时,loss 下降得更快。可见即使是自然图像数据集上预训练的模型,在雷达图像数据集上微调时,也可以加快模型收敛。
+
+### 频高图结构检测 benchmark
+
+| Model       | epoch(best) | FLOPs(G) | Params(M) | pretrain | val mAP | test mAP | Config                                                                                      | Log                                                                                                           |
+| ----------- | ----------- | -------- | --------- | -------- | ------- | -------- | ------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- |
+| YOLOv5-s    | 100(82)     | 7.95     | 7.04      | Coco     | 0.575   | 0.584    | [config](/projects/misc/ionogram_detection/yolov5/yolov5_s-v61_fast_1xb96-100e_ionogram.py) | [log](https://github.com/VoyagerXvoyagerx/Ionogram_detection/blob/main/logs/yolov5_s_20230105_213510.json)    |
+| YOLOv5-m    | 100(70)     | 24.05    | 20.89     | Coco     | 0.587   | 0.586    | [config](/projects/misc/ionogram_detection/yolov5/yolov5_m-v61_fast_1xb32-100e_ionogram.py) | [log](https://github.com/VoyagerXvoyagerx/Ionogram_detection/blob/main/logs/yolov5_m_20230106_004642.json)    |
+| YOLOv6-s    | 100(54)     | 24.2     | 18.84     | Coco     | 0.584   | 0.594    | [config](/projects/misc/ionogram_detection/yolov6/yolov6_s_fast_1xb32-100e_ionogram.py)     | [log](https://github.com/VoyagerXvoyagerx/Ionogram_detection/blob/main/logs/yolov6_s_20230107_003207.json)    |
+| YOLOv6-m    | 100(76)     | 37.08    | 44.42     | Coco     | 0.590   | 0.590    | [config](/projects/misc/ionogram_detection/yolov6/yolov6_m_fast_1xb32-100e_ionogram.py)     | [log](https://github.com/VoyagerXvoyagerx/Ionogram_detection/blob/main/logs/yolov6_m_20230107_201029.json)    |
+| YOLOv6-l    | 100(76)     | 71.33    | 58.47     | Coco     | 0.605   | 0.597    | [config](/projects/misc/ionogram_detection/yolov6/yolov6_l_fast_1xb32-100e_ionogram.py)     | [log](https://github.com/VoyagerXvoyagerx/Ionogram_detection/blob/main/logs/yolov6_l_20230108_005634.json)    |
+| YOLOv7-tiny | 100(78)     | 6.57     | 6.02      | Coco     | 0.549   | 0.568    | [config](/projects/misc/ionogram_detection/yolov7/yolov7_tiny_fast_1xb16-100e_ionogram.py)  | [log](https://github.com/VoyagerXvoyagerx/Ionogram_detection/blob/main/logs/yolov7_tiny_20230215_202837.json) |
+| YOLOv7-x    | 100(58)     | 94.27    | 70.85     | Coco     | 0.602   | 0.595    | [config](/projects/misc/ionogram_detection/yolov7/yolov7_x_fast_1xb16-100e_ionogram.py)     | [log](https://github.com/VoyagerXvoyagerx/Ionogram_detection/blob/main/logs/yolov7_x_20230110_165832.json)    |
+| rtmdet-tiny | 100(100)    | 8.03     | 4.88      | Coco     | 0.582   | 0.589    | [config](/projects/misc/ionogram_detection/rtmdet/rtmdet_tiny_fast_1xb32-100e_ionogram.py)  | [log](https://github.com/VoyagerXvoyagerx/Ionogram_detection/blob/main/logs/rtmdet_tiny_20230310_125440.json) |
+| rtmdet-s    | 100(92)     | 14.76    | 8.86      | Coco     | 0.588   | 0.585    | [config](/projects/misc/ionogram_detection/rtmdet/rtmdet_s_fast_1xb32-100e_ionogram.py)     | [log](https://github.com/VoyagerXvoyagerx/Ionogram_detection/blob/main/logs/rtmdet_s_20230310_163853.json)    |
diff --git a/mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/complexity_analysis.md b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/complexity_analysis.md
new file mode 100644
index 0000000..362a331
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/complexity_analysis.md
@@ -0,0 +1,117 @@
+# 模型复杂度分析
+
+我们提供了 `tools/analysis_tools/get_flops.py` 脚本来帮助进行 MMYOLO 系列中所有模型的复杂度分析。目前支持计算并输出给定模型的 parameters, activation 以及 flops;同时支持以网络结构或表格的形式打印输出每一层网络的复杂度信息。
+
+调用命令如下:
+
+```shell
+python tools/analysis_tools/get_flops.py
+    ${CONFIG_FILE} \                           # 配置文件路径
+    [--shape ${IMAGE_SIZE}] \                  # 输入图像大小(int),默认取 640*640
+    [--show-arch ${ARCH_DISPLAY}] \            # 以网络结构形式逐层展示复杂度信息
+    [--not-show-table ${TABLE_DISPLAY}] \      # 以表格形式逐层展示复杂度信息
+    [--cfg-options ${CFG_OPTIONS}]             # 配置文件参数修改选项
+# [] 代表可选参数,实际输入命令行时,不用输入 []
+```
+
+接下来以 RTMDet 中的 `rtmdet_s_syncbn_fast_8xb32-300e_coco.py` 配置文件为例,详细展示该脚本的几种使用情形:
+
+## 样例 1: 打印模型的 Flops 和 Parameters,并以表格形式展示每层网络复杂度
+
+```shell
+python tools/analysis_tools/get_flops.py  configs/rtmdet/rtmdet_s_syncbn_fast_8xb32-300e_coco.py
+```
+
+输出如下:
+
+```python
+==============================
+Input shape: torch.Size([640, 640])
+Model Flops: 14.835G
+Model Parameters: 8.887M
+==============================
+```
+
+| module                            | #parameters or shape | #flops  | #activations |
+| :-------------------------------- | :------------------- | :------ | :----------: |
+| model                             | 8.887M               | 14.835G |   35.676M    |
+| backbone                          | 4.378M               | 5.416G  |   22.529M    |
+| backbone.stem                     | 7.472K               | 0.765G  |    6.554M    |
+| backbone.stem.0                   | 0.464K               | 47.514M |    1.638M    |
+| backbone.stem.1                   | 2.336K               | 0.239G  |    1.638M    |
+| backbone.stem.2                   | 4.672K               | 0.478G  |    3.277M    |
+| backbone.stage1                   | 42.4K                | 0.981G  |    7.373M    |
+| backbone.stage1.0                 | 18.56K               | 0.475G  |    1.638M    |
+| backbone.stage1.1                 | 23.84K               | 0.505G  |    5.734M    |
+| backbone.stage2                   | 0.21M                | 1.237G  |    4.915M    |
+| backbone.stage2.0                 | 73.984K              | 0.473G  |    0.819M    |
+| backbone.stage2.1                 | 0.136M               | 0.764G  |    4.096M    |
+| backbone.stage3                   | 0.829M               | 1.221G  |    2.458M    |
+| backbone.stage3.0                 | 0.295M               | 0.473G  |    0.41M     |
+| backbone.stage3.1                 | 0.534M               | 0.749G  |    2.048M    |
+| backbone.stage4                   | 3.29M                | 1.211G  |    1.229M    |
+| backbone.stage4.0                 | 1.181M               | 0.472G  |    0.205M    |
+| backbone.stage4.1                 | 0.657M               | 0.263G  |    0.307M    |
+| backbone.stage4.2                 | 1.452M               | 0.476G  |    0.717M    |
+| neck                              | 3.883M               | 4.366G  |    8.141M    |
+| neck.reduce_layers.2              | 0.132M               | 52.634M |    0.102M    |
+| neck.reduce_layers.2.conv         | 0.131M               | 52.429M |    0.102M    |
+| neck.reduce_layers.2.bn           | 0.512K               | 0.205M  |      0       |
+| neck.top_down_layers              | 0.491M               | 1.23G   |    4.506M    |
+| neck.top_down_layers.0            | 0.398M               | 0.638G  |    1.638M    |
+| neck.top_down_layers.1            | 92.608K              | 0.593G  |    2.867M    |
+| neck.downsample_layers            | 0.738M               | 0.472G  |    0.307M    |
+| neck.downsample_layers.0          | 0.148M               | 0.236G  |    0.205M    |
+| neck.downsample_layers.1          | 0.59M                | 0.236G  |    0.102M    |
+| neck.bottom_up_layers             | 1.49M                | 0.956G  |    2.15M     |
+| neck.bottom_up_layers.0           | 0.3M                 | 0.48G   |    1.434M    |
+| neck.bottom_up_layers.1           | 1.19M                | 0.476G  |    0.717M    |
+| neck.out_layers                   | 1.033M               | 1.654G  |    1.075M    |
+| neck.out_layers.0                 | 0.148M               | 0.945G  |    0.819M    |
+| neck.out_layers.1                 | 0.295M               | 0.472G  |    0.205M    |
+| neck.out_layers.2                 | 0.59M                | 0.236G  |    51.2K     |
+| neck.upsample_layers              |                      | 1.229M  |      0       |
+| neck.upsample_layers.0            |                      | 0.41M   |      0       |
+| neck.upsample_layers.1            |                      | 0.819M  |      0       |
+| bbox_head.head_module             | 0.625M               | 5.053G  |    5.006M    |
+| bbox_head.head_module.cls_convs   | 0.296M               | 2.482G  |    2.15M     |
+| bbox_head.head_module.cls_convs.0 | 0.295M               | 2.481G  |    2.15M     |
+| bbox_head.head_module.cls_convs.1 | 0.512K               | 0.819M  |      0       |
+| bbox_head.head_module.cls_convs.2 | 0.512K               | 0.205M  |      0       |
+| bbox_head.head_module.reg_convs   | 0.296M               | 2.482G  |    2.15M     |
+| bbox_head.head_module.reg_convs.0 | 0.295M               | 2.481G  |    2.15M     |
+| bbox_head.head_module.reg_convs.1 | 0.512K               | 0.819M  |      0       |
+| bbox_head.head_module.reg_convs.2 | 0.512K               | 0.205M  |      0       |
+| bbox_head.head_module.rtm_cls     | 30.96K               | 86.016M |    0.672M    |
+| bbox_head.head_module.rtm_cls.0   | 10.32K               | 65.536M |    0.512M    |
+| bbox_head.head_module.rtm_cls.1   | 10.32K               | 16.384M |    0.128M    |
+| bbox_head.head_module.rtm_cls.2   | 10.32K               | 4.096M  |     32K      |
+| bbox_head.head_module.rtm_reg     | 1.548K               | 4.301M  |    33.6K     |
+| bbox_head.head_module.rtm_reg.0   | 0.516K               | 3.277M  |    25.6K     |
+| bbox_head.head_module.rtm_reg.1   | 0.516K               | 0.819M  |     6.4K     |
+| bbox_head.head_module.rtm_reg.2   | 0.516K               | 0.205M  |     1.6K     |
+
+## 样例 2:以网络结构形式逐层展示模型复杂度信息
+
+```shell
+python tools/analysis_tools/get_flops.py  configs/rtmdet/rtmdet_s_syncbn_fast_8xb32-300e_coco.py --show-arch
+```
+
+由于该网络结构复杂,输出较长。以下仅展示 bbox_head.head_module.rtm_reg 部分的输出:
+
+```python
+(rtm_reg): ModuleList(
+        #params: 1.55K, #flops: 4.3M, #acts: 33.6K
+        (0): Conv2d(
+          128, 4, kernel_size=(1, 1), stride=(1, 1)
+          #params: 0.52K, #flops: 3.28M, #acts: 25.6K
+        )
+        (1): Conv2d(
+          128, 4, kernel_size=(1, 1), stride=(1, 1)
+          #params: 0.52K, #flops: 0.82M, #acts: 6.4K
+        )
+        (2): Conv2d(
+          128, 4, kernel_size=(1, 1), stride=(1, 1)
+          #params: 0.52K, #flops: 0.2M, #acts: 1.6K
+        )
+```
diff --git a/mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/contributing.md b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/contributing.md
new file mode 100644
index 0000000..a950f1d
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/contributing.md
@@ -0,0 +1,325 @@
+# 如何给 MMYOLO 贡献代码
+
+欢迎加入 MMYOLO 社区,我们致力于打造最前沿的计算机视觉基础库,我们欢迎任何类型的贡献,包括但不限于
+
+**修复错误**
+
+修复代码实现错误的步骤如下:
+
+1. 如果提交的代码改动较大,建议先提交 issue,并正确描述 issue 的现象、原因和复现方式,讨论后确认修复方案。
+2. 修复错误并补充相应的单元测试,提交拉取请求。
+
+**新增功能或组件**
+
+1. 如果新功能或模块涉及较大的代码改动,建议先提交 issue,确认功能的必要性。
+2. 实现新增功能并添单元测试,提交拉取请求。
+
+**文档补充**
+
+修复文档可以直接提交拉取请求
+
+添加文档或将文档翻译成其他语言步骤如下
+
+1. 提交 issue,确认添加文档的必要性。
+2. 添加文档,提交拉取请求。
+
+## 准备工作
+
+拉取请求工作的命令都是用 Git 去实现的,该章节详细描述 `Git 配置` 以及与 `GitHub 绑定`
+
+### 1. Git 配置
+
+首先,确认电脑是否安装了 Git。Linux 系统和 macOS 系统,一般默认安装 Git,如未安装可在 [Git-Downloads](https://git-scm.com/downloads) 下载。
+
+```shell
+# 在命令提示符(cmd)或终端下输入以下命令,查看 Git 版本
+git --version
+```
+
+其次,检测自己 `Git Config` 是否配置
+
+```shell
+# 在命令提示符(cmd)或终端下输入以下命令,查看 Git Config 是否配置
+git config --global --list
+```
+
+若 `user.name` 和 `user.email` 为空,则输入以下命令进行配置。
+
+```shell
+git config --global user.name "这里换上你的用户名"
+git config --global user.email "这里换上你的邮箱"
+```
+
+最后,在 `git bash` 或者 `终端` 中,输入以下命令生成密钥文件。生成成功后,会在用户目录下出现 `.ssh` 文件,其中 `id_rsa.pub` 是公钥文件。
+
+```shell
+# useremail 是 GitHub 的邮箱
+ssh-keygen -t rsa -C "useremail"
+```
+
+### 2. GitHub 绑定
+
+首先,用记事本打开 `id_rsa.pub` 公钥文件,并复制里面全部内容。
+
+其次,登录 GitHub 账户找到下图位置进行设置。
+
+<img src="https://user-images.githubusercontent.com/90811472/221778382-a075167d-b028-4f68-a1c7-49a8f6f3d97b.png" width="1200">
+
+点击 `New SSH key` 新增一个 SSH keys,将刚才复制的内容粘贴到下图所示的 Key 中,Title 可以写设备名称,最后确认即可。
+
+<img src="https://user-images.githubusercontent.com/90811472/221549754-53670c19-5efe-48b2-9ac5-bafb43891903.png" width="1200">
+
+最后,在 `git bash` 或者 `终端` 中输入以下命令,验证 SSH 是否与 GitHub 账户匹配。如果匹配,输入 `yes` 就成功啦~
+
+```shell
+ssh -T git@github.com
+```
+
+<img src="https://user-images.githubusercontent.com/90811472/221573637-30e5d04d-955c-4c8f-86ab-ed6608644fc8.png" width="1200">
+
+## 拉取请求工作流
+
+如果你对拉取请求不了解,没关系,接下来的内容将会从零开始,一步一步地指引你如何创建一个拉取请求。如果你想深入了解拉取请求的开发模式,可以参考 github [官方文档](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/about-pull-requests)
+
+### 1. 复刻仓库
+
+当你第一次提交拉取请求时,先复刻 OpenMMLab 原代码库,点击 GitHub 页面右上角的 **Fork** 按钮,复刻后的代码库将会出现在你的 GitHub 个人主页下。
+
+<img src="https://user-images.githubusercontent.com/27466624/204301143-2d262d2c-28b3-4060-8576-21d9f4237f2f.png" width="1200">
+
+将代码克隆到本地
+
+```shell
+git clone git@github.com:{username}/mmyolo.git
+```
+
+进入项目并添加原代码库为上游代码库
+
+```bash
+cd mmyolo
+git remote add upstream git@github.com:open-mmlab/mmyolo
+```
+
+检查 remote 是否添加成功,在终端输入 `git remote -v`
+
+```bash
+origin	git@github.com:{username}/mmyolo.git (fetch)
+origin	git@github.com:{username}/mmyolo.git (push)
+upstream	git@github.com:open-mmlab/mmyolo (fetch)
+upstream	git@github.com:open-mmlab/mmyolo (push)
+```
+
+```{note}
+这里对 origin 和 upstream 进行一个简单的介绍,当我们使用 git clone 来克隆代码时,会默认创建一个 origin 的 remote,它指向我们克隆的代码库地址,而 upstream 则是我们自己添加的,用来指向原始代码库地址。当然如果你不喜欢他叫 upstream,也可以自己修改,比如叫 open-mmlab。我们通常向 origin 提交代码(即 fork 下来的远程仓库),然后向 upstream 提交一个 pull request。如果提交的代码和最新的代码发生冲突,再从 upstream 拉取最新的代码,和本地分支解决冲突,再提交到 origin。
+```
+
+### 2. 配置 pre-commit
+
+在本地开发环境中,我们使用 [pre-commit](https://pre-commit.com/#intro) 来检查代码风格,以确保代码风格的统一。在提交代码,需要先安装 pre-commit(需要在 MMYOLO 目录下执行):
+
+```shell
+pip install -U pre-commit
+pre-commit install
+```
+
+检查 pre-commit 是否配置成功,并安装 `.pre-commit-config.yaml` 中的钩子:
+
+```shell
+pre-commit run --all-files
+```
+
+<img src="https://user-images.githubusercontent.com/57566630/173660750-3df20a63-cb66-4d33-a986-1f643f1d8aaf.png" width="1200">
+
+<img src="https://user-images.githubusercontent.com/57566630/202368856-0465a90d-8fce-4345-918e-67b8b9c82614.png" width="1200">
+
+```{note}
+如果你是中国用户,由于网络原因,可能会出现安装失败的情况,这时可以使用国内源
+
+pre-commit install -c .pre-commit-config-zh-cn.yaml
+
+pre-commit run --all-files -c .pre-commit-config-zh-cn.yaml
+```
+
+如果安装过程被中断,可以重复执行 `pre-commit run ...` 继续安装。
+
+如果提交的代码不符合代码风格规范,pre-commit 会发出警告,并自动修复部分错误。
+
+<img src="https://user-images.githubusercontent.com/57566630/202369176-67642454-0025-4023-a095-263529107aa3.png" width="1200">
+
+如果我们想临时绕开 pre-commit 的检查提交一次代码,可以在 `git commit` 时加上 `--no-verify`(需要保证最后推送至远程仓库的代码能够通过 pre-commit 检查)。
+
+```shell
+git commit -m "xxx" --no-verify
+```
+
+### 3. 创建开发分支
+
+安装完 pre-commit 之后,我们需要基于 dev 创建开发分支,建议的分支命名规则为 `username/pr_name`。
+
+```shell
+git checkout -b yhc/refactor_contributing_doc
+```
+
+在后续的开发中,如果本地仓库的 dev 分支落后于 upstream 的 dev 分支,我们需要先拉取 upstream 的代码进行同步,再执行上面的命令
+
+```shell
+git pull upstream dev
+```
+
+### 4. 提交代码并在本地通过单元测试
+
+- MMYOLO 引入了 mypy 来做静态类型检查,以增加代码的鲁棒性。因此我们在提交代码时,需要补充 Type Hints。具体规则可以参考[教程](https://zhuanlan.zhihu.com/p/519335398)。
+
+- 提交的代码同样需要通过单元测试
+
+  ```shell
+  # 通过全量单元测试
+  pytest tests
+
+  # 我们需要保证提交的代码能够通过修改模块的单元测试,以 yolov5_coco dataset 为例
+  pytest tests/test_datasets/test_yolov5_coco.py
+  ```
+
+  如果你由于缺少依赖无法运行修改模块的单元测试,可以参考[指引-单元测试](#单元测试)
+
+- 如果修改/添加了文档,参考[指引](#文档渲染)确认文档渲染正常。
+
+### 5. 推送代码到远程
+
+代码通过单元测试和 pre-commit 检查后,将代码推送到远程仓库,如果是第一次推送,可以在 `git push` 后加上 `-u` 参数以关联远程分支
+
+```shell
+git push -u origin {branch_name}
+```
+
+这样下次就可以直接使用 `git push` 命令推送代码了,而无需指定分支和远程仓库。
+
+### 6. 提交拉取请求(PR)
+
+(1) 在 GitHub 的 Pull request 界面创建拉取请求
+<img src="https://user-images.githubusercontent.com/27466624/204302289-d1e54901-8f27-4934-923f-fda800ff9851.png" width="1200">
+
+(2) 根据指引修改 PR 描述,以便于其他开发者更好地理解你的修改
+
+```{note}
+注意在 PR branch 左侧的 base 需要修改为 dev 分支
+```
+
+<img src="https://user-images.githubusercontent.com/62822224/216594960-a2292b9d-2b7c-4861-b4c5-362a9458b194.png" width="1200">
+
+描述规范详见[拉取请求规范](#拉取请求规范)
+
+&#160;
+
+**注意事项**
+
+(a) PR 描述应该包含修改理由、修改内容以及修改后带来的影响,并关联相关 Issue(具体方式见[文档](https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue))
+
+(b) 如果是第一次为 OpenMMLab 做贡献,需要签署 CLA
+
+<img src="https://user-images.githubusercontent.com/57566630/167307569-a794b967-6e28-4eac-a942-00deb657815f.png" width="1200">
+
+(c) 检查提交的 PR 是否通过 CI(集成测试)
+
+<img src="https://user-images.githubusercontent.com/27466624/204303753-900de590-ddd1-4be2-8e43-8dc09f127f5d.png" width="1200">
+
+MMYOLO 会在 Linux 上,基于不同版本的 Python、PyTorch 对提交的代码进行单元测试,以保证代码的正确性,如果有任何一个没有通过,我们可点击上图中的 `Details` 来查看具体的测试信息,以便于我们修改代码。
+
+(3) 如果 PR 通过了 CI,那么就可以等待其他开发者的 review,并根据 reviewer 的意见,修改代码,并重复 [4](#4-提交代码并本地通过单元测试)-[5](#5-推送代码到远程) 步骤,直到 reviewer 同意合入 PR。
+
+<img src="https://user-images.githubusercontent.com/57566630/202145400-cc2cd8c4-10b0-472f-ba37-07e6f50acc67.png" width="1200">
+
+所有 reviewer 同意合入 PR 后,我们会尽快将 PR 合并到 dev 分支。
+
+### 7. 解决冲突
+
+随着时间的推移,我们的代码库会不断更新,这时候,如果你的 PR 与 dev 分支存在冲突,你需要解决冲突,解决冲突的方式有两种:
+
+```shell
+git fetch --all --prune
+git rebase upstream/dev
+```
+
+或者
+
+```shell
+git fetch --all --prune
+git merge upstream/dev
+```
+
+如果你非常善于处理冲突,那么可以使用 rebase 的方式来解决冲突,因为这能够保证你的 commit log 的整洁。如果你不太熟悉 `rebase` 的使用,那么可以使用 `merge` 的方式来解决冲突。
+
+## 指引
+
+### 单元测试
+
+在提交修复代码错误或新增特性的拉取请求时,我们应该尽可能的让单元测试覆盖所有提交的代码,计算单元测试覆盖率的方法如下
+
+```shell
+python -m coverage run -m pytest /path/to/test_file
+python -m coverage html
+# check file in htmlcov/index.html
+```
+
+### 文档渲染
+
+在提交修复代码错误或新增特性的拉取请求时,可能会需要修改/新增模块的 docstring。我们需要确认渲染后的文档样式是正确的。
+本地生成渲染后的文档的方法如下
+
+```shell
+pip install -r requirements/docs.txt
+cd docs/zh_cn/
+# or docs/en
+make html
+# check file in ./docs/zh_cn/_build/html/index.html
+```
+
+## 代码风格
+
+### Python
+
+[PEP8](https://www.python.org/dev/peps/pep-0008/) 作为 OpenMMLab 算法库首选的代码规范,我们使用以下工具检查和格式化代码
+
+- [flake8](https://github.com/PyCQA/flake8):Python 官方发布的代码规范检查工具,是多个检查工具的封装
+- [isort](https://github.com/timothycrosley/isort):自动调整模块导入顺序的工具
+- [yapf](https://github.com/google/yapf):Google 发布的代码规范检查工具
+- [codespell](https://github.com/codespell-project/codespell):检查单词拼写是否有误
+- [mdformat](https://github.com/executablebooks/mdformat):检查 markdown 文件的工具
+- [docformatter](https://github.com/myint/docformatter):格式化 docstring 的工具
+
+yapf 和 isort 的配置可以在 [setup.cfg](../../../setup.cfg) 找到
+
+通过配置 [pre-commit hook](https://pre-commit.com/) ,我们可以在提交代码时自动检查和格式化 `flake8`、`yapf`、`isort`、`trailing whitespaces`、`markdown files`,
+修复 `end-of-files`、`double-quoted-strings`、`python-encoding-pragma`、`mixed-line-ending`,调整 `requirments.txt` 的包顺序。
+pre-commit 钩子的配置可以在 [.pre-commit-config](../../../.pre-commit-config.yaml) 找到。
+
+pre-commit 具体的安装使用方式见[拉取请求](#2-配置-pre-commit)。
+
+更具体的规范请参考 [OpenMMLab 代码规范](../notes/code_style.md)。
+
+### C++ and CUDA
+
+C++ 和 CUDA 的代码规范遵从 [Google C++ Style Guide](https://google.github.io/styleguide/cppguide.html)
+
+## 拉取请求规范
+
+1. 使用 [pre-commit hook](https://pre-commit.com),尽量减少代码风格相关问题
+
+2. 一个`拉取请求`对应一个短期分支
+
+3. 粒度要细,一个`拉取请求`只做一件事情,避免超大的`拉取请求`
+
+   - Bad:实现 Faster R-CNN
+   - Acceptable:给 Faster R-CNN 添加一个 box head
+   - Good:给 box head 增加一个参数来支持自定义的 conv 层数
+
+4. 每次 Commit 时需要提供清晰且有意义 commit 信息
+
+5. 提供清晰且有意义的`拉取请求`描述
+
+   - 标题写明白任务名称,一般格式:\[Prefix\] Short description of the pull request (Suffix)
+   - prefix:新增功能 \[Feature\], 修 bug \[Fix\], 文档相关 \[Docs\], 开发中 \[WIP\] (暂时不会被 review)
+   - 描述里介绍`拉取请求`的主要修改内容,结果,以及对其他部分的影响, 参考`拉取请求`模板
+   - 关联相关的`议题` (issue) 和其他`拉取请求`
+
+6. 如果引入了其他三方库,或借鉴了三方库的代码,请确认他们的许可证和 mmyolo 兼容,并在借鉴的代码上补充 `This code is inspired from http://`
diff --git a/mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/dataset_preparation.md b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/dataset_preparation.md
new file mode 100644
index 0000000..25603a5
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/dataset_preparation.md
@@ -0,0 +1,144 @@
+# 数据集格式准备和说明
+
+## DOTA 数据集
+
+### 下载 DOTA 数据集
+
+数据集可以从 DOTA 数据集的主页 [DOTA](https://captain-whu.github.io/DOTA/dataset.html)
+或 [OpenDataLab](https://opendatalab.org.cn/DOTA_V1.0) 下载。
+
+我们推荐使用 [OpenDataLab](https://opendatalab.org.cn/DOTA_V1.0) 下载,其中的文件夹结构已经按照需要排列好了,只需要解压即可,不需要费心去调整文件夹结构。
+
+下载后解压数据集,并按如下文件夹结构存放。
+
+```none
+${DATA_ROOT}
+├── train
+│   ├── images
+│   │   ├── P0000.png
+│   │   ├── ...
+│   ├── labelTxt-v1.0
+│   │   ├── labelTxt
+│   │   │   ├── P0000.txt
+│   │   │   ├── ...
+│   │   ├── trainset_reclabelTxt
+│   │   │   ├── P0000.txt
+│   │   │   ├── ...
+├── val
+│   ├── images
+│   │   ├── P0003.png
+│   │   ├── ...
+│   ├── labelTxt-v1.0
+│   │   ├── labelTxt
+│   │   │   ├── P0003.txt
+│   │   │   ├── ...
+│   │   ├── valset_reclabelTxt
+│   │   │   ├── P0003.txt
+│   │   │   ├── ...
+├── test
+│   ├── images
+│   │   ├── P0006.png
+│   │   ├── ...
+
+```
+
+其中,以 `reclabelTxt` 为结尾的文件夹存放了水平检测框的标注,目前仅使用了 `labelTxt-v1.0` 中旋转框的标注。
+
+### 数据集切片
+
+我们提供了 `tools/dataset_converters/dota/dota_split.py` 脚本用于 DOTA 数据集的准备和切片。
+
+```shell
+python tools/dataset_converters/dota/dota_split.py \
+    [--splt-config ${SPLIT_CONFIG}] \
+    [--data-root ${DATA_ROOT}] \
+    [--out-dir ${OUT_DIR}] \
+    [--ann-subdir ${ANN_SUBDIR}] \
+    [--phase ${DATASET_PHASE}] \
+    [--nproc ${NPROC}] \
+    [--save-ext ${SAVE_EXT}] \
+    [--overwrite]
+```
+
+脚本依赖于 shapely 包,请先通过 `pip install shapely` 安装 shapely。
+
+**参数说明**:
+
+- `--splt-config` : 切片参数的配置文件。
+- `--data-root`: DOTA 数据集的存放位置。
+- `--out-dir`: 切片后的输出位置。
+- `--ann-subdir`: 标注文件夹的名字。 默认为 `labelTxt-v1.0` 。
+- `--phase`: 数据集的阶段。默认为 `trainval test` 。
+- `--nproc`: 进程数量。 默认为 8 。
+- `--save-ext`: 输出图像的扩展名,如置空则与原图保持一致。 默认为 `None` 。
+- `--overwrite`: 如果目标文件夹已存在,是否允许覆盖。
+
+基于 DOTA 数据集论文中提供的配置,我们提供了两种切片配置。
+
+`./split_config/single_scale.json` 用于单尺度 `single-scale` 切片
+`./split_config/multi_scale.json` 用于多尺度 `multi-scale` 切片
+
+DOTA 数据集通常使用 `trainval` 集进行训练,然后使用 `test` 集进行在线验证,大多数论文提供的也是在线验证的精度。
+如果你需要进行本地验证,可以准备 `train` 集和 `val` 集进行训练和测试。
+
+示例:
+
+使用单尺度切片配置准备 `trainval` 和 `test` 集
+
+```shell
+python tools/dataset_converters/dota/dota_split.py
+    --split-config 'tools/dataset_converters/dota/split_config/single_scale.json'
+    --data-root ${DATA_ROOT} \
+    --out-dir ${OUT_DIR}
+```
+
+准备 DOTA-v1.5 数据集,它的标注文件夹名字是 `labelTxt-v1.5`
+
+```shell
+python tools/dataset_converters/dota/dota_split.py
+    --split-config 'tools/dataset_converters/dota/split_config/single_scale.json'
+    --data-root ${DATA_ROOT} \
+    --out-dir ${OUT_DIR} \
+    --ann-subdir 'labelTxt-v1.5'
+```
+
+使用单尺度切片配置准备 `train` 和 `val` 集
+
+```shell
+python tools/dataset_converters/dota/dota_split.py
+    --split-config 'tools/dataset_converters/dota/split_config/single_scale.json'
+    --data-root ${DATA_ROOT} \
+    --phase train val \
+    --out-dir ${OUT_DIR}
+```
+
+使用多尺度切片配置准备 `trainval` 和 `test` 集
+
+```shell
+python tools/dataset_converters/dota/dota_split.py
+    --split-config 'tools/dataset_converters/dota/split_config/multi_scale.json'
+    --data-root ${DATA_ROOT} \
+    --out-dir ${OUT_DIR}
+```
+
+在运行完成后,输出的结构如下:
+
+```none
+${OUT_DIR}
+├── trainval
+│   ├── images
+│   │   ├── P0000__1024__0___0.png
+│   │   ├── ...
+│   ├── annfiles
+│   │   ├── P0000__1024__0___0.txt
+│   │   ├── ...
+├── test
+│   ├── images
+│   │   ├── P0006__1024__0___0.png
+│   │   ├── ...
+│   ├── annfiles
+│   │   ├── P0006__1024__0___0.txt
+│   │   ├── ...
+```
+
+此时将配置文件中的 `data_root` 修改为 ${OUT_DIR} 即可开始使用 DOTA 数据集训练。
diff --git a/mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/deploy/easydeploy_guide.md b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/deploy/easydeploy_guide.md
new file mode 100644
index 0000000..8f337e6
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/deploy/easydeploy_guide.md
@@ -0,0 +1,5 @@
+# EasyDeploy 部署
+
+本项目作为 MMYOLO 的部署 project 单独存在,意图剥离 MMDeploy 当前的体系,独自支持用户完成模型训练后的转换和部署功能,使用户的学习和工程成本下降。
+
+当前支持对 ONNX 格式和 TensorRT 格式的转换,后续对其他推理平台也会支持起来。
diff --git a/mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/deploy/index.rst b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/deploy/index.rst
new file mode 100644
index 0000000..3d5f08b
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/deploy/index.rst
@@ -0,0 +1,16 @@
+MMDeploy 部署必备教程
+************************
+
+.. toctree::
+   :maxdepth: 1
+
+   mmdeploy_guide.md
+   mmdeploy_yolov5.md
+
+EasyDeploy 部署必备教程
+************************
+
+.. toctree::
+   :maxdepth: 1
+
+   easydeploy_guide.md
diff --git a/mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/deploy/mmdeploy_guide.md b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/deploy/mmdeploy_guide.md
new file mode 100644
index 0000000..e935d36
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/deploy/mmdeploy_guide.md
@@ -0,0 +1,415 @@
+# MMDeploy 部署
+
+## MMDeploy 介绍
+
+MMDeploy 是 [OpenMMLab](https://openmmlab.com/) 模型部署工具箱,**为各算法库提供统一的部署体验**。基于 MMDeploy,开发者可以轻松从训练 repo 生成指定硬件所需 SDK,省去大量适配时间。
+
+更多介绍和使用指南见 https://mmdeploy.readthedocs.io/zh_CN/latest/get_started.html
+
+## 算法支持列表
+
+目前支持的 model-backend 组合:
+
+| Model  | Task            | OnnxRuntime | TensorRT |                              Model config                               |
+| :----- | :-------------- | :---------: | :------: | :---------------------------------------------------------------------: |
+| YOLOv5 | ObjectDetection |      Y      |    Y     | [config](https://github.com/open-mmlab/mmyolo/tree/main/configs/yolov5) |
+| YOLOv6 | ObjectDetection |      Y      |    Y     | [config](https://github.com/open-mmlab/mmyolo/tree/main/configs/yolov6) |
+| YOLOX  | ObjectDetection |      Y      |    Y     | [config](https://github.com/open-mmlab/mmyolo/tree/main/configs/yolox)  |
+| RTMDet | ObjectDetection |      Y      |    Y     | [config](https://github.com/open-mmlab/mmyolo/tree/main/configs/rtmdet) |
+
+ncnn 和其他后端的支持会在后续支持。
+
+## 安装
+
+按照[说明](https://mmdeploy.readthedocs.io/zh_CN/latest/get_started.html)安装 mmdeploy。
+
+```{note}
+如果安装的是 mmdeploy 预编译包,那么也请通过 ‘git clone https://github.com/open-mmlab/mmdeploy.git –depth=1’ 下载 mmdeploy 源码。因为它包含了部署时所需的 tools 文件夹。
+```
+
+## MMYOLO 中部署相关配置说明
+
+所有部署配置文件在 [`configs/deploy`](../../../configs/deploy/) 目录下。
+
+您可以部署静态输入或者动态输入的模型,因此您需要修改模型配置文件中与此相关的数据处理流程。
+
+MMDeploy 将后处理整合到自定义的算子中,因此您可以修改 `codebase_config` 中的 `post_processing` 参数来调整后处理策略,参数描述如下:
+
+```python
+codebase_config = dict(
+    type='mmyolo',
+    task='ObjectDetection',
+    model_type='end2end',
+    post_processing=dict(
+        score_threshold=0.05,
+        confidence_threshold=0.005,
+        iou_threshold=0.5,
+        max_output_boxes_per_class=200,
+        pre_top_k=5000,
+        keep_top_k=100,
+        background_label_id=-1),
+    module=['mmyolo.deploy'])
+```
+
+- `score_threshold`:在 `nms` 之前筛选候选框的类别分数阈值。
+- `confidence_threshold`:在 `nms` 之前筛选候选框的置信度分数阈值。
+- `iou_threshold`:在 `nms` 中去除重复框的 `iou` 阈值。
+- `max_output_boxes_per_class`:每个类别最大的输出框数量。
+- `pre_top_k`:在 `nms` 之前对候选框分数排序然后固定候选框的个数。
+- `keep_top_k`:`nms` 算法最终输出的候选框个数。
+- `background_label_id`:MMYOLO 算法中没有背景类别信息,置为 `-1` 即可。
+
+### 静态输入配置
+
+#### (1) 模型配置文件介绍
+
+以 MMYOLO 中的 `YOLOv5` 模型配置为例,下面是对部署时使用的模型配置文件参数说明介绍。
+
+```python
+_base_ = '../../yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py'
+
+test_pipeline = [
+    dict(type='LoadImageFromFile', backend_args=_base_.backend_args),
+    dict(
+        type='LetterResize',
+        scale=_base_.img_scale,
+        allow_scale_up=False,
+        use_mini_pad=False,
+    ),
+    dict(type='LoadAnnotations', with_bbox=True, _scope_='mmdet'),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                   'scale_factor', 'pad_param'))
+]
+
+test_dataloader = dict(
+    dataset=dict(pipeline=test_pipeline, batch_shapes_cfg=None))
+```
+
+`_base_ = '../../yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py'` 继承了训练时构建模型的配置。
+
+`test_pipeline` 为部署时对输入图像进行处理的流程,`LetterResize` 控制了输入图像的尺寸,同时限制了导出模型所能接受的输入尺寸。
+
+`test_dataloader` 为部署时构建数据加载器配置,`batch_shapes_cfg` 控制了是否启用 `batch_shapes` 策略,详细内容可以参考 [yolov5 配置文件说明](../../tutorials/config.md) 。
+
+#### (2) 部署配置文件介绍
+
+以 `MMYOLO` 中的 `YOLOv5` 部署配置为例,下面是对配置文件参数说明介绍。
+
+`ONNXRuntime` 部署 `YOLOv5` 可以使用 [`detection_onnxruntime_static.py`](https://github.com/open-mmlab/mmyolo/blob/main/configs/deploy/detection_onnxruntime_static.py) 配置。
+
+```python
+_base_ = ['./base_static.py']
+codebase_config = dict(
+    type='mmyolo',
+    task='ObjectDetection',
+    model_type='end2end',
+    post_processing=dict(
+        score_threshold=0.05,
+        confidence_threshold=0.005,
+        iou_threshold=0.5,
+        max_output_boxes_per_class=200,
+        pre_top_k=5000,
+        keep_top_k=100,
+        background_label_id=-1),
+    module=['mmyolo.deploy'])
+backend_config = dict(type='onnxruntime')
+```
+
+`backend_config` 中指定了部署后端 `type='onnxruntime'`,其他信息可参考第三小节。
+
+`TensorRT` 部署 `YOLOv5` 可以使用 [`detection_tensorrt_static-640x640.py`](https://github.com/open-mmlab/mmyolo/blob/main/configs/deploy/detection_tensorrt_static-640x640.py) 配置。
+
+```python
+_base_ = ['./base_static.py']
+onnx_config = dict(input_shape=(640, 640))
+backend_config = dict(
+    type='tensorrt',
+    common_config=dict(fp16_mode=False, max_workspace_size=1 << 30),
+    model_inputs=[
+        dict(
+            input_shapes=dict(
+                input=dict(
+                    min_shape=[1, 3, 640, 640],
+                    opt_shape=[1, 3, 640, 640],
+                    max_shape=[1, 3, 640, 640])))
+    ])
+use_efficientnms = False
+```
+
+`backend_config` 中指定了后端 `type=‘tensorrt’`。
+
+与 `ONNXRuntime` 部署配置不同的是,`TensorRT`  需要指定输入图片尺寸和构建引擎文件需要的参数,包括:
+
+- `onnx_config` 中指定 `input_shape=(640, 640)`
+- `backend_config['common_config']` 中包括 `fp16_mode=False` 和 `max_workspace_size=1 << 30`, `fp16_mode` 表示是否以 `fp16` 的参数格式构建引擎,`max_workspace_size` 表示当前 `gpu` 设备最大显存, 单位为 `GB`。`fp16` 的详细配置可以参考 [`detection_tensorrt-fp16_static-640x640.py`](https://github.com/open-mmlab/mmyolo/blob/main/configs/deploy/detection_tensorrt-fp16_static-640x640.py)
+- `backend_config['model_inputs']['input_shapes']['input']` 中 `min_shape` /`opt_shape`/`max_shape` 对应的值在静态输入下应该保持相同,即默认均为 `[1, 3, 640, 640]`。
+
+`use_efficientnms` 是 `MMYOLO` 系列新引入的配置,表示在导出 `onnx` 时是否启用`Efficient NMS Plugin`来替换 `MMDeploy` 中的 `TRTBatchedNMS plugin` 。
+
+可以参考 `TensorRT` 官方实现的 [Efficient NMS Plugin](https://github.com/NVIDIA/TensorRT/blob/main/plugin/efficientNMSPlugin/README.md) 获取更多详细信息。
+
+**注意**,这个功能仅仅在 TensorRT >= 8.0 版本才能使用,无需编译开箱即用。
+
+### 动态输入配置
+
+#### (1) 模型配置文件介绍
+
+当您部署动态输入模型时,您无需修改任何模型配置文件,仅需要修改部署配置文件即可。
+
+#### (2) 部署配置文件介绍
+
+`ONNXRuntime` 部署 `YOLOv5` 可以使用  [`detection_onnxruntime_dynamic.py`](https://github.com/open-mmlab/mmyolo/blob/main/configs/deploy/detection_onnxruntime_dynamic.py)  配置。
+
+```python
+_base_ = ['./base_dynamic.py']
+codebase_config = dict(
+    type='mmyolo',
+    task='ObjectDetection',
+    model_type='end2end',
+    post_processing=dict(
+        score_threshold=0.05,
+        confidence_threshold=0.005,
+        iou_threshold=0.5,
+        max_output_boxes_per_class=200,
+        pre_top_k=5000,
+        keep_top_k=100,
+        background_label_id=-1),
+    module=['mmyolo.deploy'])
+backend_config = dict(type='onnxruntime')
+```
+
+`backend_config` 中指定了后端 `type='onnxruntime'`,其他配置与上一节在 ONNXRuntime 部署静态输入模型相同。
+
+`TensorRT` 部署 `YOLOv5` 可以使用  [`detection_tensorrt_dynamic-192x192-960x960.py`](https://github.com/open-mmlab/mmyolo/blob/main/configs/deploy/detection_tensorrt_dynamic-192x192-960x960.py) 配置。
+
+```python
+_base_ = ['./base_dynamic.py']
+backend_config = dict(
+    type='tensorrt',
+    common_config=dict(fp16_mode=False, max_workspace_size=1 << 30),
+    model_inputs=[
+        dict(
+            input_shapes=dict(
+                input=dict(
+                    min_shape=[1, 3, 192, 192],
+                    opt_shape=[1, 3, 640, 640],
+                    max_shape=[1, 3, 960, 960])))
+    ])
+use_efficientnms = False
+```
+
+`backend_config` 中指定了后端 `type='tensorrt'`,由于 `TensorRT` 动态输入与静态输入有所不同,您可以了解更多动态输入相关信息通过访问 [TensorRT dynamic input official introduction](https://docs.nvidia.com/deeplearning/tensorrt/archives/tensorrt-843/developer-guide/index.html#work_dynamic_shapes)。
+
+`TensorRT` 部署需要配置 `min_shape`, `opt_shape`, `max_shape` ,`TensorRT` 限制输入图片的尺寸在 `min_shape` 和 ` max_shape` 之间。
+
+`min_shape` 为输入图片的最小尺寸,`opt_shape` 为输入图片常见尺寸, 在这个尺寸下推理性能最好,`max_shape` 为输入图片的最大尺寸。
+
+`use_efficientnms` 配置与上节 `TensorRT` 静态输入配置相同。
+
+### INT8 量化配置
+
+!!! 部署 TensorRT INT8 模型教程即将发布 !!!
+
+## 模型转换
+
+### 使用方法
+
+#### 从源码安装的 MMDeploy
+
+设置 `MMDeploy` 根目录为环境变量 `MMDEPLOY_DIR` ,例如 `export MMDEPLOY_DIR=/the/root/path/of/MMDeploy`
+
+```shell
+python3 ${MMDEPLOY_DIR}/tools/deploy.py \
+    ${DEPLOY_CFG_PATH} \
+    ${MODEL_CFG_PATH} \
+    ${MODEL_CHECKPOINT_PATH} \
+    ${INPUT_IMG} \
+    --test-img ${TEST_IMG} \
+    --work-dir ${WORK_DIR} \
+    --calib-dataset-cfg ${CALIB_DATA_CFG} \
+    --device ${DEVICE} \
+    --log-level INFO \
+    --show \
+    --dump-info
+```
+
+### 参数描述
+
+- `deploy_cfg` : mmdeploy 针对此模型的部署配置,包含推理框架类型、是否量化、输入 shape 是否动态等。配置文件之间可能有引用关系,`configs/deploy/detection_onnxruntime_static.py` 是一个示例。
+- `model_cfg` : MMYOLO 算法库的模型配置,例如 `configs/deploy/model/yolov5_s-deploy.py`, 与 mmdeploy 的路径无关。
+- `checkpoint` : torch 模型路径。可以 http/https 开头,详见 `mmengine.fileio` 的实现。
+- `img` : 模型转换时,用做测试的图像文件路径。
+- `--test-img` : 用于测试模型的图像文件路径。默认设置成`None`。
+- `--work-dir` : 工作目录,用来保存日志和模型文件。
+- `--calib-dataset-cfg` : 此参数只有int8模式下生效,用于校准数据集配置文件。若在int8模式下未传入参数,则会自动使用模型配置文件中的'val'数据集进行校准。
+- `--device` : 用于模型转换的设备。 默认是`cpu`,对于 trt 可使用 `cuda:0` 这种形式。
+- `--log-level` : 设置日记的等级,选项包括`'CRITICAL', 'FATAL', 'ERROR', 'WARN', 'WARNING', 'INFO', 'DEBUG', 'NOTSET'`。 默认是`INFO`。
+- `--show` : 是否显示检测的结果。
+- `--dump-info` : 是否输出 SDK 信息。
+
+#### 通过 pip install 安装的 MMDeploy
+
+假设当前的工作目录为 mmyolo 的根目录, 那么以 [YoloV5](https://github.com/open-mmlab/mmyolo/blob/main/configs/yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py) 模型为例,你可以从[此处](https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth)下载对应的 checkpoint,并使用以下代码将之转换为 onnx 模型:
+
+```python
+from mmdeploy.apis import torch2onnx
+from mmdeploy.backend.sdk.export_info import export2SDK
+
+img = 'demo/demo.jpg'
+work_dir = 'mmdeploy_models/mmyolo/onnx'
+save_file = 'end2end.onnx'
+deploy_cfg = 'configs/deploy/detection_onnxruntime_dynamic.py'
+model_cfg = 'configs/yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py'
+model_checkpoint = 'checkpoints/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth'
+device = 'cpu'
+
+# 1. convert model to onnx
+torch2onnx(img, work_dir, save_file, deploy_cfg, model_cfg,
+           model_checkpoint, device)
+
+# 2. extract pipeline info for inference by MMDeploy SDK
+export2SDK(deploy_cfg, model_cfg, work_dir, pth=model_checkpoint,
+           device=device)
+```
+
+## 模型规范
+
+在使用转换后的模型进行推理之前,有必要了解转换结果的结构。 它存放在 `--work-dir` 指定的路路径下。
+
+上例中的`mmdeploy_models/mmyolo/onnx`,结构如下:
+
+```
+mmdeploy_models/mmyolo/onnx
+├── deploy.json
+├── detail.json
+├── end2end.onnx
+└── pipeline.json
+```
+
+重要的是:
+
+- **end2end.onnx**: 推理引擎文件。可用 ONNX Runtime 推理
+- ***xxx*.json**:  mmdeploy SDK 推理所需的 meta 信息
+
+整个文件夹被定义为**mmdeploy SDK model**。换言之,**mmdeploy SDK model**既包括推理引擎,也包括推理 meta 信息。
+
+## 模型推理
+
+### 后端模型推理
+
+以上述模型转换后的 `end2end.onnx` 为例,你可以使用如下代码进行推理:
+
+```python
+from mmdeploy.apis.utils import build_task_processor
+from mmdeploy.utils import get_input_shape, load_config
+import torch
+
+deploy_cfg = 'configs/deploy/detection_onnxruntime_dynamic.py'
+model_cfg = 'configs/yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py'
+device = 'cpu'
+backend_model = ['mmdeploy_models/mmyolo/onnx/end2end.onnx']
+image = 'demo/demo.jpg'
+
+# read deploy_cfg and model_cfg
+deploy_cfg, model_cfg = load_config(deploy_cfg, model_cfg)
+
+# build task and backend model
+task_processor = build_task_processor(model_cfg, deploy_cfg, device)
+model = task_processor.build_backend_model(backend_model)
+
+# process input image
+input_shape = get_input_shape(deploy_cfg)
+model_inputs, _ = task_processor.create_input(image, input_shape)
+
+# do model inference
+with torch.no_grad():
+    result = model.test_step(model_inputs)
+
+# visualize results
+task_processor.visualize(
+    image=image,
+    model=model,
+    result=result[0],
+    window_name='visualize',
+    output_file='work_dir/output_detection.png')
+```
+
+运行上述代码后,你可以在 `work_dir` 中看到推理的结果图片 `output_detection.png`。
+
+### SDK模型推理
+
+你也可以参考如下代码,对 SDK model 进行推理:
+
+```python
+from mmdeploy_runtime import Detector
+import cv2
+
+img = cv2.imread('demo/demo.jpg')
+
+# create a detector
+detector = Detector(model_path='mmdeploy_models/mmyolo/onnx',
+                    device_name='cpu', device_id=0)
+# perform inference
+bboxes, labels, masks = detector(img)
+
+# visualize inference result
+indices = [i for i in range(len(bboxes))]
+for index, bbox, label_id in zip(indices, bboxes, labels):
+    [left, top, right, bottom], score = bbox[0:4].astype(int), bbox[4]
+    if score < 0.3:
+        continue
+
+    cv2.rectangle(img, (left, top), (right, bottom), (0, 255, 0))
+
+cv2.imwrite('work_dir/output_detection.png', img)
+```
+
+除了python API,mmdeploy SDK 还提供了诸如 C、C++、C#、Java等多语言接口。
+你可以参考[样例](https://github.com/open-mmlab/mmdeploy/tree/main/demo)学习其他语言接口的使用方法。
+
+## 模型评测
+
+当您将 PyTorch 模型转换为后端支持的模型后,您可能需要验证模型的精度,使用 `${MMDEPLOY_DIR}/tools/test.py`
+
+```shell
+python3 ${MMDEPLOY_DIR}/tools/test.py \
+    ${DEPLOY_CFG} \
+    ${MODEL_CFG} \
+    --model ${BACKEND_MODEL_FILES} \
+    --device ${DEVICE} \
+    --work-dir ${WORK_DIR} \
+    [--cfg-options ${CFG_OPTIONS}] \
+    [--show] \
+    [--show-dir ${OUTPUT_IMAGE_DIR}] \
+    [--interval ${INTERVAL}] \
+    [--wait-time ${WAIT_TIME}] \
+    [--log2file work_dirs/output.txt]
+    [--speed-test] \
+    [--warmup ${WARM_UP}] \
+    [--log-interval ${LOG_INTERVERL}] \
+    [--batch-size ${BATCH_SIZE}] \
+    [--uri ${URI}]
+```
+
+### 参数描述
+
+- `deploy_cfg`: 部署配置文件。
+- `model_cfg`: MMYOLO 模型配置文件。
+- `--model`: 导出的后端模型。 例如, 如果我们导出了 TensorRT 模型,我们需要传入后缀为 ".engine" 文件路径。
+- `--device`: 运行模型的设备。请注意,某些后端会限制设备。例如,TensorRT 必须在 cuda 上运行。
+- `--work-dir`: 模型转换、报告生成的路径。
+- `--cfg-options`: 传入额外的配置,将会覆盖当前部署配置。
+- `--show`: 是否在屏幕上显示评估结果。
+- `--show-dir`: 保存评估结果的目录。(只有给出这个参数才会保存结果)。
+- `--interval`: 屏幕上显示评估结果的间隔。
+- `--wait-time`: 每个窗口的显示时间
+- `--log2file`: 将评估结果(和速度)记录到文件中。
+- `--speed-test`: 是否开启速度测试。
+- `--warmup`: 在计算推理时间之前进行预热,需要先开启 `speed-test`。
+- `--log-interval`: 每个日志之间的间隔,需要先设置 `speed-test`。
+- `--batch-size`: 推理的批量大小,它将覆盖数据配置中的 `samples_per_gpu`。默认为 `1`。请注意,并非所有模型都支持 `batch_size > 1`。
+- `--uri`: 在边缘设备上推理时的 ipv4 或 ipv6 端口号。
+
+注意:`${MMDEPLOY_DIR}/tools/test.py` 中的其他参数用于速度测试。他们不影响评估。
diff --git a/mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/deploy/mmdeploy_yolov5.md b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/deploy/mmdeploy_yolov5.md
new file mode 100644
index 0000000..e035e17
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/deploy/mmdeploy_yolov5.md
@@ -0,0 +1,572 @@
+# YOLOv5 部署全流程说明
+
+请先参考 [`部署必备指南`](./mmdeploy_guide.md) 了解部署配置文件等相关信息。
+
+## 模型训练和测试
+
+模型训练和测试请参考 [YOLOv5 从入门到部署全流程](./mmdeploy_yolov5.md) 。
+
+## 准备 MMDeploy 运行环境
+
+安装 `MMDeploy` 请参考 [`源码手动安装`](https://github.com/open-mmlab/mmdeploy/blob/dev-1.x/docs/zh_cn/01-how-to-build/build_from_source.md) ,选择您所使用的平台编译 `MMDeploy` 和自定义算子。
+
+*注意!* 如果环境安装有问题,可以查看 [`MMDeploy FAQ`](https://github.com/open-mmlab/mmdeploy/blob/dev-1.x/docs/zh_cn/faq.md) 或者在 `issuse` 中提出您的问题。
+
+## 准备模型配置文件
+
+本例将以基于 `coco` 数据集预训练的 `YOLOv5` 配置和权重进行部署的全流程讲解,包括静态/动态输入模型导出和推理,`TensorRT` / `ONNXRuntime` 两种后端部署和测试。
+
+### 静态输入配置
+
+#### (1) 模型配置文件
+
+当您需要部署静态输入模型时,您应该确保模型的输入尺寸是固定的,比如在测试流程或测试数据集加载时输入尺寸为 `640x640`。
+
+您可以查看 [`yolov5_s-static.py`](https://github.com/open-mmlab/mmyolo/tree/main/configs/deploy/model/yolov5_s-static.py) 中测试流程或测试数据集加载部分,如下所示:
+
+```python
+_base_ = '../../yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py'
+
+test_pipeline = [
+    dict(type='LoadImageFromFile', backend_args=_base_.backend_args),
+    dict(
+        type='LetterResize',
+        scale=_base_.img_scale,
+        allow_scale_up=False,
+        use_mini_pad=False,
+    ),
+    dict(type='LoadAnnotations', with_bbox=True, _scope_='mmdet'),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                   'scale_factor', 'pad_param'))
+]
+
+test_dataloader = dict(
+    dataset=dict(pipeline=test_pipeline, batch_shapes_cfg=None))
+```
+
+由于 `yolov5` 在测试时会开启 `allow_scale_up` 和 `use_mini_pad` 改变输入图像的尺寸来取得更高的精度,但是会给部署静态输入模型造成输入尺寸不匹配的问题。
+
+该配置相比与原始配置文件进行了如下修改:
+
+- 关闭 `test_pipline` 中改变尺寸相关的配置,如 `LetterResize` 中 `allow_scale_up=False` 和 `use_mini_pad=False` 。
+- 关闭 `test_dataloader` 中 `batch shapes` 策略,即 `batch_shapes_cfg=None` 。
+
+#### (2) 部署配置文件
+
+当您部署在 `ONNXRuntime` 时,您可以查看 [`detection_onnxruntime_static.py`](https://github.com/open-mmlab/mmyolo/tree/main/configs/deploy/detection_onnxruntime_static.py) ,如下所示:
+
+```python
+_base_ = ['./base_static.py']
+codebase_config = dict(
+    type='mmyolo',
+    task='ObjectDetection',
+    model_type='end2end',
+    post_processing=dict(
+        score_threshold=0.05,
+        confidence_threshold=0.005,
+        iou_threshold=0.5,
+        max_output_boxes_per_class=200,
+        pre_top_k=5000,
+        keep_top_k=100,
+        background_label_id=-1),
+    module=['mmyolo.deploy'])
+backend_config = dict(type='onnxruntime')
+```
+
+默认配置中的 `post_processing` 后处理参数是当前模型与 `pytorch` 模型精度对齐的配置,若您需要修改相关参数,可以参考 [`部署必备指南`](./mmdeploy_guide.md) 的详细介绍。
+
+当您部署在 `TensorRT` 时,您可以查看 [`detection_tensorrt_static-640x640.py`](https://github.com/open-mmlab/mmyolo/tree/main/configs/deploy/detection_tensorrt_static-640x640.py) ,如下所示:
+
+```python
+_base_ = ['./base_static.py']
+onnx_config = dict(input_shape=(640, 640))
+backend_config = dict(
+    type='tensorrt',
+    common_config=dict(fp16_mode=False, max_workspace_size=1 << 30),
+    model_inputs=[
+        dict(
+            input_shapes=dict(
+                input=dict(
+                    min_shape=[1, 3, 640, 640],
+                    opt_shape=[1, 3, 640, 640],
+                    max_shape=[1, 3, 640, 640])))
+    ])
+use_efficientnms = False
+```
+
+本例使用了默认的输入尺寸 `input_shape=(640, 640)` ,构建网络以 `fp32` 模式即 `fp16_mode=False`,并且默认构建 `TensorRT` 构建引擎所使用的显存 `max_workspace_size=1 << 30` 即最大为 `1GB` 显存。
+
+### 动态输入配置
+
+#### (1) 模型配置文件
+
+当您需要部署动态输入模型时,模型的输入可以为任意尺寸(`TensorRT` 会限制最小和最大输入尺寸),因此使用默认的 [`yolov5_s-v61_syncbn_8xb16-300e_coco.py`](https://github.com/open-mmlab/mmyolo/tree/main/configs/yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py) 模型配置文件即可,其中数据处理和数据集加载器部分如下所示:
+
+```python
+batch_shapes_cfg = dict(
+    type='BatchShapePolicy',
+    batch_size=val_batch_size_per_gpu,
+    img_size=img_scale[0],
+    size_divisor=32,
+    extra_pad_ratio=0.5)
+
+test_pipeline = [
+    dict(type='LoadImageFromFile', backend_args=_base_.backend_args),
+    dict(type='YOLOv5KeepRatioResize', scale=img_scale),
+    dict(
+        type='LetterResize',
+        scale=img_scale,
+        allow_scale_up=False,
+        pad_val=dict(img=114)),
+    dict(type='LoadAnnotations', with_bbox=True, _scope_='mmdet'),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                   'scale_factor', 'pad_param'))
+]
+
+val_dataloader = dict(
+    batch_size=val_batch_size_per_gpu,
+    num_workers=val_num_workers,
+    persistent_workers=persistent_workers,
+    pin_memory=True,
+    drop_last=False,
+    sampler=dict(type='DefaultSampler', shuffle=False),
+    dataset=dict(
+        type=dataset_type,
+        data_root=data_root,
+        test_mode=True,
+        data_prefix=dict(img='val2017/'),
+        ann_file='annotations/instances_val2017.json',
+        pipeline=test_pipeline,
+        batch_shapes_cfg=batch_shapes_cfg))
+```
+
+其中 `LetterResize` 类初始化传入了 `allow_scale_up=False` 控制输入的小图像是否上采样,同时默认 `use_mini_pad=False` 关闭了图片最小填充策略,`val_dataloader['dataset']`中传入了 `batch_shapes_cfg=batch_shapes_cfg`,即按照 `batch` 内的输入尺寸进行最小填充。上述策略会改变输入图像的尺寸,因此动态输入模型在测试时会按照上述数据集加载器动态输入。
+
+#### (2) 部署配置文件
+
+当您部署在 `ONNXRuntime` 时,您可以查看 [`detection_onnxruntime_dynamic.py`](https://github.com/open-mmlab/mmyolo/blob/main/configs/deploy/detection_onnxruntime_dynamic.py) ,如下所示:
+
+```python
+_base_ = ['./base_dynamic.py']
+codebase_config = dict(
+    type='mmyolo',
+    task='ObjectDetection',
+    model_type='end2end',
+    post_processing=dict(
+        score_threshold=0.05,
+        confidence_threshold=0.005,
+        iou_threshold=0.5,
+        max_output_boxes_per_class=200,
+        pre_top_k=5000,
+        keep_top_k=100,
+        background_label_id=-1),
+    module=['mmyolo.deploy'])
+backend_config = dict(type='onnxruntime')
+```
+
+与静态输入配置仅有 `_base_ = ['./base_dynamic.py']` 不同,动态输入会额外继承 `dynamic_axes` 属性。其他配置与静态输入配置相同。
+
+当您部署在 `TensorRT` 时,您可以查看 [`detection_tensorrt_dynamic-192x192-960x960.py`](https://github.com/open-mmlab/mmyolo/tree/main/configs/deploy/detection_tensorrt_dynamic-192x192-960x960.py) ,如下所示:
+
+```python
+_base_ = ['./base_dynamic.py']
+backend_config = dict(
+    type='tensorrt',
+    common_config=dict(fp16_mode=False, max_workspace_size=1 << 30),
+    model_inputs=[
+        dict(
+            input_shapes=dict(
+                input=dict(
+                    min_shape=[1, 3, 192, 192],
+                    opt_shape=[1, 3, 640, 640],
+                    max_shape=[1, 3, 960, 960])))
+    ])
+use_efficientnms = False
+```
+
+本例构建网络以 `fp32` 模式即 `fp16_mode=False`,构建 `TensorRT` 构建引擎所使用的显存 `max_workspace_size=1 << 30` 即最大为 `1GB` 显存。
+
+同时默认配置 `min_shape=[1, 3, 192, 192]`,`opt_shape=[1, 3, 640, 640]` ,`max_shape=[1, 3, 960, 960]` ,意为该模型所能接受的输入尺寸最小为 `192x192` ,最大为 `960x960`,最常见尺寸为 `640x640`。
+
+当您部署自己的模型时,需要根据您的输入图像尺寸进行调整。
+
+## 模型转换
+
+本教程所使用的 `MMDeploy` 根目录为 `/home/openmmlab/dev/mmdeploy`,请注意修改为您的 `MMDeploy` 目录。
+预训练权重下载于 [yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth](https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth) ,保存在本地的 `/home/openmmlab/dev/mmdeploy/yolov5s.pth`。
+
+```shell
+wget https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth -O /home/openmmlab/dev/mmdeploy/yolov5s.pth
+```
+
+命令行执行以下命令配置相关路径:
+
+```shell
+export MMDEPLOY_DIR=/home/openmmlab/dev/mmdeploy
+export PATH_TO_CHECKPOINTS=/home/openmmlab/dev/mmdeploy/yolov5s.pth
+```
+
+### YOLOv5 静态输入模型导出
+
+#### ONNXRuntime
+
+```shell
+python3 ${MMDEPLOY_DIR}/tools/deploy.py \
+    configs/deploy/detection_onnxruntime_static.py \
+    configs/deploy/model/yolov5_s-static.py \
+    ${PATH_TO_CHECKPOINTS} \
+    demo/demo.jpg \
+    --work-dir work_dir \
+    --show \
+    --device cpu
+```
+
+#### TensorRT
+
+```shell
+python3 ${MMDEPLOY_DIR}/tools/deploy.py \
+    configs/deploy/detection_tensorrt_static-640x640.py \
+    configs/deploy/model/yolov5_s-static.py \
+    ${PATH_TO_CHECKPOINTS} \
+    demo/demo.jpg \
+    --work-dir work_dir \
+    --show \
+    --device cuda:0
+```
+
+### YOLOv5 动态输入模型导出
+
+#### ONNXRuntime
+
+```shell
+python3 ${MMDEPLOY_DIR}/tools/deploy.py \
+    configs/deploy/detection_onnxruntime_dynamic.py \
+    configs/yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py \
+    ${PATH_TO_CHECKPOINTS} \
+    demo/demo.jpg \
+    --work-dir work_dir \
+    --show \
+    --device cpu
+    --dump-info
+```
+
+#### TensorRT
+
+```shell
+python3 ${MMDEPLOY_DIR}/tools/deploy.py \
+    configs/deploy/detection_tensorrt_dynamic-192x192-960x960.py \
+    configs/yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py \
+    ${PATH_TO_CHECKPOINTS} \
+    demo/demo.jpg \
+    --work-dir work_dir \
+    --show \
+    --device cuda:0
+    --dump-info
+```
+
+当您使用上述命令转换模型时,您将会在 `work_dir` 文件夹下发现以下文件:
+
+![image](https://github.com/open-mmlab/mmdeploy/assets/110151316/760f3f7f-aa23-46cf-987c-717d3490246f)
+
+或者
+
+![image](https://github.com/open-mmlab/mmdeploy/assets/110151316/732bcd9a-fca0-40ba-b5af-540a47eb9c35)
+
+在导出 `onnxruntime`模型后,您将得到图1的六个文件,其中 `end2end.onnx` 表示导出的`onnxruntime`模型,`xxx.json` 表示 `MMDeploy SDK` 推理所需要的 meta 信息。
+
+在导出 `TensorRT`模型后,您将得到图2的七个文件,其中 `end2end.onnx` 表示导出的中间模型,`MMDeploy`利用该模型自动继续转换获得 `end2end.engine` 模型用于 `TensorRT `部署,`xxx.json` 表示 `MMDeploy SDK` 推理所需要的 meta 信息。
+
+## 模型评测
+
+当您转换模型成功后,可以使用 `${MMDEPLOY_DIR}/tools/test.py` 工具对转换后的模型进行评测。下面是对 `ONNXRuntime` 和 `TensorRT` 静态模型的评测,动态模型评测修改传入模型配置即可。
+
+### ONNXRuntime
+
+```shell
+python3 ${MMDEPLOY_DIR}/tools/test.py \
+        configs/deploy/detection_onnxruntime_static.py \
+        configs/deploy/model/yolov5_s-static.py \
+        --model work_dir/end2end.onnx  \
+        --device cpu \
+        --work-dir work_dir
+```
+
+执行完成您将看到命令行输出检测结果指标如下:
+
+![image](https://user-images.githubusercontent.com/92794867/199380483-cf8d867b-7309-4994-938a-f743f4cada77.png)
+
+### TensorRT
+
+**注意**: TensorRT 需要执行设备是 `cuda`
+
+```shell
+python3 ${MMDEPLOY_DIR}/tools/test.py \
+        configs/deploy/detection_tensorrt_static-640x640.py \
+        configs/deploy/model/yolov5_s-static.py \
+        --model work_dir/end2end.engine  \
+        --device cuda:0 \
+        --work-dir work_dir
+```
+
+执行完成您将看到命令行输出检测结果指标如下:
+
+![image](https://user-images.githubusercontent.com/92794867/199380370-da15cfca-2723-4e5b-b6cf-0afb5f44a66a.png)
+
+**未来我们将会支持模型测速等更加实用的脚本**
+
+# 使用 Docker 部署测试
+
+`MMYOLO` 提供了一个 [`Dockerfile`](https://github.com/open-mmlab/mmyolo/blob/main/docker/Dockerfile_deployment) 用于构建镜像。请确保您的 `docker` 版本大于等于 `19.03`。
+
+温馨提示;国内用户建议取消掉 [`Dockerfile`](https://github.com/open-mmlab/mmyolo/blob/main/docker/Dockerfile_deployment) 里面 `Optional` 后两行的注释,可以获得火箭一般的下载提速:
+
+```dockerfile
+# (Optional)
+RUN sed -i 's/http:\/\/archive.ubuntu.com\/ubuntu\//http:\/\/mirrors.aliyun.com\/ubuntu\//g' /etc/apt/sources.list && \
+    pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
+```
+
+构建命令:
+
+```bash
+# build an image with PyTorch 1.12, CUDA 11.6, TensorRT 8.2.4 ONNXRuntime 1.8.1
+docker build -f docker/Dockerfile_deployment -t mmyolo:v1 .
+```
+
+用以下命令运行 Docker 镜像:
+
+```bash
+export DATA_DIR=/path/to/your/dataset
+docker run --gpus all --shm-size=8g -it --name mmyolo -v ${DATA_DIR}:/openmmlab/mmyolo/data/coco mmyolo:v1
+```
+
+`DATA_DIR` 是 COCO 数据的路径。
+
+复制以下脚本到 `docker` 容器 `/openmmlab/mmyolo/script.sh`:
+
+```bash
+#!/bin/bash
+wget -q https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth \
+  -O yolov5s.pth
+export MMDEPLOY_DIR=/openmmlab/mmdeploy
+export PATH_TO_CHECKPOINTS=/openmmlab/mmyolo/yolov5s.pth
+
+python3 ${MMDEPLOY_DIR}/tools/deploy.py \
+  configs/deploy/detection_tensorrt_static-640x640.py \
+  configs/deploy/model/yolov5_s-static.py \
+  ${PATH_TO_CHECKPOINTS} \
+  demo/demo.jpg \
+  --work-dir work_dir_trt \
+  --device cuda:0
+
+python3 ${MMDEPLOY_DIR}/tools/test.py \
+  configs/deploy/detection_tensorrt_static-640x640.py \
+  configs/deploy/model/yolov5_s-static.py \
+  --model work_dir_trt/end2end.engine \
+  --device cuda:0 \
+  --work-dir work_dir_trt
+
+python3 ${MMDEPLOY_DIR}/tools/deploy.py \
+  configs/deploy/detection_onnxruntime_static.py \
+  configs/deploy/model/yolov5_s-static.py \
+  ${PATH_TO_CHECKPOINTS} \
+  demo/demo.jpg \
+  --work-dir work_dir_ort \
+  --device cpu
+
+python3 ${MMDEPLOY_DIR}/tools/test.py \
+  configs/deploy/detection_onnxruntime_static.py \
+  configs/deploy/model/yolov5_s-static.py \
+  --model work_dir_ort/end2end.onnx \
+  --device cpu \
+  --work-dir work_dir_ort
+```
+
+在 `/openmmlab/mmyolo` 下运行:
+
+```bash
+sh script.sh
+```
+
+脚本会自动下载 `MMYOLO` 的 `YOLOv5` 预训练权重并使用 `MMDeploy` 进行模型转换和测试。您将会看到以下输出:
+
+- TensorRT:
+
+  ![image](https://user-images.githubusercontent.com/92794867/199657349-1bad9196-c00b-4a65-84f5-80f51e65a2bd.png)
+
+- ONNXRuntime:
+
+  ![image](https://user-images.githubusercontent.com/92794867/199657283-95412e84-3ba4-463f-b4b2-4bf52ec4acbd.png)
+
+可以看到,经过 `MMDeploy` 部署的模型与 [MMYOLO-YOLOv5](https://github.com/open-mmlab/mmyolo/tree/main/configs/yolov5#results-and-models) 的 mAP-37.7 差距在 1% 以内。
+
+如果您需要测试您的模型推理速度,可以使用以下命令:
+
+- TensorRT
+
+```shell
+python3 ${MMDEPLOY_DIR}/tools/profiler.py \
+  configs/deploy/detection_tensorrt_static-640x640.py \
+  configs/deploy/model/yolov5_s-static.py \
+  data/coco/val2017 \
+  --model work_dir_trt/end2end.engine \
+  --device cuda:0
+```
+
+- ONNXRuntime
+
+```shell
+python3 ${MMDEPLOY_DIR}/tools/profiler.py \
+  configs/deploy/detection_onnxruntime_static.py \
+  configs/deploy/model/yolov5_s-static.py \
+  data/coco/val2017 \
+  --model work_dir_ort/end2end.onnx \
+  --device cpu
+```
+
+## 模型推理
+
+### 后端模型推理
+
+#### ONNXRuntime
+
+以上述模型转换后的 `end2end.onnx` 为例,您可以使用如下代码进行推理:
+
+```python
+from mmdeploy.apis.utils import build_task_processor
+from mmdeploy.utils import get_input_shape, load_config
+import torch
+
+deploy_cfg = './configs/deploy/detection_onnxruntime_dynamic.py'
+model_cfg = '../mmyolo/configs/yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py'
+device = 'cpu'
+backend_model = ['./work_dir/end2end.onnx']
+image = '../mmyolo/demo/demo.jpg'
+
+# read deploy_cfg and model_cfg
+deploy_cfg, model_cfg = load_config(deploy_cfg, model_cfg)
+
+# build task and backend model
+task_processor = build_task_processor(model_cfg, deploy_cfg, device)
+model = task_processor.build_backend_model(backend_model)
+
+# process input image
+input_shape = get_input_shape(deploy_cfg)
+model_inputs, _ = task_processor.create_input(image, input_shape)
+
+# do model inference
+with torch.no_grad():
+    result = model.test_step(model_inputs)
+
+# visualize results
+task_processor.visualize(
+    image=image,
+    model=model,
+    result=result[0],
+    window_name='visualize',
+    output_file='work_dir/output_detection.png')
+```
+
+#### TensorRT
+
+以上述模型转换后的 `end2end.engine` 为例,您可以使用如下代码进行推理:
+
+```python
+from mmdeploy.apis.utils import build_task_processor
+from mmdeploy.utils import get_input_shape, load_config
+import torch
+
+deploy_cfg = './configs/deploy/detection_tensorrt_dynamic-192x192-960x960.py'
+model_cfg = '../mmyolo/configs/yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py'
+device = 'cuda:0'
+backend_model = ['./work_dir/end2end.engine']
+image = '../mmyolo/demo/demo.jpg'
+
+# read deploy_cfg and model_cfg
+deploy_cfg, model_cfg = load_config(deploy_cfg, model_cfg)
+
+# build task and backend model
+task_processor = build_task_processor(model_cfg, deploy_cfg, device)
+model = task_processor.build_backend_model(backend_model)
+
+# process input image
+input_shape = get_input_shape(deploy_cfg)
+model_inputs, _ = task_processor.create_input(image, input_shape)
+
+# do model inference
+with torch.no_grad():
+    result = model.test_step(model_inputs)
+
+# visualize results
+task_processor.visualize(
+    image=image,
+    model=model,
+    result=result[0],
+    window_name='visualize',
+    output_file='work_dir/output_detection.png')
+```
+
+### SDK 模型推理
+
+#### ONNXRuntime
+
+以上述模型转换后的 `end2end.onnx` 为例,您可以使用如下代码进行 `SDK` 推理:
+
+```python
+from mmdeploy_runtime import Detector
+import cv2
+
+img = cv2.imread('../mmyolo/demo/demo.jpg')
+
+# create a detector
+detector = Detector(model_path='work_dir',
+                    device_name='cpu', device_id=0)
+# perform inference
+bboxes, labels, masks = detector(img)
+
+# visualize inference result
+indices = [i for i in range(len(bboxes))]
+for index, bbox, label_id in zip(indices, bboxes, labels):
+    [left, top, right, bottom], score = bbox[0:4].astype(int), bbox[4]
+    if score < 0.3:
+        continue
+
+    cv2.rectangle(img, (left, top), (right, bottom), (0, 255, 0))
+
+cv2.imwrite('work_dir/output_detection.png', img)
+```
+
+#### TensorRT
+
+以上述模型转换后的 `end2end.engine` 为例,您可以使用如下代码进行 `SDK` 推理:
+
+```python
+from mmdeploy_runtime import Detector
+import cv2
+
+img = cv2.imread('../mmyolo/demo/demo.jpg')
+
+# create a detector
+detector = Detector(model_path='work_dir',
+                    device_name='cuda', device_id=0)
+# perform inference
+bboxes, labels, masks = detector(img)
+
+# visualize inference result
+indices = [i for i in range(len(bboxes))]
+for index, bbox, label_id in zip(indices, bboxes, labels):
+    [left, top, right, bottom], score = bbox[0:4].astype(int), bbox[4]
+    if score < 0.3:
+        continue
+
+    cv2.rectangle(img, (left, top), (right, bottom), (0, 255, 0))
+
+cv2.imwrite('work_dir/output_detection.png', img)
+```
+
+除了python API,mmdeploy SDK 还提供了诸如 C、C++、C#、Java等多语言接口。
+你可以参考[样例](https://github.com/open-mmlab/mmdeploy/tree/main/demo)学习其他语言接口的使用方法。
diff --git a/mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/labeling_to_deployment_tutorials.md b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/labeling_to_deployment_tutorials.md
new file mode 100644
index 0000000..d4e3ddf
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/labeling_to_deployment_tutorials.md
@@ -0,0 +1,1326 @@
+# 标注+训练+测试+部署全流程
+
+在平时的工作学习中,我们经常会遇到一些任务需要训练自定义的私有数据集,开源数据集去作为上线模型的场景比较少,这就需要我们对自己的私有数据集进行一系列的操作,以确保模型能够上线生产服务于客户。
+
+```{SeeAlso}
+本文档配套的视频已发布在 B 站,可前去查看: [自定义数据集从标注到部署保姆级教程](https://www.bilibili.com/video/BV1RG4y137i5)
+```
+
+```{Note}
+本教程所有指令是在 Linux 上面完成,Windows 也是完全可用的,但是命令和操作稍有不同。
+```
+
+本教程默认您已经完成 MMYOLO 的安装,如果未安装,请参考文档 [开始你的第一步](https://mmyolo.readthedocs.io/zh_CN/latest/get_started.html#id1) 进行安装。
+
+本教程涵盖从 用户自定义图片数据集标注 到 最终进行训练和部署 的整体流程。步骤概览如下:
+
+01. 数据集准备:`tools/misc/download_dataset.py`
+02. 使用 [labelme](https://github.com/wkentaro/labelme) 和算法进行辅助和优化数据集标注:`demo/image_demo.py` + labelme
+03. 使用脚本转换成 COCO 数据集格式:`tools/dataset_converters/labelme2coco.py`
+04. 数据集划分为训练集、验证集和测试集:`tools/misc/coco_split.py`
+05. 根据数据集内容新建 config 文件
+06. 数据集可视化分析:`tools/analysis_tools/dataset_analysis.py`
+07. 优化 Anchor 尺寸:`tools/analysis_tools/optimize_anchors.py`
+08. 可视化 config 配置中数据处理部分: `tools/analysis_tools/browse_dataset.py`
+09. 训练:`tools/train.py`
+10. 推理:`demo/image_demo.py`
+11. 部署
+
+```{Note}
+在训练得到模型权重和验证集的 mAP 后,用户需要对预测错误的 bad case 进行深入分析,以便优化模型,MMYOLO 在后续会增加这个功能,敬请期待。
+```
+
+下面详细介绍每一步。
+
+## 1. 数据集准备
+
+- 如果您现在暂时没有自己的数据集,亦或者想尝试用一个小型数据集来跑通我们的整体流程,可以使用本教程提供的一个 144 张图片的 `cat` 数据集(本 `cat` 数据集由 @RangeKing 提供原始图片,由 @PeterH0323 进行数据清洗)。本教程的剩余部分都将以此 `cat` 数据集为例进行讲解。
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/25873202/205423220-c4b8f2fd-22ba-4937-8e47-1b3f6a8facd8.png" alt="cat dataset"/>
+</div>
+
+下载也非常简单,只需要一条命令即可完成(数据集压缩包大小 `217 MB`):
+
+```shell
+python tools/misc/download_dataset.py --dataset-name cat --save-dir ./data/cat --unzip --delete
+```
+
+该命令会自动下载数据集到 `./data/cat` 文件夹中,该文件的目录结构是:
+
+```shell
+.
+└── ./data/cat
+    ├── images # 图片文件
+    │    ├── image1.jpg
+    │    ├── image2.png
+    │    └── ...
+    ├── labels # labelme 标注文件
+    │    ├── image1.json
+    │    ├── image2.json
+    │    └── ...
+    ├── annotations # 数据集划分的 COCO 文件
+    │    ├── annotations_all.json # 全量数据的 COCO label 文件
+    │    ├── trainval.json # 划分比例 80% 的数据
+    │    └── test.json # 划分比例 20% 的数据
+    └── class_with_id.txt # id + class_name 文件
+```
+
+这个数据集可以直接训练,如果您想体验整个流程的话,可以将 `images` 文件夹**以外的**其余文件都删除。
+
+- 如您已经有数据,可以将其组成下面的结构:
+
+```shell
+.
+└── $DATA_ROOT
+    └── images
+         ├── image1.jpg
+         ├── image2.png
+         └── ...
+```
+
+## 2. 使用 labelme 和算法进行辅助和优化数据集标注
+
+通常,标注有 2 种方法:
+
+- 软件或者算法辅助 + 人工修正 label(推荐,降本提速)
+- 仅人工标注
+
+```{Note}
+目前我们也在考虑接入第三方库来支持通过 GUI 界面调用 MMYOLO 推理接口实现算法辅助标注和人工优化标注一体功能。
+如果您有兴趣或者想法可以在 issue 留言或直接联系我们!
+```
+
+### 2.1 软件或者算法辅助 + 人工修正 label
+
+辅助标注的原理是用已有模型进行推理,将得出的推理信息保存为标注软件 label 文件格式。然后人工操作标注软件加载生成好的 label 文件,只需要检查每张图片的目标是否标准,以及是否有漏掉、错标的目标。【软件或者算法辅助 + 人工修正 label】这种方式可以节省很多时间和精力,达到**降本提速**的目的。
+
+```{Note}
+如果已有模型(典型的如 COCO 预训练模型)没有您自定义新数据集的类别,建议先人工打 100 张左右的图片 label,训练个初始模型,然后再进行辅助标注。
+```
+
+下面会分别介绍其过程:
+
+#### 2.1.1 软件或者算法辅助
+
+使用 MMYOLO 提供的模型推理脚本 `demo/image_demo.py`,并设置 `--to-labelme` 则可以将推理结果生成 labelme 格式的 label 文件,具体用法如下:
+
+```shell
+python demo/image_demo.py img \
+                          config \
+                          checkpoint
+                          [--out-dir OUT_DIR] \
+                          [--device DEVICE] \
+                          [--show] \
+                          [--deploy] \
+                          [--score-thr SCORE_THR] \
+                          [--class-name CLASS_NAME]
+                          [--to-labelme]
+```
+
+其中:
+
+- `img`: 图片的路径,支持文件夹、文件、URL;
+- `config`:用到的模型 config 文件路径;
+- `checkpoint`:用到的模型权重文件路径;
+- `--out-dir`:推理结果输出到指定目录下,默认为 `./output`,当 `--show` 参数存在时,不保存检测结果;
+- `--device`:使用的计算资源,包括 `CUDA`, `CPU` 等,默认为 `cuda:0`;
+- `--show`:使用该参数表示在屏幕上显示检测结果,默认为 `False`;
+- `--deploy`:是否切换成 deploy 模式;
+- `--score-thr`:置信度阈值,默认为 `0.3`;
+- `--to-labelme`:是否导出 `labelme` 格式的 label 文件,不可以与 `--show` 参数同时存在
+
+例子:
+
+这里使用 YOLOv5-s 作为例子来进行辅助标注刚刚下载的 `cat` 数据集,先下载 YOLOv5-s 的权重:
+
+```shell
+mkdir work_dirs
+wget https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth -P ./work_dirs
+```
+
+由于 COCO 80 类数据集中已经包括了 `cat` 这一类,因此我们可以直接加载 COCO 预训练权重进行辅助标注。
+
+```shell
+python demo/image_demo.py ./data/cat/images \
+                          ./configs/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py \
+                          ./work_dirs/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth \
+                          --out-dir ./data/cat/labels \
+                          --class-name cat \
+                          --to-labelme
+```
+
+```{Tip}
+- 如果您的数据集需要标注多类,可以采用类似 `--class-name class1 class2` 格式输入;
+- 如果全部输出,则删掉 `--class-name` 这个 flag 即可全部类都输出。
+```
+
+生成的 label 文件会在 `--out-dir` 中:
+
+```shell
+.
+└── $OUT_DIR
+    ├── image1.json
+    ├── image1.json
+    └── ...
+```
+
+这是一张原图及其生成的 json 例子:
+
+<div align=center>
+  <img src="https://user-images.githubusercontent.com/25873202/205471430-dcc882dd-16bb-45e4-938f-6b62ab3dff19.jpg" alt="图片" width="45%"/>
+  <img src="https://user-images.githubusercontent.com/25873202/205471559-643aecc8-7fa3-4fff-be51-2fb0a570fdd3.png" alt="图片" width="45%"/>
+</div>
+
+#### 2.1.2 人工标注
+
+本教程使用的标注软件是 [labelme](https://github.com/wkentaro/labelme)
+
+- 安装 labelme
+
+```shell
+conda create -n labelme python=3.8
+conda activate labelme
+pip install labelme==5.1.1
+```
+
+- 启动 labelme
+
+```shell
+labelme ${图片文件夹路径(即上一步的图片文件夹)} \
+        --output ${label文件所处的文件夹路径(即上一步的 --out-dir)} \
+        --autosave \
+        --nodata
+```
+
+其中:
+
+- `--output`:labelme 标注文件保存路径,如果该路径下已经存在部分图片的标注文件,则会进行加载;
+- `--autosave`:标注文件自动保存,会略去一些繁琐的保存步骤;
+- `--nodata`:每张图片的标注文件中不保存图片的 base64 编码,设置了这个 flag 会大大减少标注文件的大小。
+
+例子:
+
+```shell
+cd /path/to/mmyolo
+labelme ./data/cat/images --output ./data/cat/labels --autosave --nodata
+```
+
+输入命令之后 labelme 就会启动,然后进行 label 检查即可。如果 labelme 启动失败,命令行输入 `export QT_DEBUG_PLUGINS=1` 查看具体缺少什么库,安装一下即可。
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/25873202/205432185-54407d83-3cee-473f-8743-656da157cf80.png" alt="label UI"/>
+</div>
+
+```{warning}
+标注的时候务必使用 `rectangle`,快捷键 `Ctrl + R`(如下图)
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/25873202/204076212-86dab4fa-13dd-42cd-93d8-46b04b864449.png" alt="rectangle"/>
+</div>
+```
+
+### 2.2 仅人工标注
+
+步骤和 【2.1.2 人工标注】 相同,只是这里是直接标注,没有预先生成的 label 。
+
+## 3. 使用脚本转换成 COCO 数据集格式
+
+### 3.1 使用脚本转换
+
+MMYOLO 提供脚本将 labelme 的 label 转换为 COCO label
+
+```shell
+python tools/dataset_converters/labelme2coco.py --img-dir ${图片文件夹路径} \
+                                                --labels-dir ${label 文件夹位置} \
+                                                --out ${输出 COCO label json 路径} \
+                                                [--class-id-txt ${class_with_id.txt 路径}]
+```
+
+其中:
+`--class-id-txt`:是数据集 `id class_name` 的 `.txt` 文件:
+
+- 如果不指定,则脚本会自动生成,生成在 `--out` 同级的目录中,保存文件名为 `class_with_id.txt`;
+- 如果指定,脚本仅会进行读取但不会新增或者覆盖,同时,脚本里面还会判断是否存在 `.txt` 中其他的类,如果出现了会报错提示,届时,请用户检查 `.txt` 文件并加入新的类及其 `id`。
+
+`.txt` 文件的例子如下( `id` 可以和 COCO 一样,从 `1` 开始):
+
+```text
+1 cat
+2 dog
+3 bicycle
+4 motorcycle
+
+```
+
+例子:
+
+以本教程的 `cat` 数据集为例:
+
+```shell
+python tools/dataset_converters/labelme2coco.py --img-dir ./data/cat/images \
+                                                --labels-dir ./data/cat/labels \
+                                                --out ./data/cat/annotations/annotations_all.json
+```
+
+本次演示的 `cat` 数据集(注意不需要包括背景类),可以看到生成的 `class_with_id.txt` 中只有 `1` 类:
+
+```text
+1 cat
+
+```
+
+### 3.2 检查转换的 COCO label
+
+使用下面的命令可以将 COCO 的 label 在图片上进行显示,这一步可以验证刚刚转换是否有问题:
+
+```shell
+python tools/analysis_tools/browse_coco_json.py --img-dir ${图片文件夹路径} \
+                                                --ann-file ${COCO label json 路径}
+```
+
+例子:
+
+```shell
+python tools/analysis_tools/browse_coco_json.py --img-dir ./data/cat/images \
+                                                --ann-file ./data/cat/annotations/annotations_all.json
+```
+
+<div align=center>
+<img alt="Image" src="https://user-images.githubusercontent.com/25873202/205429166-a6e48d20-c60b-4571-b00e-54439003ad3b.png">
+</div>
+
+```{SeeAlso}
+关于 `tools/analysis_tools/browse_coco_json.py` 的更多用法请参考 [可视化 COCO label](https://mmyolo.readthedocs.io/zh_CN/latest/user_guides/useful_tools.html#coco)。
+```
+
+## 4. 数据集划分为训练集、验证集和测试集
+
+通常,自定义图片都是一个大文件夹,里面全部都是图片,需要我们自己去对图片进行训练集、验证集、测试集的划分,如果数据量比较少,可以不划分验证集。下面是划分脚本的具体用法:
+
+```shell
+python tools/misc/coco_split.py --json ${COCO label json 路径} \
+                                --out-dir ${划分 label json 保存根路径} \
+                                --ratios ${划分比例} \
+                                [--shuffle] \
+                                [--seed ${划分的随机种子}]
+```
+
+其中:
+
+- `--ratios`:划分的比例,如果只设置了 2 个,则划分为 `trainval + test`,如果设置为 3 个,则划分为 `train + val + test`。支持两种格式 —— 整数、小数:
+  - 整数:按比例进行划分,代码中会进行归一化之后划分数据集。例子: `--ratio 2 1 1`(代码里面会转换成 `0.5 0.25 0.25`) or `--ratio 3 1`(代码里面会转换成 `0.75 0.25`)
+  - 小数:划分为比例。**如果加起来不为 1 ,则脚本会进行自动归一化修正**。例子: `--ratio 0.8 0.1 0.1` or `--ratio 0.8 0.2`
+- `--shuffle`: 是否打乱数据集再进行划分;
+- `--seed`:设定划分的随机种子,不设置的话自动生成随机种子。
+
+例子:
+
+```shell
+python tools/misc/coco_split.py --json ./data/cat/annotations/annotations_all.json \
+                                --out-dir ./data/cat/annotations \
+                                --ratios 0.8 0.2 \
+                                --shuffle \
+                                --seed 10
+```
+
+<div align=center>
+<img alt="Image" src="https://user-images.githubusercontent.com/25873202/205428346-5fdfbfca-0682-47aa-b0be-fa467cd0c5f8.png">
+</div>
+
+## 5. 根据数据集内容新建 config 文件
+
+确保数据集目录是这样的:
+
+```shell
+.
+└── $DATA_ROOT
+    ├── annotations
+    │    ├── trainval.json # 根据上面的指令只划分 trainval + test,如果您使用 3 组划分比例的话,这里是 train.json、val.json、test.json
+    │    └── test.json
+    ├── images
+    │    ├── image1.jpg
+    │    ├── image1.png
+    │    └── ...
+    └── ...
+```
+
+因为是我们自定义的数据集,所以我们需要自己新建一个 config 并加入需要修改的部分信息。
+
+关于新的 config 的命名:
+
+- 这个 config 继承的是 `yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py`;
+- 训练的类以本教程提供的数据集中的类 `cat` 为例(如果是自己的数据集,可以自定义类型的总称);
+- 本教程测试的显卡型号是 1 x 3080Ti 12G 显存,电脑内存 32G,可以训练 YOLOv5-s 最大批次是 `batch size = 32`(详细机器资料可见附录);
+- 训练轮次是 `100 epoch`。
+
+综上所述:可以将其命名为 `yolov5_s-v61_syncbn_fast_1xb32-100e_cat.py`,并将其放置在文件夹 `configs/custom_dataset` 中。
+
+我们可以在 configs 目录下新建一个新的目录 `custom_dataset`,同时在里面新建该 config 文件,并添加以下内容:
+
+<div align=center>
+<img alt="Image" src="https://user-images.githubusercontent.com/25873202/205428358-e32fb455-480a-4f14-9613-e4cc3193fb4d.png">
+</div>
+
+```python
+_base_ = '../yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py'
+
+max_epochs = 100  # 训练的最大 epoch
+data_root = './data/cat/'  # 数据集目录的绝对路径
+# data_root = '/root/workspace/mmyolo/data/cat/'  # Docker 容器里面数据集目录的绝对路径
+
+# 结果保存的路径,可以省略,省略保存的文件名位于 work_dirs 下 config 同名的文件夹中
+# 如果某个 config 只是修改了部分参数,修改这个变量就可以将新的训练文件保存到其他地方
+work_dir = './work_dirs/yolov5_s-v61_syncbn_fast_1xb32-100e_cat'
+
+# load_from 可以指定本地路径或者 URL,设置了 URL 会自动进行下载,因为上面已经下载过,我们这里设置本地路径
+# 因为本教程是在 cat 数据集上微调,故这里需要使用 `load_from` 来加载 MMYOLO 中的预训练模型,这样可以在加快收敛速度的同时保证精度
+load_from = './work_dirs/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth'  # noqa
+
+# 根据自己的 GPU 情况,修改 batch size,YOLOv5-s 默认为 8卡 x 16bs
+train_batch_size_per_gpu = 32
+train_num_workers = 4  # 推荐使用 train_num_workers = nGPU x 4
+
+save_epoch_intervals = 2  # 每 interval 轮迭代进行一次保存一次权重
+
+# 根据自己的 GPU 情况,修改 base_lr,修改的比例是 base_lr_default * (your_bs / default_bs)
+base_lr = _base_.base_lr / 4
+
+anchors = [  # 此处已经根据数据集特点更新了 anchor,关于 anchor 的生成,后面小节会讲解
+    [(68, 69), (154, 91), (143, 162)],  # P3/8
+    [(242, 160), (189, 287), (391, 207)],  # P4/16
+    [(353, 337), (539, 341), (443, 432)]  # P5/32
+]
+
+class_name = ('cat', )  # 根据 class_with_id.txt 类别信息,设置 class_name
+num_classes = len(class_name)
+metainfo = dict(
+    classes=class_name,
+    palette=[(220, 20, 60)]  # 画图时候的颜色,随便设置即可
+)
+
+train_cfg = dict(
+    max_epochs=max_epochs,
+    val_begin=20,  # 第几个 epoch 后验证,这里设置 20 是因为前 20 个 epoch 精度不高,测试意义不大,故跳过
+    val_interval=save_epoch_intervals  # 每 val_interval 轮迭代进行一次测试评估
+)
+
+model = dict(
+    bbox_head=dict(
+        head_module=dict(num_classes=num_classes),
+        prior_generator=dict(base_sizes=anchors),
+
+        # loss_cls 会根据 num_classes 动态调整,但是 num_classes = 1 的时候,loss_cls 恒为 0
+        loss_cls=dict(loss_weight=0.5 *
+                      (num_classes / 80 * 3 / _base_.num_det_layers))))
+
+train_dataloader = dict(
+    batch_size=train_batch_size_per_gpu,
+    num_workers=train_num_workers,
+    dataset=dict(
+        _delete_=True,
+        type='RepeatDataset',
+        # 数据量太少的话,可以使用 RepeatDataset ,在每个 epoch 内重复当前数据集 n 次,这里设置 5 是重复 5 次
+        times=5,
+        dataset=dict(
+            type=_base_.dataset_type,
+            data_root=data_root,
+            metainfo=metainfo,
+            ann_file='annotations/trainval.json',
+            data_prefix=dict(img='images/'),
+            filter_cfg=dict(filter_empty_gt=False, min_size=32),
+            pipeline=_base_.train_pipeline)))
+
+val_dataloader = dict(
+    dataset=dict(
+        metainfo=metainfo,
+        data_root=data_root,
+        ann_file='annotations/trainval.json',
+        data_prefix=dict(img='images/')))
+
+test_dataloader = val_dataloader
+
+val_evaluator = dict(ann_file=data_root + 'annotations/trainval.json')
+test_evaluator = val_evaluator
+
+optim_wrapper = dict(optimizer=dict(lr=base_lr))
+
+default_hooks = dict(
+    # 设置间隔多少个 epoch 保存模型,以及保存模型最多几个,`save_best` 是另外保存最佳模型(推荐)
+    checkpoint=dict(
+        type='CheckpointHook',
+        interval=save_epoch_intervals,
+        max_keep_ckpts=5,
+        save_best='auto'),
+    param_scheduler=dict(max_epochs=max_epochs),
+    # logger 输出的间隔
+    logger=dict(type='LoggerHook', interval=10))
+
+```
+
+```{Note}
+我们在 `projects/misc/custom_dataset/yolov5_s-v61_syncbn_fast_1xb32-100e_cat.py` 放了一份相同的 config 文件,用户可以选择复制到 `configs/custom_dataset/yolov5_s-v61_syncbn_fast_1xb32-100e_cat.py` 路径直接开始训练。
+```
+
+## 6. 数据集可视化分析
+
+脚本 `tools/analysis_tools/dataset_analysis.py` 能够帮助用户得到数据集的分析图。该脚本可以生成 4 种分析图:
+
+- 显示类别和 bbox 实例个数的分布图:`show_bbox_num`
+- 显示类别和 bbox 实例宽、高的分布图:`show_bbox_wh`
+- 显示类别和 bbox 实例宽/高比例的分布图:`show_bbox_wh_ratio`
+- 基于面积规则下,显示类别和 bbox 实例面积的分布图:`show_bbox_area`
+
+脚本使用方式如下:
+
+```shell
+python tools/analysis_tools/dataset_analysis.py ${CONFIG} \
+                                                [--val-dataset ${TYPE}] \
+                                                [--class-name ${CLASS_NAME}] \
+                                                [--area-rule ${AREA_RULE}] \
+                                                [--func ${FUNC}] \
+                                                [--out-dir ${OUT_DIR}]
+```
+
+例子:
+
+以本教程 `cat` 数据集 的 config 为例:
+
+查看训练集数据分布情况:
+
+```shell
+python tools/analysis_tools/dataset_analysis.py configs/custom_dataset/yolov5_s-v61_syncbn_fast_1xb32-100e_cat.py \
+                                                --out-dir work_dirs/dataset_analysis_cat/train_dataset
+```
+
+查看验证集数据分布情况:
+
+```shell
+python tools/analysis_tools/dataset_analysis.py configs/custom_dataset/yolov5_s-v61_syncbn_fast_1xb32-100e_cat.py \
+                                                --out-dir work_dirs/dataset_analysis_cat/val_dataset \
+                                                --val-dataset
+```
+
+效果(点击图片可查看大图):
+
+<table align="center">
+  <tbody>
+    <tr align="center" valign="center">
+      <td>
+        <b>基于面积规则下,显示类别和 bbox 实例面积的分布图</b>
+      </td>
+      <td>
+        <b>显示类别和 bbox 实例宽、高的分布图</b>
+      </td>
+    </tr>
+    <tr align="center" valign="center">
+      <td>
+        <img alt="YOLOv5CocoDataset_bbox_area" src="https://user-images.githubusercontent.com/25873202/206709093-1ed40f4e-cae3-4383-b120-79ad44c12312.jpg" width="60%">
+      </td>
+      <td>
+        <img alt="YOLOv5CocoDataset_bbox_wh" src="https://user-images.githubusercontent.com/25873202/206709127-aebbb238-4af8-46c8-b71e-8540ed5f5de1.jpg" width="60%">
+      </td>
+    </tr>
+    <tr align="center" valign="center">
+      <td>
+        <b>显示类别和 bbox 实例个数的分布图</b>
+      </td>
+      <td>
+        <b>显示类别和 bbox 实例宽/高比例的分布图</b>
+      </td>
+    </tr>
+    <tr align="center" valign="center">
+      <td>
+        <img alt="YOLOv5CocoDataset_bbox_num" src="https://user-images.githubusercontent.com/25873202/206709108-8cee54f3-3102-4ca2-a10a-e4adb760881b.jpg" width="60%">
+      </td>
+      <td>
+        <img alt="YOLOv5CocoDataset_bbox_ratio" src="https://user-images.githubusercontent.com/25873202/206709115-17aeba09-4ff1-4697-8842-94fbada6c428.jpg" width="60%">
+      </td>
+    </tr>
+  </tbody>
+</table>
+
+```{Note}
+因为本教程使用的 cat 数据集数量比较少,故 config 里面用了 RepeatDataset,显示的数目实际上都是重复了 5 次。如果您想得到无重复的分析结果,可以暂时将 RepeatDataset 下面的 `times` 参数从 `5` 改成 `1`。
+```
+
+经过输出的图片分析可以得出,本教程使用的 `cat` 数据集的训练集具有以下情况:
+
+- 图片全部是 `large object`;
+- 类别 cat 的数量是 `655`;
+- bbox 的宽高比例大部分集中在 `1.0 ~ 1.11`,比例最小值是 `0.36`,最大值是 `2.9`;
+- bbox 的宽大部分是 `500 ~ 600` 左右,高大部分是 `500 ~ 600` 左右。
+
+```{SeeAlso}
+关于 `tools/analysis_tools/dataset_analysis.py` 的更多用法请参考 [可视化数据集分析](https://mmyolo.readthedocs.io/zh_CN/latest/user_guides/useful_tools.html#id4)。
+```
+
+## 7. 优化 Anchor 尺寸
+
+```{Warning}
+该步骤仅适用于 anchor-base 的模型,例如 YOLOv5;
+
+Anchor-free 的模型可以跳过此步骤,例如 YOLOv6、YOLOX。
+```
+
+脚本 `tools/analysis_tools/optimize_anchors.py` 支持 YOLO 系列中三种锚框生成方式,分别是 `k-means`、`Differential Evolution`、`v5-k-means`.
+
+本示例使用的是 YOLOv5 进行训练,使用的是 `640 x 640` 的输入大小,使用 `v5-k-means` 进行描框的优化:
+
+```shell
+python tools/analysis_tools/optimize_anchors.py configs/custom_dataset/yolov5_s-v61_syncbn_fast_1xb32-100e_cat.py \
+                                                --algorithm v5-k-means \
+                                                --input-shape 640 640 \
+                                                --prior-match-thr 4.0 \
+                                                --out-dir work_dirs/dataset_analysis_cat
+```
+
+```{Note}
+因为该命令使用的是 k-means 聚类算法,存在一定的随机性,这与初始化有关。故每次执行得到的 Anchor 都会有些不一样,但是都是基于传递进去的数据集来进行生成的,故不会有什么不良影响。
+```
+
+经过计算的 Anchor 如下:
+
+<div align=center>
+<img alt="Anchor" src="https://user-images.githubusercontent.com/25873202/205422434-1a68cded-b055-42e9-b01c-3e51f8f5ef81.png">
+</div>
+
+修改 config 文件里面的 `anchors` 变量:
+
+```python
+anchors = [
+    [(68, 69), (154, 91), (143, 162)],  # P3/8
+    [(242, 160), (189, 287), (391, 207)],  # P4/16
+    [(353, 337), (539, 341), (443, 432)]  # P5/32
+]
+```
+
+```{SeeAlso}
+关于 `tools/analysis_tools/optimize_anchors.py` 的更多用法请参考 [优化锚框尺寸](https://mmyolo.readthedocs.io/zh_CN/latest/user_guides/useful_tools.html#id8)。
+```
+
+## 8. 可视化 config 配置中数据处理部分
+
+脚本 `tools/analysis_tools/browse_dataset.py` 能够帮助用户去直接窗口可视化 config 配置中数据处理部分,同时可以选择保存可视化图片到指定文件夹内。
+
+下面演示使用我们刚刚新建的 config 文件 `configs/custom_dataset/yolov5_s-v61_syncbn_fast_1xb32-100e_cat.py` 来可视化图片,该命令会使得图片直接弹出显示,每张图片持续 `3` 秒,图片不进行保存:
+
+```shell
+python tools/analysis_tools/browse_dataset.py configs/custom_dataset/yolov5_s-v61_syncbn_fast_1xb32-100e_cat.py \
+                                              --show-interval 3
+```
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/25873202/205472078-c958e90d-8204-4c01-821a-8b6a006f05b2.png" alt="image" width="60%"/>
+</div>
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/25873202/205472197-8228c75e-6046-404a-89b4-ed55eeb2cb95.png" alt="image" width="60%"/>
+</div>
+
+```{SeeAlso}
+关于 `tools/analysis_tools/browse_dataset.py` 的更多用法请参考 [可视化数据集](https://mmyolo.readthedocs.io/zh_CN/latest/user_guides/useful_tools.html#id3)。
+```
+
+## 9. 训练
+
+下面会从以下 3 点来进行讲解:
+
+1. 训练可视化
+2. YOLOv5 模型训练
+3. 切换 YOLO 模型训练
+
+### 9.1 训练可视化
+
+如果需要采用浏览器对训练过程可视化,MMYOLO 目前提供 2 种方式 [wandb](https://wandb.ai/site) 和 [TensorBoard](https://tensorflow.google.cn/tensorboard),根据自己的情况选择其一即可(后续会扩展更多可视化后端支持)。
+
+#### 9.1.1 wandb
+
+wandb 可视化需要在[官网](https://wandb.ai/site)注册,并在 https://wandb.ai/settings 获取到 wandb 的 API Keys。
+
+<div align=center>
+<img src="https://cdn.vansin.top/img/20220913212628.png" alt="image"/>
+</div>
+
+然后在命令行进行安装
+
+```shell
+pip install wandb
+# 运行了 wandb login 后输入上文中获取到的 API Keys ,便登录成功。
+wandb login
+```
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/25873202/206070473-201795e0-c81f-4247-842a-16d6acae0474.png" alt="推理图片"/>
+</div>
+
+在我们刚刚新建的 config 文件 `configs/custom_dataset/yolov5_s-v61_syncbn_fast_1xb32-100e_cat.py` 的最后添加 wandb 配置:
+
+```python
+visualizer = dict(vis_backends=[dict(type='LocalVisBackend'), dict(type='WandbVisBackend')])
+```
+
+#### 9.1.2 TensorBoard
+
+安装 Tensorboard 环境
+
+```shell
+pip install tensorboard
+```
+
+在我们刚刚新建的 config 文件 `configs/custom_dataset/yolov5_s-v61_syncbn_fast_1xb32-100e_cat.py` 中添加 `tensorboard` 配置
+
+```python
+visualizer = dict(vis_backends=[dict(type='LocalVisBackend'),dict(type='TensorboardVisBackend')])
+```
+
+运行训练命令后,Tensorboard 文件会生成在可视化文件夹 `work_dirs/yolov5_s-v61_syncbn_fast_1xb32-100e_cat/${TIMESTAMP}/vis_data` 下,
+运行下面的命令便可以在网页链接使用 Tensorboard 查看 loss、学习率和 coco/bbox_mAP 等可视化数据了:
+
+```shell
+tensorboard --logdir=work_dirs/yolov5_s-v61_syncbn_fast_1xb32-100e_cat
+```
+
+### 9.2 执行训练
+
+使用下面命令进行启动训练(训练大约需要 2.5 个小时):
+
+```shell
+python tools/train.py configs/custom_dataset/yolov5_s-v61_syncbn_fast_1xb32-100e_cat.py
+```
+
+如果您开启了 wandb 的话,可以登录到自己的账户,在 wandb 中查看本次训练的详细信息了:
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/25873202/206097557-7b10cf0f-8a16-4ba6-8563-b0a3cb149537.png" alt="Image"/>
+</div>
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/25873202/206097706-7e131bf7-f3bf-43fb-9fe5-5589a324de69.png" alt="Image"/>
+</div>
+
+下面是 `1 x 3080Ti`、`batch size = 32`,训练 `100 epoch` 最佳精度权重 `work_dirs/yolov5_s-v61_syncbn_fast_1xb32-100e_cat/best_coco/bbox_mAP_epoch_98.pth` 得出来的精度(详细机器资料可见附录):
+
+```shell
+ Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.968
+ Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 1.000
+ Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 1.000
+ Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = -1.000
+ Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = -1.000
+ Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.968
+ Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.886
+ Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.977
+ Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.977
+ Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = -1.000
+ Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = -1.000
+ Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.977
+
+bbox_mAP_copypaste: 0.968 1.000 1.000 -1.000 -1.000 0.968
+Epoch(val) [98][116/116]  coco/bbox_mAP: 0.9680  coco/bbox_mAP_50: 1.0000  coco/bbox_mAP_75: 1.0000  coco/bbox_mAP_s: -1.0000  coco/bbox_mAP_m: -1.0000  coco/bbox_mAP_l: 0.9680
+```
+
+```{Tip}
+在一般的 finetune 最佳实践中都会推荐将 backbone 固定不参与训练,并且学习率 lr 也进行相应缩放,但是在本教程中发现这种做法会出现一定程度掉点。猜测可能原因是 cat 类别已经在 COCO 数据集中,而本教程使用的 cat 数据集数量比较小导致的。
+```
+
+下表是采用 MMYOLO YOLOv5 预训练模型 `yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth` 在没对 cat 数据集进行 finetune 的测试精度,可以看到 `cat` 类别的 mAP 只有 `0.866`,经过我们 finetune `mAP` 提升到了 `0.968`,提升了 `10.2 %`,可以证明训练是非常成功的:
+
+```shell
++---------------+-------+--------------+-----+----------------+------+
+| category      | AP    | category     | AP  | category       | AP   |
++---------------+-------+--------------+-----+----------------+------+
+| person        | nan   | bicycle      | nan | car            | nan  |
+| motorcycle    | nan   | airplane     | nan | bus            | nan  |
+| train         | nan   | truck        | nan | boat           | nan  |
+| traffic light | nan   | fire hydrant | nan | stop sign      | nan  |
+| parking meter | nan   | bench        | nan | bird           | nan  |
+| cat           | 0.866 | dog          | nan | horse          | nan  |
+| sheep         | nan   | cow          | nan | elephant       | nan  |
+| bear          | nan   | zebra        | nan | giraffe        | nan  |
+| backpack      | nan   | umbrella     | nan | handbag        | nan  |
+| tie           | nan   | suitcase     | nan | frisbee        | nan  |
+| skis          | nan   | snowboard    | nan | sports ball    | nan  |
+| kite          | nan   | baseball bat | nan | baseball glove | nan  |
+| skateboard    | nan   | surfboard    | nan | tennis racket  | nan  |
+| bottle        | nan   | wine glass   | nan | cup            | nan  |
+| fork          | nan   | knife        | nan | spoon          | nan  |
+| bowl          | nan   | banana       | nan | apple          | nan  |
+| sandwich      | nan   | orange       | nan | broccoli       | nan  |
+| carrot        | nan   | hot dog      | nan | pizza          | nan  |
+| donut         | nan   | cake         | nan | chair          | nan  |
+| couch         | nan   | potted plant | nan | bed            | nan  |
+| dining table  | nan   | toilet       | nan | tv             | nan  |
+| laptop        | nan   | mouse        | nan | remote         | nan  |
+| keyboard      | nan   | cell phone   | nan | microwave      | nan  |
+| oven          | nan   | toaster      | nan | sink           | nan  |
+| refrigerator  | nan   | book         | nan | clock          | nan  |
+| vase          | nan   | scissors     | nan | teddy bear     | nan  |
+| hair drier    | nan   | toothbrush   | nan | None           | None |
++---------------+-------+--------------+-----+----------------+------+
+```
+
+```{SeeAlso}
+关于如何得到预训练权重的精度,可以详见附录【2. 如何测试数据集在预训练权重的精度】
+```
+
+### 9.3 尝试 MMYOLO 其他模型
+
+MMYOLO 集成了多种 YOLO 算法,切换非常方便,无需重新熟悉一个新的 repo,直接切换 config 文件就可以轻松切换 YOLO 模型,只需简单 3 步即可切换模型:
+
+1. 新建 config 文件
+2. 下载预训练权重
+3. 启动训练
+
+下面以 YOLOv6-s 为例,进行讲解。
+
+1. 搭建一个新的 config:
+
+```python
+_base_ = '../yolov6/yolov6_s_syncbn_fast_8xb32-400e_coco.py'
+
+max_epochs = 100  # 训练的最大 epoch
+data_root = './data/cat/'  # 数据集目录的绝对路径
+
+# 结果保存的路径,可以省略,省略保存的文件名位于 work_dirs 下 config 同名的文件夹中
+# 如果某个 config 只是修改了部分参数,修改这个变量就可以将新的训练文件保存到其他地方
+work_dir = './work_dirs/yolov6_s_syncbn_fast_1xb32-100e_cat'
+
+# load_from 可以指定本地路径或者 URL,设置了 URL 会自动进行下载,因为上面已经下载过,我们这里设置本地路径
+# 因为本教程是在 cat 数据集上微调,故这里需要使用 `load_from` 来加载 MMYOLO 中的预训练模型,这样可以在加快收敛速度的同时保证精度
+load_from = './work_dirs/yolov6_s_syncbn_fast_8xb32-400e_coco_20221102_203035-932e1d91.pth'  # noqa
+
+# 根据自己的 GPU 情况,修改 batch size,YOLOv6-s 默认为 8卡 x 32bs
+train_batch_size_per_gpu = 32
+train_num_workers = 4  # 推荐使用 train_num_workers = nGPU x 4
+
+save_epoch_intervals = 2  # 每 interval 轮迭代进行一次保存一次权重
+
+# 根据自己的 GPU 情况,修改 base_lr,修改的比例是 base_lr_default * (your_bs / default_bs)
+base_lr = _base_.base_lr / 8
+
+class_name = ('cat', )  # 根据 class_with_id.txt 类别信息,设置 class_name
+num_classes = len(class_name)
+metainfo = dict(
+    classes=class_name,
+    palette=[(220, 20, 60)]  # 画图时候的颜色,随便设置即可
+)
+
+train_cfg = dict(
+    max_epochs=max_epochs,
+    val_begin=20,  # 第几个 epoch 后验证,这里设置 20 是因为前 20 个 epoch 精度不高,测试意义不大,故跳过
+    val_interval=save_epoch_intervals,  # 每 val_interval 轮迭代进行一次测试评估
+    dynamic_intervals=[(max_epochs - _base_.num_last_epochs, 1)]
+)
+
+model = dict(
+    bbox_head=dict(
+        head_module=dict(num_classes=num_classes)),
+    train_cfg=dict(
+        initial_assigner=dict(num_classes=num_classes),
+        assigner=dict(num_classes=num_classes))
+)
+
+train_dataloader = dict(
+    batch_size=train_batch_size_per_gpu,
+    num_workers=train_num_workers,
+    dataset=dict(
+        _delete_=True,
+        type='RepeatDataset',
+        # 数据量太少的话,可以使用 RepeatDataset ,在每个 epoch 内重复当前数据集 n 次,这里设置 5 是重复 5 次
+        times=5,
+        dataset=dict(
+            type=_base_.dataset_type,
+            data_root=data_root,
+            metainfo=metainfo,
+            ann_file='annotations/trainval.json',
+            data_prefix=dict(img='images/'),
+            filter_cfg=dict(filter_empty_gt=False, min_size=32),
+            pipeline=_base_.train_pipeline)))
+
+val_dataloader = dict(
+    dataset=dict(
+        metainfo=metainfo,
+        data_root=data_root,
+        ann_file='annotations/trainval.json',
+        data_prefix=dict(img='images/')))
+
+test_dataloader = val_dataloader
+
+val_evaluator = dict(ann_file=data_root + 'annotations/trainval.json')
+test_evaluator = val_evaluator
+
+optim_wrapper = dict(optimizer=dict(lr=base_lr))
+
+default_hooks = dict(
+    # 设置间隔多少个 epoch 保存模型,以及保存模型最多几个,`save_best` 是另外保存最佳模型(推荐)
+    checkpoint=dict(
+        type='CheckpointHook',
+        interval=save_epoch_intervals,
+        max_keep_ckpts=5,
+        save_best='auto'),
+    param_scheduler=dict(max_epochs=max_epochs),
+    # logger 输出的间隔
+    logger=dict(type='LoggerHook', interval=10))
+
+custom_hooks = [
+    dict(
+        type='EMAHook',
+        ema_type='ExpMomentumEMA',
+        momentum=0.0001,
+        update_buffers=True,
+        strict_load=False,
+        priority=49),
+    dict(
+        type='mmdet.PipelineSwitchHook',
+        switch_epoch=max_epochs - _base_.num_last_epochs,
+        switch_pipeline=_base_.train_pipeline_stage2)
+]
+
+```
+
+```{Note}
+同样,我们在 `projects/misc/custom_dataset/yolov6_s_syncbn_fast_1xb32-100e_cat.py` 放了一份相同的 config 文件,用户可以选择复制到 `configs/custom_dataset/yolov6_s_syncbn_fast_1xb32-100e_cat.py` 路径直接开始训练。
+
+虽然新的 config 看上去好像很多东西,其实很多都是重复的,用户可以用对比软件对比一下即可看出大部分的配置都是和 `yolov5_s-v61_syncbn_fast_1xb32-100e_cat.py` 相同的。因为这 2 个 config 文件需要继承不同的 config,所以还是要添加一些必要的配置。
+```
+
+2. 下载 YOLOv6-s 的预训练权重
+
+```bash
+wget https://download.openmmlab.com/mmyolo/v0/yolov6/yolov6_s_syncbn_fast_8xb32-400e_coco/yolov6_s_syncbn_fast_8xb32-400e_coco_20221102_203035-932e1d91.pth -P work_dirs/
+```
+
+3. 训练
+
+```shell
+python tools/train.py configs/custom_dataset/yolov6_s_syncbn_fast_1xb32-100e_cat.py
+```
+
+在我的实验中,最佳模型是 `work_dirs/yolov6_s_syncbn_fast_1xb32-100e_cat/best_coco/bbox_mAP_epoch_96.pth`,其精度如下:
+
+```bash
+ Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.987
+ Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 1.000
+ Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 1.000
+ Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = -1.000
+ Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = -1.000
+ Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.987
+ Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.895
+ Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.989
+ Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.989
+ Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = -1.000
+ Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = -1.000
+ Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.989
+
+bbox_mAP_copypaste: 0.987 1.000 1.000 -1.000 -1.000 0.987
+Epoch(val) [96][116/116]  coco/bbox_mAP: 0.9870  coco/bbox_mAP_50: 1.0000  coco/bbox_mAP_75: 1.0000  coco/bbox_mAP_s: -1.0000  coco/bbox_mAP_m: -1.0000  coco/bbox_mAP_l: 0.9870
+```
+
+以上演示的是如何在 MMYOLO 中切换模型,可以快速对不同模型进行精度对比,精度高的模型可以上线生产。在我的实验中,YOLOv6 最佳精度 `0.9870` 比 YOLOv5 最佳精度 `0.9680` 高出 `1.9 %`,故后续我们使用 YOLOv6 来进行讲解。
+
+## 10. 推理
+
+使用最佳的模型进行推理,下面命令中的最佳模型路径是 `./work_dirs/yolov6_s_syncbn_fast_1xb32-100e_cat/best_coco/bbox_mAP_epoch_96.pth`,请用户自行修改为自己训练的最佳模型路径。
+
+```shell
+python demo/image_demo.py ./data/cat/images \
+                          ./configs/custom_dataset/yolov6_s_syncbn_fast_1xb32-100e_cat.py \
+                          ./work_dirs/yolov6_s_syncbn_fast_1xb32-100e_cat/best_coco/bbox_mAP_epoch_96.pth \
+                          --out-dir ./data/cat/pred_images
+```
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/25873202/204773727-5d3cbbad-1265-45a0-822a-887713555049.jpg" alt="推理图片"/>
+</div>
+
+```{Tip}
+如果推理结果不理想,这里举例 2 种情况:
+
+1. 模型欠拟合:
+   需要先判断是不是训练 epoch 不够导致的欠拟合,如果是训练不够,则修改 config 文件里面的 `max_epochs` 和 `work_dir` 参数,或者根据上面的命名方式新建一个 config 文件,重新进行训练。
+
+2. 数据集需优化:
+   如果 epoch 加上去了还是不行,可以增加数据集数量,同时可以重新检查并优化数据集的标注,然后重新进行训练。
+```
+
+## 11. 部署
+
+MMYOLO 提供两种部署方式:
+
+1. [MMDeploy](https://github.com/open-mmlab/mmdeploy) 框架进行部署
+2. 使用 `projects/easydeploy` 进行部署
+
+### 11.1 MMDeploy 框架进行部署
+
+考虑到部署的机器环境千差万别,很多时候在本地机器可以,但是在生产环境则不一定,这里推荐使用 Docker,做到环境一次部署,终身使用,节省运维搭建环境和部署生产的时间。
+
+本小节会从一下几个小点进行展开讲解:
+
+1. 构建 Docker 镜像
+2. 创建 Docker 容器
+3. 转换 TensorRT 模型
+4. 部署模型执行推理
+
+```{SeeAlso}
+如果是对 Docker 不熟悉的用户,可以参考 MMDeploy 的 [源码手动安装](https://mmdeploy.readthedocs.io/zh_CN/latest/01-how-to-build/build_from_source.html) 文档直接在本地编译。安装完之后,可以直接跳到 【11.1.3 转换 TensorRT 模型】 小节。
+```
+
+#### 11.1.1 构建 Docker 镜像
+
+```shell
+git clone -b dev-1.x https://github.com/open-mmlab/mmdeploy.git
+cd mmdeploy
+docker build docker/GPU/ -t mmdeploy:gpu --build-arg USE_SRC_INSIDE=true
+```
+
+其中 `USE_SRC_INSIDE=true` 是拉取基础进行之后在内部切换国内源,构建速度会快一些。
+
+执行脚本后,会进行构建,此刻需要等一段时间:
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/25873202/205482447-329186c8-eba3-443f-b1fa-b33c2ab3d5da.png" alt="Image"/>
+</div>
+
+#### 11.1.2 创建 Docker 容器
+
+```shell
+export MMYOLO_PATH=/path/to/local/mmyolo # 先将您机器上 MMYOLO 的路径写入环境变量
+docker run --gpus all --name mmyolo-deploy -v ${MMYOLO_PATH}:/root/workspace/mmyolo -it mmdeploy:gpu /bin/bash
+```
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/25873202/205536974-1eeb2901-9b14-4851-9c96-5046cd05f171.png" alt="Image"/>
+</div>
+
+可以看到本地的 MMYOLO 环境已经挂载到容器里面了
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/25873202/205537473-0afc16c3-c6d4-451a-96d7-1a2388341b60.png" alt="Image"/>
+</div>
+
+```{SeeAlso}
+有关这部分的详细介绍可以看 MMDeploy 官方文档 [使用 Docker 镜像](https://mmdeploy.readthedocs.io/zh_CN/latest/01-how-to-build/build_from_docker.html#docker)
+```
+
+#### 11.1.3 转换 TensorRT 模型
+
+首先需要在 Docker 容器里面安装 MMYOLO 和 `pycuda`:
+
+```shell
+export MMYOLO_PATH=/root/workspace/mmyolo # 镜像中的路径,这里不需要修改
+cd ${MMYOLO_PATH}
+export MMYOLO_VERSION=$(python -c "import mmyolo.version as v; print(v.__version__)")  # 查看训练使用的 MMYOLO 版本号
+echo "Using MMYOLO ${MMYOLO_VERSION}"
+mim install --no-cache-dir mmyolo==${MMYOLO_VERSION}
+pip install --no-cache-dir pycuda==2022.2
+```
+
+进行模型转换
+
+```shell
+cd /root/workspace/mmdeploy
+python ./tools/deploy.py \
+    ${MMYOLO_PATH}/configs/deploy/detection_tensorrt-fp16_dynamic-192x192-960x960.py \
+    ${MMYOLO_PATH}/configs/custom_dataset/yolov6_s_syncbn_fast_1xb32-100e_cat.py \
+    ${MMYOLO_PATH}/work_dirs/yolov6_s_syncbn_fast_1xb32-100e_cat/best_coco/bbox_mAP_epoch_96.pth \
+    ${MMYOLO_PATH}/data/cat/images/mmexport1633684751291.jpg \
+    --test-img ${MMYOLO_PATH}/data/cat/images/mmexport1633684751291.jpg \
+    --work-dir ./work_dir/yolov6_s_syncbn_fast_1xb32-100e_cat_deploy_dynamic_fp16 \
+    --device cuda:0 \
+    --log-level INFO \
+    --show \
+    --dump-info
+```
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/25873202/206736259-72b76698-cba4-4472-909d-0fd866b45d55.png" alt="Image"/>
+</div>
+
+等待一段时间,出现了 `All process success.` 即为成功:
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/25873202/206736030-3b702929-4fcb-4cec-a6ce-f22a94777f6c.png" alt="Image"/>
+</div>
+
+查看导出的路径,可以看到如下图所示的文件结构:
+
+```shell
+$WORK_DIR
+  ├── deploy.json
+  ├── detail.json
+  ├── end2end.engine
+  ├── end2end.onnx
+  └── pipeline.json
+```
+
+```{SeeAlso}
+关于转换模型的详细介绍,请参考 [如何转换模型](https://mmdeploy.readthedocs.io/zh_CN/latest/02-how-to-run/convert_model.html)
+```
+
+#### 11.1.4 部署模型执行推理
+
+需要将 `${MMYOLO_PATH}/configs/custom_dataset/yolov6_s_syncbn_fast_1xb32-100e_cat.py` 里面的 `data_root` 修改为 Docker 容器里面的路径:
+
+```python
+data_root = '/root/workspace/mmyolo/data/cat/'  # Docker 容器里面数据集目录的绝对路径
+```
+
+执行速度和精度测试:
+
+```shell
+python tools/test.py \
+    ${MMYOLO_PATH}/configs/deploy/detection_tensorrt-fp16_dynamic-192x192-960x960.py \
+    ${MMYOLO_PATH}/configs/custom_dataset/yolov6_s_syncbn_fast_1xb32-100e_cat.py \
+    --model ./work_dir/yolov6_s_syncbn_fast_1xb32-100e_cat_deploy_dynamic_fp16/end2end.engine \
+    --speed-test \
+    --device cuda
+```
+
+速度测试如下,可见平均推理速度是 `24.10 ms`,对比 PyTorch 推理有速度提升,同时显存也下降了很多:
+
+```shell
+Epoch(test) [ 10/116]    eta: 0:00:20  time: 0.1919  data_time: 0.1330  memory: 12
+Epoch(test) [ 20/116]    eta: 0:00:15  time: 0.1220  data_time: 0.0939  memory: 12
+Epoch(test) [ 30/116]    eta: 0:00:12  time: 0.1168  data_time: 0.0850  memory: 12
+Epoch(test) [ 40/116]    eta: 0:00:10  time: 0.1241  data_time: 0.0940  memory: 12
+Epoch(test) [ 50/116]    eta: 0:00:08  time: 0.0974  data_time: 0.0696  memory: 12
+Epoch(test) [ 60/116]    eta: 0:00:06  time: 0.0865  data_time: 0.0547  memory: 16
+Epoch(test) [ 70/116]    eta: 0:00:05  time: 0.1521  data_time: 0.1226  memory: 16
+Epoch(test) [ 80/116]    eta: 0:00:04  time: 0.1364  data_time: 0.1056  memory: 12
+Epoch(test) [ 90/116]    eta: 0:00:03  time: 0.0923  data_time: 0.0627  memory: 12
+Epoch(test) [100/116]    eta: 0:00:01  time: 0.0844  data_time: 0.0583  memory: 12
+[tensorrt]-110 times per count: 24.10 ms, 41.50 FPS
+Epoch(test) [110/116]    eta: 0:00:00  time: 0.1085  data_time: 0.0832  memory: 12
+```
+
+精度测试如下。此配置采用 FP16 格式推理,会有一定程度掉点,但是推理速度更快、显存占比更小:
+
+```shell
+ Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.954
+ Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 1.000
+ Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.975
+ Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = -1.000
+ Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = -1.000
+ Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.954
+ Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.860
+ Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.965
+ Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.965
+ Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = -1.000
+ Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = -1.000
+ Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.965
+
+INFO - bbox_mAP_copypaste: 0.954 1.000 0.975 -1.000 -1.000 0.954
+INFO - Epoch(test) [116/116]  coco/bbox_mAP: 0.9540  coco/bbox_mAP_50: 1.0000  coco/bbox_mAP_75: 0.9750  coco/bbox_mAP_s: -1.0000  coco/bbox_mAP_m: -1.0000  coco/bbox_mAP_l: 0.9540
+```
+
+部署模型图片推理演示:
+
+```{Note}
+用户可以参考 MMDeploy 的 SDK 部署方式,使用 C++ 来进行部署,进而进一步提升推理速度。
+```
+
+```shell
+cd ${MMYOLO_PATH}/demo
+python deploy_demo.py \
+    ${MMYOLO_PATH}/data/cat/images/mmexport1633684900217.jpg \
+    ${MMYOLO_PATH}/configs/custom_dataset/yolov6_s_syncbn_fast_1xb32-100e_cat.py \
+    /root/workspace/mmdeploy/work_dir/yolov6_s_syncbn_fast_1xb32-100e_cat_deploy_dynamic_fp16/end2end.engine \
+    --deploy-cfg ${MMYOLO_PATH}/configs/deploy/detection_tensorrt-fp16_dynamic-192x192-960x960.py \
+    --out-dir ${MMYOLO_PATH}/work_dirs/deploy_predict_out \
+    --device cuda:0 \
+    --score-thr 0.5
+```
+
+```{Warning}
+该脚本 `deploy_demo.py` 暂时没有做批量推理的处理,而且代码前处理还需要完善,暂时不能完全展现出推理的速度,只能演示推理的结果,后续会优化,敬请期待。
+```
+
+执行之后,可以看到在 `--out-dir` 下面的推理图片结果:
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/25873202/205815829-6f85e655-722a-47c8-9e23-2a74437c0923.jpg" alt="Image"/>
+</div>
+
+```{Note}
+您也可以做其他优化调整,例如增大 batch,量化 int8 等等。
+```
+
+#### 11.1.4 保存和加载 Docker 容器
+
+因为如果每次都进行 docker 镜像的构建,特别费时间,此时您可以考虑使用 docker 自带的打包 api 进行打包和加载。
+
+```shell
+# 保存,得到的 tar 包可以放到移动硬盘
+docker save mmyolo-deploy > mmyolo-deploy.tar
+
+# 加载镜像到系统
+docker load < /path/to/mmyolo-deploy.tar
+```
+
+### 11.2 使用 `projects/easydeploy` 进行部署
+
+```{SeeAlso}
+详见[部署文档](https://github.com/open-mmlab/mmyolo/blob/dev/projects/easydeploy/README_zh-CN.md)
+```
+
+TODO: 下个版本会完善这个部分...
+
+## 附录
+
+### 1. 本教程训练机器的详细环境的资料如下:
+
+```shell
+sys.platform: linux
+Python: 3.9.13 | packaged by conda-forge | (main, May 27 2022, 16:58:50) [GCC 10.3.0]
+CUDA available: True
+numpy_random_seed: 2147483648
+GPU 0: NVIDIA GeForce RTX 3080 Ti
+CUDA_HOME: /usr/local/cuda
+NVCC: Cuda compilation tools, release 11.5, V11.5.119
+GCC: gcc (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0
+PyTorch: 1.10.0
+PyTorch compiling details: PyTorch built with:
+  - GCC 7.3
+  - C++ Version: 201402
+  - Intel(R) oneAPI Math Kernel Library Version 2021.4-Product Build 20210904 for Intel(R) 64 architecture applications
+  - Intel(R) MKL-DNN v2.2.3 (Git Hash 7336ca9f055cf1bfa13efb658fe15dc9b41f0740)
+  - OpenMP 201511 (a.k.a. OpenMP 4.5)
+  - LAPACK is enabled (usually provided by MKL)
+  - NNPACK is enabled
+  - CPU capability usage: AVX2
+  - CUDA Runtime 11.3
+  - NVCC architecture flags: -gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;
+                             arch=compute_60,code=sm_60;-gencode;arch=compute_61,code=sm_61;-gencode;arch=compute_70,code=sm_70;
+                             -gencode;arch=compute_75,code=sm_75;-gencode;arch=compute_80,code=sm_80;-gencode;
+                             arch=compute_86,code=sm_86;-gencode;arch=compute_37,code=compute_37
+  - CuDNN 8.2
+  - Magma 2.5.2
+  - Build settings: BLAS_INFO=mkl, BUILD_TYPE=Release, CUDA_VERSION=11.3, CUDNN_VERSION=8.2.0,
+                    CXX_COMPILER=/opt/rh/devtoolset-7/root/usr/bin/c++, CXX_FLAGS= -Wno-deprecated -fvisibility-inlines-hidden
+                    -DUSE_PTHREADPOOL -fopenmp -DNDEBUG -DUSE_KINETO -DUSE_FBGEMM -DUSE_QNNPACK -DUSE_PYTORCH_QNNPACK -DUSE_XNNPACK
+                    -DSYMBOLICATE_MOBILE_DEBUG_HANDLE -DEDGE_PROFILER_USE_KINETO -O2 -fPIC -Wno-narrowing -Wall -Wextra
+                    -Werror=return-type -Wno-missing-field-initializers -Wno-type-limits -Wno-array-bounds -Wno-unknown-pragmas
+                    -Wno-sign-compare -Wno-error=deprecated-declarations -Wno-stringop-overflow -Wno-psabi -Wno-error=pedantic
+                    -Wno-error=redundant-decls -Wno-error=old-style-cast -fdiagnostics-color=always -faligned-new
+                    -Wno-unused-but-set-variable -Wno-maybe-uninitialized -fno-math-errno -fno-trapping-math -Werror=format
+                    -Wno-stringop-overflow, LAPACK_INFO=mkl, PERF_WITH_AVX=1, PERF_WITH_AVX2=1, PERF_WITH_AVX512=1,
+                    TORCH_VERSION=1.10.0, USE_CUDA=ON, USE_CUDNN=ON, USE_EXCEPTION_PTR=1, USE_GFLAGS=OFF, USE_GLOG=OFF, USE_MKL=ON,
+                    USE_MKLDNN=ON, USE_MPI=OFF, USE_NCCL=ON, USE_NNPACK=ON, USE_OPENMP=ON,
+
+TorchVision: 0.11.0
+OpenCV: 4.6.0
+MMEngine: 0.3.1
+MMCV: 2.0.0rc3
+MMDetection: 3.0.0rc3
+MMYOLO: 0.2.0+cf279a5
+```
+
+### 2. 如何测试数据集在预训练权重的精度:
+
+```{Warning}
+前提:该类在 COCO 80 类中!
+```
+
+本小节以 `cat` 数据集为例进行讲解,使用的是:
+
+- config 文件:`configs/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py`
+- 权重 `yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth`
+
+1. 修改 config 文件中的路径
+
+因为 `configs/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py` 是继承于 `configs/yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py`,故主要修改 `configs/yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py` 文件即可。
+
+| 修改前                                                                            | 修改后                                                                         |
+| --------------------------------------------------------------------------------- | ------------------------------------------------------------------------------ |
+| `data_root = 'data/coco/'`                                                        | `data_root = './data/cat/'`                                                    |
+| `ann_file='annotations/instances_train2017.json'`                                 | `ann_file='annotations/trainval.json'`                                         |
+| data_prefix=dict(img='train2017/')\`                                              | `data_prefix=dict(img='images/')`                                              |
+| `val_evaluator` 中的  `ann_file=data_root + 'annotations/instances_val2017.json'` | `val_evaluator` 中的  `dict(ann_file=data_root + 'annotations/trainval.json')` |
+
+2. 修改标签
+
+```{note}
+建议直接复制一份标签,防止弄坏好的标签
+```
+
+将 `trainval.json` 里面的 "categories" 字段改为 COCO 原本的:
+
+```json
+  "categories": [{"supercategory": "person","id": 1,"name": "person"},{"supercategory": "vehicle","id": 2,"name": "bicycle"},{"supercategory": "vehicle","id": 3,"name": "car"},{"supercategory": "vehicle","id": 4,"name": "motorcycle"},{"supercategory": "vehicle","id": 5,"name": "airplane"},{"supercategory": "vehicle","id": 6,"name": "bus"},{"supercategory": "vehicle","id": 7,"name": "train"},{"supercategory": "vehicle","id": 8,"name": "truck"},{"supercategory": "vehicle","id": 9,"name": "boat"},{"supercategory": "outdoor","id": 10,"name": "traffic light"},{"supercategory": "outdoor","id": 11,"name": "fire hydrant"},{"supercategory": "outdoor","id": 13,"name": "stop sign"},{"supercategory": "outdoor","id": 14,"name": "parking meter"},{"supercategory": "outdoor","id": 15,"name": "bench"},{"supercategory": "animal","id": 16,"name": "bird"},{"supercategory": "animal","id": 17,"name": "cat"},{"supercategory": "animal","id": 18,"name": "dog"},{"supercategory": "animal","id": 19,"name": "horse"},{"supercategory": "animal","id": 20,"name": "sheep"},{"supercategory": "animal","id": 21,"name": "cow"},{"supercategory": "animal","id": 22,"name": "elephant"},{"supercategory": "animal","id": 23,"name": "bear"},{"supercategory": "animal","id": 24,"name": "zebra"},{"supercategory": "animal","id": 25,"name": "giraffe"},{"supercategory": "accessory","id": 27,"name": "backpack"},{"supercategory": "accessory","id": 28,"name": "umbrella"},{"supercategory": "accessory","id": 31,"name": "handbag"},{"supercategory": "accessory","id": 32,"name": "tie"},{"supercategory": "accessory","id": 33,"name": "suitcase"},{"supercategory": "sports","id": 34,"name": "frisbee"},{"supercategory": "sports","id": 35,"name": "skis"},{"supercategory": "sports","id": 36,"name": "snowboard"},{"supercategory": "sports","id": 37,"name": "sports ball"},{"supercategory": "sports","id": 38,"name": "kite"},{"supercategory": "sports","id": 39,"name": "baseball bat"},{"supercategory": "sports","id": 40,"name": "baseball glove"},{"supercategory": "sports","id": 41,"name": "skateboard"},{"supercategory": "sports","id": 42,"name": "surfboard"},{"supercategory": "sports","id": 43,"name": "tennis racket"},{"supercategory": "kitchen","id": 44,"name": "bottle"},{"supercategory": "kitchen","id": 46,"name": "wine glass"},{"supercategory": "kitchen","id": 47,"name": "cup"},{"supercategory": "kitchen","id": 48,"name": "fork"},{"supercategory": "kitchen","id": 49,"name": "knife"},{"supercategory": "kitchen","id": 50,"name": "spoon"},{"supercategory": "kitchen","id": 51,"name": "bowl"},{"supercategory": "food","id": 52,"name": "banana"},{"supercategory": "food","id": 53,"name": "apple"},{"supercategory": "food","id": 54,"name": "sandwich"},{"supercategory": "food","id": 55,"name": "orange"},{"supercategory": "food","id": 56,"name": "broccoli"},{"supercategory": "food","id": 57,"name": "carrot"},{"supercategory": "food","id": 58,"name": "hot dog"},{"supercategory": "food","id": 59,"name": "pizza"},{"supercategory": "food","id": 60,"name": "donut"},{"supercategory": "food","id": 61,"name": "cake"},{"supercategory": "furniture","id": 62,"name": "chair"},{"supercategory": "furniture","id": 63,"name": "couch"},{"supercategory": "furniture","id": 64,"name": "potted plant"},{"supercategory": "furniture","id": 65,"name": "bed"},{"supercategory": "furniture","id": 67,"name": "dining table"},{"supercategory": "furniture","id": 70,"name": "toilet"},{"supercategory": "electronic","id": 72,"name": "tv"},{"supercategory": "electronic","id": 73,"name": "laptop"},{"supercategory": "electronic","id": 74,"name": "mouse"},{"supercategory": "electronic","id": 75,"name": "remote"},{"supercategory": "electronic","id": 76,"name": "keyboard"},{"supercategory": "electronic","id": 77,"name": "cell phone"},{"supercategory": "appliance","id": 78,"name": "microwave"},{"supercategory": "appliance","id": 79,"name": "oven"},{"supercategory": "appliance","id": 80,"name": "toaster"},{"supercategory": "appliance","id": 81,"name": "sink"},{"supercategory": "appliance","id": 82,"name": "refrigerator"},{"supercategory": "indoor","id": 84,"name": "book"},{"supercategory": "indoor","id": 85,"name": "clock"},{"supercategory": "indoor","id": 86,"name": "vase"},{"supercategory": "indoor","id": 87,"name": "scissors"},{"supercategory": "indoor","id": 88,"name": "teddy bear"},{"supercategory": "indoor","id": 89,"name": "hair drier"},{"supercategory": "indoor","id": 90,"name": "toothbrush"}],
+```
+
+同时,将 `"annotations"` 字段里面的 `"category_id"` 改为 COCO 对应的 `id` ,例如本例子的 `cat` 是 `17`,下面展示部分修改结果:
+
+```json
+  "annotations": [
+    {
+      "iscrowd": 0,
+      "category_id": 17, # 这个 "category_id" 改为 COCO 对应的 id,例如本例子的 cat 是 17
+      "id": 32,
+      "image_id": 32,
+      "bbox": [
+        822.49072265625,
+        958.3897094726562,
+        1513.693115234375,
+        988.3231811523438
+      ],
+      "area": 1496017.9949368387,
+      "segmentation": [
+        [
+          822.49072265625,
+          958.3897094726562,
+          822.49072265625,
+          1946.712890625,
+          2336.183837890625,
+          1946.712890625,
+          2336.183837890625,
+          958.3897094726562
+        ]
+      ]
+    }
+  ]
+```
+
+3. 执行命令
+
+```shell
+python tools\test.py configs/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py \
+                     work_dirs/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth \
+                     --cfg-options test_evaluator.classwise=True
+```
+
+执行之后就可以看到测试后的指标了:
+
+```shell
++---------------+-------+--------------+-----+----------------+------+
+| category      | AP    | category     | AP  | category       | AP   |
++---------------+-------+--------------+-----+----------------+------+
+| person        | nan   | bicycle      | nan | car            | nan  |
+| motorcycle    | nan   | airplane     | nan | bus            | nan  |
+| train         | nan   | truck        | nan | boat           | nan  |
+| traffic light | nan   | fire hydrant | nan | stop sign      | nan  |
+| parking meter | nan   | bench        | nan | bird           | nan  |
+| cat           | 0.866 | dog          | nan | horse          | nan  |
+| sheep         | nan   | cow          | nan | elephant       | nan  |
+| bear          | nan   | zebra        | nan | giraffe        | nan  |
+| backpack      | nan   | umbrella     | nan | handbag        | nan  |
+| tie           | nan   | suitcase     | nan | frisbee        | nan  |
+| skis          | nan   | snowboard    | nan | sports ball    | nan  |
+| kite          | nan   | baseball bat | nan | baseball glove | nan  |
+| skateboard    | nan   | surfboard    | nan | tennis racket  | nan  |
+| bottle        | nan   | wine glass   | nan | cup            | nan  |
+| fork          | nan   | knife        | nan | spoon          | nan  |
+| bowl          | nan   | banana       | nan | apple          | nan  |
+| sandwich      | nan   | orange       | nan | broccoli       | nan  |
+| carrot        | nan   | hot dog      | nan | pizza          | nan  |
+| donut         | nan   | cake         | nan | chair          | nan  |
+| couch         | nan   | potted plant | nan | bed            | nan  |
+| dining table  | nan   | toilet       | nan | tv             | nan  |
+| laptop        | nan   | mouse        | nan | remote         | nan  |
+| keyboard      | nan   | cell phone   | nan | microwave      | nan  |
+| oven          | nan   | toaster      | nan | sink           | nan  |
+| refrigerator  | nan   | book         | nan | clock          | nan  |
+| vase          | nan   | scissors     | nan | teddy bear     | nan  |
+| hair drier    | nan   | toothbrush   | nan | None           | None |
++---------------+-------+--------------+-----+----------------+------+
+```
diff --git a/mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/mm_basics.md b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/mm_basics.md
new file mode 100644
index 0000000..2d8098b
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/mm_basics.md
@@ -0,0 +1 @@
+# MM 系列仓库必备基础
diff --git a/mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/model_design.md b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/model_design.md
new file mode 100644
index 0000000..287cf03
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/model_design.md
@@ -0,0 +1,107 @@
+# MMYOLO 模型设计相关说明
+
+## YOLO 系列模型基类
+
+下图为 RangeKing@GitHub 提供,非常感谢!
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/27466624/199999337-0544a4cb-3cbd-4f3e-be26-bcd9e74db7ff.jpg" alt="基类 P5">
+图 1:P5 模型结构
+</div>
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/27466624/200850066-0c434173-2d40-4c12-8de3-eda473ff172f.jpg" alt="基类 P6">
+图 2:P6 模型结构
+</div>
+
+YOLO 系列算法大部分采用了统一的算法搭建结构,典型的如 Darknet + PAFPN。为了让用户快速理解 YOLO 系列算法架构,我们特意设计了如上图中的 BaseBackbone + BaseYOLONeck 结构。
+
+抽象 BaseBackbone 的好处包括:
+
+1. 子类不需要关心 forward 过程,只要类似建造者模式一样构建模型即可。
+2. 可以通过配置实现定制插件功能,用户可以很方便的插入一些类似注意力模块。
+3. 所有子类自动支持 frozen 某些 stage 和 frozen bn 功能。
+
+抽象 BaseYOLONeck 也有同样好处。
+
+### BaseBackbone
+
+- 如图 1 所示,对于 P5 而言,BaseBackbone 为包含 1 个 stem 层 + 4 个 stage 层的类似 ResNet 的基础结构。
+- 如图 2 所示,对于 P6 而言,BaseBackbone 为包含 1 个 stem 层 + 5 个 stage 层的结构。
+
+不同算法的主干网络继承 BaseBackbone,用户可以通过实现内部的 `build_xx` 方法,使用自定义的基础模块来构建每一层的内部结构。
+
+### BaseYOLONeck
+
+与 `BaseBackbone` 的设计类似,我们为 MMYOLO 系列的 Neck 层进行了重构,主要分为 `Reduce 层`, `UpSample 层`,`TopDown 层`,`DownSample 层`,`BottomUP 层`以及`输出卷积层`,每一层结构都可以通过继承重写 `build_xx` 方法来实现自定义的内部结构。
+
+### BaseDenseHead
+
+MMYOLO 系列沿用 MMDetection 中设计的 `BaseDenseHead` 作为其 Head 结构的基类,但是进一步拆分了 HeadModule. 以 YOLOv5 为例,其 [HeadModule](https://github.com/open-mmlab/mmyolo/blob/main/mmyolo/models/dense_heads/yolov5_head.py#L24) 中的 forward 实现代替了原有的 forward 实现。
+
+## HeadModule 说明
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/33799979/190985845-ed303ad4-3a77-447b-83f9-1feba38d5e24.png" width=800 alt="HeadModule">
+</div>
+
+如上图所示,虚线部分为 [MMDetection](https://github.com/open-mmlab/mmdetection/blob/3.x/mmdet/models/dense_heads/base_dense_head.py) 中的实现,实线部分为 [MMYOLO](https://github.com/open-mmlab/mmyolo/blob/main/mmyolo/models/dense_heads/yolov5_head.py) 中的实现。MMYOLO版本与原实现相比具备具有以下优势:
+
+1. MMDetection 中将 `bbox_head` 拆分为 `assigner` + `box coder` + `sampler` 三个大的组件,但由于 3 个组件之间的传递为了通用性,需要封装额外的对象来处理,统一之后用户可以不用进行拆分。不刻意强求划分三大组件的好处为:不再需要对内部数据进行数据封装,简化了代码逻辑,减轻了社区使用难度和算法复现难度。
+2. 速度更快,用户在自定义实现算法时候,可以不依赖于原有框架,对部分代码进行深度优化。
+
+总的来说,在 MMYOLO 中只需要做到将 `model` + `loss_by_feat` 部分解耦,用户就可以通过修改配置实现任意模型配合任意的 `loss_by_feat` 计算过程。例如将 YOLOv5 模型应用 YOLOX 的 `loss_by_feat` 等。
+
+以 MMDetection 中 YOLOX 配置为例,其 Head 模块配置写法为:
+
+```python
+bbox_head=dict(
+    type='YOLOXHead',
+    num_classes=80,
+    in_channels=128,
+    feat_channels=128,
+    stacked_convs=2,
+    strides=(8, 16, 32),
+    use_depthwise=False,
+    norm_cfg=dict(type='BN', momentum=0.03, eps=0.001),
+    act_cfg=dict(type='Swish'),
+    ...
+    loss_obj=dict(
+        type='CrossEntropyLoss',
+        use_sigmoid=True,
+        reduction='sum',
+        loss_weight=1.0),
+    loss_l1=dict(type='L1Loss', reduction='sum', loss_weight=1.0)),
+train_cfg=dict(assigner=dict(type='SimOTAAssigner', center_radius=2.5)),
+```
+
+在 MMYOLO 中抽取 `head_module` 后,新的配置写法为:
+
+```python
+bbox_head=dict(
+    type='YOLOXHead',
+    head_module=dict(
+        type='YOLOXHeadModule',
+        num_classes=80,
+        in_channels=256,
+        feat_channels=256,
+        widen_factor=widen_factor,
+        stacked_convs=2,
+        featmap_strides=(8, 16, 32),
+        use_depthwise=False,
+        norm_cfg=dict(type='BN', momentum=0.03, eps=0.001),
+        act_cfg=dict(type='SiLU', inplace=True),
+    ),
+    ...
+    loss_obj=dict(
+        type='mmdet.CrossEntropyLoss',
+        use_sigmoid=True,
+        reduction='sum',
+        loss_weight=1.0),
+    loss_bbox_aux=dict(type='mmdet.L1Loss', reduction='sum', loss_weight=1.0)),
+train_cfg=dict(
+    assigner=dict(
+        type='mmdet.SimOTAAssigner',
+        center_radius=2.5,
+        iou_calculator=dict(type='mmdet.BboxOverlaps2D'))),
+```
diff --git a/mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/replace_backbone.md b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/replace_backbone.md
new file mode 100644
index 0000000..d78a252
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/replace_backbone.md
@@ -0,0 +1,307 @@
+# 轻松更换主干网络
+
+```{note}
+1. 使用其他主干网络时,你需要保证主干网络的输出通道与 Neck 的输入通道相匹配。
+2. 下面给出的配置文件,仅能确保训练可以正确运行,直接训练性能可能不是最优的。因为某些 backbone 需要配套特定的学习率、优化器等超参数。后续会在“训练技巧章节”补充训练调优相关内容。
+```
+
+## 使用 MMYOLO 中注册的主干网络
+
+假设想将 `YOLOv6EfficientRep`  作为 `YOLOv5` 的主干网络,则配置文件如下:
+
+```python
+_base_ = './yolov5_s-v61_syncbn_8xb16-300e_coco.py'
+
+model = dict(
+    backbone=dict(
+        type='YOLOv6EfficientRep',
+        norm_cfg=dict(type='BN', momentum=0.03, eps=0.001),
+        act_cfg=dict(type='ReLU', inplace=True))
+)
+```
+
+## 跨库使用主干网络
+
+OpenMMLab 2.0 体系中 MMYOLO、MMDetection、MMClassification、MMSelfsup 中的模型注册表都继承自 MMEngine 中的根注册表,允许这些 OpenMMLab 开源库直接使用彼此已经实现的模块。 因此用户可以在 MMYOLO 中使用来自 MMDetection、MMClassification、MMSelfsup 的主干网络,而无需重新实现。
+
+### 使用在 MMDetection 中实现的主干网络
+
+1. 假设想将 `ResNet-50` 作为 `YOLOv5` 的主干网络,则配置文件如下:
+
+```python
+_base_ = './yolov5_s-v61_syncbn_8xb16-300e_coco.py'
+
+deepen_factor = _base_.deepen_factor
+widen_factor = 1.0
+channels = [512, 1024, 2048]
+
+model = dict(
+    backbone=dict(
+        _delete_=True, # 将 _base_ 中关于 backbone 的字段删除
+        type='mmdet.ResNet', # 使用 mmdet 中的 ResNet
+        depth=50,
+        num_stages=4,
+        out_indices=(1, 2, 3),
+        frozen_stages=1,
+        norm_cfg=dict(type='BN', requires_grad=True),
+        norm_eval=True,
+        style='pytorch',
+        init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50')),
+    neck=dict(
+        type='YOLOv5PAFPN',
+        widen_factor=widen_factor,
+        in_channels=channels, # 注意:ResNet-50 输出的3个通道是 [512, 1024, 2048],和原先的 yolov5-s neck 不匹配,需要更改
+        out_channels=channels),
+    bbox_head=dict(
+        type='YOLOv5Head',
+        head_module=dict(
+            type='YOLOv5HeadModule',
+            in_channels=channels, # head 部分输入通道也要做相应更改
+            widen_factor=widen_factor))
+)
+```
+
+2. 假设想将 `SwinTransformer-Tiny` 作为 `YOLOv5` 的主干网络,则配置文件如下:
+
+```python
+_base_ = './yolov5_s-v61_syncbn_8xb16-300e_coco.py'
+
+deepen_factor = _base_.deepen_factor
+widen_factor = 1.0
+channels = [192, 384, 768]
+checkpoint_file = 'https://github.com/SwinTransformer/storage/releases/download/v1.0.0/swin_tiny_patch4_window7_224.pth'  # noqa
+
+model = dict(
+    backbone=dict(
+        _delete_=True, # 将 _base_ 中关于 backbone 的字段删除
+        type='mmdet.SwinTransformer', # 使用 mmdet 中的 SwinTransformer
+        embed_dims=96,
+        depths=[2, 2, 6, 2],
+        num_heads=[3, 6, 12, 24],
+        window_size=7,
+        mlp_ratio=4,
+        qkv_bias=True,
+        qk_scale=None,
+        drop_rate=0.,
+        attn_drop_rate=0.,
+        drop_path_rate=0.2,
+        patch_norm=True,
+        out_indices=(1, 2, 3),
+        with_cp=False,
+        convert_weights=True,
+        init_cfg=dict(type='Pretrained', checkpoint=checkpoint_file)),
+    neck=dict(
+        type='YOLOv5PAFPN',
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+        in_channels=channels, # 注意:SwinTransformer-Tiny 输出的3个通道是 [192, 384, 768],和原先的 yolov5-s neck 不匹配,需要更改
+        out_channels=channels),
+    bbox_head=dict(
+        type='YOLOv5Head',
+        head_module=dict(
+            type='YOLOv5HeadModule',
+            in_channels=channels, # head 部分输入通道也要做相应更改
+            widen_factor=widen_factor))
+)
+```
+
+### 使用在 MMClassification 中实现的主干网络
+
+1. 假设想将 `ConvNeXt-Tiny` 作为 `YOLOv5` 的主干网络,则配置文件如下:
+
+```python
+_base_ = './yolov5_s-v61_syncbn_8xb16-300e_coco.py'
+
+# 请先使用命令: mim install "mmcls>=1.0.0rc2",安装 mmcls
+# 导入 mmcls.models 使得可以调用 mmcls 中注册的模块
+custom_imports = dict(imports=['mmcls.models'], allow_failed_imports=False)
+checkpoint_file = 'https://download.openmmlab.com/mmclassification/v0/convnext/downstream/convnext-tiny_3rdparty_32xb128-noema_in1k_20220301-795e9634.pth'  # noqa
+deepen_factor = _base_.deepen_factor
+widen_factor = 1.0
+channels = [192, 384, 768]
+
+model = dict(
+    backbone=dict(
+        _delete_=True, # 将 _base_ 中关于 backbone 的字段删除
+        type='mmcls.ConvNeXt', # 使用 mmcls 中的 ConvNeXt
+        arch='tiny',
+        out_indices=(1, 2, 3),
+        drop_path_rate=0.4,
+        layer_scale_init_value=1.0,
+        gap_before_final_norm=False,
+        init_cfg=dict(
+            type='Pretrained', checkpoint=checkpoint_file,
+            prefix='backbone.')), # MMCls 中主干网络的预训练权重含义 prefix='backbone.',为了正常加载权重,需要把这个 prefix 去掉。
+    neck=dict(
+        type='YOLOv5PAFPN',
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+        in_channels=channels, # 注意:ConvNeXt-Tiny 输出的3个通道是 [192, 384, 768],和原先的 yolov5-s neck 不匹配,需要更改
+        out_channels=channels),
+    bbox_head=dict(
+        type='YOLOv5Head',
+        head_module=dict(
+            type='YOLOv5HeadModule',
+            in_channels=channels, # head 部分输入通道也要做相应更改
+            widen_factor=widen_factor))
+)
+```
+
+2. 假设想将 `MobileNetV3-small` 作为 `YOLOv5` 的主干网络,则配置文件如下:
+
+```python
+_base_ = './yolov5_s-v61_syncbn_8xb16-300e_coco.py'
+
+# 请先使用命令: mim install "mmcls>=1.0.0rc2",安装 mmcls
+# 导入 mmcls.models 使得可以调用 mmcls 中注册的模块
+custom_imports = dict(imports=['mmcls.models'], allow_failed_imports=False)
+checkpoint_file = 'https://download.openmmlab.com/mmclassification/v0/mobilenet_v3/convert/mobilenet_v3_small-8427ecf0.pth'  # noqa
+deepen_factor = _base_.deepen_factor
+widen_factor = 1.0
+channels = [24, 48, 96]
+
+model = dict(
+    backbone=dict(
+        _delete_=True, # 将 _base_ 中关于 backbone 的字段删除
+        type='mmcls.MobileNetV3', # 使用 mmcls 中的 MobileNetV3
+        arch='small',
+        out_indices=(3, 8, 11), # 修改 out_indices
+        init_cfg=dict(
+            type='Pretrained',
+            checkpoint=checkpoint_file,
+            prefix='backbone.')), # MMCls 中主干网络的预训练权重含义 prefix='backbone.',为了正常加载权重,需要把这个 prefix 去掉。
+    neck=dict(
+        type='YOLOv5PAFPN',
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+        in_channels=channels, # 注意:MobileNetV3-small 输出的3个通道是 [24, 48, 96],和原先的 yolov5-s neck 不匹配,需要更改
+        out_channels=channels),
+    bbox_head=dict(
+        type='YOLOv5Head',
+        head_module=dict(
+            type='YOLOv5HeadModule',
+            in_channels=channels, # head 部分输入通道也要做相应更改
+            widen_factor=widen_factor))
+)
+```
+
+### 通过 MMClassification 使用 `timm` 中实现的主干网络
+
+由于 MMClassification 提供了 Py**T**orch **Im**age **M**odels (`timm`) 主干网络的封装,用户也可以通过 MMClassification 直接使用 `timm` 中的主干网络。假设想将 `EfficientNet-B1`作为 `YOLOv5` 的主干网络,则配置文件如下:
+
+```python
+_base_ = './yolov5_s-v61_syncbn_8xb16-300e_coco.py'
+
+# 请先使用命令: mim install "mmcls>=1.0.0rc2",安装 mmcls
+# 以及: pip install timm,安装 timm
+# 导入 mmcls.models 使得可以调用 mmcls 中注册的模块
+custom_imports = dict(imports=['mmcls.models'], allow_failed_imports=False)
+
+deepen_factor = _base_.deepen_factor
+widen_factor = 1.0
+channels = [40, 112, 320]
+
+model = dict(
+    backbone=dict(
+        _delete_=True,  # 将 _base_ 中关于 backbone 的字段删除
+        type='mmcls.TIMMBackbone',  # 使用 mmcls 中的 timm 主干网络
+        model_name='efficientnet_b1',  # 使用 TIMM 中的 efficientnet_b1
+        features_only=True,
+        pretrained=True,
+        out_indices=(2, 3, 4)),
+    neck=dict(
+        type='YOLOv5PAFPN',
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+        in_channels=channels,  # 注意:EfficientNet-B1 输出的3个通道是 [40, 112, 320],和原先的 yolov5-s neck 不匹配,需要更改
+        out_channels=channels),
+    bbox_head=dict(
+        type='YOLOv5Head',
+        head_module=dict(
+            type='YOLOv5HeadModule',
+            in_channels=channels,  # head 部分输入通道也要做相应更改
+            widen_factor=widen_factor))
+)
+```
+
+### 使用在 MMSelfSup 中实现的主干网络
+
+假设想将 MMSelfSup 中 `MoCo v3`  自监督训练的 `ResNet-50` 作为 `YOLOv5` 的主干网络,则配置文件如下:
+
+```python
+_base_ = './yolov5_s-v61_syncbn_8xb16-300e_coco.py'
+
+# 请先使用命令: mim install "mmselfsup>=1.0.0rc3",安装 mmselfsup
+# 导入 mmselfsup.models 使得可以调用 mmselfsup 中注册的模块
+custom_imports = dict(imports=['mmselfsup.models'], allow_failed_imports=False)
+checkpoint_file = 'https://download.openmmlab.com/mmselfsup/1.x/mocov3/mocov3_resnet50_8xb512-amp-coslr-800e_in1k/mocov3_resnet50_8xb512-amp-coslr-800e_in1k_20220927-e043f51a.pth'  # noqa
+deepen_factor = _base_.deepen_factor
+widen_factor = 1.0
+channels = [512, 1024, 2048]
+
+model = dict(
+    backbone=dict(
+        _delete_=True, # 将 _base_ 中关于 backbone 的字段删除
+        type='mmselfsup.ResNet',
+        depth=50,
+        num_stages=4,
+        out_indices=(2, 3, 4), # 注意:MMSelfSup 中 ResNet 的 out_indices 比 MMdet 和 MMCls 的要大 1
+        frozen_stages=1,
+        norm_cfg=dict(type='BN', requires_grad=True),
+        norm_eval=True,
+        style='pytorch',
+        init_cfg=dict(type='Pretrained', checkpoint=checkpoint_file)),
+    neck=dict(
+        type='YOLOv5PAFPN',
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+        in_channels=channels, # 注意:ResNet-50 输出的3个通道是 [512, 1024, 2048],和原先的 yolov5-s neck 不匹配,需要更改
+        out_channels=channels),
+    bbox_head=dict(
+        type='YOLOv5Head',
+        head_module=dict(
+            type='YOLOv5HeadModule',
+            in_channels=channels, # head 部分输入通道也要做相应更改
+            widen_factor=widen_factor))
+)
+```
+
+### 不使用预训练权重
+
+通常情况下,骨干网络初始化都是优先选择预训练权重。如果你不想使用预训练权重,而是想从头开始训练时模型时,
+我们可以将 `backbone` 中的 `init_cfg` 设置为 `None`,此时骨干网络将会以默认的初始化方法进行初始化,
+而不会使用训练好的预训练权重进行初始。以下是以 `YOLOv5` 使用 resnet 作为主干网络为例子,其余算法也是同样的处理:
+
+```python
+_base_ = './yolov5_s-v61_syncbn_8xb16-300e_coco.py'
+
+deepen_factor = _base_.deepen_factor
+widen_factor = 1.0
+channels = [512, 1024, 2048]
+
+model = dict(
+    backbone=dict(
+        _delete_=True, # 将 _base_ 中关于 backbone 的字段删除
+        type='mmdet.ResNet', # 使用 mmdet 中的 ResNet
+        depth=50,
+        num_stages=4,
+        out_indices=(1, 2, 3),
+        frozen_stages=1,
+        norm_cfg=dict(type='BN', requires_grad=True),
+        norm_eval=True,
+        style='pytorch',
+        init_cfg=None # init_cfg 设置为 None,则 backbone 将不会使用预训练好的权重进行初始化了
+    ),
+    neck=dict(
+        type='YOLOv5PAFPN',
+        widen_factor=widen_factor,
+        in_channels=channels, # 注意:ResNet-50 输出的 3 个通道是 [512, 1024, 2048],和原先的 yolov5-s neck 不匹配,需要更改
+        out_channels=channels),
+    bbox_head=dict(
+        type='YOLOv5Head',
+        head_module=dict(
+            type='YOLOv5HeadModule',
+            in_channels=channels, # head 部分输入通道也要做相应更改
+            widen_factor=widen_factor))
+)
+```
diff --git a/mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/training_testing_tricks.md b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/training_testing_tricks.md
new file mode 100644
index 0000000..ba67063
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/training_testing_tricks.md
@@ -0,0 +1,303 @@
+# 训练和测试技巧
+
+MMYOLO 中已经支持了大部分 YOLO 系列目标检测相关算法。不同算法可能涉及到一些实用技巧。本章节将基于所实现的目标检测算法,详细描述 MMYOLO 中已经支持的常用的训练和测试技巧。
+
+## 训练技巧
+
+### 提升检测性能
+
+#### 1 开启多尺度训练
+
+在目标检测领域,多尺度训练是一个非常常用的技巧,但是在 YOLO 中大部分模型的训练输入都是单尺度的 640x640,原因有两个方面:
+
+1. 单尺度训练速度快。当训练 epoch 在 300 或者 500 的时候训练效率是用户非常关注的,多尺度训练会比较慢
+2. 训练 pipeline 中隐含了多尺度增强,等价于应用了多尺度训练,典型的如 `Mosaic`、`RandomAffine` 和 `Resize` 等,故没有必要再次引入模型输入的多尺度训练
+
+在 COCO 数据集上进行了简单实验,如果直接在 YOLOv5 的 DataLoader 输出后再次引入多尺度训练增强实际性能提升非常小,但是这不代表用户自定义数据集微调模式下没有明显增益。如果想在 MMYOLO 中对 YOLO 系列算法开启多尺度训练,可以参考 [多尺度训练文档](../common_usage/ms_training_testing.md)
+
+#### 2 使用 Mask 标注优化目标检测性能
+
+在数据集标注完备例如同时存在边界框和实例分割标注但任务只需要其中部分标注情况下,可以借助完备的数据标注训练单一任务从而提升性能。在目标检测中同样可以借鉴实例分割标注来提升目标检测性能。 以下是 YOLOv8 额外引入实例分割标注优化目标检测结果。 性能增益如下所示:
+
+<div align="center">
+<img src="https://user-images.githubusercontent.com/17425982/224920799-597ee962-5997-48b3-9499-25f885d7a421.png" width="1000"/>
+</div>
+
+从上述曲线图可以看出,不同尺度模型都有了不同程度性能提升。需要注意的是 `Mask Refine` 仅仅的是作用在数据增强阶段,对模型其他训练部分不需要任何改动,且不会影响训练速度。具体如下所示:
+
+<div align="center">
+<img src="https://user-images.githubusercontent.com/17425982/224922191-a52cb410-d08d-455a-bd38-08b83266cc5f.png" width="1000"/>
+</div>
+
+上述的 Mask 表示实例分割标注发挥关键作用的数据增强变换,将该技巧应用到其他 YOLO 系列中均有不同程度涨点。
+
+#### 3 训练后期关闭强增强提升检测性能
+
+该策略是在 YOLOX 算法中第一次被提出可以极大的提升检测性能。 论文中指出虽然 Mosaic+MixUp 可以极大的提升目标检测性能,但是它生成的训练图片远远脱离自然图片的真实分布,并且 Mosaic 大量的裁剪操作会带来很多不准确的标注框,所以 YOLOX 提出在最后 15 个 epoch 关掉强增强,转而使用较弱的增强,从而为了让检测器避开不准确标注框的影响,在自然图片的数据分布下完成最终的收敛。
+
+该策略已经被应用到了大部分 YOLO 算法中,以 YOLOv8 为例其数据增强 pipeline 如下所示:
+
+<div align="center">
+<img src="https://user-images.githubusercontent.com/17425982/224923285-dd23e419-1d9d-4ee6-bec6-af0a6ef5fed0.png" width="400"/>
+</div>
+
+不过在何时关闭强增强是一个超参,如果关闭太早则可能没有充分发挥 Mosaic 等强增强效果,如果关闭太晚则由于之前已经过拟合,此时再关闭则没有任何增益。 在 YOLOv8 实验中可以观察到该现象
+
+| Backbone | Mask Refine |   box AP    | Epoch of best mAP |
+| :------: | :---------: | :---------: | :---------------: |
+| YOLOv8-n |     No      |    37.2     |        500        |
+| YOLOv8-n |     Yes     | 37.4 (+0.2) |        499        |
+| YOLOv8-s |     No      |    44.2     |        430        |
+| YOLOv8-s |     Yes     | 45.1 (+0.9) |        460        |
+| YOLOv8-m |     No      |    49.8     |        460        |
+| YOLOv8-m |     Yes     | 50.6 (+0.8) |        480        |
+| YOLOv8-l |     No      |    52.1     |        460        |
+| YOLOv8-l |     Yes     | 53.0 (+0.9) |        491        |
+| YOLOv8-x |     No      |    52.7     |        450        |
+| YOLOv8-x |     Yes     | 54.0 (+1.3) |        460        |
+
+从上表可以看出:
+
+- 大模型在 COCO 数据集训练 500 epoch 会过拟合,在过拟合情况下再关闭 Mosaic 等强增强效果没有效果
+- 使用 Mask 标注可以缓解过拟合,并且提升性能
+
+#### 4 加入纯背景图片抑制误报率
+
+对于非开放世界数据集目标检测而言,训练和测试都是在固定类别上进行,一旦应用到没有训练过的类别图片上有可能会产生误报,一个常见的缓解策略是加入一定比例的纯背景图片。 在大部分 YOLO 系列中都是默认开启了加入纯背景图片抑制误报率功能,用户只需要设置 `train_dataloader.dataset.filter_cfg.filter_empty_gt` 为 False 即可,表示将纯背景图片不过滤掉加入训练。
+
+#### 5 试试 AdamW 也许效果显著
+
+YOLOv5,YOLOv6,YOLOv7 和 YOLOv8 等都是采用了 SGD 优化器,该参数器对参数的设置比较严格,而 AdamW 则正好相反,其对学习率设置等没有那么敏感。因此如果用户在自定义数据集微调可以尝试选择 AdamW 优化器。我们在 YOLOX 中进行了简单尝试,发现在 tiny、s 和 m 尺度模型上将其优化器替换为 AdamW 均有一定程度涨点。
+
+|  Backbone  | Size | Batch Size | RTMDet-Hyp |   Box AP    |
+| :--------: | :--: | :--------: | :--------: | :---------: |
+| YOLOX-tiny | 416  |    8xb8    |     No     |    32.7     |
+| YOLOX-tiny | 416  |   8xb32    |    Yes     | 34.3 (+1.6) |
+|  YOLOX-s   | 640  |    8xb8    |     No     |    40.7     |
+|  YOLOX-s   | 640  |   8xb32    |    Yes     | 41.9 (+1.2) |
+|  YOLOX-m   | 640  |    8xb8    |     No     |    46.9     |
+|  YOLOX-m   | 640  |   8xb32    |    Yes     | 47.5 (+0.6) |
+
+具体见 [configs/yolox/README.md](https://github.com/open-mmlab/mmyolo/blob/main/configs/yolox/README.md#--results-and-models)。
+
+#### 6 考虑 ignore 场景避免不确定性标注
+
+以 CrowdHuman 为例,其是一个拥挤行人检测数据集,下面是一张典型图片:
+
+<div align="center">
+<img src="https://user-images.githubusercontent.com/17425982/224928241-89dac006-392b-445d-87e8-a9e268825401.png" width="1000"/>
+</div>
+
+图片来自 [detectron2 issue](https://github.com/facebookresearch/detectron2/issues/1909)。黄色打叉的区域表示 `iscrowd` 标注。原因有两个方面:
+
+- 这个区域不是真的人,例如海报上的人
+- 该区域过于拥挤,很难标注
+
+在该场景下,你不能简单的将这类标注删掉,因为你一旦删掉就表示当做背景区域来训练了,但是其和背景是不一样的,首先海报上的人和真人很像,并且拥挤区域确实有人只是不好标注。如果你简单的将其当做背景训练,那么会造成漏报。最合适的做法应该是把拥挤区域当做忽略区域即该区域的任何输出都直接忽略,不计算任何 Loss,不强迫模型拟合。
+
+MMYOLO 在 YOLOv5 上简单快速的验证了 `iscrowd` 标注的作用,性能如下所示:
+
+| Backbone | ignore_iof_thr | box AP50(CrowDHuman Metric) |  MR  |  JI   |
+| :------: | :------------: | :-------------------------: | :--: | :---: |
+| YOLOv5-s |       -1       |            85.79            | 48.7 | 75.33 |
+| YOLOv5-s |      0.5       |            86.17            | 48.8 | 75.87 |
+
+`ignore_iof_thr`为 -1 表示不考虑忽略标签,可以看出性能有一定程度的提升,具体见 [CrowdHuman 结果](https://github.com/open-mmlab/mmyolo/blob/main/configs/yolov5/README.md#crowdhuman)。 如果你的自定义数据集上也有上述情况,则建议你考虑 ignore 场景避免不确定性标注。
+
+#### 7 使用知识蒸馏
+
+知识蒸馏是一个被广泛使用的技巧,可以将大模型性能转移到小模型上从而提升小模型检测性能。 目前 MMYOLO 和 MMRazor 已支持了该功能,并在 RTMDet 上进行了初步验证。
+
+|     Model      |   box AP    |
+| :------------: | :---------: |
+|  RTMDet-tiny   |    41.0     |
+| RTMDet-tiny \* | 41.8 (+0.8) |
+|    RTMDet-s    |    44.6     |
+|  RTMDet-s \*   | 45.7 (+1.1) |
+|    RTMDet-m    |    49.3     |
+|  RTMDet-m \*   | 50.2 (+0.9) |
+|    RTMDet-l    |    51.4     |
+|  RTMDet-l \*   | 52.3 (+0.9) |
+
+星号即为采用了大模型蒸馏的结果,详情见 [Distill RTMDet](https://github.com/open-mmlab/mmyolo/tree/main/configs/rtmdet/distillation)。
+
+#### 8 更大的模型用更强的增强参数
+
+如果你基于默认配置修改了模型或者替换了骨干网络,那么建议你基于此刻模型大小来缩放数据增强参数。 一般来说更大的模型需要使用更强的增强参数,否则可能无法发挥大模型的效果,反之如果小模型应用了较强的增强则可能会欠拟合。 以 RTMDet 为例,我们可以观察其不同模型大小的数据增强参数
+
+<div align="center">
+<img src="https://user-images.githubusercontent.com/17425982/224936237-a31add46-77ff-4595-b3d9-c7b574f59c84.png" width="800"/>
+</div>
+
+其中 `random_resize_ratio_range` 表示 `RandomResize` 的随机缩放范围,`mosaic_max_cached_images/mixup_max_cached_images`表示 `Mosaic/MixUp` 增强时候缓存的图片个数,可以用于调整增强的强度。 YOLO 系列模型都是遵循同一套参数设置原则。
+
+### 加快训练速度
+
+#### 1 单尺度训练开启 cudnn_benchmark
+
+YOLO 系列算法中大部分网络输入图片大小都是固定的即单尺度,此时可以开启 `cudnn_benchmark` 来加快训练速度。该参数主要针对 PyTorch 的 cuDNN 底层库进行设置, 设置这个标志可以让内置的 cuDNN 自动寻找最适合当前配置的高效算法来优化运行效率。如果是多尺度模式开启该标志则会不断的寻找最优算法,反而会拖慢训练速度。
+
+在 MMYOLO 中开启 `cudnn_benchmark`,只需要在配置中设置 `env_cfg = dict(cudnn_benchmark=True)`
+
+#### 2 使用带缓存的 Mosaic 和 MixUp
+
+如果你的数据增强中应用了 Mosaic 和 MixUp,并且经过排查训练瓶颈来自图片的随机读取,那么建议将常规的 Mosaic 和 MixUp 替换为 RTMDet 中提出的带缓存的版本。
+
+| Data Aug | Use cache | ms/100 imgs |
+| :------: | :-------: | :---------: |
+|  Mosaic  |    No     |    87.1     |
+|  Mosaic  |    Yes    |    24.0     |
+|  MixUp   |    No     |    19.3     |
+|  MixUp   |    Yes    |    12.4     |
+
+Mosaic 和 MixUp 涉及到多张图片的混合,它们的耗时会是普通数据增强的 K 倍(K 为混入图片的数量)。 如在 YOLOv5 中每次做 Mosaic 时, 4 张图片的信息都需要从硬盘中重新加载。 而带缓存的  Mosaic 和 MixUp 只需要重新载入当前的一张图片,其余参与混合增强的图片则从缓存队列中获取,通过牺牲一定内存空间的方式大幅提升了效率。
+
+<div align=center>
+<img alt="data cache" src="https://user-images.githubusercontent.com/33799979/192730011-90e2a28d-e163-4399-bf87-d3012007d8c3.png" width=800 />
+</div>
+
+如图所示,cache 队列中预先储存了 N 张已加载的图像与标签数据,每一个训练 step 中只需加载一张新的图片及其标签数据并更新到 cache 队列中(cache 队列中的图像可重复,如图中出现两次 img3),同时如果 cache 队列长度超过预设长度,则随机 pop 一张图,当需要进行混合数据增强时,只需要从 cache 中随机选择需要的图像进行拼接等处理,而不需要全部从硬盘中加载,节省了图像加载的时间。
+
+### 减少超参
+
+YOLOv5 中通过实践提供了一些减少超参数的方法,下面详细说明。
+
+#### 1 Loss 权重自适应,少 1 个超参
+
+一般来说,对于不同的任务或者不同的类别,可能需要针对性的设置超参,而这通常比较难。YOLOv5 中根据实践提出了一些根据类别数和检测输出层个数来自适应缩放 Loss 权重的方法,如下所示:
+
+```python
+# scaled based on number of detection layers
+loss_cls=dict(
+    type='mmdet.CrossEntropyLoss',
+    use_sigmoid=True,
+    reduction='mean',
+    loss_weight=loss_cls_weight *
+    (num_classes / 80 * 3 / num_det_layers)),
+loss_bbox=dict(
+    type='IoULoss',
+    iou_mode='ciou',
+    bbox_format='xywh',
+    eps=1e-7,
+    reduction='mean',
+    loss_weight=loss_bbox_weight * (3 / num_det_layer
+    return_iou=True),
+loss_obj=dict(
+    type='mmdet.CrossEntropyLoss',
+    use_sigmoid=True,
+    reduction='mean',
+    loss_weight=loss_obj_weight *
+    ((img_scale[0] / 640)**2 * 3 / num_det_layers)),
+```
+
+`loss_cls` 可以根据自定义类别数和检测层数对 `loss_weight` 进行自适应缩放,`loss_bbox` 可以根据检测层数进行自适应计算,而 `loss_obj` 可以根据输入图片大小和检测层数进行自适应缩放。这种策略可以让用户不用去设置 Loss 权重超参。
+需要说明的是:这个只是经验规则,并不是说是最佳设置组合,只是作为一个参考。
+
+#### 2 Weight Decay 和 Loss 输出值基于 Batch Size 自适应,少 2 个超参
+
+一般来说,在不同的 `Batch Size` 上进行训练,需要遵循学习率自动缩放规则。但是在各个数据集上验证表明 YOLOv5 实际上在改变 `Batch Size` 时候不缩放学习率也可以取得不错的效果,甚至有时候你缩放了效果还更差。原因就在于代码中存在 `Weight Decay` 和 Loss 输出值基于 `Batch Size` 自适应的技巧。在 YOLOv5 中会基于当前训练的总 `Batch Size` 来缩放 `Weight Decay` 和 Loss 输出值。对应代码为:
+
+```python
+# https://github.com/open-mmlab/mmyolo/blob/dev/mmyolo/engine/optimizers/yolov5_optim_constructor.py#L86
+if 'batch_size_per_gpu' in optimizer_cfg:
+    batch_size_per_gpu = optimizer_cfg.pop('batch_size_per_gpu')
+    # No scaling if total_batch_size is less than
+    # base_total_batch_size, otherwise linear scaling.
+    total_batch_size = get_world_size() * batch_size_per_gpu
+    accumulate = max(
+        round(self.base_total_batch_size / total_batch_size), 1)
+    scale_factor = total_batch_size * \
+        accumulate / self.base_total_batch_size
+    if scale_factor != 1:
+        weight_decay *= scale_factor
+        print_log(f'Scaled weight_decay to {weight_decay}', 'current')
+```
+
+```python
+# https://github.com/open-mmlab/mmyolo/blob/dev/mmyolo/models/dense_heads/yolov5_head.py#L635
+ _, world_size = get_dist_info()
+ return dict(
+     loss_cls=loss_cls * batch_size * world_size,
+     loss_obj=loss_obj * batch_size * world_size,
+     loss_bbox=loss_box * batch_size * world_size)
+```
+
+在不同的 Batch Size 下 Loss 的权重是不一样大的,Batch Size 越大,Loss 就越大,梯度就越大,我个人猜测这可以等价于 Batch Size 增大时候,学习率线性增加的场合。
+实际上从 YOLOv5 的 [YOLOv5 Study: mAP vs Batch-Size](https://github.com/ultralytics/yolov5/discussions/2452) 中可以发现确实是希望用户在修改 Batch Size 时不需要修改其他参数也可以相近的性能。上述两个策略是一个非常不错的训练技巧。
+
+### 减少训练显存
+
+如何减少训练显存是一个经常谈论的问题,所涉及的技术也非常多。 MMYOLO 的训练执行器来自 MMEngine,因此如何减少训练显存可以查阅 MMEngine 的文档。 MMEngine 目前支持梯度累加、梯度检查点和大模型训练技术,详情见
+[节省显存](https://mmengine.readthedocs.io/zh_CN/latest/common_usage/save_gpu_memory.html)。
+
+## 测试技巧
+
+### 推理速度和测试精度的平衡
+
+在模型性能测试时候,我们一般是要求 mAP 越高越好,但是在实际应用或者推理时候我们希望在保证低误报率和漏报率情况下模型推理越快越好,或者说测试只关注 mAP 而忽略了后处理和评估速度,而实际落地应用时候会追求速度和精度的平衡。
+在 YOLO 系列中可以通过控制某些参数实现速度和精度平衡,下面以 YOLOv5 为例对其进行详细描述。
+
+#### 1 推理时避免一个检测框输出多个类别
+
+YOLOv5 在训练分类分支时候采用的是 BCE Loss 即 `use_sigmoid=True`。假设物体类别数是 4,那么分类分支输出的类别数是 4 而不是 5,并且由于使用的是 sigmoid 而非 softmax 预测模式,很可能在某个位置预测出多个满足过滤阈值的检测框,也就是会出现一个预测 bbox 对应多个预测 label 的情况。如下图所示
+
+<div align=center>
+<img alt="multi-label" src="https://user-images.githubusercontent.com/17425982/226282295-8ef53a89-e33e-4fd5-8d60-417db2d5a140.png" width=800 />
+</div>
+
+一般在计算 mAP 时候过滤阈值为 0.001,由于 sigmoid 非竞争性预测模式会导致一个框对应多个 label。这种计算方式可以提高 mAP 计算时候的召回率,但是实际落地应用会不方便。
+
+一个常用的办法就是提高过滤阈值,但是如果你不需要出现较多漏报,此时推荐你修改 `multi_label` 参数为 False,其位于配置的 `mode.test_cfg.multi_label` 中,默认值是 True 表示允许一个检测框对应多个 label。
+
+#### 2 简化 test pipeline
+
+注意到 YOLOv5 的 test pipeline 为如下:
+
+```python
+test_pipeline = [
+    dict(type='LoadImageFromFile'),
+    dict(type='YOLOv5KeepRatioResize', scale=img_scale),
+    dict(
+        type='LetterResize',
+        scale=img_scale,
+        allow_scale_up=False,
+        pad_val=dict(img=114)),
+    dict(type='LoadAnnotations', with_bbox=True, _scope_='mmdet'),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                   'scale_factor', 'pad_param'))
+]
+```
+
+其使用了两个不同功能的 Resize,目的依然是提高评估时候的 mAP 值。在实际落地应用时候你可以简化该 pipeline,如下所示:
+
+```python
+test_pipeline = [
+    dict(type='LoadImageFromFile'),
+    dict(
+        type='LetterResize',
+        scale=_base_.img_scale,
+        allow_scale_up=True,
+        use_mini_pad=True),
+    dict(type='LoadAnnotations', with_bbox=True),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                   'scale_factor', 'pad_param'))
+]
+```
+
+实际上 YOLOv5 算法在实际应用时候是采用简化的 pipeline,并将 multi_label 设为 False, score_thr 提高为 0.25, iou_threshold 降低为 0.45。
+在 YOLOv5 配置中我们提供了一套 detect 落地时候的配置参数,具体见 [yolov5_s-v61_syncbn-detect_8xb16-300e_coco.py](https://github.com/open-mmlab/mmyolo/blob/main/configs/yolov5/yolov5_s-v61_syncbn-detect_8xb16-300e_coco.py)。
+
+#### 3 Batch Shape 策略加快测试速度
+
+Batch Shape 是 YOLOv5 中提出的可以加快推理的一个测试技巧,其思路是不再强制要求整个测试过程图片都是 640x640,而是可以变尺度测试,只需要保证当前 batch 内的 shape 是一样的就行。这种方式可以减少额外的图片像素填充,从而实现加速推理过程。
+Batch Shape 的具体实现可以参考 [链接](https://github.com/open-mmlab/mmyolo/blob/main/mmyolo/datasets/utils.py#L55)。MMYOLO 中几乎所有算法在测试时候都是默认开启了 Batch Shape 策略。 如果用户想关闭该功能,可以设置 `val_dataloader.dataset.batch_shapes_cfg=None`。
+
+在实际落地场景下,因为动态 shape 没有固定 shape 快且高效,所以一般会不采用这个策略。
+
+### TTA 提升测试精度
+
+TTA 测试时增强是一个万能的涨点技巧,在打比赛时候非常有用。MMYOLO 已经支持了 TTA,只需要在测试时候输入 `--tta` 即可开启。详情见 [TTA 说明](https://github.com/open-mmlab/mmyolo/blob/dev/docs/zh_cn/common_usage/tta.md)。
diff --git a/mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/troubleshooting_steps.md b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/troubleshooting_steps.md
new file mode 100644
index 0000000..cc4fc2e
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/troubleshooting_steps.md
@@ -0,0 +1,111 @@
+# 常见错误排除步骤
+
+本文档收集用户经常碰到的常见错误情况,并提供详细的排查步骤。如果你发现阅读本文你没有找到正确的解决方案,请联系我们或者提 PR 进行更新。提 PR 请参考 [如何给 MMYOLO 贡献代码](../recommended_topics/contributing.md)
+
+## xxx is not in the model registry
+
+这个错误信息是指某个模块没有被注册到 model 中。 这个错误出现的原因非常多,典型的情况有:
+
+1. 你新增的模块没有在类别前面加上注册器装饰器 @MODELS.register_module()
+2. 虽然注册了,但是注册错了位置,例如你实际想注册到 MMYOLO 中,但是你导入的 MODELS 是 MMDet 包里面的
+3. 你注册了且注册正确了,但是没有在对应的 `__init__.py` 中加入导致没有被导入
+4. 以上 3 个步骤都确认没问题,但是你是新增 py 文件来自定义模块的却没有重新安装 MMYOLO 导致没有生效,此时你可以重新安装一遍,即使你是 -e 模式安装也需要重新安装
+5. 如果你是在 mmyolo 包路径下新增了一个 package, 除上述步骤外,你还需要在 [register_all_modules](https://github.com/open-mmlab/mmyolo/blob/main/mmyolo/utils/setup_env.py#L8) 函数中增加其导包代码,否则该 package 不会被自动触发
+6. 你的环境中有多个版本 MMYOLO,你注册的和实际运行的实际上不是同一套代码,导致没有生效。此时你可以在程序运行前输入 `PYTHONPATH="$(dirname $0)/..":$PYTHONPATH` 强行使用当前代码
+
+## loss_bbox 始终为 0
+
+该原因出现主要有两个原因:
+
+1. 训练过程中没有 GT 标注数据
+2. 参数设置不合理导致训练中没有正样本
+
+第一种情况出现的概率更大。 `loss_bbox` 通常是只考虑正样本的 loss,如果训练中没有正样本则始终为 0。如果是第一种原因照成的 `loss_bbox` 始终为 0,那么通常意味着你配置不对,特别是 dataset 部分的配置不正确。
+一个非常典型的情况是用户的 `dataset` 中 `metainfo` 设置不正确或者设置了但是没有传给 dataset 导致加载后没有找到对应类别的 GT Bbox 标注。 这种情况请仔细阅读我们提供的 [示例配置](https://github.com/open-mmlab/mmyolo/blob/main/projects/misc/custom_dataset/yolov5_s-v61_syncbn_fast_1xb32-100e_cat.py#L27) 。
+验证 dataset 配置是否正确的一个最直接的途径是运行 [browse_dataset 脚本](https://github.com/open-mmlab/mmyolo/blob/main/tools/analysis_tools/browse_dataset.py),如果可视化效果正确则说明是正确的。
+
+## MMCV 安装时间非常久
+
+这通常意味着你在自己编译 MMCV 而不是直接下载使用我们提供的预编译包。 MMCV 中包括了大量的自定义的 CUDA 算子,如果从源码安装则需要非常久的时间去编译,并且由于其安装成功依赖于严格的底层环境信息,需要多个库的版本一致才可以。如果用户自己编译大概率会失败。
+我们不推荐用户自己去编译 MMCV 而应该优先选择预编译包。如果你当前的环境中我们没有提供对应的预编译包,那么建议你可以快速换一个 Conda 环境,并安装有预编译包的 Torch。 以 torch1.8.0+cu102 为例,如果你想查看目前查看所有的预编译包,可以查看 https://download.openmmlab.com/mmcv/dist/cu102/torch1.8.0/index.html。
+
+## 基于官方配置继承新建的配置出现 unexpected keyword argument
+
+这通常是由于你没有删除 base 配置中的额外参数。 可以在你新建配置所修改的字典中增加 `_delete_=True` 删掉 base 中该类之前的所有参数。
+
+## The testing results of the whole dataset is empty
+
+这通常说明训练效果太差导致网络没有预测出任何符合阈值要求的检测框。 出现这种现象有多个原因,典型的为:
+
+1. 当前为前几个 epoch,网络当前训练效果还较差,等后续训练久一点后可能就不会出现该警告了
+2. 配置设置不正确,网络虽然正常训练但是实际上无效训练,例如前面的 `loss_bbox` 始终为 0 就会导致上述警告
+3. 超参设置不合理
+
+## ValueError: not enough values to unpack(expected 2, got 0)
+
+这个错误通常是在 epoch 切换时候出现。这是 PyTorch 1.7 的已知问题,在 PyTorch 1.8+ 中已经修复。如果在 PyTorch 1.7 中想修复这个问题,可以简单的设置 dataloader 参数 `persistent_workers` 为 False。
+
+## ValueError: need at least one array to concatenate
+
+这个是一个非常常见的错误,可能出现在训练一开始或者训练正常但是评估时候。不管出现在何阶段,均说明你的配置不对:
+
+1. 最常见的错误就是 `num_classes` 参数设置不对。在 MMYOLO 或者 MMDet 中大部分配置都是以 COCO 数据为例,因此配置中默认的 `num_classes` 是 80, 如果用户自定义数据集没有正确修改这个字段则会出现上述错误。
+   MMYOLO 中有些算法配置会在多个模块中都需要 `num_classes` 参数,用户经常出现的错误就是仅仅修改了某一个地方的 `num_classes` 而没有将所有的 `num_classes` 都修改。想快速解决这个问题,可以使用 [print_config](https://github.com/open-mmlab/mmyolo/blob/main/tools/misc/print_config.py)
+   脚本打印下全配置,然后全局搜索 `num_classes` 确认是否有没有修改的模块。
+2. 该错误还可能会出现在对 `dataset.metainfo.classes` 参数设置不对造成的。当用户希望训练自己的数据集但是未能正确的修改 `dataset.metainfo.classes` 参数,而默认的使用 `COCO` 数据集中的类别时,且用户自定义数据集的所有类别不在 `COCO` 数据集的类别里就会出现该错误。这时需要用户核对并修改正确的 `dataset.metainfo.classes` 信息。
+
+## 评估时候 IndexError: list index out of range
+
+具体输出信息是
+
+```text
+  File "site-packages/mmdet/evaluation/metrics/coco_metric.py", line 216, in results2json
+    data['category_id'] = self.cat_ids[label]
+IndexError: list index out of range
+```
+
+可以看出是评估时候类别索引越界,这个通常的原因是配置中的 `num_classes` 设置不正确,默认的 `num_classes` 是 80,如果你自定义类别小于 80,那么就有可能出现类别越界。注意算法配置的 `num_classes` 一般会用到多个模块,你可能只改了某几个而漏掉了一些。想快速解决这个问题,可以使用 [print_config](https://github.com/open-mmlab/mmyolo/blob/main/tools/misc/print_config.py)
+脚本打印下全配置,然后全局搜索 `num_classes` 确认是否有没有修改的模块。
+
+## 训练中不打印 loss,但是程序依然正常训练和评估
+
+这通常是因为一个训练 epoch 没有超过 50 个迭代,而 MMYOLO 中默认的打印间隔是 50。你可以修改 `default_hooks.logger.interval` 参数。
+
+## GPU out of memory
+
+1. 存在大量 ground truth boxes 或者大量 anchor 的场景,可能在 assigner 会 OOM。
+2. 使用 --amp 来开启混合精度训练。
+3. 你也可以尝试使用 MMDet 中的 AvoidCUDAOOM 来避免该问题。首先它将尝试调用 torch.cuda.empty_cache()。如果失败,将会尝试把输入类型转换到 FP16。如果仍然失败,将会把输入从 GPUs 转换到 CPUs 进行计算。这里提供了两个使用的例子:
+
+```python
+from mmdet.utils import AvoidCUDAOOM
+
+output = AvoidCUDAOOM.retry_if_cuda_oom(some_function)(input1, input2)
+```
+
+你也可也使用 AvoidCUDAOOM 作为装饰器让代码遇到 OOM 的时候继续运行:
+
+```python
+from mmdet.utils import AvoidCUDAOOM
+
+@AvoidCUDAOOM.retry_if_cuda_oom
+def function(*args, **kwargs):
+    ...
+    return xxx
+```
+
+## Loss goes Nan
+
+1. 检查数据的标注是否正常, 长或宽为 0 的框可能会导致回归 loss 变为 nan,一些小尺寸(宽度或高度小于 1)的框在数据增强后也会导致此问题。 因此,可以检查标注并过滤掉那些特别小甚至面积为 0 的框,并关闭一些可能会导致 0 面积框出现数据增强。
+2. 降低学习率:由于某些原因,例如 batch size 大小的变化, 导致当前学习率可能太大。 您可以降低为可以稳定训练模型的值。
+3. 延长 warm up 的时间:一些模型在训练初始时对学习率很敏感。
+4. 添加 gradient clipping: 一些模型需要梯度裁剪来稳定训练过程。 你可以在 config 设置 `optim_wrapper.clip_grad=dict(max_norm=xx)`
+
+## 训练中其他不符合预期或者错误
+
+如果训练或者评估中出现了不属于上述描述的问题,由于原因不明,现提供常用的排除流程:
+
+1. 首先确认配置是否正确,可以使用 [print_config](https://github.com/open-mmlab/mmyolo/blob/main/tools/misc/print_config.py) 脚本打印全部配置,如果运行成功则说明配置语法没有错误
+2. 确认 COCO 格式的 json 标注是否正确,可以使用 [browse_coco_json.py](https://github.com/open-mmlab/mmyolo/blob/main/tools/misc/browse_coco_json.py) 脚本确认
+3. 确认 dataset 部分配置是否正确,这一步骤几乎是必须要提前运行的,可以提前排查很多问题,可以使用 [browse_dataset.py](https://github.com/open-mmlab/mmyolo/blob/main/tools/misc/browse_dataset.py) 脚本确认
+4. 如果以上 3 步都没有问题,那么出问题可能在 model 部分了。这个部分的排除没有特别的办法,你可以单独写一个脚本来仅运行 model 部分并通过调试来确认,如果对于 model 中多个模块的输入构建存在困惑,可以参考对应模块的单元测试写法
diff --git a/mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/visualization.md b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/visualization.md
new file mode 100644
index 0000000..ed4bbf9
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/recommended_topics/visualization.md
@@ -0,0 +1,542 @@
+# 关于可视化的一切
+
+本文包括特征图可视化和 Grad-Based 和 Grad-Free CAM 可视化
+
+## 特征图可视化
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/89863442/190903635-27bbc619-9bf8-43a8-aea8-ea13b9dad28c.jpg" width="1000" alt="image"/>
+</div>
+可视化可以给深度学习的模型训练和测试过程提供直观解释。
+
+MMYOLO 中,将使用 MMEngine 提供的 `Visualizer` 可视化器进行特征图可视化,其具备如下功能:
+
+- 支持基础绘图接口以及特征图可视化。
+- 支持选择模型中的不同层来得到特征图,包含 `squeeze_mean` , `select_max` , `topk` 三种显示方式,用户还可以使用 `arrangement` 自定义特征图显示的布局方式。
+
+### 特征图绘制
+
+你可以调用 `demo/featmap_vis_demo.py` 来简单快捷地得到可视化结果,为了方便理解,将其主要参数的功能梳理如下:
+
+- `img`:选择要用于特征图可视化的图片,支持单张图片或者图片路径列表。
+
+- `config`:选择算法的配置文件。
+
+- `checkpoint`:选择对应算法的权重文件。
+
+- `--out-file`:将得到的特征图保存到本地,并指定路径和文件名。
+
+- `--device`:指定用于推理图片的硬件,`--device cuda:0`  表示使用第 1 张 GPU 推理,`--device cpu` 表示用 CPU 推理。
+
+- `--score-thr`:设置检测框的置信度阈值,只有置信度高于这个值的框才会显示。
+
+- `--preview-model`:可以预览模型,方便用户理解模型的特征层结构。
+
+- `--target-layers`:对指定层获取可视化的特征图。
+
+  - 可以单独输出某个层的特征图,例如: `--target-layers backbone` ,  `--target-layers neck` ,  `--target-layers backbone.stage4` 等。
+  - 参数为列表时,也可以同时输出多个层的特征图,例如: `--target-layers backbone.stage4 neck` 表示同时输出 backbone 的 stage4 层和 neck 的三层一共四层特征图。
+
+- `--channel-reduction`:输入的 Tensor 一般是包括多个通道的,`channel_reduction` 参数可以将多个通道压缩为单通道,然后和图片进行叠加显示,有以下三个参数可以设置:
+
+  - `squeeze_mean`:将输入的 C 维度采用 mean 函数压缩为一个通道,输出维度变成 (1, H, W)。
+  - `select_max`:将输入先在空间维度 sum,维度变成 (C, ),然后选择值最大的通道。
+  - `None`:表示不需要压缩,此时可以通过 `topk` 参数可选择激活度最高的 `topk` 个特征图显示。
+
+- `--topk`:只有在 `channel_reduction` 参数为 `None` 的情况下, `topk` 参数才会生效,其会按照激活度排序选择 `topk` 个通道,然后和图片进行叠加显示,并且此时会通过 `--arrangement` 参数指定显示的布局,该参数表示为一个数组,两个数字需要以空格分开,例如: `--topk 5 --arrangement 2 3` 表示以 `2行 3列` 显示激活度排序最高的 5 张特征图, `--topk 7 --arrangement 3 3` 表示以 `3行 3列` 显示激活度排序最高的 7 张特征图。
+
+  - 如果 topk 不是 -1,则会按照激活度排序选择 topk 个通道显示。
+  - 如果 topk = -1,此时通道 C 必须是 1 或者 3 表示输入数据是图片,否则报错提示用户应该设置 `channel_reduction` 来压缩通道。
+
+- 考虑到输入的特征图通常非常小,函数默认将特征图进行上采样后方便进行可视化。
+
+**注意:当图片和特征图尺度不一样时候,`draw_featmap` 函数会自动进行上采样对齐。如果你的图片在推理过程中前处理存在类似 Pad 的操作此时得到的特征图也是 Pad 过的,那么直接上采样就可能会出现不对齐问题。**
+
+### 用法示例
+
+以预训练好的 YOLOv5-s 模型为例:
+
+请提前下载 YOLOv5-s 模型权重到本仓库根路径下:
+
+```shell
+cd mmyolo
+wget https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth
+```
+
+(1) 将多通道特征图采用 `select_max` 参数压缩为单通道并显示, 通过提取 `backbone` 层输出进行特征图可视化,将得到 `backbone` 三个输出层的特征图:
+
+```shell
+python demo/featmap_vis_demo.py demo/dog.jpg \
+                                configs/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py \
+                                yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth \
+                                --target-layers backbone \
+                                --channel-reduction select_max
+```
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/17425982/198520580-c1b24d50-2e90-4ba5-af51-5a7dcb9db945.png" width="800" alt="image"/>
+</div>
+
+实际上上述代码存在图片和特征图不对齐问题,解决办法有两个:
+
+1. 修改 YOLOv5 配置,让后处理只是简单的 Resize 即可,这对于可视化是没有啥影响的
+
+2. 可视化时候图片应该用前处理后的,而不能用前处理前的
+
+**为了简单目前这里采用第一种解决办法,后续会采用第二种方案修复,让大家可以不修改配置即可使用**。具体来说是将原先的 `test_pipeline` 替换为仅仅 Resize 版本。
+
+旧的 `test_pipeline` 为:
+
+```python
+test_pipeline = [
+    dict(
+        type='LoadImageFromFile'),
+    dict(type='YOLOv5KeepRatioResize', scale=img_scale),
+    dict(
+        type='LetterResize',
+        scale=img_scale,
+        allow_scale_up=False,
+        pad_val=dict(img=114)),
+    dict(type='LoadAnnotations', with_bbox=True, _scope_='mmdet'),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                   'scale_factor', 'pad_param'))
+]
+```
+
+修改为如下配置:
+
+```python
+test_pipeline = [
+    dict(
+        type='LoadImageFromFile',
+        backend_args=_base_.backend_args),
+    dict(type='mmdet.Resize', scale=img_scale, keep_ratio=False), # 这里将 LetterResize 修改成 mmdet.Resize
+    dict(type='LoadAnnotations', with_bbox=True, _scope_='mmdet'),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                   'scale_factor'))
+]
+```
+
+正确效果如下:
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/17425982/198521116-dbccade4-370c-4051-92bf-923ca8f60f24.png" width="800" alt="image"/>
+</div>
+
+(2) 将多通道特征图采用 `squeeze_mean` 参数压缩为单通道并显示, 通过提取 `neck` 层输出进行特征图可视化,将得到 `neck` 三个输出层的特征图:
+
+```shell
+python demo/featmap_vis_demo.py demo/dog.jpg \
+                                configs/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py \
+                                yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth \
+                                --target-layers neck \
+                                --channel-reduction squeeze_mean
+```
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/17425982/198521267-20202e3d-b1bc-4559-9085-e0af287636c8.png" width="800" alt="image"/>
+</div>
+
+(3) 将多通道特征图采用 `squeeze_mean` 参数压缩为单通道并显示, 通过提取 `backbone.stage4` 和 `backbone.stage3` 层输出进行特征图可视化,将得到两个输出层的特征图:
+
+```shell
+python demo/featmap_vis_demo.py demo/dog.jpg \
+                                configs/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py \
+                                yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth \
+                                --target-layers backbone.stage4 backbone.stage3 \
+                                --channel-reduction squeeze_mean
+```
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/17425982/198522004-c5782807-166a-45f3-96e3-7e6df5dc70ac.png" width="800" alt="image"/>
+</div>
+
+(4) 利用 `--topk 3 --arrangement 2 2` 参数选择多通道特征图中激活度最高的 3 个通道并采用 `2x2` 布局显示, 用户可以通过 `arrangement` 参数选择自己想要的布局,特征图将自动布局,先按每个层中的 `top3` 特征图按 `2x2` 的格式布局,再将每个层按 `2x2` 布局:
+
+```shell
+python demo/featmap_vis_demo.py demo/dog.jpg \
+                                configs/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py \
+                                yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth \
+                                --target-layers backbone.stage3 backbone.stage4 \
+                                --channel-reduction None \
+                                --topk 3 \
+                                --arrangement 2 2
+```
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/17425982/198522489-8adee6ae-9915-4e9d-bf50-167b8a12c275.png" width="800" alt="image"/>
+</div>
+
+(5) 存储绘制后的图片,在绘制完成后,可以选择本地窗口显示,也可以存储到本地,只需要加入参数 `--out-file xxx.jpg`:
+
+```shell
+python demo/featmap_vis_demo.py demo/dog.jpg \
+                                configs/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py \
+                                yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth \
+                                --target-layers backbone \
+                                --channel-reduction select_max \
+                                --out-file featmap_backbone.jpg
+```
+
+## Grad-Based 和 Grad-Free CAM 可视化
+
+目标检测 CAM 可视化相比于分类 CAM 复杂很多且差异很大。本文只是简要说明用法,后续会单独开文档详细描述实现原理和注意事项。
+
+你可以调用 `demo/boxmap_vis_demo.py` 来简单快捷地得到 Box 级别的 AM 可视化结果,目前已经支持 `YOLOv5/YOLOv6/YOLOX/RTMDet`。
+
+以 YOLOv5 为例,和特征图可视化绘制一样,你需要先修改 `test_pipeline`,否则会出现特征图和原图不对齐问题。
+
+旧的 `test_pipeline` 为:
+
+```python
+test_pipeline = [
+    dict(
+        type='LoadImageFromFile',
+        backend_args=_base_.backend_args),
+    dict(type='YOLOv5KeepRatioResize', scale=img_scale),
+    dict(
+        type='LetterResize',
+        scale=img_scale,
+        allow_scale_up=False,
+        pad_val=dict(img=114)),
+    dict(type='LoadAnnotations', with_bbox=True, _scope_='mmdet'),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                   'scale_factor', 'pad_param'))
+]
+```
+
+修改为如下配置:
+
+```python
+test_pipeline = [
+    dict(
+        type='LoadImageFromFile',
+        backend_args=_base_.backend_args),
+    dict(type='mmdet.Resize', scale=img_scale, keep_ratio=False), # 这里将 LetterResize 修改成 mmdet.Resize
+    dict(type='LoadAnnotations', with_bbox=True, _scope_='mmdet'),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                   'scale_factor'))
+]
+```
+
+(1) 使用 `GradCAM` 方法可视化 neck 模块的最后一个输出层的 AM 图
+
+```shell
+python demo/boxam_vis_demo.py \
+        demo/dog.jpg \
+        configs/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py \
+        yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth
+
+```
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/17425982/203775584-c4aebf11-4ff8-4530-85fe-7dda897e95a8.jpg" width="800" alt="image"/>
+</div>
+
+相对应的特征图 AM 图如下:
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/17425982/203774801-1555bcfb-a8f9-4688-8ed6-982d6ad38e1d.jpg" width="800" alt="image"/>
+</div>
+
+可以看出 `GradCAM` 效果可以突出 box 级别的 AM 信息。
+
+你可以通过 `--topk` 参数选择仅仅可视化预测分值最高的前几个预测框
+
+```shell
+python demo/boxam_vis_demo.py \
+        demo/dog.jpg \
+        configs/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py \
+        yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth \
+        --topk 2
+```
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/17425982/203778700-3165aa72-ecaf-40cc-b470-6911646e6046.jpg" width="800" alt="image"/>
+</div>
+
+(2) 使用 `AblationCAM` 方法可视化 neck 模块的最后一个输出层的 AM 图
+
+```shell
+python demo/boxam_vis_demo.py \
+        demo/dog.jpg \
+        configs/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py \
+        yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth \
+        --method ablationcam
+```
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/17425982/203776978-b5a9b383-93b4-4b35-9e6a-7cac684b372c.jpg" width="800" alt="image"/>
+</div>
+
+由于 `AblationCAM` 是通过每个通道对分值的贡献程度来加权,因此无法实现类似 `GradCAM` 的仅仅可视化 box 级别的 AM 信息, 但是你可以使用 `--norm-in-bbox` 来仅仅显示 bbox 内部 AM
+
+```shell
+python demo/boxam_vis_demo.py \
+        demo/dog.jpg \
+        configs/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py \
+        yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth \
+        --method ablationcam \
+        --norm-in-bbox
+```
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/17425982/203777566-7c74e82f-b477-488e-958f-91e1d10833b9.jpg" width="800" alt="image"/>
+</div>
+
+## 可视化 COCO 标签
+
+脚本 `tools/analysis_tools/browse_coco_json.py` 能够使用可视化显示 COCO 标签在图片的情况。
+
+```shell
+python tools/analysis_tools/browse_coco_json.py [--data-root ${DATA_ROOT}] \
+                                                [--img-dir ${IMG_DIR}] \
+                                                [--ann-file ${ANN_FILE}] \
+                                                [--wait-time ${WAIT_TIME}] \
+                                                [--disp-all] [--category-names CATEGORY_NAMES [CATEGORY_NAMES ...]] \
+                                                [--shuffle]
+```
+
+其中,如果图片、标签都在同一个文件夹下的话,可以指定 `--data-root` 到该文件夹,然后 `--img-dir` 和 `--ann-file` 指定该文件夹的相对路径,代码会自动拼接。
+如果图片、标签文件不在同一个文件夹下的话,则无需指定 `--data-root` ,直接指定绝对路径的 `--img-dir` 和 `--ann-file` 即可。
+
+例子:
+
+1. 查看 `COCO` 全部类别,同时展示 `bbox`、`mask` 等所有类型的标注:
+
+```shell
+python tools/analysis_tools/browse_coco_json.py --data-root './data/coco' \
+                                                --img-dir 'train2017' \
+                                                --ann-file 'annotations/instances_train2017.json' \
+                                                --disp-all
+```
+
+如果图片、标签不在同一个文件夹下的话,可以使用绝对路径:
+
+```shell
+python tools/analysis_tools/browse_coco_json.py --img-dir '/dataset/image/coco/train2017' \
+                                                --ann-file '/label/instances_train2017.json' \
+                                                --disp-all
+```
+
+2. 查看 `COCO` 全部类别,同时仅展示 `bbox` 类型的标注,并打乱显示:
+
+```shell
+python tools/analysis_tools/browse_coco_json.py --data-root './data/coco' \
+                                                --img-dir 'train2017' \
+                                                --ann-file 'annotations/instances_train2017.json' \
+                                                --shuffle
+```
+
+3. 只查看 `bicycle` 和 `person` 类别,同时仅展示 `bbox` 类型的标注:
+
+```shell
+python tools/analysis_tools/browse_coco_json.py --data-root './data/coco' \
+                                                --img-dir 'train2017' \
+                                                --ann-file 'annotations/instances_train2017.json' \
+                                                --category-names 'bicycle' 'person'
+```
+
+4. 查看 `COCO` 全部类别,同时展示 `bbox`、`mask` 等所有类型的标注,并打乱显示:
+
+```shell
+python tools/analysis_tools/browse_coco_json.py --data-root './data/coco' \
+                                                --img-dir 'train2017' \
+                                                --ann-file 'annotations/instances_train2017.json' \
+                                                --disp-all \
+                                                --shuffle
+```
+
+## 可视化数据集
+
+```shell
+python tools/analysis_tools/browse_dataset.py \
+    ${CONFIG_FILE} \
+    [-o, --output-dir ${OUTPUT_DIR}] \
+    [-p, --phase ${DATASET_PHASE}] \
+    [-n, --show-number ${NUMBER_IMAGES_DISPLAY}] \
+    [-i, --show-interval ${SHOW_INTERRVAL}] \
+    [-m, --mode ${DISPLAY_MODE}] \
+    [--cfg-options ${CFG_OPTIONS}]
+```
+
+**所有参数的说明**:
+
+- `config` : 模型配置文件的路径。
+- `-o, --output-dir`: 保存图片文件夹,如果没有指定,默认为 `'./output'`。
+- **`-p, --phase`**: 可视化数据集的阶段,只能为 `['train', 'val', 'test']` 之一,默认为 `'train'`。
+- **`-n, --show-number`**: 可视化样本数量。如果没有指定,默认展示数据集的所有图片。
+- **`-m, --mode`**: 可视化的模式,只能为 `['original', 'transformed', 'pipeline']` 之一。 默认为 `'transformed'`。
+- `--cfg-options` : 对配置文件的修改,参考[学习配置文件](../../tutorials/config.md)。
+
+```shell
+`-m, --mode` 用于设置可视化的模式,默认设置为 'transformed'。
+- 如果 `--mode` 设置为 'original',则获取原始图片;
+- 如果 `--mode` 设置为 'transformed',则获取预处理后的图片;
+- 如果 `--mode` 设置为 'pipeline',则获得数据流水线所有中间过程图片。
+```
+
+**示例**:
+
+1. **'original'** 模式 :
+
+```shell
+python ./tools/analysis_tools/browse_dataset.py configs/yolov5/yolov5_balloon.py --phase val --output-dir tmp --mode original
+```
+
+- `--phase val`: 可视化验证集, 可简化为 `-p val`;
+- `--output-dir tmp`: 可视化结果保存在 "tmp" 文件夹, 可简化为 `-o tmp`;
+- `--mode original`: 可视化原图, 可简化为 `-m original`;
+- `--show-number 100`: 可视化100张图,可简化为 `-n 100`;
+
+2.**'transformed'** 模式 :
+
+```shell
+python ./tools/analysis_tools/browse_dataset.py configs/yolov5/yolov5_balloon.py
+```
+
+3.**'pipeline'** 模式 :
+
+```shell
+python ./tools/analysis_tools/browse_dataset.py configs/yolov5/yolov5_balloon.py -m pipeline
+```
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/45811724/204810831-0fbc7f1c-0951-4be1-a11c-491cf0d194f6.png" alt="Image">
+</div>
+
+## 可视化数据集分析
+
+脚本 `tools/analysis_tools/dataset_analysis.py` 能够帮助用户得到四种功能的结果图,并将图片保存到当前运行目录下的 `dataset_analysis` 文件夹中。
+
+关于该脚本的功能的说明:
+
+通过 `main()` 的数据准备,得到每个子函数所需要的数据。
+
+功能一:显示类别和 bbox 实例个数的分布图,通过子函数 `show_bbox_num` 生成。
+
+<img src="https://user-images.githubusercontent.com/90811472/200314770-4fb21626-72f2-4a4c-be5d-bf860ad830ec.jpg"/>
+
+功能二:显示类别和 bbox 实例宽、高的分布图,通过子函数 `show_bbox_wh` 生成。
+
+<img src="https://user-images.githubusercontent.com/90811472/200315007-96e8e795-992a-4c72-90fa-f6bc00b3f2c7.jpg"/>
+
+功能三:显示类别和 bbox 实例宽/高比例的分布图,通过子函数 `show_bbox_wh_ratio` 生成。
+
+<img src="https://user-images.githubusercontent.com/90811472/200315044-4bdedcf6-087a-418e-8fe8-c2d3240ceba8.jpg"/>
+
+功能四:基于面积规则下,显示类别和 bbox 实例面积的分布图,通过子函数 `show_bbox_area` 生成。
+
+<img src="https://user-images.githubusercontent.com/90811472/200315075-71680fe2-db6f-4981-963e-a035c1281fc1.jpg"/>
+
+打印列表显示,通过脚本中子函数 `show_class_list` 和 `show_data_list` 生成。
+
+<img src="https://user-images.githubusercontent.com/90811472/200315152-9d6df91c-f2d2-4bba-9f95-b790fac37b62.jpg"/>
+
+```shell
+python tools/analysis_tools/dataset_analysis.py ${CONFIG} \
+                                                [-h] \
+                                                [--val-dataset ${TYPE}] \
+                                                [--class-name ${CLASS_NAME}] \
+                                                [--area-rule ${AREA_RULE}] \
+                                                [--func ${FUNC}] \
+                                                [--out-dir ${OUT_DIR}]
+```
+
+例子:
+
+1. 使用 `config` 文件 `configs/yolov5/voc/yolov5_s-v61_fast_1xb64-50e_voc.py` 分析数据集,其中默认设置:数据加载类型为 `train_dataset` ,面积规则设置为 `[0,32,96,1e5]` ,生成包含所有类的结果图并将图片保存到当前运行目录下 `./dataset_analysis` 文件夹中:
+
+```shell
+python tools/analysis_tools/dataset_analysis.py configs/yolov5/voc/yolov5_s-v61_fast_1xb64-50e_voc.py
+```
+
+2. 使用 `config` 文件 `configs/yolov5/voc/yolov5_s-v61_fast_1xb64-50e_voc.py` 分析数据集,通过 `--val-dataset` 设置将数据加载类型由默认的 `train_dataset` 改为 `val_dataset`:
+
+```shell
+python tools/analysis_tools/dataset_analysis.py configs/yolov5/voc/yolov5_s-v61_fast_1xb64-50e_voc.py \
+                                               --val-dataset
+```
+
+3. 使用 `config` 文件 `configs/yolov5/voc/yolov5_s-v61_fast_1xb64-50e_voc.py` 分析数据集,通过 `--class-name` 设置将生成所有类改为特定类显示,以显示 `person` 为例:
+
+```shell
+python tools/analysis_tools/dataset_analysis.py configs/yolov5/voc/yolov5_s-v61_fast_1xb64-50e_voc.py \
+                                               --class-name person
+```
+
+4. 使用 `config` 文件 `configs/yolov5/voc/yolov5_s-v61_fast_1xb64-50e_voc.py` 分析数据集,通过 `--area-rule` 重新定义面积规则,以 `30 70 125` 为例,面积规则变为 `[0,30,70,125,1e5]`:
+
+```shell
+python tools/analysis_tools/dataset_analysis.py configs/yolov5/voc/yolov5_s-v61_fast_1xb64-50e_voc.py \
+                                               --area-rule 30 70 125
+```
+
+5. 使用 `config` 文件 `configs/yolov5/voc/yolov5_s-v61_fast_1xb64-50e_voc.py` 分析数据集,通过 `--func` 设置,将显示四个功能效果图改为只显示 `功能一` 为例:
+
+```shell
+python tools/analysis_tools/dataset_analysis.py configs/yolov5/voc/yolov5_s-v61_fast_1xb64-50e_voc.py \
+                                               --func show_bbox_num
+```
+
+6. 使用 `config` 文件 `configs/yolov5/voc/yolov5_s-v61_fast_1xb64-50e_voc.py` 分析数据集,通过 `--out-dir` 设置修改图片保存地址,以 `work_dirs/dataset_analysis` 地址为例:
+
+```shell
+python tools/analysis_tools/dataset_analysis.py configs/yolov5/voc/yolov5_s-v61_fast_1xb64-50e_voc.py \
+                                               --out-dir work_dirs/dataset_analysis
+```
+
+## 优化器参数策略可视化
+
+`tools/analysis_tools/vis_scheduler.py` 旨在帮助用户检查优化器的超参数调度器(无需训练),支持学习率(learning rate)、动量(momentum)和权值衰减(weight decay)。
+
+```shell
+python tools/analysis_tools/vis_scheduler.py \
+    ${CONFIG_FILE} \
+    [-p, --parameter ${PARAMETER_NAME}] \
+    [-d, --dataset-size ${DATASET_SIZE}] \
+    [-n, --ngpus ${NUM_GPUs}] \
+    [-o, --out-dir ${OUT_DIR}] \
+    [--title ${TITLE}] \
+    [--style ${STYLE}] \
+    [--window-size ${WINDOW_SIZE}] \
+    [--cfg-options]
+```
+
+**所有参数的说明**:
+
+- `config` : 模型配置文件的路径。
+- **`-p, parameter`**: 可视化参数名,只能为 `["lr", "momentum", "wd"]` 之一, 默认为 `"lr"`.
+- **`-d, --dataset-size`**: 数据集的大小。如果指定,`DATASETS.build` 将被跳过并使用这个数值作为数据集大小,默认使用 `DATASETS.build` 所得数据集的大小。
+- **`-n, --ngpus`**: 使用 GPU 的数量, 默认为1。
+- **`-o, --out-dir`**: 保存的可视化图片的文件夹路径,默认不保存。
+- `--title`: 可视化图片的标题,默认为配置文件名。
+- `--style`: 可视化图片的风格,默认为 `whitegrid`。
+- `--window-size`: 可视化窗口大小,如果没有指定,默认为 `12*7`。如果需要指定,按照格式 `'W*H'`。
+- `--cfg-options`: 对配置文件的修改,参考[学习配置文件](../tutorials/config.md)。
+
+```{note}
+部分数据集在解析标注阶段比较耗时,推荐直接将 `-d, dataset-size` 指定数据集的大小,以节约时间。
+```
+
+你可以使用如下命令来绘制配置文件 `configs/rtmdet/rtmdet_s_syncbn_fast_8xb32-300e_coco.py` 将会使用的学习率变化曲线:
+
+```shell
+python tools/analysis_tools/vis_scheduler.py \
+    configs/rtmdet/rtmdet_s_syncbn_fast_8xb32-300e_coco.py \
+    --dataset-size 118287 \
+    --ngpus 8 \
+    --out-dir ./output
+```
+
+<div align=center><img src="https://user-images.githubusercontent.com/27466624/213091635-d322d2b3-6e28-4755-b871-ef0a89a67a6b.jpg" style=" width: auto; height: 40%; "></div>
+
+## 大图推理 (TODO)
diff --git a/mmdetection_practice/third_party/mmyolo/docs/zh_cn/stat.py b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/stat.py
new file mode 100755
index 0000000..4450554
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/stat.py
@@ -0,0 +1,66 @@
+#!/usr/bin/env python
+import functools as func
+import glob
+import os.path as osp
+import re
+
+import numpy as np
+
+url_prefix = 'https://github.com/open-mmlab/mmyolo/blob/main/'
+
+files = sorted(glob.glob('../configs/*/README.md'))
+
+stats = []
+titles = []
+num_ckpts = 0
+
+for f in files:
+    url = osp.dirname(f.replace('../', url_prefix))
+
+    with open(f) as content_file:
+        content = content_file.read()
+
+    title = content.split('\n')[0].replace('# ', '').strip()
+    ckpts = {
+        x.lower().strip()
+        for x in re.findall(r'\[model\]\((https?.*)\)', content)
+    }
+
+    if len(ckpts) == 0:
+        continue
+
+    _papertype = [x for x in re.findall(r'\[([A-Z]+)\]', content)]
+    assert len(_papertype) > 0
+    papertype = _papertype[0]
+
+    paper = {(papertype, title)}
+
+    titles.append(title)
+    num_ckpts += len(ckpts)
+
+    statsmsg = f"""
+\t* [{papertype}] [{title}]({url}) ({len(ckpts)} ckpts)
+"""
+    stats.append((paper, ckpts, statsmsg))
+
+allpapers = func.reduce(lambda a, b: a.union(b), [p for p, _, _ in stats])
+msglist = '\n'.join(x for _, _, x in stats)
+
+papertypes, papercounts = np.unique([t for t, _ in allpapers],
+                                    return_counts=True)
+countstr = '\n'.join(
+    [f'   - {t}: {c}' for t, c in zip(papertypes, papercounts)])
+
+modelzoo = f"""
+# Model Zoo Statistics
+
+* Number of papers: {len(set(titles))}
+{countstr}
+
+* Number of checkpoints: {num_ckpts}
+
+{msglist}
+"""
+
+with open('modelzoo_statistics.md', 'w') as f:
+    f.write(modelzoo)
diff --git a/mmdetection_practice/third_party/mmyolo/docs/zh_cn/switch_language.md b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/switch_language.md
new file mode 100644
index 0000000..57b71eb
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/switch_language.md
@@ -0,0 +1,3 @@
+## <a href='https://mmyolo.readthedocs.io/en/latest/'>English</a>
+
+## <a href='https://mmyolo.readthedocs.io/zh_CN/latest/'>简体中文</a>
diff --git a/mmdetection_practice/third_party/mmyolo/docs/zh_cn/tutorials/config.md b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/tutorials/config.md
new file mode 100644
index 0000000..d43a4fc
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/tutorials/config.md
@@ -0,0 +1,553 @@
+# 学习 YOLOv5 配置文件
+
+MMYOLO 和其他 OpenMMLab 仓库使用 [MMEngine 的配置文件系统](https://mmengine.readthedocs.io/zh_cn/latest/tutorials/config.md)。 配置文件使用了模块化和继承设计,以便于进行各类实验。
+
+## 配置文件的内容
+
+MMYOLO 采用模块化设计,所有功能的模块都可以通过配置文件进行配置。 以 [yolov5_s-v61_syncbn_8xb16-300e_coco.py](https://github.com/open-mmlab/mmyolo/blob/main/configs/yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py) 为例,我们将根据不同的功能模块介绍配置文件中的各个字段:
+
+### 重要参数
+
+如下参数是修改训练配置时经常需要修改的参数。例如缩放因子 `deepen_factor` 和 `widen_factor`,MMYOLO 中的网络基本都使用它们来控制模型的大小。所以我们推荐在配置文件中单独定义这些参数。
+
+```python
+img_scale = (640, 640)            # 高度,宽度
+deepen_factor = 0.33              # 控制网络结构深度的缩放因子,YOLOv5-s 为 0.33
+widen_factor = 0.5                # 控制网络结构宽度的缩放因子,YOLOv5-s 为 0.5
+max_epochs = 300                  # 最大训练轮次 300 轮
+save_epoch_intervals = 10         # 验证间隔,每 10 个 epoch 验证一次
+train_batch_size_per_gpu = 16     # 训练时单个 GPU 的 Batch size
+train_num_workers = 8             # 训练时单个 GPU 分配的数据加载线程数
+val_batch_size_per_gpu = 1        # 验证时单个 GPU 的 Batch size
+val_num_workers = 2               # 验证时单个 GPU 分配的数据加载线程数
+```
+
+### 模型配置
+
+在 MMYOLO 的配置中,我们使用 `model` 字段来配置检测算法的组件。 除了 `backbone`、`neck` 等神经网络组件外,还需要 `data_preprocessor`、`train_cfg` 和 `test_cfg`。 `data_preprocessor` 负责对 dataloader 输出的每一批数据进行预处理。 模型配置中的 `train_cfg` 和 `test_cfg` 用于设置训练和测试组件的超参数。
+
+```python
+anchors = [[(10, 13), (16, 30), (33, 23)], # 多尺度的先验框基本尺寸
+           [(30, 61), (62, 45), (59, 119)],
+           [(116, 90), (156, 198), (373, 326)]]
+strides = [8, 16, 32] # 先验框生成器的步幅
+
+model = dict(
+    type='YOLODetector', #检测器名
+    data_preprocessor=dict(  # 数据预处理器的配置,通常包括图像归一化和 padding
+        type='mmdet.DetDataPreprocessor',  # 数据预处理器的类型,还可以选择 'YOLOv5DetDataPreprocessor' 训练速度更快
+        mean=[0., 0., 0.],  # 用于预训练骨干网络的图像归一化通道均值,按 R、G、B 排序
+        std=[255., 255., 255.], # 用于预训练骨干网络的图像归一化通道标准差,按 R、G、B 排序
+        bgr_to_rgb=True),  # 是否将图像通道从 BGR 转为 RGB
+    backbone=dict(  # 主干网络的配置文件
+        type='YOLOv5CSPDarknet',  # 主干网络的类别,目前可选用 'YOLOv5CSPDarknet', 'YOLOv6EfficientRep', 'YOLOXCSPDarknet' 3种
+        deepen_factor=deepen_factor, # 控制网络结构深度的缩放因子
+        widen_factor=widen_factor, # 控制网络结构宽度的缩放因子
+        norm_cfg=dict(type='BN', momentum=0.03, eps=0.001), # 归一化层(norm layer)的配置项
+        act_cfg=dict(type='SiLU', inplace=True)), # 激活函数(activation function)的配置项
+    neck=dict(
+        type='YOLOv5PAFPN',  # 检测器的 neck 是 YOLOv5FPN,我们同样支持 'YOLOv6RepPAFPN', 'YOLOXPAFPN'
+        deepen_factor=deepen_factor, # 控制网络结构深度的缩放因子
+        widen_factor=widen_factor, # 控制网络结构宽度的缩放因子
+        in_channels=[256, 512, 1024], # 输入通道数,与 Backbone 的输出通道一致
+        out_channels=[256, 512, 1024], # 输出通道数,与 Head 的输入通道一致
+        num_csp_blocks=3, # CSPLayer 中 bottlenecks 的数量
+        norm_cfg=dict(type='BN', momentum=0.03, eps=0.001), # 归一化层(norm layer)的配置项
+        act_cfg=dict(type='SiLU', inplace=True)), # 激活函数(activation function)的配置项
+    bbox_head=dict(
+        type='YOLOv5Head', # bbox_head 的类型是 'YOLOv5Head', 我们目前也支持 'YOLOv6Head', 'YOLOXHead'
+        head_module=dict(
+            type='YOLOv5HeadModule', # head_module 的类型是 'YOLOv5HeadModule', 我们目前也支持 'YOLOv6HeadModule', 'YOLOXHeadModule'
+            num_classes=80, # 分类的类别数量
+            in_channels=[256, 512, 1024], # 输入通道数,与 Neck 的输出通道一致
+            widen_factor=widen_factor, # 控制网络结构宽度的缩放因子
+            featmap_strides=[8, 16, 32], # 多尺度特征图的步幅
+            num_base_priors=3), # 在一个点上,先验框的数量
+        prior_generator=dict( # 先验框(prior)生成器的配置
+            type='mmdet.YOLOAnchorGenerator', # 先验框生成器的类型是 mmdet 中的 'YOLOAnchorGenerator'
+            base_sizes=anchors, # 多尺度的先验框基本尺寸
+            strides=strides), # 先验框生成器的步幅, 与 FPN 特征步幅一致。如果未设置 base_sizes,则当前步幅值将被视为 base_sizes。
+    ),
+    test_cfg=dict(
+        multi_label=True, # 对于多类别预测来说是否考虑多标签,默认设置为 True
+        nms_pre=30000,  # NMS 前保留的最大检测框数目
+        score_thr=0.001, # 过滤类别的分值,低于 score_thr 的检测框当做背景处理
+        nms=dict(type='nms', # NMS 的类型
+                 iou_threshold=0.65), # NMS 的阈值
+        max_per_img=300)) # 每张图像 NMS 后保留的最大检测框数目
+```
+
+### 数据集和评测器配置
+
+在使用 [执行器](https://mmengine.readthedocs.io/zh_CN/latest/tutorials/runner.html) 进行训练、测试、验证时,我们需要配置 [Dataloader](https://pytorch.org/docs/stable/data.html?highlight=data%20loader#torch.utils.data.DataLoader) 。构建数据 dataloader 需要设置数据集(dataset)和数据处理流程(data pipeline)。 由于这部分的配置较为复杂,我们使用中间变量来简化 dataloader 配置的编写。由于 MMYOLO 中各类轻量目标检测算法使用了更加复杂的数据增强方法,因此会比 MMDetection 中的其他模型拥有更多样的数据集配置。
+
+YOLOv5 的训练与测试的数据流存在一定差异,这里我们分别进行介绍。
+
+```python
+dataset_type = 'CocoDataset'  # 数据集类型,这将被用来定义数据集
+data_root = 'data/coco/'  # 数据的根路径
+
+pre_transform = [ # 训练数据读取流程
+    dict(
+        type='LoadImageFromFile'), # 第 1 个流程,从文件路径里加载图像
+    dict(type='LoadAnnotations', # 第 2 个流程,对于当前图像,加载它的注释信息
+         with_bbox=True) # 是否使用标注框(bounding box),目标检测需要设置为 True
+]
+
+albu_train_transforms = [		# YOLOv5-v6.1 仓库中,引入了 Albumentation 代码库进行图像的数据增广, 请确保其版本为 1.0.+
+    dict(type='Blur', p=0.01),       # 图像模糊,模糊概率 0.01
+    dict(type='MedianBlur', p=0.01), # 均值模糊,模糊概率 0.01
+    dict(type='ToGray', p=0.01),	 # 随机转换为灰度图像,转灰度概率 0.01
+    dict(type='CLAHE', p=0.01)		 # CLAHE(限制对比度自适应直方图均衡化) 图像增强方法,直方图均衡化概率 0.01
+]
+train_pipeline = [				# 训练数据处理流程
+    *pre_transform,				# 引入前述定义的训练数据读取流程
+    dict(
+        type='Mosaic',          # Mosaic 数据增强方法
+        img_scale=img_scale,    # Mosaic 数据增强后的图像尺寸
+        pad_val=114.0,          # 空区域填充像素值
+        pre_transform=pre_transform), # 之前创建的 pre_transform 训练数据读取流程
+    dict(
+        type='YOLOv5RandomAffine',	    # YOLOv5 的随机仿射变换
+        max_rotate_degree=0.0,          # 最大旋转角度
+        max_shear_degree=0.0,           # 最大错切角度
+        scaling_ratio_range=(0.5, 1.5), # 图像缩放系数的范围
+        border=(-img_scale[0] // 2, -img_scale[1] // 2), # 从输入图像的高度和宽度两侧调整输出形状的距离
+        border_val=(114, 114, 114)), # 边界区域填充像素值
+    dict(
+        type='mmdet.Albu',			# mmdet 中的 Albumentation 数据增强
+        transforms=albu_train_transforms, # 之前创建的 albu_train_transforms 数据增强流程
+        bbox_params=dict(
+            type='BboxParams',
+            format='pascal_voc',
+            label_fields=['gt_bboxes_labels', 'gt_ignore_flags']),
+        keymap={
+            'img': 'image',
+            'gt_bboxes': 'bboxes'
+        }),
+    dict(type='YOLOv5HSVRandomAug'),            # HSV通道随机增强
+    dict(type='mmdet.RandomFlip', prob=0.5),	# 随机翻转,翻转概率 0.5
+    dict(
+        type='mmdet.PackDetInputs',				# 将数据转换为检测器输入格式的流程
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                   'flip_direction'))
+]
+train_dataloader = dict( # 训练 dataloader 配置
+    batch_size=train_batch_size_per_gpu, # 训练时单个 GPU 的 Batch size
+    num_workers=train_num_workers, # 训练时单个 GPU 分配的数据加载线程数
+    persistent_workers=True, # 如果设置为 True,dataloader 在迭代完一轮之后不会关闭数据读取的子进程,可以加速训练
+    pin_memory=True, # 开启锁页内存,节省 CPU 内存拷贝时间
+    sampler=dict( # 训练数据的采样器
+        type='DefaultSampler', # 默认的采样器,同时支持分布式和非分布式训练。请参考 https://github.com/open-mmlab/mmengine/blob/main/mmengine/dataset/sampler.py
+        shuffle=True), # 随机打乱每个轮次训练数据的顺序
+    dataset=dict( # 训练数据集的配置
+        type=dataset_type,
+        data_root=data_root,
+        ann_file='annotations/instances_train2017.json', # 标注文件路径
+        data_prefix=dict(img='train2017/'), # 图像路径前缀
+        filter_cfg=dict(filter_empty_gt=False, min_size=32), # 图像和标注的过滤配置
+        pipeline=train_pipeline)) # 这是由之前创建的 train_pipeline 定义的数据处理流程
+```
+
+YOLOv5 测试阶段采用 [Letter Resize](https://github.com/open-mmlab/mmyolo/blob/main/mmyolo/datasets/transforms/transforms.py#L116) 的方法来将所有的测试图像统一到相同尺度,进而有效保留了图像的长宽比。因此我们在验证和评测时,都采用相同的数据流进行推理。
+
+```python
+test_pipeline = [ # 测试数据处理流程
+    dict(
+        type='LoadImageFromFile'), # 第 1 个流程,从文件路径里加载图像
+    dict(type='YOLOv5KeepRatioResize', # 第 2 个流程,保持长宽比的图像大小缩放
+         scale=img_scale), # 图像缩放的目标尺寸
+    dict(
+        type='LetterResize', # 第 3 个流程,满足多种步幅要求的图像大小缩放
+        scale=img_scale, # 图像缩放的目标尺寸
+        allow_scale_up=False, # 当 ratio > 1 时,是否允许放大图像,
+        pad_val=dict(img=114)), # 空区域填充像素值
+    dict(type='LoadAnnotations', with_bbox=True), # 第 4 个流程,对于当前图像,加载它的注释信息
+    dict(
+        type='mmdet.PackDetInputs', # 将数据转换为检测器输入格式的流程
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                   'scale_factor', 'pad_param'))
+]
+
+val_dataloader = dict(
+    batch_size=val_batch_size_per_gpu, # 验证时单个 GPU 的 Batch size
+    num_workers=val_num_workers, # 验证时单个 GPU 分配的数据加载线程数
+    persistent_workers=True, # 如果设置为 True,dataloader 在迭代完一轮之后不会关闭数据读取的子进程,可以加速训练
+    pin_memory=True, # 开启锁页内存,节省 CPU 内存拷贝时间
+    drop_last=False, # 是否丢弃最后未能组成一个批次的数据
+    sampler=dict(
+        type='DefaultSampler', # 默认的采样器,同时支持分布式和非分布式训练
+        shuffle=False), # 验证和测试时不打乱数据顺序
+    dataset=dict(
+        type=dataset_type,
+        data_root=data_root,
+        test_mode=True, # 开启测试模式,避免数据集过滤图像和标注
+        data_prefix=dict(img='val2017/'), # 图像路径前缀
+        ann_file='annotations/instances_val2017.json', # 标注文件路径
+        pipeline=test_pipeline, # 这是由之前创建的 test_pipeline 定义的数据处理流程
+        batch_shapes_cfg=dict(  # batch shapes 配置
+            type='BatchShapePolicy', # 确保在 batch 推理过程中同一个 batch 内的图像 pad 像素最少,不要求整个验证过程中所有 batch 的图像尺度一样
+            batch_size=val_batch_size_per_gpu, # batch shapes 策略的 batch size,等于验证时单个 GPU 的 Batch size
+            img_size=img_scale[0], # 图像的尺寸
+            size_divisor=32, # padding 后的图像的大小应该可以被 pad_size_divisor 整除
+            extra_pad_ratio=0.5))) # 额外需要 pad 的像素比例
+
+test_dataloader = val_dataloader
+```
+
+[评测器](https://mmengine.readthedocs.io/zh_CN/latest/tutorials/evaluation.html) 用于计算训练模型在验证和测试数据集上的指标。评测器的配置由一个或一组评价指标(Metric)配置组成:
+
+```python
+val_evaluator = dict(  # 验证过程使用的评测器
+    type='mmdet.CocoMetric',  # 用于评估检测的 AR、AP 和 mAP 的 coco 评价指标
+    proposal_nums=(100, 1, 10),	# 用于评估检测任务时,选取的Proposal数量
+    ann_file=data_root + 'annotations/instances_val2017.json',  # 标注文件路径
+    metric='bbox',  # 需要计算的评价指标,`bbox` 用于检测
+)
+test_evaluator = val_evaluator  # 测试过程使用的评测器
+```
+
+由于测试数据集没有标注文件,因此 MMYOLO 中的 `test_dataloader` 和 `test_evaluator` 配置通常等于 `val`。 如果要保存在测试数据集上的检测结果,则可以像这样编写配置:
+
+```python
+# 在测试集上推理,
+# 并将检测结果转换格式以用于提交结果
+test_dataloader = dict(
+    batch_size=1,
+    num_workers=2,
+    persistent_workers=True,
+    drop_last=False,
+    sampler=dict(type='DefaultSampler', shuffle=False),
+    dataset=dict(
+        type=dataset_type,
+        data_root=data_root,
+        ann_file=data_root + 'annotations/image_info_test-dev2017.json',
+        data_prefix=dict(img='test2017/'),
+        test_mode=True,
+        pipeline=test_pipeline))
+test_evaluator = dict(
+    type='mmdet.CocoMetric',
+    ann_file=data_root + 'annotations/image_info_test-dev2017.json',
+    metric='bbox',
+    format_only=True,  # 只将模型输出转换为coco的 JSON 格式并保存
+    outfile_prefix='./work_dirs/coco_detection/test')  # 要保存的 JSON 文件的前缀
+```
+
+### 训练和测试的配置
+
+MMEngine 的 Runner 使用 Loop 来控制训练,验证和测试过程。
+用户可以使用这些字段设置最大训练轮次和验证间隔。
+
+```python
+max_epochs = 300 # 最大训练轮次 300 轮
+save_epoch_intervals = 10 # 验证间隔,每 10 轮验证一次
+
+train_cfg = dict(
+    type='EpochBasedTrainLoop',  # 训练循环的类型,请参考 https://github.com/open-mmlab/mmengine/blob/main/mmengine/runner/loops.py
+    max_epochs=max_epochs,  # 最大训练轮次 300 轮
+    val_interval=save_epoch_intervals)  # 验证间隔,每 10 个 epoch 验证一次
+val_cfg = dict(type='ValLoop')  # 验证循环的类型
+test_cfg = dict(type='TestLoop')  # 测试循环的类型
+```
+
+MMEngine 也支持动态评估间隔,例如你可以在前面 280 epoch 训练阶段中,每间隔 10 个 epoch 验证一次,到最后 20 epoch 训练中每隔 1 个 epoch 验证一次,则配置写法为:
+
+```python
+max_epochs = 300 # 最大训练轮次 300 轮
+save_epoch_intervals = 10 # 验证间隔,每 10 轮验证一次
+
+train_cfg = dict(
+    type='EpochBasedTrainLoop',  # 训练循环的类型,请参考 https://github.com/open-mmlab/mmengine/blob/main/mmengine/runner/loops.py
+    max_epochs=max_epochs,  # 最大训练轮次 300 轮
+    val_interval=save_epoch_intervals,  # 验证间隔,每 10 个 epoch 验证一次
+    dynamic_intervals=[(280, 1)]) # 到 280 epoch 开始切换为间隔 1 的评估方式
+val_cfg = dict(type='ValLoop')  # 验证循环的类型
+test_cfg = dict(type='TestLoop')  # 测试循环的类型
+```
+
+### 优化相关配置
+
+`optim_wrapper` 是配置优化相关设置的字段。优化器封装(OptimWrapper)不仅提供了优化器的功能,还支持梯度裁剪、混合精度训练等功能。更多内容请看[优化器封装教程](https://mmengine.readthedocs.io/zh_CN/latest/tutorials/optim_wrapper.html).
+
+```python
+optim_wrapper = dict(  # 优化器封装的配置
+    type='OptimWrapper',  # 优化器封装的类型。可以切换至 AmpOptimWrapper 来启用混合精度训练
+    optimizer=dict(  # 优化器配置。支持 PyTorch 的各种优化器。请参考 https://pytorch.org/docs/stable/optim.html#algorithms
+        type='SGD',  # 随机梯度下降优化器
+        lr=0.01,  # 基础学习率
+        momentum=0.937, # 带动量的随机梯度下降
+        weight_decay=0.0005, # 权重衰减
+        nesterov=True, # 开启Nesterov momentum,公式详见 http://www.cs.toronto.edu/~hinton/absps/momentum.pdf
+        batch_size_per_gpu=train_batch_size_per_gpu),  # 该选项实现了自动权重衰减系数缩放
+    clip_grad=None,  # 梯度裁剪的配置,设置为 None 关闭梯度裁剪。使用方法请见 https://mmengine.readthedocs.io/zh_CN/latest/tutorials/optim_wrapper.html
+    constructor='YOLOv5OptimizerConstructor') # YOLOv5 优化器构建器
+
+```
+
+`param_scheduler` 字段用于配置参数调度器(Parameter Scheduler)来调整优化器的超参数(例如学习率和动量)。 用户可以组合多个调度器来创建所需的参数调整策略。 在[参数调度器教程](https://mmengine.readthedocs.io/zh_CN/latest/tutorials/param_scheduler.html) 和参数调度器 API 文档 中查找更多信息。在 YOLOv5 中,参数调度实现比较复杂,难以通过  `param_scheduler` 实现。所以我们采用了 `YOLOv5ParamSchedulerHook` 来实现(见下节),这样做更简单但是通用性较差。
+
+```python
+param_scheduler = None
+```
+
+### 钩子配置
+
+用户可以在训练、验证和测试循环上添加钩子,以便在运行期间插入一些操作。配置中有两种不同的钩子字段,一种是 `default_hooks`,另一种是 `custom_hooks`。
+
+`default_hooks` 是一个字典,用于配置运行时必须使用的钩子。这些钩子具有默认优先级,如果未设置,runner 将使用默认值。如果要禁用默认钩子,用户可以将其配置设置为 `None`。
+
+```python
+default_hooks = dict(
+    param_scheduler=dict(
+        type='YOLOv5ParamSchedulerHook', # MMYOLO 中默认采用 Hook 方式进行优化器超参数的调节
+        scheduler_type='linear',
+        lr_factor=0.01,
+        max_epochs=max_epochs),
+    checkpoint=dict(
+        type='CheckpointHook', # 按照给定间隔保存模型的权重的 Hook
+        interval=save_epoch_intervals, # 每 10 轮保存 1 次权重文件
+        max_keep_ckpts=3)) # 最多保存 3 个权重文件
+```
+
+`custom_hooks` 是一个列表。用户可以在这个字段中加入自定义的钩子,例如 `EMAHook`。
+
+```python
+custom_hooks = [
+    dict(
+        type='EMAHook', # 实现权重 EMA(指数移动平均) 更新的 Hook
+        ema_type='ExpMomentumEMA', # YOLO 中使用的带动量 EMA
+        momentum=0.0001, # EMA 的动量参数
+        update_buffers=True, # 是否计算模型的参数和缓冲的 running averages
+        priority=49) # 优先级略高于 NORMAL(50)
+]
+```
+
+### 运行相关配置
+
+```python
+default_scope = 'mmyolo'  # 默认的注册器域名,默认从此注册器域中寻找模块。请参考 https://mmengine.readthedocs.io/zh_CN/latest/tutorials/registry.html
+
+env_cfg = dict(
+    cudnn_benchmark=True,  # 是否启用 cudnn benchmark, 推荐单尺度训练时开启,可加速训练
+    mp_cfg=dict(  # 多进程设置
+        mp_start_method='fork',  # 使用 fork 来启动多进程。‘fork’ 通常比 ‘spawn’ 更快,但可能存在隐患。请参考 https://github.com/pytorch/pytorch/issues/1355
+        opencv_num_threads=0),  # 关闭 opencv 的多线程以避免系统超负荷
+    dist_cfg=dict(backend='nccl'),  # 分布式相关设置
+)
+
+vis_backends = [dict(type='LocalVisBackend')]  # 可视化后端,请参考 https://mmengine.readthedocs.io/zh_CN/latest/advanced_tutorials/visualization.html
+visualizer = dict(
+    type='mmdet.DetLocalVisualizer', vis_backends=vis_backends, name='visualizer')
+log_processor = dict(
+    type='LogProcessor',  # 日志处理器用于处理运行时日志
+    window_size=50,  # 日志数值的平滑窗口
+    by_epoch=True)  # 是否使用 epoch 格式的日志。需要与训练循环的类型保存一致。
+
+log_level = 'INFO'  # 日志等级
+load_from = None  # 从给定路径加载模型检查点作为预训练模型。这不会恢复训练。
+resume = False  # 是否从 `load_from` 中定义的检查点恢复。 如果 `load_from` 为 None,它将恢复 `work_dir` 中的最新检查点。
+```
+
+## 配置文件继承
+
+在 `config/_base_` 文件夹目前有运行时的默认设置(default runtime)。由 `_base_` 下的组件组成的配置,被我们称为 _原始配置(primitive)_。
+
+对于同一文件夹下的所有配置,推荐**只有一个**对应的**原始配置**文件。所有其他的配置文件都应该继承自这个**原始配置**文件。这样就能保证配置文件的最大继承深度为 3。
+
+为了便于理解,我们建议贡献者继承现有方法。例如,如果在 YOLOv5s 的基础上做了一些修改,比如修改网络深度,用户首先可以通过指定 `_base_ = ./yolov5_s-v61_syncbn_8xb16-300e_coco.py` 来集成基础的 YOLOv5 结构,然后修改配置文件中的必要参数以完成继承。
+
+如果你在构建一个与任何现有方法不共享结构的全新方法,那么可以在 `configs` 文件夹下创建一个新的例如 `yolov100` 文件夹。
+
+更多细节请参考 [MMEngine 配置文件教程](https://mmengine.readthedocs.io/zh_CN/latest/tutorials/config.html)。
+
+通过设置 `_base_` 字段,我们可以设置当前配置文件继承自哪些文件。
+
+当 `_base_` 为文件路径字符串时,表示继承一个配置文件的内容。
+
+```python
+_base_ = '../_base_/default_runtime.py'
+```
+
+当 `_base_` 是多个文件路径的列表时,表示继承多个文件。
+
+```python
+_base_ = [
+    './yolov5_s-v61_syncbn_8xb16-300e_coco.py',
+    '../_base_/default_runtime.py'
+]
+```
+
+如果需要检查配置文件,可以通过运行 `mim run mmdet print_config /PATH/TO/CONFIG` 来查看完整的配置。
+
+### 忽略基础配置文件里的部分内容
+
+有时,您也许会设置 `_delete_=True` 去忽略基础配置文件里的一些域内容。 您也许可以参照 [MMEngine 配置文件教程](https://mmengine.readthedocs.io/zh_CN/latest/tutorials/config.html) 来获得一些简单的指导。
+
+在 MMYOLO 里,例如为了改变 RTMDet 的主干网络的某些内容:
+
+```python
+model = dict(
+    type='YOLODetector',
+    data_preprocessor=dict(...),
+    backbone=dict(
+        type='CSPNeXt',
+        arch='P5',
+        expand_ratio=0.5,
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+        channel_attention=True,
+        norm_cfg=dict(type='BN'),
+        act_cfg=dict(type='SiLU', inplace=True)),
+    neck=dict(...),
+    bbox_head=dict(...))
+```
+
+如果想把 RTMDet 主干网络的 `CSPNeXt` 改成 `YOLOv6EfficientRep`,因为 `CSPNeXt` 和 `YOLOv6EfficientRep` 中有不同的字段(`channel_attention` 和 `expand_ratio`),这时候就需要使用 `_delete_=True` 将新的键去替换 `backbone` 域内所有老的键。
+
+```python
+_base_ = '../rtmdet/rtmdet_l_syncbn_8xb32-300e_coco.py'
+model = dict(
+    backbone=dict(
+        _delete_=True,
+        type='YOLOv6EfficientRep',
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+        norm_cfg=dict(type='BN', momentum=0.03, eps=0.001),
+        act_cfg=dict(type='ReLU', inplace=True)),
+    neck=dict(...),
+    bbox_head=dict(...))
+```
+
+### 使用配置文件里的中间变量
+
+配置文件里会使用一些中间变量,例如数据集里的 `train_pipeline`/`test_pipeline`。我们在定义新的 `train_pipeline`/`test_pipeline` 之后,需要将它们传递到 `data` 里。例如,我们想在训练或测试时,改变 YOLOv5 网络的 `img_scale` 训练尺度并在训练时添加 `YOLOv5MixUp` 数据增强,`img_scale/train_pipeline/test_pipeline` 是我们想要修改的中间变量。
+
+**注**:使用 `YOLOv5MixUp` 数据增强时,需要将 `YOLOv5MixUp` 之前的训练数据处理流程定义在其 `pre_transform`  中。详细过程和图解可参见 [YOLOv5 原理和实现全解析](../recommended_topics/algorithm_descriptions/yolov5_description.md)。
+
+```python
+_base_ = './yolov5_s-v61_syncbn_8xb16-300e_coco.py'
+
+img_scale = (1280, 1280)  # 高度,宽度
+affine_scale = 0.9        # 仿射变换尺度
+
+mosaic_affine_pipeline = [
+    dict(
+        type='Mosaic',
+        img_scale=img_scale,
+        pad_val=114.0,
+        pre_transform=pre_transform),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        scaling_ratio_range=(1 - affine_scale, 1 + affine_scale),
+        border=(-img_scale[0] // 2, -img_scale[1] // 2),
+        border_val=(114, 114, 114))
+]
+
+train_pipeline = [
+    *pre_transform, *mosaic_affine_pipeline,
+    dict(
+        type='YOLOv5MixUp',	# YOLOv5 的 MixUp (图像混合) 数据增强
+        prob=0.1, # MixUp 概率
+        pre_transform=[*pre_transform,*mosaic_affine_pipeline]), # MixUp 之前的训练数据处理流程,包含 数据预处理流程、 'Mosaic' 和 'YOLOv5RandomAffine'
+    dict(
+        type='mmdet.Albu',
+        transforms=albu_train_transforms,
+        bbox_params=dict(
+            type='BboxParams',
+            format='pascal_voc',
+            label_fields=['gt_bboxes_labels', 'gt_ignore_flags']),
+        keymap={
+            'img': 'image',
+            'gt_bboxes': 'bboxes'
+        }),
+    dict(type='YOLOv5HSVRandomAug'),
+    dict(type='mmdet.RandomFlip', prob=0.5),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                   'flip_direction'))
+]
+
+test_pipeline = [
+    dict(
+        type='LoadImageFromFile'),
+    dict(type='YOLOv5KeepRatioResize', scale=img_scale),
+    dict(
+        type='LetterResize',
+        scale=img_scale,
+        allow_scale_up=False,
+        pad_val=dict(img=114)),
+    dict(type='LoadAnnotations', with_bbox=True),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                   'scale_factor', 'pad_param'))
+]
+
+train_dataloader = dict(dataset=dict(pipeline=train_pipeline))
+val_dataloader = dict(dataset=dict(pipeline=test_pipeline))
+test_dataloader = dict(dataset=dict(pipeline=test_pipeline))
+```
+
+我们首先定义新的 `train_pipeline`/`test_pipeline` 然后传递到 `data` 里。
+
+同样的,如果我们想从 `SyncBN` 切换到 `BN` 或者 `MMSyncBN`,我们需要修改配置文件里的每一个  `norm_cfg`。
+
+```python
+_base_ = './yolov5_s-v61_syncbn_8xb16-300e_coco.py'
+norm_cfg = dict(type='BN', requires_grad=True)
+model = dict(
+    backbone=dict(norm_cfg=norm_cfg),
+    neck=dict(norm_cfg=norm_cfg),
+    ...)
+```
+
+### 复用 \_base\_ 文件中的变量
+
+如果用户希望在当前配置中复用 `_base_` 文件中的变量,则可以通过使用 `{{_base_.xxx}}` 的方式来获取对应变量的拷贝。而在新版 MMEngine 中,还支持省略 `{{}}` 的写法。例如:
+
+```python
+_base_ = '../_base_/default_runtime.py'
+
+pre_transform = _base_.pre_transform # 变量 pre_transform 等于 _base_ 中定义的 pre_transform
+```
+
+## 通过脚本参数修改配置
+
+当运行 `tools/train.py` 和 `tools/test.py` 时,可以通过 `--cfg-options` 来修改配置文件。
+
+- 更新字典链中的配置
+
+  可以按照原始配置文件中的 dict 键顺序地指定配置预选项。例如,使用 `--cfg-options model.backbone.norm_eval=False` 将模型主干网络中的所有 BN 模块都改为 `train` 模式。
+
+- 更新配置列表中的键
+
+  在配置文件里,一些字典型的配置被包含在列表中。例如,数据训练流程 `data.train.pipeline` 通常是一个列表,比如 `[dict(type='LoadImageFromFile'), ...]`。如果需要将 `'LoadImageFromFile'` 改成 `'LoadImageFromNDArray'`,需要写成下述形式:`--cfg-options data.train.pipeline.0.type=LoadImageFromNDArray`.
+
+- 更新列表或元组的值
+
+  如果要更新的值是列表或元组。例如,配置文件通常设置 `model.data_preprocessor.mean=[123.675, 116.28, 103.53]`。如果需要改变这个键,可以通过 `--cfg-options model.data_preprocessor.mean="[127,127,127]"` 来重新设置。需要注意,引号 `"` 是支持列表或元组数据类型所必需的,并且在指定值的引号内**不允许**有空格。
+
+## 配置文件名称风格
+
+我们遵循以下样式来命名配置文件。建议贡献者遵循相同的风格。
+
+```
+{algorithm name}_{model component names [component1]_[component2]_[...]}-[version id]_[norm setting]_[data preprocessor type]_{training settings}_{training dataset information}_[testing dataset information].py
+```
+
+文件名分为 8 个部分,其中 4 个必填部分、4 个可选部分。 每个部分用 `_` 连接,每个部分内的单词应该用 `-` 连接。`{}` 表示必填部分,`[]` 表示选填部分。
+
+- `{algorithm name}`:算法的名称。 它可以是检测器名称,例如 `yolov5`, `yolov6`, `yolox` 等。
+- `{component names}`:算法中使用的组件名称,如 backbone、neck 等。例如 yolov5_s代表其深度缩放因子`deepen_factor=0.33` 以及其宽度缩放因子 `widen_factor=0.5`。
+- `[version_id]` (可选):由于 YOLO 系列算法迭代速度远快于传统目标检测算法,因此采用 `version id` 来区分不同子版本之间的差异。例如 YOLOv5 的 3.0 版本采用 `Focus` 层作为第一个下采样层,而 6.0 以后的版本采用 `Conv` 层作为第一个下采样层。
+- `[norm_setting]` (可选):`bn` 表示 `Batch Normalization`, `syncbn` 表示 `Synchronized Batch Normalization`。
+- `[data preprocessor type]` (可选):`fast` 表示调用 [YOLOv5DetDataPreprocessor](https://github.com/open-mmlab/mmyolo/blob/main/mmyolo/models/data_preprocessors/data_preprocessor.py#L9) 并配合 [yolov5_collate](https://github.com/open-mmlab/mmyolo/blob/main/mmyolo/datasets/utils.py#L12) 进行数据预处理,训练速度比默认的 `mmdet.DetDataPreprocessor` 更快,但是对多任务处理的灵活性较低。
+- `{training settings}`:训练设置的信息,例如 batch 大小、数据增强、损失、参数调度方式和训练最大轮次/迭代。 例如:`8xb16-300e_coco` 表示使用 8 个 GPU 每个 GPU 16 张图,并训练 300 个 epoch。
+  缩写介绍:
+  - `{gpu x batch_per_gpu}`:GPU 数和每个 GPU 的样本数。例如 `4x4b` 是 4 个 GPU 每个 GPU 4 张图的缩写。
+  - `{schedule}`:训练方案,MMYOLO 中默认为 300 个 epoch。
+- `{training dataset information}`:训练数据集,例如 `coco`, `cityscapes`, `voc-0712`, `wider-face`, `balloon`。
+- `[testing dataset information]` (可选):测试数据集,用于训练和测试在不同数据集上的模型配置。 如果没有注明,则表示训练和测试的数据集类型相同。
diff --git a/mmdetection_practice/third_party/mmyolo/docs/zh_cn/tutorials/custom_installation.md b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/tutorials/custom_installation.md
new file mode 100644
index 0000000..d20d659
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/tutorials/custom_installation.md
@@ -0,0 +1,111 @@
+# 自定义安装
+
+## CUDA 版本
+
+在安装 PyTorch 时,你需要指定 CUDA 的版本。如果你不清楚应该选择哪一个,请遵循我们的建议。
+
+- 对于 Ampere 架构的 NVIDIA GPU,例如 GeForce 30 系列 以及 NVIDIA A100,CUDA 11 是必需的。
+- 对于更早的 NVIDIA GPU,CUDA 11 是向后兼容 (backward compatible) 的,但 CUDA 10.2 能够提供更好的兼容性,也更加轻量。
+
+请确保你的 GPU 驱动版本满足最低的版本需求,参阅 NVIDIA 官方的 [CUDA 工具箱和相应的驱动版本关系表](https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html#cuda-major-component-versions__table-cuda-toolkit-driver-versions)。
+
+```{note}
+如果按照我们的最佳实践进行安装,CUDA 运行时库就足够了,因为我们提供相关 CUDA 代码的预编译,不需要进行本地编译。
+但如果你希望从源码进行 MMCV 的编译,或是进行其他 CUDA 算子的开发,那么就必须安装完整的 CUDA 工具链,参见
+[NVIDIA 官网](https://developer.nvidia.com/cuda-downloads) ,另外还需要确保该 CUDA 工具链的版本与 PyTorch 安装时
+的配置相匹配(如用 `conda install` 安装 PyTorch 时指定的 cudatoolkit 版本)。
+```
+
+## 不使用 MIM 安装 MMEngine
+
+要使用 pip 而不是 MIM 来安装 MMEngine,请遵照 [MMEngine 安装指南](https://mmengine.readthedocs.io/en/latest/get_started/installation.html)。
+
+例如,你可以通过以下命令安装 MMEngine:
+
+```shell
+pip install "mmengine>=0.6.0"
+```
+
+## 不使用 MIM 安装 MMCV
+
+MMCV 包含 C++ 和 CUDA 扩展,因此其对 PyTorch 的依赖比较复杂。MIM 会自动解析这些 依赖,选择合适的 MMCV 预编译包,使安装更简单,但它并不是必需的。
+
+要使用 pip 而不是 MIM 来安装 MMCV,请遵照 [MMCV 安装指南](https://mmcv.readthedocs.io/zh_CN/2.x/get_started/installation.html)。
+它需要您用指定 URL 的形式手动指定对应的 PyTorch 和 CUDA 版本。
+
+例如,下述命令将会安装基于 PyTorch 1.12.x 和 CUDA 11.6 编译的 mmcv:
+
+```shell
+pip install "mmcv>=2.0.0rc4" -f https://download.openmmlab.com/mmcv/dist/cu116/torch1.12.0/index.html
+```
+
+## 在 CPU 环境中安装
+
+我们的代码能够建立在只使用 CPU 的环境(CUDA 不可用)。
+
+在 CPU 模式下,可以进行模型训练(需要 MMCV 版本 >= `2.0.0rc1`)、测试或者推理,然而以下功能将在 CPU 模式下不能使用:
+
+- Deformable Convolution
+- Modulated Deformable Convolution
+- ROI pooling
+- Deformable ROI pooling
+- CARAFE: Content-Aware ReAssembly of FEatures
+- SyncBatchNorm
+- CrissCrossAttention: Criss-Cross Attention
+- MaskedConv2d
+- Temporal Interlace Shift
+- nms_cuda
+- sigmoid_focal_loss_cuda
+- bbox_overlaps
+
+因此,如果尝试使用包含上述操作的模型进行训练/测试/推理,将会报错。下表列出了由于依赖上述算子而无法在 CPU 上运行的相关模型:
+
+|                          操作                           |                                           模型                                           |
+| :-----------------------------------------------------: | :--------------------------------------------------------------------------------------: |
+| Deformable Convolution/Modulated Deformable Convolution | DCN、Guided Anchoring、RepPoints、CentripetalNet、VFNet、CascadeRPN、NAS-FCOS、DetectoRS |
+|                      MaskedConv2d                       |                                     Guided Anchoring                                     |
+|                         CARAFE                          |                                          CARAFE                                          |
+|                      SyncBatchNorm                      |                                         ResNeSt                                          |
+
+## 在 Google Colab 中安装
+
+[Google Colab](https://colab.research.google.com/) 通常已经包含了 PyTorch 环境,因此我们只需要安装 MMEngine、MMCV、MMDetection 和 MMYOLO 即可,命令如下:
+
+**步骤 1.** 使用 [MIM](https://github.com/open-mmlab/mim) 安装 [MMEngine](https://github.com/open-mmlab/mmengine) 、 [MMCV](https://github.com/open-mmlab/mmcv) 和 [MMDetection](https://github.com/open-mmlab/mmdetection) 。
+
+```shell
+!pip3 install openmim
+!mim install "mmengine>=0.6.0"
+!mim install "mmcv>=2.0.0rc4,<2.1.0"
+!mim install "mmdet>=3.0.0,<4.0.0"
+```
+
+**步骤 2.** 使用源码安装 MMYOLO:
+
+```shell
+!git clone https://github.com/open-mmlab/mmyolo.git
+%cd mmyolo
+!pip install -e .
+```
+
+**步骤 3.** 验证安装是否成功:
+
+```python
+import mmyolo
+print(mmyolo.__version__)
+# 预期输出: 0.1.0 或其他版本号
+```
+
+```{note}
+在 Jupyter 中,感叹号 `!` 用于执行外部命令,而 `%cd` 是一个[魔术命令](https://ipython.readthedocs.io/en/stable/interactive/magics.html#magic-cd),用于切换 Python 的工作路径。
+```
+
+## 使用多个 MMYOLO 版本进行开发
+
+训练和测试的脚本已经在 `PYTHONPATH` 中进行了修改,以确保脚本使用当前目录中的 MMYOLO。
+
+要使环境中安装默认的 MMYOLO 而不是当前正在在使用的,可以删除出现在相关脚本中的如下代码:
+
+```shell
+PYTHONPATH="$(dirname $0)/..":$PYTHONPATH
+```
diff --git a/mmdetection_practice/third_party/mmyolo/docs/zh_cn/tutorials/data_flow.md b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/tutorials/data_flow.md
new file mode 100644
index 0000000..804004d
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/tutorials/data_flow.md
@@ -0,0 +1,121 @@
+# 混合类图片数据增强更新
+
+混合类图片数据增强是指类似 Mosaic 和 MixUp 一样,在运行过程中需要获取多张图片的标注信息进行融合。 在 OpenMMLab 数据增强 pipeline 中一般是获取不到数据集其他索引的。 为了实现上述功能,在 MMDetection 复现的 YOLOX 中提出了 [MultiImageMixDataset](https://github.com/open-mmlab/mmdetection/blob/master/mmdet/datasets/dataset_wrappers.py#L338) 数据集包装器的概念。
+
+`MultiImageMixDataset` 数据集包装器会传入一个包括 `Mosaic` 和 `RandAffine` 等数据增强,而 `CocoDataset` 中也需要传入一个包括图片和标注加载的 `pipeline` 。通过这种方式就可以快速的实现混合类数据增强。其配置用法如下所示:
+
+```python
+train_pipeline = [
+    dict(type='Mosaic', img_scale=img_scale, pad_val=114.0),
+    dict(
+        type='RandomAffine',
+        scaling_ratio_range=(0.1, 2),
+        border=(-img_scale[0] // 2, -img_scale[1] // 2)),
+    dict(
+        type='MixUp',
+        img_scale=img_scale,
+        ratio_range=(0.8, 1.6),
+        pad_val=114.0),
+    ...
+]
+train_dataset = dict(
+    # use MultiImageMixDataset wrapper to support mosaic and mixup
+    type='MultiImageMixDataset',
+    dataset=dict(
+        type='CocoDataset',
+        pipeline=[
+            dict(type='LoadImageFromFile'),
+            dict(type='LoadAnnotations', with_bbox=True)
+        ]),
+    pipeline=train_pipeline)
+
+```
+
+但是上述实现起来会有一个缺点:对于不熟悉 MMDetection 的用户来说,其经常会忘记 Mosaic 必须要和 `MultiImageMixDataset` 配合使用,而且这样会加大复杂度和理解难度。
+
+为了解决这个问题,在 MMYOLO 中进一步进行了简化。直接让 `pipeline` 获取到 `dataset` 对象,此时就可以将 `Mosaic` 等混合类数据增强的实现和使用随机翻转的操作一样,不再需要数据集包装器。新的配置写法为:
+
+```python
+pre_transform = [
+    dict(type='LoadImageFromFile'),
+    dict(type='LoadAnnotations', with_bbox=True)
+]
+train_pipeline = [
+    *pre_transform,
+    dict(
+        type='Mosaic',
+        img_scale=img_scale,
+        pad_val=114.0,
+        pre_transform=pre_transform),
+    dict(
+        type='mmdet.RandomAffine',
+        scaling_ratio_range=(0.1, 2),
+        border=(-img_scale[0] // 2, -img_scale[1] // 2)),
+    dict(
+        type='YOLOXMixUp',
+        img_scale=img_scale,
+        ratio_range=(0.8, 1.6),
+        pad_val=114.0,
+        pre_transform=pre_transform),
+    ...
+]
+```
+
+一个稍微复杂点的包括 MixUp 的 YOLOv5-m 配置如下所示:
+
+```python
+mosaic_affine_pipeline = [
+    dict(
+        type='Mosaic',
+        img_scale=img_scale,
+        pad_val=114.0,
+        pre_transform=pre_transform),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        scaling_ratio_range=(1 - affine_scale, 1 + affine_scale),
+        border=(-img_scale[0] // 2, -img_scale[1] // 2),
+        border_val=(114, 114, 114))
+]
+
+# enable mixup
+train_pipeline = [
+    *pre_transform, *mosaic_affine_pipeline,
+    dict(
+        type='YOLOv5MixUp',
+        prob=0.1,
+        pre_transform=[*pre_transform, *mosaic_affine_pipeline]),
+    dict(
+        type='mmdet.Albu',
+        transforms=albu_train_transforms,
+        bbox_params=dict(
+            type='BboxParams',
+            format='pascal_voc',
+            label_fields=['gt_bboxes_labels', 'gt_ignore_flags']),
+        keymap={
+            'img': 'image',
+            'gt_bboxes': 'bboxes'
+        }),
+    dict(type='YOLOv5HSVRandomAug'),
+    dict(type='mmdet.RandomFlip', prob=0.5),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                   'flip_direction'))
+]
+```
+
+其实现过程非常简单,只需要在 Dataset 中将本身对象传给 pipeline 即可,具体代码如下:
+
+```python
+def prepare_data(self, idx) -> Any:
+   """Pass the dataset to the pipeline during training to support mixed
+   data augmentation, such as Mosaic and MixUp."""
+   if self.test_mode is False:
+        data_info = self.get_data_info(idx)
+        data_info['dataset'] = self
+        return self.pipeline(data_info)
+    else:
+        return super().prepare_data(idx)
+```
diff --git a/mmdetection_practice/third_party/mmyolo/docs/zh_cn/tutorials/faq.md b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/tutorials/faq.md
new file mode 100644
index 0000000..71ee01d
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/tutorials/faq.md
@@ -0,0 +1,111 @@
+# 常见问题解答
+
+我们在这里列出了使用时的一些常见问题及其相应的解决方案。 如果您发现有一些问题被遗漏,请随时提 PR 丰富这个列表。 如果您无法在此获得帮助,请创建 [issue](https://github.com/open-mmlab/mmyolo/issues/new/choose) 提问,但是请在模板中填写所有必填信息,这有助于我们更快定位问题。
+
+## 为什么要推出 MMYOLO?
+
+为什么要推出 MMYOLO? 为何要单独开一个仓库而不是直接放到 MMDetection 中? 自从开源后,不断收到社区小伙伴们类似的疑问,答案可以归纳为以下三点:
+
+**(1) 统一运行和推理平台**
+
+目前目标检测领域出现了非常多 YOLO 的改进算法,并且非常受大家欢迎,但是这类算法基于不同框架不同后端实现,存在较大差异,缺少统一便捷的从训练到部署的公平评测流程。
+
+**(2) 协议限制**
+
+众所周知,YOLOv5 以及其衍生的 YOLOv6 和 YOLOv7 等算法都是 GPL 3.0 协议,不同于 MMDetection 的 Apache 协议。由于协议问题,无法将 MMYOLO 直接并入 MMDetection 中。
+
+**(3) 多任务支持**
+
+还有一层深远的原因: **MMYOLO 任务不局限于 MMDetection**,后续会支持更多任务例如基于 MMPose 实现关键点相关的应用,基于 MMTracking 实现追踪相关的应用,因此不太适合直接并入 MMDetection 中。
+
+## projects 文件夹是用来干什么的?
+
+projects 文件夹是 OpenMMLab 2.0 中引入的一个全新文件夹。其初衷有如下 3 点:
+
+1. 便于社区贡献。由于 OpenMMLab 系列代码库对于代码合入有一套规范严谨的流程,这不可避免的会导致算法复现周期很长,不利于社区贡献
+2. 便于快速支持新算法。算法开发周期过长同样会导致用户无法尽快体验最新算法
+3. 便于快速支持新方向和新特性。新发展方向或者一些新的特性可能和现如今代码库中的设计有些不兼容,没法快速合入到代码库中
+
+综上所述,projects 文件夹的引入主要是解决算法复现周期过长导致的新算法支持速度较慢,新特性支持较复杂等多个问题。 projects 中每个文件夹属于一个完全独立的工程,社区用户可以通过
+projects 快速支持一些在当前版本中较难支持或者想快速支持的新算法和新特性。等后续设计稳定或者代码符合合入规范,则会考虑合入到主分支中。
+
+## YOLOv5 backbone 替换为 Swin 后效果很差
+
+在 [轻松更换主干网络](../recommended_topics/replace_backbone.md) 一文中我们提供了大量替换 backbone 的教程,但是该文档只是教用户如何替换 backbone,直接训练不一定能得到比较优异的结果。原因是
+不同 backbone 所需要的训练超参是不一样的,以 Swin 和 YOLOv5 backbone 为例两者差异较大,Swin 属于 transformer 系列算法,而 YOLOv5 backbone 属于卷积系列算法,其训练的优化器、学习率以及其他超参差异较大。
+如果强行将 Swin 作为 YOLOv5 backbone 且想取得不错的效果,需要同时调整诸多参数。
+
+## MM 系列开源库中有很多组件,如何在 MMYOLO 中使用?
+
+在 OpenMMLab 2.0 中对多个 MM 系列开源库之间的模块跨库调用功能进行增强。目前在 MMYOLO 中可以在配置文件中通过 `MM 算法库 A.模块名` 来之间调用 MM 算法库 A 中已经被注册的任意模块。 具体例子可以参考
+[轻松更换主干网络](../recommended_topics/replace_backbone.md) 中使用在 MMClassification 中实现的主干网络章节,其他模块调用也是相同的用法。
+
+## MMYOLO 中是否可以加入纯背景图片进行训练?
+
+将纯背景图片加入训练大部分情况可以抑制误报率,是否将纯背景图片加入训练功能已经大部分数据集上支持了。以 `YOLOv5CocoDataset` 为例,核心控制参数是 `train_dataloader.dataset.filter_cfg.filter_empty_gt`,如果 `filter_empty_gt` 为 True 表示将纯背景图片过滤掉不加入训练,
+反之将纯背景图片加入到训练中。 目前 MMYOLO 中大部分算法都是默认将纯背景图片加入训练中。
+
+## MMYOLO 是否有计算模型推理 FPS 脚本?
+
+MMYOLO 是基于 MMDet 3.x 来开发的,在 MMDet 3.x 中提供了计算模型推理 FPS 的脚本。 具体脚本为 [benchmark](https://github.com/open-mmlab/mmdetection/blob/3.x/tools/analysis_tools/benchmark.py)。我们推荐大家使用 mim 直接跨库启动 MMDet 中的脚本而不是直接复制到 MMYOLO 中。
+关于如果通过 mim 启动 MMDet 中脚本,可以查看 [使用 mim 跨库调用其他 OpenMMLab 仓库的脚本](../common_usage/mim_usage.md)。
+
+## MMDeploy 和 EasyDeploy 有啥区别?
+
+MMDeploy 是由 OpenMMLab 中部署团队开发的针对 OpenMMLab 系列算法库提供部署支持的开源库,支持各种后端和自定义等等强大功能。 EasyDeploy 是由社区小伙伴提供的一个相比 MMDeploy 更加简单易用的部署 projects。
+EasyDeploy 支持的功能目前没有 MMDeploy 多,但是使用上更加简单。 MMYOLO 中同时提供对 MMDeploy 和 EasyDeploy 的支持,用户可以根据自己需求选择。
+
+## COCOMetric 中如何查看每个类的 AP
+
+只需要在配置中设置 `test_evaluator.classwise` 为 True,或者在 test.py 运行时候增加 `--cfg-options test_evaluator.classwise=True` 即可。
+
+## MMYOLO 中为何没有支持 MMDet 类似的自动学习率缩放功能?
+
+原因是实验发现 YOLO 系列算法不是非常满足线性缩放功能。在多个数据集上验证发现会出现不基于 batch size 自动学习率缩放效果好于缩放的情形。因此暂时 MMYOLO 还没有支持自动学习率缩放功能。
+
+## 自己训练的模型权重尺寸为啥比官方发布的大?
+
+原因是用户自己训练的权重通常包括 `optimizer`、`ema_state_dict` 和 `message_hub` 等额外数据,这部分数据我们会在模型发布时候自动删掉,而用户直接基于框架跑的模型权重是全部保留的,所以用户自己训练的模型权重尺寸会比官方发布的大。
+你可以使用 [publish_model.py](https://github.com/open-mmlab/mmyolo/blob/main/tools/misc/publish_model.py) 脚本删掉额外字段。
+
+## RTMDet 为何训练所占显存比 YOLOv5 多很多?
+
+训练显存较多的原因主要是 assigner 部分的差异。YOLOv5 采用的是非常简单且高效的 shape 匹配 assigner,而 RTMDet 中采用的是动态的全 batch 计算的 dynamic soft label assigner,其内部的 Cost 矩阵需要消耗比较多的显存,特别是当前 batch 中标注框过多时候。
+后续我们会考虑解决这个问题。
+
+## 修改一些代码后是否需要重新安装 MMYOLO
+
+在不新增 py 代码情况下, 如果你遵循最佳实践,即使用 `mim install -v -e .` 安装的 MMYOLO,则对本地代码所作的任何修改都会生效,无需重新安装。但是如果你是新增了 py 文件然后在里面新增的代码,则依然需要重新安装即运行 `mim install -v -e .`。
+
+## 如何使用多个 MMYOLO 版本进行开发
+
+若你拥有多个 MMYOLO 工程文件夹,例如 mmyolo-v1, mmyolo-v2。 在使用不同版本 MMYOLO 时候,你可以在终端运行前设置
+
+```shell
+PYTHONPATH="$(dirname $0)/..":$PYTHONPATH
+```
+
+使得当前环境生效。如果要使用环境中安装默认的 MMYOLO 而不是当前正在在使用的,可以删除出现上述命令或者通过如下命令重置
+
+```shell
+unset PYTHONPATH
+```
+
+## 训练中保存最好模型
+
+用户可以通过在配置中设置 `default_hooks.checkpoint.save_best` 参数来选择根据什么指标来筛选最优模型。以 `COCO` 数据集检测任务为例,
+`default_hooks.checkpoint.save_best` 可以选择输入的参数有:
+
+1. `auto` 将会根据验证集中的第一个评价指标作为筛选条件。
+2. `coco/bbox_mAP` 将会根据 `bbox_mAP` 作为筛选条件。
+3. `coco/bbox_mAP_50` 将会根据 `bbox_mAP_50` 作为筛选条件。
+4. `coco/bbox_mAP_75` 将会根据 `bbox_mAP_75` 作为筛选条件。
+5. `coco/bbox_mAP_s` 将会根据 `bbox_mAP_s` 作为筛选条件。
+6. `coco/bbox_mAP_m` 将会根据 `bbox_mAP_m` 作为筛选条件。
+7. `coco/bbox_mAP_l` 将会根据 `bbox_mAP_l` 作为筛选条件。
+
+此外用户还可以选择筛选的逻辑,通过设置配置中的 `default_hooks.checkpoint.rule` 来选择判断逻辑,如:`default_hooks.checkpoint.rule=greater` 表示指标越大越好。更详细的使用可以参考 [checkpoint_hook](https://github.com/open-mmlab/mmengine/blob/main/mmengine/hooks/checkpoint_hook.py) 来修改
+
+## 如何进行非正方形输入尺寸训练和测试?
+
+在 YOLO 系列算法中默认配置基本上都是 640x640 或者 1280x1280 正方形尺度输入训练的。用户如果想进行非正方形尺度训练,你可以修改配置中 `image_scale` 参数,并将其他对应位置进行修改即可。用户可以参考我们提供的 [yolov5_s-v61_fast_1xb12-40e_608x352_cat.py](https://github.com/open-mmlab/mmyolo/tree/dev/configs/yolov5/yolov5_s-v61_fast_1xb12-40e_608x352_cat.py) 配置。
diff --git a/mmdetection_practice/third_party/mmyolo/docs/zh_cn/tutorials/rotated_detection.md b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/tutorials/rotated_detection.md
new file mode 100644
index 0000000..1ee974b
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/tutorials/rotated_detection.md
@@ -0,0 +1,329 @@
+# 旋转目标检测
+
+旋转目标检测(Rotated Object Detection),又称为有向目标检测(Oriented Object Detection),试图在检测出目标位置的同时得到目标的方向信息。它通过重新定义目标表示形式,以及增加回归自由度数量的操作,实现旋转矩形、四边形甚至任意形状的目标检测。旋转目标检测在人脸识别、场景文字、遥感影像、自动驾驶、医学图像、机器人抓取等领域都有广泛应用。
+
+关于旋转目标检测的详细介绍请参考文档 [MMRotate 基础知识](https://mmrotate.readthedocs.io/zh_CN/1.x/overview.html)
+
+MMYOLO 中的旋转目标检测依赖于 MMRotate 1.x,请参考文档 [开始你的第一步](https://mmrotate.readthedocs.io/zh_CN/1.x/get_started.html) 安装 MMRotate 1.x。
+
+本教程将介绍如何在 MMYOLO 中训练和使用旋转目标检测模型,目前支持了 RTMDet-R。
+
+## 数据集准备
+
+对于旋转目标检测数据集,目前最常用的数据集是 DOTA 数据集,由于DOTA数据集中的图像分辨率较大,因此需要进行切片处理,数据集准备请参考 [Preparing DOTA Dataset](https://github.com/open-mmlab/mmyolo/tools/dataset_converters/dota_split).
+
+处理后的数据集结构如下:
+
+```none
+mmyolo
+├── data
+│   ├── split_ss_dota
+│   │   ├── trainval
+│   │   │   ├── images
+│   │   │   ├── annfiles
+│   │   ├── test
+│   │   │   ├── images
+│   │   │   ├── annfiles
+│   ├── split_ms_dota
+│   │   ├── trainval
+│   │   │   ├── images
+│   │   │   ├── annfiles
+│   │   ├── test
+│   │   │   ├── images
+│   │   │   ├── annfiles
+```
+
+其中 `split_ss_dota` 是单尺度切片,`split_ms_dota` 是多尺度切片,可以根据需要选择。
+
+对于自定义数据集,我们建议将数据转换为 DOTA 格式并离线进行转换,如此您只需在数据转换后修改 config 的数据标注路径和类别即可。
+
+为了方便使用,我们同样提供了基于 COCO 格式的旋转标注格式,将多边形检测框储存在 COCO 标注的 segmentation 标签中,示例如下:
+
+```json
+{
+    "id": 131,
+    "image_id": 72,
+    "bbox": [123, 167, 11, 37],
+    "area": 271.5,
+    "category_id": 1,
+    "segmentation": [[123, 167, 128, 204, 134, 201, 132, 167]],
+    "iscrowd": 0,
+}
+```
+
+## 配置文件
+
+这里以 RTMDet-R 为例介绍旋转目标检测的配置文件,其中大部分和水平检测模型相同,主要介绍它们的差异,包括数据集和评测器配置、检测头、可视化等。
+
+得益于 MMEngine 的配置文件系统,大部分模块都可以调用 MMRotate 中的模块。
+
+### 数据集和评测器配置
+
+关于配置文件的基础请先阅读 [学习 YOLOV5 配置文件](./config.md). 下面介绍旋转目标检测的一些必要设置。
+
+```python
+dataset_type = 'YOLOv5DOTADataset'  # 数据集类型,这将被用来定义数据集
+data_root = 'data/split_ss_dota/'  # 数据的根路径
+
+angle_version = 'le90' # 角度范围的定义,目前支持 oc, le90 和 le135
+
+train_pipeline = [
+    # 训练数据读取流程
+    dict(
+        type='LoadImageFromFile'), # 第 1 个流程,从文件路径里加载图像
+    dict(type='LoadAnnotations', # 第 2 个流程,对于当前图像,加载它的注释信息
+         with_bbox=True, # 是否使用标注框 (bounding box),目标检测需要设置为 True
+         box_type='qbox'), # 指定读取的标注格式,旋转框数据集默认的数据格式为四边形
+    dict(type='mmrotate.ConvertBoxType', # 第 3 个流程,转换标注格式
+         box_type_mapping=dict(gt_bboxes='rbox')), # 将四边形标注转化为旋转框标注
+
+    # 训练数据处理流程
+    dict(type='mmdet.Resize', scale=(1024, 1024), keep_ratio=True),
+    dict(type='mmdet.RandomFlip',
+         prob=0.75,
+         direction=['horizontal', 'vertical', 'diagonal']),
+    dict(type='mmrotate.RandomRotate', # 旋转数据增强
+         prob=0.5, # 旋转概率 0.5
+         angle_range=180, # 旋转范围 180
+         rotate_type='mmrotate.Rotate', # 旋转方法
+         rect_obj_labels=[9, 11]), # 由于 DOTA 数据集中标号为 9 的 'storage-tank' 和标号 11 的 'roundabout' 两类为正方形标注,无需角度信息,旋转中将这两类保持为水平
+    dict(type='mmdet.Pad', size=img_scale, pad_val=dict(img=(114, 114, 114))),
+    dict(type='RegularizeRotatedBox', # 统一旋转框表示形式
+         angle_version=angle_version), # 根据角度的定义方式进行
+    dict(type='mmdet.PackDetInputs')
+]
+
+train_dataloader = dict(
+    batch_size=train_batch_size_per_gpu,
+    num_workers=train_num_workers,
+    persistent_workers=persistent_workers,
+    pin_memory=True,
+    collate_fn=dict(type='yolov5_collate'),
+    sampler=dict(type='DefaultSampler', shuffle=True),
+    dataset=dict( # 训练数据集的配置
+        type=dataset_type,
+        data_root=data_root,
+        ann_file='trainval/annfiles/', # 标注文件夹路径
+        data_prefix=dict(img_path='trainval/images/'), # 图像路径前缀
+        img_shape=(1024, 1024), # 图像大小
+        filter_cfg=dict(filter_empty_gt=True), # 标注的过滤配置
+        pipeline=train_pipeline)) # 这是由之前创建的 train_pipeline 定义的数据处理流程
+```
+
+RTMDet-R 保持论文内的配置,默认仅采用随机旋转增强,得益于 BoxType 设计,在数据增强阶段,大部分增强无需改动代码即可直接支持,例如 MixUp 和 Mosaic 等,可以直接在 pipeline 中使用。
+
+```{Warning}
+目前已知 Albu 数据增强仅支持水平框,在使用其他的数据增强时建议先使用 可视化数据集脚本 `browse_dataset.py` 验证数据增强是否正确。
+```
+
+RTMDet-R 测试阶段仅采用 Resize 和 Pad,在验证和评测时,都采用相同的数据流进行推理。
+
+```python
+val_pipeline = [
+    dict(type='LoadImageFromFile', backend_args=_base_.backend_args),
+    dict(type='mmdet.Resize', scale=(1024, 1024), keep_ratio=True),
+    dict(
+        type='mmdet.Pad', size=(1024, 1024),
+        pad_val=dict(img=(114, 114, 114))),
+    # 和训练时一致,先读取标注再转换标注格式
+    dict(
+        type='LoadAnnotations',
+        with_bbox=True,
+        box_type='qbox',
+        _scope_='mmdet'),
+    dict(
+        type='mmrotate.ConvertBoxType',
+        box_type_mapping=dict(gt_bboxes='rbox')),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                   'scale_factor'))
+]
+
+val_dataloader = dict(
+    batch_size=val_batch_size_per_gpu,
+    num_workers=val_num_workers,
+    persistent_workers=persistent_workers,
+    pin_memory=True,
+    drop_last=False,
+    sampler=dict(type='DefaultSampler', shuffle=False),
+    dataset=dict(
+        type=dataset_type,
+        data_root=data_root,
+        ann_file='trainval/annfiles/',
+        data_prefix=dict(img_path='trainval/images/'),
+        img_shape=(1024, 1024),
+        test_mode=True,
+        batch_shapes_cfg=batch_shapes_cfg,
+        pipeline=val_pipeline))
+```
+
+[评测器](https://mmengine.readthedocs.io/zh_CN/latest/tutorials/evaluation.html) 用于计算训练模型在验证和测试数据集上的指标。评测器的配置由一个或一组评价指标(Metric)配置组成:
+
+```python
+val_evaluator = dict( # 验证过程使用的评测器
+    type='mmrotate.DOTAMetric', # 用于评估旋转目标检测的 mAP 的 dota 评价指标
+    metric='mAP' # 需要计算的评价指标
+)
+test_evaluator = val_evaluator  # 测试过程使用的评测器
+```
+
+由于 DOTA 测试数据集没有标注文件, 如果要保存在测试数据集上的检测结果,则可以像这样编写配置:
+
+```python
+# 在测试集上推理,
+# 并将检测结果转换格式以用于提交结果
+test_dataloader = dict(
+    batch_size=val_batch_size_per_gpu,
+    num_workers=val_num_workers,
+    persistent_workers=True,
+    drop_last=False,
+    sampler=dict(type='DefaultSampler', shuffle=False),
+    dataset=dict(
+        type=dataset_type,
+        data_root=data_root,
+        data_prefix=dict(img_path='test/images/'),
+        img_shape=(1024, 1024),
+        test_mode=True,
+        batch_shapes_cfg=batch_shapes_cfg,
+        pipeline=test_pipeline))
+test_evaluator = dict(
+    type='mmrotate.DOTAMetric',
+    format_only=True, # 只将模型输出转换为 DOTA 的 txt 提交格式并压缩成 zip
+    merge_patches=True, # 将切片结果合并成大图检测结果
+    outfile_prefix='./work_dirs/dota_detection/submission') # 输出测试文件夹的路径
+```
+
+如果使用基于 COCO 格式的旋转框标注,只需要修改 pipeline 中数据读取流程和训练数据集的配置,以训练数据为例:
+
+```python
+
+dataset_type='YOLOv5CocoDataset'
+
+train_pipeline = [
+    # 训练数据读取流程
+    dict(
+        type='LoadImageFromFile'), # 第 1 个流程,从文件路径里加载图像
+    dict(type='LoadAnnotations', # 第 2 个流程,对于当前图像,加载它的注释信息
+         with_bbox=True, # 是否使用标注框 (bounding box),目标检测需要设置为 True
+         with_mask=True, # 读取储存在 segmentation 标注中的多边形标注
+         poly2mask=False) # 不执行 poly2mask,后续会将 poly 转化成检测框
+    dict(type='ConvertMask2BoxType', # 第 3 个流程,将 mask 标注转化为 boxtype
+         box_type='rbox'), # 目标类型是 rbox 旋转框
+    # 剩余的其他 pipeline
+    ...
+]
+
+metainfo = dict( # DOTA 数据集的 metainfo
+    classes=('plane', 'baseball-diamond', 'bridge', 'ground-track-field',
+             'small-vehicle', 'large-vehicle', 'ship', 'tennis-court',
+             'basketball-court', 'storage-tank', 'soccer-ball-field',
+             'roundabout', 'harbor', 'swimming-pool', 'helicopter'))
+
+train_dataloader = dict(
+    dataset=dict( # 训练数据集的配置
+        type=dataset_type,
+        metainfo=metainfo,
+        data_root=data_root,
+        ann_file='train/train.json', # 标注文件路径
+        data_prefix=dict(img='train/images/'), # 图像路径前缀
+        filter_cfg=dict(filter_empty_gt=True), # 标注的过滤配置
+        pipeline=train_pipeline), # 数据处理流程
+)
+```
+
+### 模型配置
+
+对于旋转目标检测器,在模型配置中 backbone 和 neck 的配置和其他模型是一致的,主要差异在检测头上。目前仅支持 RTMDet-R 旋转目标检测,下面介绍新增的参数:
+
+1. `angle_version` 角度范围,用于在训练时限制角度的范围,可选的角度范围有 `le90`, `le135` 和 `oc`。
+
+2. `angle_coder` 角度编码器,和 bbox coder 类似,用于编码和解码角度。
+
+   默认使用的角度编码器是 `PseudoAngleCoder`,即”伪角度编码器“,并不进行编解码,直接回归角度参数。这样设计的目标是能更好的自定义角度编码方式,而无需重写代码,例如 CSL,DCL,PSC 等方法。
+
+3. `use_hbbox_loss` 是否使用水平框 loss。考虑到部分角度编码解码过程不可导,直接使用旋转框的损失函数无法学习角度,因此引入该参数用于将框和角度分开训练。
+
+4. `loss_angle` 角度损失函数。在设定`use_hbbox_loss=True` 时必须设定,而使用旋转框损失时可选,此时可以作为回归损失的辅助。
+
+通过组合 `use_hbbox_loss` 和 `loss_angle` 可以控制旋转框训练时的回归损失计算方式,共有三种组合方式:
+
+- `use_hbbox_loss=False` 且 `loss_angle` 为 None.
+
+  此时框预测和角度预测进行合并,直接对旋转框预测进行回归,此时 `loss_bbox` 应当设定为旋转框损失,例如 `RotatedIoULoss`。
+  这种方案和水平检测模型的回归方式基本一致,只是多了额外的角度编解码过程。
+
+  ```
+  bbox_pred────(tblr)───┐
+                        ▼
+  angle_pred          decode──►rbox_pred──(xywha)─►loss_bbox
+      │                 ▲
+      └────►decode──(a)─┘
+  ```
+
+- `use_hbbox_loss=False`,同时设定 `loss_angle`.
+
+  此时会增加额外的角度回归和分类损失,具体的角度损失类型需要根据角度编码器 `angle_code` 进行选择。
+
+  ```
+  bbox_pred────(tblr)───┐
+                        ▼
+  angle_pred          decode──►rbox_pred──(xywha)─►loss_bbox
+      │                 ▲
+      ├────►decode──(a)─┘
+      │
+      └───────────────────────────────────────────►loss_angle
+  ```
+
+- `use_hbbox_loss=True` 且 `loss_angle` 为 None.
+
+  此时框预测和角度预测完全分离,将两个分支视作两个任务进行训练。
+  此时 `loss_bbox` 要设定为水平框的损失函数,例如 `IoULoss` 。
+
+  ```
+  bbox_pred──(tblr)──►decode──►hbox_pred──(xyxy)──►loss_bbox
+
+  angle_pred──────────────────────────────────────►loss_angle
+  ```
+
+除了检测头中的参数,在test_cfg中还增加了 `decoded_with_angle` 参数用来控制推理时角度的处理逻辑,默认设定为 True 。
+设计这个参数的目标是让训练过程和推理过程的逻辑对齐,该参数会影响最终的精度。
+
+当 `decoded_with_angle=True` 时,将框和角度同时送入 `bbox_coder` 中。
+此时要使用旋转框的编解码器,例如`DistanceAnglePointCoder`。
+
+```
+bbox_pred────(tblr)───┐
+                      ▼
+angle_pred          decode──(xywha)──►rbox_pred
+    │                 ▲
+    └────►decode──(a)─┘
+```
+
+当 `decoded_with_angle=False` 时,首先解码出水平检测框,之后将角度 concat 到检测框。
+此时要使用水平框的编解码器,例如`DistancePointBBoxCoder`。
+
+```
+bbox_pred──(tblr)─►decode
+                      │ (xyxy)
+                      ▼
+                    format───(xywh)──►concat──(xywha)──►rbox_pred
+                                       ▲
+angle_pred────────►decode────(a)───────┘
+```
+
+### 可视化器
+
+由于旋转框和水平框的差异,旋转目标检测模型需要使用 MMRotate 中的 `RotLocalVisualizer`,配置如下:
+
+```python
+vis_backends = [dict(type='LocalVisBackend')]  # 可视化后端,请参考 https://mmengine.readthedocs.io/zh_CN/latest/advanced_tutorials/visualization.html
+visualizer = dict(
+    type='mmrotate.RotLocalVisualizer', vis_backends=vis_backends, name='visualizer')
+```
+
+## 实用工具
+
+目前测试可用的工具包括:
+
+[可视化数据集](../useful_tools/browse_dataset.md)
diff --git a/mmdetection_practice/third_party/mmyolo/docs/zh_cn/tutorials/warning_notes.md b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/tutorials/warning_notes.md
new file mode 100644
index 0000000..38b65c9
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/tutorials/warning_notes.md
@@ -0,0 +1,22 @@
+# 常见警告说明
+
+本文档收集用户经常疑惑的警告信息说明,方便大家理解。
+
+## xxx registry in mmyolo did not set import location
+
+完整信息为 The xxx registry in mmyolo did not set import location. Fallback to call `mmyolo.utils.register_all_modules` instead.。
+这个警告的含义说某个模块在导入时候发现没有设置导入的 location,导致无法确定其位置,因此会自动调用 `mmyolo.utils.register_all_modules` 触发包的导入。这个警告属于 MMEngine 中非常底层的模块警告,
+用户理解起来可能比较困难,不过对大家使用没有任何影响,可以直接忽略。
+
+## save_param_schedulers is true but self.param_schedulers is None
+
+以 YOLOv5 算法为例,这是因为 YOLOv5 中重新写了参数调度器策略 `YOLOv5ParamSchedulerHook`,因此 MMEngine 中设计的 ParamScheduler 是没有使用的,但是 YOLOv5 配置中也没有设置 `save_param_schedulers` 为 False。
+首先这个警告对性能和恢复训练没有任何影响,用户如果觉得这个警告会影响体验,可以设置 `default_hooks.checkpoint.save_param_scheduler` 为 False 或者训练时候通过命令行设置 `--cfg-options default_hooks.checkpoint.save_param_scheduler=False` 即可。
+
+## The loss_cls will be 0. This is a normal phenomenon.
+
+这个和具体算法有关。以 YOLOv5 为例,其分类 loss 是只考虑正样本的,如果类别是 1,那么分类 loss 和 obj loss 就是功能重复的了,因此在设计上当类别是 1 的时候 loss_cls 是不计算的,因此始终是 0,这是正常现象。
+
+## The model and loaded state dict do not match exactly
+
+这个警告是否会影响性能要根据进一步的打印信息来确定。如果是在微调模式下,由于用户自定义类别不一样无法加载 Head 模块的 COCO 预训练权重,这是一个正常现象,不会影响性能。
diff --git a/mmdetection_practice/third_party/mmyolo/docs/zh_cn/useful_tools/browse_coco_json.md b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/useful_tools/browse_coco_json.md
new file mode 100644
index 0000000..3e33f53
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/useful_tools/browse_coco_json.md
@@ -0,0 +1,62 @@
+# 可视化 COCO 标签
+
+脚本 `tools/analysis_tools/browse_coco_json.py` 能够使用可视化显示 COCO 标签在图片的情况。
+
+```shell
+python tools/analysis_tools/browse_coco_json.py [--data-root ${DATA_ROOT}] \
+                                                [--img-dir ${IMG_DIR}] \
+                                                [--ann-file ${ANN_FILE}] \
+                                                [--wait-time ${WAIT_TIME}] \
+                                                [--disp-all] [--category-names CATEGORY_NAMES [CATEGORY_NAMES ...]] \
+                                                [--shuffle]
+```
+
+其中,如果图片、标签都在同一个文件夹下的话,可以指定 `--data-root` 到该文件夹,然后 `--img-dir` 和 `--ann-file` 指定该文件夹的相对路径,代码会自动拼接。
+如果图片、标签文件不在同一个文件夹下的话,则无需指定 `--data-root` ,直接指定绝对路径的 `--img-dir` 和 `--ann-file` 即可。
+
+例子:
+
+1. 查看 `COCO` 全部类别,同时展示 `bbox`、`mask` 等所有类型的标注:
+
+```shell
+python tools/analysis_tools/browse_coco_json.py --data-root './data/coco' \
+                                                --img-dir 'train2017' \
+                                                --ann-file 'annotations/instances_train2017.json' \
+                                                --disp-all
+```
+
+如果图片、标签不在同一个文件夹下的话,可以使用绝对路径:
+
+```shell
+python tools/analysis_tools/browse_coco_json.py --img-dir '/dataset/image/coco/train2017' \
+                                                --ann-file '/label/instances_train2017.json' \
+                                                --disp-all
+```
+
+2. 查看 `COCO` 全部类别,同时仅展示 `bbox` 类型的标注,并打乱显示:
+
+```shell
+python tools/analysis_tools/browse_coco_json.py --data-root './data/coco' \
+                                                --img-dir 'train2017' \
+                                                --ann-file 'annotations/instances_train2017.json' \
+                                                --shuffle
+```
+
+3. 只查看 `bicycle` 和 `person` 类别,同时仅展示 `bbox` 类型的标注:
+
+```shell
+python tools/analysis_tools/browse_coco_json.py --data-root './data/coco' \
+                                                --img-dir 'train2017' \
+                                                --ann-file 'annotations/instances_train2017.json' \
+                                                --category-names 'bicycle' 'person'
+```
+
+4. 查看 `COCO` 全部类别,同时展示 `bbox`、`mask` 等所有类型的标注,并打乱显示:
+
+```shell
+python tools/analysis_tools/browse_coco_json.py --data-root './data/coco' \
+                                                --img-dir 'train2017' \
+                                                --ann-file 'annotations/instances_train2017.json' \
+                                                --disp-all \
+                                                --shuffle
+```
diff --git a/mmdetection_practice/third_party/mmyolo/docs/zh_cn/useful_tools/browse_dataset.md b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/useful_tools/browse_dataset.md
new file mode 100644
index 0000000..5d6f087
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/useful_tools/browse_dataset.md
@@ -0,0 +1,57 @@
+# 可视化数据集
+
+```shell
+python tools/analysis_tools/browse_dataset.py \
+    ${CONFIG_FILE} \
+    [-o, --out-dir ${OUTPUT_DIR}] \
+    [-p, --phase ${DATASET_PHASE}] \
+    [-n, --show-number ${NUMBER_IMAGES_DISPLAY}] \
+    [-i, --show-interval ${SHOW_INTERRVAL}] \
+    [-m, --mode ${DISPLAY_MODE}] \
+    [--cfg-options ${CFG_OPTIONS}]
+```
+
+**所有参数的说明**:
+
+- `config` : 模型配置文件的路径。
+- `-o, --out-dir`: 保存图片文件夹,如果没有指定,默认为 `'./output'`。
+- **`-p, --phase`**: 可视化数据集的阶段,只能为 `['train', 'val', 'test']` 之一,默认为 `'train'`。
+- **`-n, --show-number`**: 可视化样本数量。如果没有指定,默认展示数据集的所有图片。
+- **`-m, --mode`**: 可视化的模式,只能为 `['original', 'transformed', 'pipeline']` 之一。 默认为 `'transformed'`。
+- `--cfg-options` : 对配置文件的修改,参考[学习配置文件](../tutorials/config.md)。
+
+```shell
+`-m, --mode` 用于设置可视化的模式,默认设置为 'transformed'。
+- 如果 `--mode` 设置为 'original',则获取原始图片;
+- 如果 `--mode` 设置为 'transformed',则获取预处理后的图片;
+- 如果 `--mode` 设置为 'pipeline',则获得数据流水线所有中间过程图片。
+```
+
+**示例**:
+
+1. **'original'** 模式 :
+
+```shell
+python ./tools/analysis_tools/browse_dataset.py configs/yolov5/yolov5_s-v61_syncbn_fast_1xb4-300e_balloon.py --phase val --out-dir tmp --mode original
+```
+
+- `--phase val`: 可视化验证集, 可简化为 `-p val`;
+- `--out-dir tmp`: 可视化结果保存在 "tmp" 文件夹, 可简化为 `-o tmp`;
+- `--mode original`: 可视化原图, 可简化为 `-m original`;
+- `--show-number 100`: 可视化100张图,可简化为 `-n 100`;
+
+2. **'transformed'** 模式 :
+
+```shell
+python ./tools/analysis_tools/browse_dataset.py configs/yolov5/yolov5_s-v61_syncbn_fast_1xb4-300e_balloon.py
+```
+
+3. **'pipeline'** 模式 :
+
+```shell
+python ./tools/analysis_tools/browse_dataset.py configs/yolov5/yolov5_s-v61_syncbn_fast_1xb4-300e_balloon.py -m pipeline
+```
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/45811724/204810831-0fbc7f1c-0951-4be1-a11c-491cf0d194f6.png" alt="Image">
+</div>
diff --git a/mmdetection_practice/third_party/mmyolo/docs/zh_cn/useful_tools/dataset_analysis.md b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/useful_tools/dataset_analysis.md
new file mode 100644
index 0000000..121128c
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/useful_tools/dataset_analysis.md
@@ -0,0 +1,80 @@
+# 可视化数据集分析结果
+
+脚本 `tools/analysis_tools/dataset_analysis.py` 能够帮助用户得到四种功能的结果图,并将图片保存到当前运行目录下的 `dataset_analysis` 文件夹中。
+
+关于该脚本的功能的说明:
+
+通过 `main()` 的数据准备,得到每个子函数所需要的数据。
+
+功能一:显示类别和 bbox 实例个数的分布图,通过子函数 `show_bbox_num` 生成。
+
+<img src="https://user-images.githubusercontent.com/90811472/200314770-4fb21626-72f2-4a4c-be5d-bf860ad830ec.jpg"/>
+
+功能二:显示类别和 bbox 实例宽、高的分布图,通过子函数 `show_bbox_wh` 生成。
+
+<img src="https://user-images.githubusercontent.com/90811472/200315007-96e8e795-992a-4c72-90fa-f6bc00b3f2c7.jpg"/>
+
+功能三:显示类别和 bbox 实例宽/高比例的分布图,通过子函数 `show_bbox_wh_ratio` 生成。
+
+<img src="https://user-images.githubusercontent.com/90811472/200315044-4bdedcf6-087a-418e-8fe8-c2d3240ceba8.jpg"/>
+
+功能四:基于面积规则下,显示类别和 bbox 实例面积的分布图,通过子函数 `show_bbox_area` 生成。
+
+<img src="https://user-images.githubusercontent.com/90811472/200315075-71680fe2-db6f-4981-963e-a035c1281fc1.jpg"/>
+
+打印列表显示,通过脚本中子函数 `show_class_list` 和 `show_data_list` 生成。
+
+<img src="https://user-images.githubusercontent.com/90811472/200315152-9d6df91c-f2d2-4bba-9f95-b790fac37b62.jpg"/>
+
+```shell
+python tools/analysis_tools/dataset_analysis.py ${CONFIG} \
+                                                [-h] \
+                                                [--val-dataset ${TYPE}] \
+                                                [--class-name ${CLASS_NAME}] \
+                                                [--area-rule ${AREA_RULE}] \
+                                                [--func ${FUNC}] \
+                                                [--out-dir ${OUT_DIR}]
+```
+
+例子:
+
+1. 使用 `config` 文件 `configs/yolov5/voc/yolov5_s-v61_fast_1xb64-50e_voc.py` 分析数据集,其中默认设置:数据加载类型为 `train_dataset` ,面积规则设置为 `[0,32,96,1e5]` ,生成包含所有类的结果图并将图片保存到当前运行目录下 `./dataset_analysis` 文件夹中:
+
+```shell
+python tools/analysis_tools/dataset_analysis.py configs/yolov5/voc/yolov5_s-v61_fast_1xb64-50e_voc.py
+```
+
+2. 使用 `config` 文件 `configs/yolov5/voc/yolov5_s-v61_fast_1xb64-50e_voc.py` 分析数据集,通过 `--val-dataset` 设置将数据加载类型由默认的 `train_dataset` 改为 `val_dataset`:
+
+```shell
+python tools/analysis_tools/dataset_analysis.py configs/yolov5/voc/yolov5_s-v61_fast_1xb64-50e_voc.py \
+                                               --val-dataset
+```
+
+3. 使用 `config` 文件 `configs/yolov5/voc/yolov5_s-v61_fast_1xb64-50e_voc.py` 分析数据集,通过 `--class-name` 设置将生成所有类改为特定类显示,以显示 `person` 为例:
+
+```shell
+python tools/analysis_tools/dataset_analysis.py configs/yolov5/voc/yolov5_s-v61_fast_1xb64-50e_voc.py \
+                                               --class-name person
+```
+
+4. 使用 `config` 文件 `configs/yolov5/voc/yolov5_s-v61_fast_1xb64-50e_voc.py` 分析数据集,通过 `--area-rule` 重新定义面积规则,以 `30 70 125` 为例,面积规则变为 `[0,30,70,125,1e5]`:
+
+```shell
+python tools/analysis_tools/dataset_analysis.py configs/yolov5/voc/yolov5_s-v61_fast_1xb64-50e_voc.py \
+                                               --area-rule 30 70 125
+```
+
+5. 使用 `config` 文件 `configs/yolov5/voc/yolov5_s-v61_fast_1xb64-50e_voc.py` 分析数据集,通过 `--func` 设置,将显示四个功能效果图改为只显示 `功能一` 为例:
+
+```shell
+python tools/analysis_tools/dataset_analysis.py configs/yolov5/voc/yolov5_s-v61_fast_1xb64-50e_voc.py \
+                                               --func show_bbox_num
+```
+
+6. 使用 `config` 文件 `configs/yolov5/voc/yolov5_s-v61_fast_1xb64-50e_voc.py` 分析数据集,通过 `--out-dir` 设置修改图片保存地址,以 `work_dirs/dataset_analysis` 地址为例:
+
+```shell
+python tools/analysis_tools/dataset_analysis.py configs/yolov5/voc/yolov5_s-v61_fast_1xb64-50e_voc.py \
+                                               --out-dir work_dirs/dataset_analysis
+```
diff --git a/mmdetection_practice/third_party/mmyolo/docs/zh_cn/useful_tools/dataset_converters.md b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/useful_tools/dataset_converters.md
new file mode 100644
index 0000000..38da7fc
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/useful_tools/dataset_converters.md
@@ -0,0 +1,56 @@
+# 数据集转换
+
+文件夹 `tools/data_converters/` 目前包含 `ballon2coco.py`、`yolo2coco.py` 和 `labelme2coco.py` 三个数据集转换工具。
+
+- `ballon2coco.py` 将 `balloon` 数据集(该小型数据集仅作为入门使用)转换成 COCO 的格式。
+
+```shell
+python tools/dataset_converters/balloon2coco.py
+```
+
+- `yolo2coco.py` 将 `yolo-style` **.txt** 格式的数据集转换成 COCO 的格式,请按如下方式使用:
+
+```shell
+python tools/dataset_converters/yolo2coco.py /path/to/the/root/dir/of/your_dataset
+```
+
+使用说明:
+
+1. `image_dir` 是需要你传入的待转换的 yolo 格式数据集的根目录,内应包含 `images` 、 `labels` 和 `classes.txt` 文件, `classes.txt` 是当前 dataset 对应的类的声明,一行一个类别。
+   `image_dir` 结构如下例所示:
+
+```bash
+.
+└── $ROOT_PATH
+    ├── classes.txt
+    ├── labels
+    │    ├── a.txt
+    │    ├── b.txt
+    │    └── ...
+    ├── images
+    │    ├── a.jpg
+    │    ├── b.png
+    │    └── ...
+    └── ...
+```
+
+2. 脚本会检测 `image_dir` 下是否已有的 `train.txt` 、 `val.txt` 和 `test.txt` 。若检测到文件,则会按照类别进行整理, 否则默认不需要分类。故请确保对应的 `train.txt` 、 `val.txt` 和 `test.txt` 要在 `image_dir` 内。文件内的图片路径必须是**绝对路径**。
+3. 脚本会默认在 `image_dir` 目录下创建 `annotations` 文件夹并将转换结果存在这里。如果在 `image_dir` 下没找到分类文件,输出文件即为一个 `result.json`,反之则会生成需要的 `train.json` 、 `val.json`、 `test.json`,脚本完成后 `annotations` 结构可如下例所示:
+
+```bash
+.
+└── $ROOT_PATH
+    ├── annotations
+    │    ├── result.json
+    │    └── ...
+    ├── classes.txt
+    ├── labels
+    │    ├── a.txt
+    │    ├── b.txt
+    │    └── ...
+    ├── images
+    │    ├── a.jpg
+    │    ├── b.png
+    │    └── ...
+    └── ...
+```
diff --git a/mmdetection_practice/third_party/mmyolo/docs/zh_cn/useful_tools/download_dataset.md b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/useful_tools/download_dataset.md
new file mode 100644
index 0000000..a4ad6f4
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/useful_tools/download_dataset.md
@@ -0,0 +1,11 @@
+# 数据集下载
+
+脚本 `tools/misc/download_dataset.py` 支持下载数据集,例如 `COCO`、`VOC`、`LVIS` 和 `Balloon`.
+
+```shell
+python tools/misc/download_dataset.py --dataset-name coco2017
+python tools/misc/download_dataset.py --dataset-name voc2007
+python tools/misc/download_dataset.py --dataset-name voc2012
+python tools/misc/download_dataset.py --dataset-name lvis
+python tools/misc/download_dataset.py --dataset-name balloon [--save-dir ${SAVE_DIR}] [--unzip]
+```
diff --git a/mmdetection_practice/third_party/mmyolo/docs/zh_cn/useful_tools/extract_subcoco.md b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/useful_tools/extract_subcoco.md
new file mode 100644
index 0000000..6093533
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/useful_tools/extract_subcoco.md
@@ -0,0 +1,60 @@
+# 提取 COCO 子集
+
+COCO2017 数据集训练数据集包括 118K 张图片,验证集包括 5K 张图片,数据集比较大。在调试或者快速验证程序是否正确的场景下加载 json 会需要消耗较多资源和带来较慢的启动速度,这会导致程序体验不好。
+
+`extract_subcoco.py` 脚本提供了按指定图片数量、类别、锚框尺寸来切分图片的功能,用户可以通过 `--num-img`, `--classes`, `--area-size` 参数来得到指定条件的 COCO 子集,从而满足上述需求。
+
+例如通过以下脚本切分图片:
+
+```shell
+python tools/misc/extract_subcoco.py \
+    ${ROOT} \
+    ${OUT_DIR} \
+    --num-img 20 \
+    --classes cat dog person \
+    --area-size small
+```
+
+会切分出 20 张图片,且这 20 张图片只会保留同时满足类别条件和锚框尺寸条件的标注信息, 没有满足条件的标注信息的图片不会被选择,保证了这 20 张图都是有 annotation info 的。
+
+注意: 本脚本目前仅仅支持 COCO2017 数据集,未来会支持更加通用的 COCO JSON 格式数据集
+
+输入 root 根路径文件夹格式如下所示:
+
+```text
+├── root
+│   ├── annotations
+│   ├── train2017
+│   ├── val2017
+│   ├── test2017
+```
+
+1. 仅仅使用 5K 张验证集切分出 10 张训练图片和 10 张验证图片
+
+```shell
+python tools/misc/extract_subcoco.py ${ROOT} ${OUT_DIR} --num-img 10
+```
+
+2. 使用训练集切分出 20 张训练图片,使用验证集切分出 20 张验证图片
+
+```shell
+python tools/misc/extract_subcoco.py ${ROOT} ${OUT_DIR} --num-img 20 --use-training-set
+```
+
+3. 设置全局种子,默认不设置
+
+```shell
+python tools/misc/extract_subcoco.py ${ROOT} ${OUT_DIR} --num-img 20 --use-training-set --seed 1
+```
+
+4. 按指定类别切分图片
+
+```shell
+python tools/misc/extract_subcoco.py ${ROOT} ${OUT_DIR} --classes cat dog person
+```
+
+5. 按指定锚框尺寸切分图片
+
+```shell
+python tools/misc/extract_subcoco.py ${ROOT} ${OUT_DIR} --area-size small
+```
diff --git a/mmdetection_practice/third_party/mmyolo/docs/zh_cn/useful_tools/log_analysis.md b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/useful_tools/log_analysis.md
new file mode 100644
index 0000000..6d0c573
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/useful_tools/log_analysis.md
@@ -0,0 +1,82 @@
+# 日志分析
+
+## 曲线图绘制
+
+MMDetection 中的 `tools/analysis_tools/analyze_logs.py` 可利用指定的训练 log 文件绘制 loss/mAP 曲线图, 第一次运行前请先运行 `pip install seaborn` 安装必要依赖。
+
+```shell
+mim run mmdet analyze_logs plot_curve \
+    ${LOG} \                                     # 日志文件路径
+    [--keys ${KEYS}] \                           # 需要绘制的指标,默认为 'bbox_mAP'
+    [--start-epoch ${START_EPOCH}]               # 起始的 epoch,默认为 1
+    [--eval-interval ${EVALUATION_INTERVAL}] \   # 评估间隔,默认为 1
+    [--title ${TITLE}] \                         # 图片标题,无默认值
+    [--legend ${LEGEND}] \                       # 图例,默认为 None
+    [--backend ${BACKEND}] \                     # 绘制后端,默认为 None
+    [--style ${STYLE}] \                         # 绘制风格,默认为 'dark'
+    [--out ${OUT_FILE}]                          # 输出文件路径
+# [] 代表可选参数,实际输入命令行时,不用输入 []
+```
+
+样例:
+
+- 绘制分类损失曲线图
+
+  ```shell
+  mim run mmdet analyze_logs plot_curve \
+      yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700.log.json \
+      --keys loss_cls \
+      --legend loss_cls
+  ```
+
+  <img src="https://user-images.githubusercontent.com/27466624/204747359-754555df-1f97-4d5c-87ca-9ad3a0badcce.png" width="600"/>
+
+- 绘制分类损失、回归损失曲线图,保存图片为对应的 pdf 文件
+
+  ```shell
+  mim run mmdet analyze_logs plot_curve \
+      yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700.log.json \
+      --keys loss_cls loss_bbox \
+      --legend loss_cls loss_bbox \
+      --out losses_yolov5_s.pdf
+  ```
+
+  <img src="https://user-images.githubusercontent.com/27466624/204748560-2d17ce4b-fb5f-4732-a962-329109e73aad.png" width="600"/>
+
+- 在同一图像中比较两次运行结果的 bbox mAP
+
+  ```shell
+  mim run mmdet analyze_logs plot_curve \
+      yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700.log.json \
+      yolov5_n-v61_syncbn_fast_8xb16-300e_coco_20220919_090739.log.json \
+      --keys bbox_mAP \
+      --legend yolov5_s yolov5_n \
+      --eval-interval 10 # 注意评估间隔必须和训练时设置的一致,否则会报错
+  ```
+
+<img src="https://user-images.githubusercontent.com/27466624/204748704-21db9f9e-386e-449c-91c7-2ce3f8b51f24.png" width="600"/>
+
+## 计算平均训练速度
+
+```shell
+mim run mmdet analyze_logs cal_train_time \
+    ${LOG} \                                # 日志文件路径
+    [--include-outliers]                    # 计算时包含每个 epoch 的第一个数据
+```
+
+样例:
+
+```shell
+mim run mmdet analyze_logs cal_train_time \
+    yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700.log.json
+```
+
+输出以如下形式展示:
+
+```text
+-----Analyze train time of yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700.log.json-----
+slowest epoch 278, average time is 0.1705 s/iter
+fastest epoch 300, average time is 0.1510 s/iter
+time std over epochs is 0.0026
+average iter time: 0.1556 s/iter
+```
diff --git a/mmdetection_practice/third_party/mmyolo/docs/zh_cn/useful_tools/model_converters.md b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/useful_tools/model_converters.md
new file mode 100644
index 0000000..b5e7392
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/useful_tools/model_converters.md
@@ -0,0 +1,52 @@
+# 模型转换
+
+文件夹 `tools/model_converters/` 下的六个脚本能够帮助用户将对应YOLO官方的预训练模型中的键转换成 `MMYOLO` 格式,并使用 `MMYOLO` 对模型进行微调。
+
+## YOLOv5
+
+下面以转换 `yolov5s.pt` 为例:
+
+1. 将 YOLOv5 官方代码克隆到本地(目前支持的最高版本为 `v6.1` ):
+
+```shell
+git clone -b v6.1 https://github.com/ultralytics/yolov5.git
+cd yolov5
+```
+
+2. 下载官方权重:
+
+```shell
+wget https://github.com/ultralytics/yolov5/releases/download/v6.1/yolov5s.pt
+```
+
+3. 将 `tools/model_converters/yolov5_to_mmyolo.py` 文件复制到 YOLOv5 官方代码克隆的路径:
+
+```shell
+cp ${MMDET_YOLO_PATH}/tools/model_converters/yolov5_to_mmyolo.py yolov5_to_mmyolo.py
+```
+
+4. 执行转换:
+
+```shell
+python yolov5_to_mmyolo.py --src ${WEIGHT_FILE_PATH} --dst mmyolov5.pt
+```
+
+转换好的 `mmyolov5.pt` 即可以为 MMYOLO 所用。 YOLOv6 官方权重转化也是采用一样的使用方式。
+
+## YOLOX
+
+YOLOX 模型的转换不需要下载 YOLOX 官方代码,只需要下载权重即可。下面以转换 `yolox_s.pth` 为例:
+
+1. 下载权重:
+
+```shell
+wget https://github.com/Megvii-BaseDetection/YOLOX/releases/download/0.1.1rc0/yolox_s.pth
+```
+
+2. 执行转换:
+
+```shell
+python tools/model_converters/yolox_to_mmyolo.py --src yolox_s.pth --dst mmyolox.pt
+```
+
+转换好的 `mmyolox.pt` 即可以在 MMYOLO 中使用。
diff --git a/mmdetection_practice/third_party/mmyolo/docs/zh_cn/useful_tools/optimize_anchors.md b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/useful_tools/optimize_anchors.md
new file mode 100644
index 0000000..5ce9837
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/useful_tools/optimize_anchors.md
@@ -0,0 +1,37 @@
+# 优化锚框尺寸
+
+脚本 `tools/analysis_tools/optimize_anchors.py` 支持 YOLO 系列中三种锚框生成方式,分别是 `k-means`、`Differential Evolution`、`v5-k-means`.
+
+## k-means
+
+在 k-means 方法中,使用的是基于 IoU 表示距离的聚类方法,具体使用命令如下:
+
+```shell
+python tools/analysis_tools/optimize_anchors.py ${CONFIG} \
+                                                --algorithm k-means \
+                                                --input-shape ${INPUT_SHAPE [WIDTH HEIGHT]} \
+                                                --out-dir ${OUT_DIR}
+```
+
+## Differential Evolution
+
+在 `Differential Evolution` 方法中,使用的是基于差分进化算法(简称 DE 算法)的聚类方式,其最小化目标函数为 `avg_iou_cost`,具体使用命令如下:
+
+```shell
+python tools/analysis_tools/optimize_anchors.py ${CONFIG} \
+                                                --algorithm DE \
+                                                --input-shape ${INPUT_SHAPE [WIDTH HEIGHT]} \
+                                                --out-dir ${OUT_DIR}
+```
+
+## v5-k-means
+
+在 v5-k-means 方法中,使用的是 YOLOv5 中基于 `shape-match` 的聚类方式,具体使用命令如下:
+
+```shell
+python tools/analysis_tools/optimize_anchors.py ${CONFIG} \
+                                                --algorithm v5-k-means \
+                                                --input-shape ${INPUT_SHAPE [WIDTH HEIGHT]} \
+                                                --prior-match-thr ${PRIOR_MATCH_THR} \
+                                                --out-dir ${OUT_DIR}
+```
diff --git a/mmdetection_practice/third_party/mmyolo/docs/zh_cn/useful_tools/print_config.md b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/useful_tools/print_config.md
new file mode 100644
index 0000000..904fbd5
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/useful_tools/print_config.md
@@ -0,0 +1,20 @@
+# 打印完整配置文件
+
+MMDetection 中的 `tools/misc/print_config.py` 脚本可将所有配置继承关系展开,打印相应的完整配置文件。调用命令如下:
+
+```shell
+mim run mmdet print_config \
+    ${CONFIG} \                              # 需要打印的配置文件路径
+    [--save-path] \                          # 保存文件路径,必须以 .py, .json 或者 .yml 结尾
+    [--cfg-options ${OPTIONS [OPTIONS...]}]  # 通过命令行参数修改配置文件
+```
+
+样例:
+
+```shell
+mim run mmdet print_config \
+    configs/yolov5/yolov5_s-v61_syncbn_fast_1xb4-300e_balloon.py \
+    --save-path ./work_dirs/yolov5_s-v61_syncbn_fast_1xb4-300e_balloon_whole.py
+```
+
+运行以上命令,会将 `yolov5_s-v61_syncbn_fast_1xb4-300e_balloon.py` 继承关系展开后的配置文件保存到 `./work_dirs` 文件夹内的 `yolov5_s-v61_syncbn_fast_1xb4-300e_balloon_whole.py` 文件中。
diff --git a/mmdetection_practice/third_party/mmyolo/docs/zh_cn/useful_tools/vis_scheduler.md b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/useful_tools/vis_scheduler.md
new file mode 100644
index 0000000..f0d772a
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/docs/zh_cn/useful_tools/vis_scheduler.md
@@ -0,0 +1,44 @@
+# 可视化优化器参数策略
+
+`tools/analysis_tools/vis_scheduler.py` 旨在帮助用户检查优化器的超参数调度器(无需训练),支持学习率(learning rate)、动量(momentum)和权值衰减(weight decay)。
+
+```shell
+python tools/analysis_tools/vis_scheduler.py \
+    ${CONFIG_FILE} \
+    [-p, --parameter ${PARAMETER_NAME}] \
+    [-d, --dataset-size ${DATASET_SIZE}] \
+    [-n, --ngpus ${NUM_GPUs}] \
+    [-o, --out-dir ${OUT_DIR}] \
+    [--title ${TITLE}] \
+    [--style ${STYLE}] \
+    [--window-size ${WINDOW_SIZE}] \
+    [--cfg-options]
+```
+
+**所有参数的说明**:
+
+- `config` : 模型配置文件的路径。
+- **`-p, parameter`**: 可视化参数名,只能为 `["lr", "momentum", "wd"]` 之一, 默认为 `"lr"`.
+- **`-d, --dataset-size`**: 数据集的大小。如果指定,`DATASETS.build` 将被跳过并使用这个数值作为数据集大小,默认使用 `DATASETS.build` 所得数据集的大小。
+- **`-n, --ngpus`**: 使用 GPU 的数量, 默认为1。
+- **`-o, --out-dir`**: 保存的可视化图片的文件夹路径,默认不保存。
+- `--title`: 可视化图片的标题,默认为配置文件名。
+- `--style`: 可视化图片的风格,默认为 `whitegrid`。
+- `--window-size`: 可视化窗口大小,如果没有指定,默认为 `12*7`。如果需要指定,按照格式 `'W*H'`。
+- `--cfg-options`: 对配置文件的修改,参考[学习配置文件](../tutorials/config.md)。
+
+```{note}
+部分数据集在解析标注阶段比较耗时,推荐直接将 `-d, dataset-size` 指定数据集的大小,以节约时间。
+```
+
+你可以使用如下命令来绘制配置文件 `configs/rtmdet/rtmdet_s_syncbn_fast_8xb32-300e_coco.py` 将会使用的学习率变化曲线:
+
+```shell
+python tools/analysis_tools/vis_scheduler.py \
+    configs/rtmdet/rtmdet_s_syncbn_fast_8xb32-300e_coco.py \
+    --dataset-size 118287 \
+    --ngpus 8 \
+    --out-dir ./output
+```
+
+<div align=center><img src="https://user-images.githubusercontent.com/27466624/213091635-d322d2b3-6e28-4755-b871-ef0a89a67a6b.jpg" style=" width: auto; height: 40%; "></div>
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/__init__.py b/mmdetection_practice/third_party/mmyolo/mmyolo/__init__.py
new file mode 100644
index 0000000..13ce4e8
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/__init__.py
@@ -0,0 +1,39 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+import mmcv
+import mmdet
+import mmengine
+from mmengine.utils import digit_version
+
+from .version import __version__, version_info
+
+mmcv_minimum_version = '2.0.0rc4'
+mmcv_maximum_version = '2.1.0'
+mmcv_version = digit_version(mmcv.__version__)
+
+mmengine_minimum_version = '0.7.1'
+mmengine_maximum_version = '1.0.0'
+mmengine_version = digit_version(mmengine.__version__)
+
+mmdet_minimum_version = '3.0.0'
+mmdet_maximum_version = '4.0.0'
+mmdet_version = digit_version(mmdet.__version__)
+
+
+assert (mmcv_version >= digit_version(mmcv_minimum_version)
+        and mmcv_version <= digit_version(mmcv_maximum_version)), \
+    f'MMCV=={mmcv.__version__} is used but incompatible. ' \
+    f'Please install mmcv>={mmcv_minimum_version}, <{mmcv_maximum_version}.'
+
+assert (mmengine_version >= digit_version(mmengine_minimum_version)
+        and mmengine_version < digit_version(mmengine_maximum_version)), \
+    f'MMEngine=={mmengine.__version__} is used but incompatible. ' \
+    f'Please install mmengine>={mmengine_minimum_version}, ' \
+    f'<{mmengine_maximum_version}.'
+
+assert (mmdet_version >= digit_version(mmdet_minimum_version)
+        and mmdet_version < digit_version(mmdet_maximum_version)), \
+    f'MMDetection=={mmdet.__version__} is used but incompatible. ' \
+    f'Please install mmdet>={mmdet_minimum_version}, ' \
+    f'<{mmdet_maximum_version}.'
+
+__all__ = ['__version__', 'version_info', 'digit_version']
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/datasets/__init__.py b/mmdetection_practice/third_party/mmyolo/mmyolo/datasets/__init__.py
new file mode 100644
index 0000000..9db4390
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/datasets/__init__.py
@@ -0,0 +1,14 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from .pose_coco import PoseCocoDataset
+from .transforms import *  # noqa: F401,F403
+from .utils import BatchShapePolicy, yolov5_collate
+from .yolov5_coco import YOLOv5CocoDataset
+from .yolov5_crowdhuman import YOLOv5CrowdHumanDataset
+from .yolov5_dota import YOLOv5DOTADataset
+from .yolov5_voc import YOLOv5VOCDataset
+
+__all__ = [
+    'YOLOv5CocoDataset', 'YOLOv5VOCDataset', 'BatchShapePolicy',
+    'yolov5_collate', 'YOLOv5CrowdHumanDataset', 'YOLOv5DOTADataset',
+    'PoseCocoDataset'
+]
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/datasets/pose_coco.py b/mmdetection_practice/third_party/mmyolo/mmyolo/datasets/pose_coco.py
new file mode 100644
index 0000000..b17f983
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/datasets/pose_coco.py
@@ -0,0 +1,30 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from typing import Any
+
+from mmengine.dataset import force_full_init
+
+try:
+    from mmpose.datasets import CocoDataset as MMPoseCocoDataset
+except ImportError:
+    MMPoseCocoDataset = object
+
+from ..registry import DATASETS
+
+
+@DATASETS.register_module()
+class PoseCocoDataset(MMPoseCocoDataset):
+
+    METAINFO: dict = dict(from_file='configs/_base_/pose/coco.py')
+
+    def __init__(self, *args, **kwargs):
+        if MMPoseCocoDataset is object:
+            raise ImportError(
+                'Please run "mim install -r requirements/mmpose.txt" '
+                'to install mmpose first for PoseCocoDataset.')
+        super().__init__(*args, **kwargs)
+
+    @force_full_init
+    def prepare_data(self, idx) -> Any:
+        data_info = self.get_data_info(idx)
+        data_info['dataset'] = self
+        return self.pipeline(data_info)
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/datasets/transforms/__init__.py b/mmdetection_practice/third_party/mmyolo/mmyolo/datasets/transforms/__init__.py
new file mode 100644
index 0000000..7cdcf86
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/datasets/transforms/__init__.py
@@ -0,0 +1,18 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from .formatting import PackDetInputs
+from .mix_img_transforms import Mosaic, Mosaic9, YOLOv5MixUp, YOLOXMixUp
+from .transforms import (FilterAnnotations, LetterResize, LoadAnnotations,
+                         Polygon2Mask, PPYOLOERandomCrop, PPYOLOERandomDistort,
+                         RandomAffine, RandomFlip, RegularizeRotatedBox,
+                         RemoveDataElement, Resize, YOLOv5CopyPaste,
+                         YOLOv5HSVRandomAug, YOLOv5KeepRatioResize,
+                         YOLOv5RandomAffine)
+
+__all__ = [
+    'YOLOv5KeepRatioResize', 'LetterResize', 'Mosaic', 'YOLOXMixUp',
+    'YOLOv5MixUp', 'YOLOv5HSVRandomAug', 'LoadAnnotations',
+    'YOLOv5RandomAffine', 'PPYOLOERandomDistort', 'PPYOLOERandomCrop',
+    'Mosaic9', 'YOLOv5CopyPaste', 'RemoveDataElement', 'RegularizeRotatedBox',
+    'Polygon2Mask', 'PackDetInputs', 'RandomAffine', 'RandomFlip', 'Resize',
+    'FilterAnnotations'
+]
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/datasets/transforms/formatting.py b/mmdetection_practice/third_party/mmyolo/mmyolo/datasets/transforms/formatting.py
new file mode 100644
index 0000000..07eb012
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/datasets/transforms/formatting.py
@@ -0,0 +1,113 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+import numpy as np
+from mmcv.transforms import to_tensor
+from mmdet.datasets.transforms import PackDetInputs as MMDET_PackDetInputs
+from mmdet.structures import DetDataSample
+from mmdet.structures.bbox import BaseBoxes
+from mmengine.structures import InstanceData, PixelData
+
+from mmyolo.registry import TRANSFORMS
+
+
+@TRANSFORMS.register_module()
+class PackDetInputs(MMDET_PackDetInputs):
+    """Pack the inputs data for the detection / semantic segmentation /
+    panoptic segmentation.
+
+    Compared to mmdet, we just add the `gt_panoptic_seg` field and logic.
+    """
+    mapping_table = {
+        'gt_bboxes': 'bboxes',
+        'gt_bboxes_labels': 'labels',
+        'gt_masks': 'masks',
+        'gt_keypoints': 'keypoints',
+        'gt_keypoints_visible': 'keypoints_visible'
+    }
+
+    def transform(self, results: dict) -> dict:
+        """Method to pack the input data.
+        Args:
+            results (dict): Result dict from the data pipeline.
+        Returns:
+            dict:
+            - 'inputs' (obj:`torch.Tensor`): The forward data of models.
+            - 'data_sample' (obj:`DetDataSample`): The annotation info of the
+                sample.
+        """
+        packed_results = dict()
+        if 'img' in results:
+            img = results['img']
+            if len(img.shape) < 3:
+                img = np.expand_dims(img, -1)
+            # To improve the computational speed by by 3-5 times, apply:
+            # If image is not contiguous, use
+            # `numpy.transpose()` followed by `numpy.ascontiguousarray()`
+            # If image is already contiguous, use
+            # `torch.permute()` followed by `torch.contiguous()`
+            # Refer to https://github.com/open-mmlab/mmdetection/pull/9533
+            # for more details
+            if not img.flags.c_contiguous:
+                img = np.ascontiguousarray(img.transpose(2, 0, 1))
+                img = to_tensor(img)
+            else:
+                img = to_tensor(img).permute(2, 0, 1).contiguous()
+
+            packed_results['inputs'] = img
+
+        if 'gt_ignore_flags' in results:
+            valid_idx = np.where(results['gt_ignore_flags'] == 0)[0]
+            ignore_idx = np.where(results['gt_ignore_flags'] == 1)[0]
+        if 'gt_keypoints' in results:
+            results['gt_keypoints_visible'] = results[
+                'gt_keypoints'].keypoints_visible
+            results['gt_keypoints'] = results['gt_keypoints'].keypoints
+
+        data_sample = DetDataSample()
+        instance_data = InstanceData()
+        ignore_instance_data = InstanceData()
+
+        for key in self.mapping_table.keys():
+            if key not in results:
+                continue
+            if key == 'gt_masks' or isinstance(results[key], BaseBoxes):
+                if 'gt_ignore_flags' in results:
+                    instance_data[
+                        self.mapping_table[key]] = results[key][valid_idx]
+                    ignore_instance_data[
+                        self.mapping_table[key]] = results[key][ignore_idx]
+                else:
+                    instance_data[self.mapping_table[key]] = results[key]
+            else:
+                if 'gt_ignore_flags' in results:
+                    instance_data[self.mapping_table[key]] = to_tensor(
+                        results[key][valid_idx])
+                    ignore_instance_data[self.mapping_table[key]] = to_tensor(
+                        results[key][ignore_idx])
+                else:
+                    instance_data[self.mapping_table[key]] = to_tensor(
+                        results[key])
+        data_sample.gt_instances = instance_data
+        data_sample.ignored_instances = ignore_instance_data
+
+        if 'gt_seg_map' in results:
+            gt_sem_seg_data = dict(
+                sem_seg=to_tensor(results['gt_seg_map'][None, ...].copy()))
+            data_sample.gt_sem_seg = PixelData(**gt_sem_seg_data)
+
+        # In order to unify the support for the overlap mask annotations
+        # i.e. mask overlap annotations in (h,w) format,
+        # we use the gt_panoptic_seg field to unify the modeling
+        if 'gt_panoptic_seg' in results:
+            data_sample.gt_panoptic_seg = PixelData(
+                pan_seg=results['gt_panoptic_seg'])
+
+        img_meta = {}
+        for key in self.meta_keys:
+            assert key in results, f'`{key}` is not found in `results`, ' \
+                                   f'the valid keys are {list(results)}.'
+            img_meta[key] = results[key]
+
+        data_sample.set_metainfo(img_meta)
+        packed_results['data_samples'] = data_sample
+
+        return packed_results
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/datasets/transforms/keypoint_structure.py b/mmdetection_practice/third_party/mmyolo/mmyolo/datasets/transforms/keypoint_structure.py
new file mode 100644
index 0000000..7b8402b
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/datasets/transforms/keypoint_structure.py
@@ -0,0 +1,248 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from abc import ABCMeta
+from copy import deepcopy
+from typing import List, Optional, Sequence, Tuple, Type, TypeVar, Union
+
+import numpy as np
+import torch
+from torch import Tensor
+
+DeviceType = Union[str, torch.device]
+T = TypeVar('T')
+IndexType = Union[slice, int, list, torch.LongTensor, torch.cuda.LongTensor,
+                  torch.BoolTensor, torch.cuda.BoolTensor, np.ndarray]
+
+
+class Keypoints(metaclass=ABCMeta):
+    """The Keypoints class is for keypoints representation.
+
+    Args:
+        keypoints (Tensor or np.ndarray): The keypoint data with shape of
+            (N, K, 2).
+        keypoints_visible (Tensor or np.ndarray): The visibility of keypoints
+            with shape of (N, K).
+        device (str or torch.device, Optional): device of keypoints.
+            Default to None.
+        clone (bool): Whether clone ``keypoints`` or not. Defaults to True.
+        flip_indices (list, Optional): The indices of keypoints when the
+            images is flipped. Defaults to None.
+
+    Notes:
+        N: the number of instances.
+        K: the number of keypoints.
+    """
+
+    def __init__(self,
+                 keypoints: Union[Tensor, np.ndarray],
+                 keypoints_visible: Union[Tensor, np.ndarray],
+                 device: Optional[DeviceType] = None,
+                 clone: bool = True,
+                 flip_indices: Optional[List] = None) -> None:
+
+        assert len(keypoints_visible) == len(keypoints)
+        assert keypoints.ndim == 3
+        assert keypoints_visible.ndim == 2
+
+        keypoints = torch.as_tensor(keypoints)
+        keypoints_visible = torch.as_tensor(keypoints_visible)
+
+        if device is not None:
+            keypoints = keypoints.to(device=device)
+            keypoints_visible = keypoints_visible.to(device=device)
+
+        if clone:
+            keypoints = keypoints.clone()
+            keypoints_visible = keypoints_visible.clone()
+
+        self.keypoints = keypoints
+        self.keypoints_visible = keypoints_visible
+        self.flip_indices = flip_indices
+
+    def flip_(self,
+              img_shape: Tuple[int, int],
+              direction: str = 'horizontal') -> None:
+        """Flip boxes & kpts horizontally in-place.
+
+        Args:
+            img_shape (Tuple[int, int]): A tuple of image height and width.
+            direction (str): Flip direction, options are "horizontal",
+                "vertical" and "diagonal". Defaults to "horizontal"
+        """
+        assert direction == 'horizontal'
+        self.keypoints[..., 0] = img_shape[1] - self.keypoints[..., 0]
+        self.keypoints = self.keypoints[:, self.flip_indices]
+        self.keypoints_visible = self.keypoints_visible[:, self.flip_indices]
+
+    def translate_(self, distances: Tuple[float, float]) -> None:
+        """Translate boxes and keypoints in-place.
+
+        Args:
+            distances (Tuple[float, float]): translate distances. The first
+                is horizontal distance and the second is vertical distance.
+        """
+        assert len(distances) == 2
+        distances = self.keypoints.new_tensor(distances).reshape(1, 1, 2)
+        self.keypoints = self.keypoints + distances
+
+    def rescale_(self, scale_factor: Tuple[float, float]) -> None:
+        """Rescale boxes & keypoints w.r.t. rescale_factor in-place.
+
+        Note:
+            Both ``rescale_`` and ``resize_`` will enlarge or shrink boxes
+            w.r.t ``scale_facotr``. The difference is that ``resize_`` only
+            changes the width and the height of boxes, but ``rescale_`` also
+            rescales the box centers simultaneously.
+
+        Args:
+            scale_factor (Tuple[float, float]): factors for scaling boxes.
+                The length should be 2.
+        """
+        assert len(scale_factor) == 2
+
+        scale_factor = self.keypoints.new_tensor(scale_factor).reshape(1, 1, 2)
+        self.keypoints = self.keypoints * scale_factor
+
+    def clip_(self, img_shape: Tuple[int, int]) -> None:
+        """Clip bounding boxes and set invisible keypoints outside the image
+        boundary in-place.
+
+        Args:
+            img_shape (Tuple[int, int]): A tuple of image height and width.
+        """
+
+        kpt_outside = torch.logical_or(
+            torch.logical_or(self.keypoints[..., 0] < 0,
+                             self.keypoints[..., 1] < 0),
+            torch.logical_or(self.keypoints[..., 0] > img_shape[1],
+                             self.keypoints[..., 1] > img_shape[0]))
+        self.keypoints_visible[kpt_outside] *= 0
+
+    def project_(self, homography_matrix: Union[Tensor, np.ndarray]) -> None:
+        """Geometrically transform bounding boxes and keypoints in-place using
+        a homography matrix.
+
+        Args:
+            homography_matrix (Tensor or np.ndarray): A 3x3 tensor or ndarray
+                representing the homography matrix for the transformation.
+        """
+        keypoints = self.keypoints
+        if isinstance(homography_matrix, np.ndarray):
+            homography_matrix = keypoints.new_tensor(homography_matrix)
+
+        # Convert keypoints to homogeneous coordinates
+        keypoints = torch.cat([
+            self.keypoints,
+            self.keypoints.new_ones(*self.keypoints.shape[:-1], 1)
+        ],
+                              dim=-1)
+
+        # Transpose keypoints for matrix multiplication
+        keypoints_T = torch.transpose(keypoints, -1, 0).contiguous().flatten(1)
+
+        # Apply homography matrix to corners and keypoints
+        keypoints_T = torch.matmul(homography_matrix, keypoints_T)
+
+        # Transpose back to original shape
+        keypoints_T = keypoints_T.reshape(3, self.keypoints.shape[1], -1)
+        keypoints = torch.transpose(keypoints_T, -1, 0).contiguous()
+
+        # Convert corners and keypoints back to non-homogeneous coordinates
+        keypoints = keypoints[..., :2] / keypoints[..., 2:3]
+
+        # Convert corners back to bounding boxes and update object attributes
+        self.keypoints = keypoints
+
+    @classmethod
+    def cat(cls: Type[T], kps_list: Sequence[T], dim: int = 0) -> T:
+        """Cancatenates an instance list into one single instance. Similar to
+        ``torch.cat``.
+
+        Args:
+            box_list (Sequence[T]): A sequence of instances.
+            dim (int): The dimension over which the box and keypoint are
+                concatenated. Defaults to 0.
+
+        Returns:
+            T: Concatenated instance.
+        """
+        assert isinstance(kps_list, Sequence)
+        if len(kps_list) == 0:
+            raise ValueError('kps_list should not be a empty list.')
+
+        assert dim == 0
+        assert all(isinstance(keypoints, cls) for keypoints in kps_list)
+
+        th_kpt_list = torch.cat(
+            [keypoints.keypoints for keypoints in kps_list], dim=dim)
+        th_kpt_vis_list = torch.cat(
+            [keypoints.keypoints_visible for keypoints in kps_list], dim=dim)
+        flip_indices = kps_list[0].flip_indices
+        return cls(
+            th_kpt_list,
+            th_kpt_vis_list,
+            clone=False,
+            flip_indices=flip_indices)
+
+    def __getitem__(self: T, index: IndexType) -> T:
+        """Rewrite getitem to protect the last dimension shape."""
+        if isinstance(index, np.ndarray):
+            index = torch.as_tensor(index, device=self.device)
+        if isinstance(index, Tensor) and index.dtype == torch.bool:
+            assert index.dim() < self.keypoints.dim() - 1
+        elif isinstance(index, tuple):
+            assert len(index) < self.keypoints.dim() - 1
+            # `Ellipsis`(...) is commonly used in index like [None, ...].
+            # When `Ellipsis` is in index, it must be the last item.
+            if Ellipsis in index:
+                assert index[-1] is Ellipsis
+
+        keypoints = self.keypoints[index]
+        keypoints_visible = self.keypoints_visible[index]
+        if self.keypoints.dim() == 2:
+            keypoints = keypoints.reshape(1, -1, 2)
+            keypoints_visible = keypoints_visible.reshape(1, -1)
+        return type(self)(
+            keypoints,
+            keypoints_visible,
+            flip_indices=self.flip_indices,
+            clone=False)
+
+    def __repr__(self) -> str:
+        """Return a strings that describes the object."""
+        return self.__class__.__name__ + '(\n' + str(self.keypoints) + ')'
+
+    @property
+    def num_keypoints(self) -> Tensor:
+        """Compute the number of visible keypoints for each object."""
+        return self.keypoints_visible.sum(dim=1).int()
+
+    def __deepcopy__(self, memo):
+        """Only clone the tensors when applying deepcopy."""
+        cls = self.__class__
+        other = cls.__new__(cls)
+        memo[id(self)] = other
+        other.keypoints = self.keypoints.clone()
+        other.keypoints_visible = self.keypoints_visible.clone()
+        other.flip_indices = deepcopy(self.flip_indices)
+        return other
+
+    def clone(self: T) -> T:
+        """Reload ``clone`` for tensors."""
+        return type(self)(
+            self.keypoints,
+            self.keypoints_visible,
+            flip_indices=self.flip_indices,
+            clone=True)
+
+    def to(self: T, *args, **kwargs) -> T:
+        """Reload ``to`` for tensors."""
+        return type(self)(
+            self.keypoints.to(*args, **kwargs),
+            self.keypoints_visible.to(*args, **kwargs),
+            flip_indices=self.flip_indices,
+            clone=False)
+
+    @property
+    def device(self) -> torch.device:
+        """Reload ``device`` from self.tensor."""
+        return self.keypoints.device
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/datasets/transforms/mix_img_transforms.py b/mmdetection_practice/third_party/mmyolo/mmyolo/datasets/transforms/mix_img_transforms.py
new file mode 100644
index 0000000..29e4a40
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/datasets/transforms/mix_img_transforms.py
@@ -0,0 +1,1191 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+import collections
+import copy
+from abc import ABCMeta, abstractmethod
+from typing import Optional, Sequence, Tuple, Union
+
+import mmcv
+import numpy as np
+from mmcv.transforms import BaseTransform
+from mmdet.structures.bbox import autocast_box_type
+from mmengine.dataset import BaseDataset
+from mmengine.dataset.base_dataset import Compose
+from numpy import random
+
+from mmyolo.registry import TRANSFORMS
+
+
+class BaseMixImageTransform(BaseTransform, metaclass=ABCMeta):
+    """A Base Transform of multiple images mixed.
+
+    Suitable for training on multiple images mixed data augmentation like
+    mosaic and mixup.
+
+    Cached mosaic transform will random select images from the cache
+    and combine them into one output image if use_cached is True.
+
+    Args:
+        pre_transform(Sequence[str]): Sequence of transform object or
+            config dict to be composed. Defaults to None.
+        prob(float): The transformation probability. Defaults to 1.0.
+        use_cached (bool): Whether to use cache. Defaults to False.
+        max_cached_images (int): The maximum length of the cache. The larger
+            the cache, the stronger the randomness of this transform. As a
+            rule of thumb, providing 10 caches for each image suffices for
+            randomness. Defaults to 40.
+        random_pop (bool): Whether to randomly pop a result from the cache
+            when the cache is full. If set to False, use FIFO popping method.
+            Defaults to True.
+        max_refetch (int): The maximum number of retry iterations for getting
+            valid results from the pipeline. If the number of iterations is
+            greater than `max_refetch`, but results is still None, then the
+            iteration is terminated and raise the error. Defaults to 15.
+    """
+
+    def __init__(self,
+                 pre_transform: Optional[Sequence[str]] = None,
+                 prob: float = 1.0,
+                 use_cached: bool = False,
+                 max_cached_images: int = 40,
+                 random_pop: bool = True,
+                 max_refetch: int = 15):
+
+        self.max_refetch = max_refetch
+        self.prob = prob
+
+        self.use_cached = use_cached
+        self.max_cached_images = max_cached_images
+        self.random_pop = random_pop
+        self.results_cache = []
+
+        if pre_transform is None:
+            self.pre_transform = None
+        else:
+            self.pre_transform = Compose(pre_transform)
+
+    @abstractmethod
+    def get_indexes(self, dataset: Union[BaseDataset,
+                                         list]) -> Union[list, int]:
+        """Call function to collect indexes.
+
+        Args:
+            dataset (:obj:`Dataset` or list): The dataset or cached list.
+
+        Returns:
+            list or int: indexes.
+        """
+        pass
+
+    @abstractmethod
+    def mix_img_transform(self, results: dict) -> dict:
+        """Mixed image data transformation.
+
+        Args:
+            results (dict): Result dict.
+
+        Returns:
+            results (dict): Updated result dict.
+        """
+        pass
+
+    @autocast_box_type()
+    def transform(self, results: dict) -> dict:
+        """Data augmentation function.
+
+        The transform steps are as follows:
+        1. Randomly generate index list of other images.
+        2. Before Mosaic or MixUp need to go through the necessary
+            pre_transform, such as MixUp' pre_transform pipeline
+            include: 'LoadImageFromFile','LoadAnnotations',
+            'Mosaic' and 'RandomAffine'.
+        3. Use mix_img_transform function to implement specific
+            mix operations.
+
+        Args:
+            results (dict): Result dict.
+
+        Returns:
+            results (dict): Updated result dict.
+        """
+
+        if random.uniform(0, 1) > self.prob:
+            return results
+
+        if self.use_cached:
+            # Be careful: deep copying can be very time-consuming
+            # if results includes dataset.
+            dataset = results.pop('dataset', None)
+            self.results_cache.append(copy.deepcopy(results))
+            if len(self.results_cache) > self.max_cached_images:
+                if self.random_pop:
+                    index = random.randint(0, len(self.results_cache) - 1)
+                else:
+                    index = 0
+                self.results_cache.pop(index)
+
+            if len(self.results_cache) <= 4:
+                return results
+        else:
+            assert 'dataset' in results
+            # Be careful: deep copying can be very time-consuming
+            # if results includes dataset.
+            dataset = results.pop('dataset', None)
+
+        for _ in range(self.max_refetch):
+            # get index of one or three other images
+            if self.use_cached:
+                indexes = self.get_indexes(self.results_cache)
+            else:
+                indexes = self.get_indexes(dataset)
+
+            if not isinstance(indexes, collections.abc.Sequence):
+                indexes = [indexes]
+
+            if self.use_cached:
+                mix_results = [
+                    copy.deepcopy(self.results_cache[i]) for i in indexes
+                ]
+            else:
+                # get images information will be used for Mosaic or MixUp
+                mix_results = [
+                    copy.deepcopy(dataset.get_data_info(index))
+                    for index in indexes
+                ]
+
+            if self.pre_transform is not None:
+                for i, data in enumerate(mix_results):
+                    # pre_transform may also require dataset
+                    data.update({'dataset': dataset})
+                    # before Mosaic or MixUp need to go through
+                    # the necessary pre_transform
+                    _results = self.pre_transform(data)
+                    _results.pop('dataset')
+                    mix_results[i] = _results
+
+            if None not in mix_results:
+                results['mix_results'] = mix_results
+                break
+            print('Repeated calculation')
+        else:
+            raise RuntimeError(
+                'The loading pipeline of the original dataset'
+                ' always return None. Please check the correctness '
+                'of the dataset and its pipeline.')
+
+        # Mosaic or MixUp
+        results = self.mix_img_transform(results)
+
+        if 'mix_results' in results:
+            results.pop('mix_results')
+        results['dataset'] = dataset
+
+        return results
+
+
+@TRANSFORMS.register_module()
+class Mosaic(BaseMixImageTransform):
+    """Mosaic augmentation.
+
+    Given 4 images, mosaic transform combines them into
+    one output image. The output image is composed of the parts from each sub-
+    image.
+
+    .. code:: text
+
+                        mosaic transform
+                           center_x
+                +------------------------------+
+                |       pad        |           |
+                |      +-----------+    pad    |
+                |      |           |           |
+                |      |  image1   +-----------+
+                |      |           |           |
+                |      |           |   image2  |
+     center_y   |----+-+-----------+-----------+
+                |    |   cropped   |           |
+                |pad |   image3    |   image4  |
+                |    |             |           |
+                +----|-------------+-----------+
+                     |             |
+                     +-------------+
+
+     The mosaic transform steps are as follows:
+
+         1. Choose the mosaic center as the intersections of 4 images
+         2. Get the left top image according to the index, and randomly
+            sample another 3 images from the custom dataset.
+         3. Sub image will be cropped if image is larger than mosaic patch
+
+    Required Keys:
+
+    - img
+    - gt_bboxes (BaseBoxes[torch.float32]) (optional)
+    - gt_bboxes_labels (np.int64) (optional)
+    - gt_ignore_flags (bool) (optional)
+    - mix_results (List[dict])
+
+    Modified Keys:
+
+    - img
+    - img_shape
+    - gt_bboxes (optional)
+    - gt_bboxes_labels (optional)
+    - gt_ignore_flags (optional)
+
+    Args:
+        img_scale (Sequence[int]): Image size after mosaic pipeline of single
+            image. The shape order should be (width, height).
+            Defaults to (640, 640).
+        center_ratio_range (Sequence[float]): Center ratio range of mosaic
+            output. Defaults to (0.5, 1.5).
+        bbox_clip_border (bool, optional): Whether to clip the objects outside
+            the border of the image. In some dataset like MOT17, the gt bboxes
+            are allowed to cross the border of images. Therefore, we don't
+            need to clip the gt bboxes in these cases. Defaults to True.
+        pad_val (int): Pad value. Defaults to 114.
+        pre_transform(Sequence[dict]): Sequence of transform object or
+            config dict to be composed.
+        prob (float): Probability of applying this transformation.
+            Defaults to 1.0.
+        use_cached (bool): Whether to use cache. Defaults to False.
+        max_cached_images (int): The maximum length of the cache. The larger
+            the cache, the stronger the randomness of this transform. As a
+            rule of thumb, providing 10 caches for each image suffices for
+            randomness. Defaults to 40.
+        random_pop (bool): Whether to randomly pop a result from the cache
+            when the cache is full. If set to False, use FIFO popping method.
+            Defaults to True.
+        max_refetch (int): The maximum number of retry iterations for getting
+            valid results from the pipeline. If the number of iterations is
+            greater than `max_refetch`, but results is still None, then the
+            iteration is terminated and raise the error. Defaults to 15.
+    """
+
+    def __init__(self,
+                 img_scale: Tuple[int, int] = (640, 640),
+                 center_ratio_range: Tuple[float, float] = (0.5, 1.5),
+                 bbox_clip_border: bool = True,
+                 pad_val: float = 114.0,
+                 pre_transform: Sequence[dict] = None,
+                 prob: float = 1.0,
+                 use_cached: bool = False,
+                 max_cached_images: int = 40,
+                 random_pop: bool = True,
+                 max_refetch: int = 15):
+        assert isinstance(img_scale, tuple)
+        assert 0 <= prob <= 1.0, 'The probability should be in range [0,1]. ' \
+                                 f'got {prob}.'
+        if use_cached:
+            assert max_cached_images >= 4, 'The length of cache must >= 4, ' \
+                                           f'but got {max_cached_images}.'
+
+        super().__init__(
+            pre_transform=pre_transform,
+            prob=prob,
+            use_cached=use_cached,
+            max_cached_images=max_cached_images,
+            random_pop=random_pop,
+            max_refetch=max_refetch)
+
+        self.img_scale = img_scale
+        self.center_ratio_range = center_ratio_range
+        self.bbox_clip_border = bbox_clip_border
+        self.pad_val = pad_val
+
+    def get_indexes(self, dataset: Union[BaseDataset, list]) -> list:
+        """Call function to collect indexes.
+
+        Args:
+            dataset (:obj:`Dataset` or list): The dataset or cached list.
+
+        Returns:
+            list: indexes.
+        """
+        indexes = [random.randint(0, len(dataset)) for _ in range(3)]
+        return indexes
+
+    def mix_img_transform(self, results: dict) -> dict:
+        """Mixed image data transformation.
+
+        Args:
+            results (dict): Result dict.
+
+        Returns:
+            results (dict): Updated result dict.
+        """
+        assert 'mix_results' in results
+        mosaic_bboxes = []
+        mosaic_bboxes_labels = []
+        mosaic_ignore_flags = []
+        mosaic_masks = []
+        mosaic_kps = []
+        with_mask = True if 'gt_masks' in results else False
+        with_kps = True if 'gt_keypoints' in results else False
+        # self.img_scale is wh format
+        img_scale_w, img_scale_h = self.img_scale
+
+        if len(results['img'].shape) == 3:
+            mosaic_img = np.full(
+                (int(img_scale_h * 2), int(img_scale_w * 2), 3),
+                self.pad_val,
+                dtype=results['img'].dtype)
+        else:
+            mosaic_img = np.full((int(img_scale_h * 2), int(img_scale_w * 2)),
+                                 self.pad_val,
+                                 dtype=results['img'].dtype)
+
+        # mosaic center x, y
+        center_x = int(random.uniform(*self.center_ratio_range) * img_scale_w)
+        center_y = int(random.uniform(*self.center_ratio_range) * img_scale_h)
+        center_position = (center_x, center_y)
+
+        loc_strs = ('top_left', 'top_right', 'bottom_left', 'bottom_right')
+        for i, loc in enumerate(loc_strs):
+            if loc == 'top_left':
+                results_patch = results
+            else:
+                results_patch = results['mix_results'][i - 1]
+
+            img_i = results_patch['img']
+            h_i, w_i = img_i.shape[:2]
+            # keep_ratio resize
+            scale_ratio_i = min(img_scale_h / h_i, img_scale_w / w_i)
+            img_i = mmcv.imresize(
+                img_i, (int(w_i * scale_ratio_i), int(h_i * scale_ratio_i)))
+
+            # compute the combine parameters
+            paste_coord, crop_coord = self._mosaic_combine(
+                loc, center_position, img_i.shape[:2][::-1])
+            x1_p, y1_p, x2_p, y2_p = paste_coord
+            x1_c, y1_c, x2_c, y2_c = crop_coord
+
+            # crop and paste image
+            mosaic_img[y1_p:y2_p, x1_p:x2_p] = img_i[y1_c:y2_c, x1_c:x2_c]
+
+            # adjust coordinate
+            gt_bboxes_i = results_patch['gt_bboxes']
+            gt_bboxes_labels_i = results_patch['gt_bboxes_labels']
+            gt_ignore_flags_i = results_patch['gt_ignore_flags']
+
+            padw = x1_p - x1_c
+            padh = y1_p - y1_c
+            gt_bboxes_i.rescale_([scale_ratio_i, scale_ratio_i])
+            gt_bboxes_i.translate_([padw, padh])
+            mosaic_bboxes.append(gt_bboxes_i)
+            mosaic_bboxes_labels.append(gt_bboxes_labels_i)
+            mosaic_ignore_flags.append(gt_ignore_flags_i)
+            if with_mask and results_patch.get('gt_masks', None) is not None:
+                gt_masks_i = results_patch['gt_masks']
+                gt_masks_i = gt_masks_i.resize(img_i.shape[:2])
+                gt_masks_i = gt_masks_i.translate(
+                    out_shape=(int(self.img_scale[0] * 2),
+                               int(self.img_scale[1] * 2)),
+                    offset=padw,
+                    direction='horizontal')
+                gt_masks_i = gt_masks_i.translate(
+                    out_shape=(int(self.img_scale[0] * 2),
+                               int(self.img_scale[1] * 2)),
+                    offset=padh,
+                    direction='vertical')
+                mosaic_masks.append(gt_masks_i)
+            if with_kps and results_patch.get('gt_keypoints',
+                                              None) is not None:
+                gt_kps_i = results_patch['gt_keypoints']
+                gt_kps_i.rescale_([scale_ratio_i, scale_ratio_i])
+                gt_kps_i.translate_([padw, padh])
+                mosaic_kps.append(gt_kps_i)
+
+        mosaic_bboxes = mosaic_bboxes[0].cat(mosaic_bboxes, 0)
+        mosaic_bboxes_labels = np.concatenate(mosaic_bboxes_labels, 0)
+        mosaic_ignore_flags = np.concatenate(mosaic_ignore_flags, 0)
+
+        if self.bbox_clip_border:
+            mosaic_bboxes.clip_([2 * img_scale_h, 2 * img_scale_w])
+            if with_mask:
+                mosaic_masks = mosaic_masks[0].cat(mosaic_masks)
+                results['gt_masks'] = mosaic_masks
+            if with_kps:
+                mosaic_kps = mosaic_kps[0].cat(mosaic_kps, 0)
+                mosaic_kps.clip_([2 * img_scale_h, 2 * img_scale_w])
+                results['gt_keypoints'] = mosaic_kps
+        else:
+            # remove outside bboxes
+            inside_inds = mosaic_bboxes.is_inside(
+                [2 * img_scale_h, 2 * img_scale_w]).numpy()
+            mosaic_bboxes = mosaic_bboxes[inside_inds]
+            mosaic_bboxes_labels = mosaic_bboxes_labels[inside_inds]
+            mosaic_ignore_flags = mosaic_ignore_flags[inside_inds]
+            if with_mask:
+                mosaic_masks = mosaic_masks[0].cat(mosaic_masks)[inside_inds]
+                results['gt_masks'] = mosaic_masks
+            if with_kps:
+                mosaic_kps = mosaic_kps[0].cat(mosaic_kps, 0)
+                mosaic_kps = mosaic_kps[inside_inds]
+                results['gt_keypoints'] = mosaic_kps
+
+        results['img'] = mosaic_img
+        results['img_shape'] = mosaic_img.shape
+        results['gt_bboxes'] = mosaic_bboxes
+        results['gt_bboxes_labels'] = mosaic_bboxes_labels
+        results['gt_ignore_flags'] = mosaic_ignore_flags
+
+        return results
+
+    def _mosaic_combine(
+            self, loc: str, center_position_xy: Sequence[float],
+            img_shape_wh: Sequence[int]) -> Tuple[Tuple[int], Tuple[int]]:
+        """Calculate global coordinate of mosaic image and local coordinate of
+        cropped sub-image.
+
+        Args:
+            loc (str): Index for the sub-image, loc in ('top_left',
+              'top_right', 'bottom_left', 'bottom_right').
+            center_position_xy (Sequence[float]): Mixing center for 4 images,
+                (x, y).
+            img_shape_wh (Sequence[int]): Width and height of sub-image
+
+        Returns:
+            tuple[tuple[float]]: Corresponding coordinate of pasting and
+                cropping
+                - paste_coord (tuple): paste corner coordinate in mosaic image.
+                - crop_coord (tuple): crop corner coordinate in mosaic image.
+        """
+        assert loc in ('top_left', 'top_right', 'bottom_left', 'bottom_right')
+        if loc == 'top_left':
+            # index0 to top left part of image
+            x1, y1, x2, y2 = max(center_position_xy[0] - img_shape_wh[0], 0), \
+                             max(center_position_xy[1] - img_shape_wh[1], 0), \
+                             center_position_xy[0], \
+                             center_position_xy[1]
+            crop_coord = img_shape_wh[0] - (x2 - x1), img_shape_wh[1] - (
+                y2 - y1), img_shape_wh[0], img_shape_wh[1]
+
+        elif loc == 'top_right':
+            # index1 to top right part of image
+            x1, y1, x2, y2 = center_position_xy[0], \
+                             max(center_position_xy[1] - img_shape_wh[1], 0), \
+                             min(center_position_xy[0] + img_shape_wh[0],
+                                 self.img_scale[0] * 2), \
+                             center_position_xy[1]
+            crop_coord = 0, img_shape_wh[1] - (y2 - y1), min(
+                img_shape_wh[0], x2 - x1), img_shape_wh[1]
+
+        elif loc == 'bottom_left':
+            # index2 to bottom left part of image
+            x1, y1, x2, y2 = max(center_position_xy[0] - img_shape_wh[0], 0), \
+                             center_position_xy[1], \
+                             center_position_xy[0], \
+                             min(self.img_scale[1] * 2, center_position_xy[1] +
+                                 img_shape_wh[1])
+            crop_coord = img_shape_wh[0] - (x2 - x1), 0, img_shape_wh[0], min(
+                y2 - y1, img_shape_wh[1])
+
+        else:
+            # index3 to bottom right part of image
+            x1, y1, x2, y2 = center_position_xy[0], \
+                             center_position_xy[1], \
+                             min(center_position_xy[0] + img_shape_wh[0],
+                                 self.img_scale[0] * 2), \
+                             min(self.img_scale[1] * 2, center_position_xy[1] +
+                                 img_shape_wh[1])
+            crop_coord = 0, 0, min(img_shape_wh[0],
+                                   x2 - x1), min(y2 - y1, img_shape_wh[1])
+
+        paste_coord = x1, y1, x2, y2
+        return paste_coord, crop_coord
+
+    def __repr__(self) -> str:
+        repr_str = self.__class__.__name__
+        repr_str += f'(img_scale={self.img_scale}, '
+        repr_str += f'center_ratio_range={self.center_ratio_range}, '
+        repr_str += f'pad_val={self.pad_val}, '
+        repr_str += f'prob={self.prob})'
+        return repr_str
+
+
+@TRANSFORMS.register_module()
+class Mosaic9(BaseMixImageTransform):
+    """Mosaic9 augmentation.
+
+    Given 9 images, mosaic transform combines them into
+    one output image. The output image is composed of the parts from each sub-
+    image.
+
+    .. code:: text
+
+                +-------------------------------+------------+
+                | pad           |      pad      |            |
+                |    +----------+               |            |
+                |    |          +---------------+  top_right |
+                |    |          |      top      |   image2   |
+                |    | top_left |     image1    |            |
+                |    |  image8  o--------+------+--------+---+
+                |    |          |        |               |   |
+                +----+----------+        |     right     |pad|
+                |               | center |     image3    |   |
+                |     left      | image0 +---------------+---|
+                |    image7     |        |               |   |
+            +---+-----------+---+--------+               |   |
+            |   |  cropped  |            |  bottom_right |pad|
+            |   |bottom_left|            |    image4     |   |
+            |   |  image6   |   bottom   |               |   |
+            +---|-----------+   image5   +---------------+---|
+                |    pad    |            |        pad        |
+                +-----------+------------+-------------------+
+
+     The mosaic transform steps are as follows:
+
+         1. Get the center image according to the index, and randomly
+            sample another 8 images from the custom dataset.
+         2. Randomly offset the image after Mosaic
+
+    Required Keys:
+
+    - img
+    - gt_bboxes (BaseBoxes[torch.float32]) (optional)
+    - gt_bboxes_labels (np.int64) (optional)
+    - gt_ignore_flags (bool) (optional)
+    - mix_results (List[dict])
+
+    Modified Keys:
+
+    - img
+    - img_shape
+    - gt_bboxes (optional)
+    - gt_bboxes_labels (optional)
+    - gt_ignore_flags (optional)
+
+    Args:
+        img_scale (Sequence[int]): Image size after mosaic pipeline of single
+            image. The shape order should be (width, height).
+            Defaults to (640, 640).
+        bbox_clip_border (bool, optional): Whether to clip the objects outside
+            the border of the image. In some dataset like MOT17, the gt bboxes
+            are allowed to cross the border of images. Therefore, we don't
+            need to clip the gt bboxes in these cases. Defaults to True.
+        pad_val (int): Pad value. Defaults to 114.
+        pre_transform(Sequence[dict]): Sequence of transform object or
+            config dict to be composed.
+        prob (float): Probability of applying this transformation.
+            Defaults to 1.0.
+        use_cached (bool): Whether to use cache. Defaults to False.
+        max_cached_images (int): The maximum length of the cache. The larger
+            the cache, the stronger the randomness of this transform. As a
+            rule of thumb, providing 5 caches for each image suffices for
+            randomness. Defaults to 50.
+        random_pop (bool): Whether to randomly pop a result from the cache
+            when the cache is full. If set to False, use FIFO popping method.
+            Defaults to True.
+        max_refetch (int): The maximum number of retry iterations for getting
+            valid results from the pipeline. If the number of iterations is
+            greater than `max_refetch`, but results is still None, then the
+            iteration is terminated and raise the error. Defaults to 15.
+    """
+
+    def __init__(self,
+                 img_scale: Tuple[int, int] = (640, 640),
+                 bbox_clip_border: bool = True,
+                 pad_val: Union[float, int] = 114.0,
+                 pre_transform: Sequence[dict] = None,
+                 prob: float = 1.0,
+                 use_cached: bool = False,
+                 max_cached_images: int = 50,
+                 random_pop: bool = True,
+                 max_refetch: int = 15):
+        assert isinstance(img_scale, tuple)
+        assert 0 <= prob <= 1.0, 'The probability should be in range [0,1]. ' \
+                                 f'got {prob}.'
+        if use_cached:
+            assert max_cached_images >= 9, 'The length of cache must >= 9, ' \
+                                           f'but got {max_cached_images}.'
+
+        super().__init__(
+            pre_transform=pre_transform,
+            prob=prob,
+            use_cached=use_cached,
+            max_cached_images=max_cached_images,
+            random_pop=random_pop,
+            max_refetch=max_refetch)
+
+        self.img_scale = img_scale
+        self.bbox_clip_border = bbox_clip_border
+        self.pad_val = pad_val
+
+        # intermediate variables
+        self._current_img_shape = [0, 0]
+        self._center_img_shape = [0, 0]
+        self._previous_img_shape = [0, 0]
+
+    def get_indexes(self, dataset: Union[BaseDataset, list]) -> list:
+        """Call function to collect indexes.
+
+        Args:
+            dataset (:obj:`Dataset` or list): The dataset or cached list.
+
+        Returns:
+            list: indexes.
+        """
+        indexes = [random.randint(0, len(dataset)) for _ in range(8)]
+        return indexes
+
+    def mix_img_transform(self, results: dict) -> dict:
+        """Mixed image data transformation.
+
+        Args:
+            results (dict): Result dict.
+
+        Returns:
+            results (dict): Updated result dict.
+        """
+        assert 'mix_results' in results
+
+        mosaic_bboxes = []
+        mosaic_bboxes_labels = []
+        mosaic_ignore_flags = []
+
+        img_scale_w, img_scale_h = self.img_scale
+
+        if len(results['img'].shape) == 3:
+            mosaic_img = np.full(
+                (int(img_scale_h * 3), int(img_scale_w * 3), 3),
+                self.pad_val,
+                dtype=results['img'].dtype)
+        else:
+            mosaic_img = np.full((int(img_scale_h * 3), int(img_scale_w * 3)),
+                                 self.pad_val,
+                                 dtype=results['img'].dtype)
+
+        # index = 0 is mean original image
+        # len(results['mix_results']) = 8
+        loc_strs = ('center', 'top', 'top_right', 'right', 'bottom_right',
+                    'bottom', 'bottom_left', 'left', 'top_left')
+
+        results_all = [results, *results['mix_results']]
+        for index, results_patch in enumerate(results_all):
+            img_i = results_patch['img']
+            # keep_ratio resize
+            img_i_h, img_i_w = img_i.shape[:2]
+            scale_ratio_i = min(img_scale_h / img_i_h, img_scale_w / img_i_w)
+            img_i = mmcv.imresize(
+                img_i,
+                (int(img_i_w * scale_ratio_i), int(img_i_h * scale_ratio_i)))
+
+            paste_coord = self._mosaic_combine(loc_strs[index],
+                                               img_i.shape[:2])
+
+            padw, padh = paste_coord[:2]
+            x1, y1, x2, y2 = (max(x, 0) for x in paste_coord)
+            mosaic_img[y1:y2, x1:x2] = img_i[y1 - padh:, x1 - padw:]
+
+            gt_bboxes_i = results_patch['gt_bboxes']
+            gt_bboxes_labels_i = results_patch['gt_bboxes_labels']
+            gt_ignore_flags_i = results_patch['gt_ignore_flags']
+            gt_bboxes_i.rescale_([scale_ratio_i, scale_ratio_i])
+            gt_bboxes_i.translate_([padw, padh])
+
+            mosaic_bboxes.append(gt_bboxes_i)
+            mosaic_bboxes_labels.append(gt_bboxes_labels_i)
+            mosaic_ignore_flags.append(gt_ignore_flags_i)
+
+        # Offset
+        offset_x = int(random.uniform(0, img_scale_w))
+        offset_y = int(random.uniform(0, img_scale_h))
+        mosaic_img = mosaic_img[offset_y:offset_y + 2 * img_scale_h,
+                                offset_x:offset_x + 2 * img_scale_w]
+
+        mosaic_bboxes = mosaic_bboxes[0].cat(mosaic_bboxes, 0)
+        mosaic_bboxes.translate_([-offset_x, -offset_y])
+        mosaic_bboxes_labels = np.concatenate(mosaic_bboxes_labels, 0)
+        mosaic_ignore_flags = np.concatenate(mosaic_ignore_flags, 0)
+
+        if self.bbox_clip_border:
+            mosaic_bboxes.clip_([2 * img_scale_h, 2 * img_scale_w])
+        else:
+            # remove outside bboxes
+            inside_inds = mosaic_bboxes.is_inside(
+                [2 * img_scale_h, 2 * img_scale_w]).numpy()
+            mosaic_bboxes = mosaic_bboxes[inside_inds]
+            mosaic_bboxes_labels = mosaic_bboxes_labels[inside_inds]
+            mosaic_ignore_flags = mosaic_ignore_flags[inside_inds]
+
+        results['img'] = mosaic_img
+        results['img_shape'] = mosaic_img.shape
+        results['gt_bboxes'] = mosaic_bboxes
+        results['gt_bboxes_labels'] = mosaic_bboxes_labels
+        results['gt_ignore_flags'] = mosaic_ignore_flags
+        return results
+
+    def _mosaic_combine(self, loc: str,
+                        img_shape_hw: Tuple[int, int]) -> Tuple[int, ...]:
+        """Calculate global coordinate of mosaic image.
+
+        Args:
+            loc (str): Index for the sub-image.
+            img_shape_hw (Sequence[int]): Height and width of sub-image
+
+        Returns:
+             paste_coord (tuple): paste corner coordinate in mosaic image.
+        """
+        assert loc in ('center', 'top', 'top_right', 'right', 'bottom_right',
+                       'bottom', 'bottom_left', 'left', 'top_left')
+
+        img_scale_w, img_scale_h = self.img_scale
+
+        self._current_img_shape = img_shape_hw
+        current_img_h, current_img_w = self._current_img_shape
+        previous_img_h, previous_img_w = self._previous_img_shape
+        center_img_h, center_img_w = self._center_img_shape
+
+        if loc == 'center':
+            self._center_img_shape = self._current_img_shape
+            #  xmin, ymin, xmax, ymax
+            paste_coord = img_scale_w, \
+                img_scale_h, \
+                img_scale_w + current_img_w, \
+                img_scale_h + current_img_h
+        elif loc == 'top':
+            paste_coord = img_scale_w, \
+                          img_scale_h - current_img_h, \
+                          img_scale_w + current_img_w, \
+                          img_scale_h
+        elif loc == 'top_right':
+            paste_coord = img_scale_w + previous_img_w, \
+                          img_scale_h - current_img_h, \
+                          img_scale_w + previous_img_w + current_img_w, \
+                          img_scale_h
+        elif loc == 'right':
+            paste_coord = img_scale_w + center_img_w, \
+                          img_scale_h, \
+                          img_scale_w + center_img_w + current_img_w, \
+                          img_scale_h + current_img_h
+        elif loc == 'bottom_right':
+            paste_coord = img_scale_w + center_img_w, \
+                          img_scale_h + previous_img_h, \
+                          img_scale_w + center_img_w + current_img_w, \
+                          img_scale_h + previous_img_h + current_img_h
+        elif loc == 'bottom':
+            paste_coord = img_scale_w + center_img_w - current_img_w, \
+                          img_scale_h + center_img_h, \
+                          img_scale_w + center_img_w, \
+                          img_scale_h + center_img_h + current_img_h
+        elif loc == 'bottom_left':
+            paste_coord = img_scale_w + center_img_w - \
+                          previous_img_w - current_img_w, \
+                          img_scale_h + center_img_h, \
+                          img_scale_w + center_img_w - previous_img_w, \
+                          img_scale_h + center_img_h + current_img_h
+        elif loc == 'left':
+            paste_coord = img_scale_w - current_img_w, \
+                          img_scale_h + center_img_h - current_img_h, \
+                          img_scale_w, \
+                          img_scale_h + center_img_h
+        elif loc == 'top_left':
+            paste_coord = img_scale_w - current_img_w, \
+                          img_scale_h + center_img_h - \
+                          previous_img_h - current_img_h, \
+                          img_scale_w, \
+                          img_scale_h + center_img_h - previous_img_h
+
+        self._previous_img_shape = self._current_img_shape
+        #  xmin, ymin, xmax, ymax
+        return paste_coord
+
+    def __repr__(self) -> str:
+        repr_str = self.__class__.__name__
+        repr_str += f'(img_scale={self.img_scale}, '
+        repr_str += f'pad_val={self.pad_val}, '
+        repr_str += f'prob={self.prob})'
+        return repr_str
+
+
+@TRANSFORMS.register_module()
+class YOLOv5MixUp(BaseMixImageTransform):
+    """MixUp data augmentation for YOLOv5.
+
+    .. code:: text
+
+    The mixup transform steps are as follows:
+
+        1. Another random image is picked by dataset.
+        2. Randomly obtain the fusion ratio from the beta distribution,
+            then fuse the target
+        of the original image and mixup image through this ratio.
+
+    Required Keys:
+
+    - img
+    - gt_bboxes (BaseBoxes[torch.float32]) (optional)
+    - gt_bboxes_labels (np.int64) (optional)
+    - gt_ignore_flags (bool) (optional)
+    - mix_results (List[dict])
+
+
+    Modified Keys:
+
+    - img
+    - img_shape
+    - gt_bboxes (optional)
+    - gt_bboxes_labels (optional)
+    - gt_ignore_flags (optional)
+
+
+    Args:
+        alpha (float): parameter of beta distribution to get mixup ratio.
+            Defaults to 32.
+        beta (float):  parameter of beta distribution to get mixup ratio.
+            Defaults to 32.
+        pre_transform (Sequence[dict]): Sequence of transform object or
+            config dict to be composed.
+        prob (float): Probability of applying this transformation.
+            Defaults to 1.0.
+        use_cached (bool): Whether to use cache. Defaults to False.
+        max_cached_images (int): The maximum length of the cache. The larger
+            the cache, the stronger the randomness of this transform. As a
+            rule of thumb, providing 10 caches for each image suffices for
+            randomness. Defaults to 20.
+        random_pop (bool): Whether to randomly pop a result from the cache
+            when the cache is full. If set to False, use FIFO popping method.
+            Defaults to True.
+        max_refetch (int): The maximum number of iterations. If the number of
+            iterations is greater than `max_refetch`, but gt_bbox is still
+            empty, then the iteration is terminated. Defaults to 15.
+    """
+
+    def __init__(self,
+                 alpha: float = 32.0,
+                 beta: float = 32.0,
+                 pre_transform: Sequence[dict] = None,
+                 prob: float = 1.0,
+                 use_cached: bool = False,
+                 max_cached_images: int = 20,
+                 random_pop: bool = True,
+                 max_refetch: int = 15):
+        if use_cached:
+            assert max_cached_images >= 2, 'The length of cache must >= 2, ' \
+                                           f'but got {max_cached_images}.'
+        super().__init__(
+            pre_transform=pre_transform,
+            prob=prob,
+            use_cached=use_cached,
+            max_cached_images=max_cached_images,
+            random_pop=random_pop,
+            max_refetch=max_refetch)
+        self.alpha = alpha
+        self.beta = beta
+
+    def get_indexes(self, dataset: Union[BaseDataset, list]) -> int:
+        """Call function to collect indexes.
+
+        Args:
+            dataset (:obj:`Dataset` or list): The dataset or cached list.
+
+        Returns:
+            int: indexes.
+        """
+        return random.randint(0, len(dataset))
+
+    def mix_img_transform(self, results: dict) -> dict:
+        """YOLOv5 MixUp transform function.
+
+        Args:
+            results (dict): Result dict
+
+        Returns:
+            results (dict): Updated result dict.
+        """
+        assert 'mix_results' in results
+
+        retrieve_results = results['mix_results'][0]
+        retrieve_img = retrieve_results['img']
+        ori_img = results['img']
+        assert ori_img.shape == retrieve_img.shape
+
+        # Randomly obtain the fusion ratio from the beta distribution,
+        # which is around 0.5
+        ratio = np.random.beta(self.alpha, self.beta)
+        mixup_img = (ori_img * ratio + retrieve_img * (1 - ratio))
+
+        retrieve_gt_bboxes = retrieve_results['gt_bboxes']
+        retrieve_gt_bboxes_labels = retrieve_results['gt_bboxes_labels']
+        retrieve_gt_ignore_flags = retrieve_results['gt_ignore_flags']
+
+        mixup_gt_bboxes = retrieve_gt_bboxes.cat(
+            (results['gt_bboxes'], retrieve_gt_bboxes), dim=0)
+        mixup_gt_bboxes_labels = np.concatenate(
+            (results['gt_bboxes_labels'], retrieve_gt_bboxes_labels), axis=0)
+        mixup_gt_ignore_flags = np.concatenate(
+            (results['gt_ignore_flags'], retrieve_gt_ignore_flags), axis=0)
+        if 'gt_masks' in results:
+            assert 'gt_masks' in retrieve_results
+            mixup_gt_masks = results['gt_masks'].cat(
+                [results['gt_masks'], retrieve_results['gt_masks']])
+            results['gt_masks'] = mixup_gt_masks
+
+        results['img'] = mixup_img.astype(np.uint8)
+        results['img_shape'] = mixup_img.shape
+        results['gt_bboxes'] = mixup_gt_bboxes
+        results['gt_bboxes_labels'] = mixup_gt_bboxes_labels
+        results['gt_ignore_flags'] = mixup_gt_ignore_flags
+
+        return results
+
+
+@TRANSFORMS.register_module()
+class YOLOXMixUp(BaseMixImageTransform):
+    """MixUp data augmentation for YOLOX.
+
+    .. code:: text
+
+                         mixup transform
+                +---------------+--------------+
+                | mixup image   |              |
+                |      +--------|--------+     |
+                |      |        |        |     |
+                +---------------+        |     |
+                |      |                 |     |
+                |      |      image      |     |
+                |      |                 |     |
+                |      |                 |     |
+                |      +-----------------+     |
+                |             pad              |
+                +------------------------------+
+
+    The mixup transform steps are as follows:
+
+        1. Another random image is picked by dataset and embedded in
+           the top left patch(after padding and resizing)
+        2. The target of mixup transform is the weighted average of mixup
+           image and origin image.
+
+    Required Keys:
+
+    - img
+    - gt_bboxes (BaseBoxes[torch.float32]) (optional)
+    - gt_bboxes_labels (np.int64) (optional)
+    - gt_ignore_flags (bool) (optional)
+    - mix_results (List[dict])
+
+
+    Modified Keys:
+
+    - img
+    - img_shape
+    - gt_bboxes (optional)
+    - gt_bboxes_labels (optional)
+    - gt_ignore_flags (optional)
+
+
+    Args:
+        img_scale (Sequence[int]): Image output size after mixup pipeline.
+            The shape order should be (width, height). Defaults to (640, 640).
+        ratio_range (Sequence[float]): Scale ratio of mixup image.
+            Defaults to (0.5, 1.5).
+        flip_ratio (float): Horizontal flip ratio of mixup image.
+            Defaults to 0.5.
+        pad_val (int): Pad value. Defaults to 114.
+        bbox_clip_border (bool, optional): Whether to clip the objects outside
+            the border of the image. In some dataset like MOT17, the gt bboxes
+            are allowed to cross the border of images. Therefore, we don't
+            need to clip the gt bboxes in these cases. Defaults to True.
+        pre_transform(Sequence[dict]): Sequence of transform object or
+            config dict to be composed.
+        prob (float): Probability of applying this transformation.
+            Defaults to 1.0.
+        use_cached (bool): Whether to use cache. Defaults to False.
+        max_cached_images (int): The maximum length of the cache. The larger
+            the cache, the stronger the randomness of this transform. As a
+            rule of thumb, providing 10 caches for each image suffices for
+            randomness. Defaults to 20.
+        random_pop (bool): Whether to randomly pop a result from the cache
+            when the cache is full. If set to False, use FIFO popping method.
+            Defaults to True.
+        max_refetch (int): The maximum number of iterations. If the number of
+            iterations is greater than `max_refetch`, but gt_bbox is still
+            empty, then the iteration is terminated. Defaults to 15.
+    """
+
+    def __init__(self,
+                 img_scale: Tuple[int, int] = (640, 640),
+                 ratio_range: Tuple[float, float] = (0.5, 1.5),
+                 flip_ratio: float = 0.5,
+                 pad_val: float = 114.0,
+                 bbox_clip_border: bool = True,
+                 pre_transform: Sequence[dict] = None,
+                 prob: float = 1.0,
+                 use_cached: bool = False,
+                 max_cached_images: int = 20,
+                 random_pop: bool = True,
+                 max_refetch: int = 15):
+        assert isinstance(img_scale, tuple)
+        if use_cached:
+            assert max_cached_images >= 2, 'The length of cache must >= 2, ' \
+                                           f'but got {max_cached_images}.'
+        super().__init__(
+            pre_transform=pre_transform,
+            prob=prob,
+            use_cached=use_cached,
+            max_cached_images=max_cached_images,
+            random_pop=random_pop,
+            max_refetch=max_refetch)
+        self.img_scale = img_scale
+        self.ratio_range = ratio_range
+        self.flip_ratio = flip_ratio
+        self.pad_val = pad_val
+        self.bbox_clip_border = bbox_clip_border
+
+    def get_indexes(self, dataset: Union[BaseDataset, list]) -> int:
+        """Call function to collect indexes.
+
+        Args:
+            dataset (:obj:`Dataset` or list): The dataset or cached list.
+
+        Returns:
+            int: indexes.
+        """
+        return random.randint(0, len(dataset))
+
+    def mix_img_transform(self, results: dict) -> dict:
+        """YOLOX MixUp transform function.
+
+        Args:
+            results (dict): Result dict.
+
+        Returns:
+            results (dict): Updated result dict.
+        """
+        assert 'mix_results' in results
+        assert len(
+            results['mix_results']) == 1, 'MixUp only support 2 images now !'
+
+        if results['mix_results'][0]['gt_bboxes'].shape[0] == 0:
+            # empty bbox
+            return results
+
+        retrieve_results = results['mix_results'][0]
+        retrieve_img = retrieve_results['img']
+
+        jit_factor = random.uniform(*self.ratio_range)
+        is_filp = random.uniform(0, 1) > self.flip_ratio
+
+        if len(retrieve_img.shape) == 3:
+            out_img = np.ones((self.img_scale[1], self.img_scale[0], 3),
+                              dtype=retrieve_img.dtype) * self.pad_val
+        else:
+            out_img = np.ones(
+                self.img_scale[::-1], dtype=retrieve_img.dtype) * self.pad_val
+
+        # 1. keep_ratio resize
+        scale_ratio = min(self.img_scale[1] / retrieve_img.shape[0],
+                          self.img_scale[0] / retrieve_img.shape[1])
+        retrieve_img = mmcv.imresize(
+            retrieve_img, (int(retrieve_img.shape[1] * scale_ratio),
+                           int(retrieve_img.shape[0] * scale_ratio)))
+
+        # 2. paste
+        out_img[:retrieve_img.shape[0], :retrieve_img.shape[1]] = retrieve_img
+
+        # 3. scale jit
+        scale_ratio *= jit_factor
+        out_img = mmcv.imresize(out_img, (int(out_img.shape[1] * jit_factor),
+                                          int(out_img.shape[0] * jit_factor)))
+
+        # 4. flip
+        if is_filp:
+            out_img = out_img[:, ::-1, :]
+
+        # 5. random crop
+        ori_img = results['img']
+        origin_h, origin_w = out_img.shape[:2]
+        target_h, target_w = ori_img.shape[:2]
+        padded_img = np.ones((max(origin_h, target_h), max(
+            origin_w, target_w), 3)) * self.pad_val
+        padded_img = padded_img.astype(np.uint8)
+        padded_img[:origin_h, :origin_w] = out_img
+
+        x_offset, y_offset = 0, 0
+        if padded_img.shape[0] > target_h:
+            y_offset = random.randint(0, padded_img.shape[0] - target_h)
+        if padded_img.shape[1] > target_w:
+            x_offset = random.randint(0, padded_img.shape[1] - target_w)
+        padded_cropped_img = padded_img[y_offset:y_offset + target_h,
+                                        x_offset:x_offset + target_w]
+
+        # 6. adjust bbox
+        retrieve_gt_bboxes = retrieve_results['gt_bboxes']
+        retrieve_gt_bboxes.rescale_([scale_ratio, scale_ratio])
+        if self.bbox_clip_border:
+            retrieve_gt_bboxes.clip_([origin_h, origin_w])
+
+        if is_filp:
+            retrieve_gt_bboxes.flip_([origin_h, origin_w],
+                                     direction='horizontal')
+
+        # 7. filter
+        cp_retrieve_gt_bboxes = retrieve_gt_bboxes.clone()
+        cp_retrieve_gt_bboxes.translate_([-x_offset, -y_offset])
+        if self.bbox_clip_border:
+            cp_retrieve_gt_bboxes.clip_([target_h, target_w])
+
+        # 8. mix up
+        mixup_img = 0.5 * ori_img + 0.5 * padded_cropped_img
+
+        retrieve_gt_bboxes_labels = retrieve_results['gt_bboxes_labels']
+        retrieve_gt_ignore_flags = retrieve_results['gt_ignore_flags']
+
+        mixup_gt_bboxes = cp_retrieve_gt_bboxes.cat(
+            (results['gt_bboxes'], cp_retrieve_gt_bboxes), dim=0)
+        mixup_gt_bboxes_labels = np.concatenate(
+            (results['gt_bboxes_labels'], retrieve_gt_bboxes_labels), axis=0)
+        mixup_gt_ignore_flags = np.concatenate(
+            (results['gt_ignore_flags'], retrieve_gt_ignore_flags), axis=0)
+
+        if not self.bbox_clip_border:
+            # remove outside bbox
+            inside_inds = mixup_gt_bboxes.is_inside([target_h,
+                                                     target_w]).numpy()
+            mixup_gt_bboxes = mixup_gt_bboxes[inside_inds]
+            mixup_gt_bboxes_labels = mixup_gt_bboxes_labels[inside_inds]
+            mixup_gt_ignore_flags = mixup_gt_ignore_flags[inside_inds]
+
+        if 'gt_keypoints' in results:
+            # adjust kps
+            retrieve_gt_keypoints = retrieve_results['gt_keypoints']
+            retrieve_gt_keypoints.rescale_([scale_ratio, scale_ratio])
+            if self.bbox_clip_border:
+                retrieve_gt_keypoints.clip_([origin_h, origin_w])
+
+            if is_filp:
+                retrieve_gt_keypoints.flip_([origin_h, origin_w],
+                                            direction='horizontal')
+
+            # filter
+            cp_retrieve_gt_keypoints = retrieve_gt_keypoints.clone()
+            cp_retrieve_gt_keypoints.translate_([-x_offset, -y_offset])
+            if self.bbox_clip_border:
+                cp_retrieve_gt_keypoints.clip_([target_h, target_w])
+
+            # mixup
+            mixup_gt_keypoints = cp_retrieve_gt_keypoints.cat(
+                (results['gt_keypoints'], cp_retrieve_gt_keypoints), dim=0)
+            if not self.bbox_clip_border:
+                # remove outside bbox
+                mixup_gt_keypoints = mixup_gt_keypoints[inside_inds]
+            results['gt_keypoints'] = mixup_gt_keypoints
+
+        results['img'] = mixup_img.astype(np.uint8)
+        results['img_shape'] = mixup_img.shape
+        results['gt_bboxes'] = mixup_gt_bboxes
+        results['gt_bboxes_labels'] = mixup_gt_bboxes_labels
+        results['gt_ignore_flags'] = mixup_gt_ignore_flags
+
+        return results
+
+    def __repr__(self) -> str:
+        repr_str = self.__class__.__name__
+        repr_str += f'(img_scale={self.img_scale}, '
+        repr_str += f'ratio_range={self.ratio_range}, '
+        repr_str += f'flip_ratio={self.flip_ratio}, '
+        repr_str += f'pad_val={self.pad_val}, '
+        repr_str += f'max_refetch={self.max_refetch}, '
+        repr_str += f'bbox_clip_border={self.bbox_clip_border})'
+        return repr_str
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/datasets/transforms/transforms.py b/mmdetection_practice/third_party/mmyolo/mmyolo/datasets/transforms/transforms.py
new file mode 100644
index 0000000..8060e9c
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/datasets/transforms/transforms.py
@@ -0,0 +1,2102 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+import math
+from copy import deepcopy
+from typing import List, Sequence, Tuple, Union
+
+import cv2
+import mmcv
+import numpy as np
+import torch
+from mmcv.image.geometric import _scale_size
+from mmcv.transforms import BaseTransform, Compose
+from mmcv.transforms.utils import cache_randomness
+from mmdet.datasets.transforms import FilterAnnotations as FilterDetAnnotations
+from mmdet.datasets.transforms import LoadAnnotations as MMDET_LoadAnnotations
+from mmdet.datasets.transforms import RandomAffine as MMDET_RandomAffine
+from mmdet.datasets.transforms import RandomFlip as MMDET_RandomFlip
+from mmdet.datasets.transforms import Resize as MMDET_Resize
+from mmdet.structures.bbox import (HorizontalBoxes, autocast_box_type,
+                                   get_box_type)
+from mmdet.structures.mask import PolygonMasks, polygon_to_bitmap
+from numpy import random
+
+from mmyolo.registry import TRANSFORMS
+from .keypoint_structure import Keypoints
+
+# TODO: Waiting for MMCV support
+TRANSFORMS.register_module(module=Compose, force=True)
+
+
+@TRANSFORMS.register_module()
+class YOLOv5KeepRatioResize(MMDET_Resize):
+    """Resize images & bbox(if existed).
+
+    This transform resizes the input image according to ``scale``.
+    Bboxes (if existed) are then resized with the same scale factor.
+
+    Required Keys:
+
+    - img (np.uint8)
+    - gt_bboxes (BaseBoxes[torch.float32]) (optional)
+
+    Modified Keys:
+
+    - img (np.uint8)
+    - img_shape (tuple)
+    - gt_bboxes (optional)
+    - scale (float)
+
+    Added Keys:
+
+    - scale_factor (np.float32)
+
+    Args:
+        scale (Union[int, Tuple[int, int]]): Images scales for resizing.
+    """
+
+    def __init__(self,
+                 scale: Union[int, Tuple[int, int]],
+                 keep_ratio: bool = True,
+                 **kwargs):
+        assert keep_ratio is True
+        super().__init__(scale=scale, keep_ratio=True, **kwargs)
+
+    @staticmethod
+    def _get_rescale_ratio(old_size: Tuple[int, int],
+                           scale: Union[float, Tuple[int]]) -> float:
+        """Calculate the ratio for rescaling.
+
+        Args:
+            old_size (tuple[int]): The old size (w, h) of image.
+            scale (float | tuple[int]): The scaling factor or maximum size.
+                If it is a float number, then the image will be rescaled by
+                this factor, else if it is a tuple of 2 integers, then
+                the image will be rescaled as large as possible within
+                the scale.
+
+        Returns:
+            float: The resize ratio.
+        """
+        w, h = old_size
+        if isinstance(scale, (float, int)):
+            if scale <= 0:
+                raise ValueError(f'Invalid scale {scale}, must be positive.')
+            scale_factor = scale
+        elif isinstance(scale, tuple):
+            max_long_edge = max(scale)
+            max_short_edge = min(scale)
+            scale_factor = min(max_long_edge / max(h, w),
+                               max_short_edge / min(h, w))
+        else:
+            raise TypeError('Scale must be a number or tuple of int, '
+                            f'but got {type(scale)}')
+
+        return scale_factor
+
+    def _resize_img(self, results: dict):
+        """Resize images with ``results['scale']``."""
+        assert self.keep_ratio is True
+
+        if results.get('img', None) is not None:
+            image = results['img']
+            original_h, original_w = image.shape[:2]
+            ratio = self._get_rescale_ratio((original_h, original_w),
+                                            self.scale)
+
+            if ratio != 1:
+                # resize image according to the shape
+                # NOTE: We are currently testing on COCO that modifying
+                # this code will not affect the results.
+                # If you find that it has an effect on your results,
+                # please feel free to contact us.
+                image = mmcv.imresize(
+                    img=image,
+                    size=(int(original_w * ratio), int(original_h * ratio)),
+                    interpolation='area' if ratio < 1 else 'bilinear',
+                    backend=self.backend)
+
+            resized_h, resized_w = image.shape[:2]
+            scale_ratio_h = resized_h / original_h
+            scale_ratio_w = resized_w / original_w
+            scale_factor = (scale_ratio_w, scale_ratio_h)
+
+            results['img'] = image
+            results['img_shape'] = image.shape[:2]
+            results['scale_factor'] = scale_factor
+
+
+@TRANSFORMS.register_module()
+class LetterResize(MMDET_Resize):
+    """Resize and pad image while meeting stride-multiple constraints.
+
+    Required Keys:
+
+    - img (np.uint8)
+    - batch_shape (np.int64) (optional)
+
+    Modified Keys:
+
+    - img (np.uint8)
+    - img_shape (tuple)
+    - gt_bboxes (optional)
+
+    Added Keys:
+    - pad_param (np.float32)
+
+    Args:
+        scale (Union[int, Tuple[int, int]]): Images scales for resizing.
+        pad_val (dict): Padding value. Defaults to dict(img=0, seg=255).
+        use_mini_pad (bool): Whether using minimum rectangle padding.
+            Defaults to True
+        stretch_only (bool): Whether stretch to the specified size directly.
+            Defaults to False
+        allow_scale_up (bool): Allow scale up when ratio > 1. Defaults to True
+        half_pad_param (bool): If set to True, left and right pad_param will
+            be given by dividing padding_h by 2. If set to False, pad_param is
+            in int format. We recommend setting this to False for object
+            detection tasks, and True for instance segmentation tasks.
+            Default to False.
+    """
+
+    def __init__(self,
+                 scale: Union[int, Tuple[int, int]],
+                 pad_val: dict = dict(img=0, mask=0, seg=255),
+                 use_mini_pad: bool = False,
+                 stretch_only: bool = False,
+                 allow_scale_up: bool = True,
+                 half_pad_param: bool = False,
+                 **kwargs):
+        super().__init__(scale=scale, keep_ratio=True, **kwargs)
+
+        self.pad_val = pad_val
+        if isinstance(pad_val, (int, float)):
+            pad_val = dict(img=pad_val, seg=255)
+        assert isinstance(
+            pad_val, dict), f'pad_val must be dict, but got {type(pad_val)}'
+
+        self.use_mini_pad = use_mini_pad
+        self.stretch_only = stretch_only
+        self.allow_scale_up = allow_scale_up
+        self.half_pad_param = half_pad_param
+
+    def _resize_img(self, results: dict):
+        """Resize images with ``results['scale']``."""
+        image = results.get('img', None)
+        if image is None:
+            return
+
+        # Use batch_shape if a batch_shape policy is configured
+        if 'batch_shape' in results:
+            scale = tuple(results['batch_shape'])  # hw
+        else:
+            scale = self.scale[::-1]  # wh -> hw
+
+        image_shape = image.shape[:2]  # height, width
+
+        # Scale ratio (new / old)
+        ratio = min(scale[0] / image_shape[0], scale[1] / image_shape[1])
+
+        # only scale down, do not scale up (for better test mAP)
+        if not self.allow_scale_up:
+            ratio = min(ratio, 1.0)
+
+        ratio = [ratio, ratio]  # float -> (float, float) for (height, width)
+
+        # compute the best size of the image
+        no_pad_shape = (int(round(image_shape[0] * ratio[0])),
+                        int(round(image_shape[1] * ratio[1])))
+
+        # padding height & width
+        padding_h, padding_w = [
+            scale[0] - no_pad_shape[0], scale[1] - no_pad_shape[1]
+        ]
+        if self.use_mini_pad:
+            # minimum rectangle padding
+            padding_w, padding_h = np.mod(padding_w, 32), np.mod(padding_h, 32)
+
+        elif self.stretch_only:
+            # stretch to the specified size directly
+            padding_h, padding_w = 0.0, 0.0
+            no_pad_shape = (scale[0], scale[1])
+            ratio = [scale[0] / image_shape[0],
+                     scale[1] / image_shape[1]]  # height, width ratios
+
+        if image_shape != no_pad_shape:
+            # compare with no resize and padding size
+            image = mmcv.imresize(
+                image, (no_pad_shape[1], no_pad_shape[0]),
+                interpolation=self.interpolation,
+                backend=self.backend)
+
+        scale_factor = (no_pad_shape[1] / image_shape[1],
+                        no_pad_shape[0] / image_shape[0])
+
+        if 'scale_factor' in results:
+            results['scale_factor_origin'] = results['scale_factor']
+        results['scale_factor'] = scale_factor
+
+        # padding
+        top_padding, left_padding = int(round(padding_h // 2 - 0.1)), int(
+            round(padding_w // 2 - 0.1))
+        bottom_padding = padding_h - top_padding
+        right_padding = padding_w - left_padding
+
+        padding_list = [
+            top_padding, bottom_padding, left_padding, right_padding
+        ]
+        if top_padding != 0 or bottom_padding != 0 or \
+                left_padding != 0 or right_padding != 0:
+
+            pad_val = self.pad_val.get('img', 0)
+            if isinstance(pad_val, int) and image.ndim == 3:
+                pad_val = tuple(pad_val for _ in range(image.shape[2]))
+
+            image = mmcv.impad(
+                img=image,
+                padding=(padding_list[2], padding_list[0], padding_list[3],
+                         padding_list[1]),
+                pad_val=pad_val,
+                padding_mode='constant')
+
+        results['img'] = image
+        results['img_shape'] = image.shape
+        if 'pad_param' in results:
+            results['pad_param_origin'] = results['pad_param'] * \
+                                          np.repeat(ratio, 2)
+
+        if self.half_pad_param:
+            results['pad_param'] = np.array(
+                [padding_h / 2, padding_h / 2, padding_w / 2, padding_w / 2],
+                dtype=np.float32)
+        else:
+            # We found in object detection, using padding list with
+            # int type can get higher mAP.
+            results['pad_param'] = np.array(padding_list, dtype=np.float32)
+
+    def _resize_masks(self, results: dict):
+        """Resize masks with ``results['scale']``"""
+        if results.get('gt_masks', None) is None:
+            return
+
+        gt_masks = results['gt_masks']
+        assert isinstance(
+            gt_masks, PolygonMasks
+        ), f'Only supports PolygonMasks, but got {type(gt_masks)}'
+
+        # resize the gt_masks
+        gt_mask_h = results['gt_masks'].height * results['scale_factor'][1]
+        gt_mask_w = results['gt_masks'].width * results['scale_factor'][0]
+        gt_masks = results['gt_masks'].resize(
+            (int(round(gt_mask_h)), int(round(gt_mask_w))))
+
+        top_padding, _, left_padding, _ = results['pad_param']
+        if int(left_padding) != 0:
+            gt_masks = gt_masks.translate(
+                out_shape=results['img_shape'][:2],
+                offset=int(left_padding),
+                direction='horizontal')
+        if int(top_padding) != 0:
+            gt_masks = gt_masks.translate(
+                out_shape=results['img_shape'][:2],
+                offset=int(top_padding),
+                direction='vertical')
+        results['gt_masks'] = gt_masks
+
+    def _resize_bboxes(self, results: dict):
+        """Resize bounding boxes with ``results['scale_factor']``."""
+        if results.get('gt_bboxes', None) is None:
+            return
+        results['gt_bboxes'].rescale_(results['scale_factor'])
+
+        if len(results['pad_param']) != 4:
+            return
+        results['gt_bboxes'].translate_(
+            (results['pad_param'][2], results['pad_param'][0]))
+
+        if self.clip_object_border:
+            results['gt_bboxes'].clip_(results['img_shape'])
+
+    def transform(self, results: dict) -> dict:
+        results = super().transform(results)
+        if 'scale_factor_origin' in results:
+            scale_factor_origin = results.pop('scale_factor_origin')
+            results['scale_factor'] = (results['scale_factor'][0] *
+                                       scale_factor_origin[0],
+                                       results['scale_factor'][1] *
+                                       scale_factor_origin[1])
+        if 'pad_param_origin' in results:
+            pad_param_origin = results.pop('pad_param_origin')
+            results['pad_param'] += pad_param_origin
+        return results
+
+
+# TODO: Check if it can be merged with mmdet.YOLOXHSVRandomAug
+@TRANSFORMS.register_module()
+class YOLOv5HSVRandomAug(BaseTransform):
+    """Apply HSV augmentation to image sequentially.
+
+    Required Keys:
+
+    - img
+
+    Modified Keys:
+
+    - img
+
+    Args:
+        hue_delta ([int, float]): delta of hue. Defaults to 0.015.
+        saturation_delta ([int, float]): delta of saturation. Defaults to 0.7.
+        value_delta ([int, float]): delta of value. Defaults to 0.4.
+    """
+
+    def __init__(self,
+                 hue_delta: Union[int, float] = 0.015,
+                 saturation_delta: Union[int, float] = 0.7,
+                 value_delta: Union[int, float] = 0.4):
+        self.hue_delta = hue_delta
+        self.saturation_delta = saturation_delta
+        self.value_delta = value_delta
+
+    def transform(self, results: dict) -> dict:
+        """The HSV augmentation transform function.
+
+        Args:
+            results (dict): The result dict.
+
+        Returns:
+            dict: The result dict.
+        """
+        hsv_gains = \
+            random.uniform(-1, 1, 3) * \
+            [self.hue_delta, self.saturation_delta, self.value_delta] + 1
+        hue, sat, val = cv2.split(
+            cv2.cvtColor(results['img'], cv2.COLOR_BGR2HSV))
+
+        table_list = np.arange(0, 256, dtype=hsv_gains.dtype)
+        lut_hue = ((table_list * hsv_gains[0]) % 180).astype(np.uint8)
+        lut_sat = np.clip(table_list * hsv_gains[1], 0, 255).astype(np.uint8)
+        lut_val = np.clip(table_list * hsv_gains[2], 0, 255).astype(np.uint8)
+
+        im_hsv = cv2.merge(
+            (cv2.LUT(hue, lut_hue), cv2.LUT(sat,
+                                            lut_sat), cv2.LUT(val, lut_val)))
+        results['img'] = cv2.cvtColor(im_hsv, cv2.COLOR_HSV2BGR)
+        return results
+
+    def __repr__(self) -> str:
+        repr_str = self.__class__.__name__
+        repr_str += f'(hue_delta={self.hue_delta}, '
+        repr_str += f'saturation_delta={self.saturation_delta}, '
+        repr_str += f'value_delta={self.value_delta})'
+        return repr_str
+
+
+@TRANSFORMS.register_module()
+class LoadAnnotations(MMDET_LoadAnnotations):
+    """Because the yolo series does not need to consider ignore bboxes for the
+    time being, in order to speed up the pipeline, it can be excluded in
+    advance.
+
+    Args:
+        mask2bbox (bool): Whether to use mask annotation to get bbox.
+            Defaults to False.
+        poly2mask (bool): Whether to transform the polygons to bitmaps.
+            Defaults to False.
+        merge_polygons (bool): Whether to merge polygons into one polygon.
+            If merged, the storage structure is simpler and training is more
+            effcient, especially if the mask inside a bbox is divided into
+            multiple polygons. Defaults to True.
+    """
+
+    def __init__(self,
+                 mask2bbox: bool = False,
+                 poly2mask: bool = False,
+                 merge_polygons: bool = True,
+                 **kwargs):
+        self.mask2bbox = mask2bbox
+        self.merge_polygons = merge_polygons
+        assert not poly2mask, 'Does not support BitmapMasks considering ' \
+                              'that bitmap consumes more memory.'
+        super().__init__(poly2mask=poly2mask, **kwargs)
+        if self.mask2bbox:
+            assert self.with_mask, 'Using mask2bbox requires ' \
+                                   'with_mask is True.'
+        self._mask_ignore_flag = None
+
+    def transform(self, results: dict) -> dict:
+        """Function to load multiple types annotations.
+
+        Args:
+            results (dict): Result dict from :obj:``mmengine.BaseDataset``.
+
+        Returns:
+            dict: The dict contains loaded bounding box, label and
+            semantic segmentation.
+        """
+        if self.mask2bbox:
+            self._load_masks(results)
+            if self.with_label:
+                self._load_labels(results)
+                self._update_mask_ignore_data(results)
+            gt_bboxes = results['gt_masks'].get_bboxes(dst_type='hbox')
+            results['gt_bboxes'] = gt_bboxes
+        elif self.with_keypoints:
+            self._load_kps(results)
+            _, box_type_cls = get_box_type(self.box_type)
+            results['gt_bboxes'] = box_type_cls(
+                results.get('bbox', []), dtype=torch.float32)
+        else:
+            results = super().transform(results)
+            self._update_mask_ignore_data(results)
+        return results
+
+    def _update_mask_ignore_data(self, results: dict) -> None:
+        if 'gt_masks' not in results:
+            return
+
+        if 'gt_bboxes_labels' in results and len(
+                results['gt_bboxes_labels']) != len(results['gt_masks']):
+            assert len(results['gt_bboxes_labels']) == len(
+                self._mask_ignore_flag)
+            results['gt_bboxes_labels'] = results['gt_bboxes_labels'][
+                self._mask_ignore_flag]
+
+        if 'gt_bboxes' in results and len(results['gt_bboxes']) != len(
+                results['gt_masks']):
+            assert len(results['gt_bboxes']) == len(self._mask_ignore_flag)
+            results['gt_bboxes'] = results['gt_bboxes'][self._mask_ignore_flag]
+
+    def _load_bboxes(self, results: dict):
+        """Private function to load bounding box annotations.
+        Note: BBoxes with ignore_flag of 1 is not considered.
+        Args:
+            results (dict): Result dict from :obj:``mmengine.BaseDataset``.
+
+        Returns:
+            dict: The dict contains loaded bounding box annotations.
+        """
+        gt_bboxes = []
+        gt_ignore_flags = []
+        for instance in results.get('instances', []):
+            if instance['ignore_flag'] == 0:
+                gt_bboxes.append(instance['bbox'])
+                gt_ignore_flags.append(instance['ignore_flag'])
+        results['gt_ignore_flags'] = np.array(gt_ignore_flags, dtype=bool)
+
+        if self.box_type is None:
+            results['gt_bboxes'] = np.array(
+                gt_bboxes, dtype=np.float32).reshape((-1, 4))
+        else:
+            _, box_type_cls = get_box_type(self.box_type)
+            results['gt_bboxes'] = box_type_cls(gt_bboxes, dtype=torch.float32)
+
+    def _load_labels(self, results: dict):
+        """Private function to load label annotations.
+
+        Note: BBoxes with ignore_flag of 1 is not considered.
+        Args:
+            results (dict): Result dict from :obj:``mmengine.BaseDataset``.
+        Returns:
+            dict: The dict contains loaded label annotations.
+        """
+        gt_bboxes_labels = []
+        for instance in results.get('instances', []):
+            if instance['ignore_flag'] == 0:
+                gt_bboxes_labels.append(instance['bbox_label'])
+        results['gt_bboxes_labels'] = np.array(
+            gt_bboxes_labels, dtype=np.int64)
+
+    def _load_masks(self, results: dict) -> None:
+        """Private function to load mask annotations.
+
+        Args:
+            results (dict): Result dict from :obj:``mmengine.BaseDataset``.
+        """
+        gt_masks = []
+        gt_ignore_flags = []
+        self._mask_ignore_flag = []
+        for instance in results.get('instances', []):
+            if instance['ignore_flag'] == 0:
+                if 'mask' in instance:
+                    gt_mask = instance['mask']
+                    if isinstance(gt_mask, list):
+                        gt_mask = [
+                            np.array(polygon) for polygon in gt_mask
+                            if len(polygon) % 2 == 0 and len(polygon) >= 6
+                        ]
+                        if len(gt_mask) == 0:
+                            # ignore
+                            self._mask_ignore_flag.append(0)
+                        else:
+                            if len(gt_mask) > 1 and self.merge_polygons:
+                                gt_mask = self.merge_multi_segment(gt_mask)
+                            gt_masks.append(gt_mask)
+                            gt_ignore_flags.append(instance['ignore_flag'])
+                            self._mask_ignore_flag.append(1)
+                    else:
+                        raise NotImplementedError(
+                            'Only supports mask annotations in polygon '
+                            'format currently')
+                else:
+                    # TODO: Actually, gt with bbox and without mask needs
+                    #  to be retained
+                    self._mask_ignore_flag.append(0)
+        self._mask_ignore_flag = np.array(self._mask_ignore_flag, dtype=bool)
+        results['gt_ignore_flags'] = np.array(gt_ignore_flags, dtype=bool)
+
+        h, w = results['ori_shape']
+        gt_masks = PolygonMasks([mask for mask in gt_masks], h, w)
+        results['gt_masks'] = gt_masks
+
+    def merge_multi_segment(self,
+                            gt_masks: List[np.ndarray]) -> List[np.ndarray]:
+        """Merge multi segments to one list.
+
+        Find the coordinates with min distance between each segment,
+        then connect these coordinates with one thin line to merge all
+        segments into one.
+        Args:
+            gt_masks(List(np.array)):
+                original segmentations in coco's json file.
+                like [segmentation1, segmentation2,...],
+                each segmentation is a list of coordinates.
+        Return:
+            gt_masks(List(np.array)): merged gt_masks
+        """
+        s = []
+        segments = [np.array(i).reshape(-1, 2) for i in gt_masks]
+        idx_list = [[] for _ in range(len(gt_masks))]
+
+        # record the indexes with min distance between each segment
+        for i in range(1, len(segments)):
+            idx1, idx2 = self.min_index(segments[i - 1], segments[i])
+            idx_list[i - 1].append(idx1)
+            idx_list[i].append(idx2)
+
+        # use two round to connect all the segments
+        # first round: first to end, i.e. A->B(partial)->C
+        # second round: end to first, i.e. C->B(remaining)-A
+        for k in range(2):
+            # forward first round
+            if k == 0:
+                for i, idx in enumerate(idx_list):
+                    # middle segments have two indexes
+                    # reverse the index of middle segments
+                    if len(idx) == 2 and idx[0] > idx[1]:
+                        idx = idx[::-1]
+                        segments[i] = segments[i][::-1, :]
+                    # add the idx[0] point for connect next segment
+                    segments[i] = np.roll(segments[i], -idx[0], axis=0)
+                    segments[i] = np.concatenate(
+                        [segments[i], segments[i][:1]])
+                    # deal with the first segment and the last one
+                    if i in [0, len(idx_list) - 1]:
+                        s.append(segments[i])
+                    # deal with the middle segment
+                    # Note that in the first round, only partial segment
+                    # are appended.
+                    else:
+                        idx = [0, idx[1] - idx[0]]
+                        s.append(segments[i][idx[0]:idx[1] + 1])
+            # forward second round
+            else:
+                for i in range(len(idx_list) - 1, -1, -1):
+                    # deal with the middle segment
+                    # append the remaining points
+                    if i not in [0, len(idx_list) - 1]:
+                        idx = idx_list[i]
+                        nidx = abs(idx[1] - idx[0])
+                        s.append(segments[i][nidx:])
+        return [np.concatenate(s).reshape(-1, )]
+
+    def min_index(self, arr1: np.ndarray, arr2: np.ndarray) -> Tuple[int, int]:
+        """Find a pair of indexes with the shortest distance.
+
+        Args:
+            arr1: (N, 2).
+            arr2: (M, 2).
+        Return:
+            tuple: a pair of indexes.
+        """
+        dis = ((arr1[:, None, :] - arr2[None, :, :])**2).sum(-1)
+        return np.unravel_index(np.argmin(dis, axis=None), dis.shape)
+
+    def _load_kps(self, results: dict) -> None:
+        """Private function to load keypoints annotations.
+
+        Args:
+            results (dict): Result dict from
+                :class:`mmengine.dataset.BaseDataset`.
+
+        Returns:
+            dict: The dict contains loaded keypoints annotations.
+        """
+        results['height'] = results['img_shape'][0]
+        results['width'] = results['img_shape'][1]
+        num_instances = len(results.get('bbox', []))
+
+        if num_instances == 0:
+            results['keypoints'] = np.empty(
+                (0, len(results['flip_indices']), 2), dtype=np.float32)
+            results['keypoints_visible'] = np.empty(
+                (0, len(results['flip_indices'])), dtype=np.int32)
+            results['category_id'] = []
+
+        results['gt_keypoints'] = Keypoints(
+            keypoints=results['keypoints'],
+            keypoints_visible=results['keypoints_visible'],
+            flip_indices=results['flip_indices'],
+        )
+
+        results['gt_ignore_flags'] = np.array([False] * num_instances)
+        results['gt_bboxes_labels'] = np.array(results['category_id']) - 1
+
+    def __repr__(self) -> str:
+        repr_str = self.__class__.__name__
+        repr_str += f'(with_bbox={self.with_bbox}, '
+        repr_str += f'with_label={self.with_label}, '
+        repr_str += f'with_mask={self.with_mask}, '
+        repr_str += f'with_seg={self.with_seg}, '
+        repr_str += f'mask2bbox={self.mask2bbox}, '
+        repr_str += f'poly2mask={self.poly2mask}, '
+        repr_str += f"imdecode_backend='{self.imdecode_backend}', "
+        repr_str += f'backend_args={self.backend_args})'
+        return repr_str
+
+
+@TRANSFORMS.register_module()
+class YOLOv5RandomAffine(BaseTransform):
+    """Random affine transform data augmentation in YOLOv5 and YOLOv8. It is
+    different from the implementation in YOLOX.
+
+    This operation randomly generates affine transform matrix which including
+    rotation, translation, shear and scaling transforms.
+    If you set use_mask_refine == True, the code will use the masks
+    annotation to refine the bbox.
+    Our implementation is slightly different from the official. In COCO
+    dataset, a gt may have multiple mask tags.  The official YOLOv5
+    annotation file already combines the masks that an object has,
+    but our code takes into account the fact that an object has multiple masks.
+
+    Required Keys:
+
+    - img
+    - gt_bboxes (BaseBoxes[torch.float32]) (optional)
+    - gt_bboxes_labels (np.int64) (optional)
+    - gt_ignore_flags (bool) (optional)
+    - gt_masks (PolygonMasks) (optional)
+
+    Modified Keys:
+
+    - img
+    - img_shape
+    - gt_bboxes (optional)
+    - gt_bboxes_labels (optional)
+    - gt_ignore_flags (optional)
+    - gt_masks (PolygonMasks) (optional)
+
+    Args:
+        max_rotate_degree (float): Maximum degrees of rotation transform.
+            Defaults to 10.
+        max_translate_ratio (float): Maximum ratio of translation.
+            Defaults to 0.1.
+        scaling_ratio_range (tuple[float]): Min and max ratio of
+            scaling transform. Defaults to (0.5, 1.5).
+        max_shear_degree (float): Maximum degrees of shear
+            transform. Defaults to 2.
+        border (tuple[int]): Distance from width and height sides of input
+            image to adjust output shape. Only used in mosaic dataset.
+            Defaults to (0, 0).
+        border_val (tuple[int]): Border padding values of 3 channels.
+            Defaults to (114, 114, 114).
+        bbox_clip_border (bool, optional): Whether to clip the objects outside
+            the border of the image. In some dataset like MOT17, the gt bboxes
+            are allowed to cross the border of images. Therefore, we don't
+            need to clip the gt bboxes in these cases. Defaults to True.
+        min_bbox_size (float): Width and height threshold to filter bboxes.
+            If the height or width of a box is smaller than this value, it
+            will be removed. Defaults to 2.
+        min_area_ratio (float): Threshold of area ratio between
+            original bboxes and wrapped bboxes. If smaller than this value,
+            the box will be removed. Defaults to 0.1.
+        use_mask_refine (bool): Whether to refine bbox by mask. Deprecated.
+        max_aspect_ratio (float): Aspect ratio of width and height
+            threshold to filter bboxes. If max(h/w, w/h) larger than this
+            value, the box will be removed. Defaults to 20.
+        resample_num (int): Number of poly to resample to.
+    """
+
+    def __init__(self,
+                 max_rotate_degree: float = 10.0,
+                 max_translate_ratio: float = 0.1,
+                 scaling_ratio_range: Tuple[float, float] = (0.5, 1.5),
+                 max_shear_degree: float = 2.0,
+                 border: Tuple[int, int] = (0, 0),
+                 border_val: Tuple[int, int, int] = (114, 114, 114),
+                 bbox_clip_border: bool = True,
+                 min_bbox_size: int = 2,
+                 min_area_ratio: float = 0.1,
+                 use_mask_refine: bool = False,
+                 max_aspect_ratio: float = 20.,
+                 resample_num: int = 1000):
+        assert 0 <= max_translate_ratio <= 1
+        assert scaling_ratio_range[0] <= scaling_ratio_range[1]
+        assert scaling_ratio_range[0] > 0
+        self.max_rotate_degree = max_rotate_degree
+        self.max_translate_ratio = max_translate_ratio
+        self.scaling_ratio_range = scaling_ratio_range
+        self.max_shear_degree = max_shear_degree
+        self.border = border
+        self.border_val = border_val
+        self.bbox_clip_border = bbox_clip_border
+        self.min_bbox_size = min_bbox_size
+        self.min_area_ratio = min_area_ratio
+        # The use_mask_refine parameter has been deprecated.
+        self.use_mask_refine = use_mask_refine
+        self.max_aspect_ratio = max_aspect_ratio
+        self.resample_num = resample_num
+
+    @autocast_box_type()
+    def transform(self, results: dict) -> dict:
+        """The YOLOv5 random affine transform function.
+
+        Args:
+            results (dict): The result dict.
+
+        Returns:
+            dict: The result dict.
+        """
+        img = results['img']
+        # self.border is wh format
+        height = img.shape[0] + self.border[1] * 2
+        width = img.shape[1] + self.border[0] * 2
+
+        # Note: Different from YOLOX
+        center_matrix = np.eye(3, dtype=np.float32)
+        center_matrix[0, 2] = -img.shape[1] / 2
+        center_matrix[1, 2] = -img.shape[0] / 2
+
+        warp_matrix, scaling_ratio = self._get_random_homography_matrix(
+            height, width)
+        warp_matrix = warp_matrix @ center_matrix
+
+        img = cv2.warpPerspective(
+            img,
+            warp_matrix,
+            dsize=(width, height),
+            borderValue=self.border_val)
+        results['img'] = img
+        results['img_shape'] = img.shape
+        img_h, img_w = img.shape[:2]
+
+        bboxes = results['gt_bboxes']
+        num_bboxes = len(bboxes)
+        if num_bboxes:
+            orig_bboxes = bboxes.clone()
+            orig_bboxes.rescale_([scaling_ratio, scaling_ratio])
+            if 'gt_masks' in results:
+                # If the dataset has annotations of mask,
+                # the mask will be used to refine bbox.
+                gt_masks = results['gt_masks']
+
+                gt_masks_resample = self.resample_masks(gt_masks)
+                gt_masks = self.warp_mask(gt_masks_resample, warp_matrix,
+                                          img_h, img_w)
+
+                # refine bboxes by masks
+                bboxes = self.segment2box(gt_masks, height, width)
+                # filter bboxes outside image
+                valid_index = self.filter_gt_bboxes(orig_bboxes,
+                                                    bboxes).numpy()
+                if self.bbox_clip_border:
+                    bboxes.clip_([height - 1e-3, width - 1e-3])
+                    gt_masks = self.clip_polygons(gt_masks, height, width)
+                results['gt_masks'] = gt_masks[valid_index]
+            else:
+                bboxes.project_(warp_matrix)
+                if self.bbox_clip_border:
+                    bboxes.clip_([height, width])
+
+                # filter bboxes
+                # Be careful: valid_index must convert to numpy,
+                # otherwise it will raise out of bounds when len(valid_index)=1
+                valid_index = self.filter_gt_bboxes(orig_bboxes,
+                                                    bboxes).numpy()
+
+            results['gt_bboxes'] = bboxes[valid_index]
+            results['gt_bboxes_labels'] = results['gt_bboxes_labels'][
+                valid_index]
+            results['gt_ignore_flags'] = results['gt_ignore_flags'][
+                valid_index]
+        else:
+            if 'gt_masks' in results:
+                results['gt_masks'] = PolygonMasks([], img_h, img_w)
+
+        return results
+
+    def segment2box(self, gt_masks: PolygonMasks, height: int,
+                    width: int) -> HorizontalBoxes:
+        """
+        Convert 1 segment label to 1 box label, applying inside-image
+        constraint i.e. (xy1, xy2, ...) to (xyxy)
+        Args:
+            gt_masks (torch.Tensor): the segment label
+            width (int): the width of the image. Defaults to 640
+            height (int): The height of the image. Defaults to 640
+        Returns:
+            HorizontalBoxes: the clip bboxes from gt_masks.
+        """
+        bboxes = []
+        for _, poly_per_obj in enumerate(gt_masks):
+            # simply use a number that is big enough for comparison with
+            # coordinates
+            xy_min = np.array([width * 2, height * 2], dtype=np.float32)
+            xy_max = np.zeros(2, dtype=np.float32) - 1
+
+            for p in poly_per_obj:
+                xy = np.array(p).reshape(-1, 2).astype(np.float32)
+                x, y = xy.T
+                inside = (x >= 0) & (y >= 0) & (x <= width) & (y <= height)
+                x, y = x[inside], y[inside]
+                if not any(x):
+                    continue
+                xy = np.stack([x, y], axis=0).T
+
+                xy_min = np.minimum(xy_min, np.min(xy, axis=0))
+                xy_max = np.maximum(xy_max, np.max(xy, axis=0))
+            if xy_max[0] == -1:
+                bbox = np.zeros(4, dtype=np.float32)
+            else:
+                bbox = np.concatenate([xy_min, xy_max], axis=0)
+            bboxes.append(bbox)
+
+        return HorizontalBoxes(np.stack(bboxes, axis=0))
+
+    # TODO: Move to mmdet
+    def clip_polygons(self, gt_masks: PolygonMasks, height: int,
+                      width: int) -> PolygonMasks:
+        """Function to clip points of polygons with height and width.
+
+        Args:
+            gt_masks (PolygonMasks): Annotations of instance segmentation.
+            height (int): height of clip border.
+            width (int): width of clip border.
+        Return:
+            clipped_masks (PolygonMasks):
+                Clip annotations of instance segmentation.
+        """
+        if len(gt_masks) == 0:
+            clipped_masks = PolygonMasks([], height, width)
+        else:
+            clipped_masks = []
+            for poly_per_obj in gt_masks:
+                clipped_poly_per_obj = []
+                for p in poly_per_obj:
+                    p = p.copy()
+                    p[0::2] = p[0::2].clip(0, width)
+                    p[1::2] = p[1::2].clip(0, height)
+                    clipped_poly_per_obj.append(p)
+                clipped_masks.append(clipped_poly_per_obj)
+            clipped_masks = PolygonMasks(clipped_masks, height, width)
+        return clipped_masks
+
+    @staticmethod
+    def warp_poly(poly: np.ndarray, warp_matrix: np.ndarray, img_w: int,
+                  img_h: int) -> np.ndarray:
+        """Function to warp one mask and filter points outside image.
+
+        Args:
+            poly (np.ndarray): Segmentation annotation with shape (n, ) and
+                with format (x1, y1, x2, y2, ...).
+            warp_matrix (np.ndarray): Affine transformation matrix.
+                Shape: (3, 3).
+            img_w (int): Width of output image.
+            img_h (int): Height of output image.
+        """
+        # TODO: Current logic may cause retained masks unusable for
+        #  semantic segmentation training, which is same as official
+        #  implementation.
+        poly = poly.reshape((-1, 2))
+        poly = np.concatenate((poly, np.ones(
+            (len(poly), 1), dtype=poly.dtype)),
+                              axis=-1)
+        # transform poly
+        poly = poly @ warp_matrix.T
+        poly = poly[:, :2] / poly[:, 2:3]
+
+        return poly.reshape(-1)
+
+    def warp_mask(self, gt_masks: PolygonMasks, warp_matrix: np.ndarray,
+                  img_w: int, img_h: int) -> PolygonMasks:
+        """Warp masks by warp_matrix and retain masks inside image after
+        warping.
+
+        Args:
+            gt_masks (PolygonMasks): Annotations of semantic segmentation.
+            warp_matrix (np.ndarray): Affine transformation matrix.
+                Shape: (3, 3).
+            img_w (int): Width of output image.
+            img_h (int): Height of output image.
+
+        Returns:
+            PolygonMasks: Masks after warping.
+        """
+        masks = gt_masks.masks
+
+        new_masks = []
+        for poly_per_obj in masks:
+            warpped_poly_per_obj = []
+            # One gt may have multiple masks.
+            for poly in poly_per_obj:
+                valid_poly = self.warp_poly(poly, warp_matrix, img_w, img_h)
+                if len(valid_poly):
+                    warpped_poly_per_obj.append(valid_poly.reshape(-1))
+            # If all the masks are invalid,
+            # add [0, 0, 0, 0, 0, 0,] here.
+            if not warpped_poly_per_obj:
+                # This will be filtered in function `filter_gt_bboxes`.
+                warpped_poly_per_obj = [
+                    np.zeros(6, dtype=poly_per_obj[0].dtype)
+                ]
+            new_masks.append(warpped_poly_per_obj)
+
+        gt_masks = PolygonMasks(new_masks, img_h, img_w)
+        return gt_masks
+
+    def resample_masks(self, gt_masks: PolygonMasks) -> PolygonMasks:
+        """Function to resample each mask annotation with shape (2 * n, ) to
+        shape (resample_num * 2, ).
+
+        Args:
+            gt_masks (PolygonMasks): Annotations of semantic segmentation.
+        """
+        masks = gt_masks.masks
+        new_masks = []
+        for poly_per_obj in masks:
+            resample_poly_per_obj = []
+            for poly in poly_per_obj:
+                poly = poly.reshape((-1, 2))  # xy
+                poly = np.concatenate((poly, poly[0:1, :]), axis=0)
+                x = np.linspace(0, len(poly) - 1, self.resample_num)
+                xp = np.arange(len(poly))
+                poly = np.concatenate([
+                    np.interp(x, xp, poly[:, i]) for i in range(2)
+                ]).reshape(2, -1).T.reshape(-1)
+                resample_poly_per_obj.append(poly)
+            new_masks.append(resample_poly_per_obj)
+        return PolygonMasks(new_masks, gt_masks.height, gt_masks.width)
+
+    def filter_gt_bboxes(self, origin_bboxes: HorizontalBoxes,
+                         wrapped_bboxes: HorizontalBoxes) -> torch.Tensor:
+        """Filter gt bboxes.
+
+        Args:
+            origin_bboxes (HorizontalBoxes): Origin bboxes.
+            wrapped_bboxes (HorizontalBoxes): Wrapped bboxes
+
+        Returns:
+            dict: The result dict.
+        """
+        origin_w = origin_bboxes.widths
+        origin_h = origin_bboxes.heights
+        wrapped_w = wrapped_bboxes.widths
+        wrapped_h = wrapped_bboxes.heights
+        aspect_ratio = np.maximum(wrapped_w / (wrapped_h + 1e-16),
+                                  wrapped_h / (wrapped_w + 1e-16))
+
+        wh_valid_idx = (wrapped_w > self.min_bbox_size) & \
+                       (wrapped_h > self.min_bbox_size)
+        area_valid_idx = wrapped_w * wrapped_h / (origin_w * origin_h +
+                                                  1e-16) > self.min_area_ratio
+        aspect_ratio_valid_idx = aspect_ratio < self.max_aspect_ratio
+        return wh_valid_idx & area_valid_idx & aspect_ratio_valid_idx
+
+    @cache_randomness
+    def _get_random_homography_matrix(self, height: int,
+                                      width: int) -> Tuple[np.ndarray, float]:
+        """Get random homography matrix.
+
+        Args:
+            height (int): Image height.
+            width (int): Image width.
+
+        Returns:
+            Tuple[np.ndarray, float]: The result of warp_matrix and
+            scaling_ratio.
+        """
+        # Rotation
+        rotation_degree = random.uniform(-self.max_rotate_degree,
+                                         self.max_rotate_degree)
+        rotation_matrix = self._get_rotation_matrix(rotation_degree)
+
+        # Scaling
+        scaling_ratio = random.uniform(self.scaling_ratio_range[0],
+                                       self.scaling_ratio_range[1])
+        scaling_matrix = self._get_scaling_matrix(scaling_ratio)
+
+        # Shear
+        x_degree = random.uniform(-self.max_shear_degree,
+                                  self.max_shear_degree)
+        y_degree = random.uniform(-self.max_shear_degree,
+                                  self.max_shear_degree)
+        shear_matrix = self._get_shear_matrix(x_degree, y_degree)
+
+        # Translation
+        trans_x = random.uniform(0.5 - self.max_translate_ratio,
+                                 0.5 + self.max_translate_ratio) * width
+        trans_y = random.uniform(0.5 - self.max_translate_ratio,
+                                 0.5 + self.max_translate_ratio) * height
+        translate_matrix = self._get_translation_matrix(trans_x, trans_y)
+        warp_matrix = (
+            translate_matrix @ shear_matrix @ rotation_matrix @ scaling_matrix)
+        return warp_matrix, scaling_ratio
+
+    @staticmethod
+    def _get_rotation_matrix(rotate_degrees: float) -> np.ndarray:
+        """Get rotation matrix.
+
+        Args:
+            rotate_degrees (float): Rotate degrees.
+
+        Returns:
+            np.ndarray: The rotation matrix.
+        """
+        radian = math.radians(rotate_degrees)
+        rotation_matrix = np.array(
+            [[np.cos(radian), -np.sin(radian), 0.],
+             [np.sin(radian), np.cos(radian), 0.], [0., 0., 1.]],
+            dtype=np.float32)
+        return rotation_matrix
+
+    @staticmethod
+    def _get_scaling_matrix(scale_ratio: float) -> np.ndarray:
+        """Get scaling matrix.
+
+        Args:
+            scale_ratio (float): Scale ratio.
+
+        Returns:
+            np.ndarray: The scaling matrix.
+        """
+        scaling_matrix = np.array(
+            [[scale_ratio, 0., 0.], [0., scale_ratio, 0.], [0., 0., 1.]],
+            dtype=np.float32)
+        return scaling_matrix
+
+    @staticmethod
+    def _get_shear_matrix(x_shear_degrees: float,
+                          y_shear_degrees: float) -> np.ndarray:
+        """Get shear matrix.
+
+        Args:
+            x_shear_degrees (float): X shear degrees.
+            y_shear_degrees (float): Y shear degrees.
+
+        Returns:
+            np.ndarray: The shear matrix.
+        """
+        x_radian = math.radians(x_shear_degrees)
+        y_radian = math.radians(y_shear_degrees)
+        shear_matrix = np.array([[1, np.tan(x_radian), 0.],
+                                 [np.tan(y_radian), 1, 0.], [0., 0., 1.]],
+                                dtype=np.float32)
+        return shear_matrix
+
+    @staticmethod
+    def _get_translation_matrix(x: float, y: float) -> np.ndarray:
+        """Get translation matrix.
+
+        Args:
+            x (float): X translation.
+            y (float): Y translation.
+
+        Returns:
+            np.ndarray: The translation matrix.
+        """
+        translation_matrix = np.array([[1, 0., x], [0., 1, y], [0., 0., 1.]],
+                                      dtype=np.float32)
+        return translation_matrix
+
+    def __repr__(self) -> str:
+        repr_str = self.__class__.__name__
+        repr_str += f'(max_rotate_degree={self.max_rotate_degree}, '
+        repr_str += f'max_translate_ratio={self.max_translate_ratio}, '
+        repr_str += f'scaling_ratio_range={self.scaling_ratio_range}, '
+        repr_str += f'max_shear_degree={self.max_shear_degree}, '
+        repr_str += f'border={self.border}, '
+        repr_str += f'border_val={self.border_val}, '
+        repr_str += f'bbox_clip_border={self.bbox_clip_border})'
+        return repr_str
+
+
+@TRANSFORMS.register_module()
+class PPYOLOERandomDistort(BaseTransform):
+    """Random hue, saturation, contrast and brightness distortion.
+
+    Required Keys:
+
+    - img
+
+    Modified Keys:
+
+    - img (np.float32)
+
+    Args:
+        hue_cfg (dict): Hue settings. Defaults to dict(min=-18,
+            max=18, prob=0.5).
+        saturation_cfg (dict): Saturation settings. Defaults to dict(
+            min=0.5, max=1.5, prob=0.5).
+        contrast_cfg (dict): Contrast settings. Defaults to dict(
+            min=0.5, max=1.5, prob=0.5).
+        brightness_cfg (dict): Brightness settings. Defaults to dict(
+            min=0.5, max=1.5, prob=0.5).
+        num_distort_func (int): The number of distort function. Defaults
+            to 4.
+    """
+
+    def __init__(self,
+                 hue_cfg: dict = dict(min=-18, max=18, prob=0.5),
+                 saturation_cfg: dict = dict(min=0.5, max=1.5, prob=0.5),
+                 contrast_cfg: dict = dict(min=0.5, max=1.5, prob=0.5),
+                 brightness_cfg: dict = dict(min=0.5, max=1.5, prob=0.5),
+                 num_distort_func: int = 4):
+        self.hue_cfg = hue_cfg
+        self.saturation_cfg = saturation_cfg
+        self.contrast_cfg = contrast_cfg
+        self.brightness_cfg = brightness_cfg
+        self.num_distort_func = num_distort_func
+        assert 0 < self.num_distort_func <= 4, \
+            'num_distort_func must > 0 and <= 4'
+        for cfg in [
+                self.hue_cfg, self.saturation_cfg, self.contrast_cfg,
+                self.brightness_cfg
+        ]:
+            assert 0. <= cfg['prob'] <= 1., 'prob must >=0 and <=1'
+
+    def transform_hue(self, results):
+        """Transform hue randomly."""
+        if random.uniform(0., 1.) >= self.hue_cfg['prob']:
+            return results
+        img = results['img']
+        delta = random.uniform(self.hue_cfg['min'], self.hue_cfg['max'])
+        u = np.cos(delta * np.pi)
+        w = np.sin(delta * np.pi)
+        delta_iq = np.array([[1.0, 0.0, 0.0], [0.0, u, -w], [0.0, w, u]])
+        rgb2yiq_matrix = np.array([[0.114, 0.587, 0.299],
+                                   [-0.321, -0.274, 0.596],
+                                   [0.311, -0.523, 0.211]])
+        yiq2rgb_matric = np.array([[1.0, -1.107, 1.705], [1.0, -0.272, -0.647],
+                                   [1.0, 0.956, 0.621]])
+        t = np.dot(np.dot(yiq2rgb_matric, delta_iq), rgb2yiq_matrix).T
+        img = np.dot(img, t)
+        results['img'] = img
+        return results
+
+    def transform_saturation(self, results):
+        """Transform saturation randomly."""
+        if random.uniform(0., 1.) >= self.saturation_cfg['prob']:
+            return results
+        img = results['img']
+        delta = random.uniform(self.saturation_cfg['min'],
+                               self.saturation_cfg['max'])
+
+        # convert bgr img to gray img
+        gray = img * np.array([[[0.114, 0.587, 0.299]]], dtype=np.float32)
+        gray = gray.sum(axis=2, keepdims=True)
+        gray *= (1.0 - delta)
+        img *= delta
+        img += gray
+        results['img'] = img
+        return results
+
+    def transform_contrast(self, results):
+        """Transform contrast randomly."""
+        if random.uniform(0., 1.) >= self.contrast_cfg['prob']:
+            return results
+        img = results['img']
+        delta = random.uniform(self.contrast_cfg['min'],
+                               self.contrast_cfg['max'])
+        img *= delta
+        results['img'] = img
+        return results
+
+    def transform_brightness(self, results):
+        """Transform brightness randomly."""
+        if random.uniform(0., 1.) >= self.brightness_cfg['prob']:
+            return results
+        img = results['img']
+        delta = random.uniform(self.brightness_cfg['min'],
+                               self.brightness_cfg['max'])
+        img += delta
+        results['img'] = img
+        return results
+
+    def transform(self, results: dict) -> dict:
+        """The hue, saturation, contrast and brightness distortion function.
+
+        Args:
+            results (dict): The result dict.
+
+        Returns:
+            dict: The result dict.
+        """
+        results['img'] = results['img'].astype(np.float32)
+
+        functions = [
+            self.transform_brightness, self.transform_contrast,
+            self.transform_saturation, self.transform_hue
+        ]
+        distortions = random.permutation(functions)[:self.num_distort_func]
+        for func in distortions:
+            results = func(results)
+        return results
+
+    def __repr__(self) -> str:
+        repr_str = self.__class__.__name__
+        repr_str += f'(hue_cfg={self.hue_cfg}, '
+        repr_str += f'saturation_cfg={self.saturation_cfg}, '
+        repr_str += f'contrast_cfg={self.contrast_cfg}, '
+        repr_str += f'brightness_cfg={self.brightness_cfg}, '
+        repr_str += f'num_distort_func={self.num_distort_func})'
+        return repr_str
+
+
+@TRANSFORMS.register_module()
+class PPYOLOERandomCrop(BaseTransform):
+    """Random crop the img and bboxes. Different thresholds are used in PPYOLOE
+    to judge whether the clipped image meets the requirements. This
+    implementation is different from the implementation of RandomCrop in mmdet.
+
+    Required Keys:
+
+    - img
+    - gt_bboxes (BaseBoxes[torch.float32]) (optional)
+    - gt_bboxes_labels (np.int64) (optional)
+    - gt_ignore_flags (bool) (optional)
+
+    Modified Keys:
+
+    - img
+    - img_shape
+    - gt_bboxes (optional)
+    - gt_bboxes_labels (optional)
+    - gt_ignore_flags (optional)
+
+    Added Keys:
+    - pad_param (np.float32)
+
+    Args:
+        aspect_ratio (List[float]): Aspect ratio of cropped region. Default to
+             [.5, 2].
+        thresholds (List[float]): Iou thresholds for deciding a valid bbox crop
+            in [min, max] format. Defaults to [.0, .1, .3, .5, .7, .9].
+        scaling (List[float]): Ratio between a cropped region and the original
+            image in [min, max] format. Default to [.3, 1.].
+        num_attempts (int): Number of tries for each threshold before
+            giving up. Default to 50.
+        allow_no_crop (bool): Allow return without actually cropping them.
+            Default to True.
+        cover_all_box (bool): Ensure all bboxes are covered in the final crop.
+            Default to False.
+    """
+
+    def __init__(self,
+                 aspect_ratio: List[float] = [.5, 2.],
+                 thresholds: List[float] = [.0, .1, .3, .5, .7, .9],
+                 scaling: List[float] = [.3, 1.],
+                 num_attempts: int = 50,
+                 allow_no_crop: bool = True,
+                 cover_all_box: bool = False):
+        self.aspect_ratio = aspect_ratio
+        self.thresholds = thresholds
+        self.scaling = scaling
+        self.num_attempts = num_attempts
+        self.allow_no_crop = allow_no_crop
+        self.cover_all_box = cover_all_box
+
+    def _crop_data(self, results: dict, crop_box: Tuple[int, int, int, int],
+                   valid_inds: np.ndarray) -> Union[dict, None]:
+        """Function to randomly crop images, bounding boxes, masks, semantic
+        segmentation maps.
+
+        Args:
+            results (dict): Result dict from loading pipeline.
+            crop_box (Tuple[int, int, int, int]): Expected absolute coordinates
+                for cropping, (x1, y1, x2, y2).
+            valid_inds (np.ndarray): The indexes of gt that needs to be
+                retained.
+
+        Returns:
+            results (Union[dict, None]): Randomly cropped results, 'img_shape'
+                key in result dict is updated according to crop size. None will
+                be returned when there is no valid bbox after cropping.
+        """
+        # crop the image
+        img = results['img']
+        crop_x1, crop_y1, crop_x2, crop_y2 = crop_box
+        img = img[crop_y1:crop_y2, crop_x1:crop_x2, ...]
+        results['img'] = img
+        img_shape = img.shape
+        results['img_shape'] = img.shape
+
+        # crop bboxes accordingly and clip to the image boundary
+        if results.get('gt_bboxes', None) is not None:
+            bboxes = results['gt_bboxes']
+            bboxes.translate_([-crop_x1, -crop_y1])
+            bboxes.clip_(img_shape[:2])
+
+            results['gt_bboxes'] = bboxes[valid_inds]
+
+            if results.get('gt_ignore_flags', None) is not None:
+                results['gt_ignore_flags'] = \
+                    results['gt_ignore_flags'][valid_inds]
+
+            if results.get('gt_bboxes_labels', None) is not None:
+                results['gt_bboxes_labels'] = \
+                    results['gt_bboxes_labels'][valid_inds]
+
+            if results.get('gt_masks', None) is not None:
+                results['gt_masks'] = results['gt_masks'][
+                    valid_inds.nonzero()[0]].crop(
+                        np.asarray([crop_x1, crop_y1, crop_x2, crop_y2]))
+
+        # crop semantic seg
+        if results.get('gt_seg_map', None) is not None:
+            results['gt_seg_map'] = results['gt_seg_map'][crop_y1:crop_y2,
+                                                          crop_x1:crop_x2]
+
+        return results
+
+    @autocast_box_type()
+    def transform(self, results: dict) -> Union[dict, None]:
+        """The random crop transform function.
+
+        Args:
+            results (dict): The result dict.
+
+        Returns:
+            dict: The result dict.
+        """
+        if results.get('gt_bboxes', None) is None or len(
+                results['gt_bboxes']) == 0:
+            return results
+
+        orig_img_h, orig_img_w = results['img'].shape[:2]
+        gt_bboxes = results['gt_bboxes']
+
+        thresholds = list(self.thresholds)
+        if self.allow_no_crop:
+            thresholds.append('no_crop')
+        random.shuffle(thresholds)
+
+        for thresh in thresholds:
+            # Determine the coordinates for cropping
+            if thresh == 'no_crop':
+                return results
+
+            found = False
+            for i in range(self.num_attempts):
+                crop_h, crop_w = self._get_crop_size((orig_img_h, orig_img_w))
+                if self.aspect_ratio is None:
+                    if crop_h / crop_w < 0.5 or crop_h / crop_w > 2.0:
+                        continue
+
+                # get image crop_box
+                margin_h = max(orig_img_h - crop_h, 0)
+                margin_w = max(orig_img_w - crop_w, 0)
+                offset_h, offset_w = self._rand_offset((margin_h, margin_w))
+                crop_y1, crop_y2 = offset_h, offset_h + crop_h
+                crop_x1, crop_x2 = offset_w, offset_w + crop_w
+
+                crop_box = [crop_x1, crop_y1, crop_x2, crop_y2]
+                # Calculate the iou between gt_bboxes and crop_boxes
+                iou = self._iou_matrix(gt_bboxes,
+                                       np.array([crop_box], dtype=np.float32))
+                # If the maximum value of the iou is less than thresh,
+                # the current crop_box is considered invalid.
+                if iou.max() < thresh:
+                    continue
+
+                # If cover_all_box == True and the minimum value of
+                # the iou is less than thresh, the current crop_box
+                # is considered invalid.
+                if self.cover_all_box and iou.min() < thresh:
+                    continue
+
+                # Get which gt_bboxes to keep after cropping.
+                valid_inds = self._get_valid_inds(
+                    gt_bboxes, np.array(crop_box, dtype=np.float32))
+                if valid_inds.size > 0:
+                    found = True
+                    break
+
+            if found:
+                results = self._crop_data(results, crop_box, valid_inds)
+                return results
+        return results
+
+    @cache_randomness
+    def _rand_offset(self, margin: Tuple[int, int]) -> Tuple[int, int]:
+        """Randomly generate crop offset.
+
+        Args:
+            margin (Tuple[int, int]): The upper bound for the offset generated
+                randomly.
+
+        Returns:
+            Tuple[int, int]: The random offset for the crop.
+        """
+        margin_h, margin_w = margin
+        offset_h = np.random.randint(0, margin_h + 1)
+        offset_w = np.random.randint(0, margin_w + 1)
+
+        return (offset_h, offset_w)
+
+    @cache_randomness
+    def _get_crop_size(self, image_size: Tuple[int, int]) -> Tuple[int, int]:
+        """Randomly generates the crop size based on `image_size`.
+
+        Args:
+            image_size (Tuple[int, int]): (h, w).
+
+        Returns:
+            crop_size (Tuple[int, int]): (crop_h, crop_w) in absolute pixels.
+        """
+        h, w = image_size
+        scale = random.uniform(*self.scaling)
+        if self.aspect_ratio is not None:
+            min_ar, max_ar = self.aspect_ratio
+            aspect_ratio = random.uniform(
+                max(min_ar, scale**2), min(max_ar, scale**-2))
+            h_scale = scale / np.sqrt(aspect_ratio)
+            w_scale = scale * np.sqrt(aspect_ratio)
+        else:
+            h_scale = random.uniform(*self.scaling)
+            w_scale = random.uniform(*self.scaling)
+        crop_h = h * h_scale
+        crop_w = w * w_scale
+        return int(crop_h), int(crop_w)
+
+    def _iou_matrix(self,
+                    gt_bbox: HorizontalBoxes,
+                    crop_bbox: np.ndarray,
+                    eps: float = 1e-10) -> np.ndarray:
+        """Calculate iou between gt and image crop box.
+
+        Args:
+            gt_bbox (HorizontalBoxes): Ground truth bounding boxes.
+            crop_bbox (np.ndarray): Image crop coordinates in
+                [x1, y1, x2, y2] format.
+            eps (float): Default to 1e-10.
+        Return:
+            (np.ndarray): IoU.
+        """
+        gt_bbox = gt_bbox.tensor.numpy()
+        lefttop = np.maximum(gt_bbox[:, np.newaxis, :2], crop_bbox[:, :2])
+        rightbottom = np.minimum(gt_bbox[:, np.newaxis, 2:], crop_bbox[:, 2:])
+
+        overlap = np.prod(
+            rightbottom - lefttop,
+            axis=2) * (lefttop < rightbottom).all(axis=2)
+        area_gt_bbox = np.prod(gt_bbox[:, 2:] - gt_bbox[:, :2], axis=1)
+        area_crop_bbox = np.prod(crop_bbox[:, 2:] - crop_bbox[:, :2], axis=1)
+        area_o = (area_gt_bbox[:, np.newaxis] + area_crop_bbox - overlap)
+        return overlap / (area_o + eps)
+
+    def _get_valid_inds(self, gt_bbox: HorizontalBoxes,
+                        img_crop_bbox: np.ndarray) -> np.ndarray:
+        """Get which Bboxes to keep at the current cropping coordinates.
+
+        Args:
+            gt_bbox (HorizontalBoxes): Ground truth bounding boxes.
+            img_crop_bbox (np.ndarray): Image crop coordinates in
+                [x1, y1, x2, y2] format.
+
+        Returns:
+            (np.ndarray): Valid indexes.
+        """
+        cropped_box = gt_bbox.tensor.numpy().copy()
+        gt_bbox = gt_bbox.tensor.numpy().copy()
+
+        cropped_box[:, :2] = np.maximum(gt_bbox[:, :2], img_crop_bbox[:2])
+        cropped_box[:, 2:] = np.minimum(gt_bbox[:, 2:], img_crop_bbox[2:])
+        cropped_box[:, :2] -= img_crop_bbox[:2]
+        cropped_box[:, 2:] -= img_crop_bbox[:2]
+
+        centers = (gt_bbox[:, :2] + gt_bbox[:, 2:]) / 2
+        valid = np.logical_and(img_crop_bbox[:2] <= centers,
+                               centers < img_crop_bbox[2:]).all(axis=1)
+        valid = np.logical_and(
+            valid, (cropped_box[:, :2] < cropped_box[:, 2:]).all(axis=1))
+
+        return np.where(valid)[0]
+
+    def __repr__(self) -> str:
+        repr_str = self.__class__.__name__
+        repr_str += f'(aspect_ratio={self.aspect_ratio}, '
+        repr_str += f'thresholds={self.thresholds}, '
+        repr_str += f'scaling={self.scaling}, '
+        repr_str += f'num_attempts={self.num_attempts}, '
+        repr_str += f'allow_no_crop={self.allow_no_crop}, '
+        repr_str += f'cover_all_box={self.cover_all_box})'
+        return repr_str
+
+
+@TRANSFORMS.register_module()
+class YOLOv5CopyPaste(BaseTransform):
+    """Copy-Paste used in YOLOv5 and YOLOv8.
+
+    This transform randomly copy some objects in the image to the mirror
+    position of the image.It is different from the `CopyPaste` in mmdet.
+
+    Required Keys:
+
+    - img (np.uint8)
+    - gt_bboxes (BaseBoxes[torch.float32])
+    - gt_bboxes_labels (np.int64) (optional)
+    - gt_ignore_flags (bool) (optional)
+    - gt_masks (PolygonMasks) (optional)
+
+    Modified Keys:
+
+    - img
+    - gt_bboxes
+    - gt_bboxes_labels (np.int64) (optional)
+    - gt_ignore_flags (optional)
+    - gt_masks (optional)
+
+    Args:
+        ioa_thresh (float): Ioa thresholds for deciding valid bbox.
+        prob (float): Probability of choosing objects.
+            Defaults to 0.5.
+    """
+
+    def __init__(self, ioa_thresh: float = 0.3, prob: float = 0.5):
+        self.ioa_thresh = ioa_thresh
+        self.prob = prob
+
+    @autocast_box_type()
+    def transform(self, results: dict) -> Union[dict, None]:
+        """The YOLOv5 and YOLOv8 Copy-Paste transform function.
+
+        Args:
+            results (dict): The result dict.
+
+        Returns:
+            dict: The result dict.
+        """
+        if len(results.get('gt_masks', [])) == 0:
+            return results
+        gt_masks = results['gt_masks']
+        assert isinstance(gt_masks, PolygonMasks), \
+            'only support type of PolygonMasks,' \
+            ' but get type: %s' % type(gt_masks)
+        gt_bboxes = results['gt_bboxes']
+        gt_bboxes_labels = results.get('gt_bboxes_labels', None)
+        img = results['img']
+        img_h, img_w = img.shape[:2]
+
+        # calculate ioa
+        gt_bboxes_flip = deepcopy(gt_bboxes)
+        gt_bboxes_flip.flip_(img.shape)
+
+        ioa = self.bbox_ioa(gt_bboxes_flip, gt_bboxes)
+        indexes = torch.nonzero((ioa < self.ioa_thresh).all(1))[:, 0]
+        n = len(indexes)
+        valid_inds = random.choice(
+            indexes, size=round(self.prob * n), replace=False)
+        if len(valid_inds) == 0:
+            return results
+
+        if gt_bboxes_labels is not None:
+            # prepare labels
+            gt_bboxes_labels = np.concatenate(
+                (gt_bboxes_labels, gt_bboxes_labels[valid_inds]), axis=0)
+
+        # prepare bboxes
+        copypaste_bboxes = gt_bboxes_flip[valid_inds]
+        gt_bboxes = gt_bboxes.cat([gt_bboxes, copypaste_bboxes])
+
+        # prepare images
+        copypaste_gt_masks = gt_masks[valid_inds]
+        copypaste_gt_masks_flip = copypaste_gt_masks.flip()
+        # convert poly format to bitmap format
+        # example: poly: [[array(0.0, 0.0, 10.0, 0.0, 10.0, 10.0, 0.0, 10.0]]
+        #  -> bitmap: a mask with shape equal to (1, img_h, img_w)
+        # # type1 low speed
+        # copypaste_gt_masks_bitmap = copypaste_gt_masks.to_ndarray()
+        # copypaste_mask = np.sum(copypaste_gt_masks_bitmap, axis=0) > 0
+
+        # type2
+        copypaste_mask = np.zeros((img_h, img_w), dtype=np.uint8)
+        for poly in copypaste_gt_masks.masks:
+            poly = [i.reshape((-1, 1, 2)).astype(np.int32) for i in poly]
+            cv2.drawContours(copypaste_mask, poly, -1, (1, ), cv2.FILLED)
+
+        copypaste_mask = copypaste_mask.astype(bool)
+
+        # copy objects, and paste to the mirror position of the image
+        copypaste_mask_flip = mmcv.imflip(
+            copypaste_mask, direction='horizontal')
+        copypaste_img = mmcv.imflip(img, direction='horizontal')
+        img[copypaste_mask_flip] = copypaste_img[copypaste_mask_flip]
+
+        # prepare masks
+        gt_masks = copypaste_gt_masks.cat([gt_masks, copypaste_gt_masks_flip])
+
+        if 'gt_ignore_flags' in results:
+            # prepare gt_ignore_flags
+            gt_ignore_flags = results['gt_ignore_flags']
+            gt_ignore_flags = np.concatenate(
+                [gt_ignore_flags, gt_ignore_flags[valid_inds]], axis=0)
+            results['gt_ignore_flags'] = gt_ignore_flags
+
+        results['img'] = img
+        results['gt_bboxes'] = gt_bboxes
+        if gt_bboxes_labels is not None:
+            results['gt_bboxes_labels'] = gt_bboxes_labels
+        results['gt_masks'] = gt_masks
+
+        return results
+
+    @staticmethod
+    def bbox_ioa(gt_bboxes_flip: HorizontalBoxes,
+                 gt_bboxes: HorizontalBoxes,
+                 eps: float = 1e-7) -> np.ndarray:
+        """Calculate ioa between gt_bboxes_flip and gt_bboxes.
+
+        Args:
+            gt_bboxes_flip (HorizontalBoxes): Flipped ground truth
+                bounding boxes.
+            gt_bboxes (HorizontalBoxes): Ground truth bounding boxes.
+            eps (float): Default to 1e-10.
+        Return:
+            (Tensor): Ioa.
+        """
+        gt_bboxes_flip = gt_bboxes_flip.tensor
+        gt_bboxes = gt_bboxes.tensor
+
+        # Get the coordinates of bounding boxes
+        b1_x1, b1_y1, b1_x2, b1_y2 = gt_bboxes_flip.T
+        b2_x1, b2_y1, b2_x2, b2_y2 = gt_bboxes.T
+
+        # Intersection area
+        inter_area = (torch.minimum(b1_x2[:, None],
+                                    b2_x2) - torch.maximum(b1_x1[:, None],
+                                                           b2_x1)).clip(0) * \
+                     (torch.minimum(b1_y2[:, None],
+                                    b2_y2) - torch.maximum(b1_y1[:, None],
+                                                           b2_y1)).clip(0)
+
+        # box2 area
+        box2_area = (b2_x2 - b2_x1) * (b2_y2 - b2_y1) + eps
+
+        # Intersection over box2 area
+        return inter_area / box2_area
+
+    def __repr__(self) -> str:
+        repr_str = self.__class__.__name__
+        repr_str += f'(ioa_thresh={self.ioa_thresh},'
+        repr_str += f'prob={self.prob})'
+        return repr_str
+
+
+@TRANSFORMS.register_module()
+class RemoveDataElement(BaseTransform):
+    """Remove unnecessary data element in results.
+
+    Args:
+        keys (Union[str, Sequence[str]]): Keys need to be removed.
+    """
+
+    def __init__(self, keys: Union[str, Sequence[str]]):
+        self.keys = [keys] if isinstance(keys, str) else keys
+
+    def transform(self, results: dict) -> dict:
+        for key in self.keys:
+            results.pop(key, None)
+        return results
+
+    def __repr__(self) -> str:
+        repr_str = self.__class__.__name__
+        repr_str += f'(keys={self.keys})'
+        return repr_str
+
+
+@TRANSFORMS.register_module()
+class RegularizeRotatedBox(BaseTransform):
+    """Regularize rotated boxes.
+
+    Due to the angle periodicity, one rotated box can be represented in
+    many different (x, y, w, h, t). To make each rotated box unique,
+    ``regularize_boxes`` will take the remainder of the angle divided by
+    180 degrees.
+
+    For convenience, three angle_version can be used here:
+
+    - 'oc': OpenCV Definition. Has the same box representation as
+        ``cv2.minAreaRect`` the angle ranges in [-90, 0).
+    - 'le90': Long Edge Definition (90). the angle ranges in [-90, 90).
+        The width is always longer than the height.
+    - 'le135': Long Edge Definition (135). the angle ranges in [-45, 135).
+        The width is always longer than the height.
+
+    Required Keys:
+
+    - gt_bboxes (RotatedBoxes[torch.float32])
+
+    Modified Keys:
+
+    - gt_bboxes
+
+    Args:
+        angle_version (str): Angle version. Can only be 'oc',
+            'le90', or 'le135'. Defaults to 'le90.
+    """
+
+    def __init__(self, angle_version='le90') -> None:
+        self.angle_version = angle_version
+        try:
+            from mmrotate.structures.bbox import RotatedBoxes
+            self.box_type = RotatedBoxes
+        except ImportError:
+            raise ImportError(
+                'Please run "mim install -r requirements/mmrotate.txt" '
+                'to install mmrotate first for rotated detection.')
+
+    def transform(self, results: dict) -> dict:
+        assert isinstance(results['gt_bboxes'], self.box_type)
+        results['gt_bboxes'] = self.box_type(
+            results['gt_bboxes'].regularize_boxes(self.angle_version))
+        return results
+
+
+@TRANSFORMS.register_module()
+class Polygon2Mask(BaseTransform):
+    """Polygons to bitmaps in YOLOv5.
+
+    Args:
+        downsample_ratio (int): Downsample ratio of mask.
+        mask_overlap (bool): Whether to use maskoverlap in mask process.
+            When set to True, the implementation here is the same as the
+            official, with higher training speed. If set to True, all gt masks
+            will compress into one overlap mask, the value of mask indicates
+            the index of gt masks. If set to False, one mask is a binary mask.
+            Default to True.
+        coco_style (bool): Whether to use coco_style to convert the polygons to
+            bitmaps. Note that this option is only used to test if there is an
+            improvement in training speed and we recommend setting it to False.
+    """
+
+    def __init__(self,
+                 downsample_ratio: int = 4,
+                 mask_overlap: bool = True,
+                 coco_style: bool = False):
+        self.downsample_ratio = downsample_ratio
+        self.mask_overlap = mask_overlap
+        self.coco_style = coco_style
+
+    def polygon2mask(self,
+                     img_shape: Tuple[int, int],
+                     polygons: np.ndarray,
+                     color: int = 1) -> np.ndarray:
+        """
+        Args:
+            img_shape (tuple): The image size.
+            polygons (np.ndarray): [N, M], N is the number of polygons,
+                M is the number of points(Be divided by 2).
+            color (int): color in fillPoly.
+        Return:
+            np.ndarray: the overlap mask.
+        """
+        nh, nw = (img_shape[0] // self.downsample_ratio,
+                  img_shape[1] // self.downsample_ratio)
+        if self.coco_style:
+            # This practice can lead to the loss of small objects
+            # polygons = polygons.resize((nh, nw)).masks
+            # polygons = np.asarray(polygons).reshape(-1)
+            # mask = polygon_to_bitmap([polygons], nh, nw)
+
+            polygons = np.asarray(polygons).reshape(-1)
+            mask = polygon_to_bitmap([polygons], img_shape[0],
+                                     img_shape[1]).astype(np.uint8)
+            mask = mmcv.imresize(mask, (nw, nh))
+        else:
+            mask = np.zeros(img_shape, dtype=np.uint8)
+            polygons = np.asarray(polygons)
+            polygons = polygons.astype(np.int32)
+            shape = polygons.shape
+            polygons = polygons.reshape(shape[0], -1, 2)
+            cv2.fillPoly(mask, polygons, color=color)
+            # NOTE: fillPoly firstly then resize is trying the keep the same
+            #  way of loss calculation when mask-ratio=1.
+            mask = mmcv.imresize(mask, (nw, nh))
+        return mask
+
+    def polygons2masks(self,
+                       img_shape: Tuple[int, int],
+                       polygons: PolygonMasks,
+                       color: int = 1) -> np.ndarray:
+        """Return a list of bitmap masks.
+
+        Args:
+            img_shape (tuple): The image size.
+            polygons (PolygonMasks): The mask annotations.
+            color (int): color in fillPoly.
+        Return:
+            List[np.ndarray]: the list of masks in bitmaps.
+        """
+        if self.coco_style:
+            nh, nw = (img_shape[0] // self.downsample_ratio,
+                      img_shape[1] // self.downsample_ratio)
+            masks = polygons.resize((nh, nw)).to_ndarray()
+            return masks
+        else:
+            masks = []
+            for si in range(len(polygons)):
+                mask = self.polygon2mask(img_shape, polygons[si], color)
+                masks.append(mask)
+            return np.array(masks)
+
+    def polygons2masks_overlap(
+            self, img_shape: Tuple[int, int],
+            polygons: PolygonMasks) -> Tuple[np.ndarray, np.ndarray]:
+        """Return a overlap mask and the sorted idx of area.
+
+        Args:
+            img_shape (tuple): The image size.
+            polygons (PolygonMasks): The mask annotations.
+            color (int): color in fillPoly.
+        Return:
+            Tuple[np.ndarray, np.ndarray]:
+                the overlap mask and the sorted idx of area.
+        """
+        masks = np.zeros((img_shape[0] // self.downsample_ratio,
+                          img_shape[1] // self.downsample_ratio),
+                         dtype=np.int32 if len(polygons) > 255 else np.uint8)
+        areas = []
+        ms = []
+        for si in range(len(polygons)):
+            mask = self.polygon2mask(img_shape, polygons[si], color=1)
+            ms.append(mask)
+            areas.append(mask.sum())
+        areas = np.asarray(areas)
+        index = np.argsort(-areas)
+        ms = np.array(ms)[index]
+        for i in range(len(polygons)):
+            mask = ms[i] * (i + 1)
+            masks = masks + mask
+            masks = np.clip(masks, a_min=0, a_max=i + 1)
+        return masks, index
+
+    def transform(self, results: dict) -> dict:
+        gt_masks = results['gt_masks']
+        assert isinstance(gt_masks, PolygonMasks)
+
+        if self.mask_overlap:
+            masks, sorted_idx = self.polygons2masks_overlap(
+                (gt_masks.height, gt_masks.width), gt_masks)
+            results['gt_bboxes'] = results['gt_bboxes'][sorted_idx]
+            results['gt_bboxes_labels'] = results['gt_bboxes_labels'][
+                sorted_idx]
+
+            # In this case we put gt_masks in gt_panoptic_seg
+            results.pop('gt_masks')
+            results['gt_panoptic_seg'] = torch.from_numpy(masks[None])
+        else:
+            masks = self.polygons2masks((gt_masks.height, gt_masks.width),
+                                        gt_masks,
+                                        color=1)
+            masks = torch.from_numpy(masks)
+            # Consistent logic with mmdet
+            results['gt_masks'] = masks
+        return results
+
+
+@TRANSFORMS.register_module()
+class FilterAnnotations(FilterDetAnnotations):
+    """Filter invalid annotations.
+
+    In addition to the conditions checked by ``FilterDetAnnotations``, this
+    filter adds a new condition requiring instances to have at least one
+    visible keypoints.
+    """
+
+    def __init__(self, by_keypoints: bool = False, **kwargs) -> None:
+        # TODO: add more filter options
+        super().__init__(**kwargs)
+        self.by_keypoints = by_keypoints
+
+    @autocast_box_type()
+    def transform(self, results: dict) -> Union[dict, None]:
+        """Transform function to filter annotations.
+
+        Args:
+            results (dict): Result dict.
+        Returns:
+            dict: Updated result dict.
+        """
+        assert 'gt_bboxes' in results
+        gt_bboxes = results['gt_bboxes']
+        if gt_bboxes.shape[0] == 0:
+            return results
+
+        tests = []
+        if self.by_box:
+            tests.append(
+                ((gt_bboxes.widths > self.min_gt_bbox_wh[0]) &
+                 (gt_bboxes.heights > self.min_gt_bbox_wh[1])).numpy())
+
+        if self.by_mask:
+            assert 'gt_masks' in results
+            gt_masks = results['gt_masks']
+            tests.append(gt_masks.areas >= self.min_gt_mask_area)
+
+        if self.by_keypoints:
+            assert 'gt_keypoints' in results
+            num_keypoints = results['gt_keypoints'].num_keypoints
+            tests.append((num_keypoints > 0).numpy())
+
+        keep = tests[0]
+        for t in tests[1:]:
+            keep = keep & t
+
+        if not keep.any():
+            if self.keep_empty:
+                return None
+
+        keys = ('gt_bboxes', 'gt_bboxes_labels', 'gt_masks', 'gt_ignore_flags',
+                'gt_keypoints')
+        for key in keys:
+            if key in results:
+                results[key] = results[key][keep]
+
+        return results
+
+
+# TODO: Check if it can be merged with mmdet.YOLOXHSVRandomAug
+@TRANSFORMS.register_module()
+class RandomAffine(MMDET_RandomAffine):
+
+    def __init__(self, **kwargs) -> None:
+        super().__init__(**kwargs)
+
+    @autocast_box_type()
+    def transform(self, results: dict) -> dict:
+        img = results['img']
+        height = img.shape[0] + self.border[1] * 2
+        width = img.shape[1] + self.border[0] * 2
+
+        warp_matrix = self._get_random_homography_matrix(height, width)
+
+        img = cv2.warpPerspective(
+            img,
+            warp_matrix,
+            dsize=(width, height),
+            borderValue=self.border_val)
+        results['img'] = img
+        results['img_shape'] = img.shape
+
+        bboxes = results['gt_bboxes']
+        num_bboxes = len(bboxes)
+        if num_bboxes:
+            bboxes.project_(warp_matrix)
+            if self.bbox_clip_border:
+                bboxes.clip_([height, width])
+            # remove outside bbox
+            valid_index = bboxes.is_inside([height, width]).numpy()
+            results['gt_bboxes'] = bboxes[valid_index]
+            results['gt_bboxes_labels'] = results['gt_bboxes_labels'][
+                valid_index]
+            results['gt_ignore_flags'] = results['gt_ignore_flags'][
+                valid_index]
+
+            if 'gt_masks' in results:
+                raise NotImplementedError('RandomAffine only supports bbox.')
+
+            if 'gt_keypoints' in results:
+                keypoints = results['gt_keypoints']
+                keypoints.project_(warp_matrix)
+                if self.bbox_clip_border:
+                    keypoints.clip_([height, width])
+                results['gt_keypoints'] = keypoints[valid_index]
+
+        return results
+
+    def __repr__(self) -> str:
+        repr_str = self.__class__.__name__
+        repr_str += f'(hue_delta={self.hue_delta}, '
+        repr_str += f'saturation_delta={self.saturation_delta}, '
+        repr_str += f'value_delta={self.value_delta})'
+        return repr_str
+
+
+# TODO: Check if it can be merged with mmdet.YOLOXHSVRandomAug
+@TRANSFORMS.register_module()
+class RandomFlip(MMDET_RandomFlip):
+
+    @autocast_box_type()
+    def _flip(self, results: dict) -> None:
+        """Flip images, bounding boxes, and semantic segmentation map."""
+        # flip image
+        results['img'] = mmcv.imflip(
+            results['img'], direction=results['flip_direction'])
+
+        img_shape = results['img'].shape[:2]
+
+        # flip bboxes
+        if results.get('gt_bboxes', None) is not None:
+            results['gt_bboxes'].flip_(img_shape, results['flip_direction'])
+
+        # flip keypoints
+        if results.get('gt_keypoints', None) is not None:
+            results['gt_keypoints'].flip_(img_shape, results['flip_direction'])
+
+        # flip masks
+        if results.get('gt_masks', None) is not None:
+            results['gt_masks'] = results['gt_masks'].flip(
+                results['flip_direction'])
+
+        # flip segs
+        if results.get('gt_seg_map', None) is not None:
+            results['gt_seg_map'] = mmcv.imflip(
+                results['gt_seg_map'], direction=results['flip_direction'])
+
+        # record homography matrix for flip
+        self._record_homography_matrix(results)
+
+
+@TRANSFORMS.register_module()
+class Resize(MMDET_Resize):
+
+    def _resize_keypoints(self, results: dict) -> None:
+        """Resize bounding boxes with ``results['scale_factor']``."""
+        if results.get('gt_keypoints', None) is not None:
+            results['gt_keypoints'].rescale_(results['scale_factor'])
+            if self.clip_object_border:
+                results['gt_keypoints'].clip_(results['img_shape'])
+
+    @autocast_box_type()
+    def transform(self, results: dict) -> dict:
+        """Transform function to resize images, bounding boxes and semantic
+        segmentation map.
+
+        Args:
+            results (dict): Result dict from loading pipeline.
+        Returns:
+            dict: Resized results, 'img', 'gt_bboxes', 'gt_seg_map',
+            'scale', 'scale_factor', 'height', 'width', and 'keep_ratio' keys
+            are updated in result dict.
+        """
+        if self.scale:
+            results['scale'] = self.scale
+        else:
+            img_shape = results['img'].shape[:2]
+            results['scale'] = _scale_size(img_shape[::-1], self.scale_factor)
+        self._resize_img(results)
+        self._resize_bboxes(results)
+        self._resize_keypoints(results)
+        self._resize_masks(results)
+        self._resize_seg(results)
+        self._record_homography_matrix(results)
+        return results
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/datasets/utils.py b/mmdetection_practice/third_party/mmyolo/mmyolo/datasets/utils.py
new file mode 100644
index 0000000..efa2ff5
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/datasets/utils.py
@@ -0,0 +1,133 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from typing import List, Sequence
+
+import numpy as np
+import torch
+from mmengine.dataset import COLLATE_FUNCTIONS
+from mmengine.dist import get_dist_info
+
+from ..registry import TASK_UTILS
+
+
+@COLLATE_FUNCTIONS.register_module()
+def yolov5_collate(data_batch: Sequence,
+                   use_ms_training: bool = False) -> dict:
+    """Rewrite collate_fn to get faster training speed.
+
+    Args:
+       data_batch (Sequence): Batch of data.
+       use_ms_training (bool): Whether to use multi-scale training.
+    """
+    batch_imgs = []
+    batch_bboxes_labels = []
+    batch_masks = []
+    batch_keyponits = []
+    batch_keypoints_visible = []
+    for i in range(len(data_batch)):
+        datasamples = data_batch[i]['data_samples']
+        inputs = data_batch[i]['inputs']
+        batch_imgs.append(inputs)
+
+        gt_bboxes = datasamples.gt_instances.bboxes.tensor
+        gt_labels = datasamples.gt_instances.labels
+        if 'masks' in datasamples.gt_instances:
+            masks = datasamples.gt_instances.masks
+            batch_masks.append(masks)
+        if 'gt_panoptic_seg' in datasamples:
+            batch_masks.append(datasamples.gt_panoptic_seg.pan_seg)
+        if 'keypoints' in datasamples.gt_instances:
+            keypoints = datasamples.gt_instances.keypoints
+            keypoints_visible = datasamples.gt_instances.keypoints_visible
+            batch_keyponits.append(keypoints)
+            batch_keypoints_visible.append(keypoints_visible)
+
+        batch_idx = gt_labels.new_full((len(gt_labels), 1), i)
+        bboxes_labels = torch.cat((batch_idx, gt_labels[:, None], gt_bboxes),
+                                  dim=1)
+        batch_bboxes_labels.append(bboxes_labels)
+    collated_results = {
+        'data_samples': {
+            'bboxes_labels': torch.cat(batch_bboxes_labels, 0)
+        }
+    }
+    if len(batch_masks) > 0:
+        collated_results['data_samples']['masks'] = torch.cat(batch_masks, 0)
+
+    if len(batch_keyponits) > 0:
+        collated_results['data_samples']['keypoints'] = torch.cat(
+            batch_keyponits, 0)
+        collated_results['data_samples']['keypoints_visible'] = torch.cat(
+            batch_keypoints_visible, 0)
+
+    if use_ms_training:
+        collated_results['inputs'] = batch_imgs
+    else:
+        collated_results['inputs'] = torch.stack(batch_imgs, 0)
+    return collated_results
+
+
+@TASK_UTILS.register_module()
+class BatchShapePolicy:
+    """BatchShapePolicy is only used in the testing phase, which can reduce the
+    number of pad pixels during batch inference.
+
+    Args:
+       batch_size (int): Single GPU batch size during batch inference.
+           Defaults to 32.
+       img_size (int): Expected output image size. Defaults to 640.
+       size_divisor (int): The minimum size that is divisible
+           by size_divisor. Defaults to 32.
+       extra_pad_ratio (float):  Extra pad ratio. Defaults to 0.5.
+    """
+
+    def __init__(self,
+                 batch_size: int = 32,
+                 img_size: int = 640,
+                 size_divisor: int = 32,
+                 extra_pad_ratio: float = 0.5):
+        self.img_size = img_size
+        self.size_divisor = size_divisor
+        self.extra_pad_ratio = extra_pad_ratio
+        _, world_size = get_dist_info()
+        # During multi-gpu testing, the batchsize should be multiplied by
+        # worldsize, so that the number of batches can be calculated correctly.
+        # The index of batches will affect the calculation of batch shape.
+        self.batch_size = batch_size * world_size
+
+    def __call__(self, data_list: List[dict]) -> List[dict]:
+        image_shapes = []
+        for data_info in data_list:
+            image_shapes.append((data_info['width'], data_info['height']))
+
+        image_shapes = np.array(image_shapes, dtype=np.float64)
+
+        n = len(image_shapes)  # number of images
+        batch_index = np.floor(np.arange(n) / self.batch_size).astype(
+            np.int64)  # batch index
+        number_of_batches = batch_index[-1] + 1  # number of batches
+
+        aspect_ratio = image_shapes[:, 1] / image_shapes[:, 0]  # aspect ratio
+        irect = aspect_ratio.argsort()
+
+        data_list = [data_list[i] for i in irect]
+
+        aspect_ratio = aspect_ratio[irect]
+        # Set training image shapes
+        shapes = [[1, 1]] * number_of_batches
+        for i in range(number_of_batches):
+            aspect_ratio_index = aspect_ratio[batch_index == i]
+            min_index, max_index = aspect_ratio_index.min(
+            ), aspect_ratio_index.max()
+            if max_index < 1:
+                shapes[i] = [max_index, 1]
+            elif min_index > 1:
+                shapes[i] = [1, 1 / min_index]
+
+        batch_shapes = np.ceil(
+            np.array(shapes) * self.img_size / self.size_divisor +
+            self.extra_pad_ratio).astype(np.int64) * self.size_divisor
+
+        for i, data_info in enumerate(data_list):
+            data_info['batch_shape'] = batch_shapes[batch_index[i]]
+
+        return data_list
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/datasets/yolov5_coco.py b/mmdetection_practice/third_party/mmyolo/mmyolo/datasets/yolov5_coco.py
new file mode 100644
index 0000000..55bc899
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/datasets/yolov5_coco.py
@@ -0,0 +1,65 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from typing import Any, Optional
+
+from mmdet.datasets import BaseDetDataset, CocoDataset
+
+from ..registry import DATASETS, TASK_UTILS
+
+
+class BatchShapePolicyDataset(BaseDetDataset):
+    """Dataset with the batch shape policy that makes paddings with least
+    pixels during batch inference process, which does not require the image
+    scales of all batches to be the same throughout validation."""
+
+    def __init__(self,
+                 *args,
+                 batch_shapes_cfg: Optional[dict] = None,
+                 **kwargs):
+        self.batch_shapes_cfg = batch_shapes_cfg
+        super().__init__(*args, **kwargs)
+
+    def full_init(self):
+        """rewrite full_init() to be compatible with serialize_data in
+        BatchShapePolicy."""
+        if self._fully_initialized:
+            return
+        # load data information
+        self.data_list = self.load_data_list()
+
+        # batch_shapes_cfg
+        if self.batch_shapes_cfg:
+            batch_shapes_policy = TASK_UTILS.build(self.batch_shapes_cfg)
+            self.data_list = batch_shapes_policy(self.data_list)
+            del batch_shapes_policy
+
+        # filter illegal data, such as data that has no annotations.
+        self.data_list = self.filter_data()
+        # Get subset data according to indices.
+        if self._indices is not None:
+            self.data_list = self._get_unserialized_subset(self._indices)
+
+        # serialize data_list
+        if self.serialize_data:
+            self.data_bytes, self.data_address = self._serialize_data()
+
+        self._fully_initialized = True
+
+    def prepare_data(self, idx: int) -> Any:
+        """Pass the dataset to the pipeline during training to support mixed
+        data augmentation, such as Mosaic and MixUp."""
+        if self.test_mode is False:
+            data_info = self.get_data_info(idx)
+            data_info['dataset'] = self
+            return self.pipeline(data_info)
+        else:
+            return super().prepare_data(idx)
+
+
+@DATASETS.register_module()
+class YOLOv5CocoDataset(BatchShapePolicyDataset, CocoDataset):
+    """Dataset for YOLOv5 COCO Dataset.
+
+    We only add `BatchShapePolicy` function compared with CocoDataset. See
+    `mmyolo/datasets/utils.py#BatchShapePolicy` for details
+    """
+    pass
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/datasets/yolov5_crowdhuman.py b/mmdetection_practice/third_party/mmyolo/mmyolo/datasets/yolov5_crowdhuman.py
new file mode 100644
index 0000000..486a832
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/datasets/yolov5_crowdhuman.py
@@ -0,0 +1,15 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from mmdet.datasets import CrowdHumanDataset
+
+from ..registry import DATASETS
+from .yolov5_coco import BatchShapePolicyDataset
+
+
+@DATASETS.register_module()
+class YOLOv5CrowdHumanDataset(BatchShapePolicyDataset, CrowdHumanDataset):
+    """Dataset for YOLOv5 CrowdHuman Dataset.
+
+    We only add `BatchShapePolicy` function compared with CrowdHumanDataset.
+    See `mmyolo/datasets/utils.py#BatchShapePolicy` for details
+    """
+    pass
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/datasets/yolov5_dota.py b/mmdetection_practice/third_party/mmyolo/mmyolo/datasets/yolov5_dota.py
new file mode 100644
index 0000000..a964798
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/datasets/yolov5_dota.py
@@ -0,0 +1,29 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+
+from mmyolo.datasets.yolov5_coco import BatchShapePolicyDataset
+from ..registry import DATASETS
+
+try:
+    from mmrotate.datasets import DOTADataset
+    MMROTATE_AVAILABLE = True
+except ImportError:
+    from mmengine.dataset import BaseDataset
+    DOTADataset = BaseDataset
+    MMROTATE_AVAILABLE = False
+
+
+@DATASETS.register_module()
+class YOLOv5DOTADataset(BatchShapePolicyDataset, DOTADataset):
+    """Dataset for YOLOv5 DOTA Dataset.
+
+    We only add `BatchShapePolicy` function compared with DOTADataset. See
+    `mmyolo/datasets/utils.py#BatchShapePolicy` for details
+    """
+
+    def __init__(self, *args, **kwargs):
+        if not MMROTATE_AVAILABLE:
+            raise ImportError(
+                'Please run "mim install -r requirements/mmrotate.txt" '
+                'to install mmrotate first for rotated detection.')
+
+        super().__init__(*args, **kwargs)
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/datasets/yolov5_voc.py b/mmdetection_practice/third_party/mmyolo/mmyolo/datasets/yolov5_voc.py
new file mode 100644
index 0000000..5be764f
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/datasets/yolov5_voc.py
@@ -0,0 +1,15 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from mmdet.datasets import VOCDataset
+
+from mmyolo.datasets.yolov5_coco import BatchShapePolicyDataset
+from ..registry import DATASETS
+
+
+@DATASETS.register_module()
+class YOLOv5VOCDataset(BatchShapePolicyDataset, VOCDataset):
+    """Dataset for YOLOv5 VOC Dataset.
+
+    We only add `BatchShapePolicy` function compared with VOCDataset. See
+    `mmyolo/datasets/utils.py#BatchShapePolicy` for details
+    """
+    pass
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/deploy/__init__.py b/mmdetection_practice/third_party/mmyolo/mmyolo/deploy/__init__.py
new file mode 100644
index 0000000..4904a90
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/deploy/__init__.py
@@ -0,0 +1,7 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from mmdeploy.codebase.base import MMCodebase
+
+from .models import *  # noqa: F401,F403
+from .object_detection import MMYOLO, YOLOObjectDetection
+
+__all__ = ['MMCodebase', 'MMYOLO', 'YOLOObjectDetection']
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/deploy/models/__init__.py b/mmdetection_practice/third_party/mmyolo/mmyolo/deploy/models/__init__.py
new file mode 100644
index 0000000..4b999a0
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/deploy/models/__init__.py
@@ -0,0 +1,2 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from . import dense_heads  # noqa: F401,F403
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/deploy/models/dense_heads/__init__.py b/mmdetection_practice/third_party/mmyolo/mmyolo/deploy/models/dense_heads/__init__.py
new file mode 100644
index 0000000..cc423af
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/deploy/models/dense_heads/__init__.py
@@ -0,0 +1,4 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from . import yolov5_head  # noqa: F401,F403
+
+__all__ = ['yolov5_head']
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/deploy/models/dense_heads/yolov5_head.py b/mmdetection_practice/third_party/mmyolo/mmyolo/deploy/models/dense_heads/yolov5_head.py
new file mode 100644
index 0000000..ac996ba
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/deploy/models/dense_heads/yolov5_head.py
@@ -0,0 +1,189 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+import copy
+from functools import partial
+from typing import List, Optional, Tuple
+
+import torch
+from mmdeploy.codebase.mmdet import get_post_processing_params
+from mmdeploy.codebase.mmdet.models.layers import multiclass_nms
+from mmdeploy.core import FUNCTION_REWRITER
+from mmengine.config import ConfigDict
+from mmengine.structures import InstanceData
+from torch import Tensor
+
+from mmyolo.deploy.models.layers import efficient_nms
+from mmyolo.models.dense_heads import YOLOv5Head
+
+
+def yolov5_bbox_decoder(priors: Tensor, bbox_preds: Tensor,
+                        stride: int) -> Tensor:
+    """Decode YOLOv5 bounding boxes.
+
+    Args:
+        priors (Tensor): Prior boxes in center-offset form.
+        bbox_preds (Tensor): Predicted bounding boxes.
+        stride (int): Stride of the feature map.
+
+    Returns:
+        Tensor: Decoded bounding boxes.
+    """
+    bbox_preds = bbox_preds.sigmoid()
+
+    x_center = (priors[..., 0] + priors[..., 2]) * 0.5
+    y_center = (priors[..., 1] + priors[..., 3]) * 0.5
+    w = priors[..., 2] - priors[..., 0]
+    h = priors[..., 3] - priors[..., 1]
+
+    x_center_pred = (bbox_preds[..., 0] - 0.5) * 2 * stride + x_center
+    y_center_pred = (bbox_preds[..., 1] - 0.5) * 2 * stride + y_center
+    w_pred = (bbox_preds[..., 2] * 2)**2 * w
+    h_pred = (bbox_preds[..., 3] * 2)**2 * h
+
+    decoded_bboxes = torch.stack(
+        [x_center_pred, y_center_pred, w_pred, h_pred], dim=-1)
+
+    return decoded_bboxes
+
+
+@FUNCTION_REWRITER.register_rewriter(
+    func_name='mmyolo.models.dense_heads.yolov5_head.'
+    'YOLOv5Head.predict_by_feat')
+def yolov5_head__predict_by_feat(self,
+                                 cls_scores: List[Tensor],
+                                 bbox_preds: List[Tensor],
+                                 objectnesses: Optional[List[Tensor]] = None,
+                                 batch_img_metas: Optional[List[dict]] = None,
+                                 cfg: Optional[ConfigDict] = None,
+                                 rescale: bool = False,
+                                 with_nms: bool = True) -> Tuple[InstanceData]:
+    """Transform a batch of output features extracted by the head into
+    bbox results.
+    Args:
+        cls_scores (list[Tensor]): Classification scores for all
+            scale levels, each is a 4D-tensor, has shape
+            (batch_size, num_priors * num_classes, H, W).
+        bbox_preds (list[Tensor]): Box energies / deltas for all
+            scale levels, each is a 4D-tensor, has shape
+            (batch_size, num_priors * 4, H, W).
+        objectnesses (list[Tensor], Optional): Score factor for
+            all scale level, each is a 4D-tensor, has shape
+            (batch_size, 1, H, W).
+        batch_img_metas (list[dict], Optional): Batch image meta info.
+            Defaults to None.
+        cfg (ConfigDict, optional): Test / postprocessing
+            configuration, if None, test_cfg would be used.
+            Defaults to None.
+        rescale (bool): If True, return boxes in original image space.
+            Defaults to False.
+        with_nms (bool): If True, do nms before return boxes.
+            Defaults to True.
+    Returns:
+        tuple[Tensor, Tensor]: The first item is an (N, num_box, 5) tensor,
+            where 5 represent (tl_x, tl_y, br_x, br_y, score), N is batch
+            size and the score between 0 and 1. The shape of the second
+            tensor in the tuple is (N, num_box), and each element
+            represents the class label of the corresponding box.
+    """
+    ctx = FUNCTION_REWRITER.get_context()
+    detector_type = type(self)
+    deploy_cfg = ctx.cfg
+    use_efficientnms = deploy_cfg.get('use_efficientnms', False)
+    dtype = cls_scores[0].dtype
+    device = cls_scores[0].device
+    bbox_decoder = self.bbox_coder.decode
+    nms_func = multiclass_nms
+    if use_efficientnms:
+        if detector_type is YOLOv5Head:
+            nms_func = partial(efficient_nms, box_coding=0)
+            bbox_decoder = yolov5_bbox_decoder
+        else:
+            nms_func = efficient_nms
+
+    assert len(cls_scores) == len(bbox_preds)
+    cfg = self.test_cfg if cfg is None else cfg
+    cfg = copy.deepcopy(cfg)
+
+    num_imgs = cls_scores[0].shape[0]
+    featmap_sizes = [cls_score.shape[2:] for cls_score in cls_scores]
+
+    mlvl_priors = self.prior_generator.grid_priors(
+        featmap_sizes, dtype=dtype, device=device)
+
+    flatten_priors = torch.cat(mlvl_priors)
+
+    mlvl_strides = [
+        flatten_priors.new_full(
+            (featmap_size[0] * featmap_size[1] * self.num_base_priors, ),
+            stride)
+        for featmap_size, stride in zip(featmap_sizes, self.featmap_strides)
+    ]
+    flatten_stride = torch.cat(mlvl_strides)
+
+    # flatten cls_scores, bbox_preds and objectness
+    flatten_cls_scores = [
+        cls_score.permute(0, 2, 3, 1).reshape(num_imgs, -1, self.num_classes)
+        for cls_score in cls_scores
+    ]
+    cls_scores = torch.cat(flatten_cls_scores, dim=1).sigmoid()
+
+    flatten_bbox_preds = [
+        bbox_pred.permute(0, 2, 3, 1).reshape(num_imgs, -1, 4)
+        for bbox_pred in bbox_preds
+    ]
+    flatten_bbox_preds = torch.cat(flatten_bbox_preds, dim=1)
+
+    if objectnesses is not None:
+        flatten_objectness = [
+            objectness.permute(0, 2, 3, 1).reshape(num_imgs, -1)
+            for objectness in objectnesses
+        ]
+        flatten_objectness = torch.cat(flatten_objectness, dim=1).sigmoid()
+        cls_scores = cls_scores * (flatten_objectness.unsqueeze(-1))
+
+    scores = cls_scores
+
+    bboxes = bbox_decoder(flatten_priors[None], flatten_bbox_preds,
+                          flatten_stride)
+
+    if not with_nms:
+        return bboxes, scores
+
+    post_params = get_post_processing_params(deploy_cfg)
+    max_output_boxes_per_class = post_params.max_output_boxes_per_class
+    iou_threshold = cfg.nms.get('iou_threshold', post_params.iou_threshold)
+    score_threshold = cfg.get('score_thr', post_params.score_threshold)
+    pre_top_k = post_params.pre_top_k
+    keep_top_k = cfg.get('max_per_img', post_params.keep_top_k)
+
+    return nms_func(bboxes, scores, max_output_boxes_per_class, iou_threshold,
+                    score_threshold, pre_top_k, keep_top_k)
+
+
+@FUNCTION_REWRITER.register_rewriter(
+    func_name='mmyolo.models.dense_heads.yolov5_head.'
+    'YOLOv5Head.predict',
+    backend='rknn')
+def yolov5_head__predict__rknn(self, x: Tuple[Tensor], *args,
+                               **kwargs) -> Tuple[Tensor, Tensor, Tensor]:
+    """Perform forward propagation of the detection head and predict detection
+    results on the features of the upstream network.
+
+    Args:
+        x (tuple[Tensor]): Multi-level features from the
+            upstream network, each is a 4D-tensor.
+    """
+    outs = self(x)
+    return outs
+
+
+@FUNCTION_REWRITER.register_rewriter(
+    func_name='mmyolo.models.dense_heads.yolov5_head.'
+    'YOLOv5HeadModule.forward',
+    backend='rknn')
+def yolov5_head_module__forward__rknn(
+        self, x: Tensor, *args, **kwargs) -> Tuple[Tensor, Tensor, Tensor]:
+    """Forward feature of a single scale level."""
+    out = []
+    for i, feat in enumerate(x):
+        out.append(self.convs_pred[i](feat))
+    return out
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/deploy/models/layers/__init__.py b/mmdetection_practice/third_party/mmyolo/mmyolo/deploy/models/layers/__init__.py
new file mode 100644
index 0000000..6017cf8
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/deploy/models/layers/__init__.py
@@ -0,0 +1,4 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from .bbox_nms import efficient_nms
+
+__all__ = ['efficient_nms']
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/deploy/models/layers/bbox_nms.py b/mmdetection_practice/third_party/mmyolo/mmyolo/deploy/models/layers/bbox_nms.py
new file mode 100644
index 0000000..4db81c0
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/deploy/models/layers/bbox_nms.py
@@ -0,0 +1,113 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+import torch
+from mmdeploy.core import mark
+from torch import Tensor
+
+
+def _efficient_nms(
+    boxes: Tensor,
+    scores: Tensor,
+    max_output_boxes_per_class: int = 1000,
+    iou_threshold: float = 0.5,
+    score_threshold: float = 0.05,
+    pre_top_k: int = -1,
+    keep_top_k: int = 100,
+    box_coding: int = 0,
+):
+    """Wrapper for `efficient_nms` with TensorRT.
+
+    Args:
+        boxes (Tensor): The bounding boxes of shape [N, num_boxes, 4].
+        scores (Tensor): The detection scores of shape
+            [N, num_boxes, num_classes].
+        max_output_boxes_per_class (int): Maximum number of output
+            boxes per class of nms. Defaults to 1000.
+        iou_threshold (float): IOU threshold of nms. Defaults to 0.5.
+        score_threshold (float): score threshold of nms.
+            Defaults to 0.05.
+        pre_top_k (int): Number of top K boxes to keep before nms.
+            Defaults to -1.
+        keep_top_k (int): Number of top K boxes to keep after nms.
+            Defaults to -1.
+        box_coding (int): Bounding boxes format for nms.
+            Defaults to 0 means [x, y, w, h].
+            Set to 1 means [x1, y1 ,x2, y2].
+
+    Returns:
+        tuple[Tensor, Tensor]: (dets, labels), `dets` of shape [N, num_det, 5]
+            and `labels` of shape [N, num_det].
+    """
+    boxes = boxes if boxes.dim() == 4 else boxes.unsqueeze(2)
+    _, det_boxes, det_scores, labels = TRTEfficientNMSop.apply(
+        boxes, scores, -1, box_coding, iou_threshold, keep_top_k, '1', 0,
+        score_threshold)
+    dets = torch.cat([det_boxes, det_scores.unsqueeze(2)], -1)
+
+    # retain shape info
+    batch_size = boxes.size(0)
+
+    dets_shape = dets.shape
+    label_shape = labels.shape
+    dets = dets.reshape([batch_size, *dets_shape[1:]])
+    labels = labels.reshape([batch_size, *label_shape[1:]])
+    return dets, labels
+
+
+@mark('efficient_nms', inputs=['boxes', 'scores'], outputs=['dets', 'labels'])
+def efficient_nms(*args, **kwargs):
+    """Wrapper function for `_efficient_nms`."""
+    return _efficient_nms(*args, **kwargs)
+
+
+class TRTEfficientNMSop(torch.autograd.Function):
+    """Efficient NMS op for TensorRT."""
+
+    @staticmethod
+    def forward(
+        ctx,
+        boxes,
+        scores,
+        background_class=-1,
+        box_coding=0,
+        iou_threshold=0.45,
+        max_output_boxes=100,
+        plugin_version='1',
+        score_activation=0,
+        score_threshold=0.25,
+    ):
+        """Forward function of TRTEfficientNMSop."""
+        batch_size, num_boxes, num_classes = scores.shape
+        num_det = torch.randint(
+            0, max_output_boxes, (batch_size, 1), dtype=torch.int32)
+        det_boxes = torch.randn(batch_size, max_output_boxes, 4)
+        det_scores = torch.randn(batch_size, max_output_boxes)
+        det_classes = torch.randint(
+            0, num_classes, (batch_size, max_output_boxes), dtype=torch.int32)
+        return num_det, det_boxes, det_scores, det_classes
+
+    @staticmethod
+    def symbolic(g,
+                 boxes,
+                 scores,
+                 background_class=-1,
+                 box_coding=0,
+                 iou_threshold=0.45,
+                 max_output_boxes=100,
+                 plugin_version='1',
+                 score_activation=0,
+                 score_threshold=0.25):
+        """Symbolic function of TRTEfficientNMSop."""
+        out = g.op(
+            'TRT::EfficientNMS_TRT',
+            boxes,
+            scores,
+            background_class_i=background_class,
+            box_coding_i=box_coding,
+            iou_threshold_f=iou_threshold,
+            max_output_boxes_i=max_output_boxes,
+            plugin_version_s=plugin_version,
+            score_activation_i=score_activation,
+            score_threshold_f=score_threshold,
+            outputs=4)
+        nums, boxes, scores, classes = out
+        return nums, boxes, scores, classes
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/deploy/object_detection.py b/mmdetection_practice/third_party/mmyolo/mmyolo/deploy/object_detection.py
new file mode 100644
index 0000000..7efdfcf
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/deploy/object_detection.py
@@ -0,0 +1,132 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from typing import Callable, Dict, Optional
+
+import torch
+from mmdeploy.codebase.base import CODEBASE, MMCodebase
+from mmdeploy.codebase.mmdet.deploy import ObjectDetection
+from mmdeploy.utils import Codebase, Task
+from mmengine import Config
+from mmengine.registry import Registry
+
+MMYOLO_TASK = Registry('mmyolo_tasks')
+
+
+@CODEBASE.register_module(Codebase.MMYOLO.value)
+class MMYOLO(MMCodebase):
+    """MMYOLO codebase class."""
+
+    task_registry = MMYOLO_TASK
+
+    @classmethod
+    def register_deploy_modules(cls):
+        """register all rewriters for mmdet."""
+        import mmdeploy.codebase.mmdet.models  # noqa: F401
+        import mmdeploy.codebase.mmdet.ops  # noqa: F401
+        import mmdeploy.codebase.mmdet.structures  # noqa: F401
+
+    @classmethod
+    def register_all_modules(cls):
+        """register all modules."""
+        from mmdet.utils.setup_env import \
+            register_all_modules as register_all_modules_mmdet
+
+        from mmyolo.utils.setup_env import \
+            register_all_modules as register_all_modules_mmyolo
+
+        cls.register_deploy_modules()
+        register_all_modules_mmyolo(True)
+        register_all_modules_mmdet(False)
+
+
+def _get_dataset_metainfo(model_cfg: Config):
+    """Get metainfo of dataset.
+
+    Args:
+        model_cfg Config: Input model Config object.
+
+    Returns:
+        list[str]: A list of string specifying names of different class.
+    """
+    from mmyolo import datasets  # noqa
+    from mmyolo.registry import DATASETS
+
+    module_dict = DATASETS.module_dict
+    for dataloader_name in [
+            'test_dataloader', 'val_dataloader', 'train_dataloader'
+    ]:
+        if dataloader_name not in model_cfg:
+            continue
+        dataloader_cfg = model_cfg[dataloader_name]
+        dataset_cfg = dataloader_cfg.dataset
+        dataset_cls = module_dict.get(dataset_cfg.type, None)
+        if dataset_cls is None:
+            continue
+        if hasattr(dataset_cls, '_load_metainfo') and isinstance(
+                dataset_cls._load_metainfo, Callable):
+            meta = dataset_cls._load_metainfo(
+                dataset_cfg.get('metainfo', None))
+            if meta is not None:
+                return meta
+        if hasattr(dataset_cls, 'METAINFO'):
+            return dataset_cls.METAINFO
+
+    return None
+
+
+@MMYOLO_TASK.register_module(Task.OBJECT_DETECTION.value)
+class YOLOObjectDetection(ObjectDetection):
+    """YOLO Object Detection task."""
+
+    def get_visualizer(self, name: str, save_dir: str):
+        """Get visualizer.
+
+        Args:
+            name (str): Name of visualizer.
+            save_dir (str): Directory to save visualization results.
+
+        Returns:
+            Visualizer: A visualizer instance.
+        """
+        from mmdet.visualization import DetLocalVisualizer  # noqa: F401,F403
+        metainfo = _get_dataset_metainfo(self.model_cfg)
+        visualizer = super().get_visualizer(name, save_dir)
+        if metainfo is not None:
+            visualizer.dataset_meta = metainfo
+        return visualizer
+
+    def build_pytorch_model(self,
+                            model_checkpoint: Optional[str] = None,
+                            cfg_options: Optional[Dict] = None,
+                            **kwargs) -> torch.nn.Module:
+        """Initialize torch model.
+
+        Args:
+            model_checkpoint (str): The checkpoint file of torch model,
+                defaults to `None`.
+            cfg_options (dict): Optional config key-pair parameters.
+        Returns:
+            nn.Module: An initialized torch model generated by other OpenMMLab
+                codebases.
+        """
+        from copy import deepcopy
+
+        from mmengine.model import revert_sync_batchnorm
+        from mmengine.registry import MODELS
+
+        from mmyolo.utils import switch_to_deploy
+
+        model = deepcopy(self.model_cfg.model)
+        preprocess_cfg = deepcopy(self.model_cfg.get('preprocess_cfg', {}))
+        preprocess_cfg.update(
+            deepcopy(self.model_cfg.get('data_preprocessor', {})))
+        model.setdefault('data_preprocessor', preprocess_cfg)
+        model = MODELS.build(model)
+        if model_checkpoint is not None:
+            from mmengine.runner.checkpoint import load_checkpoint
+            load_checkpoint(model, model_checkpoint, map_location=self.device)
+
+        model = revert_sync_batchnorm(model)
+        switch_to_deploy(model)
+        model = model.to(self.device)
+        model.eval()
+        return model
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/engine/__init__.py b/mmdetection_practice/third_party/mmyolo/mmyolo/engine/__init__.py
new file mode 100644
index 0000000..b2e0a12
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/engine/__init__.py
@@ -0,0 +1,3 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from .hooks import *  # noqa: F401,F403
+from .optimizers import *  # noqa: F401,F403
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/engine/hooks/__init__.py b/mmdetection_practice/third_party/mmyolo/mmyolo/engine/hooks/__init__.py
new file mode 100644
index 0000000..0b8deeb
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/engine/hooks/__init__.py
@@ -0,0 +1,10 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from .ppyoloe_param_scheduler_hook import PPYOLOEParamSchedulerHook
+from .switch_to_deploy_hook import SwitchToDeployHook
+from .yolov5_param_scheduler_hook import YOLOv5ParamSchedulerHook
+from .yolox_mode_switch_hook import YOLOXModeSwitchHook
+
+__all__ = [
+    'YOLOv5ParamSchedulerHook', 'YOLOXModeSwitchHook', 'SwitchToDeployHook',
+    'PPYOLOEParamSchedulerHook'
+]
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/engine/hooks/ppyoloe_param_scheduler_hook.py b/mmdetection_practice/third_party/mmyolo/mmyolo/engine/hooks/ppyoloe_param_scheduler_hook.py
new file mode 100644
index 0000000..26dfe6e
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/engine/hooks/ppyoloe_param_scheduler_hook.py
@@ -0,0 +1,96 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+import math
+from typing import Optional
+
+from mmengine.hooks import ParamSchedulerHook
+from mmengine.runner import Runner
+
+from mmyolo.registry import HOOKS
+
+
+@HOOKS.register_module()
+class PPYOLOEParamSchedulerHook(ParamSchedulerHook):
+    """A hook to update learning rate and momentum in optimizer of PPYOLOE. We
+    use this hook to implement adaptive computation for `warmup_total_iters`,
+    which is not possible with the built-in ParamScheduler in mmyolo.
+
+    Args:
+        warmup_min_iter (int): Minimum warmup iters. Defaults to 1000.
+        start_factor (float): The number we multiply learning rate in the
+            first epoch. The multiplication factor changes towards end_factor
+            in the following epochs. Defaults to 0.
+        warmup_epochs (int): Epochs for warmup. Defaults to 5.
+        min_lr_ratio (float): Minimum learning rate ratio.
+        total_epochs (int): In PPYOLOE, `total_epochs` is set to
+            training_epochs x 1.2. Defaults to 360.
+    """
+    priority = 9
+
+    def __init__(self,
+                 warmup_min_iter: int = 1000,
+                 start_factor: float = 0.,
+                 warmup_epochs: int = 5,
+                 min_lr_ratio: float = 0.0,
+                 total_epochs: int = 360):
+
+        self.warmup_min_iter = warmup_min_iter
+        self.start_factor = start_factor
+        self.warmup_epochs = warmup_epochs
+        self.min_lr_ratio = min_lr_ratio
+        self.total_epochs = total_epochs
+
+        self._warmup_end = False
+        self._base_lr = None
+
+    def before_train(self, runner: Runner):
+        """Operations before train.
+
+        Args:
+            runner (Runner): The runner of the training process.
+        """
+        optimizer = runner.optim_wrapper.optimizer
+        for group in optimizer.param_groups:
+            # If the param is never be scheduled, record the current value
+            # as the initial value.
+            group.setdefault('initial_lr', group['lr'])
+
+        self._base_lr = [
+            group['initial_lr'] for group in optimizer.param_groups
+        ]
+        self._min_lr = [i * self.min_lr_ratio for i in self._base_lr]
+
+    def before_train_iter(self,
+                          runner: Runner,
+                          batch_idx: int,
+                          data_batch: Optional[dict] = None):
+        """Operations before each training iteration.
+
+        Args:
+            runner (Runner): The runner of the training process.
+            batch_idx (int): The index of the current batch in the train loop.
+            data_batch (dict or tuple or list, optional): Data from dataloader.
+        """
+        cur_iters = runner.iter
+        optimizer = runner.optim_wrapper.optimizer
+        dataloader_len = len(runner.train_dataloader)
+
+        # The minimum warmup is self.warmup_min_iter
+        warmup_total_iters = max(
+            round(self.warmup_epochs * dataloader_len), self.warmup_min_iter)
+
+        if cur_iters <= warmup_total_iters:
+            # warm up
+            alpha = cur_iters / warmup_total_iters
+            factor = self.start_factor * (1 - alpha) + alpha
+
+            for group_idx, param in enumerate(optimizer.param_groups):
+                param['lr'] = self._base_lr[group_idx] * factor
+        else:
+            for group_idx, param in enumerate(optimizer.param_groups):
+                total_iters = self.total_epochs * dataloader_len
+                lr = self._min_lr[group_idx] + (
+                    self._base_lr[group_idx] -
+                    self._min_lr[group_idx]) * 0.5 * (
+                        math.cos((cur_iters - warmup_total_iters) * math.pi /
+                                 (total_iters - warmup_total_iters)) + 1.0)
+                param['lr'] = lr
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/engine/hooks/switch_to_deploy_hook.py b/mmdetection_practice/third_party/mmyolo/mmyolo/engine/hooks/switch_to_deploy_hook.py
new file mode 100644
index 0000000..28ac345
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/engine/hooks/switch_to_deploy_hook.py
@@ -0,0 +1,21 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+
+from mmengine.hooks import Hook
+from mmengine.runner import Runner
+
+from mmyolo.registry import HOOKS
+from mmyolo.utils import switch_to_deploy
+
+
+@HOOKS.register_module()
+class SwitchToDeployHook(Hook):
+    """Switch to deploy mode before testing.
+
+    This hook converts the multi-channel structure of the training network
+    (high performance) to the one-way structure of the testing network (fast
+    speed and  memory saving).
+    """
+
+    def before_test_epoch(self, runner: Runner):
+        """Switch to deploy mode before testing."""
+        switch_to_deploy(runner.model)
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/engine/hooks/yolov5_param_scheduler_hook.py b/mmdetection_practice/third_party/mmyolo/mmyolo/engine/hooks/yolov5_param_scheduler_hook.py
new file mode 100644
index 0000000..777bb49
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/engine/hooks/yolov5_param_scheduler_hook.py
@@ -0,0 +1,130 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+import math
+from typing import Optional
+
+import numpy as np
+from mmengine.hooks import ParamSchedulerHook
+from mmengine.runner import Runner
+
+from mmyolo.registry import HOOKS
+
+
+def linear_fn(lr_factor: float, max_epochs: int):
+    """Generate linear function."""
+    return lambda x: (1 - x / max_epochs) * (1.0 - lr_factor) + lr_factor
+
+
+def cosine_fn(lr_factor: float, max_epochs: int):
+    """Generate cosine function."""
+    return lambda x: (
+        (1 - math.cos(x * math.pi / max_epochs)) / 2) * (lr_factor - 1) + 1
+
+
+@HOOKS.register_module()
+class YOLOv5ParamSchedulerHook(ParamSchedulerHook):
+    """A hook to update learning rate and momentum in optimizer of YOLOv5."""
+    priority = 9
+
+    scheduler_maps = {'linear': linear_fn, 'cosine': cosine_fn}
+
+    def __init__(self,
+                 scheduler_type: str = 'linear',
+                 lr_factor: float = 0.01,
+                 max_epochs: int = 300,
+                 warmup_epochs: int = 3,
+                 warmup_bias_lr: float = 0.1,
+                 warmup_momentum: float = 0.8,
+                 warmup_mim_iter: int = 1000,
+                 **kwargs):
+
+        assert scheduler_type in self.scheduler_maps
+
+        self.warmup_epochs = warmup_epochs
+        self.warmup_bias_lr = warmup_bias_lr
+        self.warmup_momentum = warmup_momentum
+        self.warmup_mim_iter = warmup_mim_iter
+
+        kwargs.update({'lr_factor': lr_factor, 'max_epochs': max_epochs})
+        self.scheduler_fn = self.scheduler_maps[scheduler_type](**kwargs)
+
+        self._warmup_end = False
+        self._base_lr = None
+        self._base_momentum = None
+
+    def before_train(self, runner: Runner):
+        """Operations before train.
+
+        Args:
+            runner (Runner): The runner of the training process.
+        """
+        optimizer = runner.optim_wrapper.optimizer
+        for group in optimizer.param_groups:
+            # If the param is never be scheduled, record the current value
+            # as the initial value.
+            group.setdefault('initial_lr', group['lr'])
+            group.setdefault('initial_momentum', group.get('momentum', -1))
+
+        self._base_lr = [
+            group['initial_lr'] for group in optimizer.param_groups
+        ]
+        self._base_momentum = [
+            group['initial_momentum'] for group in optimizer.param_groups
+        ]
+
+    def before_train_iter(self,
+                          runner: Runner,
+                          batch_idx: int,
+                          data_batch: Optional[dict] = None):
+        """Operations before each training iteration.
+
+        Args:
+            runner (Runner): The runner of the training process.
+            batch_idx (int): The index of the current batch in the train loop.
+            data_batch (dict or tuple or list, optional): Data from dataloader.
+        """
+        cur_iters = runner.iter
+        cur_epoch = runner.epoch
+        optimizer = runner.optim_wrapper.optimizer
+
+        # The minimum warmup is self.warmup_mim_iter
+        warmup_total_iters = max(
+            round(self.warmup_epochs * len(runner.train_dataloader)),
+            self.warmup_mim_iter)
+
+        if cur_iters <= warmup_total_iters:
+            xp = [0, warmup_total_iters]
+            for group_idx, param in enumerate(optimizer.param_groups):
+                if group_idx == 2:
+                    # bias learning rate will be handled specially
+                    yp = [
+                        self.warmup_bias_lr,
+                        self._base_lr[group_idx] * self.scheduler_fn(cur_epoch)
+                    ]
+                else:
+                    yp = [
+                        0.0,
+                        self._base_lr[group_idx] * self.scheduler_fn(cur_epoch)
+                    ]
+                param['lr'] = np.interp(cur_iters, xp, yp)
+
+                if 'momentum' in param:
+                    param['momentum'] = np.interp(
+                        cur_iters, xp,
+                        [self.warmup_momentum, self._base_momentum[group_idx]])
+        else:
+            self._warmup_end = True
+
+    def after_train_epoch(self, runner: Runner):
+        """Operations after each training epoch.
+
+        Args:
+            runner (Runner): The runner of the training process.
+        """
+        if not self._warmup_end:
+            return
+
+        cur_epoch = runner.epoch
+        optimizer = runner.optim_wrapper.optimizer
+        for group_idx, param in enumerate(optimizer.param_groups):
+            param['lr'] = self._base_lr[group_idx] * self.scheduler_fn(
+                cur_epoch)
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/engine/hooks/yolox_mode_switch_hook.py b/mmdetection_practice/third_party/mmyolo/mmyolo/engine/hooks/yolox_mode_switch_hook.py
new file mode 100644
index 0000000..2771176
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/engine/hooks/yolox_mode_switch_hook.py
@@ -0,0 +1,54 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+import copy
+from typing import Sequence
+
+from mmengine.hooks import Hook
+from mmengine.model import is_model_wrapper
+from mmengine.runner import Runner
+
+from mmyolo.registry import HOOKS
+
+
+@HOOKS.register_module()
+class YOLOXModeSwitchHook(Hook):
+    """Switch the mode of YOLOX during training.
+
+    This hook turns off the mosaic and mixup data augmentation and switches
+    to use L1 loss in bbox_head.
+
+    Args:
+        num_last_epochs (int): The number of latter epochs in the end of the
+            training to close the data augmentation and switch to L1 loss.
+            Defaults to 15.
+    """
+
+    def __init__(self,
+                 num_last_epochs: int = 15,
+                 new_train_pipeline: Sequence[dict] = None):
+        self.num_last_epochs = num_last_epochs
+        self.new_train_pipeline_cfg = new_train_pipeline
+
+    def before_train_epoch(self, runner: Runner):
+        """Close mosaic and mixup augmentation and switches to use L1 loss."""
+        epoch = runner.epoch
+        model = runner.model
+        if is_model_wrapper(model):
+            model = model.module
+
+        if (epoch + 1) == runner.max_epochs - self.num_last_epochs:
+            runner.logger.info(f'New Pipeline: {self.new_train_pipeline_cfg}')
+
+            train_dataloader_cfg = copy.deepcopy(runner.cfg.train_dataloader)
+            train_dataloader_cfg.dataset.pipeline = self.new_train_pipeline_cfg
+            # Note: Why rebuild the dataset?
+            # When build_dataloader will make a deep copy of the dataset,
+            # it will lead to potential risks, such as the global instance
+            # object FileClient data is disordered.
+            # This problem needs to be solved in the future.
+            new_train_dataloader = Runner.build_dataloader(
+                train_dataloader_cfg)
+            runner.train_loop.dataloader = new_train_dataloader
+
+            runner.logger.info('recreate the dataloader!')
+            runner.logger.info('Add additional bbox reg loss now!')
+            model.bbox_head.use_bbox_aux = True
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/engine/optimizers/__init__.py b/mmdetection_practice/third_party/mmyolo/mmyolo/engine/optimizers/__init__.py
new file mode 100644
index 0000000..b598020
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/engine/optimizers/__init__.py
@@ -0,0 +1,5 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from .yolov5_optim_constructor import YOLOv5OptimizerConstructor
+from .yolov7_optim_wrapper_constructor import YOLOv7OptimWrapperConstructor
+
+__all__ = ['YOLOv5OptimizerConstructor', 'YOLOv7OptimWrapperConstructor']
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/engine/optimizers/yolov5_optim_constructor.py b/mmdetection_practice/third_party/mmyolo/mmyolo/engine/optimizers/yolov5_optim_constructor.py
new file mode 100644
index 0000000..5e5f42c
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/engine/optimizers/yolov5_optim_constructor.py
@@ -0,0 +1,132 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from typing import Optional
+
+import torch.nn as nn
+from mmengine.dist import get_world_size
+from mmengine.logging import print_log
+from mmengine.model import is_model_wrapper
+from mmengine.optim import OptimWrapper
+
+from mmyolo.registry import (OPTIM_WRAPPER_CONSTRUCTORS, OPTIM_WRAPPERS,
+                             OPTIMIZERS)
+
+
+@OPTIM_WRAPPER_CONSTRUCTORS.register_module()
+class YOLOv5OptimizerConstructor:
+    """YOLOv5 constructor for optimizers.
+
+    It has the following functions:
+
+        - divides the optimizer parameters into 3 groups:
+        Conv, Bias and BN
+
+        - support `weight_decay` parameter adaption based on
+        `batch_size_per_gpu`
+
+    Args:
+        optim_wrapper_cfg (dict): The config dict of the optimizer wrapper.
+            Positional fields are
+
+                - ``type``: class name of the OptimizerWrapper
+                - ``optimizer``: The configuration of optimizer.
+
+            Optional fields are
+
+                - any arguments of the corresponding optimizer wrapper type,
+                  e.g., accumulative_counts, clip_grad, etc.
+
+            The positional fields of ``optimizer`` are
+
+                - `type`: class name of the optimizer.
+
+            Optional fields are
+
+                - any arguments of the corresponding optimizer type, e.g.,
+                  lr, weight_decay, momentum, etc.
+
+        paramwise_cfg (dict, optional): Parameter-wise options. Must include
+            `base_total_batch_size` if not None. If the total input batch
+            is smaller than `base_total_batch_size`, the `weight_decay`
+            parameter will be kept unchanged, otherwise linear scaling.
+
+    Example:
+        >>> model = torch.nn.modules.Conv1d(1, 1, 1)
+        >>> optim_wrapper_cfg = dict(
+        >>>     dict(type='OptimWrapper', optimizer=dict(type='SGD', lr=0.01,
+        >>>         momentum=0.9, weight_decay=0.0001, batch_size_per_gpu=16))
+        >>> paramwise_cfg = dict(base_total_batch_size=64)
+        >>> optim_wrapper_builder = YOLOv5OptimizerConstructor(
+        >>>     optim_wrapper_cfg, paramwise_cfg)
+        >>> optim_wrapper = optim_wrapper_builder(model)
+    """
+
+    def __init__(self,
+                 optim_wrapper_cfg: dict,
+                 paramwise_cfg: Optional[dict] = None):
+        if paramwise_cfg is None:
+            paramwise_cfg = {'base_total_batch_size': 64}
+        assert 'base_total_batch_size' in paramwise_cfg
+
+        if not isinstance(optim_wrapper_cfg, dict):
+            raise TypeError('optimizer_cfg should be a dict',
+                            f'but got {type(optim_wrapper_cfg)}')
+        assert 'optimizer' in optim_wrapper_cfg, (
+            '`optim_wrapper_cfg` must contain "optimizer" config')
+
+        self.optim_wrapper_cfg = optim_wrapper_cfg
+        self.optimizer_cfg = self.optim_wrapper_cfg.pop('optimizer')
+        self.base_total_batch_size = paramwise_cfg['base_total_batch_size']
+
+    def __call__(self, model: nn.Module) -> OptimWrapper:
+        if is_model_wrapper(model):
+            model = model.module
+        optimizer_cfg = self.optimizer_cfg.copy()
+        weight_decay = optimizer_cfg.pop('weight_decay', 0)
+
+        if 'batch_size_per_gpu' in optimizer_cfg:
+            batch_size_per_gpu = optimizer_cfg.pop('batch_size_per_gpu')
+            # No scaling if total_batch_size is less than
+            # base_total_batch_size, otherwise linear scaling.
+            total_batch_size = get_world_size() * batch_size_per_gpu
+            accumulate = max(
+                round(self.base_total_batch_size / total_batch_size), 1)
+            scale_factor = total_batch_size * \
+                accumulate / self.base_total_batch_size
+
+            if scale_factor != 1:
+                weight_decay *= scale_factor
+                print_log(f'Scaled weight_decay to {weight_decay}', 'current')
+
+        params_groups = [], [], []
+
+        for v in model.modules():
+            if hasattr(v, 'bias') and isinstance(v.bias, nn.Parameter):
+                params_groups[2].append(v.bias)
+            # Includes SyncBatchNorm
+            if isinstance(v, nn.modules.batchnorm._NormBase):
+                params_groups[1].append(v.weight)
+            elif hasattr(v, 'weight') and isinstance(v.weight, nn.Parameter):
+                params_groups[0].append(v.weight)
+
+        # Note: Make sure bias is in the last parameter group
+        optimizer_cfg['params'] = []
+        # conv
+        optimizer_cfg['params'].append({
+            'params': params_groups[0],
+            'weight_decay': weight_decay
+        })
+        # bn
+        optimizer_cfg['params'].append({'params': params_groups[1]})
+        # bias
+        optimizer_cfg['params'].append({'params': params_groups[2]})
+
+        print_log(
+            'Optimizer groups: %g .bias, %g conv.weight, %g other' %
+            (len(params_groups[2]), len(params_groups[0]), len(
+                params_groups[1])), 'current')
+        del params_groups
+
+        optimizer = OPTIMIZERS.build(optimizer_cfg)
+        optim_wrapper = OPTIM_WRAPPERS.build(
+            self.optim_wrapper_cfg, default_args=dict(optimizer=optimizer))
+        return optim_wrapper
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/engine/optimizers/yolov7_optim_wrapper_constructor.py b/mmdetection_practice/third_party/mmyolo/mmyolo/engine/optimizers/yolov7_optim_wrapper_constructor.py
new file mode 100644
index 0000000..79ea8b6
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/engine/optimizers/yolov7_optim_wrapper_constructor.py
@@ -0,0 +1,139 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from typing import Optional
+
+import torch.nn as nn
+from mmengine.dist import get_world_size
+from mmengine.logging import print_log
+from mmengine.model import is_model_wrapper
+from mmengine.optim import OptimWrapper
+
+from mmyolo.models.dense_heads.yolov7_head import ImplicitA, ImplicitM
+from mmyolo.registry import (OPTIM_WRAPPER_CONSTRUCTORS, OPTIM_WRAPPERS,
+                             OPTIMIZERS)
+
+
+# TODO: Consider merging into YOLOv5OptimizerConstructor
+@OPTIM_WRAPPER_CONSTRUCTORS.register_module()
+class YOLOv7OptimWrapperConstructor:
+    """YOLOv7 constructor for optimizer wrappers.
+
+    It has the following functions:
+
+        - divides the optimizer parameters into 3 groups:
+        Conv, Bias and BN/ImplicitA/ImplicitM
+
+        - support `weight_decay` parameter adaption based on
+        `batch_size_per_gpu`
+
+    Args:
+        optim_wrapper_cfg (dict): The config dict of the optimizer wrapper.
+            Positional fields are
+
+                - ``type``: class name of the OptimizerWrapper
+                - ``optimizer``: The configuration of optimizer.
+
+            Optional fields are
+
+                - any arguments of the corresponding optimizer wrapper type,
+                  e.g., accumulative_counts, clip_grad, etc.
+
+            The positional fields of ``optimizer`` are
+
+                - `type`: class name of the optimizer.
+
+            Optional fields are
+
+                - any arguments of the corresponding optimizer type, e.g.,
+                  lr, weight_decay, momentum, etc.
+
+        paramwise_cfg (dict, optional): Parameter-wise options. Must include
+            `base_total_batch_size` if not None. If the total input batch
+            is smaller than `base_total_batch_size`, the `weight_decay`
+            parameter will be kept unchanged, otherwise linear scaling.
+
+    Example:
+        >>> model = torch.nn.modules.Conv1d(1, 1, 1)
+        >>> optim_wrapper_cfg = dict(
+        >>>     dict(type='OptimWrapper', optimizer=dict(type='SGD', lr=0.01,
+        >>>         momentum=0.9, weight_decay=0.0001, batch_size_per_gpu=16))
+        >>> paramwise_cfg = dict(base_total_batch_size=64)
+        >>> optim_wrapper_builder = YOLOv7OptimWrapperConstructor(
+        >>>     optim_wrapper_cfg, paramwise_cfg)
+        >>> optim_wrapper = optim_wrapper_builder(model)
+    """
+
+    def __init__(self,
+                 optim_wrapper_cfg: dict,
+                 paramwise_cfg: Optional[dict] = None):
+        if paramwise_cfg is None:
+            paramwise_cfg = {'base_total_batch_size': 64}
+        assert 'base_total_batch_size' in paramwise_cfg
+
+        if not isinstance(optim_wrapper_cfg, dict):
+            raise TypeError('optimizer_cfg should be a dict',
+                            f'but got {type(optim_wrapper_cfg)}')
+        assert 'optimizer' in optim_wrapper_cfg, (
+            '`optim_wrapper_cfg` must contain "optimizer" config')
+
+        self.optim_wrapper_cfg = optim_wrapper_cfg
+        self.optimizer_cfg = self.optim_wrapper_cfg.pop('optimizer')
+        self.base_total_batch_size = paramwise_cfg['base_total_batch_size']
+
+    def __call__(self, model: nn.Module) -> OptimWrapper:
+        if is_model_wrapper(model):
+            model = model.module
+        optimizer_cfg = self.optimizer_cfg.copy()
+        weight_decay = optimizer_cfg.pop('weight_decay', 0)
+
+        if 'batch_size_per_gpu' in optimizer_cfg:
+            batch_size_per_gpu = optimizer_cfg.pop('batch_size_per_gpu')
+            # No scaling if total_batch_size is less than
+            # base_total_batch_size, otherwise linear scaling.
+            total_batch_size = get_world_size() * batch_size_per_gpu
+            accumulate = max(
+                round(self.base_total_batch_size / total_batch_size), 1)
+            scale_factor = total_batch_size * \
+                accumulate / self.base_total_batch_size
+
+            if scale_factor != 1:
+                weight_decay *= scale_factor
+                print_log(f'Scaled weight_decay to {weight_decay}', 'current')
+
+        params_groups = [], [], []
+        for v in model.modules():
+            # no decay
+            # Caution: Coupling with model
+            if isinstance(v, (ImplicitA, ImplicitM)):
+                params_groups[0].append(v.implicit)
+            elif isinstance(v, nn.modules.batchnorm._NormBase):
+                params_groups[0].append(v.weight)
+            # apply decay
+            elif hasattr(v, 'weight') and isinstance(v.weight, nn.Parameter):
+                params_groups[1].append(v.weight)  # apply decay
+
+            # biases, no decay
+            if hasattr(v, 'bias') and isinstance(v.bias, nn.Parameter):
+                params_groups[2].append(v.bias)
+
+        # Note: Make sure bias is in the last parameter group
+        optimizer_cfg['params'] = []
+        # conv
+        optimizer_cfg['params'].append({
+            'params': params_groups[1],
+            'weight_decay': weight_decay
+        })
+        # bn ...
+        optimizer_cfg['params'].append({'params': params_groups[0]})
+        # bias
+        optimizer_cfg['params'].append({'params': params_groups[2]})
+
+        print_log(
+            'Optimizer groups: %g .bias, %g conv.weight, %g other' %
+            (len(params_groups[2]), len(params_groups[1]), len(
+                params_groups[0])), 'current')
+        del params_groups
+
+        optimizer = OPTIMIZERS.build(optimizer_cfg)
+        optim_wrapper = OPTIM_WRAPPERS.build(
+            self.optim_wrapper_cfg, default_args=dict(optimizer=optimizer))
+        return optim_wrapper
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/models/__init__.py b/mmdetection_practice/third_party/mmyolo/mmyolo/models/__init__.py
new file mode 100644
index 0000000..51c37f0
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/models/__init__.py
@@ -0,0 +1,10 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from .backbones import *  # noqa: F401,F403
+from .data_preprocessors import *  # noqa: F401,F403
+from .dense_heads import *  # noqa: F401,F403
+from .detectors import *  # noqa: F401,F403
+from .layers import *  # noqa: F401,F403
+from .losses import *  # noqa: F401,F403
+from .necks import *  # noqa: F401,F403
+from .plugins import *  # noqa: F401,F403
+from .task_modules import *  # noqa: F401,F403
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/models/backbones/__init__.py b/mmdetection_practice/third_party/mmyolo/mmyolo/models/backbones/__init__.py
new file mode 100644
index 0000000..48c8e28
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/models/backbones/__init__.py
@@ -0,0 +1,13 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from .base_backbone import BaseBackbone
+from .csp_darknet import YOLOv5CSPDarknet, YOLOv8CSPDarknet, YOLOXCSPDarknet
+from .csp_resnet import PPYOLOECSPResNet
+from .cspnext import CSPNeXt
+from .efficient_rep import YOLOv6CSPBep, YOLOv6EfficientRep
+from .yolov7_backbone import YOLOv7Backbone
+
+__all__ = [
+    'YOLOv5CSPDarknet', 'BaseBackbone', 'YOLOv6EfficientRep', 'YOLOv6CSPBep',
+    'YOLOXCSPDarknet', 'CSPNeXt', 'YOLOv7Backbone', 'PPYOLOECSPResNet',
+    'YOLOv8CSPDarknet'
+]
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/models/backbones/base_backbone.py b/mmdetection_practice/third_party/mmyolo/mmyolo/models/backbones/base_backbone.py
new file mode 100644
index 0000000..730c709
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/models/backbones/base_backbone.py
@@ -0,0 +1,225 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from abc import ABCMeta, abstractmethod
+from typing import List, Sequence, Union
+
+import torch
+import torch.nn as nn
+from mmcv.cnn import build_plugin_layer
+from mmdet.utils import ConfigType, OptMultiConfig
+from mmengine.model import BaseModule
+from torch.nn.modules.batchnorm import _BatchNorm
+
+from mmyolo.registry import MODELS
+
+
+@MODELS.register_module()
+class BaseBackbone(BaseModule, metaclass=ABCMeta):
+    """BaseBackbone backbone used in YOLO series.
+
+    .. code:: text
+
+     Backbone model structure diagram
+     +-----------+
+     |   input   |
+     +-----------+
+           v
+     +-----------+
+     |   stem    |
+     |   layer   |
+     +-----------+
+           v
+     +-----------+
+     |   stage   |
+     |  layer 1  |
+     +-----------+
+           v
+     +-----------+
+     |   stage   |
+     |  layer 2  |
+     +-----------+
+           v
+         ......
+           v
+     +-----------+
+     |   stage   |
+     |  layer n  |
+     +-----------+
+     In P5 model, n=4
+     In P6 model, n=5
+
+    Args:
+        arch_setting (list): Architecture of BaseBackbone.
+        plugins (list[dict]): List of plugins for stages, each dict contains:
+
+            - cfg (dict, required): Cfg dict to build plugin.
+            - stages (tuple[bool], optional): Stages to apply plugin, length
+              should be same as 'num_stages'.
+        deepen_factor (float): Depth multiplier, multiply number of
+            blocks in CSP layer by this amount. Defaults to 1.0.
+        widen_factor (float): Width multiplier, multiply number of
+            channels in each layer by this amount. Defaults to 1.0.
+        input_channels: Number of input image channels. Defaults to 3.
+        out_indices (Sequence[int]): Output from which stages.
+            Defaults to (2, 3, 4).
+        frozen_stages (int): Stages to be frozen (stop grad and set eval
+            mode). -1 means not freezing any parameters. Defaults to -1.
+        norm_cfg (dict): Dictionary to construct and config norm layer.
+            Defaults to None.
+        act_cfg (dict): Config dict for activation layer.
+            Defaults to None.
+        norm_eval (bool): Whether to set norm layers to eval mode, namely,
+            freeze running stats (mean and var). Note: Effect on Batch Norm
+            and its variants only. Defaults to False.
+        init_cfg (dict or list[dict], optional): Initialization config dict.
+            Defaults to None.
+    """
+
+    def __init__(self,
+                 arch_setting: list,
+                 deepen_factor: float = 1.0,
+                 widen_factor: float = 1.0,
+                 input_channels: int = 3,
+                 out_indices: Sequence[int] = (2, 3, 4),
+                 frozen_stages: int = -1,
+                 plugins: Union[dict, List[dict]] = None,
+                 norm_cfg: ConfigType = None,
+                 act_cfg: ConfigType = None,
+                 norm_eval: bool = False,
+                 init_cfg: OptMultiConfig = None):
+        super().__init__(init_cfg)
+        self.num_stages = len(arch_setting)
+        self.arch_setting = arch_setting
+
+        assert set(out_indices).issubset(
+            i for i in range(len(arch_setting) + 1))
+
+        if frozen_stages not in range(-1, len(arch_setting) + 1):
+            raise ValueError('"frozen_stages" must be in range(-1, '
+                             'len(arch_setting) + 1). But received '
+                             f'{frozen_stages}')
+
+        self.input_channels = input_channels
+        self.out_indices = out_indices
+        self.frozen_stages = frozen_stages
+        self.widen_factor = widen_factor
+        self.deepen_factor = deepen_factor
+        self.norm_eval = norm_eval
+        self.norm_cfg = norm_cfg
+        self.act_cfg = act_cfg
+        self.plugins = plugins
+
+        self.stem = self.build_stem_layer()
+        self.layers = ['stem']
+
+        for idx, setting in enumerate(arch_setting):
+            stage = []
+            stage += self.build_stage_layer(idx, setting)
+            if plugins is not None:
+                stage += self.make_stage_plugins(plugins, idx, setting)
+            self.add_module(f'stage{idx + 1}', nn.Sequential(*stage))
+            self.layers.append(f'stage{idx + 1}')
+
+    @abstractmethod
+    def build_stem_layer(self):
+        """Build a stem layer."""
+        pass
+
+    @abstractmethod
+    def build_stage_layer(self, stage_idx: int, setting: list):
+        """Build a stage layer.
+
+        Args:
+            stage_idx (int): The index of a stage layer.
+            setting (list): The architecture setting of a stage layer.
+        """
+        pass
+
+    def make_stage_plugins(self, plugins, stage_idx, setting):
+        """Make plugins for backbone ``stage_idx`` th stage.
+
+        Currently we support to insert ``context_block``,
+        ``empirical_attention_block``, ``nonlocal_block``, ``dropout_block``
+        into the backbone.
+
+
+        An example of plugins format could be:
+
+        Examples:
+            >>> plugins=[
+            ...     dict(cfg=dict(type='xxx', arg1='xxx'),
+            ...          stages=(False, True, True, True)),
+            ...     dict(cfg=dict(type='yyy'),
+            ...          stages=(True, True, True, True)),
+            ... ]
+            >>> model = YOLOv5CSPDarknet()
+            >>> stage_plugins = model.make_stage_plugins(plugins, 0, setting)
+            >>> assert len(stage_plugins) == 1
+
+        Suppose ``stage_idx=0``, the structure of blocks in the stage would be:
+
+        .. code-block:: none
+
+            conv1 -> conv2 -> conv3 -> yyy
+
+        Suppose ``stage_idx=1``, the structure of blocks in the stage would be:
+
+        .. code-block:: none
+
+            conv1 -> conv2 -> conv3 -> xxx -> yyy
+
+
+        Args:
+            plugins (list[dict]): List of plugins cfg to build. The postfix is
+                required if multiple same type plugins are inserted.
+            stage_idx (int): Index of stage to build
+                If stages is missing, the plugin would be applied to all
+                stages.
+            setting (list): The architecture setting of a stage layer.
+
+        Returns:
+            list[nn.Module]: Plugins for current stage
+        """
+        # TODO: It is not general enough to support any channel and needs
+        # to be refactored
+        in_channels = int(setting[1] * self.widen_factor)
+        plugin_layers = []
+        for plugin in plugins:
+            plugin = plugin.copy()
+            stages = plugin.pop('stages', None)
+            assert stages is None or len(stages) == self.num_stages
+            if stages is None or stages[stage_idx]:
+                name, layer = build_plugin_layer(
+                    plugin['cfg'], in_channels=in_channels)
+                plugin_layers.append(layer)
+        return plugin_layers
+
+    def _freeze_stages(self):
+        """Freeze the parameters of the specified stage so that they are no
+        longer updated."""
+        if self.frozen_stages >= 0:
+            for i in range(self.frozen_stages + 1):
+                m = getattr(self, self.layers[i])
+                m.eval()
+                for param in m.parameters():
+                    param.requires_grad = False
+
+    def train(self, mode: bool = True):
+        """Convert the model into training mode while keep normalization layer
+        frozen."""
+        super().train(mode)
+        self._freeze_stages()
+        if mode and self.norm_eval:
+            for m in self.modules():
+                if isinstance(m, _BatchNorm):
+                    m.eval()
+
+    def forward(self, x: torch.Tensor) -> tuple:
+        """Forward batch_inputs from the data_preprocessor."""
+        outs = []
+        for i, layer_name in enumerate(self.layers):
+            layer = getattr(self, layer_name)
+            x = layer(x)
+            if i in self.out_indices:
+                outs.append(x)
+
+        return tuple(outs)
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/models/backbones/csp_darknet.py b/mmdetection_practice/third_party/mmyolo/mmyolo/models/backbones/csp_darknet.py
new file mode 100644
index 0000000..92bd69a
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/models/backbones/csp_darknet.py
@@ -0,0 +1,427 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from typing import List, Tuple, Union
+
+import torch
+import torch.nn as nn
+from mmcv.cnn import ConvModule, DepthwiseSeparableConvModule
+from mmdet.models.backbones.csp_darknet import CSPLayer, Focus
+from mmdet.utils import ConfigType, OptMultiConfig
+
+from mmyolo.registry import MODELS
+from ..layers import CSPLayerWithTwoConv, SPPFBottleneck
+from ..utils import make_divisible, make_round
+from .base_backbone import BaseBackbone
+
+
+@MODELS.register_module()
+class YOLOv5CSPDarknet(BaseBackbone):
+    """CSP-Darknet backbone used in YOLOv5.
+    Args:
+        arch (str): Architecture of CSP-Darknet, from {P5, P6}.
+            Defaults to P5.
+        plugins (list[dict]): List of plugins for stages, each dict contains:
+            - cfg (dict, required): Cfg dict to build plugin.
+            - stages (tuple[bool], optional): Stages to apply plugin, length
+              should be same as 'num_stages'.
+        deepen_factor (float): Depth multiplier, multiply number of
+            blocks in CSP layer by this amount. Defaults to 1.0.
+        widen_factor (float): Width multiplier, multiply number of
+            channels in each layer by this amount. Defaults to 1.0.
+        input_channels (int): Number of input image channels. Defaults to: 3.
+        out_indices (Tuple[int]): Output from which stages.
+            Defaults to (2, 3, 4).
+        frozen_stages (int): Stages to be frozen (stop grad and set eval
+            mode). -1 means not freezing any parameters. Defaults to -1.
+        norm_cfg (dict): Dictionary to construct and config norm layer.
+            Defaults to dict(type='BN', requires_grad=True).
+        act_cfg (dict): Config dict for activation layer.
+            Defaults to dict(type='SiLU', inplace=True).
+        norm_eval (bool): Whether to set norm layers to eval mode, namely,
+            freeze running stats (mean and var). Note: Effect on Batch Norm
+            and its variants only. Defaults to False.
+        init_cfg (Union[dict,list[dict]], optional): Initialization config
+            dict. Defaults to None.
+    Example:
+        >>> from mmyolo.models import YOLOv5CSPDarknet
+        >>> import torch
+        >>> model = YOLOv5CSPDarknet()
+        >>> model.eval()
+        >>> inputs = torch.rand(1, 3, 416, 416)
+        >>> level_outputs = model(inputs)
+        >>> for level_out in level_outputs:
+        ...     print(tuple(level_out.shape))
+        ...
+        (1, 256, 52, 52)
+        (1, 512, 26, 26)
+        (1, 1024, 13, 13)
+    """
+    # From left to right:
+    # in_channels, out_channels, num_blocks, add_identity, use_spp
+    arch_settings = {
+        'P5': [[64, 128, 3, True, False], [128, 256, 6, True, False],
+               [256, 512, 9, True, False], [512, 1024, 3, True, True]],
+        'P6': [[64, 128, 3, True, False], [128, 256, 6, True, False],
+               [256, 512, 9, True, False], [512, 768, 3, True, False],
+               [768, 1024, 3, True, True]]
+    }
+
+    def __init__(self,
+                 arch: str = 'P5',
+                 plugins: Union[dict, List[dict]] = None,
+                 deepen_factor: float = 1.0,
+                 widen_factor: float = 1.0,
+                 input_channels: int = 3,
+                 out_indices: Tuple[int] = (2, 3, 4),
+                 frozen_stages: int = -1,
+                 norm_cfg: ConfigType = dict(
+                     type='BN', momentum=0.03, eps=0.001),
+                 act_cfg: ConfigType = dict(type='SiLU', inplace=True),
+                 norm_eval: bool = False,
+                 init_cfg: OptMultiConfig = None):
+        super().__init__(
+            self.arch_settings[arch],
+            deepen_factor,
+            widen_factor,
+            input_channels=input_channels,
+            out_indices=out_indices,
+            plugins=plugins,
+            frozen_stages=frozen_stages,
+            norm_cfg=norm_cfg,
+            act_cfg=act_cfg,
+            norm_eval=norm_eval,
+            init_cfg=init_cfg)
+
+    def build_stem_layer(self) -> nn.Module:
+        """Build a stem layer."""
+        return ConvModule(
+            self.input_channels,
+            make_divisible(self.arch_setting[0][0], self.widen_factor),
+            kernel_size=6,
+            stride=2,
+            padding=2,
+            norm_cfg=self.norm_cfg,
+            act_cfg=self.act_cfg)
+
+    def build_stage_layer(self, stage_idx: int, setting: list) -> list:
+        """Build a stage layer.
+
+        Args:
+            stage_idx (int): The index of a stage layer.
+            setting (list): The architecture setting of a stage layer.
+        """
+        in_channels, out_channels, num_blocks, add_identity, use_spp = setting
+
+        in_channels = make_divisible(in_channels, self.widen_factor)
+        out_channels = make_divisible(out_channels, self.widen_factor)
+        num_blocks = make_round(num_blocks, self.deepen_factor)
+        stage = []
+        conv_layer = ConvModule(
+            in_channels,
+            out_channels,
+            kernel_size=3,
+            stride=2,
+            padding=1,
+            norm_cfg=self.norm_cfg,
+            act_cfg=self.act_cfg)
+        stage.append(conv_layer)
+        csp_layer = CSPLayer(
+            out_channels,
+            out_channels,
+            num_blocks=num_blocks,
+            add_identity=add_identity,
+            norm_cfg=self.norm_cfg,
+            act_cfg=self.act_cfg)
+        stage.append(csp_layer)
+        if use_spp:
+            spp = SPPFBottleneck(
+                out_channels,
+                out_channels,
+                kernel_sizes=5,
+                norm_cfg=self.norm_cfg,
+                act_cfg=self.act_cfg)
+            stage.append(spp)
+        return stage
+
+    def init_weights(self):
+        """Initialize the parameters."""
+        if self.init_cfg is None:
+            for m in self.modules():
+                if isinstance(m, torch.nn.Conv2d):
+                    # In order to be consistent with the source code,
+                    # reset the Conv2d initialization parameters
+                    m.reset_parameters()
+        else:
+            super().init_weights()
+
+
+@MODELS.register_module()
+class YOLOv8CSPDarknet(BaseBackbone):
+    """CSP-Darknet backbone used in YOLOv8.
+
+    Args:
+        arch (str): Architecture of CSP-Darknet, from {P5}.
+            Defaults to P5.
+        last_stage_out_channels (int): Final layer output channel.
+            Defaults to 1024.
+        plugins (list[dict]): List of plugins for stages, each dict contains:
+            - cfg (dict, required): Cfg dict to build plugin.
+            - stages (tuple[bool], optional): Stages to apply plugin, length
+              should be same as 'num_stages'.
+        deepen_factor (float): Depth multiplier, multiply number of
+            blocks in CSP layer by this amount. Defaults to 1.0.
+        widen_factor (float): Width multiplier, multiply number of
+            channels in each layer by this amount. Defaults to 1.0.
+        input_channels (int): Number of input image channels. Defaults to: 3.
+        out_indices (Tuple[int]): Output from which stages.
+            Defaults to (2, 3, 4).
+        frozen_stages (int): Stages to be frozen (stop grad and set eval
+            mode). -1 means not freezing any parameters. Defaults to -1.
+        norm_cfg (dict): Dictionary to construct and config norm layer.
+            Defaults to dict(type='BN', requires_grad=True).
+        act_cfg (dict): Config dict for activation layer.
+            Defaults to dict(type='SiLU', inplace=True).
+        norm_eval (bool): Whether to set norm layers to eval mode, namely,
+            freeze running stats (mean and var). Note: Effect on Batch Norm
+            and its variants only. Defaults to False.
+        init_cfg (Union[dict,list[dict]], optional): Initialization config
+            dict. Defaults to None.
+
+    Example:
+        >>> from mmyolo.models import YOLOv8CSPDarknet
+        >>> import torch
+        >>> model = YOLOv8CSPDarknet()
+        >>> model.eval()
+        >>> inputs = torch.rand(1, 3, 416, 416)
+        >>> level_outputs = model(inputs)
+        >>> for level_out in level_outputs:
+        ...     print(tuple(level_out.shape))
+        ...
+        (1, 256, 52, 52)
+        (1, 512, 26, 26)
+        (1, 1024, 13, 13)
+    """
+    # From left to right:
+    # in_channels, out_channels, num_blocks, add_identity, use_spp
+    # the final out_channels will be set according to the param.
+    arch_settings = {
+        'P5': [[64, 128, 3, True, False], [128, 256, 6, True, False],
+               [256, 512, 6, True, False], [512, None, 3, True, True]],
+    }
+
+    def __init__(self,
+                 arch: str = 'P5',
+                 last_stage_out_channels: int = 1024,
+                 plugins: Union[dict, List[dict]] = None,
+                 deepen_factor: float = 1.0,
+                 widen_factor: float = 1.0,
+                 input_channels: int = 3,
+                 out_indices: Tuple[int] = (2, 3, 4),
+                 frozen_stages: int = -1,
+                 norm_cfg: ConfigType = dict(
+                     type='BN', momentum=0.03, eps=0.001),
+                 act_cfg: ConfigType = dict(type='SiLU', inplace=True),
+                 norm_eval: bool = False,
+                 init_cfg: OptMultiConfig = None):
+        self.arch_settings[arch][-1][1] = last_stage_out_channels
+        super().__init__(
+            self.arch_settings[arch],
+            deepen_factor,
+            widen_factor,
+            input_channels=input_channels,
+            out_indices=out_indices,
+            plugins=plugins,
+            frozen_stages=frozen_stages,
+            norm_cfg=norm_cfg,
+            act_cfg=act_cfg,
+            norm_eval=norm_eval,
+            init_cfg=init_cfg)
+
+    def build_stem_layer(self) -> nn.Module:
+        """Build a stem layer."""
+        return ConvModule(
+            self.input_channels,
+            make_divisible(self.arch_setting[0][0], self.widen_factor),
+            kernel_size=3,
+            stride=2,
+            padding=1,
+            norm_cfg=self.norm_cfg,
+            act_cfg=self.act_cfg)
+
+    def build_stage_layer(self, stage_idx: int, setting: list) -> list:
+        """Build a stage layer.
+
+        Args:
+            stage_idx (int): The index of a stage layer.
+            setting (list): The architecture setting of a stage layer.
+        """
+        in_channels, out_channels, num_blocks, add_identity, use_spp = setting
+
+        in_channels = make_divisible(in_channels, self.widen_factor)
+        out_channels = make_divisible(out_channels, self.widen_factor)
+        num_blocks = make_round(num_blocks, self.deepen_factor)
+        stage = []
+        conv_layer = ConvModule(
+            in_channels,
+            out_channels,
+            kernel_size=3,
+            stride=2,
+            padding=1,
+            norm_cfg=self.norm_cfg,
+            act_cfg=self.act_cfg)
+        stage.append(conv_layer)
+        csp_layer = CSPLayerWithTwoConv(
+            out_channels,
+            out_channels,
+            num_blocks=num_blocks,
+            add_identity=add_identity,
+            norm_cfg=self.norm_cfg,
+            act_cfg=self.act_cfg)
+        stage.append(csp_layer)
+        if use_spp:
+            spp = SPPFBottleneck(
+                out_channels,
+                out_channels,
+                kernel_sizes=5,
+                norm_cfg=self.norm_cfg,
+                act_cfg=self.act_cfg)
+            stage.append(spp)
+        return stage
+
+    def init_weights(self):
+        """Initialize the parameters."""
+        if self.init_cfg is None:
+            for m in self.modules():
+                if isinstance(m, torch.nn.Conv2d):
+                    # In order to be consistent with the source code,
+                    # reset the Conv2d initialization parameters
+                    m.reset_parameters()
+        else:
+            super().init_weights()
+
+
+@MODELS.register_module()
+class YOLOXCSPDarknet(BaseBackbone):
+    """CSP-Darknet backbone used in YOLOX.
+
+    Args:
+        arch (str): Architecture of CSP-Darknet, from {P5, P6}.
+            Defaults to P5.
+        plugins (list[dict]): List of plugins for stages, each dict contains:
+
+            - cfg (dict, required): Cfg dict to build plugin.
+            - stages (tuple[bool], optional): Stages to apply plugin, length
+              should be same as 'num_stages'.
+        deepen_factor (float): Depth multiplier, multiply number of
+            blocks in CSP layer by this amount. Defaults to 1.0.
+        widen_factor (float): Width multiplier, multiply number of
+            channels in each layer by this amount. Defaults to 1.0.
+        input_channels (int): Number of input image channels. Defaults to 3.
+        out_indices (Tuple[int]): Output from which stages.
+            Defaults to (2, 3, 4).
+        frozen_stages (int): Stages to be frozen (stop grad and set eval
+            mode). -1 means not freezing any parameters. Defaults to -1.
+        use_depthwise (bool): Whether to use depthwise separable convolution.
+            Defaults to False.
+        spp_kernal_sizes: (tuple[int]): Sequential of kernel sizes of SPP
+            layers. Defaults to (5, 9, 13).
+        norm_cfg (dict): Dictionary to construct and config norm layer.
+            Defaults to dict(type='BN', momentum=0.03, eps=0.001).
+        act_cfg (dict): Config dict for activation layer.
+            Defaults to dict(type='SiLU', inplace=True).
+        norm_eval (bool): Whether to set norm layers to eval mode, namely,
+            freeze running stats (mean and var). Note: Effect on Batch Norm
+            and its variants only.
+        init_cfg (Union[dict,list[dict]], optional): Initialization config
+            dict. Defaults to None.
+    Example:
+        >>> from mmyolo.models import YOLOXCSPDarknet
+        >>> import torch
+        >>> model = YOLOXCSPDarknet()
+        >>> model.eval()
+        >>> inputs = torch.rand(1, 3, 416, 416)
+        >>> level_outputs = model(inputs)
+        >>> for level_out in level_outputs:
+        ...     print(tuple(level_out.shape))
+        ...
+        (1, 256, 52, 52)
+        (1, 512, 26, 26)
+        (1, 1024, 13, 13)
+    """
+    # From left to right:
+    # in_channels, out_channels, num_blocks, add_identity, use_spp
+    arch_settings = {
+        'P5': [[64, 128, 3, True, False], [128, 256, 9, True, False],
+               [256, 512, 9, True, False], [512, 1024, 3, False, True]],
+    }
+
+    def __init__(self,
+                 arch: str = 'P5',
+                 plugins: Union[dict, List[dict]] = None,
+                 deepen_factor: float = 1.0,
+                 widen_factor: float = 1.0,
+                 input_channels: int = 3,
+                 out_indices: Tuple[int] = (2, 3, 4),
+                 frozen_stages: int = -1,
+                 use_depthwise: bool = False,
+                 spp_kernal_sizes: Tuple[int] = (5, 9, 13),
+                 norm_cfg: ConfigType = dict(
+                     type='BN', momentum=0.03, eps=0.001),
+                 act_cfg: ConfigType = dict(type='SiLU', inplace=True),
+                 norm_eval: bool = False,
+                 init_cfg: OptMultiConfig = None):
+        self.use_depthwise = use_depthwise
+        self.spp_kernal_sizes = spp_kernal_sizes
+        super().__init__(self.arch_settings[arch], deepen_factor, widen_factor,
+                         input_channels, out_indices, frozen_stages, plugins,
+                         norm_cfg, act_cfg, norm_eval, init_cfg)
+
+    def build_stem_layer(self) -> nn.Module:
+        """Build a stem layer."""
+        return Focus(
+            3,
+            make_divisible(64, self.widen_factor),
+            kernel_size=3,
+            norm_cfg=self.norm_cfg,
+            act_cfg=self.act_cfg)
+
+    def build_stage_layer(self, stage_idx: int, setting: list) -> list:
+        """Build a stage layer.
+
+        Args:
+            stage_idx (int): The index of a stage layer.
+            setting (list): The architecture setting of a stage layer.
+        """
+        in_channels, out_channels, num_blocks, add_identity, use_spp = setting
+
+        in_channels = make_divisible(in_channels, self.widen_factor)
+        out_channels = make_divisible(out_channels, self.widen_factor)
+        num_blocks = make_round(num_blocks, self.deepen_factor)
+        stage = []
+        conv = DepthwiseSeparableConvModule \
+            if self.use_depthwise else ConvModule
+        conv_layer = conv(
+            in_channels,
+            out_channels,
+            kernel_size=3,
+            stride=2,
+            padding=1,
+            norm_cfg=self.norm_cfg,
+            act_cfg=self.act_cfg)
+        stage.append(conv_layer)
+        if use_spp:
+            spp = SPPFBottleneck(
+                out_channels,
+                out_channels,
+                kernel_sizes=self.spp_kernal_sizes,
+                norm_cfg=self.norm_cfg,
+                act_cfg=self.act_cfg)
+            stage.append(spp)
+        csp_layer = CSPLayer(
+            out_channels,
+            out_channels,
+            num_blocks=num_blocks,
+            add_identity=add_identity,
+            norm_cfg=self.norm_cfg,
+            act_cfg=self.act_cfg)
+        stage.append(csp_layer)
+        return stage
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/models/backbones/csp_resnet.py b/mmdetection_practice/third_party/mmyolo/mmyolo/models/backbones/csp_resnet.py
new file mode 100644
index 0000000..a42ed48
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/models/backbones/csp_resnet.py
@@ -0,0 +1,169 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from typing import List, Tuple, Union
+
+import torch.nn as nn
+from mmcv.cnn import ConvModule
+from mmdet.utils import ConfigType, OptMultiConfig
+
+from mmyolo.models.backbones import BaseBackbone
+from mmyolo.models.layers.yolo_bricks import CSPResLayer
+from mmyolo.registry import MODELS
+
+
+@MODELS.register_module()
+class PPYOLOECSPResNet(BaseBackbone):
+    """CSP-ResNet backbone used in PPYOLOE.
+
+    Args:
+        arch (str): Architecture of CSPNeXt, from {P5, P6}.
+            Defaults to P5.
+        deepen_factor (float): Depth multiplier, multiply number of
+            blocks in CSP layer by this amount. Defaults to 1.0.
+        widen_factor (float): Width multiplier, multiply number of
+            channels in each layer by this amount. Defaults to 1.0.
+        out_indices (Sequence[int]): Output from which stages.
+            Defaults to (2, 3, 4).
+        frozen_stages (int): Stages to be frozen (stop grad and set eval
+            mode). -1 means not freezing any parameters. Defaults to -1.
+        plugins (list[dict]): List of plugins for stages, each dict contains:
+            - cfg (dict, required): Cfg dict to build plugin.
+            - stages (tuple[bool], optional): Stages to apply plugin, length
+              should be same as 'num_stages'.
+        arch_ovewrite (list): Overwrite default arch settings.
+            Defaults to None.
+        block_cfg (dict): Config dict for block. Defaults to
+            dict(type='PPYOLOEBasicBlock', shortcut=True, use_alpha=True)
+        norm_cfg (:obj:`ConfigDict` or dict): Dictionary to construct and
+            config norm layer. Defaults to dict(type='BN', momentum=0.1,
+            eps=1e-5).
+        act_cfg (:obj:`ConfigDict` or dict): Config dict for activation layer.
+            Defaults to dict(type='SiLU', inplace=True).
+        attention_cfg (dict): Config dict for `EffectiveSELayer`.
+            Defaults to dict(type='EffectiveSELayer',
+            act_cfg=dict(type='HSigmoid')).
+        norm_eval (bool): Whether to set norm layers to eval mode, namely,
+            freeze running stats (mean and var). Note: Effect on Batch Norm
+            and its variants only.
+        init_cfg (:obj:`ConfigDict` or dict or list[dict] or
+            list[:obj:`ConfigDict`]): Initialization config dict.
+        use_large_stem (bool): Whether to use large stem layer.
+            Defaults to False.
+    """
+    # From left to right:
+    # in_channels, out_channels, num_blocks
+    arch_settings = {
+        'P5': [[64, 128, 3], [128, 256, 6], [256, 512, 6], [512, 1024, 3]]
+    }
+
+    def __init__(self,
+                 arch: str = 'P5',
+                 deepen_factor: float = 1.0,
+                 widen_factor: float = 1.0,
+                 input_channels: int = 3,
+                 out_indices: Tuple[int] = (2, 3, 4),
+                 frozen_stages: int = -1,
+                 plugins: Union[dict, List[dict]] = None,
+                 arch_ovewrite: dict = None,
+                 block_cfg: ConfigType = dict(
+                     type='PPYOLOEBasicBlock', shortcut=True, use_alpha=True),
+                 norm_cfg: ConfigType = dict(
+                     type='BN', momentum=0.1, eps=1e-5),
+                 act_cfg: ConfigType = dict(type='SiLU', inplace=True),
+                 attention_cfg: ConfigType = dict(
+                     type='EffectiveSELayer', act_cfg=dict(type='HSigmoid')),
+                 norm_eval: bool = False,
+                 init_cfg: OptMultiConfig = None,
+                 use_large_stem: bool = False):
+        arch_setting = self.arch_settings[arch]
+        if arch_ovewrite:
+            arch_setting = arch_ovewrite
+        arch_setting = [[
+            int(in_channels * widen_factor),
+            int(out_channels * widen_factor),
+            round(num_blocks * deepen_factor)
+        ] for in_channels, out_channels, num_blocks in arch_setting]
+        self.block_cfg = block_cfg
+        self.use_large_stem = use_large_stem
+        self.attention_cfg = attention_cfg
+
+        super().__init__(
+            arch_setting,
+            deepen_factor,
+            widen_factor,
+            input_channels=input_channels,
+            out_indices=out_indices,
+            plugins=plugins,
+            frozen_stages=frozen_stages,
+            norm_cfg=norm_cfg,
+            act_cfg=act_cfg,
+            norm_eval=norm_eval,
+            init_cfg=init_cfg)
+
+    def build_stem_layer(self) -> nn.Module:
+        """Build a stem layer."""
+        if self.use_large_stem:
+            stem = nn.Sequential(
+                ConvModule(
+                    self.input_channels,
+                    self.arch_setting[0][0] // 2,
+                    3,
+                    stride=2,
+                    padding=1,
+                    act_cfg=self.act_cfg,
+                    norm_cfg=self.norm_cfg),
+                ConvModule(
+                    self.arch_setting[0][0] // 2,
+                    self.arch_setting[0][0] // 2,
+                    3,
+                    stride=1,
+                    padding=1,
+                    norm_cfg=self.norm_cfg,
+                    act_cfg=self.act_cfg),
+                ConvModule(
+                    self.arch_setting[0][0] // 2,
+                    self.arch_setting[0][0],
+                    3,
+                    stride=1,
+                    padding=1,
+                    norm_cfg=self.norm_cfg,
+                    act_cfg=self.act_cfg))
+        else:
+            stem = nn.Sequential(
+                ConvModule(
+                    self.input_channels,
+                    self.arch_setting[0][0] // 2,
+                    3,
+                    stride=2,
+                    padding=1,
+                    norm_cfg=self.norm_cfg,
+                    act_cfg=self.act_cfg),
+                ConvModule(
+                    self.arch_setting[0][0] // 2,
+                    self.arch_setting[0][0],
+                    3,
+                    stride=1,
+                    padding=1,
+                    norm_cfg=self.norm_cfg,
+                    act_cfg=self.act_cfg))
+        return stem
+
+    def build_stage_layer(self, stage_idx: int, setting: list) -> list:
+        """Build a stage layer.
+
+        Args:
+            stage_idx (int): The index of a stage layer.
+            setting (list): The architecture setting of a stage layer.
+        """
+        in_channels, out_channels, num_blocks = setting
+
+        cspres_layer = CSPResLayer(
+            in_channels=in_channels,
+            out_channels=out_channels,
+            num_block=num_blocks,
+            block_cfg=self.block_cfg,
+            stride=2,
+            norm_cfg=self.norm_cfg,
+            act_cfg=self.act_cfg,
+            attention_cfg=self.attention_cfg,
+            use_spp=False)
+        return [cspres_layer]
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/models/backbones/cspnext.py b/mmdetection_practice/third_party/mmyolo/mmyolo/models/backbones/cspnext.py
new file mode 100644
index 0000000..adca9dd
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/models/backbones/cspnext.py
@@ -0,0 +1,187 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+import math
+from typing import List, Sequence, Union
+
+import torch.nn as nn
+from mmcv.cnn import ConvModule, DepthwiseSeparableConvModule
+from mmdet.models.backbones.csp_darknet import CSPLayer
+from mmdet.utils import ConfigType, OptConfigType, OptMultiConfig
+
+from mmyolo.registry import MODELS
+from ..layers import SPPFBottleneck
+from .base_backbone import BaseBackbone
+
+
+@MODELS.register_module()
+class CSPNeXt(BaseBackbone):
+    """CSPNeXt backbone used in RTMDet.
+
+    Args:
+        arch (str): Architecture of CSPNeXt, from {P5, P6}.
+            Defaults to P5.
+        deepen_factor (float): Depth multiplier, multiply number of
+            blocks in CSP layer by this amount. Defaults to 1.0.
+        widen_factor (float): Width multiplier, multiply number of
+            channels in each layer by this amount. Defaults to 1.0.
+        out_indices (Sequence[int]): Output from which stages.
+            Defaults to (2, 3, 4).
+        frozen_stages (int): Stages to be frozen (stop grad and set eval
+            mode). -1 means not freezing any parameters. Defaults to -1.
+        plugins (list[dict]): List of plugins for stages, each dict contains:
+            - cfg (dict, required): Cfg dict to build plugin.Defaults to
+            - stages (tuple[bool], optional): Stages to apply plugin, length
+              should be same as 'num_stages'.
+        use_depthwise (bool): Whether to use depthwise separable convolution.
+            Defaults to False.
+        expand_ratio (float): Ratio to adjust the number of channels of the
+            hidden layer. Defaults to 0.5.
+        arch_ovewrite (list): Overwrite default arch settings.
+            Defaults to None.
+        channel_attention (bool): Whether to add channel attention in each
+            stage. Defaults to True.
+        conv_cfg (:obj:`ConfigDict` or dict, optional): Config dict for
+            convolution layer. Defaults to None.
+        norm_cfg (:obj:`ConfigDict` or dict): Dictionary to construct and
+            config norm layer. Defaults to dict(type='BN', requires_grad=True).
+        act_cfg (:obj:`ConfigDict` or dict): Config dict for activation layer.
+            Defaults to dict(type='SiLU', inplace=True).
+        norm_eval (bool): Whether to set norm layers to eval mode, namely,
+            freeze running stats (mean and var). Note: Effect on Batch Norm
+            and its variants only.
+        init_cfg (:obj:`ConfigDict` or dict or list[dict] or
+            list[:obj:`ConfigDict`]): Initialization config dict.
+    """
+    # From left to right:
+    # in_channels, out_channels, num_blocks, add_identity, use_spp
+    arch_settings = {
+        'P5': [[64, 128, 3, True, False], [128, 256, 6, True, False],
+               [256, 512, 6, True, False], [512, 1024, 3, False, True]],
+        'P6': [[64, 128, 3, True, False], [128, 256, 6, True, False],
+               [256, 512, 6, True, False], [512, 768, 3, True, False],
+               [768, 1024, 3, False, True]]
+    }
+
+    def __init__(
+        self,
+        arch: str = 'P5',
+        deepen_factor: float = 1.0,
+        widen_factor: float = 1.0,
+        input_channels: int = 3,
+        out_indices: Sequence[int] = (2, 3, 4),
+        frozen_stages: int = -1,
+        plugins: Union[dict, List[dict]] = None,
+        use_depthwise: bool = False,
+        expand_ratio: float = 0.5,
+        arch_ovewrite: dict = None,
+        channel_attention: bool = True,
+        conv_cfg: OptConfigType = None,
+        norm_cfg: ConfigType = dict(type='BN'),
+        act_cfg: ConfigType = dict(type='SiLU', inplace=True),
+        norm_eval: bool = False,
+        init_cfg: OptMultiConfig = dict(
+            type='Kaiming',
+            layer='Conv2d',
+            a=math.sqrt(5),
+            distribution='uniform',
+            mode='fan_in',
+            nonlinearity='leaky_relu')
+    ) -> None:
+        arch_setting = self.arch_settings[arch]
+        if arch_ovewrite:
+            arch_setting = arch_ovewrite
+        self.channel_attention = channel_attention
+        self.use_depthwise = use_depthwise
+        self.conv = DepthwiseSeparableConvModule \
+            if use_depthwise else ConvModule
+        self.expand_ratio = expand_ratio
+        self.conv_cfg = conv_cfg
+
+        super().__init__(
+            arch_setting,
+            deepen_factor,
+            widen_factor,
+            input_channels,
+            out_indices,
+            frozen_stages=frozen_stages,
+            plugins=plugins,
+            norm_cfg=norm_cfg,
+            act_cfg=act_cfg,
+            norm_eval=norm_eval,
+            init_cfg=init_cfg)
+
+    def build_stem_layer(self) -> nn.Module:
+        """Build a stem layer."""
+        stem = nn.Sequential(
+            ConvModule(
+                3,
+                int(self.arch_setting[0][0] * self.widen_factor // 2),
+                3,
+                padding=1,
+                stride=2,
+                norm_cfg=self.norm_cfg,
+                act_cfg=self.act_cfg),
+            ConvModule(
+                int(self.arch_setting[0][0] * self.widen_factor // 2),
+                int(self.arch_setting[0][0] * self.widen_factor // 2),
+                3,
+                padding=1,
+                stride=1,
+                norm_cfg=self.norm_cfg,
+                act_cfg=self.act_cfg),
+            ConvModule(
+                int(self.arch_setting[0][0] * self.widen_factor // 2),
+                int(self.arch_setting[0][0] * self.widen_factor),
+                3,
+                padding=1,
+                stride=1,
+                norm_cfg=self.norm_cfg,
+                act_cfg=self.act_cfg))
+        return stem
+
+    def build_stage_layer(self, stage_idx: int, setting: list) -> list:
+        """Build a stage layer.
+
+        Args:
+            stage_idx (int): The index of a stage layer.
+            setting (list): The architecture setting of a stage layer.
+        """
+        in_channels, out_channels, num_blocks, add_identity, use_spp = setting
+
+        in_channels = int(in_channels * self.widen_factor)
+        out_channels = int(out_channels * self.widen_factor)
+        num_blocks = max(round(num_blocks * self.deepen_factor), 1)
+
+        stage = []
+        conv_layer = self.conv(
+            in_channels,
+            out_channels,
+            3,
+            stride=2,
+            padding=1,
+            conv_cfg=self.conv_cfg,
+            norm_cfg=self.norm_cfg,
+            act_cfg=self.act_cfg)
+        stage.append(conv_layer)
+        if use_spp:
+            spp = SPPFBottleneck(
+                out_channels,
+                out_channels,
+                kernel_sizes=5,
+                conv_cfg=self.conv_cfg,
+                norm_cfg=self.norm_cfg,
+                act_cfg=self.act_cfg)
+            stage.append(spp)
+        csp_layer = CSPLayer(
+            out_channels,
+            out_channels,
+            num_blocks=num_blocks,
+            add_identity=add_identity,
+            use_depthwise=self.use_depthwise,
+            use_cspnext_block=True,
+            expand_ratio=self.expand_ratio,
+            channel_attention=self.channel_attention,
+            conv_cfg=self.conv_cfg,
+            norm_cfg=self.norm_cfg,
+            act_cfg=self.act_cfg)
+        stage.append(csp_layer)
+        return stage
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/models/backbones/efficient_rep.py b/mmdetection_practice/third_party/mmyolo/mmyolo/models/backbones/efficient_rep.py
new file mode 100644
index 0000000..32e455f
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/models/backbones/efficient_rep.py
@@ -0,0 +1,305 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+
+from typing import List, Tuple, Union
+
+import torch
+import torch.nn as nn
+from mmdet.utils import ConfigType, OptMultiConfig
+
+from mmyolo.models.layers.yolo_bricks import CSPSPPFBottleneck, SPPFBottleneck
+from mmyolo.registry import MODELS
+from ..layers import BepC3StageBlock, RepStageBlock
+from ..utils import make_round
+from .base_backbone import BaseBackbone
+
+
+@MODELS.register_module()
+class YOLOv6EfficientRep(BaseBackbone):
+    """EfficientRep backbone used in YOLOv6.
+    Args:
+        arch (str): Architecture of BaseDarknet, from {P5, P6}.
+            Defaults to P5.
+        plugins (list[dict]): List of plugins for stages, each dict contains:
+            - cfg (dict, required): Cfg dict to build plugin.
+            - stages (tuple[bool], optional): Stages to apply plugin, length
+              should be same as 'num_stages'.
+        deepen_factor (float): Depth multiplier, multiply number of
+            blocks in CSP layer by this amount. Defaults to 1.0.
+        widen_factor (float): Width multiplier, multiply number of
+            channels in each layer by this amount. Defaults to 1.0.
+        input_channels (int): Number of input image channels. Defaults to 3.
+        out_indices (Tuple[int]): Output from which stages.
+            Defaults to (2, 3, 4).
+        frozen_stages (int): Stages to be frozen (stop grad and set eval
+            mode). -1 means not freezing any parameters. Defaults to -1.
+        norm_cfg (dict): Dictionary to construct and config norm layer.
+            Defaults to dict(type='BN', requires_grad=True).
+        act_cfg (dict): Config dict for activation layer.
+            Defaults to dict(type='LeakyReLU', negative_slope=0.1).
+        norm_eval (bool): Whether to set norm layers to eval mode, namely,
+            freeze running stats (mean and var). Note: Effect on Batch Norm
+            and its variants only. Defaults to False.
+        block_cfg (dict): Config dict for the block used to build each
+            layer. Defaults to dict(type='RepVGGBlock').
+        init_cfg (Union[dict, list[dict]], optional): Initialization config
+            dict. Defaults to None.
+    Example:
+        >>> from mmyolo.models import YOLOv6EfficientRep
+        >>> import torch
+        >>> model = YOLOv6EfficientRep()
+        >>> model.eval()
+        >>> inputs = torch.rand(1, 3, 416, 416)
+        >>> level_outputs = model(inputs)
+        >>> for level_out in level_outputs:
+        ...     print(tuple(level_out.shape))
+        ...
+        (1, 256, 52, 52)
+        (1, 512, 26, 26)
+        (1, 1024, 13, 13)
+    """
+    # From left to right:
+    # in_channels, out_channels, num_blocks, use_spp
+    arch_settings = {
+        'P5': [[64, 128, 6, False], [128, 256, 12, False],
+               [256, 512, 18, False], [512, 1024, 6, True]]
+    }
+
+    def __init__(self,
+                 arch: str = 'P5',
+                 plugins: Union[dict, List[dict]] = None,
+                 deepen_factor: float = 1.0,
+                 widen_factor: float = 1.0,
+                 input_channels: int = 3,
+                 out_indices: Tuple[int] = (2, 3, 4),
+                 frozen_stages: int = -1,
+                 use_cspsppf: bool = False,
+                 norm_cfg: ConfigType = dict(
+                     type='BN', momentum=0.03, eps=0.001),
+                 act_cfg: ConfigType = dict(type='ReLU', inplace=True),
+                 norm_eval: bool = False,
+                 block_cfg: ConfigType = dict(type='RepVGGBlock'),
+                 init_cfg: OptMultiConfig = None):
+        self.block_cfg = block_cfg
+        self.use_cspsppf = use_cspsppf
+        super().__init__(
+            self.arch_settings[arch],
+            deepen_factor,
+            widen_factor,
+            input_channels=input_channels,
+            out_indices=out_indices,
+            plugins=plugins,
+            frozen_stages=frozen_stages,
+            norm_cfg=norm_cfg,
+            act_cfg=act_cfg,
+            norm_eval=norm_eval,
+            init_cfg=init_cfg)
+
+    def build_stem_layer(self) -> nn.Module:
+        """Build a stem layer."""
+
+        block_cfg = self.block_cfg.copy()
+        block_cfg.update(
+            dict(
+                in_channels=self.input_channels,
+                out_channels=int(self.arch_setting[0][0] * self.widen_factor),
+                kernel_size=3,
+                stride=2,
+            ))
+        return MODELS.build(block_cfg)
+
+    def build_stage_layer(self, stage_idx: int, setting: list) -> list:
+        """Build a stage layer.
+
+        Args:
+            stage_idx (int): The index of a stage layer.
+            setting (list): The architecture setting of a stage layer.
+        """
+        in_channels, out_channels, num_blocks, use_spp = setting
+
+        in_channels = int(in_channels * self.widen_factor)
+        out_channels = int(out_channels * self.widen_factor)
+        num_blocks = make_round(num_blocks, self.deepen_factor)
+
+        rep_stage_block = RepStageBlock(
+            in_channels=out_channels,
+            out_channels=out_channels,
+            num_blocks=num_blocks,
+            block_cfg=self.block_cfg,
+        )
+
+        block_cfg = self.block_cfg.copy()
+        block_cfg.update(
+            dict(
+                in_channels=in_channels,
+                out_channels=out_channels,
+                kernel_size=3,
+                stride=2))
+        stage = []
+
+        ef_block = nn.Sequential(MODELS.build(block_cfg), rep_stage_block)
+
+        stage.append(ef_block)
+
+        if use_spp:
+            spp = SPPFBottleneck(
+                in_channels=out_channels,
+                out_channels=out_channels,
+                kernel_sizes=5,
+                norm_cfg=self.norm_cfg,
+                act_cfg=self.act_cfg)
+            if self.use_cspsppf:
+                spp = CSPSPPFBottleneck(
+                    in_channels=out_channels,
+                    out_channels=out_channels,
+                    kernel_sizes=5,
+                    norm_cfg=self.norm_cfg,
+                    act_cfg=self.act_cfg)
+            stage.append(spp)
+        return stage
+
+    def init_weights(self):
+        if self.init_cfg is None:
+            """Initialize the parameters."""
+            for m in self.modules():
+                if isinstance(m, torch.nn.Conv2d):
+                    # In order to be consistent with the source code,
+                    # reset the Conv2d initialization parameters
+                    m.reset_parameters()
+        else:
+            super().init_weights()
+
+
+@MODELS.register_module()
+class YOLOv6CSPBep(YOLOv6EfficientRep):
+    """CSPBep backbone used in YOLOv6.
+    Args:
+        arch (str): Architecture of BaseDarknet, from {P5, P6}.
+            Defaults to P5.
+        plugins (list[dict]): List of plugins for stages, each dict contains:
+            - cfg (dict, required): Cfg dict to build plugin.
+            - stages (tuple[bool], optional): Stages to apply plugin, length
+              should be same as 'num_stages'.
+        deepen_factor (float): Depth multiplier, multiply number of
+            blocks in CSP layer by this amount. Defaults to 1.0.
+        widen_factor (float): Width multiplier, multiply number of
+            channels in each layer by this amount. Defaults to 1.0.
+        input_channels (int): Number of input image channels. Defaults to 3.
+        out_indices (Tuple[int]): Output from which stages.
+            Defaults to (2, 3, 4).
+        frozen_stages (int): Stages to be frozen (stop grad and set eval
+            mode). -1 means not freezing any parameters. Defaults to -1.
+        norm_cfg (dict): Dictionary to construct and config norm layer.
+            Defaults to dict(type='BN', requires_grad=True).
+        act_cfg (dict): Config dict for activation layer.
+            Defaults to dict(type='LeakyReLU', negative_slope=0.1).
+        norm_eval (bool): Whether to set norm layers to eval mode, namely,
+            freeze running stats (mean and var). Note: Effect on Batch Norm
+            and its variants only. Defaults to False.
+        block_cfg (dict): Config dict for the block used to build each
+            layer. Defaults to dict(type='RepVGGBlock').
+        block_act_cfg (dict): Config dict for activation layer used in each
+            stage. Defaults to dict(type='SiLU', inplace=True).
+        init_cfg (Union[dict, list[dict]], optional): Initialization config
+            dict. Defaults to None.
+    Example:
+        >>> from mmyolo.models import YOLOv6CSPBep
+        >>> import torch
+        >>> model = YOLOv6CSPBep()
+        >>> model.eval()
+        >>> inputs = torch.rand(1, 3, 416, 416)
+        >>> level_outputs = model(inputs)
+        >>> for level_out in level_outputs:
+        ...     print(tuple(level_out.shape))
+        ...
+        (1, 256, 52, 52)
+        (1, 512, 26, 26)
+        (1, 1024, 13, 13)
+    """
+    # From left to right:
+    # in_channels, out_channels, num_blocks, use_spp
+    arch_settings = {
+        'P5': [[64, 128, 6, False], [128, 256, 12, False],
+               [256, 512, 18, False], [512, 1024, 6, True]]
+    }
+
+    def __init__(self,
+                 arch: str = 'P5',
+                 plugins: Union[dict, List[dict]] = None,
+                 deepen_factor: float = 1.0,
+                 widen_factor: float = 1.0,
+                 input_channels: int = 3,
+                 hidden_ratio: float = 0.5,
+                 out_indices: Tuple[int] = (2, 3, 4),
+                 frozen_stages: int = -1,
+                 use_cspsppf: bool = False,
+                 norm_cfg: ConfigType = dict(
+                     type='BN', momentum=0.03, eps=0.001),
+                 act_cfg: ConfigType = dict(type='SiLU', inplace=True),
+                 norm_eval: bool = False,
+                 block_cfg: ConfigType = dict(type='ConvWrapper'),
+                 init_cfg: OptMultiConfig = None):
+        self.hidden_ratio = hidden_ratio
+        self.use_cspsppf = use_cspsppf
+        super().__init__(
+            arch=arch,
+            deepen_factor=deepen_factor,
+            widen_factor=widen_factor,
+            input_channels=input_channels,
+            out_indices=out_indices,
+            plugins=plugins,
+            frozen_stages=frozen_stages,
+            norm_cfg=norm_cfg,
+            act_cfg=act_cfg,
+            norm_eval=norm_eval,
+            block_cfg=block_cfg,
+            init_cfg=init_cfg)
+
+    def build_stage_layer(self, stage_idx: int, setting: list) -> list:
+        """Build a stage layer.
+
+        Args:
+            stage_idx (int): The index of a stage layer.
+            setting (list): The architecture setting of a stage layer.
+        """
+        in_channels, out_channels, num_blocks, use_spp = setting
+        in_channels = int(in_channels * self.widen_factor)
+        out_channels = int(out_channels * self.widen_factor)
+        num_blocks = make_round(num_blocks, self.deepen_factor)
+
+        rep_stage_block = BepC3StageBlock(
+            in_channels=out_channels,
+            out_channels=out_channels,
+            num_blocks=num_blocks,
+            hidden_ratio=self.hidden_ratio,
+            block_cfg=self.block_cfg,
+            norm_cfg=self.norm_cfg,
+            act_cfg=self.act_cfg)
+        block_cfg = self.block_cfg.copy()
+        block_cfg.update(
+            dict(
+                in_channels=in_channels,
+                out_channels=out_channels,
+                kernel_size=3,
+                stride=2))
+        stage = []
+
+        ef_block = nn.Sequential(MODELS.build(block_cfg), rep_stage_block)
+
+        stage.append(ef_block)
+
+        if use_spp:
+            spp = SPPFBottleneck(
+                in_channels=out_channels,
+                out_channels=out_channels,
+                kernel_sizes=5,
+                norm_cfg=self.norm_cfg,
+                act_cfg=self.act_cfg)
+            if self.use_cspsppf:
+                spp = CSPSPPFBottleneck(
+                    in_channels=out_channels,
+                    out_channels=out_channels,
+                    kernel_sizes=5,
+                    norm_cfg=self.norm_cfg,
+                    act_cfg=self.act_cfg)
+            stage.append(spp)
+        return stage
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/models/backbones/yolov7_backbone.py b/mmdetection_practice/third_party/mmyolo/mmyolo/models/backbones/yolov7_backbone.py
new file mode 100644
index 0000000..bb9a5ee
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/models/backbones/yolov7_backbone.py
@@ -0,0 +1,285 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from typing import List, Optional, Tuple, Union
+
+import torch.nn as nn
+from mmcv.cnn import ConvModule
+from mmdet.models.backbones.csp_darknet import Focus
+from mmdet.utils import ConfigType, OptMultiConfig
+
+from mmyolo.registry import MODELS
+from ..layers import MaxPoolAndStrideConvBlock
+from .base_backbone import BaseBackbone
+
+
+@MODELS.register_module()
+class YOLOv7Backbone(BaseBackbone):
+    """Backbone used in YOLOv7.
+
+    Args:
+        arch (str): Architecture of YOLOv7Defaults to L.
+        deepen_factor (float): Depth multiplier, multiply number of
+            blocks in CSP layer by this amount. Defaults to 1.0.
+        widen_factor (float): Width multiplier, multiply number of
+            channels in each layer by this amount. Defaults to 1.0.
+        out_indices (Sequence[int]): Output from which stages.
+            Defaults to (2, 3, 4).
+        frozen_stages (int): Stages to be frozen (stop grad and set eval
+            mode). -1 means not freezing any parameters. Defaults to -1.
+        plugins (list[dict]): List of plugins for stages, each dict contains:
+
+            - cfg (dict, required): Cfg dict to build plugin.
+            - stages (tuple[bool], optional): Stages to apply plugin, length
+              should be same as 'num_stages'.
+        norm_cfg (:obj:`ConfigDict` or dict): Dictionary to construct and
+            config norm layer. Defaults to dict(type='BN', requires_grad=True).
+        act_cfg (:obj:`ConfigDict` or dict): Config dict for activation layer.
+            Defaults to dict(type='SiLU', inplace=True).
+        norm_eval (bool): Whether to set norm layers to eval mode, namely,
+            freeze running stats (mean and var). Note: Effect on Batch Norm
+            and its variants only.
+        init_cfg (:obj:`ConfigDict` or dict or list[dict] or
+            list[:obj:`ConfigDict`]): Initialization config dict.
+    """
+    _tiny_stage1_cfg = dict(type='TinyDownSampleBlock', middle_ratio=0.5)
+    _tiny_stage2_4_cfg = dict(type='TinyDownSampleBlock', middle_ratio=1.0)
+    _l_expand_channel_2x = dict(
+        type='ELANBlock',
+        middle_ratio=0.5,
+        block_ratio=0.5,
+        num_blocks=2,
+        num_convs_in_block=2)
+    _l_no_change_channel = dict(
+        type='ELANBlock',
+        middle_ratio=0.25,
+        block_ratio=0.25,
+        num_blocks=2,
+        num_convs_in_block=2)
+    _x_expand_channel_2x = dict(
+        type='ELANBlock',
+        middle_ratio=0.4,
+        block_ratio=0.4,
+        num_blocks=3,
+        num_convs_in_block=2)
+    _x_no_change_channel = dict(
+        type='ELANBlock',
+        middle_ratio=0.2,
+        block_ratio=0.2,
+        num_blocks=3,
+        num_convs_in_block=2)
+    _w_no_change_channel = dict(
+        type='ELANBlock',
+        middle_ratio=0.5,
+        block_ratio=0.5,
+        num_blocks=2,
+        num_convs_in_block=2)
+    _e_no_change_channel = dict(
+        type='ELANBlock',
+        middle_ratio=0.4,
+        block_ratio=0.4,
+        num_blocks=3,
+        num_convs_in_block=2)
+    _d_no_change_channel = dict(
+        type='ELANBlock',
+        middle_ratio=1 / 3,
+        block_ratio=1 / 3,
+        num_blocks=4,
+        num_convs_in_block=2)
+    _e2e_no_change_channel = dict(
+        type='EELANBlock',
+        num_elan_block=2,
+        middle_ratio=0.4,
+        block_ratio=0.4,
+        num_blocks=3,
+        num_convs_in_block=2)
+
+    # From left to right:
+    # in_channels, out_channels, Block_params
+    arch_settings = {
+        'Tiny': [[64, 64, _tiny_stage1_cfg], [64, 128, _tiny_stage2_4_cfg],
+                 [128, 256, _tiny_stage2_4_cfg],
+                 [256, 512, _tiny_stage2_4_cfg]],
+        'L': [[64, 256, _l_expand_channel_2x],
+              [256, 512, _l_expand_channel_2x],
+              [512, 1024, _l_expand_channel_2x],
+              [1024, 1024, _l_no_change_channel]],
+        'X': [[80, 320, _x_expand_channel_2x],
+              [320, 640, _x_expand_channel_2x],
+              [640, 1280, _x_expand_channel_2x],
+              [1280, 1280, _x_no_change_channel]],
+        'W':
+        [[64, 128, _w_no_change_channel], [128, 256, _w_no_change_channel],
+         [256, 512, _w_no_change_channel], [512, 768, _w_no_change_channel],
+         [768, 1024, _w_no_change_channel]],
+        'E':
+        [[80, 160, _e_no_change_channel], [160, 320, _e_no_change_channel],
+         [320, 640, _e_no_change_channel], [640, 960, _e_no_change_channel],
+         [960, 1280, _e_no_change_channel]],
+        'D': [[96, 192,
+               _d_no_change_channel], [192, 384, _d_no_change_channel],
+              [384, 768, _d_no_change_channel],
+              [768, 1152, _d_no_change_channel],
+              [1152, 1536, _d_no_change_channel]],
+        'E2E': [[80, 160, _e2e_no_change_channel],
+                [160, 320, _e2e_no_change_channel],
+                [320, 640, _e2e_no_change_channel],
+                [640, 960, _e2e_no_change_channel],
+                [960, 1280, _e2e_no_change_channel]],
+    }
+
+    def __init__(self,
+                 arch: str = 'L',
+                 deepen_factor: float = 1.0,
+                 widen_factor: float = 1.0,
+                 input_channels: int = 3,
+                 out_indices: Tuple[int] = (2, 3, 4),
+                 frozen_stages: int = -1,
+                 plugins: Union[dict, List[dict]] = None,
+                 norm_cfg: ConfigType = dict(
+                     type='BN', momentum=0.03, eps=0.001),
+                 act_cfg: ConfigType = dict(type='SiLU', inplace=True),
+                 norm_eval: bool = False,
+                 init_cfg: OptMultiConfig = None):
+        assert arch in self.arch_settings.keys()
+        self.arch = arch
+        super().__init__(
+            self.arch_settings[arch],
+            deepen_factor,
+            widen_factor,
+            input_channels=input_channels,
+            out_indices=out_indices,
+            plugins=plugins,
+            frozen_stages=frozen_stages,
+            norm_cfg=norm_cfg,
+            act_cfg=act_cfg,
+            norm_eval=norm_eval,
+            init_cfg=init_cfg)
+
+    def build_stem_layer(self) -> nn.Module:
+        """Build a stem layer."""
+        if self.arch in ['L', 'X']:
+            stem = nn.Sequential(
+                ConvModule(
+                    3,
+                    int(self.arch_setting[0][0] * self.widen_factor // 2),
+                    3,
+                    padding=1,
+                    stride=1,
+                    norm_cfg=self.norm_cfg,
+                    act_cfg=self.act_cfg),
+                ConvModule(
+                    int(self.arch_setting[0][0] * self.widen_factor // 2),
+                    int(self.arch_setting[0][0] * self.widen_factor),
+                    3,
+                    padding=1,
+                    stride=2,
+                    norm_cfg=self.norm_cfg,
+                    act_cfg=self.act_cfg),
+                ConvModule(
+                    int(self.arch_setting[0][0] * self.widen_factor),
+                    int(self.arch_setting[0][0] * self.widen_factor),
+                    3,
+                    padding=1,
+                    stride=1,
+                    norm_cfg=self.norm_cfg,
+                    act_cfg=self.act_cfg))
+        elif self.arch == 'Tiny':
+            stem = nn.Sequential(
+                ConvModule(
+                    3,
+                    int(self.arch_setting[0][0] * self.widen_factor // 2),
+                    3,
+                    padding=1,
+                    stride=2,
+                    norm_cfg=self.norm_cfg,
+                    act_cfg=self.act_cfg),
+                ConvModule(
+                    int(self.arch_setting[0][0] * self.widen_factor // 2),
+                    int(self.arch_setting[0][0] * self.widen_factor),
+                    3,
+                    padding=1,
+                    stride=2,
+                    norm_cfg=self.norm_cfg,
+                    act_cfg=self.act_cfg))
+        elif self.arch in ['W', 'E', 'D', 'E2E']:
+            stem = Focus(
+                3,
+                int(self.arch_setting[0][0] * self.widen_factor),
+                kernel_size=3,
+                norm_cfg=self.norm_cfg,
+                act_cfg=self.act_cfg)
+        return stem
+
+    def build_stage_layer(self, stage_idx: int, setting: list) -> list:
+        """Build a stage layer.
+
+        Args:
+            stage_idx (int): The index of a stage layer.
+            setting (list): The architecture setting of a stage layer.
+        """
+        in_channels, out_channels, stage_block_cfg = setting
+        in_channels = int(in_channels * self.widen_factor)
+        out_channels = int(out_channels * self.widen_factor)
+
+        stage_block_cfg = stage_block_cfg.copy()
+        stage_block_cfg.setdefault('norm_cfg', self.norm_cfg)
+        stage_block_cfg.setdefault('act_cfg', self.act_cfg)
+
+        stage_block_cfg['in_channels'] = in_channels
+        stage_block_cfg['out_channels'] = out_channels
+
+        stage = []
+        if self.arch in ['W', 'E', 'D', 'E2E']:
+            stage_block_cfg['in_channels'] = out_channels
+        elif self.arch in ['L', 'X']:
+            if stage_idx == 0:
+                stage_block_cfg['in_channels'] = out_channels // 2
+
+        downsample_layer = self._build_downsample_layer(
+            stage_idx, in_channels, out_channels)
+        stage.append(MODELS.build(stage_block_cfg))
+        if downsample_layer is not None:
+            stage.insert(0, downsample_layer)
+        return stage
+
+    def _build_downsample_layer(self, stage_idx: int, in_channels: int,
+                                out_channels: int) -> Optional[nn.Module]:
+        """Build a downsample layer pre stage."""
+        if self.arch in ['E', 'D', 'E2E']:
+            downsample_layer = MaxPoolAndStrideConvBlock(
+                in_channels,
+                out_channels,
+                use_in_channels_of_middle=True,
+                norm_cfg=self.norm_cfg,
+                act_cfg=self.act_cfg)
+        elif self.arch == 'W':
+            downsample_layer = ConvModule(
+                in_channels,
+                out_channels,
+                3,
+                stride=2,
+                padding=1,
+                norm_cfg=self.norm_cfg,
+                act_cfg=self.act_cfg)
+        elif self.arch == 'Tiny':
+            if stage_idx != 0:
+                downsample_layer = nn.MaxPool2d(2, 2)
+            else:
+                downsample_layer = None
+        elif self.arch in ['L', 'X']:
+            if stage_idx == 0:
+                downsample_layer = ConvModule(
+                    in_channels,
+                    out_channels // 2,
+                    3,
+                    stride=2,
+                    padding=1,
+                    norm_cfg=self.norm_cfg,
+                    act_cfg=self.act_cfg)
+            else:
+                downsample_layer = MaxPoolAndStrideConvBlock(
+                    in_channels,
+                    in_channels,
+                    use_in_channels_of_middle=False,
+                    norm_cfg=self.norm_cfg,
+                    act_cfg=self.act_cfg)
+        return downsample_layer
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/models/data_preprocessors/__init__.py b/mmdetection_practice/third_party/mmyolo/mmyolo/models/data_preprocessors/__init__.py
new file mode 100644
index 0000000..3ef4f6d
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/models/data_preprocessors/__init__.py
@@ -0,0 +1,10 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from .data_preprocessor import (PPYOLOEBatchRandomResize,
+                                PPYOLOEDetDataPreprocessor,
+                                YOLOv5DetDataPreprocessor,
+                                YOLOXBatchSyncRandomResize)
+
+__all__ = [
+    'YOLOv5DetDataPreprocessor', 'PPYOLOEDetDataPreprocessor',
+    'PPYOLOEBatchRandomResize', 'YOLOXBatchSyncRandomResize'
+]
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/models/data_preprocessors/data_preprocessor.py b/mmdetection_practice/third_party/mmyolo/mmyolo/models/data_preprocessors/data_preprocessor.py
new file mode 100644
index 0000000..a29b908
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/models/data_preprocessors/data_preprocessor.py
@@ -0,0 +1,310 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+import random
+from typing import List, Optional, Tuple, Union
+
+import torch
+import torch.nn.functional as F
+from mmdet.models import BatchSyncRandomResize
+from mmdet.models.data_preprocessors import DetDataPreprocessor
+from mmengine import MessageHub, is_list_of
+from mmengine.structures import BaseDataElement
+from torch import Tensor
+
+from mmyolo.registry import MODELS
+
+CastData = Union[tuple, dict, BaseDataElement, torch.Tensor, list, bytes, str,
+                 None]
+
+
+@MODELS.register_module()
+class YOLOXBatchSyncRandomResize(BatchSyncRandomResize):
+    """YOLOX batch random resize.
+
+    Args:
+        random_size_range (tuple): The multi-scale random range during
+            multi-scale training.
+        interval (int): The iter interval of change
+            image size. Defaults to 10.
+        size_divisor (int): Image size divisible factor.
+            Defaults to 32.
+    """
+
+    def forward(self, inputs: Tensor, data_samples: dict) -> Tensor and dict:
+        """resize a batch of images and bboxes to shape ``self._input_size``"""
+        h, w = inputs.shape[-2:]
+        inputs = inputs.float()
+        assert isinstance(data_samples, dict)
+
+        if self._input_size is None:
+            self._input_size = (h, w)
+        scale_y = self._input_size[0] / h
+        scale_x = self._input_size[1] / w
+        if scale_x != 1 or scale_y != 1:
+            inputs = F.interpolate(
+                inputs,
+                size=self._input_size,
+                mode='bilinear',
+                align_corners=False)
+
+            data_samples['bboxes_labels'][:, 2::2] *= scale_x
+            data_samples['bboxes_labels'][:, 3::2] *= scale_y
+
+            if 'keypoints' in data_samples:
+                data_samples['keypoints'][..., 0] *= scale_x
+                data_samples['keypoints'][..., 1] *= scale_y
+
+        message_hub = MessageHub.get_current_instance()
+        if (message_hub.get_info('iter') + 1) % self._interval == 0:
+            self._input_size = self._get_random_size(
+                aspect_ratio=float(w / h), device=inputs.device)
+
+        return inputs, data_samples
+
+
+@MODELS.register_module()
+class YOLOv5DetDataPreprocessor(DetDataPreprocessor):
+    """Rewrite collate_fn to get faster training speed.
+
+    Note: It must be used together with `mmyolo.datasets.utils.yolov5_collate`
+    """
+
+    def __init__(self, *args, non_blocking: Optional[bool] = True, **kwargs):
+        super().__init__(*args, non_blocking=non_blocking, **kwargs)
+
+    def forward(self, data: dict, training: bool = False) -> dict:
+        """Perform normalization, padding and bgr2rgb conversion based on
+        ``DetDataPreprocessorr``.
+
+        Args:
+            data (dict): Data sampled from dataloader.
+            training (bool): Whether to enable training time augmentation.
+
+        Returns:
+            dict: Data in the same format as the model input.
+        """
+        if not training:
+            return super().forward(data, training)
+
+        data = self.cast_data(data)
+        inputs, data_samples = data['inputs'], data['data_samples']
+        assert isinstance(data['data_samples'], dict)
+
+        # TODO: Supports multi-scale training
+        if self._channel_conversion and inputs.shape[1] == 3:
+            inputs = inputs[:, [2, 1, 0], ...]
+        if self._enable_normalize:
+            inputs = (inputs - self.mean) / self.std
+
+        if self.batch_augments is not None:
+            for batch_aug in self.batch_augments:
+                inputs, data_samples = batch_aug(inputs, data_samples)
+
+        img_metas = [{'batch_input_shape': inputs.shape[2:]}] * len(inputs)
+        data_samples_output = {
+            'bboxes_labels': data_samples['bboxes_labels'],
+            'img_metas': img_metas
+        }
+        if 'masks' in data_samples:
+            data_samples_output['masks'] = data_samples['masks']
+        if 'keypoints' in data_samples:
+            data_samples_output['keypoints'] = data_samples['keypoints']
+            data_samples_output['keypoints_visible'] = data_samples[
+                'keypoints_visible']
+
+        return {'inputs': inputs, 'data_samples': data_samples_output}
+
+
+@MODELS.register_module()
+class PPYOLOEDetDataPreprocessor(DetDataPreprocessor):
+    """Image pre-processor for detection tasks.
+
+    The main difference between PPYOLOEDetDataPreprocessor and
+    DetDataPreprocessor is the normalization order. The official
+    PPYOLOE resize image first, and then normalize image.
+    In DetDataPreprocessor, the order is reversed.
+
+    Note: It must be used together with
+    `mmyolo.datasets.utils.yolov5_collate`
+    """
+
+    def forward(self, data: dict, training: bool = False) -> dict:
+        """Perform normalization、padding and bgr2rgb conversion based on
+        ``BaseDataPreprocessor``. This class use batch_augments first, and then
+        normalize the image, which is different from the `DetDataPreprocessor`
+        .
+
+        Args:
+            data (dict): Data sampled from dataloader.
+            training (bool): Whether to enable training time augmentation.
+
+        Returns:
+            dict: Data in the same format as the model input.
+        """
+        if not training:
+            return super().forward(data, training)
+
+        assert isinstance(data['inputs'], list) and is_list_of(
+            data['inputs'], torch.Tensor), \
+            '"inputs" should be a list of Tensor, but got ' \
+            f'{type(data["inputs"])}. The possible reason for this ' \
+            'is that you are not using it with ' \
+            '"mmyolo.datasets.utils.yolov5_collate". Please refer to ' \
+            '"cconfigs/ppyoloe/ppyoloe_plus_s_fast_8xb8-80e_coco.py".'
+
+        data = self.cast_data(data)
+        inputs, data_samples = data['inputs'], data['data_samples']
+        assert isinstance(data['data_samples'], dict)
+
+        # Process data.
+        batch_inputs = []
+        for _input in inputs:
+            # channel transform
+            if self._channel_conversion:
+                _input = _input[[2, 1, 0], ...]
+            # Convert to float after channel conversion to ensure
+            # efficiency
+            _input = _input.float()
+            batch_inputs.append(_input)
+
+        # Batch random resize image.
+        if self.batch_augments is not None:
+            for batch_aug in self.batch_augments:
+                inputs, data_samples = batch_aug(batch_inputs, data_samples)
+
+        if self._enable_normalize:
+            inputs = (inputs - self.mean) / self.std
+
+        img_metas = [{'batch_input_shape': inputs.shape[2:]}] * len(inputs)
+        data_samples = {
+            'bboxes_labels': data_samples['bboxes_labels'],
+            'img_metas': img_metas
+        }
+
+        return {'inputs': inputs, 'data_samples': data_samples}
+
+
+# TODO: No generality. Its input data format is different
+#  mmdet's batch aug, and it must be compatible in the future.
+@MODELS.register_module()
+class PPYOLOEBatchRandomResize(BatchSyncRandomResize):
+    """PPYOLOE batch random resize.
+
+    Args:
+        random_size_range (tuple): The multi-scale random range during
+            multi-scale training.
+        interval (int): The iter interval of change
+            image size. Defaults to 10.
+        size_divisor (int): Image size divisible factor.
+            Defaults to 32.
+        random_interp (bool): Whether to choose interp_mode randomly.
+            If set to True, the type of `interp_mode` must be list.
+            If set to False, the type of `interp_mode` must be str.
+            Defaults to True.
+        interp_mode (Union[List, str]): The modes available for resizing
+            are ('nearest', 'bilinear', 'bicubic', 'area').
+        keep_ratio (bool): Whether to keep the aspect ratio when resizing
+            the image. Now we only support keep_ratio=False.
+            Defaults to False.
+    """
+
+    def __init__(self,
+                 random_size_range: Tuple[int, int],
+                 interval: int = 1,
+                 size_divisor: int = 32,
+                 random_interp=True,
+                 interp_mode: Union[List[str], str] = [
+                     'nearest', 'bilinear', 'bicubic', 'area'
+                 ],
+                 keep_ratio: bool = False) -> None:
+        super().__init__(random_size_range, interval, size_divisor)
+        self.random_interp = random_interp
+        self.keep_ratio = keep_ratio
+        # TODO: need to support keep_ratio==True
+        assert not self.keep_ratio, 'We do not yet support keep_ratio=True'
+
+        if self.random_interp:
+            assert isinstance(interp_mode, list) and len(interp_mode) > 1,\
+                'While random_interp==True, the type of `interp_mode`' \
+                ' must be list and len(interp_mode) must large than 1'
+            self.interp_mode_list = interp_mode
+            self.interp_mode = None
+        else:
+            assert isinstance(interp_mode, str),\
+                'While random_interp==False, the type of ' \
+                '`interp_mode` must be str'
+            assert interp_mode in ['nearest', 'bilinear', 'bicubic', 'area']
+            self.interp_mode_list = None
+            self.interp_mode = interp_mode
+
+    def forward(self, inputs: list,
+                data_samples: dict) -> Tuple[Tensor, Tensor]:
+        """Resize a batch of images and bboxes to shape ``self._input_size``.
+
+        The inputs and data_samples should be list, and
+        ``PPYOLOEBatchRandomResize`` must be used with
+        ``PPYOLOEDetDataPreprocessor`` and ``yolov5_collate`` with
+        ``use_ms_training == True``.
+        """
+        assert isinstance(inputs, list),\
+            'The type of inputs must be list. The possible reason for this ' \
+            'is that you are not using it with `PPYOLOEDetDataPreprocessor` ' \
+            'and `yolov5_collate` with use_ms_training == True.'
+
+        bboxes_labels = data_samples['bboxes_labels']
+
+        message_hub = MessageHub.get_current_instance()
+        if (message_hub.get_info('iter') + 1) % self._interval == 0:
+            # get current input size
+            self._input_size, interp_mode = self._get_random_size_and_interp()
+            if self.random_interp:
+                self.interp_mode = interp_mode
+
+        # TODO: need to support type(inputs)==Tensor
+        if isinstance(inputs, list):
+            outputs = []
+            for i in range(len(inputs)):
+                _batch_input = inputs[i]
+                h, w = _batch_input.shape[-2:]
+                scale_y = self._input_size[0] / h
+                scale_x = self._input_size[1] / w
+                if scale_x != 1. or scale_y != 1.:
+                    if self.interp_mode in ('nearest', 'area'):
+                        align_corners = None
+                    else:
+                        align_corners = False
+                    _batch_input = F.interpolate(
+                        _batch_input.unsqueeze(0),
+                        size=self._input_size,
+                        mode=self.interp_mode,
+                        align_corners=align_corners)
+
+                    # rescale boxes
+                    indexes = bboxes_labels[:, 0] == i
+                    bboxes_labels[indexes, 2] *= scale_x
+                    bboxes_labels[indexes, 3] *= scale_y
+                    bboxes_labels[indexes, 4] *= scale_x
+                    bboxes_labels[indexes, 5] *= scale_y
+
+                    data_samples['bboxes_labels'] = bboxes_labels
+                else:
+                    _batch_input = _batch_input.unsqueeze(0)
+
+                outputs.append(_batch_input)
+
+            # convert to Tensor
+            return torch.cat(outputs, dim=0), data_samples
+        else:
+            raise NotImplementedError('Not implemented yet!')
+
+    def _get_random_size_and_interp(self) -> Tuple[int, int]:
+        """Randomly generate a shape in ``_random_size_range`` and a
+        interp_mode in interp_mode_list."""
+        size = random.randint(*self._random_size_range)
+        input_size = (self._size_divisor * size, self._size_divisor * size)
+
+        if self.random_interp:
+            interp_ind = random.randint(0, len(self.interp_mode_list) - 1)
+            interp_mode = self.interp_mode_list[interp_ind]
+        else:
+            interp_mode = None
+        return input_size, interp_mode
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/models/dense_heads/__init__.py b/mmdetection_practice/third_party/mmyolo/mmyolo/models/dense_heads/__init__.py
new file mode 100644
index 0000000..90587c3
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/models/dense_heads/__init__.py
@@ -0,0 +1,23 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from .ppyoloe_head import PPYOLOEHead, PPYOLOEHeadModule
+from .rtmdet_head import RTMDetHead, RTMDetSepBNHeadModule
+from .rtmdet_ins_head import RTMDetInsSepBNHead, RTMDetInsSepBNHeadModule
+from .rtmdet_rotated_head import (RTMDetRotatedHead,
+                                  RTMDetRotatedSepBNHeadModule)
+from .yolov5_head import YOLOv5Head, YOLOv5HeadModule
+from .yolov5_ins_head import YOLOv5InsHead, YOLOv5InsHeadModule
+from .yolov6_head import YOLOv6Head, YOLOv6HeadModule
+from .yolov7_head import YOLOv7Head, YOLOv7HeadModule, YOLOv7p6HeadModule
+from .yolov8_head import YOLOv8Head, YOLOv8HeadModule
+from .yolox_head import YOLOXHead, YOLOXHeadModule
+from .yolox_pose_head import YOLOXPoseHead, YOLOXPoseHeadModule
+
+__all__ = [
+    'YOLOv5Head', 'YOLOv6Head', 'YOLOXHead', 'YOLOv5HeadModule',
+    'YOLOv6HeadModule', 'YOLOXHeadModule', 'RTMDetHead',
+    'RTMDetSepBNHeadModule', 'YOLOv7Head', 'PPYOLOEHead', 'PPYOLOEHeadModule',
+    'YOLOv7HeadModule', 'YOLOv7p6HeadModule', 'YOLOv8Head', 'YOLOv8HeadModule',
+    'RTMDetRotatedHead', 'RTMDetRotatedSepBNHeadModule', 'RTMDetInsSepBNHead',
+    'RTMDetInsSepBNHeadModule', 'YOLOv5InsHead', 'YOLOv5InsHeadModule',
+    'YOLOXPoseHead', 'YOLOXPoseHeadModule'
+]
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/models/dense_heads/ppyoloe_head.py b/mmdetection_practice/third_party/mmyolo/mmyolo/models/dense_heads/ppyoloe_head.py
new file mode 100644
index 0000000..f468987
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/models/dense_heads/ppyoloe_head.py
@@ -0,0 +1,374 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from typing import Sequence, Tuple, Union
+
+import torch
+import torch.nn as nn
+import torch.nn.functional as F
+from mmdet.models.utils import multi_apply
+from mmdet.utils import (ConfigType, OptConfigType, OptInstanceList,
+                         OptMultiConfig, reduce_mean)
+from mmengine import MessageHub
+from mmengine.model import BaseModule, bias_init_with_prob
+from mmengine.structures import InstanceData
+from torch import Tensor
+
+from mmyolo.registry import MODELS
+from ..layers.yolo_bricks import PPYOLOESELayer
+from ..utils import gt_instances_preprocess
+from .yolov6_head import YOLOv6Head
+
+
+@MODELS.register_module()
+class PPYOLOEHeadModule(BaseModule):
+    """PPYOLOEHead head module used in `PPYOLOE.
+
+    <https://arxiv.org/abs/2203.16250>`_.
+
+    Args:
+        num_classes (int): Number of categories excluding the background
+            category.
+        in_channels (int): Number of channels in the input feature map.
+        widen_factor (float): Width multiplier, multiply number of
+            channels in each layer by this amount. Defaults to 1.0.
+        num_base_priors (int): The number of priors (points) at a point
+            on the feature grid.
+        featmap_strides (Sequence[int]): Downsample factor of each feature map.
+             Defaults to (8, 16, 32).
+        reg_max (int): Max value of integral set :math: ``{0, ..., reg_max}``
+            in QFL setting. Defaults to 16.
+        norm_cfg (dict): Config dict for normalization layer.
+            Defaults to dict(type='BN', momentum=0.03, eps=0.001).
+        act_cfg (dict): Config dict for activation layer.
+            Defaults to dict(type='SiLU', inplace=True).
+        init_cfg (dict or list[dict], optional): Initialization config dict.
+            Defaults to None.
+    """
+
+    def __init__(self,
+                 num_classes: int,
+                 in_channels: Union[int, Sequence],
+                 widen_factor: float = 1.0,
+                 num_base_priors: int = 1,
+                 featmap_strides: Sequence[int] = (8, 16, 32),
+                 reg_max: int = 16,
+                 norm_cfg: ConfigType = dict(
+                     type='BN', momentum=0.1, eps=1e-5),
+                 act_cfg: ConfigType = dict(type='SiLU', inplace=True),
+                 init_cfg: OptMultiConfig = None):
+        super().__init__(init_cfg=init_cfg)
+
+        self.num_classes = num_classes
+        self.featmap_strides = featmap_strides
+        self.num_levels = len(self.featmap_strides)
+        self.num_base_priors = num_base_priors
+        self.norm_cfg = norm_cfg
+        self.act_cfg = act_cfg
+        self.reg_max = reg_max
+
+        if isinstance(in_channels, int):
+            self.in_channels = [int(in_channels * widen_factor)
+                                ] * self.num_levels
+        else:
+            self.in_channels = [int(i * widen_factor) for i in in_channels]
+
+        self._init_layers()
+
+    def init_weights(self, prior_prob=0.01):
+        """Initialize the weight and bias of PPYOLOE head."""
+        super().init_weights()
+        for conv in self.cls_preds:
+            conv.bias.data.fill_(bias_init_with_prob(prior_prob))
+            conv.weight.data.fill_(0.)
+
+        for conv in self.reg_preds:
+            conv.bias.data.fill_(1.0)
+            conv.weight.data.fill_(0.)
+
+    def _init_layers(self):
+        """initialize conv layers in PPYOLOE head."""
+        self.cls_preds = nn.ModuleList()
+        self.reg_preds = nn.ModuleList()
+        self.cls_stems = nn.ModuleList()
+        self.reg_stems = nn.ModuleList()
+
+        for in_channel in self.in_channels:
+            self.cls_stems.append(
+                PPYOLOESELayer(
+                    in_channel, norm_cfg=self.norm_cfg, act_cfg=self.act_cfg))
+            self.reg_stems.append(
+                PPYOLOESELayer(
+                    in_channel, norm_cfg=self.norm_cfg, act_cfg=self.act_cfg))
+
+        for in_channel in self.in_channels:
+            self.cls_preds.append(
+                nn.Conv2d(in_channel, self.num_classes, 3, padding=1))
+            self.reg_preds.append(
+                nn.Conv2d(in_channel, 4 * (self.reg_max + 1), 3, padding=1))
+
+        # init proj
+        proj = torch.arange(self.reg_max + 1, dtype=torch.float)
+        self.register_buffer('proj', proj, persistent=False)
+
+    def forward(self, x: Tuple[Tensor]) -> Tensor:
+        """Forward features from the upstream network.
+
+        Args:
+            x (Tuple[Tensor]): Features from the upstream network, each is
+                a 4D-tensor.
+        Returns:
+            Tuple[List]: A tuple of multi-level classification scores, bbox
+            predictions.
+        """
+        assert len(x) == self.num_levels
+
+        return multi_apply(self.forward_single, x, self.cls_stems,
+                           self.cls_preds, self.reg_stems, self.reg_preds)
+
+    def forward_single(self, x: Tensor, cls_stem: nn.ModuleList,
+                       cls_pred: nn.ModuleList, reg_stem: nn.ModuleList,
+                       reg_pred: nn.ModuleList) -> Tensor:
+        """Forward feature of a single scale level."""
+        b, _, h, w = x.shape
+        avg_feat = F.adaptive_avg_pool2d(x, (1, 1))
+        cls_logit = cls_pred(cls_stem(x, avg_feat) + x)
+        bbox_dist_preds = reg_pred(reg_stem(x, avg_feat))
+        if self.reg_max > 1:
+            bbox_dist_preds = bbox_dist_preds.reshape(
+                [-1, 4, self.reg_max + 1, h * w]).permute(0, 3, 1, 2)
+            bbox_preds = bbox_dist_preds.softmax(3).matmul(
+                self.proj.view([-1, 1])).squeeze(-1)
+            bbox_preds = bbox_preds.transpose(1, 2).reshape(b, -1, h, w)
+        else:
+            bbox_preds = bbox_dist_preds
+        if self.training:
+            return cls_logit, bbox_preds, bbox_dist_preds
+        else:
+            return cls_logit, bbox_preds
+
+
+@MODELS.register_module()
+class PPYOLOEHead(YOLOv6Head):
+    """PPYOLOEHead head used in `PPYOLOE <https://arxiv.org/abs/2203.16250>`_.
+    The YOLOv6 head and the PPYOLOE head are only slightly different.
+    Distribution focal loss is extra used in PPYOLOE, but not in YOLOv6.
+
+    Args:
+        head_module(ConfigType): Base module used for YOLOv5Head
+        prior_generator(dict): Points generator feature maps in
+            2D points-based detectors.
+        bbox_coder (:obj:`ConfigDict` or dict): Config of bbox coder.
+        loss_cls (:obj:`ConfigDict` or dict): Config of classification loss.
+        loss_bbox (:obj:`ConfigDict` or dict): Config of localization loss.
+        loss_dfl (:obj:`ConfigDict` or dict): Config of distribution focal
+            loss.
+        train_cfg (:obj:`ConfigDict` or dict, optional): Training config of
+            anchor head. Defaults to None.
+        test_cfg (:obj:`ConfigDict` or dict, optional): Testing config of
+            anchor head. Defaults to None.
+        init_cfg (:obj:`ConfigDict` or list[:obj:`ConfigDict`] or dict or
+            list[dict], optional): Initialization config dict.
+            Defaults to None.
+    """
+
+    def __init__(self,
+                 head_module: ConfigType,
+                 prior_generator: ConfigType = dict(
+                     type='mmdet.MlvlPointGenerator',
+                     offset=0.5,
+                     strides=[8, 16, 32]),
+                 bbox_coder: ConfigType = dict(type='DistancePointBBoxCoder'),
+                 loss_cls: ConfigType = dict(
+                     type='mmdet.VarifocalLoss',
+                     use_sigmoid=True,
+                     alpha=0.75,
+                     gamma=2.0,
+                     iou_weighted=True,
+                     reduction='sum',
+                     loss_weight=1.0),
+                 loss_bbox: ConfigType = dict(
+                     type='IoULoss',
+                     iou_mode='giou',
+                     bbox_format='xyxy',
+                     reduction='mean',
+                     loss_weight=2.5,
+                     return_iou=False),
+                 loss_dfl: ConfigType = dict(
+                     type='mmdet.DistributionFocalLoss',
+                     reduction='mean',
+                     loss_weight=0.5 / 4),
+                 train_cfg: OptConfigType = None,
+                 test_cfg: OptConfigType = None,
+                 init_cfg: OptMultiConfig = None):
+        super().__init__(
+            head_module=head_module,
+            prior_generator=prior_generator,
+            bbox_coder=bbox_coder,
+            loss_cls=loss_cls,
+            loss_bbox=loss_bbox,
+            train_cfg=train_cfg,
+            test_cfg=test_cfg,
+            init_cfg=init_cfg)
+        self.loss_dfl = MODELS.build(loss_dfl)
+        # ppyoloe doesn't need loss_obj
+        self.loss_obj = None
+
+    def loss_by_feat(
+            self,
+            cls_scores: Sequence[Tensor],
+            bbox_preds: Sequence[Tensor],
+            bbox_dist_preds: Sequence[Tensor],
+            batch_gt_instances: Sequence[InstanceData],
+            batch_img_metas: Sequence[dict],
+            batch_gt_instances_ignore: OptInstanceList = None) -> dict:
+        """Calculate the loss based on the features extracted by the detection
+        head.
+
+        Args:
+            cls_scores (Sequence[Tensor]): Box scores for each scale level,
+                each is a 4D-tensor, the channel number is
+                num_priors * num_classes.
+            bbox_preds (Sequence[Tensor]): Box energies / deltas for each scale
+                level, each is a 4D-tensor, the channel number is
+                num_priors * 4.
+            bbox_dist_preds (Sequence[Tensor]): Box distribution logits for
+                each scale level with shape (bs, reg_max + 1, H*W, 4).
+            batch_gt_instances (list[:obj:`InstanceData`]): Batch of
+                gt_instance. It usually includes ``bboxes`` and ``labels``
+                attributes.
+            batch_img_metas (list[dict]): Meta information of each image, e.g.,
+                image size, scaling factor, etc.
+            batch_gt_instances_ignore (list[:obj:`InstanceData`], optional):
+                Batch of gt_instances_ignore. It includes ``bboxes`` attribute
+                data that is ignored during training and testing.
+                Defaults to None.
+        Returns:
+            dict[str, Tensor]: A dictionary of losses.
+        """
+
+        # get epoch information from message hub
+        message_hub = MessageHub.get_current_instance()
+        current_epoch = message_hub.get_info('epoch')
+
+        num_imgs = len(batch_img_metas)
+
+        current_featmap_sizes = [
+            cls_score.shape[2:] for cls_score in cls_scores
+        ]
+        # If the shape does not equal, generate new one
+        if current_featmap_sizes != self.featmap_sizes_train:
+            self.featmap_sizes_train = current_featmap_sizes
+
+            mlvl_priors_with_stride = self.prior_generator.grid_priors(
+                self.featmap_sizes_train,
+                dtype=cls_scores[0].dtype,
+                device=cls_scores[0].device,
+                with_stride=True)
+
+            self.num_level_priors = [len(n) for n in mlvl_priors_with_stride]
+            self.flatten_priors_train = torch.cat(
+                mlvl_priors_with_stride, dim=0)
+            self.stride_tensor = self.flatten_priors_train[..., [2]]
+
+        # gt info
+        gt_info = gt_instances_preprocess(batch_gt_instances, num_imgs)
+        gt_labels = gt_info[:, :, :1]
+        gt_bboxes = gt_info[:, :, 1:]  # xyxy
+        pad_bbox_flag = (gt_bboxes.sum(-1, keepdim=True) > 0).float()
+
+        # pred info
+        flatten_cls_preds = [
+            cls_pred.permute(0, 2, 3, 1).reshape(num_imgs, -1,
+                                                 self.num_classes)
+            for cls_pred in cls_scores
+        ]
+        flatten_pred_bboxes = [
+            bbox_pred.permute(0, 2, 3, 1).reshape(num_imgs, -1, 4)
+            for bbox_pred in bbox_preds
+        ]
+        # (bs, reg_max+1, n, 4) -> (bs, n, 4, reg_max+1)
+        flatten_pred_dists = [
+            bbox_pred_org.permute(0, 2, 3, 1).reshape(
+                num_imgs, -1, (self.head_module.reg_max + 1) * 4)
+            for bbox_pred_org in bbox_dist_preds
+        ]
+
+        flatten_dist_preds = torch.cat(flatten_pred_dists, dim=1)
+        flatten_cls_preds = torch.cat(flatten_cls_preds, dim=1)
+        flatten_pred_bboxes = torch.cat(flatten_pred_bboxes, dim=1)
+        flatten_pred_bboxes = self.bbox_coder.decode(
+            self.flatten_priors_train[..., :2], flatten_pred_bboxes,
+            self.stride_tensor[..., 0])
+        pred_scores = torch.sigmoid(flatten_cls_preds)
+
+        if current_epoch < self.initial_epoch:
+            assigned_result = self.initial_assigner(
+                flatten_pred_bboxes.detach(), self.flatten_priors_train,
+                self.num_level_priors, gt_labels, gt_bboxes, pad_bbox_flag)
+        else:
+            assigned_result = self.assigner(flatten_pred_bboxes.detach(),
+                                            pred_scores.detach(),
+                                            self.flatten_priors_train,
+                                            gt_labels, gt_bboxes,
+                                            pad_bbox_flag)
+
+        assigned_bboxes = assigned_result['assigned_bboxes']
+        assigned_scores = assigned_result['assigned_scores']
+        fg_mask_pre_prior = assigned_result['fg_mask_pre_prior']
+
+        # cls loss
+        with torch.cuda.amp.autocast(enabled=False):
+            loss_cls = self.loss_cls(flatten_cls_preds, assigned_scores)
+
+        # rescale bbox
+        assigned_bboxes /= self.stride_tensor
+        flatten_pred_bboxes /= self.stride_tensor
+
+        assigned_scores_sum = assigned_scores.sum()
+        # reduce_mean between all gpus
+        assigned_scores_sum = torch.clamp(
+            reduce_mean(assigned_scores_sum), min=1)
+        loss_cls /= assigned_scores_sum
+
+        # select positive samples mask
+        num_pos = fg_mask_pre_prior.sum()
+        if num_pos > 0:
+            # when num_pos > 0, assigned_scores_sum will >0, so the loss_bbox
+            # will not report an error
+            # iou loss
+            prior_bbox_mask = fg_mask_pre_prior.unsqueeze(-1).repeat([1, 1, 4])
+            pred_bboxes_pos = torch.masked_select(
+                flatten_pred_bboxes, prior_bbox_mask).reshape([-1, 4])
+            assigned_bboxes_pos = torch.masked_select(
+                assigned_bboxes, prior_bbox_mask).reshape([-1, 4])
+            bbox_weight = torch.masked_select(
+                assigned_scores.sum(-1), fg_mask_pre_prior).unsqueeze(-1)
+            loss_bbox = self.loss_bbox(
+                pred_bboxes_pos,
+                assigned_bboxes_pos,
+                weight=bbox_weight,
+                avg_factor=assigned_scores_sum)
+
+            # dfl loss
+            dist_mask = fg_mask_pre_prior.unsqueeze(-1).repeat(
+                [1, 1, (self.head_module.reg_max + 1) * 4])
+
+            pred_dist_pos = torch.masked_select(
+                flatten_dist_preds,
+                dist_mask).reshape([-1, 4, self.head_module.reg_max + 1])
+            assigned_ltrb = self.bbox_coder.encode(
+                self.flatten_priors_train[..., :2] / self.stride_tensor,
+                assigned_bboxes,
+                max_dis=self.head_module.reg_max,
+                eps=0.01)
+            assigned_ltrb_pos = torch.masked_select(
+                assigned_ltrb, prior_bbox_mask).reshape([-1, 4])
+            loss_dfl = self.loss_dfl(
+                pred_dist_pos.reshape(-1, self.head_module.reg_max + 1),
+                assigned_ltrb_pos.reshape(-1),
+                weight=bbox_weight.expand(-1, 4).reshape(-1),
+                avg_factor=assigned_scores_sum)
+        else:
+            loss_bbox = flatten_pred_bboxes.sum() * 0
+            loss_dfl = flatten_pred_bboxes.sum() * 0
+
+        return dict(loss_cls=loss_cls, loss_bbox=loss_bbox, loss_dfl=loss_dfl)
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/models/dense_heads/rtmdet_head.py b/mmdetection_practice/third_party/mmyolo/mmyolo/models/dense_heads/rtmdet_head.py
new file mode 100644
index 0000000..54245a9
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/models/dense_heads/rtmdet_head.py
@@ -0,0 +1,368 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from typing import List, Sequence, Tuple
+
+import torch
+import torch.nn as nn
+from mmcv.cnn import ConvModule, is_norm
+from mmdet.models.task_modules.samplers import PseudoSampler
+from mmdet.structures.bbox import distance2bbox
+from mmdet.utils import (ConfigType, InstanceList, OptConfigType,
+                         OptInstanceList, OptMultiConfig, reduce_mean)
+from mmengine.model import (BaseModule, bias_init_with_prob, constant_init,
+                            normal_init)
+from torch import Tensor
+
+from mmyolo.registry import MODELS, TASK_UTILS
+from ..utils import gt_instances_preprocess
+from .yolov5_head import YOLOv5Head
+
+
+@MODELS.register_module()
+class RTMDetSepBNHeadModule(BaseModule):
+    """Detection Head of RTMDet.
+
+    Args:
+        num_classes (int): Number of categories excluding the background
+            category.
+        in_channels (int): Number of channels in the input feature map.
+        widen_factor (float): Width multiplier, multiply number of
+            channels in each layer by this amount. Defaults to 1.0.
+        num_base_priors (int): The number of priors (points) at a point
+            on the feature grid.  Defaults to 1.
+        feat_channels (int): Number of hidden channels. Used in child classes.
+            Defaults to 256
+        stacked_convs (int): Number of stacking convs of the head.
+            Defaults to 2.
+        featmap_strides (Sequence[int]): Downsample factor of each feature map.
+             Defaults to (8, 16, 32).
+        share_conv (bool): Whether to share conv layers between stages.
+            Defaults to True.
+        pred_kernel_size (int): Kernel size of ``nn.Conv2d``. Defaults to 1.
+        conv_cfg (:obj:`ConfigDict` or dict, optional): Config dict for
+            convolution layer. Defaults to None.
+        norm_cfg (:obj:`ConfigDict` or dict): Config dict for normalization
+            layer. Defaults to ``dict(type='BN')``.
+        act_cfg (:obj:`ConfigDict` or dict): Config dict for activation layer.
+            Default: dict(type='SiLU', inplace=True).
+        init_cfg (:obj:`ConfigDict` or list[:obj:`ConfigDict`] or dict or
+            list[dict], optional): Initialization config dict.
+            Defaults to None.
+    """
+
+    def __init__(
+        self,
+        num_classes: int,
+        in_channels: int,
+        widen_factor: float = 1.0,
+        num_base_priors: int = 1,
+        feat_channels: int = 256,
+        stacked_convs: int = 2,
+        featmap_strides: Sequence[int] = [8, 16, 32],
+        share_conv: bool = True,
+        pred_kernel_size: int = 1,
+        conv_cfg: OptConfigType = None,
+        norm_cfg: ConfigType = dict(type='BN'),
+        act_cfg: ConfigType = dict(type='SiLU', inplace=True),
+        init_cfg: OptMultiConfig = None,
+    ):
+        super().__init__(init_cfg=init_cfg)
+        self.share_conv = share_conv
+        self.num_classes = num_classes
+        self.pred_kernel_size = pred_kernel_size
+        self.feat_channels = int(feat_channels * widen_factor)
+        self.stacked_convs = stacked_convs
+        self.num_base_priors = num_base_priors
+
+        self.conv_cfg = conv_cfg
+        self.norm_cfg = norm_cfg
+        self.act_cfg = act_cfg
+        self.featmap_strides = featmap_strides
+
+        self.in_channels = int(in_channels * widen_factor)
+
+        self._init_layers()
+
+    def _init_layers(self):
+        """Initialize layers of the head."""
+        self.cls_convs = nn.ModuleList()
+        self.reg_convs = nn.ModuleList()
+
+        self.rtm_cls = nn.ModuleList()
+        self.rtm_reg = nn.ModuleList()
+        for n in range(len(self.featmap_strides)):
+            cls_convs = nn.ModuleList()
+            reg_convs = nn.ModuleList()
+            for i in range(self.stacked_convs):
+                chn = self.in_channels if i == 0 else self.feat_channels
+                cls_convs.append(
+                    ConvModule(
+                        chn,
+                        self.feat_channels,
+                        3,
+                        stride=1,
+                        padding=1,
+                        conv_cfg=self.conv_cfg,
+                        norm_cfg=self.norm_cfg,
+                        act_cfg=self.act_cfg))
+                reg_convs.append(
+                    ConvModule(
+                        chn,
+                        self.feat_channels,
+                        3,
+                        stride=1,
+                        padding=1,
+                        conv_cfg=self.conv_cfg,
+                        norm_cfg=self.norm_cfg,
+                        act_cfg=self.act_cfg))
+            self.cls_convs.append(cls_convs)
+            self.reg_convs.append(reg_convs)
+
+            self.rtm_cls.append(
+                nn.Conv2d(
+                    self.feat_channels,
+                    self.num_base_priors * self.num_classes,
+                    self.pred_kernel_size,
+                    padding=self.pred_kernel_size // 2))
+            self.rtm_reg.append(
+                nn.Conv2d(
+                    self.feat_channels,
+                    self.num_base_priors * 4,
+                    self.pred_kernel_size,
+                    padding=self.pred_kernel_size // 2))
+
+        if self.share_conv:
+            for n in range(len(self.featmap_strides)):
+                for i in range(self.stacked_convs):
+                    self.cls_convs[n][i].conv = self.cls_convs[0][i].conv
+                    self.reg_convs[n][i].conv = self.reg_convs[0][i].conv
+
+    def init_weights(self) -> None:
+        """Initialize weights of the head."""
+        # Use prior in model initialization to improve stability
+        super().init_weights()
+        for m in self.modules():
+            if isinstance(m, nn.Conv2d):
+                normal_init(m, mean=0, std=0.01)
+            if is_norm(m):
+                constant_init(m, 1)
+        bias_cls = bias_init_with_prob(0.01)
+        for rtm_cls, rtm_reg in zip(self.rtm_cls, self.rtm_reg):
+            normal_init(rtm_cls, std=0.01, bias=bias_cls)
+            normal_init(rtm_reg, std=0.01)
+
+    def forward(self, feats: Tuple[Tensor, ...]) -> tuple:
+        """Forward features from the upstream network.
+
+        Args:
+            feats (tuple[Tensor]): Features from the upstream network, each is
+                a 4D-tensor.
+
+        Returns:
+            tuple: Usually a tuple of classification scores and bbox prediction
+            - cls_scores (list[Tensor]): Classification scores for all scale
+              levels, each is a 4D-tensor, the channels number is
+              num_base_priors * num_classes.
+            - bbox_preds (list[Tensor]): Box energies / deltas for all scale
+              levels, each is a 4D-tensor, the channels number is
+              num_base_priors * 4.
+        """
+
+        cls_scores = []
+        bbox_preds = []
+        for idx, x in enumerate(feats):
+            cls_feat = x
+            reg_feat = x
+
+            for cls_layer in self.cls_convs[idx]:
+                cls_feat = cls_layer(cls_feat)
+            cls_score = self.rtm_cls[idx](cls_feat)
+
+            for reg_layer in self.reg_convs[idx]:
+                reg_feat = reg_layer(reg_feat)
+
+            reg_dist = self.rtm_reg[idx](reg_feat)
+            cls_scores.append(cls_score)
+            bbox_preds.append(reg_dist)
+        return tuple(cls_scores), tuple(bbox_preds)
+
+
+@MODELS.register_module()
+class RTMDetHead(YOLOv5Head):
+    """RTMDet head.
+
+    Args:
+        head_module(ConfigType): Base module used for RTMDetHead
+        prior_generator: Points generator feature maps in
+            2D points-based detectors.
+        bbox_coder (:obj:`ConfigDict` or dict): Config of bbox coder.
+        loss_cls (:obj:`ConfigDict` or dict): Config of classification loss.
+        loss_bbox (:obj:`ConfigDict` or dict): Config of localization loss.
+        train_cfg (:obj:`ConfigDict` or dict, optional): Training config of
+            anchor head. Defaults to None.
+        test_cfg (:obj:`ConfigDict` or dict, optional): Testing config of
+            anchor head. Defaults to None.
+        init_cfg (:obj:`ConfigDict` or list[:obj:`ConfigDict`] or dict or
+            list[dict], optional): Initialization config dict.
+            Defaults to None.
+    """
+
+    def __init__(self,
+                 head_module: ConfigType,
+                 prior_generator: ConfigType = dict(
+                     type='mmdet.MlvlPointGenerator',
+                     offset=0,
+                     strides=[8, 16, 32]),
+                 bbox_coder: ConfigType = dict(type='DistancePointBBoxCoder'),
+                 loss_cls: ConfigType = dict(
+                     type='mmdet.QualityFocalLoss',
+                     use_sigmoid=True,
+                     beta=2.0,
+                     loss_weight=1.0),
+                 loss_bbox: ConfigType = dict(
+                     type='mmdet.GIoULoss', loss_weight=2.0),
+                 train_cfg: OptConfigType = None,
+                 test_cfg: OptConfigType = None,
+                 init_cfg: OptMultiConfig = None):
+
+        super().__init__(
+            head_module=head_module,
+            prior_generator=prior_generator,
+            bbox_coder=bbox_coder,
+            loss_cls=loss_cls,
+            loss_bbox=loss_bbox,
+            train_cfg=train_cfg,
+            test_cfg=test_cfg,
+            init_cfg=init_cfg)
+
+        self.use_sigmoid_cls = loss_cls.get('use_sigmoid', False)
+        if self.use_sigmoid_cls:
+            self.cls_out_channels = self.num_classes
+        else:
+            self.cls_out_channels = self.num_classes + 1
+        # rtmdet doesn't need loss_obj
+        self.loss_obj = None
+
+    def special_init(self):
+        """Since YOLO series algorithms will inherit from YOLOv5Head, but
+        different algorithms have special initialization process.
+
+        The special_init function is designed to deal with this situation.
+        """
+        if self.train_cfg:
+            self.assigner = TASK_UTILS.build(self.train_cfg.assigner)
+            if self.train_cfg.get('sampler', None) is not None:
+                self.sampler = TASK_UTILS.build(
+                    self.train_cfg.sampler, default_args=dict(context=self))
+            else:
+                self.sampler = PseudoSampler(context=self)
+
+            self.featmap_sizes_train = None
+            self.flatten_priors_train = None
+
+    def forward(self, x: Tuple[Tensor]) -> Tuple[List]:
+        """Forward features from the upstream network.
+
+        Args:
+            x (Tuple[Tensor]): Features from the upstream network, each is
+                a 4D-tensor.
+        Returns:
+            Tuple[List]: A tuple of multi-level classification scores, bbox
+            predictions, and objectnesses.
+        """
+        return self.head_module(x)
+
+    def loss_by_feat(
+            self,
+            cls_scores: List[Tensor],
+            bbox_preds: List[Tensor],
+            batch_gt_instances: InstanceList,
+            batch_img_metas: List[dict],
+            batch_gt_instances_ignore: OptInstanceList = None) -> dict:
+        """Compute losses of the head.
+
+        Args:
+            cls_scores (list[Tensor]): Box scores for each scale level
+                Has shape (N, num_anchors * num_classes, H, W)
+            bbox_preds (list[Tensor]): Decoded box for each scale
+                level with shape (N, num_anchors * 4, H, W) in
+                [tl_x, tl_y, br_x, br_y] format.
+            batch_gt_instances (list[:obj:`InstanceData`]): Batch of
+                gt_instance.  It usually includes ``bboxes`` and ``labels``
+                attributes.
+            batch_img_metas (list[dict]): Meta information of each image, e.g.,
+                image size, scaling factor, etc.
+            batch_gt_instances_ignore (list[:obj:`InstanceData`], Optional):
+                Batch of gt_instances_ignore. It includes ``bboxes`` attribute
+                data that is ignored during training and testing.
+                Defaults to None.
+
+        Returns:
+            dict[str, Tensor]: A dictionary of loss components.
+        """
+        num_imgs = len(batch_img_metas)
+        featmap_sizes = [featmap.size()[-2:] for featmap in cls_scores]
+        assert len(featmap_sizes) == self.prior_generator.num_levels
+
+        gt_info = gt_instances_preprocess(batch_gt_instances, num_imgs)
+        gt_labels = gt_info[:, :, :1]
+        gt_bboxes = gt_info[:, :, 1:]  # xyxy
+        pad_bbox_flag = (gt_bboxes.sum(-1, keepdim=True) > 0).float()
+
+        device = cls_scores[0].device
+
+        # If the shape does not equal, generate new one
+        if featmap_sizes != self.featmap_sizes_train:
+            self.featmap_sizes_train = featmap_sizes
+            mlvl_priors_with_stride = self.prior_generator.grid_priors(
+                featmap_sizes, device=device, with_stride=True)
+            self.flatten_priors_train = torch.cat(
+                mlvl_priors_with_stride, dim=0)
+
+        flatten_cls_scores = torch.cat([
+            cls_score.permute(0, 2, 3, 1).reshape(num_imgs, -1,
+                                                  self.cls_out_channels)
+            for cls_score in cls_scores
+        ], 1).contiguous()
+
+        flatten_bboxes = torch.cat([
+            bbox_pred.permute(0, 2, 3, 1).reshape(num_imgs, -1, 4)
+            for bbox_pred in bbox_preds
+        ], 1)
+        flatten_bboxes = flatten_bboxes * self.flatten_priors_train[..., -1,
+                                                                    None]
+        flatten_bboxes = distance2bbox(self.flatten_priors_train[..., :2],
+                                       flatten_bboxes)
+
+        assigned_result = self.assigner(flatten_bboxes.detach(),
+                                        flatten_cls_scores.detach(),
+                                        self.flatten_priors_train, gt_labels,
+                                        gt_bboxes, pad_bbox_flag)
+
+        labels = assigned_result['assigned_labels'].reshape(-1)
+        label_weights = assigned_result['assigned_labels_weights'].reshape(-1)
+        bbox_targets = assigned_result['assigned_bboxes'].reshape(-1, 4)
+        assign_metrics = assigned_result['assign_metrics'].reshape(-1)
+        cls_preds = flatten_cls_scores.reshape(-1, self.num_classes)
+        bbox_preds = flatten_bboxes.reshape(-1, 4)
+
+        # FG cat_id: [0, num_classes -1], BG cat_id: num_classes
+        bg_class_ind = self.num_classes
+        pos_inds = ((labels >= 0)
+                    & (labels < bg_class_ind)).nonzero().squeeze(1)
+        avg_factor = reduce_mean(assign_metrics.sum()).clamp_(min=1).item()
+
+        loss_cls = self.loss_cls(
+            cls_preds, (labels, assign_metrics),
+            label_weights,
+            avg_factor=avg_factor)
+
+        if len(pos_inds) > 0:
+            loss_bbox = self.loss_bbox(
+                bbox_preds[pos_inds],
+                bbox_targets[pos_inds],
+                weight=assign_metrics[pos_inds],
+                avg_factor=avg_factor)
+        else:
+            loss_bbox = bbox_preds.sum() * 0
+
+        return dict(loss_cls=loss_cls, loss_bbox=loss_bbox)
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/models/dense_heads/rtmdet_ins_head.py b/mmdetection_practice/third_party/mmyolo/mmyolo/models/dense_heads/rtmdet_ins_head.py
new file mode 100644
index 0000000..1d0562a
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/models/dense_heads/rtmdet_ins_head.py
@@ -0,0 +1,725 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+import copy
+from typing import List, Optional, Tuple
+
+import numpy as np
+import torch
+import torch.nn as nn
+import torch.nn.functional as F
+from mmcv.cnn import ConvModule, is_norm
+from mmcv.ops import batched_nms
+from mmdet.models.utils import filter_scores_and_topk
+from mmdet.structures.bbox import get_box_tensor, get_box_wh, scale_boxes
+from mmdet.utils import (ConfigType, InstanceList, OptConfigType,
+                         OptInstanceList, OptMultiConfig)
+from mmengine import ConfigDict
+from mmengine.model import (BaseModule, bias_init_with_prob, constant_init,
+                            normal_init)
+from mmengine.structures import InstanceData
+from torch import Tensor
+
+from mmyolo.registry import MODELS
+from .rtmdet_head import RTMDetHead, RTMDetSepBNHeadModule
+
+
+class MaskFeatModule(BaseModule):
+    """Mask feature head used in RTMDet-Ins. Copy from mmdet.
+
+    Args:
+        in_channels (int): Number of channels in the input feature map.
+        feat_channels (int): Number of hidden channels of the mask feature
+             map branch.
+        stacked_convs (int): Number of convs in mask feature branch.
+        num_levels (int): The starting feature map level from RPN that
+             will be used to predict the mask feature map.
+        num_prototypes (int): Number of output channel of the mask feature
+             map branch. This is the channel count of the mask
+             feature map that to be dynamically convolved with the predicted
+             kernel.
+        act_cfg (:obj:`ConfigDict` or dict): Config dict for activation layer.
+            Default: dict(type='ReLU', inplace=True)
+        norm_cfg (dict): Config dict for normalization layer. Default: None.
+    """
+
+    def __init__(
+        self,
+        in_channels: int,
+        feat_channels: int = 256,
+        stacked_convs: int = 4,
+        num_levels: int = 3,
+        num_prototypes: int = 8,
+        act_cfg: ConfigType = dict(type='ReLU', inplace=True),
+        norm_cfg: ConfigType = dict(type='BN')
+    ) -> None:
+        super().__init__(init_cfg=None)
+        self.num_levels = num_levels
+        self.fusion_conv = nn.Conv2d(num_levels * in_channels, in_channels, 1)
+        convs = []
+        for i in range(stacked_convs):
+            in_c = in_channels if i == 0 else feat_channels
+            convs.append(
+                ConvModule(
+                    in_c,
+                    feat_channels,
+                    3,
+                    padding=1,
+                    act_cfg=act_cfg,
+                    norm_cfg=norm_cfg))
+        self.stacked_convs = nn.Sequential(*convs)
+        self.projection = nn.Conv2d(
+            feat_channels, num_prototypes, kernel_size=1)
+
+    def forward(self, features: Tuple[Tensor, ...]) -> Tensor:
+        # multi-level feature fusion
+        fusion_feats = [features[0]]
+        size = features[0].shape[-2:]
+        for i in range(1, self.num_levels):
+            f = F.interpolate(features[i], size=size, mode='bilinear')
+            fusion_feats.append(f)
+        fusion_feats = torch.cat(fusion_feats, dim=1)
+        fusion_feats = self.fusion_conv(fusion_feats)
+        # pred mask feats
+        mask_features = self.stacked_convs(fusion_feats)
+        mask_features = self.projection(mask_features)
+        return mask_features
+
+
+@MODELS.register_module()
+class RTMDetInsSepBNHeadModule(RTMDetSepBNHeadModule):
+    """Detection and Instance Segmentation Head of RTMDet.
+
+    Args:
+        num_classes (int): Number of categories excluding the background
+            category.
+        num_prototypes (int): Number of mask prototype features extracted
+            from the mask head. Defaults to 8.
+        dyconv_channels (int): Channel of the dynamic conv layers.
+            Defaults to 8.
+        num_dyconvs (int): Number of the dynamic convolution layers.
+            Defaults to 3.
+        use_sigmoid_cls (bool): Use sigmoid for class prediction.
+            Defaults to True.
+    """
+
+    def __init__(self,
+                 num_classes: int,
+                 *args,
+                 num_prototypes: int = 8,
+                 dyconv_channels: int = 8,
+                 num_dyconvs: int = 3,
+                 use_sigmoid_cls: bool = True,
+                 **kwargs):
+        self.num_prototypes = num_prototypes
+        self.num_dyconvs = num_dyconvs
+        self.dyconv_channels = dyconv_channels
+        self.use_sigmoid_cls = use_sigmoid_cls
+        if self.use_sigmoid_cls:
+            self.cls_out_channels = num_classes
+        else:
+            self.cls_out_channels = num_classes + 1
+        super().__init__(num_classes=num_classes, *args, **kwargs)
+
+    def _init_layers(self):
+        """Initialize layers of the head."""
+        self.cls_convs = nn.ModuleList()
+        self.reg_convs = nn.ModuleList()
+        self.kernel_convs = nn.ModuleList()
+
+        self.rtm_cls = nn.ModuleList()
+        self.rtm_reg = nn.ModuleList()
+        self.rtm_kernel = nn.ModuleList()
+        self.rtm_obj = nn.ModuleList()
+
+        # calculate num dynamic parameters
+        weight_nums, bias_nums = [], []
+        for i in range(self.num_dyconvs):
+            if i == 0:
+                weight_nums.append(
+                    (self.num_prototypes + 2) * self.dyconv_channels)
+                bias_nums.append(self.dyconv_channels)
+            elif i == self.num_dyconvs - 1:
+                weight_nums.append(self.dyconv_channels)
+                bias_nums.append(1)
+            else:
+                weight_nums.append(self.dyconv_channels * self.dyconv_channels)
+                bias_nums.append(self.dyconv_channels)
+        self.weight_nums = weight_nums
+        self.bias_nums = bias_nums
+        self.num_gen_params = sum(weight_nums) + sum(bias_nums)
+        pred_pad_size = self.pred_kernel_size // 2
+
+        for n in range(len(self.featmap_strides)):
+            cls_convs = nn.ModuleList()
+            reg_convs = nn.ModuleList()
+            kernel_convs = nn.ModuleList()
+            for i in range(self.stacked_convs):
+                chn = self.in_channels if i == 0 else self.feat_channels
+                cls_convs.append(
+                    ConvModule(
+                        chn,
+                        self.feat_channels,
+                        3,
+                        stride=1,
+                        padding=1,
+                        conv_cfg=self.conv_cfg,
+                        norm_cfg=self.norm_cfg,
+                        act_cfg=self.act_cfg))
+                reg_convs.append(
+                    ConvModule(
+                        chn,
+                        self.feat_channels,
+                        3,
+                        stride=1,
+                        padding=1,
+                        conv_cfg=self.conv_cfg,
+                        norm_cfg=self.norm_cfg,
+                        act_cfg=self.act_cfg))
+                kernel_convs.append(
+                    ConvModule(
+                        chn,
+                        self.feat_channels,
+                        3,
+                        stride=1,
+                        padding=1,
+                        conv_cfg=self.conv_cfg,
+                        norm_cfg=self.norm_cfg,
+                        act_cfg=self.act_cfg))
+            self.cls_convs.append(cls_convs)
+            self.reg_convs.append(cls_convs)
+            self.kernel_convs.append(kernel_convs)
+
+            self.rtm_cls.append(
+                nn.Conv2d(
+                    self.feat_channels,
+                    self.num_base_priors * self.cls_out_channels,
+                    self.pred_kernel_size,
+                    padding=pred_pad_size))
+            self.rtm_reg.append(
+                nn.Conv2d(
+                    self.feat_channels,
+                    self.num_base_priors * 4,
+                    self.pred_kernel_size,
+                    padding=pred_pad_size))
+            self.rtm_kernel.append(
+                nn.Conv2d(
+                    self.feat_channels,
+                    self.num_gen_params,
+                    self.pred_kernel_size,
+                    padding=pred_pad_size))
+
+        if self.share_conv:
+            for n in range(len(self.featmap_strides)):
+                for i in range(self.stacked_convs):
+                    self.cls_convs[n][i].conv = self.cls_convs[0][i].conv
+                    self.reg_convs[n][i].conv = self.reg_convs[0][i].conv
+
+        self.mask_head = MaskFeatModule(
+            in_channels=self.in_channels,
+            feat_channels=self.feat_channels,
+            stacked_convs=4,
+            num_levels=len(self.featmap_strides),
+            num_prototypes=self.num_prototypes,
+            act_cfg=self.act_cfg,
+            norm_cfg=self.norm_cfg)
+
+    def init_weights(self) -> None:
+        """Initialize weights of the head."""
+        for m in self.modules():
+            if isinstance(m, nn.Conv2d):
+                normal_init(m, mean=0, std=0.01)
+            if is_norm(m):
+                constant_init(m, 1)
+        bias_cls = bias_init_with_prob(0.01)
+        for rtm_cls, rtm_reg, rtm_kernel in zip(self.rtm_cls, self.rtm_reg,
+                                                self.rtm_kernel):
+            normal_init(rtm_cls, std=0.01, bias=bias_cls)
+            normal_init(rtm_reg, std=0.01, bias=1)
+
+    def forward(self, feats: Tuple[Tensor, ...]) -> tuple:
+        """Forward features from the upstream network.
+
+        Args:
+            feats (tuple[Tensor]): Features from the upstream network, each is
+                a 4D-tensor.
+
+        Returns:
+            tuple: Usually a tuple of classification scores and bbox prediction
+            - cls_scores (list[Tensor]): Classification scores for all scale
+              levels, each is a 4D-tensor, the channels number is
+              num_base_priors * num_classes.
+            - bbox_preds (list[Tensor]): Box energies / deltas for all scale
+              levels, each is a 4D-tensor, the channels number is
+              num_base_priors * 4.
+            - kernel_preds (list[Tensor]): Dynamic conv kernels for all scale
+              levels, each is a 4D-tensor, the channels number is
+              num_gen_params.
+            - mask_feat (Tensor): Mask prototype features.
+                Has shape (batch_size, num_prototypes, H, W).
+        """
+        mask_feat = self.mask_head(feats)
+
+        cls_scores = []
+        bbox_preds = []
+        kernel_preds = []
+        for idx, (x, stride) in enumerate(zip(feats, self.featmap_strides)):
+            cls_feat = x
+            reg_feat = x
+            kernel_feat = x
+
+            for cls_layer in self.cls_convs[idx]:
+                cls_feat = cls_layer(cls_feat)
+            cls_score = self.rtm_cls[idx](cls_feat)
+
+            for kernel_layer in self.kernel_convs[idx]:
+                kernel_feat = kernel_layer(kernel_feat)
+            kernel_pred = self.rtm_kernel[idx](kernel_feat)
+
+            for reg_layer in self.reg_convs[idx]:
+                reg_feat = reg_layer(reg_feat)
+            reg_dist = self.rtm_reg[idx](reg_feat)
+
+            cls_scores.append(cls_score)
+            bbox_preds.append(reg_dist)
+            kernel_preds.append(kernel_pred)
+        return tuple(cls_scores), tuple(bbox_preds), tuple(
+            kernel_preds), mask_feat
+
+
+@MODELS.register_module()
+class RTMDetInsSepBNHead(RTMDetHead):
+    """RTMDet Instance Segmentation head.
+
+    Args:
+        head_module(ConfigType): Base module used for RTMDetInsSepBNHead
+        prior_generator: Points generator feature maps in
+            2D points-based detectors.
+        bbox_coder (:obj:`ConfigDict` or dict): Config of bbox coder.
+        loss_cls (:obj:`ConfigDict` or dict): Config of classification loss.
+        loss_bbox (:obj:`ConfigDict` or dict): Config of localization loss.
+        loss_mask (:obj:`ConfigDict` or dict): Config of mask loss.
+        train_cfg (:obj:`ConfigDict` or dict, optional): Training config of
+            anchor head. Defaults to None.
+        test_cfg (:obj:`ConfigDict` or dict, optional): Testing config of
+            anchor head. Defaults to None.
+        init_cfg (:obj:`ConfigDict` or list[:obj:`ConfigDict`] or dict or
+            list[dict], optional): Initialization config dict.
+            Defaults to None.
+    """
+
+    def __init__(self,
+                 head_module: ConfigType,
+                 prior_generator: ConfigType = dict(
+                     type='mmdet.MlvlPointGenerator',
+                     offset=0,
+                     strides=[8, 16, 32]),
+                 bbox_coder: ConfigType = dict(type='DistancePointBBoxCoder'),
+                 loss_cls: ConfigType = dict(
+                     type='mmdet.QualityFocalLoss',
+                     use_sigmoid=True,
+                     beta=2.0,
+                     loss_weight=1.0),
+                 loss_bbox: ConfigType = dict(
+                     type='mmdet.GIoULoss', loss_weight=2.0),
+                 loss_mask=dict(
+                     type='mmdet.DiceLoss',
+                     loss_weight=2.0,
+                     eps=5e-6,
+                     reduction='mean'),
+                 train_cfg: OptConfigType = None,
+                 test_cfg: OptConfigType = None,
+                 init_cfg: OptMultiConfig = None):
+
+        super().__init__(
+            head_module=head_module,
+            prior_generator=prior_generator,
+            bbox_coder=bbox_coder,
+            loss_cls=loss_cls,
+            loss_bbox=loss_bbox,
+            train_cfg=train_cfg,
+            test_cfg=test_cfg,
+            init_cfg=init_cfg)
+
+        self.use_sigmoid_cls = loss_cls.get('use_sigmoid', False)
+        if isinstance(self.head_module, RTMDetInsSepBNHeadModule):
+            assert self.use_sigmoid_cls == self.head_module.use_sigmoid_cls
+        self.loss_mask = MODELS.build(loss_mask)
+
+    def predict_by_feat(self,
+                        cls_scores: List[Tensor],
+                        bbox_preds: List[Tensor],
+                        kernel_preds: List[Tensor],
+                        mask_feats: Tensor,
+                        score_factors: Optional[List[Tensor]] = None,
+                        batch_img_metas: Optional[List[dict]] = None,
+                        cfg: Optional[ConfigDict] = None,
+                        rescale: bool = True,
+                        with_nms: bool = True) -> List[InstanceData]:
+        """Transform a batch of output features extracted from the head into
+        bbox results.
+
+        Note: When score_factors is not None, the cls_scores are
+        usually multiplied by it then obtain the real score used in NMS.
+
+        Args:
+            cls_scores (list[Tensor]): Classification scores for all
+                scale levels, each is a 4D-tensor, has shape
+                (batch_size, num_priors * num_classes, H, W).
+            bbox_preds (list[Tensor]): Box energies / deltas for all
+                scale levels, each is a 4D-tensor, has shape
+                (batch_size, num_priors * 4, H, W).
+            kernel_preds (list[Tensor]): Kernel predictions of dynamic
+                convs for all scale levels, each is a 4D-tensor, has shape
+                (batch_size, num_params, H, W).
+            mask_feats (Tensor): Mask prototype features extracted from the
+                mask head, has shape (batch_size, num_prototypes, H, W).
+            score_factors (list[Tensor], optional): Score factor for
+                all scale level, each is a 4D-tensor, has shape
+                (batch_size, num_priors * 1, H, W). Defaults to None.
+            batch_img_metas (list[dict], Optional): Batch image meta info.
+                Defaults to None.
+            cfg (ConfigDict, optional): Test / postprocessing
+                configuration, if None, test_cfg would be used.
+                Defaults to None.
+            rescale (bool): If True, return boxes in original image space.
+                Defaults to False.
+            with_nms (bool): If True, do nms before return boxes.
+                Defaults to True.
+
+        Returns:
+            list[:obj:`InstanceData`]: Object detection and instance
+            segmentation results of each image after the post process.
+            Each item usually contains following keys.
+
+                - scores (Tensor): Classification scores, has a shape
+                  (num_instance, )
+                - labels (Tensor): Labels of bboxes, has a shape
+                  (num_instances, ).
+                - bboxes (Tensor): Has a shape (num_instances, 4),
+                  the last dimension 4 arrange as (x1, y1, x2, y2).
+                - masks (Tensor): Has a shape (num_instances, h, w).
+        """
+        cfg = self.test_cfg if cfg is None else cfg
+        cfg = copy.deepcopy(cfg)
+
+        multi_label = cfg.multi_label
+        multi_label &= self.num_classes > 1
+        cfg.multi_label = multi_label
+
+        num_imgs = len(batch_img_metas)
+        featmap_sizes = [cls_score.shape[2:] for cls_score in cls_scores]
+
+        # If the shape does not change, use the previous mlvl_priors
+        if featmap_sizes != self.featmap_sizes:
+            self.mlvl_priors = self.prior_generator.grid_priors(
+                featmap_sizes,
+                dtype=cls_scores[0].dtype,
+                device=cls_scores[0].device,
+                with_stride=True)
+            self.featmap_sizes = featmap_sizes
+        flatten_priors = torch.cat(self.mlvl_priors)
+
+        mlvl_strides = [
+            flatten_priors.new_full(
+                (featmap_size.numel() * self.num_base_priors, ), stride) for
+            featmap_size, stride in zip(featmap_sizes, self.featmap_strides)
+        ]
+        flatten_stride = torch.cat(mlvl_strides)
+
+        # flatten cls_scores, bbox_preds
+        flatten_cls_scores = [
+            cls_score.permute(0, 2, 3, 1).reshape(num_imgs, -1,
+                                                  self.num_classes)
+            for cls_score in cls_scores
+        ]
+        flatten_bbox_preds = [
+            bbox_pred.permute(0, 2, 3, 1).reshape(num_imgs, -1, 4)
+            for bbox_pred in bbox_preds
+        ]
+        flatten_kernel_preds = [
+            kernel_pred.permute(0, 2, 3,
+                                1).reshape(num_imgs, -1,
+                                           self.head_module.num_gen_params)
+            for kernel_pred in kernel_preds
+        ]
+
+        flatten_cls_scores = torch.cat(flatten_cls_scores, dim=1).sigmoid()
+        flatten_bbox_preds = torch.cat(flatten_bbox_preds, dim=1)
+        flatten_decoded_bboxes = self.bbox_coder.decode(
+            flatten_priors[..., :2].unsqueeze(0), flatten_bbox_preds,
+            flatten_stride)
+
+        flatten_kernel_preds = torch.cat(flatten_kernel_preds, dim=1)
+
+        results_list = []
+        for (bboxes, scores, kernel_pred, mask_feat,
+             img_meta) in zip(flatten_decoded_bboxes, flatten_cls_scores,
+                              flatten_kernel_preds, mask_feats,
+                              batch_img_metas):
+            ori_shape = img_meta['ori_shape']
+            scale_factor = img_meta['scale_factor']
+            if 'pad_param' in img_meta:
+                pad_param = img_meta['pad_param']
+            else:
+                pad_param = None
+
+            score_thr = cfg.get('score_thr', -1)
+            if scores.shape[0] == 0:
+                empty_results = InstanceData()
+                empty_results.bboxes = bboxes
+                empty_results.scores = scores[:, 0]
+                empty_results.labels = scores[:, 0].int()
+                h, w = ori_shape[:2] if rescale else img_meta['img_shape'][:2]
+                empty_results.masks = torch.zeros(
+                    size=(0, h, w), dtype=torch.bool, device=bboxes.device)
+                results_list.append(empty_results)
+                continue
+
+            nms_pre = cfg.get('nms_pre', 100000)
+            if cfg.multi_label is False:
+                scores, labels = scores.max(1, keepdim=True)
+                scores, _, keep_idxs, results = filter_scores_and_topk(
+                    scores,
+                    score_thr,
+                    nms_pre,
+                    results=dict(
+                        labels=labels[:, 0],
+                        kernel_pred=kernel_pred,
+                        priors=flatten_priors))
+                labels = results['labels']
+                kernel_pred = results['kernel_pred']
+                priors = results['priors']
+            else:
+                out = filter_scores_and_topk(
+                    scores,
+                    score_thr,
+                    nms_pre,
+                    results=dict(
+                        kernel_pred=kernel_pred, priors=flatten_priors))
+                scores, labels, keep_idxs, filtered_results = out
+                kernel_pred = filtered_results['kernel_pred']
+                priors = filtered_results['priors']
+
+            results = InstanceData(
+                scores=scores,
+                labels=labels,
+                bboxes=bboxes[keep_idxs],
+                kernels=kernel_pred,
+                priors=priors)
+
+            if rescale:
+                if pad_param is not None:
+                    results.bboxes -= results.bboxes.new_tensor([
+                        pad_param[2], pad_param[0], pad_param[2], pad_param[0]
+                    ])
+                results.bboxes /= results.bboxes.new_tensor(
+                    scale_factor).repeat((1, 2))
+
+            if cfg.get('yolox_style', False):
+                # do not need max_per_img
+                cfg.max_per_img = len(results)
+
+            results = self._bbox_mask_post_process(
+                results=results,
+                mask_feat=mask_feat,
+                cfg=cfg,
+                rescale_bbox=False,
+                rescale_mask=rescale,
+                with_nms=with_nms,
+                pad_param=pad_param,
+                img_meta=img_meta)
+            results.bboxes[:, 0::2].clamp_(0, ori_shape[1])
+            results.bboxes[:, 1::2].clamp_(0, ori_shape[0])
+
+            results_list.append(results)
+        return results_list
+
+    def _bbox_mask_post_process(
+            self,
+            results: InstanceData,
+            mask_feat: Tensor,
+            cfg: ConfigDict,
+            rescale_bbox: bool = False,
+            rescale_mask: bool = True,
+            with_nms: bool = True,
+            pad_param: Optional[np.ndarray] = None,
+            img_meta: Optional[dict] = None) -> InstanceData:
+        """bbox and mask post-processing method.
+
+        The boxes would be rescaled to the original image scale and do
+        the nms operation. Usually `with_nms` is False is used for aug test.
+
+        Args:
+            results (:obj:`InstaceData`): Detection instance results,
+                each item has shape (num_bboxes, ).
+            mask_feat (Tensor): Mask prototype features extracted from the
+                mask head, has shape (batch_size, num_prototypes, H, W).
+            cfg (ConfigDict): Test / postprocessing configuration,
+                if None, test_cfg would be used.
+            rescale_bbox (bool): If True, return boxes in original image space.
+                Default to False.
+            rescale_mask (bool): If True, return masks in original image space.
+                Default to True.
+            with_nms (bool): If True, do nms before return boxes.
+                Default to True.
+            img_meta (dict, optional): Image meta info. Defaults to None.
+
+        Returns:
+            :obj:`InstanceData`: Detection results of each image
+            after the post process.
+            Each item usually contains following keys.
+
+                - scores (Tensor): Classification scores, has a shape
+                  (num_instance, )
+                - labels (Tensor): Labels of bboxes, has a shape
+                  (num_instances, ).
+                - bboxes (Tensor): Has a shape (num_instances, 4),
+                  the last dimension 4 arrange as (x1, y1, x2, y2).
+                - masks (Tensor): Has a shape (num_instances, h, w).
+        """
+        if rescale_bbox:
+            assert img_meta.get('scale_factor') is not None
+            scale_factor = [1 / s for s in img_meta['scale_factor']]
+            results.bboxes = scale_boxes(results.bboxes, scale_factor)
+
+        if hasattr(results, 'score_factors'):
+            # TODO: Add sqrt operation in order to be consistent with
+            #  the paper.
+            score_factors = results.pop('score_factors')
+            results.scores = results.scores * score_factors
+
+        # filter small size bboxes
+        if cfg.get('min_bbox_size', -1) >= 0:
+            w, h = get_box_wh(results.bboxes)
+            valid_mask = (w > cfg.min_bbox_size) & (h > cfg.min_bbox_size)
+            if not valid_mask.all():
+                results = results[valid_mask]
+
+        # TODO: deal with `with_nms` and `nms_cfg=None` in test_cfg
+        assert with_nms, 'with_nms must be True for RTMDet-Ins'
+        if results.bboxes.numel() > 0:
+            bboxes = get_box_tensor(results.bboxes)
+            det_bboxes, keep_idxs = batched_nms(bboxes, results.scores,
+                                                results.labels, cfg.nms)
+            results = results[keep_idxs]
+            # some nms would reweight the score, such as softnms
+            results.scores = det_bboxes[:, -1]
+            results = results[:cfg.max_per_img]
+
+            # process masks
+            mask_logits = self._mask_predict_by_feat(mask_feat,
+                                                     results.kernels,
+                                                     results.priors)
+
+            stride = self.prior_generator.strides[0][0]
+            mask_logits = F.interpolate(
+                mask_logits.unsqueeze(0), scale_factor=stride, mode='bilinear')
+            if rescale_mask:
+                # TODO: When use mmdet.Resize or mmdet.Pad, will meet bug
+                # Use img_meta to crop and resize
+                ori_h, ori_w = img_meta['ori_shape'][:2]
+                if isinstance(pad_param, np.ndarray):
+                    pad_param = pad_param.astype(np.int32)
+                    crop_y1, crop_y2 = pad_param[
+                        0], mask_logits.shape[-2] - pad_param[1]
+                    crop_x1, crop_x2 = pad_param[
+                        2], mask_logits.shape[-1] - pad_param[3]
+                    mask_logits = mask_logits[..., crop_y1:crop_y2,
+                                              crop_x1:crop_x2]
+                mask_logits = F.interpolate(
+                    mask_logits,
+                    size=[ori_h, ori_w],
+                    mode='bilinear',
+                    align_corners=False)
+
+            masks = mask_logits.sigmoid().squeeze(0)
+            masks = masks > cfg.mask_thr_binary
+            results.masks = masks
+        else:
+            h, w = img_meta['ori_shape'][:2] if rescale_mask else img_meta[
+                'img_shape'][:2]
+            results.masks = torch.zeros(
+                size=(results.bboxes.shape[0], h, w),
+                dtype=torch.bool,
+                device=results.bboxes.device)
+        return results
+
+    def _mask_predict_by_feat(self, mask_feat: Tensor, kernels: Tensor,
+                              priors: Tensor) -> Tensor:
+        """Generate mask logits from mask features with dynamic convs.
+
+        Args:
+            mask_feat (Tensor): Mask prototype features.
+                Has shape (num_prototypes, H, W).
+            kernels (Tensor): Kernel parameters for each instance.
+                Has shape (num_instance, num_params)
+            priors (Tensor): Center priors for each instance.
+                Has shape (num_instance, 4).
+        Returns:
+            Tensor: Instance segmentation masks for each instance.
+                Has shape (num_instance, H, W).
+        """
+        num_inst = kernels.shape[0]
+        h, w = mask_feat.size()[-2:]
+        if num_inst < 1:
+            return torch.empty(
+                size=(num_inst, h, w),
+                dtype=mask_feat.dtype,
+                device=mask_feat.device)
+        if len(mask_feat.shape) < 4:
+            mask_feat.unsqueeze(0)
+
+        coord = self.prior_generator.single_level_grid_priors(
+            (h, w), level_idx=0, device=mask_feat.device).reshape(1, -1, 2)
+        num_inst = priors.shape[0]
+        points = priors[:, :2].reshape(-1, 1, 2)
+        strides = priors[:, 2:].reshape(-1, 1, 2)
+        relative_coord = (points - coord).permute(0, 2, 1) / (
+            strides[..., 0].reshape(-1, 1, 1) * 8)
+        relative_coord = relative_coord.reshape(num_inst, 2, h, w)
+
+        mask_feat = torch.cat(
+            [relative_coord,
+             mask_feat.repeat(num_inst, 1, 1, 1)], dim=1)
+        weights, biases = self.parse_dynamic_params(kernels)
+
+        n_layers = len(weights)
+        x = mask_feat.reshape(1, -1, h, w)
+        for i, (weight, bias) in enumerate(zip(weights, biases)):
+            x = F.conv2d(
+                x, weight, bias=bias, stride=1, padding=0, groups=num_inst)
+            if i < n_layers - 1:
+                x = F.relu(x)
+        x = x.reshape(num_inst, h, w)
+        return x
+
+    def parse_dynamic_params(self, flatten_kernels: Tensor) -> tuple:
+        """split kernel head prediction to conv weight and bias."""
+        n_inst = flatten_kernels.size(0)
+        n_layers = len(self.head_module.weight_nums)
+        params_splits = list(
+            torch.split_with_sizes(
+                flatten_kernels,
+                self.head_module.weight_nums + self.head_module.bias_nums,
+                dim=1))
+        weight_splits = params_splits[:n_layers]
+        bias_splits = params_splits[n_layers:]
+        for i in range(n_layers):
+            if i < n_layers - 1:
+                weight_splits[i] = weight_splits[i].reshape(
+                    n_inst * self.head_module.dyconv_channels, -1, 1, 1)
+                bias_splits[i] = bias_splits[i].reshape(
+                    n_inst * self.head_module.dyconv_channels)
+            else:
+                weight_splits[i] = weight_splits[i].reshape(n_inst, -1, 1, 1)
+                bias_splits[i] = bias_splits[i].reshape(n_inst)
+
+        return weight_splits, bias_splits
+
+    def loss_by_feat(
+            self,
+            cls_scores: List[Tensor],
+            bbox_preds: List[Tensor],
+            batch_gt_instances: InstanceList,
+            batch_img_metas: List[dict],
+            batch_gt_instances_ignore: OptInstanceList = None) -> dict:
+        raise NotImplementedError
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/models/dense_heads/rtmdet_rotated_head.py b/mmdetection_practice/third_party/mmyolo/mmyolo/models/dense_heads/rtmdet_rotated_head.py
new file mode 100644
index 0000000..1428b4f
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/models/dense_heads/rtmdet_rotated_head.py
@@ -0,0 +1,641 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+import copy
+import warnings
+from typing import List, Optional, Sequence, Tuple
+
+import torch
+import torch.nn as nn
+from mmdet.models.utils import filter_scores_and_topk
+from mmdet.structures.bbox import HorizontalBoxes, distance2bbox
+from mmdet.structures.bbox.transforms import bbox_cxcywh_to_xyxy, scale_boxes
+from mmdet.utils import (ConfigType, InstanceList, OptConfigType,
+                         OptInstanceList, OptMultiConfig, reduce_mean)
+from mmengine.config import ConfigDict
+from mmengine.model import normal_init
+from mmengine.structures import InstanceData
+from torch import Tensor
+
+from mmyolo.registry import MODELS, TASK_UTILS
+from ..utils import gt_instances_preprocess
+from .rtmdet_head import RTMDetHead, RTMDetSepBNHeadModule
+
+try:
+    from mmrotate.structures.bbox import RotatedBoxes, distance2obb
+    MMROTATE_AVAILABLE = True
+except ImportError:
+    RotatedBoxes = None
+    distance2obb = None
+    MMROTATE_AVAILABLE = False
+
+
+@MODELS.register_module()
+class RTMDetRotatedSepBNHeadModule(RTMDetSepBNHeadModule):
+    """Detection Head Module of RTMDet-R.
+
+    Compared with RTMDet Detection Head Module, RTMDet-R adds
+    a conv for angle prediction.
+    An `angle_out_dim` arg is added, which is generated by the
+    angle_coder module and controls the angle pred dim.
+
+    Args:
+        num_classes (int): Number of categories excluding the background
+            category.
+        in_channels (int): Number of channels in the input feature map.
+        widen_factor (float): Width multiplier, multiply number of
+            channels in each layer by this amount. Defaults to 1.0.
+        num_base_priors (int): The number of priors (points) at a point
+            on the feature grid.  Defaults to 1.
+        feat_channels (int): Number of hidden channels. Used in child classes.
+            Defaults to 256
+        stacked_convs (int): Number of stacking convs of the head.
+            Defaults to 2.
+        featmap_strides (Sequence[int]): Downsample factor of each feature map.
+             Defaults to (8, 16, 32).
+        share_conv (bool): Whether to share conv layers between stages.
+            Defaults to True.
+        pred_kernel_size (int): Kernel size of ``nn.Conv2d``. Defaults to 1.
+        angle_out_dim (int): Encoded length of angle, will passed by head.
+            Defaults to 1.
+        conv_cfg (:obj:`ConfigDict` or dict, optional): Config dict for
+            convolution layer. Defaults to None.
+        norm_cfg (:obj:`ConfigDict` or dict): Config dict for normalization
+            layer. Defaults to ``dict(type='BN')``.
+        act_cfg (:obj:`ConfigDict` or dict): Config dict for activation layer.
+            Default: dict(type='SiLU', inplace=True).
+        init_cfg (:obj:`ConfigDict` or list[:obj:`ConfigDict`] or dict or
+            list[dict], optional): Initialization config dict.
+            Defaults to None.
+    """
+
+    def __init__(
+        self,
+        num_classes: int,
+        in_channels: int,
+        widen_factor: float = 1.0,
+        num_base_priors: int = 1,
+        feat_channels: int = 256,
+        stacked_convs: int = 2,
+        featmap_strides: Sequence[int] = [8, 16, 32],
+        share_conv: bool = True,
+        pred_kernel_size: int = 1,
+        angle_out_dim: int = 1,
+        conv_cfg: OptConfigType = None,
+        norm_cfg: ConfigType = dict(type='BN'),
+        act_cfg: ConfigType = dict(type='SiLU', inplace=True),
+        init_cfg: OptMultiConfig = None,
+    ):
+        self.angle_out_dim = angle_out_dim
+        super().__init__(
+            num_classes=num_classes,
+            in_channels=in_channels,
+            widen_factor=widen_factor,
+            num_base_priors=num_base_priors,
+            feat_channels=feat_channels,
+            stacked_convs=stacked_convs,
+            featmap_strides=featmap_strides,
+            share_conv=share_conv,
+            pred_kernel_size=pred_kernel_size,
+            conv_cfg=conv_cfg,
+            norm_cfg=norm_cfg,
+            act_cfg=act_cfg,
+            init_cfg=init_cfg)
+
+    def _init_layers(self):
+        """Initialize layers of the head."""
+        super()._init_layers()
+        self.rtm_ang = nn.ModuleList()
+        for _ in range(len(self.featmap_strides)):
+            self.rtm_ang.append(
+                nn.Conv2d(
+                    self.feat_channels,
+                    self.num_base_priors * self.angle_out_dim,
+                    self.pred_kernel_size,
+                    padding=self.pred_kernel_size // 2))
+
+    def init_weights(self) -> None:
+        """Initialize weights of the head."""
+        # Use prior in model initialization to improve stability
+        super().init_weights()
+        for rtm_ang in self.rtm_ang:
+            normal_init(rtm_ang, std=0.01)
+
+    def forward(self, feats: Tuple[Tensor, ...]) -> tuple:
+        """Forward features from the upstream network.
+
+        Args:
+            feats (tuple[Tensor]): Features from the upstream network, each is
+                a 4D-tensor.
+
+        Returns:
+            tuple: Usually a tuple of classification scores and bbox prediction
+            - cls_scores (list[Tensor]): Classification scores for all scale
+              levels, each is a 4D-tensor, the channels number is
+              num_base_priors * num_classes.
+            - bbox_preds (list[Tensor]): Box energies / deltas for all scale
+              levels, each is a 4D-tensor, the channels number is
+              num_base_priors * 4.
+            - angle_preds (list[Tensor]): Angle prediction for all scale
+              levels, each is a 4D-tensor, the channels number is
+              num_base_priors * angle_out_dim.
+        """
+
+        cls_scores = []
+        bbox_preds = []
+        angle_preds = []
+        for idx, x in enumerate(feats):
+            cls_feat = x
+            reg_feat = x
+
+            for cls_layer in self.cls_convs[idx]:
+                cls_feat = cls_layer(cls_feat)
+            cls_score = self.rtm_cls[idx](cls_feat)
+
+            for reg_layer in self.reg_convs[idx]:
+                reg_feat = reg_layer(reg_feat)
+
+            reg_dist = self.rtm_reg[idx](reg_feat)
+            angle_pred = self.rtm_ang[idx](reg_feat)
+
+            cls_scores.append(cls_score)
+            bbox_preds.append(reg_dist)
+            angle_preds.append(angle_pred)
+        return tuple(cls_scores), tuple(bbox_preds), tuple(angle_preds)
+
+
+@MODELS.register_module()
+class RTMDetRotatedHead(RTMDetHead):
+    """RTMDet-R head.
+
+    Compared with RTMDetHead, RTMDetRotatedHead add some args to support
+    rotated object detection.
+
+    - `angle_version` used to limit angle_range during training.
+    - `angle_coder` used to encode and decode angle, which is similar
+      to bbox_coder.
+    - `use_hbbox_loss` and `loss_angle` allow custom regression loss
+      calculation for rotated box.
+
+      There are three combination options for regression:
+
+      1. `use_hbbox_loss=False` and loss_angle is None.
+
+      .. code:: text
+
+        bbox_pred────(tblr)───┐
+                              ▼
+        angle_pred          decode──►rbox_pred──(xywha)─►loss_bbox
+            │                 ▲
+            └────►decode──(a)─┘
+
+      2. `use_hbbox_loss=False` and loss_angle is specified.
+         A angle loss is added on angle_pred.
+
+      .. code:: text
+
+        bbox_pred────(tblr)───┐
+                              ▼
+        angle_pred          decode──►rbox_pred──(xywha)─►loss_bbox
+            │                 ▲
+            ├────►decode──(a)─┘
+            │
+            └───────────────────────────────────────────►loss_angle
+
+      3. `use_hbbox_loss=True` and loss_angle is specified.
+         In this case the loss_angle must be set.
+
+      .. code:: text
+
+        bbox_pred──(tblr)──►decode──►hbox_pred──(xyxy)──►loss_bbox
+
+        angle_pred──────────────────────────────────────►loss_angle
+
+    - There's a `decoded_with_angle` flag in test_cfg, which is similar
+      to training process.
+
+      When `decoded_with_angle=True`:
+
+      .. code:: text
+
+        bbox_pred────(tblr)───┐
+                              ▼
+        angle_pred          decode──(xywha)──►rbox_pred
+            │                 ▲
+            └────►decode──(a)─┘
+
+      When `decoded_with_angle=False`:
+
+      .. code:: text
+
+        bbox_pred──(tblr)─►decode
+                              │ (xyxy)
+                              ▼
+                           format───(xywh)──►concat──(xywha)──►rbox_pred
+                                               ▲
+        angle_pred────────►decode────(a)───────┘
+
+    Args:
+        head_module(ConfigType): Base module used for RTMDetRotatedHead.
+        prior_generator: Points generator feature maps in
+            2D points-based detectors.
+        bbox_coder (:obj:`ConfigDict` or dict): Config of bbox coder.
+        loss_cls (:obj:`ConfigDict` or dict): Config of classification loss.
+        loss_bbox (:obj:`ConfigDict` or dict): Config of localization loss.
+        angle_version (str): Angle representations. Defaults to 'le90'.
+        use_hbbox_loss (bool): If true, use horizontal bbox loss and
+            loss_angle should not be None. Default to False.
+        angle_coder (:obj:`ConfigDict` or dict): Config of angle coder.
+        loss_angle (:obj:`ConfigDict` or dict, optional): Config of angle loss.
+        train_cfg (:obj:`ConfigDict` or dict, optional): Training config of
+            anchor head. Defaults to None.
+        test_cfg (:obj:`ConfigDict` or dict, optional): Testing config of
+            anchor head. Defaults to None.
+        init_cfg (:obj:`ConfigDict` or list[:obj:`ConfigDict`] or dict or
+            list[dict], optional): Initialization config dict.
+            Defaults to None.
+    """
+
+    def __init__(
+            self,
+            head_module: ConfigType,
+            prior_generator: ConfigType = dict(
+                type='mmdet.MlvlPointGenerator', strides=[8, 16, 32],
+                offset=0),
+            bbox_coder: ConfigType = dict(type='DistanceAnglePointCoder'),
+            loss_cls: ConfigType = dict(
+                type='mmdet.QualityFocalLoss',
+                use_sigmoid=True,
+                beta=2.0,
+                loss_weight=1.0),
+            loss_bbox: ConfigType = dict(
+                type='mmrotate.RotatedIoULoss', mode='linear',
+                loss_weight=2.0),
+            angle_version: str = 'le90',
+            use_hbbox_loss: bool = False,
+            angle_coder: ConfigType = dict(type='mmrotate.PseudoAngleCoder'),
+            loss_angle: OptConfigType = None,
+            train_cfg: OptConfigType = None,
+            test_cfg: OptConfigType = None,
+            init_cfg: OptMultiConfig = None):
+        if not MMROTATE_AVAILABLE:
+            raise ImportError(
+                'Please run "mim install -r requirements/mmrotate.txt" '
+                'to install mmrotate first for rotated detection.')
+
+        self.angle_version = angle_version
+        self.use_hbbox_loss = use_hbbox_loss
+        if self.use_hbbox_loss:
+            assert loss_angle is not None, \
+                ('When use hbbox loss, loss_angle needs to be specified')
+        self.angle_coder = TASK_UTILS.build(angle_coder)
+        self.angle_out_dim = self.angle_coder.encode_size
+        if head_module.get('angle_out_dim') is not None:
+            warnings.warn('angle_out_dim will be overridden by angle_coder '
+                          'and does not need to be set manually')
+
+        head_module['angle_out_dim'] = self.angle_out_dim
+        super().__init__(
+            head_module=head_module,
+            prior_generator=prior_generator,
+            bbox_coder=bbox_coder,
+            loss_cls=loss_cls,
+            loss_bbox=loss_bbox,
+            train_cfg=train_cfg,
+            test_cfg=test_cfg,
+            init_cfg=init_cfg)
+
+        if loss_angle is not None:
+            self.loss_angle = MODELS.build(loss_angle)
+        else:
+            self.loss_angle = None
+
+    def predict_by_feat(self,
+                        cls_scores: List[Tensor],
+                        bbox_preds: List[Tensor],
+                        angle_preds: List[Tensor],
+                        objectnesses: Optional[List[Tensor]] = None,
+                        batch_img_metas: Optional[List[dict]] = None,
+                        cfg: Optional[ConfigDict] = None,
+                        rescale: bool = True,
+                        with_nms: bool = True) -> List[InstanceData]:
+        """Transform a batch of output features extracted by the head into bbox
+        results.
+
+        Args:
+            cls_scores (list[Tensor]): Classification scores for all
+                scale levels, each is a 4D-tensor, has shape
+                (batch_size, num_priors * num_classes, H, W).
+            bbox_preds (list[Tensor]): Box energies / deltas for all
+                scale levels, each is a 4D-tensor, has shape
+                (batch_size, num_priors * 4, H, W).
+            angle_preds (list[Tensor]): Box angle for each scale level
+                with shape (N, num_points * angle_dim, H, W)
+            objectnesses (list[Tensor], Optional): Score factor for
+                all scale level, each is a 4D-tensor, has shape
+                (batch_size, 1, H, W).
+            batch_img_metas (list[dict], Optional): Batch image meta info.
+                Defaults to None.
+            cfg (ConfigDict, optional): Test / postprocessing
+                configuration, if None, test_cfg would be used.
+                Defaults to None.
+            rescale (bool): If True, return boxes in original image space.
+                Defaults to False.
+            with_nms (bool): If True, do nms before return boxes.
+                Defaults to True.
+
+        Returns:
+            list[:obj:`InstanceData`]: Object detection results of each image
+            after the post process. Each item usually contains following keys.
+            - scores (Tensor): Classification scores, has a shape
+              (num_instance, )
+            - labels (Tensor): Labels of bboxes, has a shape
+              (num_instances, ).
+            - bboxes (Tensor): Has a shape (num_instances, 5),
+              the last dimension 4 arrange as (x, y, w, h, angle).
+        """
+        assert len(cls_scores) == len(bbox_preds)
+        if objectnesses is None:
+            with_objectnesses = False
+        else:
+            with_objectnesses = True
+            assert len(cls_scores) == len(objectnesses)
+
+        cfg = self.test_cfg if cfg is None else cfg
+        cfg = copy.deepcopy(cfg)
+
+        multi_label = cfg.multi_label
+        multi_label &= self.num_classes > 1
+        cfg.multi_label = multi_label
+
+        # Whether to decode rbox with angle.
+        # different setting lead to different final results.
+        # Defaults to True.
+        decode_with_angle = cfg.get('decode_with_angle', True)
+
+        num_imgs = len(batch_img_metas)
+        featmap_sizes = [cls_score.shape[2:] for cls_score in cls_scores]
+
+        # If the shape does not change, use the previous mlvl_priors
+        if featmap_sizes != self.featmap_sizes:
+            self.mlvl_priors = self.prior_generator.grid_priors(
+                featmap_sizes,
+                dtype=cls_scores[0].dtype,
+                device=cls_scores[0].device)
+            self.featmap_sizes = featmap_sizes
+        flatten_priors = torch.cat(self.mlvl_priors)
+
+        mlvl_strides = [
+            flatten_priors.new_full(
+                (featmap_size.numel() * self.num_base_priors, ), stride) for
+            featmap_size, stride in zip(featmap_sizes, self.featmap_strides)
+        ]
+        flatten_stride = torch.cat(mlvl_strides)
+
+        # flatten cls_scores, bbox_preds and objectness
+        flatten_cls_scores = [
+            cls_score.permute(0, 2, 3, 1).reshape(num_imgs, -1,
+                                                  self.num_classes)
+            for cls_score in cls_scores
+        ]
+        flatten_bbox_preds = [
+            bbox_pred.permute(0, 2, 3, 1).reshape(num_imgs, -1, 4)
+            for bbox_pred in bbox_preds
+        ]
+        flatten_angle_preds = [
+            angle_pred.permute(0, 2, 3, 1).reshape(num_imgs, -1,
+                                                   self.angle_out_dim)
+            for angle_pred in angle_preds
+        ]
+
+        flatten_cls_scores = torch.cat(flatten_cls_scores, dim=1).sigmoid()
+        flatten_bbox_preds = torch.cat(flatten_bbox_preds, dim=1)
+        flatten_angle_preds = torch.cat(flatten_angle_preds, dim=1)
+        flatten_angle_preds = self.angle_coder.decode(
+            flatten_angle_preds, keepdim=True)
+
+        if decode_with_angle:
+            flatten_rbbox_preds = torch.cat(
+                [flatten_bbox_preds, flatten_angle_preds], dim=-1)
+            flatten_decoded_bboxes = self.bbox_coder.decode(
+                flatten_priors[None], flatten_rbbox_preds, flatten_stride)
+        else:
+            flatten_decoded_hbboxes = self.bbox_coder.decode(
+                flatten_priors[None], flatten_bbox_preds, flatten_stride)
+            flatten_decoded_hbboxes = HorizontalBoxes.xyxy_to_cxcywh(
+                flatten_decoded_hbboxes)
+            flatten_decoded_bboxes = torch.cat(
+                [flatten_decoded_hbboxes, flatten_angle_preds], dim=-1)
+
+        if with_objectnesses:
+            flatten_objectness = [
+                objectness.permute(0, 2, 3, 1).reshape(num_imgs, -1)
+                for objectness in objectnesses
+            ]
+            flatten_objectness = torch.cat(flatten_objectness, dim=1).sigmoid()
+        else:
+            flatten_objectness = [None for _ in range(num_imgs)]
+
+        results_list = []
+        for (bboxes, scores, objectness,
+             img_meta) in zip(flatten_decoded_bboxes, flatten_cls_scores,
+                              flatten_objectness, batch_img_metas):
+            scale_factor = img_meta['scale_factor']
+            if 'pad_param' in img_meta:
+                pad_param = img_meta['pad_param']
+            else:
+                pad_param = None
+
+            score_thr = cfg.get('score_thr', -1)
+            # yolox_style does not require the following operations
+            if objectness is not None and score_thr > 0 and not cfg.get(
+                    'yolox_style', False):
+                conf_inds = objectness > score_thr
+                bboxes = bboxes[conf_inds, :]
+                scores = scores[conf_inds, :]
+                objectness = objectness[conf_inds]
+
+            if objectness is not None:
+                # conf = obj_conf * cls_conf
+                scores *= objectness[:, None]
+
+            if scores.shape[0] == 0:
+                empty_results = InstanceData()
+                empty_results.bboxes = RotatedBoxes(bboxes)
+                empty_results.scores = scores[:, 0]
+                empty_results.labels = scores[:, 0].int()
+                results_list.append(empty_results)
+                continue
+
+            nms_pre = cfg.get('nms_pre', 100000)
+            if cfg.multi_label is False:
+                scores, labels = scores.max(1, keepdim=True)
+                scores, _, keep_idxs, results = filter_scores_and_topk(
+                    scores,
+                    score_thr,
+                    nms_pre,
+                    results=dict(labels=labels[:, 0]))
+                labels = results['labels']
+            else:
+                scores, labels, keep_idxs, _ = filter_scores_and_topk(
+                    scores, score_thr, nms_pre)
+
+            results = InstanceData(
+                scores=scores,
+                labels=labels,
+                bboxes=RotatedBoxes(bboxes[keep_idxs]))
+
+            if rescale:
+                if pad_param is not None:
+                    results.bboxes.translate_([-pad_param[2], -pad_param[0]])
+
+                scale_factor = [1 / s for s in img_meta['scale_factor']]
+                results.bboxes = scale_boxes(results.bboxes, scale_factor)
+
+            if cfg.get('yolox_style', False):
+                # do not need max_per_img
+                cfg.max_per_img = len(results)
+
+            results = self._bbox_post_process(
+                results=results,
+                cfg=cfg,
+                rescale=False,
+                with_nms=with_nms,
+                img_meta=img_meta)
+
+            results_list.append(results)
+        return results_list
+
+    def loss_by_feat(
+            self,
+            cls_scores: List[Tensor],
+            bbox_preds: List[Tensor],
+            angle_preds: List[Tensor],
+            batch_gt_instances: InstanceList,
+            batch_img_metas: List[dict],
+            batch_gt_instances_ignore: OptInstanceList = None) -> dict:
+        """Compute losses of the head.
+
+        Args:
+            cls_scores (list[Tensor]): Box scores for each scale level
+                Has shape (N, num_anchors * num_classes, H, W)
+            bbox_preds (list[Tensor]): Decoded box for each scale
+                level with shape (N, num_anchors * 4, H, W) in
+                [tl_x, tl_y, br_x, br_y] format.
+            angle_preds (list[Tensor]): Angle prediction for each scale
+                level with shape (N, num_anchors * angle_out_dim, H, W).
+            batch_gt_instances (list[:obj:`InstanceData`]): Batch of
+                gt_instance.  It usually includes ``bboxes`` and ``labels``
+                attributes.
+            batch_img_metas (list[dict]): Meta information of each image, e.g.,
+                image size, scaling factor, etc.
+            batch_gt_instances_ignore (list[:obj:`InstanceData`], Optional):
+                Batch of gt_instances_ignore. It includes ``bboxes`` attribute
+                data that is ignored during training and testing.
+                Defaults to None.
+
+        Returns:
+            dict[str, Tensor]: A dictionary of loss components.
+        """
+        num_imgs = len(batch_img_metas)
+        featmap_sizes = [featmap.size()[-2:] for featmap in cls_scores]
+        assert len(featmap_sizes) == self.prior_generator.num_levels
+
+        gt_info = gt_instances_preprocess(batch_gt_instances, num_imgs)
+        gt_labels = gt_info[:, :, :1]
+        gt_bboxes = gt_info[:, :, 1:]  # xywha
+        pad_bbox_flag = (gt_bboxes.sum(-1, keepdim=True) > 0).float()
+
+        device = cls_scores[0].device
+
+        # If the shape does not equal, generate new one
+        if featmap_sizes != self.featmap_sizes_train:
+            self.featmap_sizes_train = featmap_sizes
+            mlvl_priors_with_stride = self.prior_generator.grid_priors(
+                featmap_sizes, device=device, with_stride=True)
+            self.flatten_priors_train = torch.cat(
+                mlvl_priors_with_stride, dim=0)
+
+        flatten_cls_scores = torch.cat([
+            cls_score.permute(0, 2, 3, 1).reshape(num_imgs, -1,
+                                                  self.cls_out_channels)
+            for cls_score in cls_scores
+        ], 1).contiguous()
+
+        flatten_tblrs = torch.cat([
+            bbox_pred.permute(0, 2, 3, 1).reshape(num_imgs, -1, 4)
+            for bbox_pred in bbox_preds
+        ], 1)
+        flatten_tblrs = flatten_tblrs * self.flatten_priors_train[..., -1,
+                                                                  None]
+        flatten_angles = torch.cat([
+            angle_pred.permute(0, 2, 3, 1).reshape(
+                num_imgs, -1, self.angle_out_dim) for angle_pred in angle_preds
+        ], 1)
+        flatten_decoded_angle = self.angle_coder.decode(
+            flatten_angles, keepdim=True)
+        flatten_tblra = torch.cat([flatten_tblrs, flatten_decoded_angle],
+                                  dim=-1)
+        flatten_rbboxes = distance2obb(
+            self.flatten_priors_train[..., :2],
+            flatten_tblra,
+            angle_version=self.angle_version)
+        if self.use_hbbox_loss:
+            flatten_hbboxes = distance2bbox(self.flatten_priors_train[..., :2],
+                                            flatten_tblrs)
+
+        assigned_result = self.assigner(flatten_rbboxes.detach(),
+                                        flatten_cls_scores.detach(),
+                                        self.flatten_priors_train, gt_labels,
+                                        gt_bboxes, pad_bbox_flag)
+
+        labels = assigned_result['assigned_labels'].reshape(-1)
+        label_weights = assigned_result['assigned_labels_weights'].reshape(-1)
+        bbox_targets = assigned_result['assigned_bboxes'].reshape(-1, 5)
+        assign_metrics = assigned_result['assign_metrics'].reshape(-1)
+        cls_preds = flatten_cls_scores.reshape(-1, self.num_classes)
+
+        # FG cat_id: [0, num_classes -1], BG cat_id: num_classes
+        bg_class_ind = self.num_classes
+        pos_inds = ((labels >= 0)
+                    & (labels < bg_class_ind)).nonzero().squeeze(1)
+        avg_factor = reduce_mean(assign_metrics.sum()).clamp_(min=1).item()
+
+        loss_cls = self.loss_cls(
+            cls_preds, (labels, assign_metrics),
+            label_weights,
+            avg_factor=avg_factor)
+
+        pos_bbox_targets = bbox_targets[pos_inds]
+
+        if self.use_hbbox_loss:
+            bbox_preds = flatten_hbboxes.reshape(-1, 4)
+            pos_bbox_targets = bbox_cxcywh_to_xyxy(pos_bbox_targets[:, :4])
+        else:
+            bbox_preds = flatten_rbboxes.reshape(-1, 5)
+        angle_preds = flatten_angles.reshape(-1, self.angle_out_dim)
+
+        if len(pos_inds) > 0:
+            loss_bbox = self.loss_bbox(
+                bbox_preds[pos_inds],
+                pos_bbox_targets,
+                weight=assign_metrics[pos_inds],
+                avg_factor=avg_factor)
+            loss_angle = angle_preds.sum() * 0
+            if self.loss_angle is not None:
+                pos_angle_targets = bbox_targets[pos_inds][:, 4:5]
+                pos_angle_targets = self.angle_coder.encode(pos_angle_targets)
+                loss_angle = self.loss_angle(
+                    angle_preds[pos_inds],
+                    pos_angle_targets,
+                    weight=assign_metrics[pos_inds],
+                    avg_factor=avg_factor)
+        else:
+            loss_bbox = bbox_preds.sum() * 0
+            loss_angle = angle_preds.sum() * 0
+
+        losses = dict()
+        losses['loss_cls'] = loss_cls
+        losses['loss_bbox'] = loss_bbox
+        if self.loss_angle is not None:
+            losses['loss_angle'] = loss_angle
+
+        return losses
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/models/dense_heads/yolov5_head.py b/mmdetection_practice/third_party/mmyolo/mmyolo/models/dense_heads/yolov5_head.py
new file mode 100644
index 0000000..fb24617
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/models/dense_heads/yolov5_head.py
@@ -0,0 +1,895 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+import copy
+import math
+from typing import List, Optional, Sequence, Tuple, Union
+
+import torch
+import torch.nn as nn
+from mmdet.models.dense_heads.base_dense_head import BaseDenseHead
+from mmdet.models.utils import filter_scores_and_topk, multi_apply
+from mmdet.structures.bbox import bbox_overlaps
+from mmdet.utils import (ConfigType, OptConfigType, OptInstanceList,
+                         OptMultiConfig)
+from mmengine.config import ConfigDict
+from mmengine.dist import get_dist_info
+from mmengine.logging import print_log
+from mmengine.model import BaseModule
+from mmengine.structures import InstanceData
+from torch import Tensor
+
+from mmyolo.registry import MODELS, TASK_UTILS
+from ..utils import make_divisible
+
+
+def get_prior_xy_info(index: int, num_base_priors: int,
+                      featmap_sizes: int) -> Tuple[int, int, int]:
+    """Get prior index and xy index in feature map by flatten index."""
+    _, featmap_w = featmap_sizes
+    priors = index % num_base_priors
+    xy_index = index // num_base_priors
+    grid_y = xy_index // featmap_w
+    grid_x = xy_index % featmap_w
+    return priors, grid_x, grid_y
+
+
+@MODELS.register_module()
+class YOLOv5HeadModule(BaseModule):
+    """YOLOv5Head head module used in `YOLOv5`.
+
+    Args:
+        num_classes (int): Number of categories excluding the background
+            category.
+        in_channels (Union[int, Sequence]): Number of channels in the input
+            feature map.
+        widen_factor (float): Width multiplier, multiply number of
+            channels in each layer by this amount. Defaults to 1.0.
+        num_base_priors (int): The number of priors (points) at a point
+            on the feature grid.
+        featmap_strides (Sequence[int]): Downsample factor of each feature map.
+             Defaults to (8, 16, 32).
+        init_cfg (:obj:`ConfigDict` or list[:obj:`ConfigDict`] or dict or
+            list[dict], optional): Initialization config dict.
+            Defaults to None.
+    """
+
+    def __init__(self,
+                 num_classes: int,
+                 in_channels: Union[int, Sequence],
+                 widen_factor: float = 1.0,
+                 num_base_priors: int = 3,
+                 featmap_strides: Sequence[int] = (8, 16, 32),
+                 init_cfg: OptMultiConfig = None):
+        super().__init__(init_cfg=init_cfg)
+        self.num_classes = num_classes
+        self.widen_factor = widen_factor
+
+        self.featmap_strides = featmap_strides
+        self.num_out_attrib = 5 + self.num_classes
+        self.num_levels = len(self.featmap_strides)
+        self.num_base_priors = num_base_priors
+
+        if isinstance(in_channels, int):
+            self.in_channels = [make_divisible(in_channels, widen_factor)
+                                ] * self.num_levels
+        else:
+            self.in_channels = [
+                make_divisible(i, widen_factor) for i in in_channels
+            ]
+
+        self._init_layers()
+
+    def _init_layers(self):
+        """initialize conv layers in YOLOv5 head."""
+        self.convs_pred = nn.ModuleList()
+        for i in range(self.num_levels):
+            conv_pred = nn.Conv2d(self.in_channels[i],
+                                  self.num_base_priors * self.num_out_attrib,
+                                  1)
+
+            self.convs_pred.append(conv_pred)
+
+    def init_weights(self):
+        """Initialize the bias of YOLOv5 head."""
+        super().init_weights()
+        for mi, s in zip(self.convs_pred, self.featmap_strides):  # from
+            b = mi.bias.data.view(self.num_base_priors, -1)
+            # obj (8 objects per 640 image)
+            b.data[:, 4] += math.log(8 / (640 / s)**2)
+            # NOTE: The following initialization can only be performed on the
+            # bias of the category, if the following initialization is
+            # performed on the bias of mask coefficient,
+            # there will be a significant decrease in mask AP.
+            b.data[:, 5:5 + self.num_classes] += math.log(
+                0.6 / (self.num_classes - 0.999999))
+
+            mi.bias.data = b.view(-1)
+
+    def forward(self, x: Tuple[Tensor]) -> Tuple[List]:
+        """Forward features from the upstream network.
+
+        Args:
+            x (Tuple[Tensor]): Features from the upstream network, each is
+                a 4D-tensor.
+        Returns:
+            Tuple[List]: A tuple of multi-level classification scores, bbox
+            predictions, and objectnesses.
+        """
+        assert len(x) == self.num_levels
+        return multi_apply(self.forward_single, x, self.convs_pred)
+
+    def forward_single(self, x: Tensor,
+                       convs: nn.Module) -> Tuple[Tensor, Tensor, Tensor]:
+        """Forward feature of a single scale level."""
+
+        pred_map = convs(x)
+        bs, _, ny, nx = pred_map.shape
+        pred_map = pred_map.view(bs, self.num_base_priors, self.num_out_attrib,
+                                 ny, nx)
+
+        cls_score = pred_map[:, :, 5:, ...].reshape(bs, -1, ny, nx)
+        bbox_pred = pred_map[:, :, :4, ...].reshape(bs, -1, ny, nx)
+        objectness = pred_map[:, :, 4:5, ...].reshape(bs, -1, ny, nx)
+
+        return cls_score, bbox_pred, objectness
+
+
+@MODELS.register_module()
+class YOLOv5Head(BaseDenseHead):
+    """YOLOv5Head head used in `YOLOv5`.
+
+    Args:
+        head_module(ConfigType): Base module used for YOLOv5Head
+        prior_generator(dict): Points generator feature maps in
+            2D points-based detectors.
+        bbox_coder (:obj:`ConfigDict` or dict): Config of bbox coder.
+        loss_cls (:obj:`ConfigDict` or dict): Config of classification loss.
+        loss_bbox (:obj:`ConfigDict` or dict): Config of localization loss.
+        loss_obj (:obj:`ConfigDict` or dict): Config of objectness loss.
+        prior_match_thr (float): Defaults to 4.0.
+        ignore_iof_thr (float): Defaults to -1.0.
+        obj_level_weights (List[float]): Defaults to [4.0, 1.0, 0.4].
+        train_cfg (:obj:`ConfigDict` or dict, optional): Training config of
+            anchor head. Defaults to None.
+        test_cfg (:obj:`ConfigDict` or dict, optional): Testing config of
+            anchor head. Defaults to None.
+        init_cfg (:obj:`ConfigDict` or list[:obj:`ConfigDict`] or dict or
+            list[dict], optional): Initialization config dict.
+            Defaults to None.
+    """
+
+    def __init__(self,
+                 head_module: ConfigType,
+                 prior_generator: ConfigType = dict(
+                     type='mmdet.YOLOAnchorGenerator',
+                     base_sizes=[[(10, 13), (16, 30), (33, 23)],
+                                 [(30, 61), (62, 45), (59, 119)],
+                                 [(116, 90), (156, 198), (373, 326)]],
+                     strides=[8, 16, 32]),
+                 bbox_coder: ConfigType = dict(type='YOLOv5BBoxCoder'),
+                 loss_cls: ConfigType = dict(
+                     type='mmdet.CrossEntropyLoss',
+                     use_sigmoid=True,
+                     reduction='mean',
+                     loss_weight=0.5),
+                 loss_bbox: ConfigType = dict(
+                     type='IoULoss',
+                     iou_mode='ciou',
+                     bbox_format='xywh',
+                     eps=1e-7,
+                     reduction='mean',
+                     loss_weight=0.05,
+                     return_iou=True),
+                 loss_obj: ConfigType = dict(
+                     type='mmdet.CrossEntropyLoss',
+                     use_sigmoid=True,
+                     reduction='mean',
+                     loss_weight=1.0),
+                 prior_match_thr: float = 4.0,
+                 near_neighbor_thr: float = 0.5,
+                 ignore_iof_thr: float = -1.0,
+                 obj_level_weights: List[float] = [4.0, 1.0, 0.4],
+                 train_cfg: OptConfigType = None,
+                 test_cfg: OptConfigType = None,
+                 init_cfg: OptMultiConfig = None):
+        super().__init__(init_cfg=init_cfg)
+
+        self.head_module = MODELS.build(head_module)
+        self.num_classes = self.head_module.num_classes
+        self.featmap_strides = self.head_module.featmap_strides
+        self.num_levels = len(self.featmap_strides)
+
+        self.train_cfg = train_cfg
+        self.test_cfg = test_cfg
+
+        self.loss_cls: nn.Module = MODELS.build(loss_cls)
+        self.loss_bbox: nn.Module = MODELS.build(loss_bbox)
+        self.loss_obj: nn.Module = MODELS.build(loss_obj)
+
+        self.prior_generator = TASK_UTILS.build(prior_generator)
+        self.bbox_coder = TASK_UTILS.build(bbox_coder)
+        self.num_base_priors = self.prior_generator.num_base_priors[0]
+
+        self.featmap_sizes = [torch.empty(1)] * self.num_levels
+
+        self.prior_match_thr = prior_match_thr
+        self.near_neighbor_thr = near_neighbor_thr
+        self.obj_level_weights = obj_level_weights
+        self.ignore_iof_thr = ignore_iof_thr
+
+        self.special_init()
+
+    def special_init(self):
+        """Since YOLO series algorithms will inherit from YOLOv5Head, but
+        different algorithms have special initialization process.
+
+        The special_init function is designed to deal with this situation.
+        """
+        assert len(self.obj_level_weights) == len(
+            self.featmap_strides) == self.num_levels
+        if self.prior_match_thr != 4.0:
+            print_log(
+                "!!!Now, you've changed the prior_match_thr "
+                'parameter to something other than 4.0. Please make sure '
+                'that you have modified both the regression formula in '
+                'bbox_coder and before loss_box computation, '
+                'otherwise the accuracy may be degraded!!!')
+
+        if self.num_classes == 1:
+            print_log('!!!You are using `YOLOv5Head` with num_classes == 1.'
+                      ' The loss_cls will be 0. This is a normal phenomenon.')
+
+        priors_base_sizes = torch.tensor(
+            self.prior_generator.base_sizes, dtype=torch.float)
+        featmap_strides = torch.tensor(
+            self.featmap_strides, dtype=torch.float)[:, None, None]
+        self.register_buffer(
+            'priors_base_sizes',
+            priors_base_sizes / featmap_strides,
+            persistent=False)
+
+        grid_offset = torch.tensor([
+            [0, 0],  # center
+            [1, 0],  # left
+            [0, 1],  # up
+            [-1, 0],  # right
+            [0, -1],  # bottom
+        ]).float()
+        self.register_buffer(
+            'grid_offset', grid_offset[:, None], persistent=False)
+
+        prior_inds = torch.arange(self.num_base_priors).float().view(
+            self.num_base_priors, 1)
+        self.register_buffer('prior_inds', prior_inds, persistent=False)
+
+    def forward(self, x: Tuple[Tensor]) -> Tuple[List]:
+        """Forward features from the upstream network.
+
+        Args:
+            x (Tuple[Tensor]): Features from the upstream network, each is
+                a 4D-tensor.
+        Returns:
+            Tuple[List]: A tuple of multi-level classification scores, bbox
+            predictions, and objectnesses.
+        """
+        return self.head_module(x)
+
+    def predict_by_feat(self,
+                        cls_scores: List[Tensor],
+                        bbox_preds: List[Tensor],
+                        objectnesses: Optional[List[Tensor]] = None,
+                        batch_img_metas: Optional[List[dict]] = None,
+                        cfg: Optional[ConfigDict] = None,
+                        rescale: bool = True,
+                        with_nms: bool = True) -> List[InstanceData]:
+        """Transform a batch of output features extracted by the head into
+        bbox results.
+        Args:
+            cls_scores (list[Tensor]): Classification scores for all
+                scale levels, each is a 4D-tensor, has shape
+                (batch_size, num_priors * num_classes, H, W).
+            bbox_preds (list[Tensor]): Box energies / deltas for all
+                scale levels, each is a 4D-tensor, has shape
+                (batch_size, num_priors * 4, H, W).
+            objectnesses (list[Tensor], Optional): Score factor for
+                all scale level, each is a 4D-tensor, has shape
+                (batch_size, 1, H, W).
+            batch_img_metas (list[dict], Optional): Batch image meta info.
+                Defaults to None.
+            cfg (ConfigDict, optional): Test / postprocessing
+                configuration, if None, test_cfg would be used.
+                Defaults to None.
+            rescale (bool): If True, return boxes in original image space.
+                Defaults to False.
+            with_nms (bool): If True, do nms before return boxes.
+                Defaults to True.
+
+        Returns:
+            list[:obj:`InstanceData`]: Object detection results of each image
+            after the post process. Each item usually contains following keys.
+
+            - scores (Tensor): Classification scores, has a shape
+              (num_instance, )
+            - labels (Tensor): Labels of bboxes, has a shape
+              (num_instances, ).
+            - bboxes (Tensor): Has a shape (num_instances, 4),
+              the last dimension 4 arrange as (x1, y1, x2, y2).
+        """
+        assert len(cls_scores) == len(bbox_preds)
+        if objectnesses is None:
+            with_objectnesses = False
+        else:
+            with_objectnesses = True
+            assert len(cls_scores) == len(objectnesses)
+
+        cfg = self.test_cfg if cfg is None else cfg
+        cfg = copy.deepcopy(cfg)
+
+        multi_label = cfg.multi_label
+        multi_label &= self.num_classes > 1
+        cfg.multi_label = multi_label
+
+        num_imgs = len(batch_img_metas)
+        featmap_sizes = [cls_score.shape[2:] for cls_score in cls_scores]
+
+        # If the shape does not change, use the previous mlvl_priors
+        if featmap_sizes != self.featmap_sizes:
+            self.mlvl_priors = self.prior_generator.grid_priors(
+                featmap_sizes,
+                dtype=cls_scores[0].dtype,
+                device=cls_scores[0].device)
+            self.featmap_sizes = featmap_sizes
+        flatten_priors = torch.cat(self.mlvl_priors)
+
+        mlvl_strides = [
+            flatten_priors.new_full(
+                (featmap_size.numel() * self.num_base_priors, ), stride) for
+            featmap_size, stride in zip(featmap_sizes, self.featmap_strides)
+        ]
+        flatten_stride = torch.cat(mlvl_strides)
+
+        # flatten cls_scores, bbox_preds and objectness
+        flatten_cls_scores = [
+            cls_score.permute(0, 2, 3, 1).reshape(num_imgs, -1,
+                                                  self.num_classes)
+            for cls_score in cls_scores
+        ]
+        flatten_bbox_preds = [
+            bbox_pred.permute(0, 2, 3, 1).reshape(num_imgs, -1, 4)
+            for bbox_pred in bbox_preds
+        ]
+
+        flatten_cls_scores = torch.cat(flatten_cls_scores, dim=1).sigmoid()
+        flatten_bbox_preds = torch.cat(flatten_bbox_preds, dim=1)
+        flatten_decoded_bboxes = self.bbox_coder.decode(
+            flatten_priors[None], flatten_bbox_preds, flatten_stride)
+
+        if with_objectnesses:
+            flatten_objectness = [
+                objectness.permute(0, 2, 3, 1).reshape(num_imgs, -1)
+                for objectness in objectnesses
+            ]
+            flatten_objectness = torch.cat(flatten_objectness, dim=1).sigmoid()
+        else:
+            flatten_objectness = [None for _ in range(num_imgs)]
+
+        results_list = []
+        for (bboxes, scores, objectness,
+             img_meta) in zip(flatten_decoded_bboxes, flatten_cls_scores,
+                              flatten_objectness, batch_img_metas):
+            ori_shape = img_meta['ori_shape']
+            scale_factor = img_meta['scale_factor']
+            if 'pad_param' in img_meta:
+                pad_param = img_meta['pad_param']
+            else:
+                pad_param = None
+
+            score_thr = cfg.get('score_thr', -1)
+            # yolox_style does not require the following operations
+            if objectness is not None and score_thr > 0 and not cfg.get(
+                    'yolox_style', False):
+                conf_inds = objectness > score_thr
+                bboxes = bboxes[conf_inds, :]
+                scores = scores[conf_inds, :]
+                objectness = objectness[conf_inds]
+
+            if objectness is not None:
+                # conf = obj_conf * cls_conf
+                scores *= objectness[:, None]
+
+            if scores.shape[0] == 0:
+                empty_results = InstanceData()
+                empty_results.bboxes = bboxes
+                empty_results.scores = scores[:, 0]
+                empty_results.labels = scores[:, 0].int()
+                results_list.append(empty_results)
+                continue
+
+            nms_pre = cfg.get('nms_pre', 100000)
+            if cfg.multi_label is False:
+                scores, labels = scores.max(1, keepdim=True)
+                scores, _, keep_idxs, results = filter_scores_and_topk(
+                    scores,
+                    score_thr,
+                    nms_pre,
+                    results=dict(labels=labels[:, 0]))
+                labels = results['labels']
+            else:
+                scores, labels, keep_idxs, _ = filter_scores_and_topk(
+                    scores, score_thr, nms_pre)
+
+            results = InstanceData(
+                scores=scores, labels=labels, bboxes=bboxes[keep_idxs])
+
+            if rescale:
+                if pad_param is not None:
+                    results.bboxes -= results.bboxes.new_tensor([
+                        pad_param[2], pad_param[0], pad_param[2], pad_param[0]
+                    ])
+                results.bboxes /= results.bboxes.new_tensor(
+                    scale_factor).repeat((1, 2))
+
+            if cfg.get('yolox_style', False):
+                # do not need max_per_img
+                cfg.max_per_img = len(results)
+
+            results = self._bbox_post_process(
+                results=results,
+                cfg=cfg,
+                rescale=False,
+                with_nms=with_nms,
+                img_meta=img_meta)
+            results.bboxes[:, 0::2].clamp_(0, ori_shape[1])
+            results.bboxes[:, 1::2].clamp_(0, ori_shape[0])
+
+            results_list.append(results)
+        return results_list
+
+    def loss(self, x: Tuple[Tensor], batch_data_samples: Union[list,
+                                                               dict]) -> dict:
+        """Perform forward propagation and loss calculation of the detection
+        head on the features of the upstream network.
+
+        Args:
+            x (tuple[Tensor]): Features from the upstream network, each is
+                a 4D-tensor.
+            batch_data_samples (List[:obj:`DetDataSample`], dict): The Data
+                Samples. It usually includes information such as
+                `gt_instance`, `gt_panoptic_seg` and `gt_sem_seg`.
+
+        Returns:
+            dict: A dictionary of loss components.
+        """
+
+        if isinstance(batch_data_samples, list):
+            losses = super().loss(x, batch_data_samples)
+        else:
+            outs = self(x)
+            # Fast version
+            loss_inputs = outs + (batch_data_samples['bboxes_labels'],
+                                  batch_data_samples['img_metas'])
+            losses = self.loss_by_feat(*loss_inputs)
+
+        return losses
+
+    def loss_by_feat(
+            self,
+            cls_scores: Sequence[Tensor],
+            bbox_preds: Sequence[Tensor],
+            objectnesses: Sequence[Tensor],
+            batch_gt_instances: Sequence[InstanceData],
+            batch_img_metas: Sequence[dict],
+            batch_gt_instances_ignore: OptInstanceList = None) -> dict:
+        """Calculate the loss based on the features extracted by the detection
+        head.
+
+        Args:
+            cls_scores (Sequence[Tensor]): Box scores for each scale level,
+                each is a 4D-tensor, the channel number is
+                num_priors * num_classes.
+            bbox_preds (Sequence[Tensor]): Box energies / deltas for each scale
+                level, each is a 4D-tensor, the channel number is
+                num_priors * 4.
+            objectnesses (Sequence[Tensor]): Score factor for
+                all scale level, each is a 4D-tensor, has shape
+                (batch_size, 1, H, W).
+            batch_gt_instances (Sequence[InstanceData]): Batch of
+                gt_instance. It usually includes ``bboxes`` and ``labels``
+                attributes.
+            batch_img_metas (Sequence[dict]): Meta information of each image,
+                e.g., image size, scaling factor, etc.
+            batch_gt_instances_ignore (list[:obj:`InstanceData`], optional):
+                Batch of gt_instances_ignore. It includes ``bboxes`` attribute
+                data that is ignored during training and testing.
+                Defaults to None.
+        Returns:
+            dict[str, Tensor]: A dictionary of losses.
+        """
+        if self.ignore_iof_thr != -1:
+            # TODO: Support fast version
+            # convert ignore gt
+            batch_target_ignore_list = []
+            for i, gt_instances_ignore in enumerate(batch_gt_instances_ignore):
+                bboxes = gt_instances_ignore.bboxes
+                labels = gt_instances_ignore.labels
+                index = bboxes.new_full((len(bboxes), 1), i)
+                # (batch_idx, label, bboxes)
+                target = torch.cat((index, labels[:, None].float(), bboxes),
+                                   dim=1)
+                batch_target_ignore_list.append(target)
+
+            # (num_bboxes, 6)
+            batch_gt_targets_ignore = torch.cat(
+                batch_target_ignore_list, dim=0)
+            if batch_gt_targets_ignore.shape[0] != 0:
+                # Consider regions with ignore in annotations
+                return self._loss_by_feat_with_ignore(
+                    cls_scores,
+                    bbox_preds,
+                    objectnesses,
+                    batch_gt_instances=batch_gt_instances,
+                    batch_img_metas=batch_img_metas,
+                    batch_gt_instances_ignore=batch_gt_targets_ignore)
+
+        # 1. Convert gt to norm format
+        batch_targets_normed = self._convert_gt_to_norm_format(
+            batch_gt_instances, batch_img_metas)
+
+        device = cls_scores[0].device
+        loss_cls = torch.zeros(1, device=device)
+        loss_box = torch.zeros(1, device=device)
+        loss_obj = torch.zeros(1, device=device)
+        scaled_factor = torch.ones(7, device=device)
+
+        for i in range(self.num_levels):
+            batch_size, _, h, w = bbox_preds[i].shape
+            target_obj = torch.zeros_like(objectnesses[i])
+
+            # empty gt bboxes
+            if batch_targets_normed.shape[1] == 0:
+                loss_box += bbox_preds[i].sum() * 0
+                loss_cls += cls_scores[i].sum() * 0
+                loss_obj += self.loss_obj(
+                    objectnesses[i], target_obj) * self.obj_level_weights[i]
+                continue
+
+            priors_base_sizes_i = self.priors_base_sizes[i]
+            # feature map scale whwh
+            scaled_factor[2:6] = torch.tensor(
+                bbox_preds[i].shape)[[3, 2, 3, 2]]
+            # Scale batch_targets from range 0-1 to range 0-features_maps size.
+            # (num_base_priors, num_bboxes, 7)
+            batch_targets_scaled = batch_targets_normed * scaled_factor
+
+            # 2. Shape match
+            wh_ratio = batch_targets_scaled[...,
+                                            4:6] / priors_base_sizes_i[:, None]
+            match_inds = torch.max(
+                wh_ratio, 1 / wh_ratio).max(2)[0] < self.prior_match_thr
+            batch_targets_scaled = batch_targets_scaled[match_inds]
+
+            # no gt bbox matches anchor
+            if batch_targets_scaled.shape[0] == 0:
+                loss_box += bbox_preds[i].sum() * 0
+                loss_cls += cls_scores[i].sum() * 0
+                loss_obj += self.loss_obj(
+                    objectnesses[i], target_obj) * self.obj_level_weights[i]
+                continue
+
+            # 3. Positive samples with additional neighbors
+
+            # check the left, up, right, bottom sides of the
+            # targets grid, and determine whether assigned
+            # them as positive samples as well.
+            batch_targets_cxcy = batch_targets_scaled[:, 2:4]
+            grid_xy = scaled_factor[[2, 3]] - batch_targets_cxcy
+            left, up = ((batch_targets_cxcy % 1 < self.near_neighbor_thr) &
+                        (batch_targets_cxcy > 1)).T
+            right, bottom = ((grid_xy % 1 < self.near_neighbor_thr) &
+                             (grid_xy > 1)).T
+            offset_inds = torch.stack(
+                (torch.ones_like(left), left, up, right, bottom))
+
+            batch_targets_scaled = batch_targets_scaled.repeat(
+                (5, 1, 1))[offset_inds]
+            retained_offsets = self.grid_offset.repeat(1, offset_inds.shape[1],
+                                                       1)[offset_inds]
+
+            # prepare pred results and positive sample indexes to
+            # calculate class loss and bbox lo
+            _chunk_targets = batch_targets_scaled.chunk(4, 1)
+            img_class_inds, grid_xy, grid_wh, priors_inds = _chunk_targets
+            priors_inds, (img_inds, class_inds) = priors_inds.long().view(
+                -1), img_class_inds.long().T
+
+            grid_xy_long = (grid_xy -
+                            retained_offsets * self.near_neighbor_thr).long()
+            grid_x_inds, grid_y_inds = grid_xy_long.T
+            bboxes_targets = torch.cat((grid_xy - grid_xy_long, grid_wh), 1)
+
+            # 4. Calculate loss
+            # bbox loss
+            retained_bbox_pred = bbox_preds[i].reshape(
+                batch_size, self.num_base_priors, -1, h,
+                w)[img_inds, priors_inds, :, grid_y_inds, grid_x_inds]
+            priors_base_sizes_i = priors_base_sizes_i[priors_inds]
+            decoded_bbox_pred = self._decode_bbox_to_xywh(
+                retained_bbox_pred, priors_base_sizes_i)
+            loss_box_i, iou = self.loss_bbox(decoded_bbox_pred, bboxes_targets)
+            loss_box += loss_box_i
+
+            # obj loss
+            iou = iou.detach().clamp(0)
+            target_obj[img_inds, priors_inds, grid_y_inds,
+                       grid_x_inds] = iou.type(target_obj.dtype)
+            loss_obj += self.loss_obj(objectnesses[i],
+                                      target_obj) * self.obj_level_weights[i]
+
+            # cls loss
+            if self.num_classes > 1:
+                pred_cls_scores = cls_scores[i].reshape(
+                    batch_size, self.num_base_priors, -1, h,
+                    w)[img_inds, priors_inds, :, grid_y_inds, grid_x_inds]
+
+                target_class = torch.full_like(pred_cls_scores, 0.)
+                target_class[range(batch_targets_scaled.shape[0]),
+                             class_inds] = 1.
+                loss_cls += self.loss_cls(pred_cls_scores, target_class)
+            else:
+                loss_cls += cls_scores[i].sum() * 0
+
+        _, world_size = get_dist_info()
+        return dict(
+            loss_cls=loss_cls * batch_size * world_size,
+            loss_obj=loss_obj * batch_size * world_size,
+            loss_bbox=loss_box * batch_size * world_size)
+
+    def _convert_gt_to_norm_format(self,
+                                   batch_gt_instances: Sequence[InstanceData],
+                                   batch_img_metas: Sequence[dict]) -> Tensor:
+        if isinstance(batch_gt_instances, torch.Tensor):
+            # fast version
+            img_shape = batch_img_metas[0]['batch_input_shape']
+            gt_bboxes_xyxy = batch_gt_instances[:, 2:]
+            xy1, xy2 = gt_bboxes_xyxy.split((2, 2), dim=-1)
+            gt_bboxes_xywh = torch.cat([(xy2 + xy1) / 2, (xy2 - xy1)], dim=-1)
+            gt_bboxes_xywh[:, 1::2] /= img_shape[0]
+            gt_bboxes_xywh[:, 0::2] /= img_shape[1]
+            batch_gt_instances[:, 2:] = gt_bboxes_xywh
+
+            # (num_base_priors, num_bboxes, 6)
+            batch_targets_normed = batch_gt_instances.repeat(
+                self.num_base_priors, 1, 1)
+        else:
+            batch_target_list = []
+            # Convert xyxy bbox to yolo format.
+            for i, gt_instances in enumerate(batch_gt_instances):
+                img_shape = batch_img_metas[i]['batch_input_shape']
+                bboxes = gt_instances.bboxes
+                labels = gt_instances.labels
+
+                xy1, xy2 = bboxes.split((2, 2), dim=-1)
+                bboxes = torch.cat([(xy2 + xy1) / 2, (xy2 - xy1)], dim=-1)
+                # normalized to 0-1
+                bboxes[:, 1::2] /= img_shape[0]
+                bboxes[:, 0::2] /= img_shape[1]
+
+                index = bboxes.new_full((len(bboxes), 1), i)
+                # (batch_idx, label, normed_bbox)
+                target = torch.cat((index, labels[:, None].float(), bboxes),
+                                   dim=1)
+                batch_target_list.append(target)
+
+            # (num_base_priors, num_bboxes, 6)
+            batch_targets_normed = torch.cat(
+                batch_target_list, dim=0).repeat(self.num_base_priors, 1, 1)
+
+        # (num_base_priors, num_bboxes, 1)
+        batch_targets_prior_inds = self.prior_inds.repeat(
+            1, batch_targets_normed.shape[1])[..., None]
+        # (num_base_priors, num_bboxes, 7)
+        # (img_ind, labels, bbox_cx, bbox_cy, bbox_w, bbox_h, prior_ind)
+        batch_targets_normed = torch.cat(
+            (batch_targets_normed, batch_targets_prior_inds), 2)
+        return batch_targets_normed
+
+    def _decode_bbox_to_xywh(self, bbox_pred, priors_base_sizes) -> Tensor:
+        bbox_pred = bbox_pred.sigmoid()
+        pred_xy = bbox_pred[:, :2] * 2 - 0.5
+        pred_wh = (bbox_pred[:, 2:] * 2)**2 * priors_base_sizes
+        decoded_bbox_pred = torch.cat((pred_xy, pred_wh), dim=-1)
+        return decoded_bbox_pred
+
+    def _loss_by_feat_with_ignore(
+            self, cls_scores: Sequence[Tensor], bbox_preds: Sequence[Tensor],
+            objectnesses: Sequence[Tensor],
+            batch_gt_instances: Sequence[InstanceData],
+            batch_img_metas: Sequence[dict],
+            batch_gt_instances_ignore: Sequence[Tensor]) -> dict:
+        """Calculate the loss based on the features extracted by the detection
+        head.
+
+        Args:
+            cls_scores (Sequence[Tensor]): Box scores for each scale level,
+                each is a 4D-tensor, the channel number is
+                num_priors * num_classes.
+            bbox_preds (Sequence[Tensor]): Box energies / deltas for each scale
+                level, each is a 4D-tensor, the channel number is
+                num_priors * 4.
+            objectnesses (Sequence[Tensor]): Score factor for
+                all scale level, each is a 4D-tensor, has shape
+                (batch_size, 1, H, W).
+            batch_gt_instances (Sequence[InstanceData]): Batch of
+                gt_instance. It usually includes ``bboxes`` and ``labels``
+                attributes.
+            batch_img_metas (Sequence[dict]): Meta information of each image,
+                e.g., image size, scaling factor, etc.
+            batch_gt_instances_ignore (Sequence[Tensor]): Ignore boxes with
+                batch_ids and labels, each is a 2D-tensor, the channel number
+                is 6, means that (batch_id, label, xmin, ymin, xmax, ymax).
+        Returns:
+            dict[str, Tensor]: A dictionary of losses.
+        """
+        # 1. Convert gt to norm format
+        batch_targets_normed = self._convert_gt_to_norm_format(
+            batch_gt_instances, batch_img_metas)
+
+        featmap_sizes = [cls_score.shape[2:] for cls_score in cls_scores]
+        if featmap_sizes != self.featmap_sizes:
+            self.mlvl_priors = self.prior_generator.grid_priors(
+                featmap_sizes,
+                dtype=cls_scores[0].dtype,
+                device=cls_scores[0].device)
+            self.featmap_sizes = featmap_sizes
+
+        device = cls_scores[0].device
+        loss_cls = torch.zeros(1, device=device)
+        loss_box = torch.zeros(1, device=device)
+        loss_obj = torch.zeros(1, device=device)
+        scaled_factor = torch.ones(7, device=device)
+
+        for i in range(self.num_levels):
+            batch_size, _, h, w = bbox_preds[i].shape
+            target_obj = torch.zeros_like(objectnesses[i])
+
+            not_ignore_flags = bbox_preds[i].new_ones(batch_size,
+                                                      self.num_base_priors, h,
+                                                      w)
+
+            ignore_overlaps = bbox_overlaps(self.mlvl_priors[i],
+                                            batch_gt_instances_ignore[..., 2:],
+                                            'iof')
+            ignore_max_overlaps, ignore_max_ignore_index = ignore_overlaps.max(
+                dim=1)
+
+            batch_inds = batch_gt_instances_ignore[:,
+                                                   0][ignore_max_ignore_index]
+            ignore_inds = (ignore_max_overlaps > self.ignore_iof_thr).nonzero(
+                as_tuple=True)[0]
+            batch_inds = batch_inds[ignore_inds].long()
+            ignore_priors, ignore_grid_xs, ignore_grid_ys = get_prior_xy_info(
+                ignore_inds, self.num_base_priors, self.featmap_sizes[i])
+            not_ignore_flags[batch_inds, ignore_priors, ignore_grid_ys,
+                             ignore_grid_xs] = 0
+
+            # empty gt bboxes
+            if batch_targets_normed.shape[1] == 0:
+                loss_box += bbox_preds[i].sum() * 0
+                loss_cls += cls_scores[i].sum() * 0
+                loss_obj += self.loss_obj(
+                    objectnesses[i],
+                    target_obj,
+                    weight=not_ignore_flags,
+                    avg_factor=max(not_ignore_flags.sum(),
+                                   1)) * self.obj_level_weights[i]
+                continue
+
+            priors_base_sizes_i = self.priors_base_sizes[i]
+            # feature map scale whwh
+            scaled_factor[2:6] = torch.tensor(
+                bbox_preds[i].shape)[[3, 2, 3, 2]]
+            # Scale batch_targets from range 0-1 to range 0-features_maps size.
+            # (num_base_priors, num_bboxes, 7)
+            batch_targets_scaled = batch_targets_normed * scaled_factor
+
+            # 2. Shape match
+            wh_ratio = batch_targets_scaled[...,
+                                            4:6] / priors_base_sizes_i[:, None]
+            match_inds = torch.max(
+                wh_ratio, 1 / wh_ratio).max(2)[0] < self.prior_match_thr
+            batch_targets_scaled = batch_targets_scaled[match_inds]
+
+            # no gt bbox matches anchor
+            if batch_targets_scaled.shape[0] == 0:
+                loss_box += bbox_preds[i].sum() * 0
+                loss_cls += cls_scores[i].sum() * 0
+                loss_obj += self.loss_obj(
+                    objectnesses[i],
+                    target_obj,
+                    weight=not_ignore_flags,
+                    avg_factor=max(not_ignore_flags.sum(),
+                                   1)) * self.obj_level_weights[i]
+                continue
+
+            # 3. Positive samples with additional neighbors
+
+            # check the left, up, right, bottom sides of the
+            # targets grid, and determine whether assigned
+            # them as positive samples as well.
+            batch_targets_cxcy = batch_targets_scaled[:, 2:4]
+            grid_xy = scaled_factor[[2, 3]] - batch_targets_cxcy
+            left, up = ((batch_targets_cxcy % 1 < self.near_neighbor_thr) &
+                        (batch_targets_cxcy > 1)).T
+            right, bottom = ((grid_xy % 1 < self.near_neighbor_thr) &
+                             (grid_xy > 1)).T
+            offset_inds = torch.stack(
+                (torch.ones_like(left), left, up, right, bottom))
+
+            batch_targets_scaled = batch_targets_scaled.repeat(
+                (5, 1, 1))[offset_inds]
+            retained_offsets = self.grid_offset.repeat(1, offset_inds.shape[1],
+                                                       1)[offset_inds]
+
+            # prepare pred results and positive sample indexes to
+            # calculate class loss and bbox lo
+            _chunk_targets = batch_targets_scaled.chunk(4, 1)
+            img_class_inds, grid_xy, grid_wh, priors_inds = _chunk_targets
+            priors_inds, (img_inds, class_inds) = priors_inds.long().view(
+                -1), img_class_inds.long().T
+
+            grid_xy_long = (grid_xy -
+                            retained_offsets * self.near_neighbor_thr).long()
+            grid_x_inds, grid_y_inds = grid_xy_long.T
+            bboxes_targets = torch.cat((grid_xy - grid_xy_long, grid_wh), 1)
+
+            # 4. Calculate loss
+            # bbox loss
+            retained_bbox_pred = bbox_preds[i].reshape(
+                batch_size, self.num_base_priors, -1, h,
+                w)[img_inds, priors_inds, :, grid_y_inds, grid_x_inds]
+            priors_base_sizes_i = priors_base_sizes_i[priors_inds]
+            decoded_bbox_pred = self._decode_bbox_to_xywh(
+                retained_bbox_pred, priors_base_sizes_i)
+
+            not_ignore_weights = not_ignore_flags[img_inds, priors_inds,
+                                                  grid_y_inds, grid_x_inds]
+            loss_box_i, iou = self.loss_bbox(
+                decoded_bbox_pred,
+                bboxes_targets,
+                weight=not_ignore_weights,
+                avg_factor=max(not_ignore_weights.sum(), 1))
+            loss_box += loss_box_i
+
+            # obj loss
+            iou = iou.detach().clamp(0)
+            target_obj[img_inds, priors_inds, grid_y_inds,
+                       grid_x_inds] = iou.type(target_obj.dtype)
+            loss_obj += self.loss_obj(
+                objectnesses[i],
+                target_obj,
+                weight=not_ignore_flags,
+                avg_factor=max(not_ignore_flags.sum(),
+                               1)) * self.obj_level_weights[i]
+
+            # cls loss
+            if self.num_classes > 1:
+                pred_cls_scores = cls_scores[i].reshape(
+                    batch_size, self.num_base_priors, -1, h,
+                    w)[img_inds, priors_inds, :, grid_y_inds, grid_x_inds]
+
+                target_class = torch.full_like(pred_cls_scores, 0.)
+                target_class[range(batch_targets_scaled.shape[0]),
+                             class_inds] = 1.
+                loss_cls += self.loss_cls(
+                    pred_cls_scores,
+                    target_class,
+                    weight=not_ignore_weights[:, None].repeat(
+                        1, self.num_classes),
+                    avg_factor=max(not_ignore_weights.sum(), 1))
+            else:
+                loss_cls += cls_scores[i].sum() * 0
+
+        _, world_size = get_dist_info()
+        return dict(
+            loss_cls=loss_cls * batch_size * world_size,
+            loss_obj=loss_obj * batch_size * world_size,
+            loss_bbox=loss_box * batch_size * world_size)
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/models/dense_heads/yolov5_ins_head.py b/mmdetection_practice/third_party/mmyolo/mmyolo/models/dense_heads/yolov5_ins_head.py
new file mode 100644
index 0000000..df94f42
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/models/dense_heads/yolov5_ins_head.py
@@ -0,0 +1,740 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+import copy
+from typing import List, Optional, Sequence, Tuple, Union
+
+import mmcv
+import torch
+import torch.nn as nn
+import torch.nn.functional as F
+from mmcv.cnn import ConvModule
+from mmdet.models.utils import filter_scores_and_topk, multi_apply
+from mmdet.structures.bbox import bbox_cxcywh_to_xyxy
+from mmdet.utils import ConfigType, OptInstanceList
+from mmengine.config import ConfigDict
+from mmengine.dist import get_dist_info
+from mmengine.model import BaseModule
+from mmengine.structures import InstanceData
+from torch import Tensor
+
+from mmyolo.registry import MODELS
+from ..utils import make_divisible
+from .yolov5_head import YOLOv5Head, YOLOv5HeadModule
+
+
+class ProtoModule(BaseModule):
+    """Mask Proto module for segmentation models of YOLOv5.
+
+    Args:
+        in_channels (int): Number of channels in the input feature map.
+        middle_channels (int): Number of channels in the middle feature map.
+        mask_channels (int): Number of channels in the output mask feature
+            map. This is the channel count of the mask.
+        norm_cfg (:obj:`ConfigDict` or dict): Config dict for normalization
+            layer. Defaults to ``dict(type='BN', momentum=0.03, eps=0.001)``.
+        act_cfg (:obj:`ConfigDict` or dict): Config dict for activation layer.
+            Default: dict(type='SiLU', inplace=True).
+    """
+
+    def __init__(self,
+                 *args,
+                 in_channels: int = 32,
+                 middle_channels: int = 256,
+                 mask_channels: int = 32,
+                 norm_cfg: ConfigType = dict(
+                     type='BN', momentum=0.03, eps=0.001),
+                 act_cfg: ConfigType = dict(type='SiLU', inplace=True),
+                 **kwargs):
+        super().__init__(*args, **kwargs)
+        self.conv1 = ConvModule(
+            in_channels,
+            middle_channels,
+            kernel_size=3,
+            padding=1,
+            norm_cfg=norm_cfg,
+            act_cfg=act_cfg)
+        self.upsample = nn.Upsample(scale_factor=2, mode='nearest')
+        self.conv2 = ConvModule(
+            middle_channels,
+            middle_channels,
+            kernel_size=3,
+            padding=1,
+            norm_cfg=norm_cfg,
+            act_cfg=act_cfg)
+        self.conv3 = ConvModule(
+            middle_channels,
+            mask_channels,
+            kernel_size=1,
+            norm_cfg=norm_cfg,
+            act_cfg=act_cfg)
+
+    def forward(self, x: Tensor) -> Tensor:
+        return self.conv3(self.conv2(self.upsample(self.conv1(x))))
+
+
+@MODELS.register_module()
+class YOLOv5InsHeadModule(YOLOv5HeadModule):
+    """Detection and Instance Segmentation Head of YOLOv5.
+
+    Args:
+        num_classes (int): Number of categories excluding the background
+            category.
+        mask_channels (int): Number of channels in the mask feature map.
+            This is the channel count of the mask.
+        proto_channels (int): Number of channels in the proto feature map.
+        widen_factor (float): Width multiplier, multiply number of
+            channels in each layer by this amount. Defaults to 1.0.
+        norm_cfg (:obj:`ConfigDict` or dict): Config dict for normalization
+            layer. Defaults to ``dict(type='BN', momentum=0.03, eps=0.001)``.
+        act_cfg (:obj:`ConfigDict` or dict): Config dict for activation layer.
+            Default: dict(type='SiLU', inplace=True).
+    """
+
+    def __init__(self,
+                 *args,
+                 num_classes: int,
+                 mask_channels: int = 32,
+                 proto_channels: int = 256,
+                 widen_factor: float = 1.0,
+                 norm_cfg: ConfigType = dict(
+                     type='BN', momentum=0.03, eps=0.001),
+                 act_cfg: ConfigType = dict(type='SiLU', inplace=True),
+                 **kwargs):
+        self.mask_channels = mask_channels
+        self.num_out_attrib_with_proto = 5 + num_classes + mask_channels
+        self.proto_channels = make_divisible(proto_channels, widen_factor)
+        self.norm_cfg = norm_cfg
+        self.act_cfg = act_cfg
+        super().__init__(
+            *args,
+            num_classes=num_classes,
+            widen_factor=widen_factor,
+            **kwargs)
+
+    def _init_layers(self):
+        """initialize conv layers in YOLOv5 Ins head."""
+        self.convs_pred = nn.ModuleList()
+        for i in range(self.num_levels):
+            conv_pred = nn.Conv2d(
+                self.in_channels[i],
+                self.num_base_priors * self.num_out_attrib_with_proto, 1)
+            self.convs_pred.append(conv_pred)
+
+        self.proto_pred = ProtoModule(
+            in_channels=self.in_channels[0],
+            middle_channels=self.proto_channels,
+            mask_channels=self.mask_channels,
+            norm_cfg=self.norm_cfg,
+            act_cfg=self.act_cfg)
+
+    def forward(self, x: Tuple[Tensor]) -> Tuple[List]:
+        """Forward features from the upstream network.
+
+        Args:
+            x (Tuple[Tensor]): Features from the upstream network, each is
+                a 4D-tensor.
+        Returns:
+            Tuple[List]: A tuple of multi-level classification scores, bbox
+            predictions, objectnesses, and mask predictions.
+        """
+        assert len(x) == self.num_levels
+        cls_scores, bbox_preds, objectnesses, coeff_preds = multi_apply(
+            self.forward_single, x, self.convs_pred)
+        mask_protos = self.proto_pred(x[0])
+        return cls_scores, bbox_preds, objectnesses, coeff_preds, mask_protos
+
+    def forward_single(
+            self, x: Tensor,
+            convs_pred: nn.Module) -> Tuple[Tensor, Tensor, Tensor, Tensor]:
+        """Forward feature of a single scale level."""
+
+        pred_map = convs_pred(x)
+        bs, _, ny, nx = pred_map.shape
+        pred_map = pred_map.view(bs, self.num_base_priors,
+                                 self.num_out_attrib_with_proto, ny, nx)
+
+        cls_score = pred_map[:, :, 5:self.num_classes + 5,
+                             ...].reshape(bs, -1, ny, nx)
+        bbox_pred = pred_map[:, :, :4, ...].reshape(bs, -1, ny, nx)
+        objectness = pred_map[:, :, 4:5, ...].reshape(bs, -1, ny, nx)
+        coeff_pred = pred_map[:, :, self.num_classes + 5:,
+                              ...].reshape(bs, -1, ny, nx)
+
+        return cls_score, bbox_pred, objectness, coeff_pred
+
+
+@MODELS.register_module()
+class YOLOv5InsHead(YOLOv5Head):
+    """YOLOv5 Instance Segmentation and Detection head.
+
+    Args:
+        mask_overlap(bool): Defaults to True.
+        loss_mask (:obj:`ConfigDict` or dict): Config of mask loss.
+        loss_mask_weight (float): The weight of mask loss.
+    """
+
+    def __init__(self,
+                 *args,
+                 mask_overlap: bool = True,
+                 loss_mask: ConfigType = dict(
+                     type='mmdet.CrossEntropyLoss',
+                     use_sigmoid=True,
+                     reduction='none'),
+                 loss_mask_weight=0.05,
+                 **kwargs):
+        super().__init__(*args, **kwargs)
+        self.mask_overlap = mask_overlap
+        self.loss_mask: nn.Module = MODELS.build(loss_mask)
+        self.loss_mask_weight = loss_mask_weight
+
+    def loss(self, x: Tuple[Tensor], batch_data_samples: Union[list,
+                                                               dict]) -> dict:
+        """Perform forward propagation and loss calculation of the detection
+        head on the features of the upstream network.
+
+        Args:
+            x (tuple[Tensor]): Features from the upstream network, each is
+                a 4D-tensor.
+            batch_data_samples (List[:obj:`DetDataSample`], dict): The Data
+                Samples. It usually includes information such as
+                `gt_instance`, `gt_panoptic_seg` and `gt_sem_seg`.
+
+        Returns:
+            dict: A dictionary of loss components.
+        """
+
+        if isinstance(batch_data_samples, list):
+            # TODO: support non-fast version ins segmention
+            raise NotImplementedError
+        else:
+            outs = self(x)
+            # Fast version
+            loss_inputs = outs + (batch_data_samples['bboxes_labels'],
+                                  batch_data_samples['masks'],
+                                  batch_data_samples['img_metas'])
+            losses = self.loss_by_feat(*loss_inputs)
+
+        return losses
+
+    def loss_by_feat(
+            self,
+            cls_scores: Sequence[Tensor],
+            bbox_preds: Sequence[Tensor],
+            objectnesses: Sequence[Tensor],
+            coeff_preds: Sequence[Tensor],
+            proto_preds: Tensor,
+            batch_gt_instances: Sequence[InstanceData],
+            batch_gt_masks: Sequence[Tensor],
+            batch_img_metas: Sequence[dict],
+            batch_gt_instances_ignore: OptInstanceList = None) -> dict:
+        """Calculate the loss based on the features extracted by the detection
+        head.
+
+        Args:
+            cls_scores (Sequence[Tensor]): Box scores for each scale level,
+                each is a 4D-tensor, the channel number is
+                num_priors * num_classes.
+            bbox_preds (Sequence[Tensor]): Box energies / deltas for each scale
+                level, each is a 4D-tensor, the channel number is
+                num_priors * 4.
+            objectnesses (Sequence[Tensor]): Score factor for
+                all scale level, each is a 4D-tensor, has shape
+                (batch_size, 1, H, W).
+            coeff_preds (Sequence[Tensor]): Mask coefficient for each scale
+                level, each is a 4D-tensor, the channel number is
+                num_priors * mask_channels.
+            proto_preds (Tensor): Mask prototype features extracted from the
+                mask head, has shape (batch_size, mask_channels, H, W).
+            batch_gt_instances (Sequence[InstanceData]): Batch of
+                gt_instance. It usually includes ``bboxes`` and ``labels``
+                attributes.
+            batch_gt_masks (Sequence[Tensor]): Batch of gt_mask.
+            batch_img_metas (Sequence[dict]): Meta information of each image,
+                e.g., image size, scaling factor, etc.
+            batch_gt_instances_ignore (list[:obj:`InstanceData`], optional):
+                Batch of gt_instances_ignore. It includes ``bboxes`` attribute
+                data that is ignored during training and testing.
+                Defaults to None.
+        Returns:
+            dict[str, Tensor]: A dictionary of losses.
+        """
+        # 1. Convert gt to norm format
+        batch_targets_normed = self._convert_gt_to_norm_format(
+            batch_gt_instances, batch_img_metas)
+
+        device = cls_scores[0].device
+        loss_cls = torch.zeros(1, device=device)
+        loss_box = torch.zeros(1, device=device)
+        loss_obj = torch.zeros(1, device=device)
+        loss_mask = torch.zeros(1, device=device)
+        scaled_factor = torch.ones(8, device=device)
+
+        for i in range(self.num_levels):
+            batch_size, _, h, w = bbox_preds[i].shape
+            target_obj = torch.zeros_like(objectnesses[i])
+
+            # empty gt bboxes
+            if batch_targets_normed.shape[1] == 0:
+                loss_box += bbox_preds[i].sum() * 0
+                loss_cls += cls_scores[i].sum() * 0
+                loss_obj += self.loss_obj(
+                    objectnesses[i], target_obj) * self.obj_level_weights[i]
+                loss_mask += coeff_preds[i].sum() * 0
+                continue
+
+            priors_base_sizes_i = self.priors_base_sizes[i]
+            # feature map scale whwh
+            scaled_factor[2:6] = torch.tensor(
+                bbox_preds[i].shape)[[3, 2, 3, 2]]
+            # Scale batch_targets from range 0-1 to range 0-features_maps size.
+            # (num_base_priors, num_bboxes, 8)
+            batch_targets_scaled = batch_targets_normed * scaled_factor
+
+            # 2. Shape match
+            wh_ratio = batch_targets_scaled[...,
+                                            4:6] / priors_base_sizes_i[:, None]
+            match_inds = torch.max(
+                wh_ratio, 1 / wh_ratio).max(2)[0] < self.prior_match_thr
+            batch_targets_scaled = batch_targets_scaled[match_inds]
+
+            # no gt bbox matches anchor
+            if batch_targets_scaled.shape[0] == 0:
+                loss_box += bbox_preds[i].sum() * 0
+                loss_cls += cls_scores[i].sum() * 0
+                loss_obj += self.loss_obj(
+                    objectnesses[i], target_obj) * self.obj_level_weights[i]
+                loss_mask += coeff_preds[i].sum() * 0
+                continue
+
+            # 3. Positive samples with additional neighbors
+
+            # check the left, up, right, bottom sides of the
+            # targets grid, and determine whether assigned
+            # them as positive samples as well.
+            batch_targets_cxcy = batch_targets_scaled[:, 2:4]
+            grid_xy = scaled_factor[[2, 3]] - batch_targets_cxcy
+            left, up = ((batch_targets_cxcy % 1 < self.near_neighbor_thr) &
+                        (batch_targets_cxcy > 1)).T
+            right, bottom = ((grid_xy % 1 < self.near_neighbor_thr) &
+                             (grid_xy > 1)).T
+            offset_inds = torch.stack(
+                (torch.ones_like(left), left, up, right, bottom))
+
+            batch_targets_scaled = batch_targets_scaled.repeat(
+                (5, 1, 1))[offset_inds]
+            retained_offsets = self.grid_offset.repeat(1, offset_inds.shape[1],
+                                                       1)[offset_inds]
+
+            # prepare pred results and positive sample indexes to
+            # calculate class loss and bbox lo
+            _chunk_targets = batch_targets_scaled.chunk(4, 1)
+            img_class_inds, grid_xy, grid_wh,\
+                priors_targets_inds = _chunk_targets
+            (priors_inds, targets_inds) = priors_targets_inds.long().T
+            (img_inds, class_inds) = img_class_inds.long().T
+
+            grid_xy_long = (grid_xy -
+                            retained_offsets * self.near_neighbor_thr).long()
+            grid_x_inds, grid_y_inds = grid_xy_long.T
+            bboxes_targets = torch.cat((grid_xy - grid_xy_long, grid_wh), 1)
+
+            # 4. Calculate loss
+            # bbox loss
+            retained_bbox_pred = bbox_preds[i].reshape(
+                batch_size, self.num_base_priors, -1, h,
+                w)[img_inds, priors_inds, :, grid_y_inds, grid_x_inds]
+            priors_base_sizes_i = priors_base_sizes_i[priors_inds]
+            decoded_bbox_pred = self._decode_bbox_to_xywh(
+                retained_bbox_pred, priors_base_sizes_i)
+            loss_box_i, iou = self.loss_bbox(decoded_bbox_pred, bboxes_targets)
+            loss_box += loss_box_i
+
+            # obj loss
+            iou = iou.detach().clamp(0)
+            target_obj[img_inds, priors_inds, grid_y_inds,
+                       grid_x_inds] = iou.type(target_obj.dtype)
+            loss_obj += self.loss_obj(objectnesses[i],
+                                      target_obj) * self.obj_level_weights[i]
+
+            # cls loss
+            if self.num_classes > 1:
+                pred_cls_scores = cls_scores[i].reshape(
+                    batch_size, self.num_base_priors, -1, h,
+                    w)[img_inds, priors_inds, :, grid_y_inds, grid_x_inds]
+
+                target_class = torch.full_like(pred_cls_scores, 0.)
+                target_class[range(batch_targets_scaled.shape[0]),
+                             class_inds] = 1.
+                loss_cls += self.loss_cls(pred_cls_scores, target_class)
+            else:
+                loss_cls += cls_scores[i].sum() * 0
+
+            # mask regression
+            retained_coeff_preds = coeff_preds[i].reshape(
+                batch_size, self.num_base_priors, -1, h,
+                w)[img_inds, priors_inds, :, grid_y_inds, grid_x_inds]
+
+            _, c, mask_h, mask_w = proto_preds.shape
+            if batch_gt_masks.shape[-2:] != (mask_h, mask_w):
+                batch_gt_masks = F.interpolate(
+                    batch_gt_masks[None], (mask_h, mask_w), mode='nearest')[0]
+
+            xywh_normed = batch_targets_scaled[:, 2:6] / scaled_factor[2:6]
+            area_normed = xywh_normed[:, 2:].prod(1)
+            xywh_scaled = xywh_normed * torch.tensor(
+                proto_preds.shape, device=device)[[3, 2, 3, 2]]
+            xyxy_scaled = bbox_cxcywh_to_xyxy(xywh_scaled)
+
+            for bs in range(batch_size):
+                match_inds = (img_inds == bs)  # matching index
+                if not match_inds.any():
+                    continue
+
+                if self.mask_overlap:
+                    mask_gti = torch.where(
+                        batch_gt_masks[bs][None] ==
+                        targets_inds[match_inds].view(-1, 1, 1), 1.0, 0.0)
+                else:
+                    mask_gti = batch_gt_masks[targets_inds][match_inds]
+
+                mask_preds = (retained_coeff_preds[match_inds]
+                              @ proto_preds[bs].view(c, -1)).view(
+                                  -1, mask_h, mask_w)
+                loss_mask_full = self.loss_mask(mask_preds, mask_gti)
+                loss_mask += (
+                    self.crop_mask(loss_mask_full[None],
+                                   xyxy_scaled[match_inds]).mean(dim=(2, 3)) /
+                    area_normed[match_inds]).mean()
+
+        _, world_size = get_dist_info()
+        return dict(
+            loss_cls=loss_cls * batch_size * world_size,
+            loss_obj=loss_obj * batch_size * world_size,
+            loss_bbox=loss_box * batch_size * world_size,
+            loss_mask=loss_mask * self.loss_mask_weight * world_size)
+
+    def _convert_gt_to_norm_format(self,
+                                   batch_gt_instances: Sequence[InstanceData],
+                                   batch_img_metas: Sequence[dict]) -> Tensor:
+        """Add target_inds for instance segmentation."""
+        batch_targets_normed = super()._convert_gt_to_norm_format(
+            batch_gt_instances, batch_img_metas)
+
+        if self.mask_overlap:
+            batch_size = len(batch_img_metas)
+            target_inds = []
+            for i in range(batch_size):
+                # find number of targets of each image
+                num_gts = (batch_gt_instances[:, 0] == i).sum()
+                # (num_anchor, num_gts)
+                target_inds.append(
+                    torch.arange(num_gts, device=batch_gt_instances.device).
+                    float().view(1, num_gts).repeat(self.num_base_priors, 1) +
+                    1)
+            target_inds = torch.cat(target_inds, 1)
+        else:
+            num_gts = batch_gt_instances.shape[0]
+            target_inds = torch.arange(
+                num_gts, device=batch_gt_instances.device).float().view(
+                    1, num_gts).repeat(self.num_base_priors, 1)
+        batch_targets_normed = torch.cat(
+            [batch_targets_normed, target_inds[..., None]], 2)
+        return batch_targets_normed
+
+    def predict_by_feat(self,
+                        cls_scores: List[Tensor],
+                        bbox_preds: List[Tensor],
+                        objectnesses: Optional[List[Tensor]] = None,
+                        coeff_preds: Optional[List[Tensor]] = None,
+                        proto_preds: Optional[Tensor] = None,
+                        batch_img_metas: Optional[List[dict]] = None,
+                        cfg: Optional[ConfigDict] = None,
+                        rescale: bool = True,
+                        with_nms: bool = True) -> List[InstanceData]:
+        """Transform a batch of output features extracted from the head into
+        bbox results.
+        Note: When score_factors is not None, the cls_scores are
+        usually multiplied by it then obtain the real score used in NMS.
+        Args:
+            cls_scores (list[Tensor]): Classification scores for all
+                scale levels, each is a 4D-tensor, has shape
+                (batch_size, num_priors * num_classes, H, W).
+            bbox_preds (list[Tensor]): Box energies / deltas for all
+                scale levels, each is a 4D-tensor, has shape
+                (batch_size, num_priors * 4, H, W).
+            objectnesses (list[Tensor], Optional): Score factor for
+                all scale level, each is a 4D-tensor, has shape
+                (batch_size, 1, H, W).
+            coeff_preds (list[Tensor]): Mask coefficients predictions
+                for all scale levels, each is a 4D-tensor, has shape
+                (batch_size, mask_channels, H, W).
+            proto_preds (Tensor): Mask prototype features extracted from the
+                mask head, has shape (batch_size, mask_channels, H, W).
+            batch_img_metas (list[dict], Optional): Batch image meta info.
+                Defaults to None.
+            cfg (ConfigDict, optional): Test / postprocessing
+                configuration, if None, test_cfg would be used.
+                Defaults to None.
+            rescale (bool): If True, return boxes in original image space.
+                Defaults to False.
+            with_nms (bool): If True, do nms before return boxes.
+                Defaults to True.
+        Returns:
+            list[:obj:`InstanceData`]: Object detection and instance
+            segmentation results of each image after the post process.
+            Each item usually contains following keys.
+                - scores (Tensor): Classification scores, has a shape
+                  (num_instance, )
+                - labels (Tensor): Labels of bboxes, has a shape
+                  (num_instances, ).
+                - bboxes (Tensor): Has a shape (num_instances, 4),
+                  the last dimension 4 arrange as (x1, y1, x2, y2).
+                - masks (Tensor): Has a shape (num_instances, h, w).
+        """
+        assert len(cls_scores) == len(bbox_preds) == len(coeff_preds)
+        if objectnesses is None:
+            with_objectnesses = False
+        else:
+            with_objectnesses = True
+            assert len(cls_scores) == len(objectnesses)
+
+        cfg = self.test_cfg if cfg is None else cfg
+        cfg = copy.deepcopy(cfg)
+
+        multi_label = cfg.multi_label
+        multi_label &= self.num_classes > 1
+        cfg.multi_label = multi_label
+
+        num_imgs = len(batch_img_metas)
+        featmap_sizes = [cls_score.shape[2:] for cls_score in cls_scores]
+
+        # If the shape does not change, use the previous mlvl_priors
+        if featmap_sizes != self.featmap_sizes:
+            self.mlvl_priors = self.prior_generator.grid_priors(
+                featmap_sizes,
+                dtype=cls_scores[0].dtype,
+                device=cls_scores[0].device)
+            self.featmap_sizes = featmap_sizes
+        flatten_priors = torch.cat(self.mlvl_priors)
+
+        mlvl_strides = [
+            flatten_priors.new_full(
+                (featmap_size.numel() * self.num_base_priors, ), stride) for
+            featmap_size, stride in zip(featmap_sizes, self.featmap_strides)
+        ]
+        flatten_stride = torch.cat(mlvl_strides)
+
+        # flatten cls_scores, bbox_preds and objectness
+        flatten_cls_scores = [
+            cls_score.permute(0, 2, 3, 1).reshape(num_imgs, -1,
+                                                  self.num_classes)
+            for cls_score in cls_scores
+        ]
+        flatten_bbox_preds = [
+            bbox_pred.permute(0, 2, 3, 1).reshape(num_imgs, -1, 4)
+            for bbox_pred in bbox_preds
+        ]
+        flatten_coeff_preds = [
+            coeff_pred.permute(0, 2, 3,
+                               1).reshape(num_imgs, -1,
+                                          self.head_module.mask_channels)
+            for coeff_pred in coeff_preds
+        ]
+
+        flatten_cls_scores = torch.cat(flatten_cls_scores, dim=1).sigmoid()
+        flatten_bbox_preds = torch.cat(flatten_bbox_preds, dim=1)
+        flatten_decoded_bboxes = self.bbox_coder.decode(
+            flatten_priors.unsqueeze(0), flatten_bbox_preds, flatten_stride)
+
+        flatten_coeff_preds = torch.cat(flatten_coeff_preds, dim=1)
+
+        if with_objectnesses:
+            flatten_objectness = [
+                objectness.permute(0, 2, 3, 1).reshape(num_imgs, -1)
+                for objectness in objectnesses
+            ]
+            flatten_objectness = torch.cat(flatten_objectness, dim=1).sigmoid()
+        else:
+            flatten_objectness = [None for _ in range(len(featmap_sizes))]
+
+        results_list = []
+        for (bboxes, scores, objectness, coeffs, mask_proto,
+             img_meta) in zip(flatten_decoded_bboxes, flatten_cls_scores,
+                              flatten_objectness, flatten_coeff_preds,
+                              proto_preds, batch_img_metas):
+            ori_shape = img_meta['ori_shape']
+            batch_input_shape = img_meta['batch_input_shape']
+            input_shape_h, input_shape_w = batch_input_shape
+            if 'pad_param' in img_meta:
+                pad_param = img_meta['pad_param']
+                input_shape_withoutpad = (input_shape_h - pad_param[0] -
+                                          pad_param[1], input_shape_w -
+                                          pad_param[2] - pad_param[3])
+            else:
+                pad_param = None
+                input_shape_withoutpad = batch_input_shape
+            scale_factor = (input_shape_withoutpad[1] / ori_shape[1],
+                            input_shape_withoutpad[0] / ori_shape[0])
+
+            score_thr = cfg.get('score_thr', -1)
+            # yolox_style does not require the following operations
+            if objectness is not None and score_thr > 0 and not cfg.get(
+                    'yolox_style', False):
+                conf_inds = objectness > score_thr
+                bboxes = bboxes[conf_inds, :]
+                scores = scores[conf_inds, :]
+                objectness = objectness[conf_inds]
+                coeffs = coeffs[conf_inds]
+
+            if objectness is not None:
+                # conf = obj_conf * cls_conf
+                scores *= objectness[:, None]
+                # NOTE: Important
+                coeffs *= objectness[:, None]
+
+            if scores.shape[0] == 0:
+                empty_results = InstanceData()
+                empty_results.bboxes = bboxes
+                empty_results.scores = scores[:, 0]
+                empty_results.labels = scores[:, 0].int()
+                h, w = ori_shape[:2] if rescale else img_meta['img_shape'][:2]
+                empty_results.masks = torch.zeros(
+                    size=(0, h, w), dtype=torch.bool, device=bboxes.device)
+                results_list.append(empty_results)
+                continue
+
+            nms_pre = cfg.get('nms_pre', 100000)
+            if cfg.multi_label is False:
+                scores, labels = scores.max(1, keepdim=True)
+                scores, _, keep_idxs, results = filter_scores_and_topk(
+                    scores,
+                    score_thr,
+                    nms_pre,
+                    results=dict(labels=labels[:, 0], coeffs=coeffs))
+                labels = results['labels']
+                coeffs = results['coeffs']
+            else:
+                out = filter_scores_and_topk(
+                    scores, score_thr, nms_pre, results=dict(coeffs=coeffs))
+                scores, labels, keep_idxs, filtered_results = out
+                coeffs = filtered_results['coeffs']
+
+            results = InstanceData(
+                scores=scores,
+                labels=labels,
+                bboxes=bboxes[keep_idxs],
+                coeffs=coeffs)
+
+            if cfg.get('yolox_style', False):
+                # do not need max_per_img
+                cfg.max_per_img = len(results)
+
+            results = self._bbox_post_process(
+                results=results,
+                cfg=cfg,
+                rescale=False,
+                with_nms=with_nms,
+                img_meta=img_meta)
+
+            if len(results.bboxes):
+                masks = self.process_mask(mask_proto, results.coeffs,
+                                          results.bboxes,
+                                          (input_shape_h, input_shape_w), True)
+                if rescale:
+                    if pad_param is not None:
+                        # bbox minus pad param
+                        top_pad, _, left_pad, _ = pad_param
+                        results.bboxes -= results.bboxes.new_tensor(
+                            [left_pad, top_pad, left_pad, top_pad])
+                        # mask crop pad param
+                        top, left = int(top_pad), int(left_pad)
+                        bottom, right = int(input_shape_h -
+                                            top_pad), int(input_shape_w -
+                                                          left_pad)
+                        masks = masks[:, :, top:bottom, left:right]
+                    results.bboxes /= results.bboxes.new_tensor(
+                        scale_factor).repeat((1, 2))
+
+                    fast_test = cfg.get('fast_test', False)
+                    if fast_test:
+                        masks = F.interpolate(
+                            masks,
+                            size=ori_shape,
+                            mode='bilinear',
+                            align_corners=False)
+                        masks = masks.squeeze(0)
+                        masks = masks > cfg.mask_thr_binary
+                    else:
+                        masks.gt_(cfg.mask_thr_binary)
+                        masks = torch.as_tensor(masks, dtype=torch.uint8)
+                        masks = masks[0].permute(1, 2,
+                                                 0).contiguous().cpu().numpy()
+                        masks = mmcv.imresize(masks,
+                                              (ori_shape[1], ori_shape[0]))
+
+                        if len(masks.shape) == 2:
+                            masks = masks[:, :, None]
+                        masks = torch.from_numpy(masks).permute(2, 0, 1)
+
+                results.bboxes[:, 0::2].clamp_(0, ori_shape[1])
+                results.bboxes[:, 1::2].clamp_(0, ori_shape[0])
+
+                results.masks = masks.bool()
+                results_list.append(results)
+            else:
+                h, w = ori_shape[:2] if rescale else img_meta['img_shape'][:2]
+                results.masks = torch.zeros(
+                    size=(0, h, w), dtype=torch.bool, device=bboxes.device)
+                results_list.append(results)
+        return results_list
+
+    def process_mask(self,
+                     mask_proto: Tensor,
+                     mask_coeff_pred: Tensor,
+                     bboxes: Tensor,
+                     shape: Tuple[int, int],
+                     upsample: bool = False) -> Tensor:
+        """Generate mask logits results.
+
+        Args:
+            mask_proto (Tensor): Mask prototype features.
+                Has shape (num_instance, mask_channels).
+            mask_coeff_pred (Tensor): Mask coefficients prediction for
+                single image. Has shape (mask_channels, H, W)
+            bboxes (Tensor): Tensor of the bbox. Has shape (num_instance, 4).
+            shape (Tuple): Batch input shape of image.
+            upsample (bool): Whether upsample masks results to batch input
+                shape. Default to False.
+        Return:
+            Tensor: Instance segmentation masks for each instance.
+                Has shape (num_instance, H, W).
+        """
+        c, mh, mw = mask_proto.shape  # CHW
+        masks = (
+            mask_coeff_pred @ mask_proto.float().view(c, -1)).sigmoid().view(
+                -1, mh, mw)[None]
+        if upsample:
+            masks = F.interpolate(
+                masks, shape, mode='bilinear', align_corners=False)  # 1CHW
+        masks = self.crop_mask(masks, bboxes)
+        return masks
+
+    def crop_mask(self, masks: Tensor, boxes: Tensor) -> Tensor:
+        """Crop mask by the bounding box.
+
+        Args:
+          masks (Tensor): Predicted mask results. Has shape
+              (1, num_instance, H, W).
+          boxes (Tensor): Tensor of the bbox. Has shape (num_instance, 4).
+        Returns:
+          (torch.Tensor): The masks are being cropped to the bounding box.
+        """
+        _, n, h, w = masks.shape
+        x1, y1, x2, y2 = torch.chunk(boxes[:, :, None], 4, 1)
+        r = torch.arange(
+            w, device=masks.device,
+            dtype=x1.dtype)[None, None, None, :]  # rows shape(1, 1, w, 1)
+        c = torch.arange(
+            h, device=masks.device,
+            dtype=x1.dtype)[None, None, :, None]  # cols shape(1, h, 1, 1)
+
+        return masks * ((r >= x1) * (r < x2) * (c >= y1) * (c < y2))
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/models/dense_heads/yolov6_head.py b/mmdetection_practice/third_party/mmyolo/mmyolo/models/dense_heads/yolov6_head.py
new file mode 100644
index 0000000..3b01133
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/models/dense_heads/yolov6_head.py
@@ -0,0 +1,396 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from typing import List, Sequence, Tuple, Union
+
+import torch
+import torch.nn as nn
+from mmcv.cnn import ConvModule
+from mmdet.models.utils import multi_apply
+from mmdet.utils import (ConfigType, OptConfigType, OptInstanceList,
+                         OptMultiConfig)
+from mmengine import MessageHub
+from mmengine.dist import get_dist_info
+from mmengine.model import BaseModule, bias_init_with_prob
+from mmengine.structures import InstanceData
+from torch import Tensor
+
+from mmyolo.registry import MODELS, TASK_UTILS
+from ..utils import gt_instances_preprocess
+from .yolov5_head import YOLOv5Head
+
+
+@MODELS.register_module()
+class YOLOv6HeadModule(BaseModule):
+    """YOLOv6Head head module used in `YOLOv6.
+
+    <https://arxiv.org/pdf/2209.02976>`_.
+
+    Args:
+        num_classes (int): Number of categories excluding the background
+            category.
+        in_channels (Union[int, Sequence]): Number of channels in the input
+            feature map.
+        widen_factor (float): Width multiplier, multiply number of
+            channels in each layer by this amount. Defaults to 1.0.
+        num_base_priors: (int): The number of priors (points) at a point
+            on the feature grid.
+        featmap_strides (Sequence[int]): Downsample factor of each feature map.
+             Defaults to [8, 16, 32].
+            None, otherwise False. Defaults to "auto".
+        norm_cfg (:obj:`ConfigDict` or dict): Config dict for normalization
+            layer. Defaults to dict(type='BN', momentum=0.03, eps=0.001).
+        act_cfg (:obj:`ConfigDict` or dict): Config dict for activation layer.
+            Defaults to None.
+        init_cfg (:obj:`ConfigDict` or list[:obj:`ConfigDict`] or dict or
+            list[dict], optional): Initialization config dict.
+            Defaults to None.
+    """
+
+    def __init__(self,
+                 num_classes: int,
+                 in_channels: Union[int, Sequence],
+                 widen_factor: float = 1.0,
+                 num_base_priors: int = 1,
+                 reg_max=0,
+                 featmap_strides: Sequence[int] = (8, 16, 32),
+                 norm_cfg: ConfigType = dict(
+                     type='BN', momentum=0.03, eps=0.001),
+                 act_cfg: ConfigType = dict(type='SiLU', inplace=True),
+                 init_cfg: OptMultiConfig = None):
+        super().__init__(init_cfg=init_cfg)
+
+        self.num_classes = num_classes
+        self.featmap_strides = featmap_strides
+        self.num_levels = len(self.featmap_strides)
+        self.num_base_priors = num_base_priors
+        self.reg_max = reg_max
+        self.norm_cfg = norm_cfg
+        self.act_cfg = act_cfg
+
+        if isinstance(in_channels, int):
+            self.in_channels = [int(in_channels * widen_factor)
+                                ] * self.num_levels
+        else:
+            self.in_channels = [int(i * widen_factor) for i in in_channels]
+
+        self._init_layers()
+
+    def _init_layers(self):
+        """initialize conv layers in YOLOv6 head."""
+        # Init decouple head
+        self.cls_convs = nn.ModuleList()
+        self.reg_convs = nn.ModuleList()
+        self.cls_preds = nn.ModuleList()
+        self.reg_preds = nn.ModuleList()
+        self.stems = nn.ModuleList()
+
+        if self.reg_max > 1:
+            proj = torch.arange(
+                self.reg_max + self.num_base_priors, dtype=torch.float)
+            self.register_buffer('proj', proj, persistent=False)
+
+        for i in range(self.num_levels):
+            self.stems.append(
+                ConvModule(
+                    in_channels=self.in_channels[i],
+                    out_channels=self.in_channels[i],
+                    kernel_size=1,
+                    stride=1,
+                    padding=1 // 2,
+                    norm_cfg=self.norm_cfg,
+                    act_cfg=self.act_cfg))
+            self.cls_convs.append(
+                ConvModule(
+                    in_channels=self.in_channels[i],
+                    out_channels=self.in_channels[i],
+                    kernel_size=3,
+                    stride=1,
+                    padding=3 // 2,
+                    norm_cfg=self.norm_cfg,
+                    act_cfg=self.act_cfg))
+            self.reg_convs.append(
+                ConvModule(
+                    in_channels=self.in_channels[i],
+                    out_channels=self.in_channels[i],
+                    kernel_size=3,
+                    stride=1,
+                    padding=3 // 2,
+                    norm_cfg=self.norm_cfg,
+                    act_cfg=self.act_cfg))
+            self.cls_preds.append(
+                nn.Conv2d(
+                    in_channels=self.in_channels[i],
+                    out_channels=self.num_base_priors * self.num_classes,
+                    kernel_size=1))
+            self.reg_preds.append(
+                nn.Conv2d(
+                    in_channels=self.in_channels[i],
+                    out_channels=(self.num_base_priors + self.reg_max) * 4,
+                    kernel_size=1))
+
+    def init_weights(self):
+        super().init_weights()
+        bias_init = bias_init_with_prob(0.01)
+        for conv in self.cls_preds:
+            conv.bias.data.fill_(bias_init)
+            conv.weight.data.fill_(0.)
+
+        for conv in self.reg_preds:
+            conv.bias.data.fill_(1.0)
+            conv.weight.data.fill_(0.)
+
+    def forward(self, x: Tuple[Tensor]) -> Tuple[List]:
+        """Forward features from the upstream network.
+
+        Args:
+            x (Tuple[Tensor]): Features from the upstream network, each is
+                a 4D-tensor.
+        Returns:
+            Tuple[List]: A tuple of multi-level classification scores, bbox
+            predictions.
+        """
+        assert len(x) == self.num_levels
+        return multi_apply(self.forward_single, x, self.stems, self.cls_convs,
+                           self.cls_preds, self.reg_convs, self.reg_preds)
+
+    def forward_single(self, x: Tensor, stem: nn.Module, cls_conv: nn.Module,
+                       cls_pred: nn.Module, reg_conv: nn.Module,
+                       reg_pred: nn.Module) -> Tuple[Tensor, Tensor]:
+        """Forward feature of a single scale level."""
+        b, _, h, w = x.shape
+        y = stem(x)
+        cls_x = y
+        reg_x = y
+        cls_feat = cls_conv(cls_x)
+        reg_feat = reg_conv(reg_x)
+
+        cls_score = cls_pred(cls_feat)
+        bbox_dist_preds = reg_pred(reg_feat)
+
+        if self.reg_max > 1:
+            bbox_dist_preds = bbox_dist_preds.reshape(
+                [-1, 4, self.reg_max + self.num_base_priors,
+                 h * w]).permute(0, 3, 1, 2)
+
+            # TODO: The get_flops script cannot handle the situation of
+            #  matmul, and needs to be fixed later
+            # bbox_preds = bbox_dist_preds.softmax(3).matmul(self.proj)
+            bbox_preds = bbox_dist_preds.softmax(3).matmul(
+                self.proj.view([-1, 1])).squeeze(-1)
+            bbox_preds = bbox_preds.transpose(1, 2).reshape(b, -1, h, w)
+        else:
+            bbox_preds = bbox_dist_preds
+
+        if self.training:
+            return cls_score, bbox_preds, bbox_dist_preds
+        else:
+            return cls_score, bbox_preds
+
+
+@MODELS.register_module()
+class YOLOv6Head(YOLOv5Head):
+    """YOLOv6Head head used in `YOLOv6 <https://arxiv.org/pdf/2209.02976>`_.
+
+    Args:
+        head_module(ConfigType): Base module used for YOLOv6Head
+        prior_generator(dict): Points generator feature maps
+            in 2D points-based detectors.
+        loss_cls (:obj:`ConfigDict` or dict): Config of classification loss.
+        loss_bbox (:obj:`ConfigDict` or dict): Config of localization loss.
+        train_cfg (:obj:`ConfigDict` or dict, optional): Training config of
+            anchor head. Defaults to None.
+        test_cfg (:obj:`ConfigDict` or dict, optional): Testing config of
+            anchor head. Defaults to None.
+        init_cfg (:obj:`ConfigDict` or list[:obj:`ConfigDict`] or dict or
+            list[dict], optional): Initialization config dict.
+            Defaults to None.
+    """
+
+    def __init__(self,
+                 head_module: ConfigType,
+                 prior_generator: ConfigType = dict(
+                     type='mmdet.MlvlPointGenerator',
+                     offset=0.5,
+                     strides=[8, 16, 32]),
+                 bbox_coder: ConfigType = dict(type='DistancePointBBoxCoder'),
+                 loss_cls: ConfigType = dict(
+                     type='mmdet.VarifocalLoss',
+                     use_sigmoid=True,
+                     alpha=0.75,
+                     gamma=2.0,
+                     iou_weighted=True,
+                     reduction='sum',
+                     loss_weight=1.0),
+                 loss_bbox: ConfigType = dict(
+                     type='IoULoss',
+                     iou_mode='giou',
+                     bbox_format='xyxy',
+                     reduction='mean',
+                     loss_weight=2.5,
+                     return_iou=False),
+                 train_cfg: OptConfigType = None,
+                 test_cfg: OptConfigType = None,
+                 init_cfg: OptMultiConfig = None):
+        super().__init__(
+            head_module=head_module,
+            prior_generator=prior_generator,
+            bbox_coder=bbox_coder,
+            loss_cls=loss_cls,
+            loss_bbox=loss_bbox,
+            train_cfg=train_cfg,
+            test_cfg=test_cfg,
+            init_cfg=init_cfg)
+        # yolov6 doesn't need loss_obj
+        self.loss_obj = None
+
+    def special_init(self):
+        """Since YOLO series algorithms will inherit from YOLOv5Head, but
+        different algorithms have special initialization process.
+
+        The special_init function is designed to deal with this situation.
+        """
+        if self.train_cfg:
+            self.initial_epoch = self.train_cfg['initial_epoch']
+            self.initial_assigner = TASK_UTILS.build(
+                self.train_cfg.initial_assigner)
+            self.assigner = TASK_UTILS.build(self.train_cfg.assigner)
+
+            # Add common attributes to reduce calculation
+            self.featmap_sizes_train = None
+            self.num_level_priors = None
+            self.flatten_priors_train = None
+            self.stride_tensor = None
+
+    def loss_by_feat(
+            self,
+            cls_scores: Sequence[Tensor],
+            bbox_preds: Sequence[Tensor],
+            bbox_dist_preds: Sequence[Tensor],
+            batch_gt_instances: Sequence[InstanceData],
+            batch_img_metas: Sequence[dict],
+            batch_gt_instances_ignore: OptInstanceList = None) -> dict:
+        """Calculate the loss based on the features extracted by the detection
+        head.
+
+        Args:
+            cls_scores (Sequence[Tensor]): Box scores for each scale level,
+                each is a 4D-tensor, the channel number is
+                num_priors * num_classes.
+            bbox_preds (Sequence[Tensor]): Box energies / deltas for each scale
+                level, each is a 4D-tensor, the channel number is
+                num_priors * 4.
+            batch_gt_instances (list[:obj:`InstanceData`]): Batch of
+                gt_instance. It usually includes ``bboxes`` and ``labels``
+                attributes.
+            batch_img_metas (list[dict]): Meta information of each image, e.g.,
+                image size, scaling factor, etc.
+            batch_gt_instances_ignore (list[:obj:`InstanceData`], optional):
+                Batch of gt_instances_ignore. It includes ``bboxes`` attribute
+                data that is ignored during training and testing.
+                Defaults to None.
+        Returns:
+            dict[str, Tensor]: A dictionary of losses.
+        """
+
+        # get epoch information from message hub
+        message_hub = MessageHub.get_current_instance()
+        current_epoch = message_hub.get_info('epoch')
+
+        num_imgs = len(batch_img_metas)
+        if batch_gt_instances_ignore is None:
+            batch_gt_instances_ignore = [None] * num_imgs
+
+        current_featmap_sizes = [
+            cls_score.shape[2:] for cls_score in cls_scores
+        ]
+        # If the shape does not equal, generate new one
+        if current_featmap_sizes != self.featmap_sizes_train:
+            self.featmap_sizes_train = current_featmap_sizes
+
+            mlvl_priors_with_stride = self.prior_generator.grid_priors(
+                self.featmap_sizes_train,
+                dtype=cls_scores[0].dtype,
+                device=cls_scores[0].device,
+                with_stride=True)
+
+            self.num_level_priors = [len(n) for n in mlvl_priors_with_stride]
+            self.flatten_priors_train = torch.cat(
+                mlvl_priors_with_stride, dim=0)
+            self.stride_tensor = self.flatten_priors_train[..., [2]]
+
+        # gt info
+        gt_info = gt_instances_preprocess(batch_gt_instances, num_imgs)
+        gt_labels = gt_info[:, :, :1]
+        gt_bboxes = gt_info[:, :, 1:]  # xyxy
+        pad_bbox_flag = (gt_bboxes.sum(-1, keepdim=True) > 0).float()
+
+        # pred info
+        flatten_cls_preds = [
+            cls_pred.permute(0, 2, 3, 1).reshape(num_imgs, -1,
+                                                 self.num_classes)
+            for cls_pred in cls_scores
+        ]
+
+        flatten_pred_bboxes = [
+            bbox_pred.permute(0, 2, 3, 1).reshape(num_imgs, -1, 4)
+            for bbox_pred in bbox_preds
+        ]
+
+        flatten_cls_preds = torch.cat(flatten_cls_preds, dim=1)
+        flatten_pred_bboxes = torch.cat(flatten_pred_bboxes, dim=1)
+        flatten_pred_bboxes = self.bbox_coder.decode(
+            self.flatten_priors_train[..., :2], flatten_pred_bboxes,
+            self.stride_tensor[:, 0])
+        pred_scores = torch.sigmoid(flatten_cls_preds)
+
+        if current_epoch < self.initial_epoch:
+            assigned_result = self.initial_assigner(
+                flatten_pred_bboxes.detach(), self.flatten_priors_train,
+                self.num_level_priors, gt_labels, gt_bboxes, pad_bbox_flag)
+        else:
+            assigned_result = self.assigner(flatten_pred_bboxes.detach(),
+                                            pred_scores.detach(),
+                                            self.flatten_priors_train,
+                                            gt_labels, gt_bboxes,
+                                            pad_bbox_flag)
+
+        assigned_bboxes = assigned_result['assigned_bboxes']
+        assigned_scores = assigned_result['assigned_scores']
+        fg_mask_pre_prior = assigned_result['fg_mask_pre_prior']
+
+        # cls loss
+        with torch.cuda.amp.autocast(enabled=False):
+            loss_cls = self.loss_cls(flatten_cls_preds, assigned_scores)
+
+        # rescale bbox
+        assigned_bboxes /= self.stride_tensor
+        flatten_pred_bboxes /= self.stride_tensor
+
+        # TODO: Add all_reduce makes training more stable
+        assigned_scores_sum = assigned_scores.sum()
+        if assigned_scores_sum > 0:
+            loss_cls /= assigned_scores_sum
+
+        # select positive samples mask
+        num_pos = fg_mask_pre_prior.sum()
+        if num_pos > 0:
+            # when num_pos > 0, assigned_scores_sum will >0, so the loss_bbox
+            # will not report an error
+            # iou loss
+            prior_bbox_mask = fg_mask_pre_prior.unsqueeze(-1).repeat([1, 1, 4])
+            pred_bboxes_pos = torch.masked_select(
+                flatten_pred_bboxes, prior_bbox_mask).reshape([-1, 4])
+            assigned_bboxes_pos = torch.masked_select(
+                assigned_bboxes, prior_bbox_mask).reshape([-1, 4])
+            bbox_weight = torch.masked_select(
+                assigned_scores.sum(-1), fg_mask_pre_prior).unsqueeze(-1)
+            loss_bbox = self.loss_bbox(
+                pred_bboxes_pos,
+                assigned_bboxes_pos,
+                weight=bbox_weight,
+                avg_factor=assigned_scores_sum)
+        else:
+            loss_bbox = flatten_pred_bboxes.sum() * 0
+
+        _, world_size = get_dist_info()
+        return dict(
+            loss_cls=loss_cls * world_size, loss_bbox=loss_bbox * world_size)
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/models/dense_heads/yolov7_head.py b/mmdetection_practice/third_party/mmyolo/mmyolo/models/dense_heads/yolov7_head.py
new file mode 100644
index 0000000..124883c
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/models/dense_heads/yolov7_head.py
@@ -0,0 +1,404 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+import math
+from typing import List, Optional, Sequence, Tuple, Union
+
+import torch
+import torch.nn as nn
+from mmcv.cnn import ConvModule
+from mmdet.models.utils import multi_apply
+from mmdet.utils import ConfigType, OptInstanceList
+from mmengine.dist import get_dist_info
+from mmengine.structures import InstanceData
+from torch import Tensor
+
+from mmyolo.registry import MODELS
+from ..layers import ImplicitA, ImplicitM
+from ..task_modules.assigners.batch_yolov7_assigner import BatchYOLOv7Assigner
+from .yolov5_head import YOLOv5Head, YOLOv5HeadModule
+
+
+@MODELS.register_module()
+class YOLOv7HeadModule(YOLOv5HeadModule):
+    """YOLOv7Head head module used in YOLOv7."""
+
+    def _init_layers(self):
+        """initialize conv layers in YOLOv7 head."""
+        self.convs_pred = nn.ModuleList()
+        for i in range(self.num_levels):
+            conv_pred = nn.Sequential(
+                ImplicitA(self.in_channels[i]),
+                nn.Conv2d(self.in_channels[i],
+                          self.num_base_priors * self.num_out_attrib, 1),
+                ImplicitM(self.num_base_priors * self.num_out_attrib),
+            )
+            self.convs_pred.append(conv_pred)
+
+    def init_weights(self):
+        """Initialize the bias of YOLOv7 head."""
+        super(YOLOv5HeadModule, self).init_weights()
+        for mi, s in zip(self.convs_pred, self.featmap_strides):  # from
+            mi = mi[1]  # nn.Conv2d
+
+            b = mi.bias.data.view(self.num_base_priors, -1)
+            # obj (8 objects per 640 image)
+            b.data[:, 4] += math.log(8 / (640 / s)**2)
+            b.data[:, 5:] += math.log(0.6 / (self.num_classes - 0.99))
+
+            mi.bias.data = b.view(-1)
+
+
+@MODELS.register_module()
+class YOLOv7p6HeadModule(YOLOv5HeadModule):
+    """YOLOv7Head head module used in YOLOv7."""
+
+    def __init__(self,
+                 *args,
+                 main_out_channels: Sequence[int] = [256, 512, 768, 1024],
+                 aux_out_channels: Sequence[int] = [320, 640, 960, 1280],
+                 use_aux: bool = True,
+                 norm_cfg: ConfigType = dict(
+                     type='BN', momentum=0.03, eps=0.001),
+                 act_cfg: ConfigType = dict(type='SiLU', inplace=True),
+                 **kwargs):
+        self.main_out_channels = main_out_channels
+        self.aux_out_channels = aux_out_channels
+        self.use_aux = use_aux
+        self.norm_cfg = norm_cfg
+        self.act_cfg = act_cfg
+        super().__init__(*args, **kwargs)
+
+    def _init_layers(self):
+        """initialize conv layers in YOLOv7 head."""
+        self.main_convs_pred = nn.ModuleList()
+        for i in range(self.num_levels):
+            conv_pred = nn.Sequential(
+                ConvModule(
+                    self.in_channels[i],
+                    self.main_out_channels[i],
+                    3,
+                    padding=1,
+                    norm_cfg=self.norm_cfg,
+                    act_cfg=self.act_cfg),
+                ImplicitA(self.main_out_channels[i]),
+                nn.Conv2d(self.main_out_channels[i],
+                          self.num_base_priors * self.num_out_attrib, 1),
+                ImplicitM(self.num_base_priors * self.num_out_attrib),
+            )
+            self.main_convs_pred.append(conv_pred)
+
+        if self.use_aux:
+            self.aux_convs_pred = nn.ModuleList()
+            for i in range(self.num_levels):
+                aux_pred = nn.Sequential(
+                    ConvModule(
+                        self.in_channels[i],
+                        self.aux_out_channels[i],
+                        3,
+                        padding=1,
+                        norm_cfg=self.norm_cfg,
+                        act_cfg=self.act_cfg),
+                    nn.Conv2d(self.aux_out_channels[i],
+                              self.num_base_priors * self.num_out_attrib, 1))
+                self.aux_convs_pred.append(aux_pred)
+        else:
+            self.aux_convs_pred = [None] * len(self.main_convs_pred)
+
+    def init_weights(self):
+        """Initialize the bias of YOLOv5 head."""
+        super(YOLOv5HeadModule, self).init_weights()
+        for mi, aux, s in zip(self.main_convs_pred, self.aux_convs_pred,
+                              self.featmap_strides):  # from
+            mi = mi[2]  # nn.Conv2d
+            b = mi.bias.data.view(3, -1)
+            # obj (8 objects per 640 image)
+            b.data[:, 4] += math.log(8 / (640 / s)**2)
+            b.data[:, 5:] += math.log(0.6 / (self.num_classes - 0.99))
+            mi.bias.data = b.view(-1)
+
+            if self.use_aux:
+                aux = aux[1]  # nn.Conv2d
+                b = aux.bias.data.view(3, -1)
+                # obj (8 objects per 640 image)
+                b.data[:, 4] += math.log(8 / (640 / s)**2)
+                b.data[:, 5:] += math.log(0.6 / (self.num_classes - 0.99))
+                mi.bias.data = b.view(-1)
+
+    def forward(self, x: Tuple[Tensor]) -> Tuple[List]:
+        """Forward features from the upstream network.
+
+        Args:
+            x (Tuple[Tensor]): Features from the upstream network, each is
+                a 4D-tensor.
+        Returns:
+            Tuple[List]: A tuple of multi-level classification scores, bbox
+            predictions, and objectnesses.
+        """
+        assert len(x) == self.num_levels
+        return multi_apply(self.forward_single, x, self.main_convs_pred,
+                           self.aux_convs_pred)
+
+    def forward_single(self, x: Tensor, convs: nn.Module,
+                       aux_convs: Optional[nn.Module]) \
+            -> Tuple[Union[Tensor, List], Union[Tensor, List],
+                     Union[Tensor, List]]:
+        """Forward feature of a single scale level."""
+
+        pred_map = convs(x)
+        bs, _, ny, nx = pred_map.shape
+        pred_map = pred_map.view(bs, self.num_base_priors, self.num_out_attrib,
+                                 ny, nx)
+
+        cls_score = pred_map[:, :, 5:, ...].reshape(bs, -1, ny, nx)
+        bbox_pred = pred_map[:, :, :4, ...].reshape(bs, -1, ny, nx)
+        objectness = pred_map[:, :, 4:5, ...].reshape(bs, -1, ny, nx)
+
+        if not self.training or not self.use_aux:
+            return cls_score, bbox_pred, objectness
+        else:
+            aux_pred_map = aux_convs(x)
+            aux_pred_map = aux_pred_map.view(bs, self.num_base_priors,
+                                             self.num_out_attrib, ny, nx)
+            aux_cls_score = aux_pred_map[:, :, 5:, ...].reshape(bs, -1, ny, nx)
+            aux_bbox_pred = aux_pred_map[:, :, :4, ...].reshape(bs, -1, ny, nx)
+            aux_objectness = aux_pred_map[:, :, 4:5,
+                                          ...].reshape(bs, -1, ny, nx)
+
+            return [cls_score,
+                    aux_cls_score], [bbox_pred, aux_bbox_pred
+                                     ], [objectness, aux_objectness]
+
+
+@MODELS.register_module()
+class YOLOv7Head(YOLOv5Head):
+    """YOLOv7Head head used in `YOLOv7 <https://arxiv.org/abs/2207.02696>`_.
+
+    Args:
+        simota_candidate_topk (int): The candidate top-k which used to
+            get top-k ious to calculate dynamic-k in BatchYOLOv7Assigner.
+            Defaults to 10.
+        simota_iou_weight (float): The scale factor for regression
+            iou cost in BatchYOLOv7Assigner. Defaults to 3.0.
+        simota_cls_weight (float): The scale factor for classification
+            cost in BatchYOLOv7Assigner. Defaults to 1.0.
+    """
+
+    def __init__(self,
+                 *args,
+                 simota_candidate_topk: int = 20,
+                 simota_iou_weight: float = 3.0,
+                 simota_cls_weight: float = 1.0,
+                 aux_loss_weights: float = 0.25,
+                 **kwargs):
+        super().__init__(*args, **kwargs)
+        self.aux_loss_weights = aux_loss_weights
+        self.assigner = BatchYOLOv7Assigner(
+            num_classes=self.num_classes,
+            num_base_priors=self.num_base_priors,
+            featmap_strides=self.featmap_strides,
+            prior_match_thr=self.prior_match_thr,
+            candidate_topk=simota_candidate_topk,
+            iou_weight=simota_iou_weight,
+            cls_weight=simota_cls_weight)
+
+    def loss_by_feat(
+            self,
+            cls_scores: Sequence[Union[Tensor, List]],
+            bbox_preds: Sequence[Union[Tensor, List]],
+            objectnesses: Sequence[Union[Tensor, List]],
+            batch_gt_instances: Sequence[InstanceData],
+            batch_img_metas: Sequence[dict],
+            batch_gt_instances_ignore: OptInstanceList = None) -> dict:
+        """Calculate the loss based on the features extracted by the detection
+        head.
+
+        Args:
+            cls_scores (Sequence[Tensor]): Box scores for each scale level,
+                each is a 4D-tensor, the channel number is
+                num_priors * num_classes.
+            bbox_preds (Sequence[Tensor]): Box energies / deltas for each scale
+                level, each is a 4D-tensor, the channel number is
+                num_priors * 4.
+            objectnesses (Sequence[Tensor]): Score factor for
+                all scale level, each is a 4D-tensor, has shape
+                (batch_size, 1, H, W).
+            batch_gt_instances (list[:obj:`InstanceData`]): Batch of
+                gt_instance. It usually includes ``bboxes`` and ``labels``
+                attributes.
+            batch_img_metas (list[dict]): Meta information of each image, e.g.,
+                image size, scaling factor, etc.
+            batch_gt_instances_ignore (list[:obj:`InstanceData`], optional):
+                Batch of gt_instances_ignore. It includes ``bboxes`` attribute
+                data that is ignored during training and testing.
+                Defaults to None.
+        Returns:
+            dict[str, Tensor]: A dictionary of losses.
+        """
+
+        if isinstance(cls_scores[0], Sequence):
+            with_aux = True
+            batch_size = cls_scores[0][0].shape[0]
+            device = cls_scores[0][0].device
+
+            bbox_preds_main, bbox_preds_aux = zip(*bbox_preds)
+            objectnesses_main, objectnesses_aux = zip(*objectnesses)
+            cls_scores_main, cls_scores_aux = zip(*cls_scores)
+
+            head_preds = self._merge_predict_results(bbox_preds_main,
+                                                     objectnesses_main,
+                                                     cls_scores_main)
+            head_preds_aux = self._merge_predict_results(
+                bbox_preds_aux, objectnesses_aux, cls_scores_aux)
+        else:
+            with_aux = False
+            batch_size = cls_scores[0].shape[0]
+            device = cls_scores[0].device
+
+            head_preds = self._merge_predict_results(bbox_preds, objectnesses,
+                                                     cls_scores)
+
+        # Convert gt to norm xywh format
+        # (num_base_priors, num_batch_gt, 7)
+        # 7 is mean (batch_idx, cls_id, x_norm, y_norm,
+        # w_norm, h_norm, prior_idx)
+        batch_targets_normed = self._convert_gt_to_norm_format(
+            batch_gt_instances, batch_img_metas)
+
+        scaled_factors = [
+            torch.tensor(head_pred.shape, device=device)[[3, 2, 3, 2]]
+            for head_pred in head_preds
+        ]
+
+        loss_cls, loss_obj, loss_box = self._calc_loss(
+            head_preds=head_preds,
+            head_preds_aux=None,
+            batch_targets_normed=batch_targets_normed,
+            near_neighbor_thr=self.near_neighbor_thr,
+            scaled_factors=scaled_factors,
+            batch_img_metas=batch_img_metas,
+            device=device)
+
+        if with_aux:
+            loss_cls_aux, loss_obj_aux, loss_box_aux = self._calc_loss(
+                head_preds=head_preds,
+                head_preds_aux=head_preds_aux,
+                batch_targets_normed=batch_targets_normed,
+                near_neighbor_thr=self.near_neighbor_thr * 2,
+                scaled_factors=scaled_factors,
+                batch_img_metas=batch_img_metas,
+                device=device)
+            loss_cls += self.aux_loss_weights * loss_cls_aux
+            loss_obj += self.aux_loss_weights * loss_obj_aux
+            loss_box += self.aux_loss_weights * loss_box_aux
+
+        _, world_size = get_dist_info()
+        return dict(
+            loss_cls=loss_cls * batch_size * world_size,
+            loss_obj=loss_obj * batch_size * world_size,
+            loss_bbox=loss_box * batch_size * world_size)
+
+    def _calc_loss(self, head_preds, head_preds_aux, batch_targets_normed,
+                   near_neighbor_thr, scaled_factors, batch_img_metas, device):
+        loss_cls = torch.zeros(1, device=device)
+        loss_box = torch.zeros(1, device=device)
+        loss_obj = torch.zeros(1, device=device)
+
+        assigner_results = self.assigner(
+            head_preds,
+            batch_targets_normed,
+            batch_img_metas[0]['batch_input_shape'],
+            self.priors_base_sizes,
+            self.grid_offset,
+            near_neighbor_thr=near_neighbor_thr)
+        # mlvl is mean multi_level
+        mlvl_positive_infos = assigner_results['mlvl_positive_infos']
+        mlvl_priors = assigner_results['mlvl_priors']
+        mlvl_targets_normed = assigner_results['mlvl_targets_normed']
+
+        if head_preds_aux is not None:
+            # This is mean calc aux branch loss
+            head_preds = head_preds_aux
+
+        for i, head_pred in enumerate(head_preds):
+            batch_inds, proir_idx, grid_x, grid_y = mlvl_positive_infos[i].T
+            num_pred_positive = batch_inds.shape[0]
+            target_obj = torch.zeros_like(head_pred[..., 0])
+            # empty positive sampler
+            if num_pred_positive == 0:
+                loss_box += head_pred[..., :4].sum() * 0
+                loss_cls += head_pred[..., 5:].sum() * 0
+                loss_obj += self.loss_obj(
+                    head_pred[..., 4], target_obj) * self.obj_level_weights[i]
+                continue
+
+            priors = mlvl_priors[i]
+            targets_normed = mlvl_targets_normed[i]
+
+            head_pred_positive = head_pred[batch_inds, proir_idx, grid_y,
+                                           grid_x]
+
+            # calc bbox loss
+            grid_xy = torch.stack([grid_x, grid_y], dim=1)
+            decoded_pred_bbox = self._decode_bbox_to_xywh(
+                head_pred_positive[:, :4], priors, grid_xy)
+            target_bbox_scaled = targets_normed[:, 2:6] * scaled_factors[i]
+
+            loss_box_i, iou = self.loss_bbox(decoded_pred_bbox,
+                                             target_bbox_scaled)
+            loss_box += loss_box_i
+
+            # calc obj loss
+            target_obj[batch_inds, proir_idx, grid_y,
+                       grid_x] = iou.detach().clamp(0).type(target_obj.dtype)
+            loss_obj += self.loss_obj(head_pred[..., 4],
+                                      target_obj) * self.obj_level_weights[i]
+
+            # calc cls loss
+            if self.num_classes > 1:
+                pred_cls_scores = targets_normed[:, 1].long()
+                target_class = torch.full_like(
+                    head_pred_positive[:, 5:], 0., device=device)
+                target_class[range(num_pred_positive), pred_cls_scores] = 1.
+                loss_cls += self.loss_cls(head_pred_positive[:, 5:],
+                                          target_class)
+            else:
+                loss_cls += head_pred_positive[:, 5:].sum() * 0
+        return loss_cls, loss_obj, loss_box
+
+    def _merge_predict_results(self, bbox_preds: Sequence[Tensor],
+                               objectnesses: Sequence[Tensor],
+                               cls_scores: Sequence[Tensor]) -> List[Tensor]:
+        """Merge predict output from 3 heads.
+
+        Args:
+            cls_scores (Sequence[Tensor]): Box scores for each scale level,
+                each is a 4D-tensor, the channel number is
+                num_priors * num_classes.
+            bbox_preds (Sequence[Tensor]): Box energies / deltas for each scale
+                level, each is a 4D-tensor, the channel number is
+                num_priors * 4.
+            objectnesses (Sequence[Tensor]): Score factor for
+                all scale level, each is a 4D-tensor, has shape
+                (batch_size, 1, H, W).
+
+        Returns:
+              List[Tensor]: Merged output.
+        """
+        head_preds = []
+        for bbox_pred, objectness, cls_score in zip(bbox_preds, objectnesses,
+                                                    cls_scores):
+            b, _, h, w = bbox_pred.shape
+            bbox_pred = bbox_pred.reshape(b, self.num_base_priors, -1, h, w)
+            objectness = objectness.reshape(b, self.num_base_priors, -1, h, w)
+            cls_score = cls_score.reshape(b, self.num_base_priors, -1, h, w)
+            head_pred = torch.cat([bbox_pred, objectness, cls_score],
+                                  dim=2).permute(0, 1, 3, 4, 2).contiguous()
+            head_preds.append(head_pred)
+        return head_preds
+
+    def _decode_bbox_to_xywh(self, bbox_pred, priors_base_sizes,
+                             grid_xy) -> Tensor:
+        bbox_pred = bbox_pred.sigmoid()
+        pred_xy = bbox_pred[:, :2] * 2 - 0.5 + grid_xy
+        pred_wh = (bbox_pred[:, 2:] * 2)**2 * priors_base_sizes
+        decoded_bbox_pred = torch.cat((pred_xy, pred_wh), dim=-1)
+        return decoded_bbox_pred
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/models/dense_heads/yolov8_head.py b/mmdetection_practice/third_party/mmyolo/mmyolo/models/dense_heads/yolov8_head.py
new file mode 100644
index 0000000..2920241
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/models/dense_heads/yolov8_head.py
@@ -0,0 +1,396 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+import math
+from typing import List, Sequence, Tuple, Union
+
+import torch
+import torch.nn as nn
+from mmcv.cnn import ConvModule
+from mmdet.models.utils import multi_apply
+from mmdet.utils import (ConfigType, OptConfigType, OptInstanceList,
+                         OptMultiConfig)
+from mmengine.dist import get_dist_info
+from mmengine.model import BaseModule
+from mmengine.structures import InstanceData
+from torch import Tensor
+
+from mmyolo.registry import MODELS, TASK_UTILS
+from ..utils import gt_instances_preprocess, make_divisible
+from .yolov5_head import YOLOv5Head
+
+
+@MODELS.register_module()
+class YOLOv8HeadModule(BaseModule):
+    """YOLOv8HeadModule head module used in `YOLOv8`.
+
+    Args:
+        num_classes (int): Number of categories excluding the background
+            category.
+        in_channels (Union[int, Sequence]): Number of channels in the input
+            feature map.
+        widen_factor (float): Width multiplier, multiply number of
+            channels in each layer by this amount. Defaults to 1.0.
+        num_base_priors (int): The number of priors (points) at a point
+            on the feature grid.
+        featmap_strides (Sequence[int]): Downsample factor of each feature map.
+             Defaults to [8, 16, 32].
+        reg_max (int): Max value of integral set :math: ``{0, ..., reg_max-1}``
+            in QFL setting. Defaults to 16.
+        norm_cfg (:obj:`ConfigDict` or dict): Config dict for normalization
+            layer. Defaults to dict(type='BN', momentum=0.03, eps=0.001).
+        act_cfg (:obj:`ConfigDict` or dict): Config dict for activation layer.
+            Defaults to None.
+        init_cfg (:obj:`ConfigDict` or list[:obj:`ConfigDict`] or dict or
+            list[dict], optional): Initialization config dict.
+            Defaults to None.
+    """
+
+    def __init__(self,
+                 num_classes: int,
+                 in_channels: Union[int, Sequence],
+                 widen_factor: float = 1.0,
+                 num_base_priors: int = 1,
+                 featmap_strides: Sequence[int] = (8, 16, 32),
+                 reg_max: int = 16,
+                 norm_cfg: ConfigType = dict(
+                     type='BN', momentum=0.03, eps=0.001),
+                 act_cfg: ConfigType = dict(type='SiLU', inplace=True),
+                 init_cfg: OptMultiConfig = None):
+        super().__init__(init_cfg=init_cfg)
+        self.num_classes = num_classes
+        self.featmap_strides = featmap_strides
+        self.num_levels = len(self.featmap_strides)
+        self.num_base_priors = num_base_priors
+        self.norm_cfg = norm_cfg
+        self.act_cfg = act_cfg
+        self.in_channels = in_channels
+        self.reg_max = reg_max
+
+        in_channels = []
+        for channel in self.in_channels:
+            channel = make_divisible(channel, widen_factor)
+            in_channels.append(channel)
+        self.in_channels = in_channels
+
+        self._init_layers()
+
+    def init_weights(self, prior_prob=0.01):
+        """Initialize the weight and bias of PPYOLOE head."""
+        super().init_weights()
+        for reg_pred, cls_pred, stride in zip(self.reg_preds, self.cls_preds,
+                                              self.featmap_strides):
+            reg_pred[-1].bias.data[:] = 1.0  # box
+            # cls (.01 objects, 80 classes, 640 img)
+            cls_pred[-1].bias.data[:self.num_classes] = math.log(
+                5 / self.num_classes / (640 / stride)**2)
+
+    def _init_layers(self):
+        """initialize conv layers in YOLOv8 head."""
+        # Init decouple head
+        self.cls_preds = nn.ModuleList()
+        self.reg_preds = nn.ModuleList()
+
+        reg_out_channels = max(
+            (16, self.in_channels[0] // 4, self.reg_max * 4))
+        cls_out_channels = max(self.in_channels[0], self.num_classes)
+
+        for i in range(self.num_levels):
+            self.reg_preds.append(
+                nn.Sequential(
+                    ConvModule(
+                        in_channels=self.in_channels[i],
+                        out_channels=reg_out_channels,
+                        kernel_size=3,
+                        stride=1,
+                        padding=1,
+                        norm_cfg=self.norm_cfg,
+                        act_cfg=self.act_cfg),
+                    ConvModule(
+                        in_channels=reg_out_channels,
+                        out_channels=reg_out_channels,
+                        kernel_size=3,
+                        stride=1,
+                        padding=1,
+                        norm_cfg=self.norm_cfg,
+                        act_cfg=self.act_cfg),
+                    nn.Conv2d(
+                        in_channels=reg_out_channels,
+                        out_channels=4 * self.reg_max,
+                        kernel_size=1)))
+            self.cls_preds.append(
+                nn.Sequential(
+                    ConvModule(
+                        in_channels=self.in_channels[i],
+                        out_channels=cls_out_channels,
+                        kernel_size=3,
+                        stride=1,
+                        padding=1,
+                        norm_cfg=self.norm_cfg,
+                        act_cfg=self.act_cfg),
+                    ConvModule(
+                        in_channels=cls_out_channels,
+                        out_channels=cls_out_channels,
+                        kernel_size=3,
+                        stride=1,
+                        padding=1,
+                        norm_cfg=self.norm_cfg,
+                        act_cfg=self.act_cfg),
+                    nn.Conv2d(
+                        in_channels=cls_out_channels,
+                        out_channels=self.num_classes,
+                        kernel_size=1)))
+
+        proj = torch.arange(self.reg_max, dtype=torch.float)
+        self.register_buffer('proj', proj, persistent=False)
+
+    def forward(self, x: Tuple[Tensor]) -> Tuple[List]:
+        """Forward features from the upstream network.
+
+        Args:
+            x (Tuple[Tensor]): Features from the upstream network, each is
+                a 4D-tensor.
+        Returns:
+            Tuple[List]: A tuple of multi-level classification scores, bbox
+            predictions
+        """
+        assert len(x) == self.num_levels
+        return multi_apply(self.forward_single, x, self.cls_preds,
+                           self.reg_preds)
+
+    def forward_single(self, x: torch.Tensor, cls_pred: nn.ModuleList,
+                       reg_pred: nn.ModuleList) -> Tuple:
+        """Forward feature of a single scale level."""
+        b, _, h, w = x.shape
+        cls_logit = cls_pred(x)
+        bbox_dist_preds = reg_pred(x)
+        if self.reg_max > 1:
+            bbox_dist_preds = bbox_dist_preds.reshape(
+                [-1, 4, self.reg_max, h * w]).permute(0, 3, 1, 2)
+
+            # TODO: The get_flops script cannot handle the situation of
+            #  matmul, and needs to be fixed later
+            # bbox_preds = bbox_dist_preds.softmax(3).matmul(self.proj)
+            bbox_preds = bbox_dist_preds.softmax(3).matmul(
+                self.proj.view([-1, 1])).squeeze(-1)
+            bbox_preds = bbox_preds.transpose(1, 2).reshape(b, -1, h, w)
+        else:
+            bbox_preds = bbox_dist_preds
+        if self.training:
+            return cls_logit, bbox_preds, bbox_dist_preds
+        else:
+            return cls_logit, bbox_preds
+
+
+@MODELS.register_module()
+class YOLOv8Head(YOLOv5Head):
+    """YOLOv8Head head used in `YOLOv8`.
+
+    Args:
+        head_module(:obj:`ConfigDict` or dict): Base module used for YOLOv8Head
+        prior_generator(dict): Points generator feature maps
+            in 2D points-based detectors.
+        bbox_coder (:obj:`ConfigDict` or dict): Config of bbox coder.
+        loss_cls (:obj:`ConfigDict` or dict): Config of classification loss.
+        loss_bbox (:obj:`ConfigDict` or dict): Config of localization loss.
+        loss_dfl (:obj:`ConfigDict` or dict): Config of Distribution Focal
+            Loss.
+        train_cfg (:obj:`ConfigDict` or dict, optional): Training config of
+            anchor head. Defaults to None.
+        test_cfg (:obj:`ConfigDict` or dict, optional): Testing config of
+            anchor head. Defaults to None.
+        init_cfg (:obj:`ConfigDict` or list[:obj:`ConfigDict`] or dict or
+            list[dict], optional): Initialization config dict.
+            Defaults to None.
+    """
+
+    def __init__(self,
+                 head_module: ConfigType,
+                 prior_generator: ConfigType = dict(
+                     type='mmdet.MlvlPointGenerator',
+                     offset=0.5,
+                     strides=[8, 16, 32]),
+                 bbox_coder: ConfigType = dict(type='DistancePointBBoxCoder'),
+                 loss_cls: ConfigType = dict(
+                     type='mmdet.CrossEntropyLoss',
+                     use_sigmoid=True,
+                     reduction='none',
+                     loss_weight=0.5),
+                 loss_bbox: ConfigType = dict(
+                     type='IoULoss',
+                     iou_mode='ciou',
+                     bbox_format='xyxy',
+                     reduction='sum',
+                     loss_weight=7.5,
+                     return_iou=False),
+                 loss_dfl=dict(
+                     type='mmdet.DistributionFocalLoss',
+                     reduction='mean',
+                     loss_weight=1.5 / 4),
+                 train_cfg: OptConfigType = None,
+                 test_cfg: OptConfigType = None,
+                 init_cfg: OptMultiConfig = None):
+        super().__init__(
+            head_module=head_module,
+            prior_generator=prior_generator,
+            bbox_coder=bbox_coder,
+            loss_cls=loss_cls,
+            loss_bbox=loss_bbox,
+            train_cfg=train_cfg,
+            test_cfg=test_cfg,
+            init_cfg=init_cfg)
+        self.loss_dfl = MODELS.build(loss_dfl)
+        # YOLOv8 doesn't need loss_obj
+        self.loss_obj = None
+
+    def special_init(self):
+        """Since YOLO series algorithms will inherit from YOLOv5Head, but
+        different algorithms have special initialization process.
+
+        The special_init function is designed to deal with this situation.
+        """
+        if self.train_cfg:
+            self.assigner = TASK_UTILS.build(self.train_cfg.assigner)
+
+            # Add common attributes to reduce calculation
+            self.featmap_sizes_train = None
+            self.num_level_priors = None
+            self.flatten_priors_train = None
+            self.stride_tensor = None
+
+    def loss_by_feat(
+            self,
+            cls_scores: Sequence[Tensor],
+            bbox_preds: Sequence[Tensor],
+            bbox_dist_preds: Sequence[Tensor],
+            batch_gt_instances: Sequence[InstanceData],
+            batch_img_metas: Sequence[dict],
+            batch_gt_instances_ignore: OptInstanceList = None) -> dict:
+        """Calculate the loss based on the features extracted by the detection
+        head.
+
+        Args:
+            cls_scores (Sequence[Tensor]): Box scores for each scale level,
+                each is a 4D-tensor, the channel number is
+                num_priors * num_classes.
+            bbox_preds (Sequence[Tensor]): Box energies / deltas for each scale
+                level, each is a 4D-tensor, the channel number is
+                num_priors * 4.
+            bbox_dist_preds (Sequence[Tensor]): Box distribution logits for
+                each scale level with shape (bs, reg_max + 1, H*W, 4).
+            batch_gt_instances (list[:obj:`InstanceData`]): Batch of
+                gt_instance. It usually includes ``bboxes`` and ``labels``
+                attributes.
+            batch_img_metas (list[dict]): Meta information of each image, e.g.,
+                image size, scaling factor, etc.
+            batch_gt_instances_ignore (list[:obj:`InstanceData`], optional):
+                Batch of gt_instances_ignore. It includes ``bboxes`` attribute
+                data that is ignored during training and testing.
+                Defaults to None.
+        Returns:
+            dict[str, Tensor]: A dictionary of losses.
+        """
+        num_imgs = len(batch_img_metas)
+
+        current_featmap_sizes = [
+            cls_score.shape[2:] for cls_score in cls_scores
+        ]
+        # If the shape does not equal, generate new one
+        if current_featmap_sizes != self.featmap_sizes_train:
+            self.featmap_sizes_train = current_featmap_sizes
+
+            mlvl_priors_with_stride = self.prior_generator.grid_priors(
+                self.featmap_sizes_train,
+                dtype=cls_scores[0].dtype,
+                device=cls_scores[0].device,
+                with_stride=True)
+
+            self.num_level_priors = [len(n) for n in mlvl_priors_with_stride]
+            self.flatten_priors_train = torch.cat(
+                mlvl_priors_with_stride, dim=0)
+            self.stride_tensor = self.flatten_priors_train[..., [2]]
+
+        # gt info
+        gt_info = gt_instances_preprocess(batch_gt_instances, num_imgs)
+        gt_labels = gt_info[:, :, :1]
+        gt_bboxes = gt_info[:, :, 1:]  # xyxy
+        pad_bbox_flag = (gt_bboxes.sum(-1, keepdim=True) > 0).float()
+
+        # pred info
+        flatten_cls_preds = [
+            cls_pred.permute(0, 2, 3, 1).reshape(num_imgs, -1,
+                                                 self.num_classes)
+            for cls_pred in cls_scores
+        ]
+        flatten_pred_bboxes = [
+            bbox_pred.permute(0, 2, 3, 1).reshape(num_imgs, -1, 4)
+            for bbox_pred in bbox_preds
+        ]
+        # (bs, n, 4 * reg_max)
+        flatten_pred_dists = [
+            bbox_pred_org.reshape(num_imgs, -1, self.head_module.reg_max * 4)
+            for bbox_pred_org in bbox_dist_preds
+        ]
+
+        flatten_dist_preds = torch.cat(flatten_pred_dists, dim=1)
+        flatten_cls_preds = torch.cat(flatten_cls_preds, dim=1)
+        flatten_pred_bboxes = torch.cat(flatten_pred_bboxes, dim=1)
+        flatten_pred_bboxes = self.bbox_coder.decode(
+            self.flatten_priors_train[..., :2], flatten_pred_bboxes,
+            self.stride_tensor[..., 0])
+
+        assigned_result = self.assigner(
+            (flatten_pred_bboxes.detach()).type(gt_bboxes.dtype),
+            flatten_cls_preds.detach().sigmoid(), self.flatten_priors_train,
+            gt_labels, gt_bboxes, pad_bbox_flag)
+
+        assigned_bboxes = assigned_result['assigned_bboxes']
+        assigned_scores = assigned_result['assigned_scores']
+        fg_mask_pre_prior = assigned_result['fg_mask_pre_prior']
+
+        assigned_scores_sum = assigned_scores.sum().clamp(min=1)
+
+        loss_cls = self.loss_cls(flatten_cls_preds, assigned_scores).sum()
+        loss_cls /= assigned_scores_sum
+
+        # rescale bbox
+        assigned_bboxes /= self.stride_tensor
+        flatten_pred_bboxes /= self.stride_tensor
+
+        # select positive samples mask
+        num_pos = fg_mask_pre_prior.sum()
+        if num_pos > 0:
+            # when num_pos > 0, assigned_scores_sum will >0, so the loss_bbox
+            # will not report an error
+            # iou loss
+            prior_bbox_mask = fg_mask_pre_prior.unsqueeze(-1).repeat([1, 1, 4])
+            pred_bboxes_pos = torch.masked_select(
+                flatten_pred_bboxes, prior_bbox_mask).reshape([-1, 4])
+            assigned_bboxes_pos = torch.masked_select(
+                assigned_bboxes, prior_bbox_mask).reshape([-1, 4])
+            bbox_weight = torch.masked_select(
+                assigned_scores.sum(-1), fg_mask_pre_prior).unsqueeze(-1)
+            loss_bbox = self.loss_bbox(
+                pred_bboxes_pos, assigned_bboxes_pos,
+                weight=bbox_weight) / assigned_scores_sum
+
+            # dfl loss
+            pred_dist_pos = flatten_dist_preds[fg_mask_pre_prior]
+            assigned_ltrb = self.bbox_coder.encode(
+                self.flatten_priors_train[..., :2] / self.stride_tensor,
+                assigned_bboxes,
+                max_dis=self.head_module.reg_max - 1,
+                eps=0.01)
+            assigned_ltrb_pos = torch.masked_select(
+                assigned_ltrb, prior_bbox_mask).reshape([-1, 4])
+            loss_dfl = self.loss_dfl(
+                pred_dist_pos.reshape(-1, self.head_module.reg_max),
+                assigned_ltrb_pos.reshape(-1),
+                weight=bbox_weight.expand(-1, 4).reshape(-1),
+                avg_factor=assigned_scores_sum)
+        else:
+            loss_bbox = flatten_pred_bboxes.sum() * 0
+            loss_dfl = flatten_pred_bboxes.sum() * 0
+        _, world_size = get_dist_info()
+        return dict(
+            loss_cls=loss_cls * num_imgs * world_size,
+            loss_bbox=loss_bbox * num_imgs * world_size,
+            loss_dfl=loss_dfl * num_imgs * world_size)
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/models/dense_heads/yolox_head.py b/mmdetection_practice/third_party/mmyolo/mmyolo/models/dense_heads/yolox_head.py
new file mode 100644
index 0000000..a203298
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/models/dense_heads/yolox_head.py
@@ -0,0 +1,514 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from typing import List, Optional, Sequence, Tuple, Union
+
+import torch
+import torch.nn as nn
+import torch.nn.functional as F
+from mmcv.cnn import ConvModule, DepthwiseSeparableConvModule
+from mmdet.models.task_modules.samplers import PseudoSampler
+from mmdet.models.utils import multi_apply
+from mmdet.structures.bbox import bbox_xyxy_to_cxcywh
+from mmdet.utils import (ConfigType, OptConfigType, OptInstanceList,
+                         OptMultiConfig, reduce_mean)
+from mmengine.model import BaseModule, bias_init_with_prob
+from mmengine.structures import InstanceData
+from torch import Tensor
+
+from mmyolo.registry import MODELS, TASK_UTILS
+from .yolov5_head import YOLOv5Head
+
+
+@MODELS.register_module()
+class YOLOXHeadModule(BaseModule):
+    """YOLOXHead head module used in `YOLOX.
+
+    `<https://arxiv.org/abs/2107.08430>`_
+
+    Args:
+        num_classes (int): Number of categories excluding the background
+            category.
+        in_channels (Union[int, Sequence]): Number of channels in the input
+            feature map.
+        widen_factor (float): Width multiplier, multiply number of
+            channels in each layer by this amount. Defaults to 1.0.
+        num_base_priors (int): The number of priors (points) at a point
+            on the feature grid
+        stacked_convs (int): Number of stacking convs of the head.
+            Defaults to 2.
+        featmap_strides (Sequence[int]): Downsample factor of each feature map.
+             Defaults to [8, 16, 32].
+        use_depthwise (bool): Whether to depthwise separable convolution in
+            blocks. Defaults to False.
+        dcn_on_last_conv (bool): If true, use dcn in the last layer of
+            towers. Defaults to False.
+        conv_bias (bool or str): If specified as `auto`, it will be decided by
+            the norm_cfg. Bias of conv will be set as True if `norm_cfg` is
+            None, otherwise False. Defaults to "auto".
+        conv_cfg (:obj:`ConfigDict` or dict, optional): Config dict for
+            convolution layer. Defaults to None.
+        norm_cfg (:obj:`ConfigDict` or dict): Config dict for normalization
+            layer. Defaults to dict(type='BN', momentum=0.03, eps=0.001).
+        act_cfg (:obj:`ConfigDict` or dict): Config dict for activation layer.
+            Defaults to None.
+        init_cfg (:obj:`ConfigDict` or list[:obj:`ConfigDict`] or dict or
+            list[dict], optional): Initialization config dict.
+            Defaults to None.
+    """
+
+    def __init__(
+        self,
+        num_classes: int,
+        in_channels: Union[int, Sequence],
+        widen_factor: float = 1.0,
+        num_base_priors: int = 1,
+        feat_channels: int = 256,
+        stacked_convs: int = 2,
+        featmap_strides: Sequence[int] = [8, 16, 32],
+        use_depthwise: bool = False,
+        dcn_on_last_conv: bool = False,
+        conv_bias: Union[bool, str] = 'auto',
+        conv_cfg: OptConfigType = None,
+        norm_cfg: ConfigType = dict(type='BN', momentum=0.03, eps=0.001),
+        act_cfg: ConfigType = dict(type='SiLU', inplace=True),
+        init_cfg: OptMultiConfig = None,
+    ):
+        super().__init__(init_cfg=init_cfg)
+        self.num_classes = num_classes
+        self.feat_channels = int(feat_channels * widen_factor)
+        self.stacked_convs = stacked_convs
+        self.use_depthwise = use_depthwise
+        self.dcn_on_last_conv = dcn_on_last_conv
+        assert conv_bias == 'auto' or isinstance(conv_bias, bool)
+        self.conv_bias = conv_bias
+        self.num_base_priors = num_base_priors
+
+        self.conv_cfg = conv_cfg
+        self.norm_cfg = norm_cfg
+        self.act_cfg = act_cfg
+        self.featmap_strides = featmap_strides
+
+        if isinstance(in_channels, int):
+            in_channels = int(in_channels * widen_factor)
+        self.in_channels = in_channels
+
+        self._init_layers()
+
+    def _init_layers(self):
+        """Initialize heads for all level feature maps."""
+        self.multi_level_cls_convs = nn.ModuleList()
+        self.multi_level_reg_convs = nn.ModuleList()
+        self.multi_level_conv_cls = nn.ModuleList()
+        self.multi_level_conv_reg = nn.ModuleList()
+        self.multi_level_conv_obj = nn.ModuleList()
+        for _ in self.featmap_strides:
+            self.multi_level_cls_convs.append(self._build_stacked_convs())
+            self.multi_level_reg_convs.append(self._build_stacked_convs())
+            conv_cls, conv_reg, conv_obj = self._build_predictor()
+            self.multi_level_conv_cls.append(conv_cls)
+            self.multi_level_conv_reg.append(conv_reg)
+            self.multi_level_conv_obj.append(conv_obj)
+
+    def _build_stacked_convs(self) -> nn.Sequential:
+        """Initialize conv layers of a single level head."""
+        conv = DepthwiseSeparableConvModule \
+            if self.use_depthwise else ConvModule
+        stacked_convs = []
+        for i in range(self.stacked_convs):
+            chn = self.in_channels if i == 0 else self.feat_channels
+            if self.dcn_on_last_conv and i == self.stacked_convs - 1:
+                conv_cfg = dict(type='DCNv2')
+            else:
+                conv_cfg = self.conv_cfg
+            stacked_convs.append(
+                conv(
+                    chn,
+                    self.feat_channels,
+                    3,
+                    stride=1,
+                    padding=1,
+                    conv_cfg=conv_cfg,
+                    norm_cfg=self.norm_cfg,
+                    act_cfg=self.act_cfg,
+                    bias=self.conv_bias))
+        return nn.Sequential(*stacked_convs)
+
+    def _build_predictor(self) -> Tuple[nn.Module, nn.Module, nn.Module]:
+        """Initialize predictor layers of a single level head."""
+        conv_cls = nn.Conv2d(self.feat_channels, self.num_classes, 1)
+        conv_reg = nn.Conv2d(self.feat_channels, 4, 1)
+        conv_obj = nn.Conv2d(self.feat_channels, 1, 1)
+        return conv_cls, conv_reg, conv_obj
+
+    def init_weights(self):
+        """Initialize weights of the head."""
+        # Use prior in model initialization to improve stability
+        super().init_weights()
+        bias_init = bias_init_with_prob(0.01)
+        for conv_cls, conv_obj in zip(self.multi_level_conv_cls,
+                                      self.multi_level_conv_obj):
+            conv_cls.bias.data.fill_(bias_init)
+            conv_obj.bias.data.fill_(bias_init)
+
+    def forward(self, x: Tuple[Tensor]) -> Tuple[List]:
+        """Forward features from the upstream network.
+
+        Args:
+            x (Tuple[Tensor]): Features from the upstream network, each is
+                a 4D-tensor.
+        Returns:
+            Tuple[List]: A tuple of multi-level classification scores, bbox
+            predictions, and objectnesses.
+        """
+
+        return multi_apply(self.forward_single, x, self.multi_level_cls_convs,
+                           self.multi_level_reg_convs,
+                           self.multi_level_conv_cls,
+                           self.multi_level_conv_reg,
+                           self.multi_level_conv_obj)
+
+    def forward_single(self, x: Tensor, cls_convs: nn.Module,
+                       reg_convs: nn.Module, conv_cls: nn.Module,
+                       conv_reg: nn.Module,
+                       conv_obj: nn.Module) -> Tuple[Tensor, Tensor, Tensor]:
+        """Forward feature of a single scale level."""
+
+        cls_feat = cls_convs(x)
+        reg_feat = reg_convs(x)
+
+        cls_score = conv_cls(cls_feat)
+        bbox_pred = conv_reg(reg_feat)
+        objectness = conv_obj(reg_feat)
+
+        return cls_score, bbox_pred, objectness
+
+
+@MODELS.register_module()
+class YOLOXHead(YOLOv5Head):
+    """YOLOXHead head used in `YOLOX <https://arxiv.org/abs/2107.08430>`_.
+
+    Args:
+        head_module(ConfigType): Base module used for YOLOXHead
+        prior_generator: Points generator feature maps in
+            2D points-based detectors.
+        loss_cls (:obj:`ConfigDict` or dict): Config of classification loss.
+        loss_bbox (:obj:`ConfigDict` or dict): Config of localization loss.
+        loss_obj (:obj:`ConfigDict` or dict): Config of objectness loss.
+        loss_bbox_aux (:obj:`ConfigDict` or dict): Config of bbox aux loss.
+        train_cfg (:obj:`ConfigDict` or dict, optional): Training config of
+            anchor head. Defaults to None.
+        test_cfg (:obj:`ConfigDict` or dict, optional): Testing config of
+            anchor head. Defaults to None.
+        init_cfg (:obj:`ConfigDict` or list[:obj:`ConfigDict`] or dict or
+            list[dict], optional): Initialization config dict.
+            Defaults to None.
+    """
+
+    def __init__(self,
+                 head_module: ConfigType,
+                 prior_generator: ConfigType = dict(
+                     type='mmdet.MlvlPointGenerator',
+                     offset=0,
+                     strides=[8, 16, 32]),
+                 bbox_coder: ConfigType = dict(type='YOLOXBBoxCoder'),
+                 loss_cls: ConfigType = dict(
+                     type='mmdet.CrossEntropyLoss',
+                     use_sigmoid=True,
+                     reduction='sum',
+                     loss_weight=1.0),
+                 loss_bbox: ConfigType = dict(
+                     type='mmdet.IoULoss',
+                     mode='square',
+                     eps=1e-16,
+                     reduction='sum',
+                     loss_weight=5.0),
+                 loss_obj: ConfigType = dict(
+                     type='mmdet.CrossEntropyLoss',
+                     use_sigmoid=True,
+                     reduction='sum',
+                     loss_weight=1.0),
+                 loss_bbox_aux: ConfigType = dict(
+                     type='mmdet.L1Loss', reduction='sum', loss_weight=1.0),
+                 train_cfg: OptConfigType = None,
+                 test_cfg: OptConfigType = None,
+                 init_cfg: OptMultiConfig = None):
+        self.use_bbox_aux = False
+        self.loss_bbox_aux = loss_bbox_aux
+
+        super().__init__(
+            head_module=head_module,
+            prior_generator=prior_generator,
+            bbox_coder=bbox_coder,
+            loss_cls=loss_cls,
+            loss_bbox=loss_bbox,
+            loss_obj=loss_obj,
+            train_cfg=train_cfg,
+            test_cfg=test_cfg,
+            init_cfg=init_cfg)
+
+    def special_init(self):
+        """Since YOLO series algorithms will inherit from YOLOv5Head, but
+        different algorithms have special initialization process.
+
+        The special_init function is designed to deal with this situation.
+        """
+        self.loss_bbox_aux: nn.Module = MODELS.build(self.loss_bbox_aux)
+        if self.train_cfg:
+            self.assigner = TASK_UTILS.build(self.train_cfg.assigner)
+            # YOLOX does not support sampling
+            self.sampler = PseudoSampler()
+
+    def forward(self, x: Tuple[Tensor]) -> Tuple[List]:
+        return self.head_module(x)
+
+    def loss_by_feat(
+            self,
+            cls_scores: Sequence[Tensor],
+            bbox_preds: Sequence[Tensor],
+            objectnesses: Sequence[Tensor],
+            batch_gt_instances: Tensor,
+            batch_img_metas: Sequence[dict],
+            batch_gt_instances_ignore: OptInstanceList = None) -> dict:
+        """Calculate the loss based on the features extracted by the detection
+        head.
+
+        Args:
+            cls_scores (Sequence[Tensor]): Box scores for each scale level,
+                each is a 4D-tensor, the channel number is
+                num_priors * num_classes.
+            bbox_preds (Sequence[Tensor]): Box energies / deltas for each scale
+                level, each is a 4D-tensor, the channel number is
+                num_priors * 4.
+            objectnesses (Sequence[Tensor]): Score factor for
+                all scale level, each is a 4D-tensor, has shape
+                (batch_size, 1, H, W).
+            batch_gt_instances (list[:obj:`InstanceData`]): Batch of
+                gt_instance. It usually includes ``bboxes`` and ``labels``
+                attributes.
+            batch_img_metas (list[dict]): Meta information of each image, e.g.,
+                image size, scaling factor, etc.
+            batch_gt_instances_ignore (list[:obj:`InstanceData`], optional):
+                Batch of gt_instances_ignore. It includes ``bboxes`` attribute
+                data that is ignored during training and testing.
+                Defaults to None.
+        Returns:
+            dict[str, Tensor]: A dictionary of losses.
+        """
+        num_imgs = len(batch_img_metas)
+        if batch_gt_instances_ignore is None:
+            batch_gt_instances_ignore = [None] * num_imgs
+
+        batch_gt_instances = self.gt_instances_preprocess(
+            batch_gt_instances, len(batch_img_metas))
+
+        featmap_sizes = [cls_score.shape[2:] for cls_score in cls_scores]
+        mlvl_priors = self.prior_generator.grid_priors(
+            featmap_sizes,
+            dtype=cls_scores[0].dtype,
+            device=cls_scores[0].device,
+            with_stride=True)
+
+        flatten_cls_preds = [
+            cls_pred.permute(0, 2, 3, 1).reshape(num_imgs, -1,
+                                                 self.num_classes)
+            for cls_pred in cls_scores
+        ]
+        flatten_bbox_preds = [
+            bbox_pred.permute(0, 2, 3, 1).reshape(num_imgs, -1, 4)
+            for bbox_pred in bbox_preds
+        ]
+        flatten_objectness = [
+            objectness.permute(0, 2, 3, 1).reshape(num_imgs, -1)
+            for objectness in objectnesses
+        ]
+
+        flatten_cls_preds = torch.cat(flatten_cls_preds, dim=1)
+        flatten_bbox_preds = torch.cat(flatten_bbox_preds, dim=1)
+        flatten_objectness = torch.cat(flatten_objectness, dim=1)
+        flatten_priors = torch.cat(mlvl_priors)
+        flatten_bboxes = self.bbox_coder.decode(flatten_priors[..., :2],
+                                                flatten_bbox_preds,
+                                                flatten_priors[..., 2])
+
+        (pos_masks, cls_targets, obj_targets, bbox_targets, bbox_aux_target,
+         num_fg_imgs) = multi_apply(
+             self._get_targets_single,
+             flatten_priors.unsqueeze(0).repeat(num_imgs, 1, 1),
+             flatten_cls_preds.detach(), flatten_bboxes.detach(),
+             flatten_objectness.detach(), batch_gt_instances, batch_img_metas,
+             batch_gt_instances_ignore)
+
+        # The experimental results show that 'reduce_mean' can improve
+        # performance on the COCO dataset.
+        num_pos = torch.tensor(
+            sum(num_fg_imgs),
+            dtype=torch.float,
+            device=flatten_cls_preds.device)
+        num_total_samples = max(reduce_mean(num_pos), 1.0)
+
+        pos_masks = torch.cat(pos_masks, 0)
+        cls_targets = torch.cat(cls_targets, 0)
+        obj_targets = torch.cat(obj_targets, 0)
+        bbox_targets = torch.cat(bbox_targets, 0)
+        if self.use_bbox_aux:
+            bbox_aux_target = torch.cat(bbox_aux_target, 0)
+
+        loss_obj = self.loss_obj(flatten_objectness.view(-1, 1),
+                                 obj_targets) / num_total_samples
+        if num_pos > 0:
+            loss_cls = self.loss_cls(
+                flatten_cls_preds.view(-1, self.num_classes)[pos_masks],
+                cls_targets) / num_total_samples
+            loss_bbox = self.loss_bbox(
+                flatten_bboxes.view(-1, 4)[pos_masks],
+                bbox_targets) / num_total_samples
+        else:
+            # Avoid cls and reg branch not participating in the gradient
+            # propagation when there is no ground-truth in the images.
+            # For more details, please refer to
+            # https://github.com/open-mmlab/mmdetection/issues/7298
+            loss_cls = flatten_cls_preds.sum() * 0
+            loss_bbox = flatten_bboxes.sum() * 0
+
+        loss_dict = dict(
+            loss_cls=loss_cls, loss_bbox=loss_bbox, loss_obj=loss_obj)
+
+        if self.use_bbox_aux:
+            if num_pos > 0:
+                loss_bbox_aux = self.loss_bbox_aux(
+                    flatten_bbox_preds.view(-1, 4)[pos_masks],
+                    bbox_aux_target) / num_total_samples
+            else:
+                # Avoid cls and reg branch not participating in the gradient
+                # propagation when there is no ground-truth in the images.
+                # For more details, please refer to
+                # https://github.com/open-mmlab/mmdetection/issues/7298
+                loss_bbox_aux = flatten_bbox_preds.sum() * 0
+            loss_dict.update(loss_bbox_aux=loss_bbox_aux)
+
+        return loss_dict
+
+    @torch.no_grad()
+    def _get_targets_single(
+            self,
+            priors: Tensor,
+            cls_preds: Tensor,
+            decoded_bboxes: Tensor,
+            objectness: Tensor,
+            gt_instances: InstanceData,
+            img_meta: dict,
+            gt_instances_ignore: Optional[InstanceData] = None) -> tuple:
+        """Compute classification, regression, and objectness targets for
+        priors in a single image.
+
+        Args:
+            priors (Tensor): All priors of one image, a 2D-Tensor with shape
+                [num_priors, 4] in [cx, xy, stride_w, stride_y] format.
+            cls_preds (Tensor): Classification predictions of one image,
+                a 2D-Tensor with shape [num_priors, num_classes]
+            decoded_bboxes (Tensor): Decoded bboxes predictions of one image,
+                a 2D-Tensor with shape [num_priors, 4] in [tl_x, tl_y,
+                br_x, br_y] format.
+            objectness (Tensor): Objectness predictions of one image,
+                a 1D-Tensor with shape [num_priors]
+            gt_instances (:obj:`InstanceData`): Ground truth of instance
+                annotations. It should includes ``bboxes`` and ``labels``
+                attributes.
+            img_meta (dict): Meta information for current image.
+            gt_instances_ignore (:obj:`InstanceData`, optional): Instances
+                to be ignored during training. It includes ``bboxes`` attribute
+                data that is ignored during training and testing.
+                Defaults to None.
+        Returns:
+            tuple:
+                foreground_mask (list[Tensor]): Binary mask of foreground
+                targets.
+                cls_target (list[Tensor]): Classification targets of an image.
+                obj_target (list[Tensor]): Objectness targets of an image.
+                bbox_target (list[Tensor]): BBox targets of an image.
+                bbox_aux_target (int): BBox aux targets of an image.
+                num_pos_per_img (int): Number of positive samples in an image.
+        """
+
+        num_priors = priors.size(0)
+        num_gts = len(gt_instances)
+        # No target
+        if num_gts == 0:
+            cls_target = cls_preds.new_zeros((0, self.num_classes))
+            bbox_target = cls_preds.new_zeros((0, 4))
+            bbox_aux_target = cls_preds.new_zeros((0, 4))
+            obj_target = cls_preds.new_zeros((num_priors, 1))
+            foreground_mask = cls_preds.new_zeros(num_priors).bool()
+            return (foreground_mask, cls_target, obj_target, bbox_target,
+                    bbox_aux_target, 0)
+
+        # YOLOX uses center priors with 0.5 offset to assign targets,
+        # but use center priors without offset to regress bboxes.
+        offset_priors = torch.cat(
+            [priors[:, :2] + priors[:, 2:] * 0.5, priors[:, 2:]], dim=-1)
+
+        scores = cls_preds.sigmoid() * objectness.unsqueeze(1).sigmoid()
+        pred_instances = InstanceData(
+            bboxes=decoded_bboxes, scores=scores.sqrt_(), priors=offset_priors)
+        assign_result = self.assigner.assign(
+            pred_instances=pred_instances,
+            gt_instances=gt_instances,
+            gt_instances_ignore=gt_instances_ignore)
+
+        sampling_result = self.sampler.sample(assign_result, pred_instances,
+                                              gt_instances)
+        pos_inds = sampling_result.pos_inds
+        num_pos_per_img = pos_inds.size(0)
+
+        pos_ious = assign_result.max_overlaps[pos_inds]
+        # IOU aware classification score
+        cls_target = F.one_hot(sampling_result.pos_gt_labels,
+                               self.num_classes) * pos_ious.unsqueeze(-1)
+        obj_target = torch.zeros_like(objectness).unsqueeze(-1)
+        obj_target[pos_inds] = 1
+        bbox_target = sampling_result.pos_gt_bboxes
+        bbox_aux_target = cls_preds.new_zeros((num_pos_per_img, 4))
+        if self.use_bbox_aux:
+            bbox_aux_target = self._get_bbox_aux_target(
+                bbox_aux_target, bbox_target, priors[pos_inds])
+        foreground_mask = torch.zeros_like(objectness).to(torch.bool)
+        foreground_mask[pos_inds] = 1
+        return (foreground_mask, cls_target, obj_target, bbox_target,
+                bbox_aux_target, num_pos_per_img)
+
+    def _get_bbox_aux_target(self,
+                             bbox_aux_target: Tensor,
+                             gt_bboxes: Tensor,
+                             priors: Tensor,
+                             eps: float = 1e-8) -> Tensor:
+        """Convert gt bboxes to center offset and log width height."""
+        gt_cxcywh = bbox_xyxy_to_cxcywh(gt_bboxes)
+        bbox_aux_target[:, :2] = (gt_cxcywh[:, :2] -
+                                  priors[:, :2]) / priors[:, 2:]
+        bbox_aux_target[:,
+                        2:] = torch.log(gt_cxcywh[:, 2:] / priors[:, 2:] + eps)
+        return bbox_aux_target
+
+    @staticmethod
+    def gt_instances_preprocess(batch_gt_instances: Tensor,
+                                batch_size: int) -> List[InstanceData]:
+        """Split batch_gt_instances with batch size.
+
+        Args:
+            batch_gt_instances (Tensor): Ground truth
+                a 2D-Tensor for whole batch, shape [all_gt_bboxes, 6]
+            batch_size (int): Batch size.
+
+        Returns:
+            List: batch gt instances data, shape [batch_size, InstanceData]
+        """
+        # faster version
+        batch_instance_list = []
+        for i in range(batch_size):
+            batch_gt_instance_ = InstanceData()
+            single_batch_instance = \
+                batch_gt_instances[batch_gt_instances[:, 0] == i, :]
+            batch_gt_instance_.bboxes = single_batch_instance[:, 2:]
+            batch_gt_instance_.labels = single_batch_instance[:, 1]
+            batch_instance_list.append(batch_gt_instance_)
+
+        return batch_instance_list
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/models/dense_heads/yolox_pose_head.py b/mmdetection_practice/third_party/mmyolo/mmyolo/models/dense_heads/yolox_pose_head.py
new file mode 100644
index 0000000..96264e5
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/models/dense_heads/yolox_pose_head.py
@@ -0,0 +1,409 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from collections import defaultdict
+from typing import List, Optional, Sequence, Tuple, Union
+
+import torch
+import torch.nn as nn
+from mmcv.ops import batched_nms
+from mmdet.models.utils import filter_scores_and_topk
+from mmdet.utils import ConfigType, OptInstanceList
+from mmengine.config import ConfigDict
+from mmengine.model import ModuleList, bias_init_with_prob
+from mmengine.structures import InstanceData
+from torch import Tensor
+
+from mmyolo.registry import MODELS
+from ..utils import OutputSaveFunctionWrapper, OutputSaveObjectWrapper
+from .yolox_head import YOLOXHead, YOLOXHeadModule
+
+
+@MODELS.register_module()
+class YOLOXPoseHeadModule(YOLOXHeadModule):
+    """YOLOXPoseHeadModule serves as a head module for `YOLOX-Pose`.
+
+    In comparison to `YOLOXHeadModule`, this module introduces branches for
+    keypoint prediction.
+    """
+
+    def __init__(self, num_keypoints: int, *args, **kwargs):
+        self.num_keypoints = num_keypoints
+        super().__init__(*args, **kwargs)
+
+    def _init_layers(self):
+        """Initializes the layers in the head module."""
+        super()._init_layers()
+
+        # The pose branch requires additional layers for precise regression
+        self.stacked_convs *= 2
+
+        # Create separate layers for each level of feature maps
+        pose_convs, offsets_preds, vis_preds = [], [], []
+        for _ in self.featmap_strides:
+            pose_convs.append(self._build_stacked_convs())
+            offsets_preds.append(
+                nn.Conv2d(self.feat_channels, self.num_keypoints * 2, 1))
+            vis_preds.append(
+                nn.Conv2d(self.feat_channels, self.num_keypoints, 1))
+
+        self.multi_level_pose_convs = ModuleList(pose_convs)
+        self.multi_level_conv_offsets = ModuleList(offsets_preds)
+        self.multi_level_conv_vis = ModuleList(vis_preds)
+
+    def init_weights(self):
+        """Initialize weights of the head."""
+        super().init_weights()
+
+        # Use prior in model initialization to improve stability
+        bias_init = bias_init_with_prob(0.01)
+        for conv_vis in self.multi_level_conv_vis:
+            conv_vis.bias.data.fill_(bias_init)
+
+    def forward(self, x: Tuple[Tensor]) -> Tuple[List]:
+        """Forward features from the upstream network."""
+        offsets_pred, vis_pred = [], []
+        for i in range(len(x)):
+            pose_feat = self.multi_level_pose_convs[i](x[i])
+            offsets_pred.append(self.multi_level_conv_offsets[i](pose_feat))
+            vis_pred.append(self.multi_level_conv_vis[i](pose_feat))
+        return (*super().forward(x), offsets_pred, vis_pred)
+
+
+@MODELS.register_module()
+class YOLOXPoseHead(YOLOXHead):
+    """YOLOXPoseHead head used in `YOLO-Pose.
+
+    <https://arxiv.org/abs/2204.06806>`_.
+    Args:
+        loss_pose (ConfigDict, optional): Config of keypoint OKS loss.
+    """
+
+    def __init__(
+        self,
+        loss_pose: Optional[ConfigType] = None,
+        *args,
+        **kwargs,
+    ):
+        super().__init__(*args, **kwargs)
+        self.loss_pose = MODELS.build(loss_pose)
+        self.num_keypoints = self.head_module.num_keypoints
+
+        # set up buffers to save variables generated in methods of
+        # the class's base class.
+        self._log = defaultdict(list)
+        self.sampler = OutputSaveObjectWrapper(self.sampler)
+
+        # ensure that the `sigmas` in self.assigner.oks_calculator
+        # is on the same device as the model
+        if hasattr(self.assigner, 'oks_calculator'):
+            self.add_module('assigner_oks_calculator',
+                            self.assigner.oks_calculator)
+
+    def _clear(self):
+        """Clear variable buffers."""
+        self.sampler.clear()
+        self._log.clear()
+
+    def loss(self, x: Tuple[Tensor], batch_data_samples: Union[list,
+                                                               dict]) -> dict:
+
+        if isinstance(batch_data_samples, list):
+            losses = super().loss(x, batch_data_samples)
+        else:
+            outs = self(x)
+            # Fast version
+            loss_inputs = outs + (batch_data_samples['bboxes_labels'],
+                                  batch_data_samples['keypoints'],
+                                  batch_data_samples['keypoints_visible'],
+                                  batch_data_samples['img_metas'])
+            losses = self.loss_by_feat(*loss_inputs)
+
+        return losses
+
+    def loss_by_feat(
+            self,
+            cls_scores: Sequence[Tensor],
+            bbox_preds: Sequence[Tensor],
+            objectnesses: Sequence[Tensor],
+            kpt_preds: Sequence[Tensor],
+            vis_preds: Sequence[Tensor],
+            batch_gt_instances: Tensor,
+            batch_gt_keypoints: Tensor,
+            batch_gt_keypoints_visible: Tensor,
+            batch_img_metas: Sequence[dict],
+            batch_gt_instances_ignore: OptInstanceList = None) -> dict:
+        """Calculate the loss based on the features extracted by the detection
+        head.
+
+        In addition to the base class method, keypoint losses are also
+        calculated in this method.
+        """
+
+        self._clear()
+        batch_gt_instances = self.gt_kps_instances_preprocess(
+            batch_gt_instances, batch_gt_keypoints, batch_gt_keypoints_visible,
+            len(batch_img_metas))
+
+        # collect keypoints coordinates and visibility from model predictions
+        kpt_preds = torch.cat([
+            kpt_pred.flatten(2).permute(0, 2, 1).contiguous()
+            for kpt_pred in kpt_preds
+        ],
+                              dim=1)
+
+        featmap_sizes = [cls_score.shape[2:] for cls_score in cls_scores]
+        mlvl_priors = self.prior_generator.grid_priors(
+            featmap_sizes,
+            dtype=cls_scores[0].dtype,
+            device=cls_scores[0].device,
+            with_stride=True)
+        grid_priors = torch.cat(mlvl_priors)
+
+        flatten_kpts = self.decode_pose(grid_priors[..., :2], kpt_preds,
+                                        grid_priors[..., 2])
+
+        vis_preds = torch.cat([
+            vis_pred.flatten(2).permute(0, 2, 1).contiguous()
+            for vis_pred in vis_preds
+        ],
+                              dim=1)
+
+        # compute detection losses and collect targets for keypoints
+        # predictions simultaneously
+        self._log['pred_keypoints'] = list(flatten_kpts.detach().split(
+            1, dim=0))
+        self._log['pred_keypoints_vis'] = list(vis_preds.detach().split(
+            1, dim=0))
+
+        losses = super().loss_by_feat(cls_scores, bbox_preds, objectnesses,
+                                      batch_gt_instances, batch_img_metas,
+                                      batch_gt_instances_ignore)
+
+        kpt_targets, vis_targets = [], []
+        sampling_results = self.sampler.log['sample']
+        sampling_result_idx = 0
+        for gt_instances in batch_gt_instances:
+            if len(gt_instances) > 0:
+                sampling_result = sampling_results[sampling_result_idx]
+                kpt_target = gt_instances['keypoints'][
+                    sampling_result.pos_assigned_gt_inds]
+                vis_target = gt_instances['keypoints_visible'][
+                    sampling_result.pos_assigned_gt_inds]
+                sampling_result_idx += 1
+                kpt_targets.append(kpt_target)
+                vis_targets.append(vis_target)
+
+        if len(kpt_targets) > 0:
+            kpt_targets = torch.cat(kpt_targets, 0)
+            vis_targets = torch.cat(vis_targets, 0)
+
+        # compute keypoint losses
+        if len(kpt_targets) > 0:
+            vis_targets = (vis_targets > 0).float()
+            pos_masks = torch.cat(self._log['foreground_mask'], 0)
+            bbox_targets = torch.cat(self._log['bbox_target'], 0)
+            loss_kpt = self.loss_pose(
+                flatten_kpts.view(-1, self.num_keypoints, 2)[pos_masks],
+                kpt_targets, vis_targets, bbox_targets)
+            loss_vis = self.loss_cls(
+                vis_preds.view(-1, self.num_keypoints)[pos_masks],
+                vis_targets) / vis_targets.sum()
+        else:
+            loss_kpt = kpt_preds.sum() * 0
+            loss_vis = vis_preds.sum() * 0
+
+        losses.update(dict(loss_kpt=loss_kpt, loss_vis=loss_vis))
+
+        self._clear()
+        return losses
+
+    @torch.no_grad()
+    def _get_targets_single(
+            self,
+            priors: Tensor,
+            cls_preds: Tensor,
+            decoded_bboxes: Tensor,
+            objectness: Tensor,
+            gt_instances: InstanceData,
+            img_meta: dict,
+            gt_instances_ignore: Optional[InstanceData] = None) -> tuple:
+        """Calculates targets for a single image, and saves them to the log.
+
+        This method is similar to the _get_targets_single method in the base
+        class, but additionally saves the foreground mask and bbox targets to
+        the log.
+        """
+
+        # Construct a combined representation of bboxes and keypoints to
+        # ensure keypoints are also involved in the positive sample
+        # assignment process
+        kpt = self._log['pred_keypoints'].pop(0).squeeze(0)
+        kpt_vis = self._log['pred_keypoints_vis'].pop(0).squeeze(0)
+        kpt = torch.cat((kpt, kpt_vis.unsqueeze(-1)), dim=-1)
+        decoded_bboxes = torch.cat((decoded_bboxes, kpt.flatten(1)), dim=1)
+
+        targets = super()._get_targets_single(priors, cls_preds,
+                                              decoded_bboxes, objectness,
+                                              gt_instances, img_meta,
+                                              gt_instances_ignore)
+        self._log['foreground_mask'].append(targets[0])
+        self._log['bbox_target'].append(targets[3])
+        return targets
+
+    def predict_by_feat(self,
+                        cls_scores: List[Tensor],
+                        bbox_preds: List[Tensor],
+                        objectnesses: Optional[List[Tensor]] = None,
+                        kpt_preds: Optional[List[Tensor]] = None,
+                        vis_preds: Optional[List[Tensor]] = None,
+                        batch_img_metas: Optional[List[dict]] = None,
+                        cfg: Optional[ConfigDict] = None,
+                        rescale: bool = True,
+                        with_nms: bool = True) -> List[InstanceData]:
+        """Transform a batch of output features extracted by the head into bbox
+        and keypoint results.
+
+        In addition to the base class method, keypoint predictions are also
+        calculated in this method.
+        """
+        """calculate predicted bboxes and get the kept instances indices.
+
+        use OutputSaveFunctionWrapper as context manager to obtain
+        intermediate output from a parent class without copying a
+        arge block of code
+        """
+        with OutputSaveFunctionWrapper(
+                filter_scores_and_topk,
+                super().predict_by_feat.__globals__) as outputs_1:
+            with OutputSaveFunctionWrapper(
+                    batched_nms,
+                    super()._bbox_post_process.__globals__) as outputs_2:
+                results_list = super().predict_by_feat(cls_scores, bbox_preds,
+                                                       objectnesses,
+                                                       batch_img_metas, cfg,
+                                                       rescale, with_nms)
+                keep_indices_topk = [
+                    out[2][:cfg.max_per_img] for out in outputs_1
+                ]
+                keep_indices_nms = [
+                    out[1][:cfg.max_per_img] for out in outputs_2
+                ]
+
+        num_imgs = len(batch_img_metas)
+
+        # recover keypoints coordinates from model predictions
+        featmap_sizes = [vis_pred.shape[2:] for vis_pred in vis_preds]
+        priors = torch.cat(self.mlvl_priors)
+        strides = [
+            priors.new_full((featmap_size.numel() * self.num_base_priors, ),
+                            stride) for featmap_size, stride in zip(
+                                featmap_sizes, self.featmap_strides)
+        ]
+        strides = torch.cat(strides)
+        kpt_preds = torch.cat([
+            kpt_pred.permute(0, 2, 3, 1).reshape(
+                num_imgs, -1, self.num_keypoints * 2) for kpt_pred in kpt_preds
+        ],
+                              dim=1)
+        flatten_decoded_kpts = self.decode_pose(priors, kpt_preds, strides)
+
+        vis_preds = torch.cat([
+            vis_pred.permute(0, 2, 3, 1).reshape(
+                num_imgs, -1, self.num_keypoints) for vis_pred in vis_preds
+        ],
+                              dim=1).sigmoid()
+
+        # select keypoints predictions according to bbox scores and nms result
+        keep_indices_nms_idx = 0
+        for pred_instances, kpts, kpts_vis, img_meta, keep_idxs \
+            in zip(
+                results_list, flatten_decoded_kpts, vis_preds,
+                batch_img_metas, keep_indices_topk):
+
+            pred_instances.bbox_scores = pred_instances.scores
+
+            if len(pred_instances) == 0:
+                pred_instances.keypoints = kpts[:0]
+                pred_instances.keypoint_scores = kpts_vis[:0]
+                continue
+
+            kpts = kpts[keep_idxs]
+            kpts_vis = kpts_vis[keep_idxs]
+
+            if rescale:
+                pad_param = img_meta.get('img_meta', None)
+                scale_factor = img_meta['scale_factor']
+                if pad_param is not None:
+                    kpts -= kpts.new_tensor([pad_param[2], pad_param[0]])
+                kpts /= kpts.new_tensor(scale_factor).repeat(
+                    (1, self.num_keypoints, 1))
+
+            keep_idxs_nms = keep_indices_nms[keep_indices_nms_idx]
+            kpts = kpts[keep_idxs_nms]
+            kpts_vis = kpts_vis[keep_idxs_nms]
+            keep_indices_nms_idx += 1
+
+            pred_instances.keypoints = kpts
+            pred_instances.keypoint_scores = kpts_vis
+
+        results_list = [r.numpy() for r in results_list]
+        return results_list
+
+    def decode_pose(self, grids: torch.Tensor, offsets: torch.Tensor,
+                    strides: Union[torch.Tensor, int]) -> torch.Tensor:
+        """Decode regression offsets to keypoints.
+
+        Args:
+            grids (torch.Tensor): The coordinates of the feature map grids.
+            offsets (torch.Tensor): The predicted offset of each keypoint
+                relative to its corresponding grid.
+            strides (torch.Tensor | int): The stride of the feature map for
+                each instance.
+        Returns:
+            torch.Tensor: The decoded keypoints coordinates.
+        """
+
+        if isinstance(strides, int):
+            strides = torch.tensor([strides]).to(offsets)
+
+        strides = strides.reshape(1, -1, 1, 1)
+        offsets = offsets.reshape(*offsets.shape[:2], -1, 2)
+        xy_coordinates = (offsets[..., :2] * strides) + grids.unsqueeze(1)
+        return xy_coordinates
+
+    @staticmethod
+    def gt_kps_instances_preprocess(batch_gt_instances: Tensor,
+                                    batch_gt_keypoints,
+                                    batch_gt_keypoints_visible,
+                                    batch_size: int) -> List[InstanceData]:
+        """Split batch_gt_instances with batch size.
+
+        Args:
+            batch_gt_instances (Tensor): Ground truth
+                a 2D-Tensor for whole batch, shape [all_gt_bboxes, 6]
+            batch_size (int): Batch size.
+
+        Returns:
+            List: batch gt instances data, shape [batch_size, InstanceData]
+        """
+        # faster version
+        batch_instance_list = []
+        for i in range(batch_size):
+            batch_gt_instance_ = InstanceData()
+            single_batch_instance = \
+                batch_gt_instances[batch_gt_instances[:, 0] == i, :]
+            keypoints = \
+                batch_gt_keypoints[batch_gt_instances[:, 0] == i, :]
+            keypoints_visible = \
+                batch_gt_keypoints_visible[batch_gt_instances[:, 0] == i, :]
+            batch_gt_instance_.bboxes = single_batch_instance[:, 2:]
+            batch_gt_instance_.labels = single_batch_instance[:, 1]
+            batch_gt_instance_.keypoints = keypoints
+            batch_gt_instance_.keypoints_visible = keypoints_visible
+            batch_instance_list.append(batch_gt_instance_)
+
+        return batch_instance_list
+
+    @staticmethod
+    def gt_instances_preprocess(batch_gt_instances: List[InstanceData], *args,
+                                **kwargs) -> List[InstanceData]:
+        return batch_gt_instances
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/models/detectors/__init__.py b/mmdetection_practice/third_party/mmyolo/mmyolo/models/detectors/__init__.py
new file mode 100644
index 0000000..74fb1c6
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/models/detectors/__init__.py
@@ -0,0 +1,4 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from .yolo_detector import YOLODetector
+
+__all__ = ['YOLODetector']
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/models/detectors/yolo_detector.py b/mmdetection_practice/third_party/mmyolo/mmyolo/models/detectors/yolo_detector.py
new file mode 100644
index 0000000..e6783fb
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/models/detectors/yolo_detector.py
@@ -0,0 +1,53 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+import torch
+from mmdet.models.detectors.single_stage import SingleStageDetector
+from mmdet.utils import ConfigType, OptConfigType, OptMultiConfig
+from mmengine.dist import get_world_size
+from mmengine.logging import print_log
+
+from mmyolo.registry import MODELS
+
+
+@MODELS.register_module()
+class YOLODetector(SingleStageDetector):
+    r"""Implementation of YOLO Series
+
+    Args:
+        backbone (:obj:`ConfigDict` or dict): The backbone config.
+        neck (:obj:`ConfigDict` or dict): The neck config.
+        bbox_head (:obj:`ConfigDict` or dict): The bbox head config.
+        train_cfg (:obj:`ConfigDict` or dict, optional): The training config
+            of YOLO. Defaults to None.
+        test_cfg (:obj:`ConfigDict` or dict, optional): The testing config
+            of YOLO. Defaults to None.
+        data_preprocessor (:obj:`ConfigDict` or dict, optional): Config of
+            :class:`DetDataPreprocessor` to process the input data.
+            Defaults to None.
+        init_cfg (:obj:`ConfigDict` or list[:obj:`ConfigDict`] or dict or
+            list[dict], optional): Initialization config dict.
+            Defaults to None.
+        use_syncbn (bool): whether to use SyncBatchNorm. Defaults to True.
+    """
+
+    def __init__(self,
+                 backbone: ConfigType,
+                 neck: ConfigType,
+                 bbox_head: ConfigType,
+                 train_cfg: OptConfigType = None,
+                 test_cfg: OptConfigType = None,
+                 data_preprocessor: OptConfigType = None,
+                 init_cfg: OptMultiConfig = None,
+                 use_syncbn: bool = True):
+        super().__init__(
+            backbone=backbone,
+            neck=neck,
+            bbox_head=bbox_head,
+            train_cfg=train_cfg,
+            test_cfg=test_cfg,
+            data_preprocessor=data_preprocessor,
+            init_cfg=init_cfg)
+
+        # TODO: Waiting for mmengine support
+        if use_syncbn and get_world_size() > 1:
+            torch.nn.SyncBatchNorm.convert_sync_batchnorm(self)
+            print_log('Using SyncBatchNorm()', 'current')
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/models/layers/__init__.py b/mmdetection_practice/third_party/mmyolo/mmyolo/models/layers/__init__.py
new file mode 100644
index 0000000..0275305
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/models/layers/__init__.py
@@ -0,0 +1,16 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from .ema import ExpMomentumEMA
+from .yolo_bricks import (BepC3StageBlock, BiFusion, CSPLayerWithTwoConv,
+                          DarknetBottleneck, EELANBlock, EffectiveSELayer,
+                          ELANBlock, ImplicitA, ImplicitM,
+                          MaxPoolAndStrideConvBlock, PPYOLOEBasicBlock,
+                          RepStageBlock, RepVGGBlock, SPPFBottleneck,
+                          SPPFCSPBlock, TinyDownSampleBlock)
+
+__all__ = [
+    'SPPFBottleneck', 'RepVGGBlock', 'RepStageBlock', 'ExpMomentumEMA',
+    'ELANBlock', 'MaxPoolAndStrideConvBlock', 'SPPFCSPBlock',
+    'PPYOLOEBasicBlock', 'EffectiveSELayer', 'TinyDownSampleBlock',
+    'EELANBlock', 'ImplicitA', 'ImplicitM', 'BepC3StageBlock',
+    'CSPLayerWithTwoConv', 'DarknetBottleneck', 'BiFusion'
+]
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/models/layers/ema.py b/mmdetection_practice/third_party/mmyolo/mmyolo/models/layers/ema.py
new file mode 100644
index 0000000..02ed204
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/models/layers/ema.py
@@ -0,0 +1,96 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+import math
+from typing import Optional
+
+import torch
+import torch.nn as nn
+from mmdet.models.layers import ExpMomentumEMA as MMDET_ExpMomentumEMA
+from torch import Tensor
+
+from mmyolo.registry import MODELS
+
+
+@MODELS.register_module()
+class ExpMomentumEMA(MMDET_ExpMomentumEMA):
+    """Exponential moving average (EMA) with exponential momentum strategy,
+    which is used in YOLO.
+
+    Args:
+        model (nn.Module): The model to be averaged.
+        momentum (float): The momentum used for updating ema parameter.
+            Ema's parameters are updated with the formula:
+           `averaged_param = (1-momentum) * averaged_param + momentum *
+           source_param`. Defaults to 0.0002.
+        gamma (int): Use a larger momentum early in training and gradually
+            annealing to a smaller value to update the ema model smoothly. The
+            momentum is calculated as
+            `(1 - momentum) * exp(-(1 + steps) / gamma) + momentum`.
+            Defaults to 2000.
+        interval (int): Interval between two updates. Defaults to 1.
+        device (torch.device, optional): If provided, the averaged model will
+            be stored on the :attr:`device`. Defaults to None.
+        update_buffers (bool): if True, it will compute running averages for
+            both the parameters and the buffers of the model. Defaults to
+            False.
+    """
+
+    def __init__(self,
+                 model: nn.Module,
+                 momentum: float = 0.0002,
+                 gamma: int = 2000,
+                 interval=1,
+                 device: Optional[torch.device] = None,
+                 update_buffers: bool = False):
+        super().__init__(
+            model=model,
+            momentum=momentum,
+            interval=interval,
+            device=device,
+            update_buffers=update_buffers)
+        assert gamma > 0, f'gamma must be greater than 0, but got {gamma}'
+        self.gamma = gamma
+
+        # Note: There is no need to re-fetch every update,
+        # as most models do not change their structure
+        # during the training process.
+        self.src_parameters = (
+            model.state_dict()
+            if self.update_buffers else dict(model.named_parameters()))
+        if not self.update_buffers:
+            self.src_buffers = model.buffers()
+
+    def avg_func(self, averaged_param: Tensor, source_param: Tensor,
+                 steps: int):
+        """Compute the moving average of the parameters using the exponential
+        momentum strategy.
+
+        Args:
+            averaged_param (Tensor): The averaged parameters.
+            source_param (Tensor): The source parameters.
+            steps (int): The number of times the parameters have been
+                updated.
+        """
+        momentum = (1 - self.momentum) * math.exp(
+            -float(1 + steps) / self.gamma) + self.momentum
+        averaged_param.lerp_(source_param, momentum)
+
+    def update_parameters(self, model: nn.Module):
+        """Update the parameters after each training step.
+
+        Args:
+            model (nn.Module): The model of the parameter needs to be updated.
+        """
+        if self.steps == 0:
+            for k, p_avg in self.avg_parameters.items():
+                p_avg.data.copy_(self.src_parameters[k].data)
+        elif self.steps % self.interval == 0:
+            for k, p_avg in self.avg_parameters.items():
+                if p_avg.dtype.is_floating_point:
+                    self.avg_func(p_avg.data, self.src_parameters[k].data,
+                                  self.steps)
+        if not self.update_buffers:
+            # If not update the buffers,
+            # keep the buffers in sync with the source model.
+            for b_avg, b_src in zip(self.module.buffers(), self.src_buffers):
+                b_avg.data.copy_(b_src.data)
+        self.steps += 1
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/models/layers/yolo_bricks.py b/mmdetection_practice/third_party/mmyolo/mmyolo/models/layers/yolo_bricks.py
new file mode 100644
index 0000000..19175be
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/models/layers/yolo_bricks.py
@@ -0,0 +1,1728 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from typing import List, Optional, Sequence, Tuple, Union
+
+import numpy as np
+import torch
+import torch.nn as nn
+from mmcv.cnn import (ConvModule, DepthwiseSeparableConvModule, MaxPool2d,
+                      build_norm_layer)
+from mmdet.models.layers.csp_layer import \
+    DarknetBottleneck as MMDET_DarknetBottleneck
+from mmdet.utils import ConfigType, OptConfigType, OptMultiConfig
+from mmengine.model import BaseModule
+from mmengine.utils import digit_version
+from torch import Tensor
+
+from mmyolo.registry import MODELS
+
+if digit_version(torch.__version__) >= digit_version('1.7.0'):
+    MODELS.register_module(module=nn.SiLU, name='SiLU')
+else:
+
+    class SiLU(nn.Module):
+        """Sigmoid Weighted Liner Unit."""
+
+        def __init__(self, inplace=True):
+            super().__init__()
+
+        def forward(self, inputs) -> Tensor:
+            return inputs * torch.sigmoid(inputs)
+
+    MODELS.register_module(module=SiLU, name='SiLU')
+
+
+class SPPFBottleneck(BaseModule):
+    """Spatial pyramid pooling - Fast (SPPF) layer for
+    YOLOv5, YOLOX and PPYOLOE by Glenn Jocher
+
+    Args:
+        in_channels (int): The input channels of this Module.
+        out_channels (int): The output channels of this Module.
+        kernel_sizes (int, tuple[int]): Sequential or number of kernel
+            sizes of pooling layers. Defaults to 5.
+        use_conv_first (bool): Whether to use conv before pooling layer.
+            In YOLOv5 and YOLOX, the para set to True.
+            In PPYOLOE, the para set to False.
+            Defaults to True.
+        mid_channels_scale (float): Channel multiplier, multiply in_channels
+            by this amount to get mid_channels. This parameter is valid only
+            when use_conv_fist=True.Defaults to 0.5.
+        conv_cfg (dict): Config dict for convolution layer. Defaults to None.
+            which means using conv2d. Defaults to None.
+        norm_cfg (dict): Config dict for normalization layer.
+            Defaults to dict(type='BN', momentum=0.03, eps=0.001).
+        act_cfg (dict): Config dict for activation layer.
+            Defaults to dict(type='SiLU', inplace=True).
+        init_cfg (dict or list[dict], optional): Initialization config dict.
+            Defaults to None.
+    """
+
+    def __init__(self,
+                 in_channels: int,
+                 out_channels: int,
+                 kernel_sizes: Union[int, Sequence[int]] = 5,
+                 use_conv_first: bool = True,
+                 mid_channels_scale: float = 0.5,
+                 conv_cfg: ConfigType = None,
+                 norm_cfg: ConfigType = dict(
+                     type='BN', momentum=0.03, eps=0.001),
+                 act_cfg: ConfigType = dict(type='SiLU', inplace=True),
+                 init_cfg: OptMultiConfig = None):
+        super().__init__(init_cfg)
+
+        if use_conv_first:
+            mid_channels = int(in_channels * mid_channels_scale)
+            self.conv1 = ConvModule(
+                in_channels,
+                mid_channels,
+                1,
+                stride=1,
+                conv_cfg=conv_cfg,
+                norm_cfg=norm_cfg,
+                act_cfg=act_cfg)
+        else:
+            mid_channels = in_channels
+            self.conv1 = None
+        self.kernel_sizes = kernel_sizes
+        if isinstance(kernel_sizes, int):
+            self.poolings = nn.MaxPool2d(
+                kernel_size=kernel_sizes, stride=1, padding=kernel_sizes // 2)
+            conv2_in_channels = mid_channels * 4
+        else:
+            self.poolings = nn.ModuleList([
+                nn.MaxPool2d(kernel_size=ks, stride=1, padding=ks // 2)
+                for ks in kernel_sizes
+            ])
+            conv2_in_channels = mid_channels * (len(kernel_sizes) + 1)
+
+        self.conv2 = ConvModule(
+            conv2_in_channels,
+            out_channels,
+            1,
+            conv_cfg=conv_cfg,
+            norm_cfg=norm_cfg,
+            act_cfg=act_cfg)
+
+    def forward(self, x: Tensor) -> Tensor:
+        """Forward process
+        Args:
+            x (Tensor): The input tensor.
+        """
+        if self.conv1:
+            x = self.conv1(x)
+        if isinstance(self.kernel_sizes, int):
+            y1 = self.poolings(x)
+            y2 = self.poolings(y1)
+            x = torch.cat([x, y1, y2, self.poolings(y2)], dim=1)
+        else:
+            x = torch.cat(
+                [x] + [pooling(x) for pooling in self.poolings], dim=1)
+        x = self.conv2(x)
+        return x
+
+
+@MODELS.register_module()
+class RepVGGBlock(nn.Module):
+    """RepVGGBlock is a basic rep-style block, including training and deploy
+    status This code is based on
+    https://github.com/DingXiaoH/RepVGG/blob/main/repvgg.py.
+
+    Args:
+        in_channels (int): Number of channels in the input image
+        out_channels (int): Number of channels produced by the convolution
+        kernel_size (int or tuple): Size of the convolving kernel
+        stride (int or tuple): Stride of the convolution. Default: 1
+        padding (int, tuple): Padding added to all four sides of
+            the input. Default: 1
+        dilation (int or tuple): Spacing between kernel elements. Default: 1
+        groups (int, optional): Number of blocked connections from input
+            channels to output channels. Default: 1
+        padding_mode (string, optional): Default: 'zeros'
+        use_se (bool): Whether to use se. Default: False
+        use_alpha (bool): Whether to use `alpha` parameter at 1x1 conv.
+            In PPYOLOE+ model backbone, `use_alpha` will be set to True.
+            Default: False.
+        use_bn_first (bool): Whether to use bn layer before conv.
+            In YOLOv6 and YOLOv7, this will be set to True.
+            In PPYOLOE, this will be set to False.
+            Default: True.
+        deploy (bool): Whether in deploy mode. Default: False
+    """
+
+    def __init__(self,
+                 in_channels: int,
+                 out_channels: int,
+                 kernel_size: Union[int, Tuple[int]] = 3,
+                 stride: Union[int, Tuple[int]] = 1,
+                 padding: Union[int, Tuple[int]] = 1,
+                 dilation: Union[int, Tuple[int]] = 1,
+                 groups: Optional[int] = 1,
+                 padding_mode: Optional[str] = 'zeros',
+                 norm_cfg: ConfigType = dict(
+                     type='BN', momentum=0.03, eps=0.001),
+                 act_cfg: ConfigType = dict(type='ReLU', inplace=True),
+                 use_se: bool = False,
+                 use_alpha: bool = False,
+                 use_bn_first=True,
+                 deploy: bool = False):
+        super().__init__()
+        self.deploy = deploy
+        self.groups = groups
+        self.in_channels = in_channels
+        self.out_channels = out_channels
+
+        assert kernel_size == 3
+        assert padding == 1
+
+        padding_11 = padding - kernel_size // 2
+
+        self.nonlinearity = MODELS.build(act_cfg)
+
+        if use_se:
+            raise NotImplementedError('se block not supported yet')
+        else:
+            self.se = nn.Identity()
+
+        if use_alpha:
+            alpha = torch.ones([
+                1,
+            ], dtype=torch.float32, requires_grad=True)
+            self.alpha = nn.Parameter(alpha, requires_grad=True)
+        else:
+            self.alpha = None
+
+        if deploy:
+            self.rbr_reparam = nn.Conv2d(
+                in_channels=in_channels,
+                out_channels=out_channels,
+                kernel_size=kernel_size,
+                stride=stride,
+                padding=padding,
+                dilation=dilation,
+                groups=groups,
+                bias=True,
+                padding_mode=padding_mode)
+
+        else:
+            if use_bn_first and (out_channels == in_channels) and stride == 1:
+                self.rbr_identity = build_norm_layer(
+                    norm_cfg, num_features=in_channels)[1]
+            else:
+                self.rbr_identity = None
+
+            self.rbr_dense = ConvModule(
+                in_channels=in_channels,
+                out_channels=out_channels,
+                kernel_size=kernel_size,
+                stride=stride,
+                padding=padding,
+                groups=groups,
+                bias=False,
+                norm_cfg=norm_cfg,
+                act_cfg=None)
+            self.rbr_1x1 = ConvModule(
+                in_channels=in_channels,
+                out_channels=out_channels,
+                kernel_size=1,
+                stride=stride,
+                padding=padding_11,
+                groups=groups,
+                bias=False,
+                norm_cfg=norm_cfg,
+                act_cfg=None)
+
+    def forward(self, inputs: Tensor) -> Tensor:
+        """Forward process.
+        Args:
+            inputs (Tensor): The input tensor.
+
+        Returns:
+            Tensor: The output tensor.
+        """
+        if hasattr(self, 'rbr_reparam'):
+            return self.nonlinearity(self.se(self.rbr_reparam(inputs)))
+
+        if self.rbr_identity is None:
+            id_out = 0
+        else:
+            id_out = self.rbr_identity(inputs)
+        if self.alpha:
+            return self.nonlinearity(
+                self.se(
+                    self.rbr_dense(inputs) +
+                    self.alpha * self.rbr_1x1(inputs) + id_out))
+        else:
+            return self.nonlinearity(
+                self.se(
+                    self.rbr_dense(inputs) + self.rbr_1x1(inputs) + id_out))
+
+    def get_equivalent_kernel_bias(self):
+        """Derives the equivalent kernel and bias in a differentiable way.
+
+        Returns:
+            tuple: Equivalent kernel and bias
+        """
+        kernel3x3, bias3x3 = self._fuse_bn_tensor(self.rbr_dense)
+        kernel1x1, bias1x1 = self._fuse_bn_tensor(self.rbr_1x1)
+        kernelid, biasid = self._fuse_bn_tensor(self.rbr_identity)
+        if self.alpha:
+            return kernel3x3 + self.alpha * self._pad_1x1_to_3x3_tensor(
+                kernel1x1) + kernelid, bias3x3 + self.alpha * bias1x1 + biasid
+        else:
+            return kernel3x3 + self._pad_1x1_to_3x3_tensor(
+                kernel1x1) + kernelid, bias3x3 + bias1x1 + biasid
+
+    def _pad_1x1_to_3x3_tensor(self, kernel1x1):
+        """Pad 1x1 tensor to 3x3.
+        Args:
+            kernel1x1 (Tensor): The input 1x1 kernel need to be padded.
+
+        Returns:
+            Tensor: 3x3 kernel after padded.
+        """
+        if kernel1x1 is None:
+            return 0
+        else:
+            return torch.nn.functional.pad(kernel1x1, [1, 1, 1, 1])
+
+    def _fuse_bn_tensor(self, branch: nn.Module) -> Tuple[np.ndarray, Tensor]:
+        """Derives the equivalent kernel and bias of a specific branch layer.
+
+        Args:
+            branch (nn.Module): The layer that needs to be equivalently
+                transformed, which can be nn.Sequential or nn.Batchnorm2d
+
+        Returns:
+            tuple: Equivalent kernel and bias
+        """
+        if branch is None:
+            return 0, 0
+        if isinstance(branch, ConvModule):
+            kernel = branch.conv.weight
+            running_mean = branch.bn.running_mean
+            running_var = branch.bn.running_var
+            gamma = branch.bn.weight
+            beta = branch.bn.bias
+            eps = branch.bn.eps
+        else:
+            assert isinstance(branch, (nn.SyncBatchNorm, nn.BatchNorm2d))
+            if not hasattr(self, 'id_tensor'):
+                input_dim = self.in_channels // self.groups
+                kernel_value = np.zeros((self.in_channels, input_dim, 3, 3),
+                                        dtype=np.float32)
+                for i in range(self.in_channels):
+                    kernel_value[i, i % input_dim, 1, 1] = 1
+                self.id_tensor = torch.from_numpy(kernel_value).to(
+                    branch.weight.device)
+            kernel = self.id_tensor
+            running_mean = branch.running_mean
+            running_var = branch.running_var
+            gamma = branch.weight
+            beta = branch.bias
+            eps = branch.eps
+        std = (running_var + eps).sqrt()
+        t = (gamma / std).reshape(-1, 1, 1, 1)
+        return kernel * t, beta - running_mean * gamma / std
+
+    def switch_to_deploy(self):
+        """Switch to deploy mode."""
+        if hasattr(self, 'rbr_reparam'):
+            return
+        kernel, bias = self.get_equivalent_kernel_bias()
+        self.rbr_reparam = nn.Conv2d(
+            in_channels=self.rbr_dense.conv.in_channels,
+            out_channels=self.rbr_dense.conv.out_channels,
+            kernel_size=self.rbr_dense.conv.kernel_size,
+            stride=self.rbr_dense.conv.stride,
+            padding=self.rbr_dense.conv.padding,
+            dilation=self.rbr_dense.conv.dilation,
+            groups=self.rbr_dense.conv.groups,
+            bias=True)
+        self.rbr_reparam.weight.data = kernel
+        self.rbr_reparam.bias.data = bias
+        for para in self.parameters():
+            para.detach_()
+        self.__delattr__('rbr_dense')
+        self.__delattr__('rbr_1x1')
+        if hasattr(self, 'rbr_identity'):
+            self.__delattr__('rbr_identity')
+        if hasattr(self, 'id_tensor'):
+            self.__delattr__('id_tensor')
+        self.deploy = True
+
+
+@MODELS.register_module()
+class BepC3StageBlock(nn.Module):
+    """Beer-mug RepC3 Block.
+
+    Args:
+        in_channels (int): Number of channels in the input image
+        out_channels (int): Number of channels produced by the convolution
+        num_blocks (int): Number of blocks. Defaults to 1
+        hidden_ratio (float): Hidden channel expansion.
+            Default: 0.5
+        concat_all_layer (bool): Concat all layer when forward calculate.
+            Default: True
+        block_cfg (dict): Config dict for the block used to build each
+            layer. Defaults to dict(type='RepVGGBlock').
+        norm_cfg (ConfigType): Config dict for normalization layer.
+            Defaults to dict(type='BN', momentum=0.03, eps=0.001).
+        act_cfg (ConfigType): Config dict for activation layer.
+            Defaults to dict(type='ReLU', inplace=True).
+    """
+
+    def __init__(self,
+                 in_channels: int,
+                 out_channels: int,
+                 num_blocks: int = 1,
+                 hidden_ratio: float = 0.5,
+                 concat_all_layer: bool = True,
+                 block_cfg: ConfigType = dict(type='RepVGGBlock'),
+                 norm_cfg: ConfigType = dict(
+                     type='BN', momentum=0.03, eps=0.001),
+                 act_cfg: ConfigType = dict(type='ReLU', inplace=True)):
+        super().__init__()
+        hidden_channels = int(out_channels * hidden_ratio)
+
+        self.conv1 = ConvModule(
+            in_channels,
+            hidden_channels,
+            kernel_size=1,
+            stride=1,
+            groups=1,
+            bias=False,
+            norm_cfg=norm_cfg,
+            act_cfg=act_cfg)
+        self.conv2 = ConvModule(
+            in_channels,
+            hidden_channels,
+            kernel_size=1,
+            stride=1,
+            groups=1,
+            bias=False,
+            norm_cfg=norm_cfg,
+            act_cfg=act_cfg)
+        self.conv3 = ConvModule(
+            2 * hidden_channels,
+            out_channels,
+            kernel_size=1,
+            stride=1,
+            groups=1,
+            bias=False,
+            norm_cfg=norm_cfg,
+            act_cfg=act_cfg)
+        self.block = RepStageBlock(
+            in_channels=hidden_channels,
+            out_channels=hidden_channels,
+            num_blocks=num_blocks,
+            block_cfg=block_cfg,
+            bottle_block=BottleRep)
+        self.concat_all_layer = concat_all_layer
+        if not concat_all_layer:
+            self.conv3 = ConvModule(
+                hidden_channels,
+                out_channels,
+                kernel_size=1,
+                stride=1,
+                groups=1,
+                bias=False,
+                norm_cfg=norm_cfg,
+                act_cfg=act_cfg)
+
+    def forward(self, x):
+        if self.concat_all_layer is True:
+            return self.conv3(
+                torch.cat((self.block(self.conv1(x)), self.conv2(x)), dim=1))
+        else:
+            return self.conv3(self.block(self.conv1(x)))
+
+
+class BottleRep(nn.Module):
+    """Bottle Rep Block.
+
+    Args:
+        in_channels (int): Number of channels in the input image
+        out_channels (int): Number of channels produced by the convolution
+        block_cfg (dict): Config dict for the block used to build each
+            layer. Defaults to dict(type='RepVGGBlock').
+        adaptive_weight (bool): Add adaptive_weight when forward calculate.
+            Defaults False.
+    """
+
+    def __init__(self,
+                 in_channels: int,
+                 out_channels: int,
+                 block_cfg: ConfigType = dict(type='RepVGGBlock'),
+                 adaptive_weight: bool = False):
+        super().__init__()
+        conv1_cfg = block_cfg.copy()
+        conv2_cfg = block_cfg.copy()
+
+        conv1_cfg.update(
+            dict(in_channels=in_channels, out_channels=out_channels))
+        conv2_cfg.update(
+            dict(in_channels=out_channels, out_channels=out_channels))
+
+        self.conv1 = MODELS.build(conv1_cfg)
+        self.conv2 = MODELS.build(conv2_cfg)
+
+        if in_channels != out_channels:
+            self.shortcut = False
+        else:
+            self.shortcut = True
+        if adaptive_weight:
+            self.alpha = nn.Parameter(torch.ones(1))
+        else:
+            self.alpha = 1.0
+
+    def forward(self, x: Tensor) -> Tensor:
+        outputs = self.conv1(x)
+        outputs = self.conv2(outputs)
+        return outputs + self.alpha * x if self.shortcut else outputs
+
+
+@MODELS.register_module()
+class ConvWrapper(nn.Module):
+    """Wrapper for normal Conv with SiLU activation.
+
+    Args:
+        in_channels (int): Number of channels in the input image
+        out_channels (int): Number of channels produced by the convolution
+        kernel_size (int or tuple): Size of the convolving kernel
+        stride (int or tuple): Stride of the convolution. Default: 1
+        groups (int, optional): Number of blocked connections from input
+            channels to output channels. Default: 1
+        bias (bool, optional): Conv bias. Default: True.
+        norm_cfg (ConfigType): Config dict for normalization layer.
+            Defaults to dict(type='BN', momentum=0.03, eps=0.001).
+        act_cfg (ConfigType): Config dict for activation layer.
+            Defaults to dict(type='ReLU', inplace=True).
+    """
+
+    def __init__(self,
+                 in_channels: int,
+                 out_channels: int,
+                 kernel_size: int = 3,
+                 stride: int = 1,
+                 groups: int = 1,
+                 bias: bool = True,
+                 norm_cfg: ConfigType = None,
+                 act_cfg: ConfigType = dict(type='SiLU')):
+        super().__init__()
+        self.block = ConvModule(
+            in_channels,
+            out_channels,
+            kernel_size,
+            stride,
+            padding=kernel_size // 2,
+            groups=groups,
+            bias=bias,
+            norm_cfg=norm_cfg,
+            act_cfg=act_cfg)
+
+    def forward(self, x: Tensor) -> Tensor:
+        return self.block(x)
+
+
+@MODELS.register_module()
+class EffectiveSELayer(nn.Module):
+    """Effective Squeeze-Excitation.
+
+    From `CenterMask : Real-Time Anchor-Free Instance Segmentation`
+    arxiv (https://arxiv.org/abs/1911.06667)
+    This code referenced to
+    https://github.com/youngwanLEE/CenterMask/blob/72147e8aae673fcaf4103ee90a6a6b73863e7fa1/maskrcnn_benchmark/modeling/backbone/vovnet.py#L108-L121  # noqa
+
+    Args:
+        channels (int): The input and output channels of this Module.
+        act_cfg (dict): Config dict for activation layer.
+            Defaults to dict(type='HSigmoid').
+    """
+
+    def __init__(self,
+                 channels: int,
+                 act_cfg: ConfigType = dict(type='HSigmoid')):
+        super().__init__()
+        assert isinstance(act_cfg, dict)
+        self.fc = ConvModule(channels, channels, 1, act_cfg=None)
+
+        act_cfg_ = act_cfg.copy()  # type: ignore
+        self.activate = MODELS.build(act_cfg_)
+
+    def forward(self, x: Tensor) -> Tensor:
+        """Forward process
+         Args:
+             x (Tensor): The input tensor.
+         """
+        x_se = x.mean((2, 3), keepdim=True)
+        x_se = self.fc(x_se)
+        return x * self.activate(x_se)
+
+
+class PPYOLOESELayer(nn.Module):
+    """Squeeze-and-Excitation Attention Module for PPYOLOE.
+        There are some differences between the current implementation and
+        SELayer in mmdet:
+            1. For fast speed and avoiding double inference in ppyoloe,
+               use `F.adaptive_avg_pool2d` before PPYOLOESELayer.
+            2. Special ways to init weights.
+            3. Different convolution order.
+
+    Args:
+        feat_channels (int): The input (and output) channels of the SE layer.
+        norm_cfg (dict): Config dict for normalization layer.
+            Defaults to dict(type='BN', momentum=0.1, eps=1e-5).
+        act_cfg (dict): Config dict for activation layer.
+            Defaults to dict(type='SiLU', inplace=True).
+    """
+
+    def __init__(self,
+                 feat_channels: int,
+                 norm_cfg: ConfigType = dict(
+                     type='BN', momentum=0.1, eps=1e-5),
+                 act_cfg: ConfigType = dict(type='SiLU', inplace=True)):
+        super().__init__()
+        self.fc = nn.Conv2d(feat_channels, feat_channels, 1)
+        self.sig = nn.Sigmoid()
+        self.conv = ConvModule(
+            feat_channels,
+            feat_channels,
+            1,
+            norm_cfg=norm_cfg,
+            act_cfg=act_cfg)
+
+        self._init_weights()
+
+    def _init_weights(self):
+        """Init weights."""
+        nn.init.normal_(self.fc.weight, mean=0, std=0.001)
+
+    def forward(self, feat: Tensor, avg_feat: Tensor) -> Tensor:
+        """Forward process
+         Args:
+             feat (Tensor): The input tensor.
+             avg_feat (Tensor): Average pooling feature tensor.
+         """
+        weight = self.sig(self.fc(avg_feat))
+        return self.conv(feat * weight)
+
+
+@MODELS.register_module()
+class ELANBlock(BaseModule):
+    """Efficient layer aggregation networks for YOLOv7.
+
+    Args:
+        in_channels (int): The input channels of this Module.
+        out_channels (int): The out channels of this Module.
+        middle_ratio (float): The scaling ratio of the middle layer
+            based on the in_channels.
+        block_ratio (float): The scaling ratio of the block layer
+            based on the in_channels.
+        num_blocks (int): The number of blocks in the main branch.
+            Defaults to 2.
+        num_convs_in_block (int): The number of convs pre block.
+            Defaults to 1.
+        conv_cfg (dict): Config dict for convolution layer. Defaults to None.
+            which means using conv2d. Defaults to None.
+        norm_cfg (dict): Config dict for normalization layer.
+            Defaults to dict(type='BN', momentum=0.03, eps=0.001).
+        act_cfg (dict): Config dict for activation layer.
+            Defaults to dict(type='SiLU', inplace=True).
+        init_cfg (dict or list[dict], optional): Initialization config dict.
+            Defaults to None.
+    """
+
+    def __init__(self,
+                 in_channels: int,
+                 out_channels: int,
+                 middle_ratio: float,
+                 block_ratio: float,
+                 num_blocks: int = 2,
+                 num_convs_in_block: int = 1,
+                 conv_cfg: OptConfigType = None,
+                 norm_cfg: ConfigType = dict(
+                     type='BN', momentum=0.03, eps=0.001),
+                 act_cfg: ConfigType = dict(type='SiLU', inplace=True),
+                 init_cfg: OptMultiConfig = None):
+        super().__init__(init_cfg=init_cfg)
+        assert num_blocks >= 1
+        assert num_convs_in_block >= 1
+
+        middle_channels = int(in_channels * middle_ratio)
+        block_channels = int(in_channels * block_ratio)
+        final_conv_in_channels = int(
+            num_blocks * block_channels) + 2 * middle_channels
+
+        self.main_conv = ConvModule(
+            in_channels,
+            middle_channels,
+            1,
+            conv_cfg=conv_cfg,
+            norm_cfg=norm_cfg,
+            act_cfg=act_cfg)
+
+        self.short_conv = ConvModule(
+            in_channels,
+            middle_channels,
+            1,
+            conv_cfg=conv_cfg,
+            norm_cfg=norm_cfg,
+            act_cfg=act_cfg)
+
+        self.blocks = nn.ModuleList()
+        for _ in range(num_blocks):
+            if num_convs_in_block == 1:
+                internal_block = ConvModule(
+                    middle_channels,
+                    block_channels,
+                    3,
+                    padding=1,
+                    conv_cfg=conv_cfg,
+                    norm_cfg=norm_cfg,
+                    act_cfg=act_cfg)
+            else:
+                internal_block = []
+                for _ in range(num_convs_in_block):
+                    internal_block.append(
+                        ConvModule(
+                            middle_channels,
+                            block_channels,
+                            3,
+                            padding=1,
+                            conv_cfg=conv_cfg,
+                            norm_cfg=norm_cfg,
+                            act_cfg=act_cfg))
+                    middle_channels = block_channels
+                internal_block = nn.Sequential(*internal_block)
+
+            middle_channels = block_channels
+            self.blocks.append(internal_block)
+
+        self.final_conv = ConvModule(
+            final_conv_in_channels,
+            out_channels,
+            1,
+            conv_cfg=conv_cfg,
+            norm_cfg=norm_cfg,
+            act_cfg=act_cfg)
+
+    def forward(self, x: Tensor) -> Tensor:
+        """Forward process
+         Args:
+             x (Tensor): The input tensor.
+         """
+        x_short = self.short_conv(x)
+        x_main = self.main_conv(x)
+        block_outs = []
+        x_block = x_main
+        for block in self.blocks:
+            x_block = block(x_block)
+            block_outs.append(x_block)
+        x_final = torch.cat((*block_outs[::-1], x_main, x_short), dim=1)
+        return self.final_conv(x_final)
+
+
+@MODELS.register_module()
+class EELANBlock(BaseModule):
+    """Expand efficient layer aggregation networks for YOLOv7.
+
+    Args:
+        num_elan_block (int): The number of ELANBlock.
+    """
+
+    def __init__(self, num_elan_block: int, **kwargs):
+        super().__init__()
+        assert num_elan_block >= 1
+        self.e_elan_blocks = nn.ModuleList()
+        for _ in range(num_elan_block):
+            self.e_elan_blocks.append(ELANBlock(**kwargs))
+
+    def forward(self, x: Tensor) -> Tensor:
+        outs = []
+        for elan_blocks in self.e_elan_blocks:
+            outs.append(elan_blocks(x))
+        return sum(outs)
+
+
+class MaxPoolAndStrideConvBlock(BaseModule):
+    """Max pooling and stride conv layer for YOLOv7.
+
+    Args:
+        in_channels (int): The input channels of this Module.
+        out_channels (int): The out channels of this Module.
+        maxpool_kernel_sizes (int): kernel sizes of pooling layers.
+            Defaults to 2.
+        use_in_channels_of_middle (bool): Whether to calculate middle channels
+            based on in_channels. Defaults to False.
+        conv_cfg (dict): Config dict for convolution layer. Defaults to None.
+            which means using conv2d. Defaults to None.
+        norm_cfg (dict): Config dict for normalization layer.
+            Defaults to dict(type='BN', momentum=0.03, eps=0.001).
+        act_cfg (dict): Config dict for activation layer.
+            Defaults to dict(type='SiLU', inplace=True).
+        init_cfg (dict or list[dict], optional): Initialization config dict.
+            Defaults to None.
+    """
+
+    def __init__(self,
+                 in_channels: int,
+                 out_channels: int,
+                 maxpool_kernel_sizes: int = 2,
+                 use_in_channels_of_middle: bool = False,
+                 conv_cfg: OptConfigType = None,
+                 norm_cfg: ConfigType = dict(
+                     type='BN', momentum=0.03, eps=0.001),
+                 act_cfg: ConfigType = dict(type='SiLU', inplace=True),
+                 init_cfg: OptMultiConfig = None):
+        super().__init__(init_cfg=init_cfg)
+
+        middle_channels = in_channels if use_in_channels_of_middle \
+            else out_channels // 2
+
+        self.maxpool_branches = nn.Sequential(
+            MaxPool2d(
+                kernel_size=maxpool_kernel_sizes, stride=maxpool_kernel_sizes),
+            ConvModule(
+                in_channels,
+                out_channels // 2,
+                1,
+                conv_cfg=conv_cfg,
+                norm_cfg=norm_cfg,
+                act_cfg=act_cfg))
+
+        self.stride_conv_branches = nn.Sequential(
+            ConvModule(
+                in_channels,
+                middle_channels,
+                1,
+                conv_cfg=conv_cfg,
+                norm_cfg=norm_cfg,
+                act_cfg=act_cfg),
+            ConvModule(
+                middle_channels,
+                out_channels // 2,
+                3,
+                stride=2,
+                padding=1,
+                conv_cfg=conv_cfg,
+                norm_cfg=norm_cfg,
+                act_cfg=act_cfg))
+
+    def forward(self, x: Tensor) -> Tensor:
+        """Forward process
+        Args:
+            x (Tensor): The input tensor.
+        """
+        maxpool_out = self.maxpool_branches(x)
+        stride_conv_out = self.stride_conv_branches(x)
+        return torch.cat([stride_conv_out, maxpool_out], dim=1)
+
+
+@MODELS.register_module()
+class TinyDownSampleBlock(BaseModule):
+    """Down sample layer for YOLOv7-tiny.
+
+    Args:
+        in_channels (int): The input channels of this Module.
+        out_channels (int): The out channels of this Module.
+        middle_ratio (float): The scaling ratio of the middle layer
+            based on the in_channels. Defaults to 1.0.
+        kernel_sizes (int, tuple[int]): Sequential or number of kernel
+             sizes of pooling layers. Defaults to 3.
+        conv_cfg (dict): Config dict for convolution layer. Defaults to None.
+            which means using conv2d. Defaults to None.
+        norm_cfg (dict): Config dict for normalization layer.
+            Defaults to dict(type='BN', momentum=0.03, eps=0.001).
+        act_cfg (dict): Config dict for activation layer.
+            Defaults to dict(type='LeakyReLU', negative_slope=0.1).
+        init_cfg (dict or list[dict], optional): Initialization config dict.
+            Defaults to None.
+    """
+
+    def __init__(
+            self,
+            in_channels: int,
+            out_channels: int,
+            middle_ratio: float = 1.0,
+            kernel_sizes: Union[int, Sequence[int]] = 3,
+            conv_cfg: OptConfigType = None,
+            norm_cfg: ConfigType = dict(type='BN', momentum=0.03, eps=0.001),
+            act_cfg: ConfigType = dict(type='LeakyReLU', negative_slope=0.1),
+            init_cfg: OptMultiConfig = None):
+        super().__init__(init_cfg)
+
+        middle_channels = int(in_channels * middle_ratio)
+
+        self.short_conv = ConvModule(
+            in_channels,
+            middle_channels,
+            1,
+            conv_cfg=conv_cfg,
+            norm_cfg=norm_cfg,
+            act_cfg=act_cfg)
+
+        self.main_convs = nn.ModuleList()
+        for i in range(3):
+            if i == 0:
+                self.main_convs.append(
+                    ConvModule(
+                        in_channels,
+                        middle_channels,
+                        1,
+                        conv_cfg=conv_cfg,
+                        norm_cfg=norm_cfg,
+                        act_cfg=act_cfg))
+            else:
+                self.main_convs.append(
+                    ConvModule(
+                        middle_channels,
+                        middle_channels,
+                        kernel_sizes,
+                        padding=(kernel_sizes - 1) // 2,
+                        conv_cfg=conv_cfg,
+                        norm_cfg=norm_cfg,
+                        act_cfg=act_cfg))
+
+        self.final_conv = ConvModule(
+            middle_channels * 4,
+            out_channels,
+            1,
+            conv_cfg=conv_cfg,
+            norm_cfg=norm_cfg,
+            act_cfg=act_cfg)
+
+    def forward(self, x) -> Tensor:
+        short_out = self.short_conv(x)
+
+        main_outs = []
+        for main_conv in self.main_convs:
+            main_out = main_conv(x)
+            main_outs.append(main_out)
+            x = main_out
+
+        return self.final_conv(torch.cat([*main_outs[::-1], short_out], dim=1))
+
+
+@MODELS.register_module()
+class SPPFCSPBlock(BaseModule):
+    """Spatial pyramid pooling - Fast (SPPF) layer with CSP for
+     YOLOv7
+
+     Args:
+         in_channels (int): The input channels of this Module.
+         out_channels (int): The output channels of this Module.
+         expand_ratio (float): Expand ratio of SPPCSPBlock.
+            Defaults to 0.5.
+         kernel_sizes (int, tuple[int]): Sequential or number of kernel
+             sizes of pooling layers. Defaults to 5.
+         is_tiny_version (bool): Is tiny version of SPPFCSPBlock. If True,
+            it means it is a yolov7 tiny model. Defaults to False.
+         conv_cfg (dict): Config dict for convolution layer. Defaults to None.
+             which means using conv2d. Defaults to None.
+         norm_cfg (dict): Config dict for normalization layer.
+             Defaults to dict(type='BN', momentum=0.03, eps=0.001).
+         act_cfg (dict): Config dict for activation layer.
+             Defaults to dict(type='SiLU', inplace=True).
+         init_cfg (dict or list[dict], optional): Initialization config dict.
+             Defaults to None.
+     """
+
+    def __init__(self,
+                 in_channels: int,
+                 out_channels: int,
+                 expand_ratio: float = 0.5,
+                 kernel_sizes: Union[int, Sequence[int]] = 5,
+                 is_tiny_version: bool = False,
+                 conv_cfg: OptConfigType = None,
+                 norm_cfg: ConfigType = dict(
+                     type='BN', momentum=0.03, eps=0.001),
+                 act_cfg: ConfigType = dict(type='SiLU', inplace=True),
+                 init_cfg: OptMultiConfig = None):
+        super().__init__(init_cfg=init_cfg)
+        self.is_tiny_version = is_tiny_version
+
+        mid_channels = int(2 * out_channels * expand_ratio)
+
+        if is_tiny_version:
+            self.main_layers = ConvModule(
+                in_channels,
+                mid_channels,
+                1,
+                conv_cfg=conv_cfg,
+                norm_cfg=norm_cfg,
+                act_cfg=act_cfg)
+        else:
+            self.main_layers = nn.Sequential(
+                ConvModule(
+                    in_channels,
+                    mid_channels,
+                    1,
+                    conv_cfg=conv_cfg,
+                    norm_cfg=norm_cfg,
+                    act_cfg=act_cfg),
+                ConvModule(
+                    mid_channels,
+                    mid_channels,
+                    3,
+                    padding=1,
+                    conv_cfg=conv_cfg,
+                    norm_cfg=norm_cfg,
+                    act_cfg=act_cfg),
+                ConvModule(
+                    mid_channels,
+                    mid_channels,
+                    1,
+                    conv_cfg=conv_cfg,
+                    norm_cfg=norm_cfg,
+                    act_cfg=act_cfg),
+            )
+
+        self.kernel_sizes = kernel_sizes
+        if isinstance(kernel_sizes, int):
+            self.poolings = nn.MaxPool2d(
+                kernel_size=kernel_sizes, stride=1, padding=kernel_sizes // 2)
+        else:
+            self.poolings = nn.ModuleList([
+                nn.MaxPool2d(kernel_size=ks, stride=1, padding=ks // 2)
+                for ks in kernel_sizes
+            ])
+
+        if is_tiny_version:
+            self.fuse_layers = ConvModule(
+                4 * mid_channels,
+                mid_channels,
+                1,
+                conv_cfg=conv_cfg,
+                norm_cfg=norm_cfg,
+                act_cfg=act_cfg)
+        else:
+            self.fuse_layers = nn.Sequential(
+                ConvModule(
+                    4 * mid_channels,
+                    mid_channels,
+                    1,
+                    conv_cfg=conv_cfg,
+                    norm_cfg=norm_cfg,
+                    act_cfg=act_cfg),
+                ConvModule(
+                    mid_channels,
+                    mid_channels,
+                    3,
+                    padding=1,
+                    conv_cfg=conv_cfg,
+                    norm_cfg=norm_cfg,
+                    act_cfg=act_cfg))
+
+        self.short_layer = ConvModule(
+            in_channels,
+            mid_channels,
+            1,
+            conv_cfg=conv_cfg,
+            norm_cfg=norm_cfg,
+            act_cfg=act_cfg)
+
+        self.final_conv = ConvModule(
+            2 * mid_channels,
+            out_channels,
+            1,
+            conv_cfg=conv_cfg,
+            norm_cfg=norm_cfg,
+            act_cfg=act_cfg)
+
+    def forward(self, x) -> Tensor:
+        """Forward process
+        Args:
+            x (Tensor): The input tensor.
+        """
+        x1 = self.main_layers(x)
+        if isinstance(self.kernel_sizes, int):
+            y1 = self.poolings(x1)
+            y2 = self.poolings(y1)
+            concat_list = [x1] + [y1, y2, self.poolings(y2)]
+            if self.is_tiny_version:
+                x1 = self.fuse_layers(torch.cat(concat_list[::-1], 1))
+            else:
+                x1 = self.fuse_layers(torch.cat(concat_list, 1))
+        else:
+            concat_list = [x1] + [m(x1) for m in self.poolings]
+            if self.is_tiny_version:
+                x1 = self.fuse_layers(torch.cat(concat_list[::-1], 1))
+            else:
+                x1 = self.fuse_layers(torch.cat(concat_list, 1))
+
+        x2 = self.short_layer(x)
+        return self.final_conv(torch.cat((x1, x2), dim=1))
+
+
+class ImplicitA(nn.Module):
+    """Implicit add layer in YOLOv7.
+
+    Args:
+        in_channels (int): The input channels of this Module.
+        mean (float): Mean value of implicit module. Defaults to 0.
+        std (float): Std value of implicit module. Defaults to 0.02
+    """
+
+    def __init__(self, in_channels: int, mean: float = 0., std: float = .02):
+        super().__init__()
+        self.implicit = nn.Parameter(torch.zeros(1, in_channels, 1, 1))
+        nn.init.normal_(self.implicit, mean=mean, std=std)
+
+    def forward(self, x):
+        """Forward process
+        Args:
+            x (Tensor): The input tensor.
+        """
+        return self.implicit + x
+
+
+class ImplicitM(nn.Module):
+    """Implicit multiplier layer in YOLOv7.
+
+    Args:
+        in_channels (int): The input channels of this Module.
+        mean (float): Mean value of implicit module. Defaults to 1.
+        std (float): Std value of implicit module. Defaults to 0.02.
+    """
+
+    def __init__(self, in_channels: int, mean: float = 1., std: float = .02):
+        super().__init__()
+        self.implicit = nn.Parameter(torch.ones(1, in_channels, 1, 1))
+        nn.init.normal_(self.implicit, mean=mean, std=std)
+
+    def forward(self, x):
+        """Forward process
+        Args:
+            x (Tensor): The input tensor.
+        """
+        return self.implicit * x
+
+
+@MODELS.register_module()
+class PPYOLOEBasicBlock(nn.Module):
+    """PPYOLOE Backbone BasicBlock.
+
+    Args:
+         in_channels (int): The input channels of this Module.
+         out_channels (int): The output channels of this Module.
+         norm_cfg (dict): Config dict for normalization layer.
+             Defaults to dict(type='BN', momentum=0.1, eps=1e-5).
+         act_cfg (dict): Config dict for activation layer.
+             Defaults to dict(type='SiLU', inplace=True).
+         shortcut (bool): Whether to add inputs and outputs together
+         at the end of this layer. Defaults to True.
+         use_alpha (bool): Whether to use `alpha` parameter at 1x1 conv.
+    """
+
+    def __init__(self,
+                 in_channels: int,
+                 out_channels: int,
+                 norm_cfg: ConfigType = dict(
+                     type='BN', momentum=0.1, eps=1e-5),
+                 act_cfg: ConfigType = dict(type='SiLU', inplace=True),
+                 shortcut: bool = True,
+                 use_alpha: bool = False):
+        super().__init__()
+        assert act_cfg is None or isinstance(act_cfg, dict)
+        self.conv1 = ConvModule(
+            in_channels,
+            out_channels,
+            3,
+            stride=1,
+            padding=1,
+            norm_cfg=norm_cfg,
+            act_cfg=act_cfg)
+
+        self.conv2 = RepVGGBlock(
+            out_channels,
+            out_channels,
+            use_alpha=use_alpha,
+            act_cfg=act_cfg,
+            norm_cfg=norm_cfg,
+            use_bn_first=False)
+        self.shortcut = shortcut
+
+    def forward(self, x: Tensor) -> Tensor:
+        """Forward process.
+        Args:
+            inputs (Tensor): The input tensor.
+
+        Returns:
+            Tensor: The output tensor.
+        """
+        y = self.conv1(x)
+        y = self.conv2(y)
+        if self.shortcut:
+            return x + y
+        else:
+            return y
+
+
+class CSPResLayer(nn.Module):
+    """PPYOLOE Backbone Stage.
+
+    Args:
+        in_channels (int): The input channels of this Module.
+        out_channels (int): The output channels of this Module.
+        num_block (int): Number of blocks in this stage.
+        block_cfg (dict): Config dict for block. Default config is
+            suitable for PPYOLOE+ backbone. And in PPYOLOE neck,
+            block_cfg is set to dict(type='PPYOLOEBasicBlock',
+            shortcut=False, use_alpha=False). Defaults to
+            dict(type='PPYOLOEBasicBlock', shortcut=True, use_alpha=True).
+        stride (int): Stride of the convolution. In backbone, the stride
+            must be set to 2. In neck, the stride must be set to 1.
+            Defaults to 1.
+        norm_cfg (dict): Config dict for normalization layer.
+            Defaults to dict(type='BN', momentum=0.1, eps=1e-5).
+        act_cfg (dict): Config dict for activation layer.
+            Defaults to dict(type='SiLU', inplace=True).
+        attention_cfg (dict, optional): Config dict for `EffectiveSELayer`.
+            Defaults to dict(type='EffectiveSELayer',
+            act_cfg=dict(type='HSigmoid')).
+        use_spp (bool): Whether to use `SPPFBottleneck` layer.
+            Defaults to False.
+    """
+
+    def __init__(self,
+                 in_channels: int,
+                 out_channels: int,
+                 num_block: int,
+                 block_cfg: ConfigType = dict(
+                     type='PPYOLOEBasicBlock', shortcut=True, use_alpha=True),
+                 stride: int = 1,
+                 norm_cfg: ConfigType = dict(
+                     type='BN', momentum=0.1, eps=1e-5),
+                 act_cfg: ConfigType = dict(type='SiLU', inplace=True),
+                 attention_cfg: OptMultiConfig = dict(
+                     type='EffectiveSELayer', act_cfg=dict(type='HSigmoid')),
+                 use_spp: bool = False):
+        super().__init__()
+
+        self.num_block = num_block
+        self.block_cfg = block_cfg
+        self.norm_cfg = norm_cfg
+        self.act_cfg = act_cfg
+        self.use_spp = use_spp
+        assert attention_cfg is None or isinstance(attention_cfg, dict)
+
+        if stride == 2:
+            conv1_in_channels = conv2_in_channels = conv3_in_channels = (
+                in_channels + out_channels) // 2
+            blocks_channels = conv1_in_channels // 2
+            self.conv_down = ConvModule(
+                in_channels,
+                conv1_in_channels,
+                3,
+                stride=2,
+                padding=1,
+                norm_cfg=norm_cfg,
+                act_cfg=act_cfg)
+        else:
+            conv1_in_channels = conv2_in_channels = in_channels
+            conv3_in_channels = out_channels
+            blocks_channels = out_channels // 2
+            self.conv_down = None
+
+        self.conv1 = ConvModule(
+            conv1_in_channels,
+            blocks_channels,
+            1,
+            norm_cfg=norm_cfg,
+            act_cfg=act_cfg)
+
+        self.conv2 = ConvModule(
+            conv2_in_channels,
+            blocks_channels,
+            1,
+            norm_cfg=norm_cfg,
+            act_cfg=act_cfg)
+
+        self.blocks = self.build_blocks_layer(blocks_channels)
+
+        self.conv3 = ConvModule(
+            conv3_in_channels,
+            out_channels,
+            1,
+            norm_cfg=norm_cfg,
+            act_cfg=act_cfg)
+
+        if attention_cfg:
+            attention_cfg = attention_cfg.copy()
+            attention_cfg['channels'] = blocks_channels * 2
+            self.attn = MODELS.build(attention_cfg)
+        else:
+            self.attn = None
+
+    def build_blocks_layer(self, blocks_channels: int) -> nn.Module:
+        """Build blocks layer.
+
+        Args:
+            blocks_channels: The channels of this Module.
+        """
+        blocks = nn.Sequential()
+        block_cfg = self.block_cfg.copy()
+        block_cfg.update(
+            dict(in_channels=blocks_channels, out_channels=blocks_channels))
+        block_cfg.setdefault('norm_cfg', self.norm_cfg)
+        block_cfg.setdefault('act_cfg', self.act_cfg)
+
+        for i in range(self.num_block):
+            blocks.add_module(str(i), MODELS.build(block_cfg))
+
+            if i == (self.num_block - 1) // 2 and self.use_spp:
+                blocks.add_module(
+                    'spp',
+                    SPPFBottleneck(
+                        blocks_channels,
+                        blocks_channels,
+                        kernel_sizes=[5, 9, 13],
+                        use_conv_first=False,
+                        conv_cfg=None,
+                        norm_cfg=self.norm_cfg,
+                        act_cfg=self.act_cfg))
+
+        return blocks
+
+    def forward(self, x: Tensor) -> Tensor:
+        """Forward process
+         Args:
+             x (Tensor): The input tensor.
+         """
+        if self.conv_down is not None:
+            x = self.conv_down(x)
+        y1 = self.conv1(x)
+        y2 = self.blocks(self.conv2(x))
+        y = torch.cat([y1, y2], axis=1)
+        if self.attn is not None:
+            y = self.attn(y)
+        y = self.conv3(y)
+        return y
+
+
+@MODELS.register_module()
+class RepStageBlock(nn.Module):
+    """RepStageBlock is a stage block with rep-style basic block.
+
+    Args:
+        in_channels (int): The input channels of this Module.
+        out_channels (int): The output channels of this Module.
+        num_blocks (int, tuple[int]): Number of blocks.  Defaults to 1.
+        bottle_block (nn.Module): Basic unit of RepStage.
+            Defaults to RepVGGBlock.
+        block_cfg (ConfigType): Config of RepStage.
+            Defaults to 'RepVGGBlock'.
+    """
+
+    def __init__(self,
+                 in_channels: int,
+                 out_channels: int,
+                 num_blocks: int = 1,
+                 bottle_block: nn.Module = RepVGGBlock,
+                 block_cfg: ConfigType = dict(type='RepVGGBlock')):
+        super().__init__()
+        block_cfg = block_cfg.copy()
+
+        block_cfg.update(
+            dict(in_channels=in_channels, out_channels=out_channels))
+
+        self.conv1 = MODELS.build(block_cfg)
+
+        block_cfg.update(
+            dict(in_channels=out_channels, out_channels=out_channels))
+
+        self.block = None
+        if num_blocks > 1:
+            self.block = nn.Sequential(*(MODELS.build(block_cfg)
+                                         for _ in range(num_blocks - 1)))
+
+        if bottle_block == BottleRep:
+            self.conv1 = BottleRep(
+                in_channels,
+                out_channels,
+                block_cfg=block_cfg,
+                adaptive_weight=True)
+            num_blocks = num_blocks // 2
+            self.block = None
+            if num_blocks > 1:
+                self.block = nn.Sequential(*(BottleRep(
+                    out_channels,
+                    out_channels,
+                    block_cfg=block_cfg,
+                    adaptive_weight=True) for _ in range(num_blocks - 1)))
+
+    def forward(self, x: Tensor) -> Tensor:
+        """Forward process.
+
+        Args:
+            x (Tensor): The input tensor.
+
+        Returns:
+            Tensor: The output tensor.
+        """
+        x = self.conv1(x)
+        if self.block is not None:
+            x = self.block(x)
+        return x
+
+
+class DarknetBottleneck(MMDET_DarknetBottleneck):
+    """The basic bottleneck block used in Darknet.
+
+    Each ResBlock consists of two ConvModules and the input is added to the
+    final output. Each ConvModule is composed of Conv, BN, and LeakyReLU.
+    The first convLayer has filter size of k1Xk1 and the second one has the
+    filter size of k2Xk2.
+
+    Note:
+    This DarknetBottleneck is little different from MMDet's, we can
+    change the kernel size and padding for each conv.
+
+    Args:
+        in_channels (int): The input channels of this Module.
+        out_channels (int): The output channels of this Module.
+        expansion (float): The kernel size for hidden channel.
+            Defaults to 0.5.
+        kernel_size (Sequence[int]): The kernel size of the convolution.
+            Defaults to (1, 3).
+        padding (Sequence[int]): The padding size of the convolution.
+            Defaults to (0, 1).
+        add_identity (bool): Whether to add identity to the out.
+            Defaults to True
+        use_depthwise (bool): Whether to use depthwise separable convolution.
+            Defaults to False
+        conv_cfg (dict): Config dict for convolution layer. Default: None,
+            which means using conv2d.
+        norm_cfg (dict): Config dict for normalization layer.
+            Defaults to dict(type='BN').
+        act_cfg (dict): Config dict for activation layer.
+            Defaults to dict(type='Swish').
+    """
+
+    def __init__(self,
+                 in_channels: int,
+                 out_channels: int,
+                 expansion: float = 0.5,
+                 kernel_size: Sequence[int] = (1, 3),
+                 padding: Sequence[int] = (0, 1),
+                 add_identity: bool = True,
+                 use_depthwise: bool = False,
+                 conv_cfg: OptConfigType = None,
+                 norm_cfg: ConfigType = dict(
+                     type='BN', momentum=0.03, eps=0.001),
+                 act_cfg: ConfigType = dict(type='SiLU', inplace=True),
+                 init_cfg: OptMultiConfig = None) -> None:
+        super().__init__(in_channels, out_channels, init_cfg=init_cfg)
+        hidden_channels = int(out_channels * expansion)
+        conv = DepthwiseSeparableConvModule if use_depthwise else ConvModule
+        assert isinstance(kernel_size, Sequence) and len(kernel_size) == 2
+
+        self.conv1 = ConvModule(
+            in_channels,
+            hidden_channels,
+            kernel_size[0],
+            padding=padding[0],
+            conv_cfg=conv_cfg,
+            norm_cfg=norm_cfg,
+            act_cfg=act_cfg)
+        self.conv2 = conv(
+            hidden_channels,
+            out_channels,
+            kernel_size[1],
+            stride=1,
+            padding=padding[1],
+            conv_cfg=conv_cfg,
+            norm_cfg=norm_cfg,
+            act_cfg=act_cfg)
+        self.add_identity = \
+            add_identity and in_channels == out_channels
+
+
+class CSPLayerWithTwoConv(BaseModule):
+    """Cross Stage Partial Layer with 2 convolutions.
+
+    Args:
+        in_channels (int): The input channels of the CSP layer.
+        out_channels (int): The output channels of the CSP layer.
+        expand_ratio (float): Ratio to adjust the number of channels of the
+            hidden layer. Defaults to 0.5.
+        num_blocks (int): Number of blocks. Defaults to 1
+        add_identity (bool): Whether to add identity in blocks.
+            Defaults to True.
+        conv_cfg (dict, optional): Config dict for convolution layer.
+            Defaults to None, which means using conv2d.
+        norm_cfg (dict): Config dict for normalization layer.
+            Defaults to dict(type='BN').
+        act_cfg (dict): Config dict for activation layer.
+            Defaults to dict(type='SiLU', inplace=True).
+        init_cfg (:obj:`ConfigDict` or dict or list[dict] or
+            list[:obj:`ConfigDict`], optional): Initialization config dict.
+            Defaults to None.
+    """
+
+    def __init__(
+            self,
+            in_channels: int,
+            out_channels: int,
+            expand_ratio: float = 0.5,
+            num_blocks: int = 1,
+            add_identity: bool = True,  # shortcut
+            conv_cfg: OptConfigType = None,
+            norm_cfg: ConfigType = dict(type='BN', momentum=0.03, eps=0.001),
+            act_cfg: ConfigType = dict(type='SiLU', inplace=True),
+            init_cfg: OptMultiConfig = None) -> None:
+        super().__init__(init_cfg=init_cfg)
+
+        self.mid_channels = int(out_channels * expand_ratio)
+        self.main_conv = ConvModule(
+            in_channels,
+            2 * self.mid_channels,
+            1,
+            conv_cfg=conv_cfg,
+            norm_cfg=norm_cfg,
+            act_cfg=act_cfg)
+        self.final_conv = ConvModule(
+            (2 + num_blocks) * self.mid_channels,
+            out_channels,
+            1,
+            conv_cfg=conv_cfg,
+            norm_cfg=norm_cfg,
+            act_cfg=act_cfg)
+
+        self.blocks = nn.ModuleList(
+            DarknetBottleneck(
+                self.mid_channels,
+                self.mid_channels,
+                expansion=1,
+                kernel_size=(3, 3),
+                padding=(1, 1),
+                add_identity=add_identity,
+                use_depthwise=False,
+                conv_cfg=conv_cfg,
+                norm_cfg=norm_cfg,
+                act_cfg=act_cfg) for _ in range(num_blocks))
+
+    def forward(self, x: Tensor) -> Tensor:
+        """Forward process."""
+        x_main = self.main_conv(x)
+        x_main = list(x_main.split((self.mid_channels, self.mid_channels), 1))
+        x_main.extend(blocks(x_main[-1]) for blocks in self.blocks)
+        return self.final_conv(torch.cat(x_main, 1))
+
+
+class BiFusion(nn.Module):
+    """BiFusion Block in YOLOv6.
+
+    BiFusion fuses current-, high- and low-level features.
+    Compared with concatenation in PAN, it fuses an extra low-level feature.
+
+    Args:
+        in_channels0 (int): The channels of current-level feature.
+        in_channels1 (int): The input channels of lower-level feature.
+        out_channels (int): The out channels of the BiFusion module.
+        norm_cfg (dict): Config dict for normalization layer.
+            Defaults to dict(type='BN', momentum=0.03, eps=0.001).
+        act_cfg (dict): Config dict for activation layer.
+            Defaults to dict(type='SiLU', inplace=True).
+        init_cfg (dict or list[dict], optional): Initialization config dict.
+            Defaults to None.
+    """
+
+    def __init__(self,
+                 in_channels0: int,
+                 in_channels1: int,
+                 out_channels: int,
+                 norm_cfg: ConfigType = dict(
+                     type='BN', momentum=0.03, eps=0.001),
+                 act_cfg: ConfigType = dict(type='ReLU', inplace=True)):
+        super().__init__()
+        self.conv1 = ConvModule(
+            in_channels0,
+            out_channels,
+            kernel_size=1,
+            stride=1,
+            padding=0,
+            bias=False,
+            norm_cfg=norm_cfg,
+            act_cfg=act_cfg)
+        self.conv2 = ConvModule(
+            in_channels1,
+            out_channels,
+            kernel_size=1,
+            stride=1,
+            padding=0,
+            bias=False,
+            norm_cfg=norm_cfg,
+            act_cfg=act_cfg)
+        self.conv3 = ConvModule(
+            out_channels * 3,
+            out_channels,
+            kernel_size=1,
+            stride=1,
+            padding=0,
+            bias=False,
+            norm_cfg=norm_cfg,
+            act_cfg=act_cfg)
+        self.upsample = nn.ConvTranspose2d(
+            out_channels, out_channels, kernel_size=2, stride=2, bias=True)
+        self.downsample = ConvModule(
+            out_channels,
+            out_channels,
+            kernel_size=3,
+            stride=2,
+            padding=1,
+            bias=False,
+            norm_cfg=norm_cfg,
+            act_cfg=act_cfg)
+
+    def forward(self, x: List[torch.Tensor]) -> Tensor:
+        """Forward process
+        Args:
+            x (List[torch.Tensor]): The tensor list of length 3.
+                x[0]: The high-level feature.
+                x[1]: The current-level feature.
+                x[2]: The low-level feature.
+        """
+        x0 = self.upsample(x[0])
+        x1 = self.conv1(x[1])
+        x2 = self.downsample(self.conv2(x[2]))
+        return self.conv3(torch.cat((x0, x1, x2), dim=1))
+
+
+class CSPSPPFBottleneck(BaseModule):
+    """The SPPF block having a CSP-like version in YOLOv6 3.0.
+
+    Args:
+        in_channels (int): The input channels of this Module.
+        out_channels (int): The output channels of this Module.
+        kernel_sizes (int, tuple[int]): Sequential or number of kernel
+            sizes of pooling layers. Defaults to 5.
+        use_conv_first (bool): Whether to use conv before pooling layer.
+            In YOLOv5 and YOLOX, the para set to True.
+            In PPYOLOE, the para set to False.
+            Defaults to True.
+        mid_channels_scale (float): Channel multiplier, multiply in_channels
+            by this amount to get mid_channels. This parameter is valid only
+            when use_conv_fist=True.Defaults to 0.5.
+        conv_cfg (dict): Config dict for convolution layer. Defaults to None.
+            which means using conv2d. Defaults to None.
+        norm_cfg (dict): Config dict for normalization layer.
+            Defaults to dict(type='BN', momentum=0.03, eps=0.001).
+        act_cfg (dict): Config dict for activation layer.
+            Defaults to dict(type='SiLU', inplace=True).
+        init_cfg (dict or list[dict], optional): Initialization config dict.
+            Defaults to None.
+    """
+
+    def __init__(self,
+                 in_channels: int,
+                 out_channels: int,
+                 kernel_sizes: Union[int, Sequence[int]] = 5,
+                 use_conv_first: bool = True,
+                 mid_channels_scale: float = 0.5,
+                 conv_cfg: ConfigType = None,
+                 norm_cfg: ConfigType = dict(
+                     type='BN', momentum=0.03, eps=0.001),
+                 act_cfg: ConfigType = dict(type='SiLU', inplace=True),
+                 init_cfg: OptMultiConfig = None):
+        super().__init__(init_cfg)
+
+        if use_conv_first:
+            mid_channels = int(in_channels * mid_channels_scale)
+            self.conv1 = ConvModule(
+                in_channels,
+                mid_channels,
+                1,
+                stride=1,
+                conv_cfg=conv_cfg,
+                norm_cfg=norm_cfg,
+                act_cfg=act_cfg)
+            self.conv3 = ConvModule(
+                mid_channels,
+                mid_channels,
+                3,
+                stride=1,
+                padding=1,
+                conv_cfg=conv_cfg,
+                norm_cfg=norm_cfg,
+                act_cfg=act_cfg)
+            self.conv4 = ConvModule(
+                mid_channels,
+                mid_channels,
+                1,
+                stride=1,
+                conv_cfg=conv_cfg,
+                norm_cfg=norm_cfg,
+                act_cfg=act_cfg)
+        else:
+            mid_channels = in_channels
+            self.conv1 = None
+            self.conv3 = None
+            self.conv4 = None
+
+        self.conv2 = ConvModule(
+            in_channels,
+            mid_channels,
+            1,
+            stride=1,
+            conv_cfg=conv_cfg,
+            norm_cfg=norm_cfg,
+            act_cfg=act_cfg)
+
+        self.kernel_sizes = kernel_sizes
+
+        if isinstance(kernel_sizes, int):
+            self.poolings = nn.MaxPool2d(
+                kernel_size=kernel_sizes, stride=1, padding=kernel_sizes // 2)
+            conv2_in_channels = mid_channels * 4
+        else:
+            self.poolings = nn.ModuleList([
+                nn.MaxPool2d(kernel_size=ks, stride=1, padding=ks // 2)
+                for ks in kernel_sizes
+            ])
+            conv2_in_channels = mid_channels * (len(kernel_sizes) + 1)
+
+        self.conv5 = ConvModule(
+            conv2_in_channels,
+            mid_channels,
+            1,
+            stride=1,
+            conv_cfg=conv_cfg,
+            norm_cfg=norm_cfg,
+            act_cfg=act_cfg)
+        self.conv6 = ConvModule(
+            mid_channels,
+            mid_channels,
+            3,
+            stride=1,
+            padding=1,
+            conv_cfg=conv_cfg,
+            norm_cfg=norm_cfg,
+            act_cfg=act_cfg)
+        self.conv7 = ConvModule(
+            mid_channels * 2,
+            out_channels,
+            1,
+            conv_cfg=conv_cfg,
+            norm_cfg=norm_cfg,
+            act_cfg=act_cfg)
+
+    def forward(self, x: Tensor) -> Tensor:
+        """Forward process
+        Args:
+            x (Tensor): The input tensor.
+        """
+        x0 = self.conv4(self.conv3(self.conv1(x))) if self.conv1 else x
+        y = self.conv2(x)
+
+        if isinstance(self.kernel_sizes, int):
+            x1 = self.poolings(x0)
+            x2 = self.poolings(x1)
+            x3 = torch.cat([x0, x1, x2, self.poolings(x2)], dim=1)
+        else:
+            x3 = torch.cat(
+                [x0] + [pooling(x0) for pooling in self.poolings], dim=1)
+
+        x3 = self.conv6(self.conv5(x3))
+        x = self.conv7(torch.cat([y, x3], dim=1))
+        return x
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/models/losses/__init__.py b/mmdetection_practice/third_party/mmyolo/mmyolo/models/losses/__init__.py
new file mode 100644
index 0000000..c89fe4d
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/models/losses/__init__.py
@@ -0,0 +1,5 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from .iou_loss import IoULoss, bbox_overlaps
+from .oks_loss import OksLoss
+
+__all__ = ['IoULoss', 'bbox_overlaps', 'OksLoss']
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/models/losses/iou_loss.py b/mmdetection_practice/third_party/mmyolo/mmyolo/models/losses/iou_loss.py
new file mode 100644
index 0000000..e3d3dc4
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/models/losses/iou_loss.py
@@ -0,0 +1,232 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+import math
+from typing import Optional, Tuple, Union
+
+import torch
+import torch.nn as nn
+from mmdet.models.losses.utils import weight_reduce_loss
+from mmdet.structures.bbox import HorizontalBoxes
+
+from mmyolo.registry import MODELS
+
+
+def bbox_overlaps(pred: torch.Tensor,
+                  target: torch.Tensor,
+                  iou_mode: str = 'ciou',
+                  bbox_format: str = 'xywh',
+                  siou_theta: float = 4.0,
+                  eps: float = 1e-7) -> torch.Tensor:
+    r"""Calculate overlap between two set of bboxes.
+    `Implementation of paper `Enhancing Geometric Factors into
+    Model Learning and Inference for Object Detection and Instance
+    Segmentation <https://arxiv.org/abs/2005.03572>`_.
+
+    In the CIoU implementation of YOLOv5 and MMDetection, there is a slight
+    difference in the way the alpha parameter is computed.
+
+    mmdet version:
+        alpha = (ious > 0.5).float() * v / (1 - ious + v)
+    YOLOv5 version:
+        alpha = v / (v - ious + (1 + eps)
+
+    Args:
+        pred (Tensor): Predicted bboxes of format (x1, y1, x2, y2)
+            or (x, y, w, h),shape (n, 4).
+        target (Tensor): Corresponding gt bboxes, shape (n, 4).
+        iou_mode (str): Options are ('iou', 'ciou', 'giou', 'siou').
+            Defaults to "ciou".
+        bbox_format (str): Options are "xywh" and "xyxy".
+            Defaults to "xywh".
+        siou_theta (float): siou_theta for SIoU when calculate shape cost.
+            Defaults to 4.0.
+        eps (float): Eps to avoid log(0).
+
+    Returns:
+        Tensor: shape (n, ).
+    """
+    assert iou_mode in ('iou', 'ciou', 'giou', 'siou')
+    assert bbox_format in ('xyxy', 'xywh')
+    if bbox_format == 'xywh':
+        pred = HorizontalBoxes.cxcywh_to_xyxy(pred)
+        target = HorizontalBoxes.cxcywh_to_xyxy(target)
+
+    bbox1_x1, bbox1_y1 = pred[..., 0], pred[..., 1]
+    bbox1_x2, bbox1_y2 = pred[..., 2], pred[..., 3]
+    bbox2_x1, bbox2_y1 = target[..., 0], target[..., 1]
+    bbox2_x2, bbox2_y2 = target[..., 2], target[..., 3]
+
+    # Overlap
+    overlap = (torch.min(bbox1_x2, bbox2_x2) -
+               torch.max(bbox1_x1, bbox2_x1)).clamp(0) * \
+              (torch.min(bbox1_y2, bbox2_y2) -
+               torch.max(bbox1_y1, bbox2_y1)).clamp(0)
+
+    # Union
+    w1, h1 = bbox1_x2 - bbox1_x1, bbox1_y2 - bbox1_y1
+    w2, h2 = bbox2_x2 - bbox2_x1, bbox2_y2 - bbox2_y1
+    union = (w1 * h1) + (w2 * h2) - overlap + eps
+
+    h1 = bbox1_y2 - bbox1_y1 + eps
+    h2 = bbox2_y2 - bbox2_y1 + eps
+
+    # IoU
+    ious = overlap / union
+
+    # enclose area
+    enclose_x1y1 = torch.min(pred[..., :2], target[..., :2])
+    enclose_x2y2 = torch.max(pred[..., 2:], target[..., 2:])
+    enclose_wh = (enclose_x2y2 - enclose_x1y1).clamp(min=0)
+
+    enclose_w = enclose_wh[..., 0]  # cw
+    enclose_h = enclose_wh[..., 1]  # ch
+
+    if iou_mode == 'ciou':
+        # CIoU = IoU - ( (ρ^2(b_pred,b_gt) / c^2) + (alpha x v) )
+
+        # calculate enclose area (c^2)
+        enclose_area = enclose_w**2 + enclose_h**2 + eps
+
+        # calculate ρ^2(b_pred,b_gt):
+        # euclidean distance between b_pred(bbox2) and b_gt(bbox1)
+        # center point, because bbox format is xyxy -> left-top xy and
+        # right-bottom xy, so need to / 4 to get center point.
+        rho2_left_item = ((bbox2_x1 + bbox2_x2) - (bbox1_x1 + bbox1_x2))**2 / 4
+        rho2_right_item = ((bbox2_y1 + bbox2_y2) -
+                           (bbox1_y1 + bbox1_y2))**2 / 4
+        rho2 = rho2_left_item + rho2_right_item  # rho^2 (ρ^2)
+
+        # Width and height ratio (v)
+        wh_ratio = (4 / (math.pi**2)) * torch.pow(
+            torch.atan(w2 / h2) - torch.atan(w1 / h1), 2)
+
+        with torch.no_grad():
+            alpha = wh_ratio / (wh_ratio - ious + (1 + eps))
+
+        # CIoU
+        ious = ious - ((rho2 / enclose_area) + (alpha * wh_ratio))
+
+    elif iou_mode == 'giou':
+        # GIoU = IoU - ( (A_c - union) / A_c )
+        convex_area = enclose_w * enclose_h + eps  # convex area (A_c)
+        ious = ious - (convex_area - union) / convex_area
+
+    elif iou_mode == 'siou':
+        # SIoU: https://arxiv.org/pdf/2205.12740.pdf
+        # SIoU = IoU - ( (Distance Cost + Shape Cost) / 2 )
+
+        # calculate sigma (σ):
+        # euclidean distance between bbox2(pred) and bbox1(gt) center point,
+        # sigma_cw = b_cx_gt - b_cx
+        sigma_cw = (bbox2_x1 + bbox2_x2) / 2 - (bbox1_x1 + bbox1_x2) / 2 + eps
+        # sigma_ch = b_cy_gt - b_cy
+        sigma_ch = (bbox2_y1 + bbox2_y2) / 2 - (bbox1_y1 + bbox1_y2) / 2 + eps
+        # sigma = √( (sigma_cw ** 2) - (sigma_ch ** 2) )
+        sigma = torch.pow(sigma_cw**2 + sigma_ch**2, 0.5)
+
+        # choose minimize alpha, sin(alpha)
+        sin_alpha = torch.abs(sigma_ch) / sigma
+        sin_beta = torch.abs(sigma_cw) / sigma
+        sin_alpha = torch.where(sin_alpha <= math.sin(math.pi / 4), sin_alpha,
+                                sin_beta)
+
+        # Angle cost = 1 - 2 * ( sin^2 ( arcsin(x) - (pi / 4) ) )
+        angle_cost = torch.cos(torch.arcsin(sin_alpha) * 2 - math.pi / 2)
+
+        # Distance cost = Σ_(t=x,y) (1 - e ^ (- γ ρ_t))
+        rho_x = (sigma_cw / enclose_w)**2  # ρ_x
+        rho_y = (sigma_ch / enclose_h)**2  # ρ_y
+        gamma = 2 - angle_cost  # γ
+        distance_cost = (1 - torch.exp(-1 * gamma * rho_x)) + (
+            1 - torch.exp(-1 * gamma * rho_y))
+
+        # Shape cost = Ω = Σ_(t=w,h) ( ( 1 - ( e ^ (-ω_t) ) ) ^ θ )
+        omiga_w = torch.abs(w1 - w2) / torch.max(w1, w2)  # ω_w
+        omiga_h = torch.abs(h1 - h2) / torch.max(h1, h2)  # ω_h
+        shape_cost = torch.pow(1 - torch.exp(-1 * omiga_w),
+                               siou_theta) + torch.pow(
+                                   1 - torch.exp(-1 * omiga_h), siou_theta)
+
+        ious = ious - ((distance_cost + shape_cost) * 0.5)
+
+    return ious.clamp(min=-1.0, max=1.0)
+
+
+@MODELS.register_module()
+class IoULoss(nn.Module):
+    """IoULoss.
+
+    Computing the IoU loss between a set of predicted bboxes and target bboxes.
+    Args:
+        iou_mode (str): Options are "ciou".
+            Defaults to "ciou".
+        bbox_format (str): Options are "xywh" and "xyxy".
+            Defaults to "xywh".
+        eps (float): Eps to avoid log(0).
+        reduction (str): Options are "none", "mean" and "sum".
+        loss_weight (float): Weight of loss.
+        return_iou (bool): If True, return loss and iou.
+    """
+
+    def __init__(self,
+                 iou_mode: str = 'ciou',
+                 bbox_format: str = 'xywh',
+                 eps: float = 1e-7,
+                 reduction: str = 'mean',
+                 loss_weight: float = 1.0,
+                 return_iou: bool = True):
+        super().__init__()
+        assert bbox_format in ('xywh', 'xyxy')
+        assert iou_mode in ('ciou', 'siou', 'giou')
+        self.iou_mode = iou_mode
+        self.bbox_format = bbox_format
+        self.eps = eps
+        self.reduction = reduction
+        self.loss_weight = loss_weight
+        self.return_iou = return_iou
+
+    def forward(
+        self,
+        pred: torch.Tensor,
+        target: torch.Tensor,
+        weight: Optional[torch.Tensor] = None,
+        avg_factor: Optional[float] = None,
+        reduction_override: Optional[Union[str, bool]] = None
+    ) -> Tuple[Union[torch.Tensor, torch.Tensor], torch.Tensor]:
+        """Forward function.
+
+        Args:
+            pred (Tensor): Predicted bboxes of format (x1, y1, x2, y2)
+                or (x, y, w, h),shape (n, 4).
+            target (Tensor): Corresponding gt bboxes, shape (n, 4).
+            weight (Tensor, optional): Element-wise weights.
+            avg_factor (float, optional): Average factor when computing the
+                mean of losses.
+            reduction_override (str, bool, optional): Same as built-in losses
+                of PyTorch. Defaults to None.
+        Returns:
+            loss or tuple(loss, iou):
+        """
+        if weight is not None and not torch.any(weight > 0):
+            if pred.dim() == weight.dim() + 1:
+                weight = weight.unsqueeze(1)
+            return (pred * weight).sum()  # 0
+        assert reduction_override in (None, 'none', 'mean', 'sum')
+        reduction = (
+            reduction_override if reduction_override else self.reduction)
+
+        if weight is not None and weight.dim() > 1:
+            weight = weight.mean(-1)
+
+        iou = bbox_overlaps(
+            pred,
+            target,
+            iou_mode=self.iou_mode,
+            bbox_format=self.bbox_format,
+            eps=self.eps)
+        loss = self.loss_weight * weight_reduce_loss(1.0 - iou, weight,
+                                                     reduction, avg_factor)
+
+        if self.return_iou:
+            return loss, iou
+        else:
+            return loss
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/models/losses/oks_loss.py b/mmdetection_practice/third_party/mmyolo/mmyolo/models/losses/oks_loss.py
new file mode 100644
index 0000000..62c6342
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/models/losses/oks_loss.py
@@ -0,0 +1,91 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from typing import Optional
+
+import torch
+import torch.nn as nn
+from torch import Tensor
+
+from mmyolo.registry import MODELS
+
+try:
+    from mmpose.datasets.datasets.utils import parse_pose_metainfo
+except ImportError:
+    parse_pose_metainfo = None
+
+
+@MODELS.register_module()
+class OksLoss(nn.Module):
+    """A PyTorch implementation of the Object Keypoint Similarity (OKS) loss as
+    described in the paper "YOLO-Pose: Enhancing YOLO for Multi Person Pose
+    Estimation Using Object Keypoint Similarity Loss" by Debapriya et al.
+
+    (2022).
+    The OKS loss is used for keypoint-based object recognition and consists
+    of a measure of the similarity between predicted and ground truth
+    keypoint locations, adjusted by the size of the object in the image.
+    The loss function takes as input the predicted keypoint locations, the
+    ground truth keypoint locations, a mask indicating which keypoints are
+    valid, and bounding boxes for the objects.
+    Args:
+        metainfo (Optional[str]): Path to a JSON file containing information
+            about the dataset's annotations.
+        loss_weight (float): Weight for the loss.
+    """
+
+    def __init__(self,
+                 metainfo: Optional[str] = None,
+                 loss_weight: float = 1.0):
+        super().__init__()
+
+        if metainfo is not None:
+            if parse_pose_metainfo is None:
+                raise ImportError(
+                    'Please run "mim install -r requirements/mmpose.txt" '
+                    'to install mmpose first for OksLossn.')
+            metainfo = parse_pose_metainfo(dict(from_file=metainfo))
+            sigmas = metainfo.get('sigmas', None)
+            if sigmas is not None:
+                self.register_buffer('sigmas', torch.as_tensor(sigmas))
+        self.loss_weight = loss_weight
+
+    def forward(self,
+                output: Tensor,
+                target: Tensor,
+                target_weights: Tensor,
+                bboxes: Optional[Tensor] = None) -> Tensor:
+        oks = self.compute_oks(output, target, target_weights, bboxes)
+        loss = 1 - oks
+        return loss * self.loss_weight
+
+    def compute_oks(self,
+                    output: Tensor,
+                    target: Tensor,
+                    target_weights: Tensor,
+                    bboxes: Optional[Tensor] = None) -> Tensor:
+        """Calculates the OKS loss.
+
+        Args:
+            output (Tensor): Predicted keypoints in shape N x k x 2, where N
+                is batch size, k is the number of keypoints, and 2 are the
+                xy coordinates.
+            target (Tensor): Ground truth keypoints in the same shape as
+                output.
+            target_weights (Tensor): Mask of valid keypoints in shape N x k,
+                with 1 for valid and 0 for invalid.
+            bboxes (Optional[Tensor]): Bounding boxes in shape N x 4,
+                where 4 are the xyxy coordinates.
+        Returns:
+            Tensor: The calculated OKS loss.
+        """
+
+        dist = torch.norm(output - target, dim=-1)
+
+        if hasattr(self, 'sigmas'):
+            sigmas = self.sigmas.reshape(*((1, ) * (dist.ndim - 1)), -1)
+            dist = dist / sigmas
+        if bboxes is not None:
+            area = torch.norm(bboxes[..., 2:] - bboxes[..., :2], dim=-1)
+            dist = dist / area.clip(min=1e-8).unsqueeze(-1)
+
+        return (torch.exp(-dist.pow(2) / 2) * target_weights).sum(
+            dim=-1) / target_weights.sum(dim=-1).clip(min=1e-8)
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/models/necks/__init__.py b/mmdetection_practice/third_party/mmyolo/mmyolo/models/necks/__init__.py
new file mode 100644
index 0000000..159fae8
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/models/necks/__init__.py
@@ -0,0 +1,16 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from .base_yolo_neck import BaseYOLONeck
+from .cspnext_pafpn import CSPNeXtPAFPN
+from .ppyoloe_csppan import PPYOLOECSPPAFPN
+from .yolov5_pafpn import YOLOv5PAFPN
+from .yolov6_pafpn import (YOLOv6CSPRepBiPAFPN, YOLOv6CSPRepPAFPN,
+                           YOLOv6RepBiPAFPN, YOLOv6RepPAFPN)
+from .yolov7_pafpn import YOLOv7PAFPN
+from .yolov8_pafpn import YOLOv8PAFPN
+from .yolox_pafpn import YOLOXPAFPN
+
+__all__ = [
+    'YOLOv5PAFPN', 'BaseYOLONeck', 'YOLOv6RepPAFPN', 'YOLOXPAFPN',
+    'CSPNeXtPAFPN', 'YOLOv7PAFPN', 'PPYOLOECSPPAFPN', 'YOLOv6CSPRepPAFPN',
+    'YOLOv8PAFPN', 'YOLOv6RepBiPAFPN', 'YOLOv6CSPRepBiPAFPN'
+]
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/models/necks/base_yolo_neck.py b/mmdetection_practice/third_party/mmyolo/mmyolo/models/necks/base_yolo_neck.py
new file mode 100644
index 0000000..8825b76
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/models/necks/base_yolo_neck.py
@@ -0,0 +1,261 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from abc import ABCMeta, abstractmethod
+from typing import List, Union
+
+import torch
+import torch.nn as nn
+from mmdet.utils import ConfigType, OptMultiConfig
+from mmengine.model import BaseModule
+from torch.nn.modules.batchnorm import _BatchNorm
+
+from mmyolo.registry import MODELS
+
+
+@MODELS.register_module()
+class BaseYOLONeck(BaseModule, metaclass=ABCMeta):
+    """Base neck used in YOLO series.
+
+    .. code:: text
+
+     P5 neck model structure diagram
+                        +--------+                     +-------+
+                        |top_down|----------+--------->|  out  |---> output0
+                        | layer1 |          |          | layer0|
+                        +--------+          |          +-------+
+     stride=8                ^              |
+     idx=0  +------+    +--------+          |
+     -----> |reduce|--->|   cat  |          |
+            |layer0|    +--------+          |
+            +------+         ^              v
+                        +--------+    +-----------+
+                        |upsample|    |downsample |
+                        | layer1 |    |  layer0   |
+                        +--------+    +-----------+
+                             ^              |
+                        +--------+          v
+                        |top_down|    +-----------+
+                        | layer2 |--->|    cat    |
+                        +--------+    +-----------+
+     stride=16               ^              v
+     idx=1  +------+    +--------+    +-----------+    +-------+
+     -----> |reduce|--->|   cat  |    | bottom_up |--->|  out  |---> output1
+            |layer1|    +--------+    |   layer0  |    | layer1|
+            +------+         ^        +-----------+    +-------+
+                             |              v
+                        +--------+    +-----------+
+                        |upsample|    |downsample |
+                        | layer2 |    |  layer1   |
+     stride=32          +--------+    +-----------+
+     idx=2  +------+         ^              v
+     -----> |reduce|         |        +-----------+
+            |layer2|---------+------->|    cat    |
+            +------+                  +-----------+
+                                            v
+                                      +-----------+    +-------+
+                                      | bottom_up |--->|  out  |---> output2
+                                      |  layer1   |    | layer2|
+                                      +-----------+    +-------+
+
+    .. code:: text
+
+     P6 neck model structure diagram
+                        +--------+                     +-------+
+                        |top_down|----------+--------->|  out  |---> output0
+                        | layer1 |          |          | layer0|
+                        +--------+          |          +-------+
+     stride=8                ^              |
+     idx=0  +------+    +--------+          |
+     -----> |reduce|--->|   cat  |          |
+            |layer0|    +--------+          |
+            +------+         ^              v
+                        +--------+    +-----------+
+                        |upsample|    |downsample |
+                        | layer1 |    |  layer0   |
+                        +--------+    +-----------+
+                             ^              |
+                        +--------+          v
+                        |top_down|    +-----------+
+                        | layer2 |--->|    cat    |
+                        +--------+    +-----------+
+     stride=16               ^              v
+     idx=1  +------+    +--------+    +-----------+    +-------+
+     -----> |reduce|--->|   cat  |    | bottom_up |--->|  out  |---> output1
+            |layer1|    +--------+    |   layer0  |    | layer1|
+            +------+         ^        +-----------+    +-------+
+                             |              v
+                        +--------+    +-----------+
+                        |upsample|    |downsample |
+                        | layer2 |    |  layer1   |
+                        +--------+    +-----------+
+                             ^              |
+                        +--------+          v
+                        |top_down|    +-----------+
+                        | layer3 |--->|    cat    |
+                        +--------+    +-----------+
+     stride=32               ^              v
+     idx=2  +------+    +--------+    +-----------+    +-------+
+     -----> |reduce|--->|   cat  |    | bottom_up |--->|  out  |---> output2
+            |layer2|    +--------+    |   layer1  |    | layer2|
+            +------+         ^        +-----------+    +-------+
+                             |              v
+                        +--------+    +-----------+
+                        |upsample|    |downsample |
+                        | layer3 |    |  layer2   |
+                        +--------+    +-----------+
+     stride=64               ^              v
+     idx=3  +------+         |        +-----------+
+     -----> |reduce|---------+------->|    cat    |
+            |layer3|                  +-----------+
+            +------+                        v
+                                      +-----------+    +-------+
+                                      | bottom_up |--->|  out  |---> output3
+                                      |  layer2   |    | layer3|
+                                      +-----------+    +-------+
+
+    Args:
+        in_channels (List[int]): Number of input channels per scale.
+        out_channels (int): Number of output channels (used at each scale)
+        deepen_factor (float): Depth multiplier, multiply number of
+            blocks in CSP layer by this amount. Defaults to 1.0.
+        widen_factor (float): Width multiplier, multiply number of
+            channels in each layer by this amount. Defaults to 1.0.
+        upsample_feats_cat_first (bool): Whether the output features are
+            concat first after upsampling in the topdown module.
+            Defaults to True. Currently only YOLOv7 is false.
+        freeze_all(bool): Whether to freeze the model. Defaults to False
+        norm_cfg (dict): Config dict for normalization layer.
+            Defaults to None.
+        act_cfg (dict): Config dict for activation layer.
+            Defaults to None.
+        init_cfg (dict or list[dict], optional): Initialization config dict.
+            Defaults to None.
+    """
+
+    def __init__(self,
+                 in_channels: List[int],
+                 out_channels: Union[int, List[int]],
+                 deepen_factor: float = 1.0,
+                 widen_factor: float = 1.0,
+                 upsample_feats_cat_first: bool = True,
+                 freeze_all: bool = False,
+                 norm_cfg: ConfigType = None,
+                 act_cfg: ConfigType = None,
+                 init_cfg: OptMultiConfig = None,
+                 **kwargs):
+        super().__init__(init_cfg)
+        self.in_channels = in_channels
+        self.out_channels = out_channels
+        self.deepen_factor = deepen_factor
+        self.widen_factor = widen_factor
+        self.upsample_feats_cat_first = upsample_feats_cat_first
+        self.freeze_all = freeze_all
+        self.norm_cfg = norm_cfg
+        self.act_cfg = act_cfg
+
+        self.reduce_layers = nn.ModuleList()
+        for idx in range(len(in_channels)):
+            self.reduce_layers.append(self.build_reduce_layer(idx))
+
+        # build top-down blocks
+        self.upsample_layers = nn.ModuleList()
+        self.top_down_layers = nn.ModuleList()
+        for idx in range(len(in_channels) - 1, 0, -1):
+            self.upsample_layers.append(self.build_upsample_layer(idx))
+            self.top_down_layers.append(self.build_top_down_layer(idx))
+
+        # build bottom-up blocks
+        self.downsample_layers = nn.ModuleList()
+        self.bottom_up_layers = nn.ModuleList()
+        for idx in range(len(in_channels) - 1):
+            self.downsample_layers.append(self.build_downsample_layer(idx))
+            self.bottom_up_layers.append(self.build_bottom_up_layer(idx))
+
+        self.out_layers = nn.ModuleList()
+        for idx in range(len(in_channels)):
+            self.out_layers.append(self.build_out_layer(idx))
+
+    @abstractmethod
+    def build_reduce_layer(self, idx: int):
+        """build reduce layer."""
+        pass
+
+    @abstractmethod
+    def build_upsample_layer(self, idx: int):
+        """build upsample layer."""
+        pass
+
+    @abstractmethod
+    def build_top_down_layer(self, idx: int):
+        """build top down layer."""
+        pass
+
+    @abstractmethod
+    def build_downsample_layer(self, idx: int):
+        """build downsample layer."""
+        pass
+
+    @abstractmethod
+    def build_bottom_up_layer(self, idx: int):
+        """build bottom up layer."""
+        pass
+
+    @abstractmethod
+    def build_out_layer(self, idx: int):
+        """build out layer."""
+        pass
+
+    def _freeze_all(self):
+        """Freeze the model."""
+        for m in self.modules():
+            if isinstance(m, _BatchNorm):
+                m.eval()
+            for param in m.parameters():
+                param.requires_grad = False
+
+    def train(self, mode=True):
+        """Convert the model into training mode while keep the normalization
+        layer freezed."""
+        super().train(mode)
+        if self.freeze_all:
+            self._freeze_all()
+
+    def forward(self, inputs: List[torch.Tensor]) -> tuple:
+        """Forward function."""
+        assert len(inputs) == len(self.in_channels)
+        # reduce layers
+        reduce_outs = []
+        for idx in range(len(self.in_channels)):
+            reduce_outs.append(self.reduce_layers[idx](inputs[idx]))
+
+        # top-down path
+        inner_outs = [reduce_outs[-1]]
+        for idx in range(len(self.in_channels) - 1, 0, -1):
+            feat_high = inner_outs[0]
+            feat_low = reduce_outs[idx - 1]
+            upsample_feat = self.upsample_layers[len(self.in_channels) - 1 -
+                                                 idx](
+                                                     feat_high)
+            if self.upsample_feats_cat_first:
+                top_down_layer_inputs = torch.cat([upsample_feat, feat_low], 1)
+            else:
+                top_down_layer_inputs = torch.cat([feat_low, upsample_feat], 1)
+            inner_out = self.top_down_layers[len(self.in_channels) - 1 - idx](
+                top_down_layer_inputs)
+            inner_outs.insert(0, inner_out)
+
+        # bottom-up path
+        outs = [inner_outs[0]]
+        for idx in range(len(self.in_channels) - 1):
+            feat_low = outs[-1]
+            feat_high = inner_outs[idx + 1]
+            downsample_feat = self.downsample_layers[idx](feat_low)
+            out = self.bottom_up_layers[idx](
+                torch.cat([downsample_feat, feat_high], 1))
+            outs.append(out)
+
+        # out_layers
+        results = []
+        for idx in range(len(self.in_channels)):
+            results.append(self.out_layers[idx](outs[idx]))
+
+        return tuple(results)
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/models/necks/cspnext_pafpn.py b/mmdetection_practice/third_party/mmyolo/mmyolo/models/necks/cspnext_pafpn.py
new file mode 100644
index 0000000..310126f
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/models/necks/cspnext_pafpn.py
@@ -0,0 +1,201 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+import math
+from typing import Sequence
+
+import torch.nn as nn
+from mmcv.cnn import ConvModule, DepthwiseSeparableConvModule
+from mmdet.models.backbones.csp_darknet import CSPLayer
+from mmdet.utils import ConfigType, OptMultiConfig
+
+from mmyolo.registry import MODELS
+from .base_yolo_neck import BaseYOLONeck
+
+
+@MODELS.register_module()
+class CSPNeXtPAFPN(BaseYOLONeck):
+    """Path Aggregation Network with CSPNeXt blocks.
+
+    Args:
+        in_channels (Sequence[int]): Number of input channels per scale.
+        out_channels (int): Number of output channels (used at each scale)
+        deepen_factor (float): Depth multiplier, multiply number of
+            blocks in CSP layer by this amount. Defaults to 1.0.
+        widen_factor (float): Width multiplier, multiply number of
+            channels in each layer by this amount. Defaults to 1.0.
+        num_csp_blocks (int): Number of bottlenecks in CSPLayer.
+            Defaults to 3.
+        use_depthwise (bool): Whether to use depthwise separable convolution in
+            blocks. Defaults to False.
+        expand_ratio (float): Ratio to adjust the number of channels of the
+            hidden layer. Defaults to 0.5.
+        upsample_cfg (dict): Config dict for interpolate layer.
+            Default: `dict(scale_factor=2, mode='nearest')`
+        conv_cfg (dict, optional): Config dict for convolution layer.
+            Default: None, which means using conv2d.
+        norm_cfg (dict): Config dict for normalization layer.
+            Default: dict(type='BN')
+        act_cfg (dict): Config dict for activation layer.
+            Default: dict(type='SiLU', inplace=True)
+        init_cfg (dict or list[dict], optional): Initialization config dict.
+            Default: None.
+    """
+
+    def __init__(
+        self,
+        in_channels: Sequence[int],
+        out_channels: int,
+        deepen_factor: float = 1.0,
+        widen_factor: float = 1.0,
+        num_csp_blocks: int = 3,
+        freeze_all: bool = False,
+        use_depthwise: bool = False,
+        expand_ratio: float = 0.5,
+        upsample_cfg: ConfigType = dict(scale_factor=2, mode='nearest'),
+        conv_cfg: bool = None,
+        norm_cfg: ConfigType = dict(type='BN'),
+        act_cfg: ConfigType = dict(type='SiLU', inplace=True),
+        init_cfg: OptMultiConfig = dict(
+            type='Kaiming',
+            layer='Conv2d',
+            a=math.sqrt(5),
+            distribution='uniform',
+            mode='fan_in',
+            nonlinearity='leaky_relu')
+    ) -> None:
+        self.num_csp_blocks = round(num_csp_blocks * deepen_factor)
+        self.conv = DepthwiseSeparableConvModule \
+            if use_depthwise else ConvModule
+        self.upsample_cfg = upsample_cfg
+        self.expand_ratio = expand_ratio
+        self.conv_cfg = conv_cfg
+
+        super().__init__(
+            in_channels=[
+                int(channel * widen_factor) for channel in in_channels
+            ],
+            out_channels=int(out_channels * widen_factor),
+            deepen_factor=deepen_factor,
+            widen_factor=widen_factor,
+            freeze_all=freeze_all,
+            norm_cfg=norm_cfg,
+            act_cfg=act_cfg,
+            init_cfg=init_cfg)
+
+    def build_reduce_layer(self, idx: int) -> nn.Module:
+        """build reduce layer.
+
+        Args:
+            idx (int): layer idx.
+
+        Returns:
+            nn.Module: The reduce layer.
+        """
+        if idx == len(self.in_channels) - 1:
+            layer = self.conv(
+                self.in_channels[idx],
+                self.in_channels[idx - 1],
+                1,
+                norm_cfg=self.norm_cfg,
+                act_cfg=self.act_cfg)
+        else:
+            layer = nn.Identity()
+
+        return layer
+
+    def build_upsample_layer(self, *args, **kwargs) -> nn.Module:
+        """build upsample layer."""
+        return nn.Upsample(**self.upsample_cfg)
+
+    def build_top_down_layer(self, idx: int) -> nn.Module:
+        """build top down layer.
+
+        Args:
+            idx (int): layer idx.
+
+        Returns:
+            nn.Module: The top down layer.
+        """
+        if idx == 1:
+            return CSPLayer(
+                self.in_channels[idx - 1] * 2,
+                self.in_channels[idx - 1],
+                num_blocks=self.num_csp_blocks,
+                add_identity=False,
+                use_cspnext_block=True,
+                expand_ratio=self.expand_ratio,
+                conv_cfg=self.conv_cfg,
+                norm_cfg=self.norm_cfg,
+                act_cfg=self.act_cfg)
+        else:
+            return nn.Sequential(
+                CSPLayer(
+                    self.in_channels[idx - 1] * 2,
+                    self.in_channels[idx - 1],
+                    num_blocks=self.num_csp_blocks,
+                    add_identity=False,
+                    use_cspnext_block=True,
+                    expand_ratio=self.expand_ratio,
+                    conv_cfg=self.conv_cfg,
+                    norm_cfg=self.norm_cfg,
+                    act_cfg=self.act_cfg),
+                self.conv(
+                    self.in_channels[idx - 1],
+                    self.in_channels[idx - 2],
+                    kernel_size=1,
+                    norm_cfg=self.norm_cfg,
+                    act_cfg=self.act_cfg))
+
+    def build_downsample_layer(self, idx: int) -> nn.Module:
+        """build downsample layer.
+
+        Args:
+            idx (int): layer idx.
+
+        Returns:
+            nn.Module: The downsample layer.
+        """
+        return self.conv(
+            self.in_channels[idx],
+            self.in_channels[idx],
+            kernel_size=3,
+            stride=2,
+            padding=1,
+            norm_cfg=self.norm_cfg,
+            act_cfg=self.act_cfg)
+
+    def build_bottom_up_layer(self, idx: int) -> nn.Module:
+        """build bottom up layer.
+
+        Args:
+            idx (int): layer idx.
+
+        Returns:
+            nn.Module: The bottom up layer.
+        """
+        return CSPLayer(
+            self.in_channels[idx] * 2,
+            self.in_channels[idx + 1],
+            num_blocks=self.num_csp_blocks,
+            add_identity=False,
+            use_cspnext_block=True,
+            expand_ratio=self.expand_ratio,
+            conv_cfg=self.conv_cfg,
+            norm_cfg=self.norm_cfg,
+            act_cfg=self.act_cfg)
+
+    def build_out_layer(self, idx: int) -> nn.Module:
+        """build out layer.
+
+        Args:
+            idx (int): layer idx.
+
+        Returns:
+            nn.Module: The out layer.
+        """
+        return self.conv(
+            self.in_channels[idx],
+            self.out_channels,
+            3,
+            padding=1,
+            norm_cfg=self.norm_cfg,
+            act_cfg=self.act_cfg)
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/models/necks/ppyoloe_csppan.py b/mmdetection_practice/third_party/mmyolo/mmyolo/models/necks/ppyoloe_csppan.py
new file mode 100644
index 0000000..4e4ef72
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/models/necks/ppyoloe_csppan.py
@@ -0,0 +1,216 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from typing import List
+
+import torch.nn as nn
+from mmcv.cnn import ConvModule
+from mmdet.utils import ConfigType, OptMultiConfig
+
+from mmyolo.models.backbones.csp_resnet import CSPResLayer
+from mmyolo.models.necks import BaseYOLONeck
+from mmyolo.registry import MODELS
+
+
+@MODELS.register_module()
+class PPYOLOECSPPAFPN(BaseYOLONeck):
+    """CSPPAN in PPYOLOE.
+
+    Args:
+        in_channels (List[int]): Number of input channels per scale.
+        out_channels (List[int]): Number of output channels
+            (used at each scale).
+        deepen_factor (float): Depth multiplier, multiply number of
+            blocks in CSP layer by this amount. Defaults to 1.0.
+        widen_factor (float): Width multiplier, multiply number of
+            channels in each layer by this amount. Defaults to 1.0.
+        freeze_all(bool): Whether to freeze the model.
+        num_csplayer (int): Number of `CSPResLayer` in per layer.
+            Defaults to 1.
+        num_blocks_per_layer (int): Number of blocks per `CSPResLayer`.
+            Defaults to 3.
+        block_cfg (dict): Config dict for block. Defaults to
+            dict(type='PPYOLOEBasicBlock', shortcut=True, use_alpha=False)
+        norm_cfg (dict): Config dict for normalization layer.
+            Defaults to dict(type='BN', momentum=0.1, eps=1e-5).
+        act_cfg (dict): Config dict for activation layer.
+            Defaults to dict(type='SiLU', inplace=True).
+        drop_block_cfg (dict, optional): Drop block config.
+            Defaults to None. If you want to use Drop block after
+            `CSPResLayer`, you can set this para as
+            dict(type='mmdet.DropBlock', drop_prob=0.1,
+            block_size=3, warm_iters=0).
+        init_cfg (dict or list[dict], optional): Initialization config dict.
+            Defaults to None.
+        use_spp (bool): Whether to use `SPP` in reduce layer.
+            Defaults to False.
+    """
+
+    def __init__(self,
+                 in_channels: List[int] = [256, 512, 1024],
+                 out_channels: List[int] = [256, 512, 1024],
+                 deepen_factor: float = 1.0,
+                 widen_factor: float = 1.0,
+                 freeze_all: bool = False,
+                 num_csplayer: int = 1,
+                 num_blocks_per_layer: int = 3,
+                 block_cfg: ConfigType = dict(
+                     type='PPYOLOEBasicBlock', shortcut=False,
+                     use_alpha=False),
+                 norm_cfg: ConfigType = dict(
+                     type='BN', momentum=0.1, eps=1e-5),
+                 act_cfg: ConfigType = dict(type='SiLU', inplace=True),
+                 drop_block_cfg: ConfigType = None,
+                 init_cfg: OptMultiConfig = None,
+                 use_spp: bool = False):
+        self.block_cfg = block_cfg
+        self.num_csplayer = num_csplayer
+        self.num_blocks_per_layer = round(num_blocks_per_layer * deepen_factor)
+        # Only use spp in last reduce_layer, if use_spp=True.
+        self.use_spp = use_spp
+        self.drop_block_cfg = drop_block_cfg
+        assert drop_block_cfg is None or isinstance(drop_block_cfg, dict)
+
+        super().__init__(
+            in_channels=[
+                int(channel * widen_factor) for channel in in_channels
+            ],
+            out_channels=[
+                int(channel * widen_factor) for channel in out_channels
+            ],
+            deepen_factor=deepen_factor,
+            widen_factor=widen_factor,
+            freeze_all=freeze_all,
+            norm_cfg=norm_cfg,
+            act_cfg=act_cfg,
+            init_cfg=init_cfg)
+
+    def build_reduce_layer(self, idx: int):
+        """build reduce layer.
+
+        Args:
+            idx (int): layer idx.
+
+        Returns:
+            nn.Module: The reduce layer.
+        """
+        if idx == len(self.in_channels) - 1:
+            # fpn_stage
+            in_channels = self.in_channels[idx]
+            out_channels = self.out_channels[idx]
+
+            layer = [
+                CSPResLayer(
+                    in_channels=in_channels if i == 0 else out_channels,
+                    out_channels=out_channels,
+                    num_block=self.num_blocks_per_layer,
+                    block_cfg=self.block_cfg,
+                    norm_cfg=self.norm_cfg,
+                    act_cfg=self.act_cfg,
+                    attention_cfg=None,
+                    use_spp=self.use_spp) for i in range(self.num_csplayer)
+            ]
+
+            if self.drop_block_cfg:
+                layer.append(MODELS.build(self.drop_block_cfg))
+            layer = nn.Sequential(*layer)
+        else:
+            layer = nn.Identity()
+
+        return layer
+
+    def build_upsample_layer(self, idx: int) -> nn.Module:
+        """build upsample layer."""
+        # fpn_route
+        in_channels = self.out_channels[idx]
+        return nn.Sequential(
+            ConvModule(
+                in_channels=in_channels,
+                out_channels=in_channels // 2,
+                kernel_size=1,
+                stride=1,
+                padding=0,
+                norm_cfg=self.norm_cfg,
+                act_cfg=self.act_cfg),
+            nn.Upsample(scale_factor=2, mode='nearest'))
+
+    def build_top_down_layer(self, idx: int) -> nn.Module:
+        """build top down layer.
+
+        Args:
+            idx (int): layer idx.
+
+        Returns:
+            nn.Module: The top down layer.
+        """
+        # fpn_stage
+        in_channels = self.in_channels[idx - 1] + self.out_channels[idx] // 2
+        out_channels = self.out_channels[idx - 1]
+
+        layer = [
+            CSPResLayer(
+                in_channels=in_channels if i == 0 else out_channels,
+                out_channels=out_channels,
+                num_block=self.num_blocks_per_layer,
+                block_cfg=self.block_cfg,
+                norm_cfg=self.norm_cfg,
+                act_cfg=self.act_cfg,
+                attention_cfg=None,
+                use_spp=False) for i in range(self.num_csplayer)
+        ]
+
+        if self.drop_block_cfg:
+            layer.append(MODELS.build(self.drop_block_cfg))
+
+        return nn.Sequential(*layer)
+
+    def build_downsample_layer(self, idx: int) -> nn.Module:
+        """build downsample layer.
+
+        Args:
+            idx (int): layer idx.
+
+        Returns:
+            nn.Module: The downsample layer.
+        """
+        # pan_route
+        return ConvModule(
+            in_channels=self.out_channels[idx],
+            out_channels=self.out_channels[idx],
+            kernel_size=3,
+            stride=2,
+            padding=1,
+            norm_cfg=self.norm_cfg,
+            act_cfg=self.act_cfg)
+
+    def build_bottom_up_layer(self, idx: int) -> nn.Module:
+        """build bottom up layer.
+
+        Args:
+            idx (int): layer idx.
+
+        Returns:
+            nn.Module: The bottom up layer.
+        """
+        # pan_stage
+        in_channels = self.out_channels[idx + 1] + self.out_channels[idx]
+        out_channels = self.out_channels[idx + 1]
+
+        layer = [
+            CSPResLayer(
+                in_channels=in_channels if i == 0 else out_channels,
+                out_channels=out_channels,
+                num_block=self.num_blocks_per_layer,
+                block_cfg=self.block_cfg,
+                norm_cfg=self.norm_cfg,
+                act_cfg=self.act_cfg,
+                attention_cfg=None,
+                use_spp=False) for i in range(self.num_csplayer)
+        ]
+
+        if self.drop_block_cfg:
+            layer.append(MODELS.build(self.drop_block_cfg))
+
+        return nn.Sequential(*layer)
+
+    def build_out_layer(self, *args, **kwargs) -> nn.Module:
+        """build out layer."""
+        return nn.Identity()
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/models/necks/yolov5_pafpn.py b/mmdetection_practice/third_party/mmyolo/mmyolo/models/necks/yolov5_pafpn.py
new file mode 100644
index 0000000..b95147f
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/models/necks/yolov5_pafpn.py
@@ -0,0 +1,171 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from typing import List, Union
+
+import torch
+import torch.nn as nn
+from mmcv.cnn import ConvModule
+from mmdet.models.backbones.csp_darknet import CSPLayer
+from mmdet.utils import ConfigType, OptMultiConfig
+
+from mmyolo.registry import MODELS
+from ..utils import make_divisible, make_round
+from .base_yolo_neck import BaseYOLONeck
+
+
+@MODELS.register_module()
+class YOLOv5PAFPN(BaseYOLONeck):
+    """Path Aggregation Network used in YOLOv5.
+
+    Args:
+        in_channels (List[int]): Number of input channels per scale.
+        out_channels (int): Number of output channels (used at each scale)
+        deepen_factor (float): Depth multiplier, multiply number of
+            blocks in CSP layer by this amount. Defaults to 1.0.
+        widen_factor (float): Width multiplier, multiply number of
+            channels in each layer by this amount. Defaults to 1.0.
+        num_csp_blocks (int): Number of bottlenecks in CSPLayer. Defaults to 1.
+        freeze_all(bool): Whether to freeze the model
+        norm_cfg (dict): Config dict for normalization layer.
+            Defaults to dict(type='BN', momentum=0.03, eps=0.001).
+        act_cfg (dict): Config dict for activation layer.
+            Defaults to dict(type='SiLU', inplace=True).
+        init_cfg (dict or list[dict], optional): Initialization config dict.
+            Defaults to None.
+    """
+
+    def __init__(self,
+                 in_channels: List[int],
+                 out_channels: Union[List[int], int],
+                 deepen_factor: float = 1.0,
+                 widen_factor: float = 1.0,
+                 num_csp_blocks: int = 1,
+                 freeze_all: bool = False,
+                 norm_cfg: ConfigType = dict(
+                     type='BN', momentum=0.03, eps=0.001),
+                 act_cfg: ConfigType = dict(type='SiLU', inplace=True),
+                 init_cfg: OptMultiConfig = None):
+        self.num_csp_blocks = num_csp_blocks
+        super().__init__(
+            in_channels=in_channels,
+            out_channels=out_channels,
+            deepen_factor=deepen_factor,
+            widen_factor=widen_factor,
+            freeze_all=freeze_all,
+            norm_cfg=norm_cfg,
+            act_cfg=act_cfg,
+            init_cfg=init_cfg)
+
+    def init_weights(self):
+        if self.init_cfg is None:
+            """Initialize the parameters."""
+            for m in self.modules():
+                if isinstance(m, torch.nn.Conv2d):
+                    # In order to be consistent with the source code,
+                    # reset the Conv2d initialization parameters
+                    m.reset_parameters()
+        else:
+            super().init_weights()
+
+    def build_reduce_layer(self, idx: int) -> nn.Module:
+        """build reduce layer.
+
+        Args:
+            idx (int): layer idx.
+
+        Returns:
+            nn.Module: The reduce layer.
+        """
+        if idx == len(self.in_channels) - 1:
+            layer = ConvModule(
+                make_divisible(self.in_channels[idx], self.widen_factor),
+                make_divisible(self.in_channels[idx - 1], self.widen_factor),
+                1,
+                norm_cfg=self.norm_cfg,
+                act_cfg=self.act_cfg)
+        else:
+            layer = nn.Identity()
+
+        return layer
+
+    def build_upsample_layer(self, *args, **kwargs) -> nn.Module:
+        """build upsample layer."""
+        return nn.Upsample(scale_factor=2, mode='nearest')
+
+    def build_top_down_layer(self, idx: int):
+        """build top down layer.
+
+        Args:
+            idx (int): layer idx.
+
+        Returns:
+            nn.Module: The top down layer.
+        """
+
+        if idx == 1:
+            return CSPLayer(
+                make_divisible(self.in_channels[idx - 1] * 2,
+                               self.widen_factor),
+                make_divisible(self.in_channels[idx - 1], self.widen_factor),
+                num_blocks=make_round(self.num_csp_blocks, self.deepen_factor),
+                add_identity=False,
+                norm_cfg=self.norm_cfg,
+                act_cfg=self.act_cfg)
+        else:
+            return nn.Sequential(
+                CSPLayer(
+                    make_divisible(self.in_channels[idx - 1] * 2,
+                                   self.widen_factor),
+                    make_divisible(self.in_channels[idx - 1],
+                                   self.widen_factor),
+                    num_blocks=make_round(self.num_csp_blocks,
+                                          self.deepen_factor),
+                    add_identity=False,
+                    norm_cfg=self.norm_cfg,
+                    act_cfg=self.act_cfg),
+                ConvModule(
+                    make_divisible(self.in_channels[idx - 1],
+                                   self.widen_factor),
+                    make_divisible(self.in_channels[idx - 2],
+                                   self.widen_factor),
+                    kernel_size=1,
+                    norm_cfg=self.norm_cfg,
+                    act_cfg=self.act_cfg))
+
+    def build_downsample_layer(self, idx: int) -> nn.Module:
+        """build downsample layer.
+
+        Args:
+            idx (int): layer idx.
+
+        Returns:
+            nn.Module: The downsample layer.
+        """
+        return ConvModule(
+            make_divisible(self.in_channels[idx], self.widen_factor),
+            make_divisible(self.in_channels[idx], self.widen_factor),
+            kernel_size=3,
+            stride=2,
+            padding=1,
+            norm_cfg=self.norm_cfg,
+            act_cfg=self.act_cfg)
+
+    def build_bottom_up_layer(self, idx: int) -> nn.Module:
+        """build bottom up layer.
+
+        Args:
+            idx (int): layer idx.
+
+        Returns:
+            nn.Module: The bottom up layer.
+        """
+        return CSPLayer(
+            make_divisible(self.in_channels[idx] * 2, self.widen_factor),
+            make_divisible(self.in_channels[idx + 1], self.widen_factor),
+            num_blocks=make_round(self.num_csp_blocks, self.deepen_factor),
+            add_identity=False,
+            norm_cfg=self.norm_cfg,
+            act_cfg=self.act_cfg)
+
+    def build_out_layer(self, *args, **kwargs) -> nn.Module:
+        """build out layer."""
+        return nn.Identity()
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/models/necks/yolov6_pafpn.py b/mmdetection_practice/third_party/mmyolo/mmyolo/models/necks/yolov6_pafpn.py
new file mode 100644
index 0000000..8778271
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/models/necks/yolov6_pafpn.py
@@ -0,0 +1,527 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from typing import List
+
+import torch
+import torch.nn as nn
+from mmcv.cnn import ConvModule
+from mmdet.utils import ConfigType, OptMultiConfig
+
+from mmyolo.registry import MODELS
+from ..layers import BepC3StageBlock, BiFusion, RepStageBlock
+from ..utils import make_round
+from .base_yolo_neck import BaseYOLONeck
+
+
+@MODELS.register_module()
+class YOLOv6RepPAFPN(BaseYOLONeck):
+    """Path Aggregation Network used in YOLOv6.
+
+    Args:
+        in_channels (List[int]): Number of input channels per scale.
+        out_channels (int): Number of output channels (used at each scale)
+        deepen_factor (float): Depth multiplier, multiply number of
+            blocks in CSP layer by this amount. Defaults to 1.0.
+        widen_factor (float): Width multiplier, multiply number of
+            channels in each layer by this amount. Defaults to 1.0.
+        num_csp_blocks (int): Number of bottlenecks in CSPLayer. Defaults to 1.
+        freeze_all(bool): Whether to freeze the model.
+        norm_cfg (dict): Config dict for normalization layer.
+            Defaults to dict(type='BN', momentum=0.03, eps=0.001).
+        act_cfg (dict): Config dict for activation layer.
+            Defaults to dict(type='ReLU', inplace=True).
+        block_cfg (dict): Config dict for the block used to build each
+            layer. Defaults to dict(type='RepVGGBlock').
+        init_cfg (dict or list[dict], optional): Initialization config dict.
+            Defaults to None.
+    """
+
+    def __init__(self,
+                 in_channels: List[int],
+                 out_channels: int,
+                 deepen_factor: float = 1.0,
+                 widen_factor: float = 1.0,
+                 num_csp_blocks: int = 12,
+                 freeze_all: bool = False,
+                 norm_cfg: ConfigType = dict(
+                     type='BN', momentum=0.03, eps=0.001),
+                 act_cfg: ConfigType = dict(type='ReLU', inplace=True),
+                 block_cfg: ConfigType = dict(type='RepVGGBlock'),
+                 init_cfg: OptMultiConfig = None):
+        self.num_csp_blocks = num_csp_blocks
+        self.block_cfg = block_cfg
+        super().__init__(
+            in_channels=in_channels,
+            out_channels=out_channels,
+            deepen_factor=deepen_factor,
+            widen_factor=widen_factor,
+            freeze_all=freeze_all,
+            norm_cfg=norm_cfg,
+            act_cfg=act_cfg,
+            init_cfg=init_cfg)
+
+    def build_reduce_layer(self, idx: int) -> nn.Module:
+        """build reduce layer.
+
+        Args:
+            idx (int): layer idx.
+        Returns:
+            nn.Module: The reduce layer.
+        """
+        if idx == 2:
+            layer = ConvModule(
+                in_channels=int(self.in_channels[idx] * self.widen_factor),
+                out_channels=int(self.out_channels[idx - 1] *
+                                 self.widen_factor),
+                kernel_size=1,
+                stride=1,
+                norm_cfg=self.norm_cfg,
+                act_cfg=self.act_cfg)
+        else:
+            layer = nn.Identity()
+
+        return layer
+
+    def build_upsample_layer(self, idx: int) -> nn.Module:
+        """build upsample layer.
+
+        Args:
+            idx (int): layer idx.
+        Returns:
+            nn.Module: The upsample layer.
+        """
+        return nn.ConvTranspose2d(
+            in_channels=int(self.out_channels[idx - 1] * self.widen_factor),
+            out_channels=int(self.out_channels[idx - 1] * self.widen_factor),
+            kernel_size=2,
+            stride=2,
+            bias=True)
+
+    def build_top_down_layer(self, idx: int) -> nn.Module:
+        """build top down layer.
+
+        Args:
+            idx (int): layer idx.
+        Returns:
+            nn.Module: The top down layer.
+        """
+        block_cfg = self.block_cfg.copy()
+
+        layer0 = RepStageBlock(
+            in_channels=int(
+                (self.out_channels[idx - 1] + self.in_channels[idx - 1]) *
+                self.widen_factor),
+            out_channels=int(self.out_channels[idx - 1] * self.widen_factor),
+            num_blocks=make_round(self.num_csp_blocks, self.deepen_factor),
+            block_cfg=block_cfg)
+
+        if idx == 1:
+            return layer0
+        elif idx == 2:
+            layer1 = ConvModule(
+                in_channels=int(self.out_channels[idx - 1] *
+                                self.widen_factor),
+                out_channels=int(self.out_channels[idx - 2] *
+                                 self.widen_factor),
+                kernel_size=1,
+                stride=1,
+                norm_cfg=self.norm_cfg,
+                act_cfg=self.act_cfg)
+            return nn.Sequential(layer0, layer1)
+
+    def build_downsample_layer(self, idx: int) -> nn.Module:
+        """build downsample layer.
+
+        Args:
+            idx (int): layer idx.
+        Returns:
+            nn.Module: The downsample layer.
+        """
+        return ConvModule(
+            in_channels=int(self.out_channels[idx] * self.widen_factor),
+            out_channels=int(self.out_channels[idx] * self.widen_factor),
+            kernel_size=3,
+            stride=2,
+            padding=3 // 2,
+            norm_cfg=self.norm_cfg,
+            act_cfg=self.act_cfg)
+
+    def build_bottom_up_layer(self, idx: int) -> nn.Module:
+        """build bottom up layer.
+
+        Args:
+            idx (int): layer idx.
+        Returns:
+            nn.Module: The bottom up layer.
+        """
+        block_cfg = self.block_cfg.copy()
+
+        return RepStageBlock(
+            in_channels=int(self.out_channels[idx] * 2 * self.widen_factor),
+            out_channels=int(self.out_channels[idx + 1] * self.widen_factor),
+            num_blocks=make_round(self.num_csp_blocks, self.deepen_factor),
+            block_cfg=block_cfg)
+
+    def build_out_layer(self, *args, **kwargs) -> nn.Module:
+        """build out layer."""
+        return nn.Identity()
+
+    def init_weights(self):
+        if self.init_cfg is None:
+            """Initialize the parameters."""
+            for m in self.modules():
+                if isinstance(m, torch.nn.Conv2d):
+                    # In order to be consistent with the source code,
+                    # reset the Conv2d initialization parameters
+                    m.reset_parameters()
+        else:
+            super().init_weights()
+
+
+@MODELS.register_module()
+class YOLOv6CSPRepPAFPN(YOLOv6RepPAFPN):
+    """Path Aggregation Network used in YOLOv6.
+
+    Args:
+        in_channels (List[int]): Number of input channels per scale.
+        out_channels (int): Number of output channels (used at each scale)
+        deepen_factor (float): Depth multiplier, multiply number of
+            blocks in CSP layer by this amount. Defaults to 1.0.
+        widen_factor (float): Width multiplier, multiply number of
+            channels in each layer by this amount. Defaults to 1.0.
+        num_csp_blocks (int): Number of bottlenecks in CSPLayer. Defaults to 1.
+        freeze_all(bool): Whether to freeze the model.
+        norm_cfg (dict): Config dict for normalization layer.
+            Defaults to dict(type='BN', momentum=0.03, eps=0.001).
+        act_cfg (dict): Config dict for activation layer.
+            Defaults to dict(type='ReLU', inplace=True).
+        block_cfg (dict): Config dict for the block used to build each
+            layer. Defaults to dict(type='RepVGGBlock').
+        block_act_cfg (dict): Config dict for activation layer used in each
+            stage. Defaults to dict(type='SiLU', inplace=True).
+        init_cfg (dict or list[dict], optional): Initialization config dict.
+            Defaults to None.
+    """
+
+    def __init__(self,
+                 in_channels: List[int],
+                 out_channels: int,
+                 deepen_factor: float = 1.0,
+                 widen_factor: float = 1.0,
+                 hidden_ratio: float = 0.5,
+                 num_csp_blocks: int = 12,
+                 freeze_all: bool = False,
+                 norm_cfg: ConfigType = dict(
+                     type='BN', momentum=0.03, eps=0.001),
+                 act_cfg: ConfigType = dict(type='ReLU', inplace=True),
+                 block_act_cfg: ConfigType = dict(type='SiLU', inplace=True),
+                 block_cfg: ConfigType = dict(type='RepVGGBlock'),
+                 init_cfg: OptMultiConfig = None):
+        self.hidden_ratio = hidden_ratio
+        self.block_act_cfg = block_act_cfg
+        super().__init__(
+            in_channels=in_channels,
+            out_channels=out_channels,
+            deepen_factor=deepen_factor,
+            widen_factor=widen_factor,
+            num_csp_blocks=num_csp_blocks,
+            freeze_all=freeze_all,
+            norm_cfg=norm_cfg,
+            act_cfg=act_cfg,
+            block_cfg=block_cfg,
+            init_cfg=init_cfg)
+
+    def build_top_down_layer(self, idx: int) -> nn.Module:
+        """build top down layer.
+
+        Args:
+            idx (int): layer idx.
+        Returns:
+            nn.Module: The top down layer.
+        """
+        block_cfg = self.block_cfg.copy()
+
+        layer0 = BepC3StageBlock(
+            in_channels=int(
+                (self.out_channels[idx - 1] + self.in_channels[idx - 1]) *
+                self.widen_factor),
+            out_channels=int(self.out_channels[idx - 1] * self.widen_factor),
+            num_blocks=make_round(self.num_csp_blocks, self.deepen_factor),
+            block_cfg=block_cfg,
+            hidden_ratio=self.hidden_ratio,
+            norm_cfg=self.norm_cfg,
+            act_cfg=self.block_act_cfg)
+
+        if idx == 1:
+            return layer0
+        elif idx == 2:
+            layer1 = ConvModule(
+                in_channels=int(self.out_channels[idx - 1] *
+                                self.widen_factor),
+                out_channels=int(self.out_channels[idx - 2] *
+                                 self.widen_factor),
+                kernel_size=1,
+                stride=1,
+                norm_cfg=self.norm_cfg,
+                act_cfg=self.act_cfg)
+            return nn.Sequential(layer0, layer1)
+
+    def build_bottom_up_layer(self, idx: int) -> nn.Module:
+        """build bottom up layer.
+
+        Args:
+            idx (int): layer idx.
+        Returns:
+            nn.Module: The bottom up layer.
+        """
+        block_cfg = self.block_cfg.copy()
+
+        return BepC3StageBlock(
+            in_channels=int(self.out_channels[idx] * 2 * self.widen_factor),
+            out_channels=int(self.out_channels[idx + 1] * self.widen_factor),
+            num_blocks=make_round(self.num_csp_blocks, self.deepen_factor),
+            block_cfg=block_cfg,
+            hidden_ratio=self.hidden_ratio,
+            norm_cfg=self.norm_cfg,
+            act_cfg=self.block_act_cfg)
+
+
+@MODELS.register_module()
+class YOLOv6RepBiPAFPN(YOLOv6RepPAFPN):
+    """Path Aggregation Network used in YOLOv6 3.0.
+
+    Args:
+        in_channels (List[int]): Number of input channels per scale.
+        out_channels (int): Number of output channels (used at each scale)
+        deepen_factor (float): Depth multiplier, multiply number of
+            blocks in CSP layer by this amount. Defaults to 1.0.
+        widen_factor (float): Width multiplier, multiply number of
+            channels in each layer by this amount. Defaults to 1.0.
+        num_csp_blocks (int): Number of bottlenecks in CSPLayer. Defaults to 1.
+        freeze_all(bool): Whether to freeze the model.
+        norm_cfg (dict): Config dict for normalization layer.
+            Defaults to dict(type='BN', momentum=0.03, eps=0.001).
+        act_cfg (dict): Config dict for activation layer.
+            Defaults to dict(type='ReLU', inplace=True).
+        block_cfg (dict): Config dict for the block used to build each
+            layer. Defaults to dict(type='RepVGGBlock').
+        init_cfg (dict or list[dict], optional): Initialization config dict.
+            Defaults to None.
+    """
+
+    def __init__(self,
+                 in_channels: List[int],
+                 out_channels: int,
+                 deepen_factor: float = 1.0,
+                 widen_factor: float = 1.0,
+                 num_csp_blocks: int = 12,
+                 freeze_all: bool = False,
+                 norm_cfg: ConfigType = dict(
+                     type='BN', momentum=0.03, eps=0.001),
+                 act_cfg: ConfigType = dict(type='ReLU', inplace=True),
+                 block_cfg: ConfigType = dict(type='RepVGGBlock'),
+                 init_cfg: OptMultiConfig = None):
+        self.extra_in_channel = in_channels[0]
+        super().__init__(
+            in_channels=in_channels[1:],
+            out_channels=out_channels,
+            deepen_factor=deepen_factor,
+            widen_factor=widen_factor,
+            num_csp_blocks=num_csp_blocks,
+            freeze_all=freeze_all,
+            norm_cfg=norm_cfg,
+            act_cfg=act_cfg,
+            block_cfg=block_cfg,
+            init_cfg=init_cfg)
+
+    def build_top_down_layer(self, idx: int) -> nn.Module:
+        """build top down layer.
+
+        Args:
+            idx (int): layer idx.
+        Returns:
+            nn.Module: The top down layer.
+        """
+        block_cfg = self.block_cfg.copy()
+
+        layer0 = RepStageBlock(
+            in_channels=int(self.out_channels[idx - 1] * self.widen_factor),
+            out_channels=int(self.out_channels[idx - 1] * self.widen_factor),
+            num_blocks=make_round(self.num_csp_blocks, self.deepen_factor),
+            block_cfg=block_cfg)
+
+        if idx == 1:
+            return layer0
+        elif idx == 2:
+            layer1 = ConvModule(
+                in_channels=int(self.out_channels[idx - 1] *
+                                self.widen_factor),
+                out_channels=int(self.out_channels[idx - 2] *
+                                 self.widen_factor),
+                kernel_size=1,
+                stride=1,
+                norm_cfg=self.norm_cfg,
+                act_cfg=self.act_cfg)
+            return nn.Sequential(layer0, layer1)
+
+    def build_upsample_layer(self, idx: int) -> nn.Module:
+        """build upsample layer.
+
+        Args:
+            idx (int): layer idx.
+        Returns:
+            nn.Module: The upsample layer.
+        """
+        in_channels1 = self.in_channels[
+            idx - 2] if idx > 1 else self.extra_in_channel
+        return BiFusion(
+            in_channels0=int(self.in_channels[idx - 1] * self.widen_factor),
+            in_channels1=int(in_channels1 * self.widen_factor),
+            out_channels=int(self.out_channels[idx - 1] * self.widen_factor),
+            norm_cfg=self.norm_cfg,
+            act_cfg=self.act_cfg)
+
+    def forward(self, inputs: List[torch.Tensor]) -> tuple:
+        """Forward function."""
+        assert len(inputs) == len(self.in_channels) + 1
+        # reduce layers
+        reduce_outs = [inputs[0]]
+        for idx in range(len(self.in_channels)):
+            reduce_outs.append(self.reduce_layers[idx](inputs[idx + 1]))
+
+        # top-down path
+        inner_outs = [reduce_outs[-1]]
+        for idx in range(len(self.in_channels) - 1, 0, -1):
+            feat_high = inner_outs[0]
+            feat_cur = reduce_outs[idx]
+            feat_low = reduce_outs[idx - 1]
+            top_down_layer_inputs = self.upsample_layers[len(self.in_channels)
+                                                         - 1 - idx]([
+                                                             feat_high,
+                                                             feat_cur, feat_low
+                                                         ])
+            inner_out = self.top_down_layers[len(self.in_channels) - 1 - idx](
+                top_down_layer_inputs)
+            inner_outs.insert(0, inner_out)
+
+        # bottom-up path
+        outs = [inner_outs[0]]
+        for idx in range(len(self.in_channels) - 1):
+            feat_low = outs[-1]
+            feat_high = inner_outs[idx + 1]
+            downsample_feat = self.downsample_layers[idx](feat_low)
+            out = self.bottom_up_layers[idx](
+                torch.cat([downsample_feat, feat_high], 1))
+            outs.append(out)
+
+        # out_layers
+        results = []
+        for idx in range(len(self.in_channels)):
+            results.append(self.out_layers[idx](outs[idx]))
+
+        return tuple(results)
+
+
+@MODELS.register_module()
+class YOLOv6CSPRepBiPAFPN(YOLOv6RepBiPAFPN):
+    """Path Aggregation Network used in YOLOv6 3.0.
+
+    Args:
+        in_channels (List[int]): Number of input channels per scale.
+        out_channels (int): Number of output channels (used at each scale)
+        deepen_factor (float): Depth multiplier, multiply number of
+            blocks in CSP layer by this amount. Defaults to 1.0.
+        widen_factor (float): Width multiplier, multiply number of
+            channels in each layer by this amount. Defaults to 1.0.
+        num_csp_blocks (int): Number of bottlenecks in CSPLayer. Defaults to 1.
+        freeze_all(bool): Whether to freeze the model.
+        norm_cfg (dict): Config dict for normalization layer.
+            Defaults to dict(type='BN', momentum=0.03, eps=0.001).
+        act_cfg (dict): Config dict for activation layer.
+            Defaults to dict(type='ReLU', inplace=True).
+        block_cfg (dict): Config dict for the block used to build each
+            layer. Defaults to dict(type='RepVGGBlock').
+        block_act_cfg (dict): Config dict for activation layer used in each
+            stage. Defaults to dict(type='SiLU', inplace=True).
+        init_cfg (dict or list[dict], optional): Initialization config dict.
+            Defaults to None.
+    """
+
+    def __init__(self,
+                 in_channels: List[int],
+                 out_channels: int,
+                 deepen_factor: float = 1.0,
+                 widen_factor: float = 1.0,
+                 hidden_ratio: float = 0.5,
+                 num_csp_blocks: int = 12,
+                 freeze_all: bool = False,
+                 norm_cfg: ConfigType = dict(
+                     type='BN', momentum=0.03, eps=0.001),
+                 act_cfg: ConfigType = dict(type='ReLU', inplace=True),
+                 block_act_cfg: ConfigType = dict(type='SiLU', inplace=True),
+                 block_cfg: ConfigType = dict(type='RepVGGBlock'),
+                 init_cfg: OptMultiConfig = None):
+        self.hidden_ratio = hidden_ratio
+        self.block_act_cfg = block_act_cfg
+        super().__init__(
+            in_channels=in_channels,
+            out_channels=out_channels,
+            deepen_factor=deepen_factor,
+            widen_factor=widen_factor,
+            num_csp_blocks=num_csp_blocks,
+            freeze_all=freeze_all,
+            norm_cfg=norm_cfg,
+            act_cfg=act_cfg,
+            block_cfg=block_cfg,
+            init_cfg=init_cfg)
+
+    def build_top_down_layer(self, idx: int) -> nn.Module:
+        """build top down layer.
+
+        Args:
+            idx (int): layer idx.
+        Returns:
+            nn.Module: The top down layer.
+        """
+        block_cfg = self.block_cfg.copy()
+
+        layer0 = BepC3StageBlock(
+            in_channels=int(self.out_channels[idx - 1] * self.widen_factor),
+            out_channels=int(self.out_channels[idx - 1] * self.widen_factor),
+            num_blocks=make_round(self.num_csp_blocks, self.deepen_factor),
+            block_cfg=block_cfg,
+            hidden_ratio=self.hidden_ratio,
+            norm_cfg=self.norm_cfg,
+            act_cfg=self.block_act_cfg)
+
+        if idx == 1:
+            return layer0
+        elif idx == 2:
+            layer1 = ConvModule(
+                in_channels=int(self.out_channels[idx - 1] *
+                                self.widen_factor),
+                out_channels=int(self.out_channels[idx - 2] *
+                                 self.widen_factor),
+                kernel_size=1,
+                stride=1,
+                norm_cfg=self.norm_cfg,
+                act_cfg=self.act_cfg)
+            return nn.Sequential(layer0, layer1)
+
+    def build_bottom_up_layer(self, idx: int) -> nn.Module:
+        """build bottom up layer.
+
+        Args:
+            idx (int): layer idx.
+        Returns:
+            nn.Module: The bottom up layer.
+        """
+        block_cfg = self.block_cfg.copy()
+
+        return BepC3StageBlock(
+            in_channels=int(self.out_channels[idx] * 2 * self.widen_factor),
+            out_channels=int(self.out_channels[idx + 1] * self.widen_factor),
+            num_blocks=make_round(self.num_csp_blocks, self.deepen_factor),
+            block_cfg=block_cfg,
+            hidden_ratio=self.hidden_ratio,
+            norm_cfg=self.norm_cfg,
+            act_cfg=self.block_act_cfg)
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/models/necks/yolov7_pafpn.py b/mmdetection_practice/third_party/mmyolo/mmyolo/models/necks/yolov7_pafpn.py
new file mode 100644
index 0000000..1d31f46
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/models/necks/yolov7_pafpn.py
@@ -0,0 +1,216 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from typing import List
+
+import torch.nn as nn
+from mmcv.cnn import ConvModule
+from mmdet.utils import ConfigType, OptMultiConfig
+
+from mmyolo.registry import MODELS
+from ..layers import MaxPoolAndStrideConvBlock, RepVGGBlock, SPPFCSPBlock
+from .base_yolo_neck import BaseYOLONeck
+
+
+@MODELS.register_module()
+class YOLOv7PAFPN(BaseYOLONeck):
+    """Path Aggregation Network used in YOLOv7.
+
+    Args:
+        in_channels (List[int]): Number of input channels per scale.
+        out_channels (int): Number of output channels (used at each scale).
+        block_cfg (dict): Config dict for block.
+        deepen_factor (float): Depth multiplier, multiply number of
+            blocks in CSP layer by this amount. Defaults to 1.0.
+        widen_factor (float): Width multiplier, multiply number of
+            channels in each layer by this amount. Defaults to 1.0.
+        spp_expand_ratio (float): Expand ratio of SPPCSPBlock.
+            Defaults to 0.5.
+        is_tiny_version (bool): Is tiny version of neck. If True,
+            it means it is a yolov7 tiny model. Defaults to False.
+        use_maxpool_in_downsample (bool): Whether maxpooling is
+            used in downsample layers. Defaults to True.
+        use_in_channels_in_downsample (bool): MaxPoolAndStrideConvBlock
+            module input parameters. Defaults to False.
+        use_repconv_outs (bool): Whether to use `repconv` in the output
+            layer. Defaults to True.
+        upsample_feats_cat_first (bool): Whether the output features are
+            concat first after upsampling in the topdown module.
+            Defaults to True. Currently only YOLOv7 is false.
+        freeze_all(bool): Whether to freeze the model. Defaults to False.
+        norm_cfg (dict): Config dict for normalization layer.
+            Defaults to dict(type='BN', momentum=0.03, eps=0.001).
+        act_cfg (dict): Config dict for activation layer.
+            Defaults to dict(type='SiLU', inplace=True).
+        init_cfg (dict or list[dict], optional): Initialization config dict.
+            Defaults to None.
+    """
+
+    def __init__(self,
+                 in_channels: List[int],
+                 out_channels: List[int],
+                 block_cfg: dict = dict(
+                     type='ELANBlock',
+                     middle_ratio=0.5,
+                     block_ratio=0.25,
+                     num_blocks=4,
+                     num_convs_in_block=1),
+                 deepen_factor: float = 1.0,
+                 widen_factor: float = 1.0,
+                 spp_expand_ratio: float = 0.5,
+                 is_tiny_version: bool = False,
+                 use_maxpool_in_downsample: bool = True,
+                 use_in_channels_in_downsample: bool = False,
+                 use_repconv_outs: bool = True,
+                 upsample_feats_cat_first: bool = False,
+                 freeze_all: bool = False,
+                 norm_cfg: ConfigType = dict(
+                     type='BN', momentum=0.03, eps=0.001),
+                 act_cfg: ConfigType = dict(type='SiLU', inplace=True),
+                 init_cfg: OptMultiConfig = None):
+
+        self.is_tiny_version = is_tiny_version
+        self.use_maxpool_in_downsample = use_maxpool_in_downsample
+        self.use_in_channels_in_downsample = use_in_channels_in_downsample
+        self.spp_expand_ratio = spp_expand_ratio
+        self.use_repconv_outs = use_repconv_outs
+        self.block_cfg = block_cfg
+        self.block_cfg.setdefault('norm_cfg', norm_cfg)
+        self.block_cfg.setdefault('act_cfg', act_cfg)
+
+        super().__init__(
+            in_channels=[
+                int(channel * widen_factor) for channel in in_channels
+            ],
+            out_channels=[
+                int(channel * widen_factor) for channel in out_channels
+            ],
+            deepen_factor=deepen_factor,
+            widen_factor=widen_factor,
+            upsample_feats_cat_first=upsample_feats_cat_first,
+            freeze_all=freeze_all,
+            norm_cfg=norm_cfg,
+            act_cfg=act_cfg,
+            init_cfg=init_cfg)
+
+    def build_reduce_layer(self, idx: int) -> nn.Module:
+        """build reduce layer.
+
+        Args:
+            idx (int): layer idx.
+
+        Returns:
+            nn.Module: The reduce layer.
+        """
+        if idx == len(self.in_channels) - 1:
+            layer = SPPFCSPBlock(
+                self.in_channels[idx],
+                self.out_channels[idx],
+                expand_ratio=self.spp_expand_ratio,
+                is_tiny_version=self.is_tiny_version,
+                kernel_sizes=5,
+                norm_cfg=self.norm_cfg,
+                act_cfg=self.act_cfg)
+        else:
+            layer = ConvModule(
+                self.in_channels[idx],
+                self.out_channels[idx],
+                1,
+                norm_cfg=self.norm_cfg,
+                act_cfg=self.act_cfg)
+
+        return layer
+
+    def build_upsample_layer(self, idx: int) -> nn.Module:
+        """build upsample layer."""
+        return nn.Sequential(
+            ConvModule(
+                self.out_channels[idx],
+                self.out_channels[idx - 1],
+                1,
+                norm_cfg=self.norm_cfg,
+                act_cfg=self.act_cfg),
+            nn.Upsample(scale_factor=2, mode='nearest'))
+
+    def build_top_down_layer(self, idx: int) -> nn.Module:
+        """build top down layer.
+
+        Args:
+            idx (int): layer idx.
+
+        Returns:
+            nn.Module: The top down layer.
+        """
+        block_cfg = self.block_cfg.copy()
+        block_cfg['in_channels'] = self.out_channels[idx - 1] * 2
+        block_cfg['out_channels'] = self.out_channels[idx - 1]
+        return MODELS.build(block_cfg)
+
+    def build_downsample_layer(self, idx: int) -> nn.Module:
+        """build downsample layer.
+
+        Args:
+            idx (int): layer idx.
+
+        Returns:
+            nn.Module: The downsample layer.
+        """
+        if self.use_maxpool_in_downsample and not self.is_tiny_version:
+            return MaxPoolAndStrideConvBlock(
+                self.out_channels[idx],
+                self.out_channels[idx + 1],
+                use_in_channels_of_middle=self.use_in_channels_in_downsample,
+                norm_cfg=self.norm_cfg,
+                act_cfg=self.act_cfg)
+        else:
+            return ConvModule(
+                self.out_channels[idx],
+                self.out_channels[idx + 1],
+                3,
+                stride=2,
+                padding=1,
+                norm_cfg=self.norm_cfg,
+                act_cfg=self.act_cfg)
+
+    def build_bottom_up_layer(self, idx: int) -> nn.Module:
+        """build bottom up layer.
+
+        Args:
+            idx (int): layer idx.
+
+        Returns:
+            nn.Module: The bottom up layer.
+        """
+        block_cfg = self.block_cfg.copy()
+        block_cfg['in_channels'] = self.out_channels[idx + 1] * 2
+        block_cfg['out_channels'] = self.out_channels[idx + 1]
+        return MODELS.build(block_cfg)
+
+    def build_out_layer(self, idx: int) -> nn.Module:
+        """build out layer.
+
+        Args:
+            idx (int): layer idx.
+
+        Returns:
+            nn.Module: The out layer.
+        """
+        if len(self.in_channels) == 4:
+            # P6
+            return nn.Identity()
+
+        out_channels = self.out_channels[idx] * 2
+
+        if self.use_repconv_outs:
+            return RepVGGBlock(
+                self.out_channels[idx],
+                out_channels,
+                3,
+                norm_cfg=self.norm_cfg,
+                act_cfg=self.act_cfg)
+        else:
+            return ConvModule(
+                self.out_channels[idx],
+                out_channels,
+                3,
+                padding=1,
+                norm_cfg=self.norm_cfg,
+                act_cfg=self.act_cfg)
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/models/necks/yolov8_pafpn.py b/mmdetection_practice/third_party/mmyolo/mmyolo/models/necks/yolov8_pafpn.py
new file mode 100644
index 0000000..e26698b
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/models/necks/yolov8_pafpn.py
@@ -0,0 +1,102 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from typing import List, Union
+
+import torch.nn as nn
+from mmdet.utils import ConfigType, OptMultiConfig
+
+from mmyolo.registry import MODELS
+from .. import CSPLayerWithTwoConv
+from ..utils import make_divisible, make_round
+from .yolov5_pafpn import YOLOv5PAFPN
+
+
+@MODELS.register_module()
+class YOLOv8PAFPN(YOLOv5PAFPN):
+    """Path Aggregation Network used in YOLOv8.
+
+    Args:
+        in_channels (List[int]): Number of input channels per scale.
+        out_channels (int): Number of output channels (used at each scale)
+        deepen_factor (float): Depth multiplier, multiply number of
+            blocks in CSP layer by this amount. Defaults to 1.0.
+        widen_factor (float): Width multiplier, multiply number of
+            channels in each layer by this amount. Defaults to 1.0.
+        num_csp_blocks (int): Number of bottlenecks in CSPLayer. Defaults to 1.
+        freeze_all(bool): Whether to freeze the model
+        norm_cfg (dict): Config dict for normalization layer.
+            Defaults to dict(type='BN', momentum=0.03, eps=0.001).
+        act_cfg (dict): Config dict for activation layer.
+            Defaults to dict(type='SiLU', inplace=True).
+        init_cfg (dict or list[dict], optional): Initialization config dict.
+            Defaults to None.
+    """
+
+    def __init__(self,
+                 in_channels: List[int],
+                 out_channels: Union[List[int], int],
+                 deepen_factor: float = 1.0,
+                 widen_factor: float = 1.0,
+                 num_csp_blocks: int = 3,
+                 freeze_all: bool = False,
+                 norm_cfg: ConfigType = dict(
+                     type='BN', momentum=0.03, eps=0.001),
+                 act_cfg: ConfigType = dict(type='SiLU', inplace=True),
+                 init_cfg: OptMultiConfig = None):
+        super().__init__(
+            in_channels=in_channels,
+            out_channels=out_channels,
+            deepen_factor=deepen_factor,
+            widen_factor=widen_factor,
+            num_csp_blocks=num_csp_blocks,
+            freeze_all=freeze_all,
+            norm_cfg=norm_cfg,
+            act_cfg=act_cfg,
+            init_cfg=init_cfg)
+
+    def build_reduce_layer(self, idx: int) -> nn.Module:
+        """build reduce layer.
+
+        Args:
+            idx (int): layer idx.
+
+        Returns:
+            nn.Module: The reduce layer.
+        """
+        return nn.Identity()
+
+    def build_top_down_layer(self, idx: int) -> nn.Module:
+        """build top down layer.
+
+        Args:
+            idx (int): layer idx.
+
+        Returns:
+            nn.Module: The top down layer.
+        """
+        return CSPLayerWithTwoConv(
+            make_divisible((self.in_channels[idx - 1] + self.in_channels[idx]),
+                           self.widen_factor),
+            make_divisible(self.out_channels[idx - 1], self.widen_factor),
+            num_blocks=make_round(self.num_csp_blocks, self.deepen_factor),
+            add_identity=False,
+            norm_cfg=self.norm_cfg,
+            act_cfg=self.act_cfg)
+
+    def build_bottom_up_layer(self, idx: int) -> nn.Module:
+        """build bottom up layer.
+
+        Args:
+            idx (int): layer idx.
+
+        Returns:
+            nn.Module: The bottom up layer.
+        """
+        return CSPLayerWithTwoConv(
+            make_divisible(
+                (self.out_channels[idx] + self.out_channels[idx + 1]),
+                self.widen_factor),
+            make_divisible(self.out_channels[idx + 1], self.widen_factor),
+            num_blocks=make_round(self.num_csp_blocks, self.deepen_factor),
+            add_identity=False,
+            norm_cfg=self.norm_cfg,
+            act_cfg=self.act_cfg)
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/models/necks/yolox_pafpn.py b/mmdetection_practice/third_party/mmyolo/mmyolo/models/necks/yolox_pafpn.py
new file mode 100644
index 0000000..bd2595e
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/models/necks/yolox_pafpn.py
@@ -0,0 +1,172 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from typing import List
+
+import torch.nn as nn
+from mmcv.cnn import ConvModule, DepthwiseSeparableConvModule
+from mmdet.models.backbones.csp_darknet import CSPLayer
+from mmdet.utils import ConfigType, OptMultiConfig
+
+from mmyolo.registry import MODELS
+from .base_yolo_neck import BaseYOLONeck
+
+
+@MODELS.register_module()
+class YOLOXPAFPN(BaseYOLONeck):
+    """Path Aggregation Network used in YOLOX.
+
+    Args:
+        in_channels (List[int]): Number of input channels per scale.
+        out_channels (int): Number of output channels (used at each scale).
+        deepen_factor (float): Depth multiplier, multiply number of
+            blocks in CSP layer by this amount. Defaults to 1.0.
+        widen_factor (float): Width multiplier, multiply number of
+            channels in each layer by this amount. Defaults to 1.0.
+        num_csp_blocks (int): Number of bottlenecks in CSPLayer. Defaults to 1.
+        use_depthwise (bool): Whether to use depthwise separable convolution.
+            Defaults to False.
+        freeze_all(bool): Whether to freeze the model. Defaults to False.
+        norm_cfg (dict): Config dict for normalization layer.
+            Defaults to dict(type='BN', momentum=0.03, eps=0.001).
+        act_cfg (dict): Config dict for activation layer.
+            Defaults to dict(type='SiLU', inplace=True).
+        init_cfg (dict or list[dict], optional): Initialization config dict.
+            Defaults to None.
+    """
+
+    def __init__(self,
+                 in_channels: List[int],
+                 out_channels: int,
+                 deepen_factor: float = 1.0,
+                 widen_factor: float = 1.0,
+                 num_csp_blocks: int = 3,
+                 use_depthwise: bool = False,
+                 freeze_all: bool = False,
+                 norm_cfg: ConfigType = dict(
+                     type='BN', momentum=0.03, eps=0.001),
+                 act_cfg: ConfigType = dict(type='SiLU', inplace=True),
+                 init_cfg: OptMultiConfig = None):
+        self.num_csp_blocks = round(num_csp_blocks * deepen_factor)
+        self.use_depthwise = use_depthwise
+
+        super().__init__(
+            in_channels=[
+                int(channel * widen_factor) for channel in in_channels
+            ],
+            out_channels=int(out_channels * widen_factor),
+            deepen_factor=deepen_factor,
+            widen_factor=widen_factor,
+            freeze_all=freeze_all,
+            norm_cfg=norm_cfg,
+            act_cfg=act_cfg,
+            init_cfg=init_cfg)
+
+    def build_reduce_layer(self, idx: int) -> nn.Module:
+        """build reduce layer.
+
+        Args:
+            idx (int): layer idx.
+
+        Returns:
+            nn.Module: The reduce layer.
+        """
+        if idx == 2:
+            layer = ConvModule(
+                self.in_channels[idx],
+                self.in_channels[idx - 1],
+                1,
+                norm_cfg=self.norm_cfg,
+                act_cfg=self.act_cfg)
+        else:
+            layer = nn.Identity()
+
+        return layer
+
+    def build_upsample_layer(self, *args, **kwargs) -> nn.Module:
+        """build upsample layer."""
+        return nn.Upsample(scale_factor=2, mode='nearest')
+
+    def build_top_down_layer(self, idx: int) -> nn.Module:
+        """build top down layer.
+
+        Args:
+            idx (int): layer idx.
+
+        Returns:
+            nn.Module: The top down layer.
+        """
+        if idx == 1:
+            return CSPLayer(
+                self.in_channels[idx - 1] * 2,
+                self.in_channels[idx - 1],
+                num_blocks=self.num_csp_blocks,
+                add_identity=False,
+                norm_cfg=self.norm_cfg,
+                act_cfg=self.act_cfg)
+        elif idx == 2:
+            return nn.Sequential(
+                CSPLayer(
+                    self.in_channels[idx - 1] * 2,
+                    self.in_channels[idx - 1],
+                    num_blocks=self.num_csp_blocks,
+                    add_identity=False,
+                    norm_cfg=self.norm_cfg,
+                    act_cfg=self.act_cfg),
+                ConvModule(
+                    self.in_channels[idx - 1],
+                    self.in_channels[idx - 2],
+                    kernel_size=1,
+                    norm_cfg=self.norm_cfg,
+                    act_cfg=self.act_cfg))
+
+    def build_downsample_layer(self, idx: int) -> nn.Module:
+        """build downsample layer.
+
+        Args:
+            idx (int): layer idx.
+
+        Returns:
+            nn.Module: The downsample layer.
+        """
+        conv = DepthwiseSeparableConvModule \
+            if self.use_depthwise else ConvModule
+        return conv(
+            self.in_channels[idx],
+            self.in_channels[idx],
+            kernel_size=3,
+            stride=2,
+            padding=1,
+            norm_cfg=self.norm_cfg,
+            act_cfg=self.act_cfg)
+
+    def build_bottom_up_layer(self, idx: int) -> nn.Module:
+        """build bottom up layer.
+
+        Args:
+            idx (int): layer idx.
+
+        Returns:
+            nn.Module: The bottom up layer.
+        """
+        return CSPLayer(
+            self.in_channels[idx] * 2,
+            self.in_channels[idx + 1],
+            num_blocks=self.num_csp_blocks,
+            add_identity=False,
+            norm_cfg=self.norm_cfg,
+            act_cfg=self.act_cfg)
+
+    def build_out_layer(self, idx: int) -> nn.Module:
+        """build out layer.
+
+        Args:
+            idx (int): layer idx.
+
+        Returns:
+            nn.Module: The out layer.
+        """
+        return ConvModule(
+            self.in_channels[idx],
+            self.out_channels,
+            1,
+            norm_cfg=self.norm_cfg,
+            act_cfg=self.act_cfg)
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/models/plugins/__init__.py b/mmdetection_practice/third_party/mmyolo/mmyolo/models/plugins/__init__.py
new file mode 100644
index 0000000..497233a
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/models/plugins/__init__.py
@@ -0,0 +1,4 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from .cbam import CBAM
+
+__all__ = ['CBAM']
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/models/plugins/cbam.py b/mmdetection_practice/third_party/mmyolo/mmyolo/models/plugins/cbam.py
new file mode 100644
index 0000000..e9559f2
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/models/plugins/cbam.py
@@ -0,0 +1,119 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+
+import torch
+import torch.nn as nn
+from mmcv.cnn import ConvModule
+from mmdet.utils import OptMultiConfig
+from mmengine.model import BaseModule
+
+from mmyolo.registry import MODELS
+
+
+class ChannelAttention(BaseModule):
+    """ChannelAttention.
+
+    Args:
+        channels (int): The input (and output) channels of the
+            ChannelAttention.
+        reduce_ratio (int): Squeeze ratio in ChannelAttention, the intermediate
+            channel will be ``int(channels/ratio)``. Defaults to 16.
+        act_cfg (dict): Config dict for activation layer
+            Defaults to dict(type='ReLU').
+    """
+
+    def __init__(self,
+                 channels: int,
+                 reduce_ratio: int = 16,
+                 act_cfg: dict = dict(type='ReLU')):
+        super().__init__()
+
+        self.avg_pool = nn.AdaptiveAvgPool2d(1)
+        self.max_pool = nn.AdaptiveMaxPool2d(1)
+
+        self.fc = nn.Sequential(
+            ConvModule(
+                in_channels=channels,
+                out_channels=int(channels / reduce_ratio),
+                kernel_size=1,
+                stride=1,
+                conv_cfg=None,
+                act_cfg=act_cfg),
+            ConvModule(
+                in_channels=int(channels / reduce_ratio),
+                out_channels=channels,
+                kernel_size=1,
+                stride=1,
+                conv_cfg=None,
+                act_cfg=None))
+        self.sigmoid = nn.Sigmoid()
+
+    def forward(self, x: torch.Tensor) -> torch.Tensor:
+        """Forward function."""
+        avgpool_out = self.fc(self.avg_pool(x))
+        maxpool_out = self.fc(self.max_pool(x))
+        out = self.sigmoid(avgpool_out + maxpool_out)
+        return out
+
+
+class SpatialAttention(BaseModule):
+    """SpatialAttention
+    Args:
+         kernel_size (int): The size of the convolution kernel in
+            SpatialAttention. Defaults to 7.
+    """
+
+    def __init__(self, kernel_size: int = 7):
+        super().__init__()
+
+        self.conv = ConvModule(
+            in_channels=2,
+            out_channels=1,
+            kernel_size=kernel_size,
+            stride=1,
+            padding=kernel_size // 2,
+            conv_cfg=None,
+            act_cfg=dict(type='Sigmoid'))
+
+    def forward(self, x: torch.Tensor) -> torch.Tensor:
+        """Forward function."""
+        avg_out = torch.mean(x, dim=1, keepdim=True)
+        max_out, _ = torch.max(x, dim=1, keepdim=True)
+        out = torch.cat([avg_out, max_out], dim=1)
+        out = self.conv(out)
+        return out
+
+
+@MODELS.register_module()
+class CBAM(BaseModule):
+    """Convolutional Block Attention Module. arxiv link:
+    https://arxiv.org/abs/1807.06521v2.
+
+    Args:
+        in_channels (int): The input (and output) channels of the CBAM.
+        reduce_ratio (int): Squeeze ratio in ChannelAttention, the intermediate
+            channel will be ``int(channels/ratio)``. Defaults to 16.
+        kernel_size (int): The size of the convolution kernel in
+            SpatialAttention. Defaults to 7.
+        act_cfg (dict): Config dict for activation layer in ChannelAttention
+            Defaults to dict(type='ReLU').
+        init_cfg (dict or list[dict], optional): Initialization config dict.
+            Defaults to None.
+    """
+
+    def __init__(self,
+                 in_channels: int,
+                 reduce_ratio: int = 16,
+                 kernel_size: int = 7,
+                 act_cfg: dict = dict(type='ReLU'),
+                 init_cfg: OptMultiConfig = None):
+        super().__init__(init_cfg)
+        self.channel_attention = ChannelAttention(
+            channels=in_channels, reduce_ratio=reduce_ratio, act_cfg=act_cfg)
+
+        self.spatial_attention = SpatialAttention(kernel_size)
+
+    def forward(self, x: torch.Tensor) -> torch.Tensor:
+        """Forward function."""
+        out = self.channel_attention(x) * x
+        out = self.spatial_attention(out) * out
+        return out
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/models/task_modules/__init__.py b/mmdetection_practice/third_party/mmyolo/mmyolo/models/task_modules/__init__.py
new file mode 100644
index 0000000..7dbdc25
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/models/task_modules/__init__.py
@@ -0,0 +1,8 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from .assigners import BatchATSSAssigner, BatchTaskAlignedAssigner
+from .coders import YOLOv5BBoxCoder, YOLOXBBoxCoder
+
+__all__ = [
+    'YOLOv5BBoxCoder', 'YOLOXBBoxCoder', 'BatchATSSAssigner',
+    'BatchTaskAlignedAssigner'
+]
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/models/task_modules/assigners/__init__.py b/mmdetection_practice/third_party/mmyolo/mmyolo/models/task_modules/assigners/__init__.py
new file mode 100644
index 0000000..7b2e2e6
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/models/task_modules/assigners/__init__.py
@@ -0,0 +1,14 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from .batch_atss_assigner import BatchATSSAssigner
+from .batch_dsl_assigner import BatchDynamicSoftLabelAssigner
+from .batch_task_aligned_assigner import BatchTaskAlignedAssigner
+from .pose_sim_ota_assigner import PoseSimOTAAssigner
+from .utils import (select_candidates_in_gts, select_highest_overlaps,
+                    yolov6_iou_calculator)
+
+__all__ = [
+    'BatchATSSAssigner', 'BatchTaskAlignedAssigner',
+    'select_candidates_in_gts', 'select_highest_overlaps',
+    'yolov6_iou_calculator', 'BatchDynamicSoftLabelAssigner',
+    'PoseSimOTAAssigner'
+]
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/models/task_modules/assigners/batch_atss_assigner.py b/mmdetection_practice/third_party/mmyolo/mmyolo/models/task_modules/assigners/batch_atss_assigner.py
new file mode 100644
index 0000000..45b3069
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/models/task_modules/assigners/batch_atss_assigner.py
@@ -0,0 +1,339 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from typing import List, Tuple
+
+import torch
+import torch.nn as nn
+import torch.nn.functional as F
+from mmdet.utils import ConfigType
+from torch import Tensor
+
+from mmyolo.registry import TASK_UTILS
+from .utils import (select_candidates_in_gts, select_highest_overlaps,
+                    yolov6_iou_calculator)
+
+
+def bbox_center_distance(bboxes: Tensor,
+                         priors: Tensor) -> Tuple[Tensor, Tensor]:
+    """Compute the center distance between bboxes and priors.
+
+    Args:
+        bboxes (Tensor): Shape (n, 4) for bbox, "xyxy" format.
+        priors (Tensor): Shape (num_priors, 4) for priors, "xyxy" format.
+
+    Returns:
+        distances (Tensor): Center distances between bboxes and priors,
+            shape (num_priors, n).
+        priors_points (Tensor): Priors cx cy points,
+            shape (num_priors, 2).
+    """
+    bbox_cx = (bboxes[:, 0] + bboxes[:, 2]) / 2.0
+    bbox_cy = (bboxes[:, 1] + bboxes[:, 3]) / 2.0
+    bbox_points = torch.stack((bbox_cx, bbox_cy), dim=1)
+
+    priors_cx = (priors[:, 0] + priors[:, 2]) / 2.0
+    priors_cy = (priors[:, 1] + priors[:, 3]) / 2.0
+    priors_points = torch.stack((priors_cx, priors_cy), dim=1)
+
+    distances = (bbox_points[:, None, :] -
+                 priors_points[None, :, :]).pow(2).sum(-1).sqrt()
+
+    return distances, priors_points
+
+
+@TASK_UTILS.register_module()
+class BatchATSSAssigner(nn.Module):
+    """Assign a batch of corresponding gt bboxes or background to each prior.
+
+    This code is based on
+    https://github.com/meituan/YOLOv6/blob/main/yolov6/assigners/atss_assigner.py
+
+    Each proposal will be assigned with `0` or a positive integer
+    indicating the ground truth index.
+
+    - 0: negative sample, no assigned gt
+    - positive integer: positive sample, index (1-based) of assigned gt
+
+    Args:
+        num_classes (int): number of class
+        iou_calculator (:obj:`ConfigDict` or dict): Config dict for iou
+            calculator. Defaults to ``dict(type='BboxOverlaps2D')``
+        topk (int): number of priors selected in each level
+    """
+
+    def __init__(
+            self,
+            num_classes: int,
+            iou_calculator: ConfigType = dict(type='mmdet.BboxOverlaps2D'),
+            topk: int = 9):
+        super().__init__()
+        self.num_classes = num_classes
+        self.iou_calculator = TASK_UTILS.build(iou_calculator)
+        self.topk = topk
+
+    @torch.no_grad()
+    def forward(self, pred_bboxes: Tensor, priors: Tensor,
+                num_level_priors: List, gt_labels: Tensor, gt_bboxes: Tensor,
+                pad_bbox_flag: Tensor) -> dict:
+        """Assign gt to priors.
+
+        The assignment is done in following steps
+
+        1. compute iou between all prior (prior of all pyramid levels) and gt
+        2. compute center distance between all prior and gt
+        3. on each pyramid level, for each gt, select k prior whose center
+           are closest to the gt center, so we total select k*l prior as
+           candidates for each gt
+        4. get corresponding iou for the these candidates, and compute the
+           mean and std, set mean + std as the iou threshold
+        5. select these candidates whose iou are greater than or equal to
+           the threshold as positive
+        6. limit the positive sample's center in gt
+
+        Args:
+            pred_bboxes (Tensor): Predicted bounding boxes,
+                shape(batch_size, num_priors, 4)
+            priors (Tensor): Model priors with stride, shape(num_priors, 4)
+            num_level_priors (List): Number of bboxes in each level, len(3)
+            gt_labels (Tensor): Ground truth label,
+                shape(batch_size, num_gt, 1)
+            gt_bboxes (Tensor): Ground truth bbox,
+                shape(batch_size, num_gt, 4)
+            pad_bbox_flag (Tensor): Ground truth bbox mask,
+                1 means bbox, 0 means no bbox,
+                shape(batch_size, num_gt, 1)
+        Returns:
+            assigned_result (dict): Assigned result
+                'assigned_labels' (Tensor): shape(batch_size, num_gt)
+                'assigned_bboxes' (Tensor): shape(batch_size, num_gt, 4)
+                'assigned_scores' (Tensor):
+                    shape(batch_size, num_gt, number_classes)
+                'fg_mask_pre_prior' (Tensor): shape(bs, num_gt)
+        """
+        # generate priors
+        cell_half_size = priors[:, 2:] * 2.5
+        priors_gen = torch.zeros_like(priors)
+        priors_gen[:, :2] = priors[:, :2] - cell_half_size
+        priors_gen[:, 2:] = priors[:, :2] + cell_half_size
+        priors = priors_gen
+
+        batch_size = gt_bboxes.size(0)
+        num_gt, num_priors = gt_bboxes.size(1), priors.size(0)
+
+        assigned_result = {
+            'assigned_labels':
+            gt_bboxes.new_full([batch_size, num_priors], self.num_classes),
+            'assigned_bboxes':
+            gt_bboxes.new_full([batch_size, num_priors, 4], 0),
+            'assigned_scores':
+            gt_bboxes.new_full([batch_size, num_priors, self.num_classes], 0),
+            'fg_mask_pre_prior':
+            gt_bboxes.new_full([batch_size, num_priors], 0)
+        }
+
+        if num_gt == 0:
+            return assigned_result
+
+        # compute iou between all prior (prior of all pyramid levels) and gt
+        overlaps = self.iou_calculator(gt_bboxes.reshape([-1, 4]), priors)
+        overlaps = overlaps.reshape([batch_size, -1, num_priors])
+
+        # compute center distance between all prior and gt
+        distances, priors_points = bbox_center_distance(
+            gt_bboxes.reshape([-1, 4]), priors)
+        distances = distances.reshape([batch_size, -1, num_priors])
+
+        # Selecting candidates based on the center distance
+        is_in_candidate, candidate_idxs = self.select_topk_candidates(
+            distances, num_level_priors, pad_bbox_flag)
+
+        # get corresponding iou for the these candidates, and compute the
+        # mean and std, set mean + std as the iou threshold
+        overlaps_thr_per_gt, iou_candidates = self.threshold_calculator(
+            is_in_candidate, candidate_idxs, overlaps, num_priors, batch_size,
+            num_gt)
+
+        # select candidates iou >= threshold as positive
+        is_pos = torch.where(
+            iou_candidates > overlaps_thr_per_gt.repeat([1, 1, num_priors]),
+            is_in_candidate, torch.zeros_like(is_in_candidate))
+
+        is_in_gts = select_candidates_in_gts(priors_points, gt_bboxes)
+        pos_mask = is_pos * is_in_gts * pad_bbox_flag
+
+        # if an anchor box is assigned to multiple gts,
+        # the one with the highest IoU will be selected.
+        gt_idx_pre_prior, fg_mask_pre_prior, pos_mask = \
+            select_highest_overlaps(pos_mask, overlaps, num_gt)
+
+        # assigned target
+        assigned_labels, assigned_bboxes, assigned_scores = self.get_targets(
+            gt_labels, gt_bboxes, gt_idx_pre_prior, fg_mask_pre_prior,
+            num_priors, batch_size, num_gt)
+
+        # soft label with iou
+        if pred_bboxes is not None:
+            ious = yolov6_iou_calculator(gt_bboxes, pred_bboxes) * pos_mask
+            ious = ious.max(axis=-2)[0].unsqueeze(-1)
+            assigned_scores *= ious
+
+        assigned_result['assigned_labels'] = assigned_labels.long()
+        assigned_result['assigned_bboxes'] = assigned_bboxes
+        assigned_result['assigned_scores'] = assigned_scores
+        assigned_result['fg_mask_pre_prior'] = fg_mask_pre_prior.bool()
+        return assigned_result
+
+    def select_topk_candidates(self, distances: Tensor,
+                               num_level_priors: List[int],
+                               pad_bbox_flag: Tensor) -> Tuple[Tensor, Tensor]:
+        """Selecting candidates based on the center distance.
+
+        Args:
+            distances (Tensor): Distance between all bbox and gt,
+                shape(batch_size, num_gt, num_priors)
+            num_level_priors (List[int]): Number of bboxes in each level,
+                len(3)
+            pad_bbox_flag (Tensor): Ground truth bbox mask,
+                shape(batch_size, num_gt, 1)
+
+        Return:
+            is_in_candidate_list (Tensor): Flag show that each level have
+                topk candidates or not,  shape(batch_size, num_gt, num_priors)
+            candidate_idxs (Tensor): Candidates index,
+                shape(batch_size, num_gt, num_gt)
+        """
+        is_in_candidate_list = []
+        candidate_idxs = []
+        start_idx = 0
+
+        distances_dtype = distances.dtype
+        distances = torch.split(distances, num_level_priors, dim=-1)
+        pad_bbox_flag = pad_bbox_flag.repeat(1, 1, self.topk).bool()
+
+        for distances_per_level, priors_per_level in zip(
+                distances, num_level_priors):
+            # on each pyramid level, for each gt,
+            # select k bbox whose center are closest to the gt center
+            end_index = start_idx + priors_per_level
+            selected_k = min(self.topk, priors_per_level)
+
+            _, topk_idxs_per_level = distances_per_level.topk(
+                selected_k, dim=-1, largest=False)
+            candidate_idxs.append(topk_idxs_per_level + start_idx)
+
+            topk_idxs_per_level = torch.where(
+                pad_bbox_flag, topk_idxs_per_level,
+                torch.zeros_like(topk_idxs_per_level))
+
+            is_in_candidate = F.one_hot(topk_idxs_per_level,
+                                        priors_per_level).sum(dim=-2)
+            is_in_candidate = torch.where(is_in_candidate > 1,
+                                          torch.zeros_like(is_in_candidate),
+                                          is_in_candidate)
+            is_in_candidate_list.append(is_in_candidate.to(distances_dtype))
+
+            start_idx = end_index
+
+        is_in_candidate_list = torch.cat(is_in_candidate_list, dim=-1)
+        candidate_idxs = torch.cat(candidate_idxs, dim=-1)
+
+        return is_in_candidate_list, candidate_idxs
+
+    @staticmethod
+    def threshold_calculator(is_in_candidate: List, candidate_idxs: Tensor,
+                             overlaps: Tensor, num_priors: int,
+                             batch_size: int,
+                             num_gt: int) -> Tuple[Tensor, Tensor]:
+        """Get corresponding iou for the these candidates, and compute the mean
+        and std, set mean + std as the iou threshold.
+
+        Args:
+            is_in_candidate (Tensor): Flag show that each level have
+                topk candidates or not, shape(batch_size, num_gt, num_priors).
+            candidate_idxs (Tensor): Candidates index,
+                shape(batch_size, num_gt, num_gt)
+            overlaps (Tensor): Overlaps area,
+                shape(batch_size, num_gt, num_priors).
+            num_priors (int): Number of priors.
+            batch_size (int): Batch size.
+            num_gt (int): Number of ground truth.
+
+        Return:
+            overlaps_thr_per_gt (Tensor): Overlap threshold of
+                per ground truth, shape(batch_size, num_gt, 1).
+            candidate_overlaps (Tensor): Candidate overlaps,
+                shape(batch_size, num_gt, num_priors).
+        """
+
+        batch_size_num_gt = batch_size * num_gt
+        candidate_overlaps = torch.where(is_in_candidate > 0, overlaps,
+                                         torch.zeros_like(overlaps))
+        candidate_idxs = candidate_idxs.reshape([batch_size_num_gt, -1])
+
+        assist_indexes = num_priors * torch.arange(
+            batch_size_num_gt, device=candidate_idxs.device)
+        assist_indexes = assist_indexes[:, None]
+        flatten_indexes = candidate_idxs + assist_indexes
+
+        candidate_overlaps_reshape = candidate_overlaps.reshape(
+            -1)[flatten_indexes]
+        candidate_overlaps_reshape = candidate_overlaps_reshape.reshape(
+            [batch_size, num_gt, -1])
+
+        overlaps_mean_per_gt = candidate_overlaps_reshape.mean(
+            axis=-1, keepdim=True)
+        overlaps_std_per_gt = candidate_overlaps_reshape.std(
+            axis=-1, keepdim=True)
+        overlaps_thr_per_gt = overlaps_mean_per_gt + overlaps_std_per_gt
+
+        return overlaps_thr_per_gt, candidate_overlaps
+
+    def get_targets(self, gt_labels: Tensor, gt_bboxes: Tensor,
+                    assigned_gt_inds: Tensor, fg_mask_pre_prior: Tensor,
+                    num_priors: int, batch_size: int,
+                    num_gt: int) -> Tuple[Tensor, Tensor, Tensor]:
+        """Get target info.
+
+        Args:
+            gt_labels (Tensor): Ground true labels,
+                shape(batch_size, num_gt, 1)
+            gt_bboxes (Tensor): Ground true bboxes,
+                shape(batch_size, num_gt, 4)
+            assigned_gt_inds (Tensor): Assigned ground truth indexes,
+                shape(batch_size, num_priors)
+            fg_mask_pre_prior (Tensor): Force ground truth matching mask,
+                shape(batch_size, num_priors)
+            num_priors (int): Number of priors.
+            batch_size (int): Batch size.
+            num_gt (int): Number of ground truth.
+
+        Return:
+            assigned_labels (Tensor): Assigned labels,
+                shape(batch_size, num_priors)
+            assigned_bboxes (Tensor): Assigned bboxes,
+                shape(batch_size, num_priors)
+            assigned_scores (Tensor): Assigned scores,
+                shape(batch_size, num_priors)
+        """
+
+        # assigned target labels
+        batch_index = torch.arange(
+            batch_size, dtype=gt_labels.dtype, device=gt_labels.device)
+        batch_index = batch_index[..., None]
+        assigned_gt_inds = (assigned_gt_inds + batch_index * num_gt).long()
+        assigned_labels = gt_labels.flatten()[assigned_gt_inds.flatten()]
+        assigned_labels = assigned_labels.reshape([batch_size, num_priors])
+        assigned_labels = torch.where(
+            fg_mask_pre_prior > 0, assigned_labels,
+            torch.full_like(assigned_labels, self.num_classes))
+
+        # assigned target boxes
+        assigned_bboxes = gt_bboxes.reshape([-1,
+                                             4])[assigned_gt_inds.flatten()]
+        assigned_bboxes = assigned_bboxes.reshape([batch_size, num_priors, 4])
+
+        # assigned target scores
+        assigned_scores = F.one_hot(assigned_labels.long(),
+                                    self.num_classes + 1).float()
+        assigned_scores = assigned_scores[:, :, :self.num_classes]
+
+        return assigned_labels, assigned_bboxes, assigned_scores
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/models/task_modules/assigners/batch_dsl_assigner.py b/mmdetection_practice/third_party/mmyolo/mmyolo/models/task_modules/assigners/batch_dsl_assigner.py
new file mode 100644
index 0000000..5ae0f80
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/models/task_modules/assigners/batch_dsl_assigner.py
@@ -0,0 +1,272 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from typing import Tuple
+
+import torch
+import torch.nn as nn
+import torch.nn.functional as F
+from mmdet.structures.bbox import BaseBoxes
+from mmdet.utils import ConfigType
+from torch import Tensor
+
+from mmyolo.registry import TASK_UTILS
+
+INF = 100000000
+EPS = 1.0e-7
+
+
+def find_inside_points(boxes: Tensor,
+                       points: Tensor,
+                       box_dim: int = 4,
+                       eps: float = 0.01) -> Tensor:
+    """Find inside box points in batches. Boxes dimension must be 3.
+
+    Args:
+        boxes (Tensor): Boxes tensor. Must be batch input.
+            Has shape of (batch_size, n_boxes, box_dim).
+        points (Tensor): Points coordinates. Has shape of (n_points, 2).
+        box_dim (int): The dimension of box. 4 means horizontal box and
+            5 means rotated box. Defaults to 4.
+        eps (float): Make sure the points are inside not on the boundary.
+            Only use in rotated boxes. Defaults to 0.01.
+
+    Returns:
+        Tensor: A BoolTensor indicating whether a point is inside
+        boxes. The index has shape of (n_points, batch_size, n_boxes).
+    """
+    if box_dim == 4:
+        # Horizontal Boxes
+        lt_ = points[:, None, None] - boxes[..., :2]
+        rb_ = boxes[..., 2:] - points[:, None, None]
+
+        deltas = torch.cat([lt_, rb_], dim=-1)
+        is_in_gts = deltas.min(dim=-1).values > 0
+
+    elif box_dim == 5:
+        # Rotated Boxes
+        points = points[:, None, None]
+        ctrs, wh, t = torch.split(boxes, [2, 2, 1], dim=-1)
+        cos_value, sin_value = torch.cos(t), torch.sin(t)
+        matrix = torch.cat([cos_value, sin_value, -sin_value, cos_value],
+                           dim=-1).reshape(*boxes.shape[:-1], 2, 2)
+
+        offset = points - ctrs
+        offset = torch.matmul(matrix, offset[..., None])
+        offset = offset.squeeze(-1)
+        offset_x, offset_y = offset[..., 0], offset[..., 1]
+        w, h = wh[..., 0], wh[..., 1]
+        is_in_gts = (offset_x <= w / 2 - eps) & (offset_x >= - w / 2 + eps) & \
+                    (offset_y <= h / 2 - eps) & (offset_y >= - h / 2 + eps)
+    else:
+        raise NotImplementedError(f'Unsupport box_dim:{box_dim}')
+
+    return is_in_gts
+
+
+def get_box_center(boxes: Tensor, box_dim: int = 4) -> Tensor:
+    """Return a tensor representing the centers of boxes.
+
+    Args:
+        boxes (Tensor): Boxes tensor. Has shape of (b, n, box_dim)
+        box_dim (int): The dimension of box. 4 means horizontal box and
+            5 means rotated box. Defaults to 4.
+
+    Returns:
+        Tensor: Centers have shape of (b, n, 2)
+    """
+    if box_dim == 4:
+        # Horizontal Boxes, (x1, y1, x2, y2)
+        return (boxes[..., :2] + boxes[..., 2:]) / 2.0
+    elif box_dim == 5:
+        # Rotated Boxes, (x, y, w, h, a)
+        return boxes[..., :2]
+    else:
+        raise NotImplementedError(f'Unsupported box_dim:{box_dim}')
+
+
+@TASK_UTILS.register_module()
+class BatchDynamicSoftLabelAssigner(nn.Module):
+    """Computes matching between predictions and ground truth with dynamic soft
+    label assignment.
+
+    Args:
+        num_classes (int): number of class
+        soft_center_radius (float): Radius of the soft center prior.
+            Defaults to 3.0.
+        topk (int): Select top-k predictions to calculate dynamic k
+            best matches for each gt. Defaults to 13.
+        iou_weight (float): The scale factor of iou cost. Defaults to 3.0.
+        iou_calculator (ConfigType): Config of overlaps Calculator.
+            Defaults to dict(type='BboxOverlaps2D').
+        batch_iou (bool): Use batch input when calculate IoU.
+            If set to False use loop instead. Defaults to True.
+    """
+
+    def __init__(
+        self,
+        num_classes,
+        soft_center_radius: float = 3.0,
+        topk: int = 13,
+        iou_weight: float = 3.0,
+        iou_calculator: ConfigType = dict(type='mmdet.BboxOverlaps2D'),
+        batch_iou: bool = True,
+    ) -> None:
+        super().__init__()
+        self.num_classes = num_classes
+        self.soft_center_radius = soft_center_radius
+        self.topk = topk
+        self.iou_weight = iou_weight
+        self.iou_calculator = TASK_UTILS.build(iou_calculator)
+        self.batch_iou = batch_iou
+
+    @torch.no_grad()
+    def forward(self, pred_bboxes: Tensor, pred_scores: Tensor, priors: Tensor,
+                gt_labels: Tensor, gt_bboxes: Tensor,
+                pad_bbox_flag: Tensor) -> dict:
+        num_gt = gt_bboxes.size(1)
+        decoded_bboxes = pred_bboxes
+        batch_size, num_bboxes, box_dim = decoded_bboxes.size()
+
+        if num_gt == 0 or num_bboxes == 0:
+            return {
+                'assigned_labels':
+                gt_labels.new_full(
+                    pred_scores[..., 0].shape,
+                    self.num_classes,
+                    dtype=torch.long),
+                'assigned_labels_weights':
+                gt_bboxes.new_full(pred_scores[..., 0].shape, 1),
+                'assigned_bboxes':
+                gt_bboxes.new_full(pred_bboxes.shape, 0),
+                'assign_metrics':
+                gt_bboxes.new_full(pred_scores[..., 0].shape, 0)
+            }
+
+        prior_center = priors[:, :2]
+        if isinstance(gt_bboxes, BaseBoxes):
+            raise NotImplementedError(
+                f'type of {type(gt_bboxes)} are not implemented !')
+        else:
+            is_in_gts = find_inside_points(gt_bboxes, prior_center, box_dim)
+
+        # (N_points, B, N_boxes)
+        is_in_gts = is_in_gts * pad_bbox_flag[..., 0][None]
+        # (N_points, B, N_boxes) -> (B, N_points, N_boxes)
+        is_in_gts = is_in_gts.permute(1, 0, 2)
+        # (B, N_points)
+        valid_mask = is_in_gts.sum(dim=-1) > 0
+
+        gt_center = get_box_center(gt_bboxes, box_dim)
+
+        strides = priors[..., 2]
+        distance = (priors[None].unsqueeze(2)[..., :2] -
+                    gt_center[:, None, :, :]
+                    ).pow(2).sum(-1).sqrt() / strides[None, :, None]
+
+        # prevent overflow
+        distance = distance * valid_mask.unsqueeze(-1)
+        soft_center_prior = torch.pow(10, distance - self.soft_center_radius)
+
+        if self.batch_iou:
+            pairwise_ious = self.iou_calculator(decoded_bboxes, gt_bboxes)
+        else:
+            ious = []
+            for box, gt in zip(decoded_bboxes, gt_bboxes):
+                iou = self.iou_calculator(box, gt)
+                ious.append(iou)
+            pairwise_ious = torch.stack(ious, dim=0)
+
+        iou_cost = -torch.log(pairwise_ious + EPS) * self.iou_weight
+
+        # select the predicted scores corresponded to the gt_labels
+        pairwise_pred_scores = pred_scores.permute(0, 2, 1)
+        idx = torch.zeros([2, batch_size, num_gt], dtype=torch.long)
+        idx[0] = torch.arange(end=batch_size).view(-1, 1).repeat(1, num_gt)
+        idx[1] = gt_labels.long().squeeze(-1)
+        pairwise_pred_scores = pairwise_pred_scores[idx[0],
+                                                    idx[1]].permute(0, 2, 1)
+        # classification cost
+        scale_factor = pairwise_ious - pairwise_pred_scores.sigmoid()
+        pairwise_cls_cost = F.binary_cross_entropy_with_logits(
+            pairwise_pred_scores, pairwise_ious,
+            reduction='none') * scale_factor.abs().pow(2.0)
+
+        cost_matrix = pairwise_cls_cost + iou_cost + soft_center_prior
+
+        max_pad_value = torch.ones_like(cost_matrix) * INF
+        cost_matrix = torch.where(valid_mask[..., None].repeat(1, 1, num_gt),
+                                  cost_matrix, max_pad_value)
+
+        (matched_pred_ious, matched_gt_inds,
+         fg_mask_inboxes) = self.dynamic_k_matching(cost_matrix, pairwise_ious,
+                                                    pad_bbox_flag)
+
+        del pairwise_ious, cost_matrix
+
+        batch_index = (fg_mask_inboxes > 0).nonzero(as_tuple=True)[0]
+
+        assigned_labels = gt_labels.new_full(pred_scores[..., 0].shape,
+                                             self.num_classes)
+        assigned_labels[fg_mask_inboxes] = gt_labels[
+            batch_index, matched_gt_inds].squeeze(-1)
+        assigned_labels = assigned_labels.long()
+
+        assigned_labels_weights = gt_bboxes.new_full(pred_scores[..., 0].shape,
+                                                     1)
+
+        assigned_bboxes = gt_bboxes.new_full(pred_bboxes.shape, 0)
+        assigned_bboxes[fg_mask_inboxes] = gt_bboxes[batch_index,
+                                                     matched_gt_inds]
+
+        assign_metrics = gt_bboxes.new_full(pred_scores[..., 0].shape, 0)
+        assign_metrics[fg_mask_inboxes] = matched_pred_ious
+
+        return dict(
+            assigned_labels=assigned_labels,
+            assigned_labels_weights=assigned_labels_weights,
+            assigned_bboxes=assigned_bboxes,
+            assign_metrics=assign_metrics)
+
+    def dynamic_k_matching(
+            self, cost_matrix: Tensor, pairwise_ious: Tensor,
+            pad_bbox_flag: int) -> Tuple[Tensor, Tensor, Tensor]:
+        """Use IoU and matching cost to calculate the dynamic top-k positive
+        targets.
+
+        Args:
+            cost_matrix (Tensor): Cost matrix.
+            pairwise_ious (Tensor): Pairwise iou matrix.
+            num_gt (int): Number of gt.
+            valid_mask (Tensor): Mask for valid bboxes.
+        Returns:
+            tuple: matched ious and gt indexes.
+        """
+        matching_matrix = torch.zeros_like(cost_matrix, dtype=torch.uint8)
+        # select candidate topk ious for dynamic-k calculation
+        candidate_topk = min(self.topk, pairwise_ious.size(1))
+        topk_ious, _ = torch.topk(pairwise_ious, candidate_topk, dim=1)
+        # calculate dynamic k for each gt
+        dynamic_ks = torch.clamp(topk_ious.sum(1).int(), min=1)
+
+        num_gts = pad_bbox_flag.sum((1, 2)).int()
+        # sorting the batch cost matirx is faster than topk
+        _, sorted_indices = torch.sort(cost_matrix, dim=1)
+        for b in range(pad_bbox_flag.shape[0]):
+            for gt_idx in range(num_gts[b]):
+                topk_ids = sorted_indices[b, :dynamic_ks[b, gt_idx], gt_idx]
+                matching_matrix[b, :, gt_idx][topk_ids] = 1
+
+        del topk_ious, dynamic_ks
+
+        prior_match_gt_mask = matching_matrix.sum(2) > 1
+        if prior_match_gt_mask.sum() > 0:
+            cost_min, cost_argmin = torch.min(
+                cost_matrix[prior_match_gt_mask, :], dim=1)
+            matching_matrix[prior_match_gt_mask, :] *= 0
+            matching_matrix[prior_match_gt_mask, cost_argmin] = 1
+
+        # get foreground mask inside box and center prior
+        fg_mask_inboxes = matching_matrix.sum(2) > 0
+        matched_pred_ious = (matching_matrix *
+                             pairwise_ious).sum(2)[fg_mask_inboxes]
+        matched_gt_inds = matching_matrix[fg_mask_inboxes, :].argmax(1)
+        return matched_pred_ious, matched_gt_inds, fg_mask_inboxes
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/models/task_modules/assigners/batch_task_aligned_assigner.py b/mmdetection_practice/third_party/mmyolo/mmyolo/models/task_modules/assigners/batch_task_aligned_assigner.py
new file mode 100644
index 0000000..202d678
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/models/task_modules/assigners/batch_task_aligned_assigner.py
@@ -0,0 +1,311 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from typing import Optional, Tuple
+
+import torch
+import torch.nn as nn
+import torch.nn.functional as F
+from torch import Tensor
+
+from mmyolo.models.losses import bbox_overlaps
+from mmyolo.registry import TASK_UTILS
+from .utils import (select_candidates_in_gts, select_highest_overlaps,
+                    yolov6_iou_calculator)
+
+
+@TASK_UTILS.register_module()
+class BatchTaskAlignedAssigner(nn.Module):
+    """This code referenced to
+    https://github.com/meituan/YOLOv6/blob/main/yolov6/
+    assigners/tal_assigner.py.
+    Batch Task aligned assigner base on the paper:
+    `TOOD: Task-aligned One-stage Object Detection.
+    <https://arxiv.org/abs/2108.07755>`_.
+    Assign a corresponding gt bboxes or background to a batch of
+    predicted bboxes. Each bbox will be assigned with `0` or a
+    positive integer indicating the ground truth index.
+    - 0: negative sample, no assigned gt
+    - positive integer: positive sample, index (1-based) of assigned gt
+    Args:
+        num_classes (int): number of class
+        topk (int): number of bbox selected in each level
+        alpha (float): Hyper-parameters related to alignment_metrics.
+            Defaults to 1.0
+        beta (float): Hyper-parameters related to alignment_metrics.
+            Defaults to 6.
+        eps (float): Eps to avoid log(0). Default set to 1e-9
+        use_ciou (bool): Whether to use ciou while calculating iou.
+            Defaults to False.
+    """
+
+    def __init__(self,
+                 num_classes: int,
+                 topk: int = 13,
+                 alpha: float = 1.0,
+                 beta: float = 6.0,
+                 eps: float = 1e-7,
+                 use_ciou: bool = False):
+        super().__init__()
+        self.num_classes = num_classes
+        self.topk = topk
+        self.alpha = alpha
+        self.beta = beta
+        self.eps = eps
+        self.use_ciou = use_ciou
+
+    @torch.no_grad()
+    def forward(
+        self,
+        pred_bboxes: Tensor,
+        pred_scores: Tensor,
+        priors: Tensor,
+        gt_labels: Tensor,
+        gt_bboxes: Tensor,
+        pad_bbox_flag: Tensor,
+    ) -> dict:
+        """Assign gt to bboxes.
+
+        The assignment is done in following steps
+        1. compute alignment metric between all bbox (bbox of all pyramid
+           levels) and gt
+        2. select top-k bbox as candidates for each gt
+        3. limit the positive sample's center in gt (because the anchor-free
+           detector only can predict positive distance)
+        Args:
+            pred_bboxes (Tensor): Predict bboxes,
+                shape(batch_size, num_priors, 4)
+            pred_scores (Tensor): Scores of predict bboxes,
+                shape(batch_size, num_priors, num_classes)
+            priors (Tensor): Model priors,  shape (num_priors, 4)
+            gt_labels (Tensor): Ground true labels,
+                shape(batch_size, num_gt, 1)
+            gt_bboxes (Tensor): Ground true bboxes,
+                shape(batch_size, num_gt, 4)
+            pad_bbox_flag (Tensor): Ground truth bbox mask,
+                1 means bbox, 0 means no bbox,
+                shape(batch_size, num_gt, 1)
+        Returns:
+            assigned_result (dict) Assigned result:
+                assigned_labels (Tensor): Assigned labels,
+                    shape(batch_size, num_priors)
+                assigned_bboxes (Tensor): Assigned boxes,
+                    shape(batch_size, num_priors, 4)
+                assigned_scores (Tensor): Assigned scores,
+                    shape(batch_size, num_priors, num_classes)
+                fg_mask_pre_prior (Tensor): Force ground truth matching mask,
+                    shape(batch_size, num_priors)
+        """
+        # (num_priors, 4) -> (num_priors, 2)
+        priors = priors[:, :2]
+
+        batch_size = pred_scores.size(0)
+        num_gt = gt_bboxes.size(1)
+
+        assigned_result = {
+            'assigned_labels':
+            gt_bboxes.new_full(pred_scores[..., 0].shape, self.num_classes),
+            'assigned_bboxes':
+            gt_bboxes.new_full(pred_bboxes.shape, 0),
+            'assigned_scores':
+            gt_bboxes.new_full(pred_scores.shape, 0),
+            'fg_mask_pre_prior':
+            gt_bboxes.new_full(pred_scores[..., 0].shape, 0)
+        }
+
+        if num_gt == 0:
+            return assigned_result
+
+        pos_mask, alignment_metrics, overlaps = self.get_pos_mask(
+            pred_bboxes, pred_scores, priors, gt_labels, gt_bboxes,
+            pad_bbox_flag, batch_size, num_gt)
+
+        (assigned_gt_idxs, fg_mask_pre_prior,
+         pos_mask) = select_highest_overlaps(pos_mask, overlaps, num_gt)
+
+        # assigned target
+        assigned_labels, assigned_bboxes, assigned_scores = self.get_targets(
+            gt_labels, gt_bboxes, assigned_gt_idxs, fg_mask_pre_prior,
+            batch_size, num_gt)
+
+        # normalize
+        alignment_metrics *= pos_mask
+        pos_align_metrics = alignment_metrics.max(axis=-1, keepdim=True)[0]
+        pos_overlaps = (overlaps * pos_mask).max(axis=-1, keepdim=True)[0]
+        norm_align_metric = (
+            alignment_metrics * pos_overlaps /
+            (pos_align_metrics + self.eps)).max(-2)[0].unsqueeze(-1)
+        assigned_scores = assigned_scores * norm_align_metric
+
+        assigned_result['assigned_labels'] = assigned_labels
+        assigned_result['assigned_bboxes'] = assigned_bboxes
+        assigned_result['assigned_scores'] = assigned_scores
+        assigned_result['fg_mask_pre_prior'] = fg_mask_pre_prior.bool()
+        return assigned_result
+
+    def get_pos_mask(self, pred_bboxes: Tensor, pred_scores: Tensor,
+                     priors: Tensor, gt_labels: Tensor, gt_bboxes: Tensor,
+                     pad_bbox_flag: Tensor, batch_size: int,
+                     num_gt: int) -> Tuple[Tensor, Tensor, Tensor]:
+        """Get possible mask.
+
+        Args:
+            pred_bboxes (Tensor): Predict bboxes,
+                shape(batch_size, num_priors, 4)
+            pred_scores (Tensor): Scores of predict bbox,
+                shape(batch_size, num_priors, num_classes)
+            priors (Tensor): Model priors, shape (num_priors, 2)
+            gt_labels (Tensor): Ground true labels,
+                shape(batch_size, num_gt, 1)
+            gt_bboxes (Tensor): Ground true bboxes,
+                shape(batch_size, num_gt, 4)
+            pad_bbox_flag (Tensor): Ground truth bbox mask,
+                1 means bbox, 0 means no bbox,
+                shape(batch_size, num_gt, 1)
+            batch_size (int): Batch size.
+            num_gt (int): Number of ground truth.
+        Returns:
+            pos_mask (Tensor): Possible mask,
+                shape(batch_size, num_gt, num_priors)
+            alignment_metrics (Tensor): Alignment metrics,
+                shape(batch_size, num_gt, num_priors)
+            overlaps (Tensor): Overlaps of gt_bboxes and pred_bboxes,
+                shape(batch_size, num_gt, num_priors)
+        """
+
+        # Compute alignment metric between all bbox and gt
+        alignment_metrics, overlaps = \
+            self.get_box_metrics(pred_bboxes, pred_scores, gt_labels,
+                                 gt_bboxes, batch_size, num_gt)
+
+        # get is_in_gts mask
+        is_in_gts = select_candidates_in_gts(priors, gt_bboxes)
+
+        # get topk_metric mask
+        topk_metric = self.select_topk_candidates(
+            alignment_metrics * is_in_gts,
+            topk_mask=pad_bbox_flag.repeat([1, 1, self.topk]).bool())
+
+        # merge all mask to a final mask
+        pos_mask = topk_metric * is_in_gts * pad_bbox_flag
+
+        return pos_mask, alignment_metrics, overlaps
+
+    def get_box_metrics(self, pred_bboxes: Tensor, pred_scores: Tensor,
+                        gt_labels: Tensor, gt_bboxes: Tensor, batch_size: int,
+                        num_gt: int) -> Tuple[Tensor, Tensor]:
+        """Compute alignment metric between all bbox and gt.
+
+        Args:
+            pred_bboxes (Tensor): Predict bboxes,
+                shape(batch_size, num_priors, 4)
+            pred_scores (Tensor): Scores of predict bbox,
+                shape(batch_size, num_priors, num_classes)
+            gt_labels (Tensor): Ground true labels,
+                shape(batch_size, num_gt, 1)
+            gt_bboxes (Tensor): Ground true bboxes,
+                shape(batch_size, num_gt, 4)
+            batch_size (int): Batch size.
+            num_gt (int): Number of ground truth.
+        Returns:
+            alignment_metrics (Tensor): Align metric,
+                shape(batch_size, num_gt, num_priors)
+            overlaps (Tensor): Overlaps, shape(batch_size, num_gt, num_priors)
+        """
+        pred_scores = pred_scores.permute(0, 2, 1)
+        gt_labels = gt_labels.to(torch.long)
+        idx = torch.zeros([2, batch_size, num_gt], dtype=torch.long)
+        idx[0] = torch.arange(end=batch_size).view(-1, 1).repeat(1, num_gt)
+        idx[1] = gt_labels.squeeze(-1)
+        bbox_scores = pred_scores[idx[0], idx[1]]
+        # TODO: need to replace the yolov6_iou_calculator function
+        if self.use_ciou:
+            overlaps = bbox_overlaps(
+                pred_bboxes.unsqueeze(1),
+                gt_bboxes.unsqueeze(2),
+                iou_mode='ciou',
+                bbox_format='xyxy').clamp(0)
+        else:
+            overlaps = yolov6_iou_calculator(gt_bboxes, pred_bboxes)
+
+        alignment_metrics = bbox_scores.pow(self.alpha) * overlaps.pow(
+            self.beta)
+
+        return alignment_metrics, overlaps
+
+    def select_topk_candidates(self,
+                               alignment_gt_metrics: Tensor,
+                               using_largest_topk: bool = True,
+                               topk_mask: Optional[Tensor] = None) -> Tensor:
+        """Compute alignment metric between all bbox and gt.
+
+        Args:
+            alignment_gt_metrics (Tensor): Alignment metric of gt candidates,
+                shape(batch_size, num_gt, num_priors)
+            using_largest_topk (bool): Controls whether to using largest or
+                smallest elements.
+            topk_mask (Tensor): Topk mask,
+                shape(batch_size, num_gt, self.topk)
+        Returns:
+            Tensor: Topk candidates mask,
+                shape(batch_size, num_gt, num_priors)
+        """
+        num_priors = alignment_gt_metrics.shape[-1]
+        topk_metrics, topk_idxs = torch.topk(
+            alignment_gt_metrics,
+            self.topk,
+            axis=-1,
+            largest=using_largest_topk)
+        if topk_mask is None:
+            topk_mask = (topk_metrics.max(axis=-1, keepdim=True) >
+                         self.eps).tile([1, 1, self.topk])
+        topk_idxs = torch.where(topk_mask, topk_idxs,
+                                torch.zeros_like(topk_idxs))
+        is_in_topk = F.one_hot(topk_idxs, num_priors).sum(axis=-2)
+        is_in_topk = torch.where(is_in_topk > 1, torch.zeros_like(is_in_topk),
+                                 is_in_topk)
+        return is_in_topk.to(alignment_gt_metrics.dtype)
+
+    def get_targets(self, gt_labels: Tensor, gt_bboxes: Tensor,
+                    assigned_gt_idxs: Tensor, fg_mask_pre_prior: Tensor,
+                    batch_size: int,
+                    num_gt: int) -> Tuple[Tensor, Tensor, Tensor]:
+        """Get assigner info.
+
+        Args:
+            gt_labels (Tensor): Ground true labels,
+                shape(batch_size, num_gt, 1)
+            gt_bboxes (Tensor): Ground true bboxes,
+                shape(batch_size, num_gt, 4)
+            assigned_gt_idxs (Tensor): Assigned ground truth indexes,
+                shape(batch_size, num_priors)
+            fg_mask_pre_prior (Tensor): Force ground truth matching mask,
+                shape(batch_size, num_priors)
+            batch_size (int): Batch size.
+            num_gt (int): Number of ground truth.
+        Returns:
+            assigned_labels (Tensor): Assigned labels,
+                shape(batch_size, num_priors)
+            assigned_bboxes (Tensor): Assigned bboxes,
+                shape(batch_size, num_priors)
+            assigned_scores (Tensor): Assigned scores,
+                shape(batch_size, num_priors)
+        """
+        # assigned target labels
+        batch_ind = torch.arange(
+            end=batch_size, dtype=torch.int64, device=gt_labels.device)[...,
+                                                                        None]
+        assigned_gt_idxs = assigned_gt_idxs + batch_ind * num_gt
+        assigned_labels = gt_labels.long().flatten()[assigned_gt_idxs]
+
+        # assigned target boxes
+        assigned_bboxes = gt_bboxes.reshape([-1, 4])[assigned_gt_idxs]
+
+        # assigned target scores
+        assigned_labels[assigned_labels < 0] = 0
+        assigned_scores = F.one_hot(assigned_labels, self.num_classes)
+        force_gt_scores_mask = fg_mask_pre_prior[:, :, None].repeat(
+            1, 1, self.num_classes)
+        assigned_scores = torch.where(force_gt_scores_mask > 0,
+                                      assigned_scores,
+                                      torch.full_like(assigned_scores, 0))
+
+        return assigned_labels, assigned_bboxes, assigned_scores
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/models/task_modules/assigners/batch_yolov7_assigner.py b/mmdetection_practice/third_party/mmyolo/mmyolo/models/task_modules/assigners/batch_yolov7_assigner.py
new file mode 100644
index 0000000..6709968
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/models/task_modules/assigners/batch_yolov7_assigner.py
@@ -0,0 +1,344 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from typing import Sequence
+
+import torch
+import torch.nn as nn
+import torch.nn.functional as F
+from mmdet.structures.bbox import bbox_cxcywh_to_xyxy, bbox_overlaps
+
+
+def _cat_multi_level_tensor_in_place(*multi_level_tensor, place_hold_var):
+    """concat multi-level tensor in place."""
+    for level_tensor in multi_level_tensor:
+        for i, var in enumerate(level_tensor):
+            if len(var) > 0:
+                level_tensor[i] = torch.cat(var, dim=0)
+            else:
+                level_tensor[i] = place_hold_var
+
+
+class BatchYOLOv7Assigner(nn.Module):
+    """Batch YOLOv7 Assigner.
+
+    It consists of two assigning steps:
+
+        1. YOLOv5 cross-grid sample assigning
+        2. SimOTA assigning
+
+    This code referenced to
+    https://github.com/WongKinYiu/yolov7/blob/main/utils/loss.py.
+
+    Args:
+        num_classes (int): Number of classes.
+        num_base_priors (int): Number of base priors.
+        featmap_strides (Sequence[int]): Feature map strides.
+        prior_match_thr (float): Threshold to match priors.
+            Defaults to 4.0.
+        candidate_topk (int): Number of topk candidates to
+            assign. Defaults to 10.
+        iou_weight (float): IOU weight. Defaults to 3.0.
+        cls_weight (float): Class weight. Defaults to 1.0.
+    """
+
+    def __init__(self,
+                 num_classes: int,
+                 num_base_priors: int,
+                 featmap_strides: Sequence[int],
+                 prior_match_thr: float = 4.0,
+                 candidate_topk: int = 10,
+                 iou_weight: float = 3.0,
+                 cls_weight: float = 1.0):
+        super().__init__()
+        self.num_classes = num_classes
+        self.num_base_priors = num_base_priors
+        self.featmap_strides = featmap_strides
+        # yolov5 param
+        self.prior_match_thr = prior_match_thr
+        # simota param
+        self.candidate_topk = candidate_topk
+        self.iou_weight = iou_weight
+        self.cls_weight = cls_weight
+
+    @torch.no_grad()
+    def forward(self,
+                pred_results,
+                batch_targets_normed,
+                batch_input_shape,
+                priors_base_sizes,
+                grid_offset,
+                near_neighbor_thr=0.5) -> dict:
+        """Forward function."""
+        # (num_base_priors, num_batch_gt, 7)
+        # 7 is mean (batch_idx, cls_id, x_norm, y_norm,
+        # w_norm, h_norm, prior_idx)
+
+        # mlvl is mean multi_level
+        if batch_targets_normed.shape[1] == 0:
+            # empty gt of batch
+            num_levels = len(pred_results)
+            return dict(
+                mlvl_positive_infos=[pred_results[0].new_empty(
+                    (0, 4))] * num_levels,
+                mlvl_priors=[] * num_levels,
+                mlvl_targets_normed=[] * num_levels)
+
+        # if near_neighbor_thr = 0.5 are mean the nearest
+        # 3 neighbors are also considered positive samples.
+        # if near_neighbor_thr = 1.0 are mean the nearest
+        # 5 neighbors are also considered positive samples.
+        mlvl_positive_infos, mlvl_priors = self.yolov5_assigner(
+            pred_results,
+            batch_targets_normed,
+            priors_base_sizes,
+            grid_offset,
+            near_neighbor_thr=near_neighbor_thr)
+
+        mlvl_positive_infos, mlvl_priors, \
+            mlvl_targets_normed = self.simota_assigner(
+                pred_results, batch_targets_normed, mlvl_positive_infos,
+                mlvl_priors, batch_input_shape)
+
+        place_hold_var = batch_targets_normed.new_empty((0, 4))
+        _cat_multi_level_tensor_in_place(
+            mlvl_positive_infos,
+            mlvl_priors,
+            mlvl_targets_normed,
+            place_hold_var=place_hold_var)
+
+        return dict(
+            mlvl_positive_infos=mlvl_positive_infos,
+            mlvl_priors=mlvl_priors,
+            mlvl_targets_normed=mlvl_targets_normed)
+
+    def yolov5_assigner(self,
+                        pred_results,
+                        batch_targets_normed,
+                        priors_base_sizes,
+                        grid_offset,
+                        near_neighbor_thr=0.5):
+        """YOLOv5 cross-grid sample assigner."""
+        num_batch_gts = batch_targets_normed.shape[1]
+        assert num_batch_gts > 0
+
+        mlvl_positive_infos, mlvl_priors = [], []
+
+        scaled_factor = torch.ones(7, device=pred_results[0].device)
+        for i in range(len(pred_results)):  # lever
+            priors_base_sizes_i = priors_base_sizes[i]
+            # (1, 1, feat_shape_w, feat_shape_h, feat_shape_w, feat_shape_h)
+            scaled_factor[2:6] = torch.tensor(
+                pred_results[i].shape)[[3, 2, 3, 2]]
+
+            # Scale batch_targets from range 0-1 to range 0-features_maps size.
+            # (num_base_priors, num_batch_gts, 7)
+            batch_targets_scaled = batch_targets_normed * scaled_factor
+
+            # Shape match
+            wh_ratio = batch_targets_scaled[...,
+                                            4:6] / priors_base_sizes_i[:, None]
+            match_inds = torch.max(
+                wh_ratio, 1. / wh_ratio).max(2)[0] < self.prior_match_thr
+            batch_targets_scaled = batch_targets_scaled[
+                match_inds]  # (num_matched_target, 7)
+
+            # no gt bbox matches anchor
+            if batch_targets_scaled.shape[0] == 0:
+                mlvl_positive_infos.append(
+                    batch_targets_scaled.new_empty((0, 4)))
+                mlvl_priors.append([])
+                continue
+
+            # Positive samples with additional neighbors
+            batch_targets_cxcy = batch_targets_scaled[:, 2:4]
+            grid_xy = scaled_factor[[2, 3]] - batch_targets_cxcy
+            left, up = ((batch_targets_cxcy % 1 < near_neighbor_thr) &
+                        (batch_targets_cxcy > 1)).T
+            right, bottom = ((grid_xy % 1 < near_neighbor_thr) &
+                             (grid_xy > 1)).T
+            offset_inds = torch.stack(
+                (torch.ones_like(left), left, up, right, bottom))
+            batch_targets_scaled = batch_targets_scaled.repeat(
+                (5, 1, 1))[offset_inds]  # ()
+            retained_offsets = grid_offset.repeat(1, offset_inds.shape[1],
+                                                  1)[offset_inds]
+
+            # batch_targets_scaled: (num_matched_target, 7)
+            # 7 is mean (batch_idx, cls_id, x_scaled,
+            # y_scaled, w_scaled, h_scaled, prior_idx)
+
+            # mlvl_positive_info: (num_matched_target, 4)
+            # 4 is mean (batch_idx, prior_idx, x_scaled, y_scaled)
+            mlvl_positive_info = batch_targets_scaled[:, [0, 6, 2, 3]]
+            retained_offsets = retained_offsets * near_neighbor_thr
+            mlvl_positive_info[:,
+                               2:] = mlvl_positive_info[:,
+                                                        2:] - retained_offsets
+            mlvl_positive_info[:, 2].clamp_(0, scaled_factor[2] - 1)
+            mlvl_positive_info[:, 3].clamp_(0, scaled_factor[3] - 1)
+            mlvl_positive_info = mlvl_positive_info.long()
+            priors_inds = mlvl_positive_info[:, 1]
+
+            mlvl_positive_infos.append(mlvl_positive_info)
+            mlvl_priors.append(priors_base_sizes_i[priors_inds])
+
+        return mlvl_positive_infos, mlvl_priors
+
+    def simota_assigner(self, pred_results, batch_targets_normed,
+                        mlvl_positive_infos, mlvl_priors, batch_input_shape):
+        """SimOTA assigner."""
+        num_batch_gts = batch_targets_normed.shape[1]
+        assert num_batch_gts > 0
+        num_levels = len(mlvl_positive_infos)
+
+        mlvl_positive_infos_matched = [[] for _ in range(num_levels)]
+        mlvl_priors_matched = [[] for _ in range(num_levels)]
+        mlvl_targets_normed_matched = [[] for _ in range(num_levels)]
+
+        for batch_idx in range(pred_results[0].shape[0]):
+            # (num_batch_gt, 7)
+            # 7 is mean (batch_idx, cls_id, x_norm, y_norm,
+            # w_norm, h_norm, prior_idx)
+            targets_normed = batch_targets_normed[0]
+            # (num_gt, 7)
+            targets_normed = targets_normed[targets_normed[:, 0] == batch_idx]
+            num_gts = targets_normed.shape[0]
+
+            if num_gts == 0:
+                continue
+
+            _mlvl_decoderd_bboxes = []
+            _mlvl_obj_cls = []
+            _mlvl_priors = []
+            _mlvl_positive_infos = []
+            _from_which_layer = []
+
+            for i, head_pred in enumerate(pred_results):
+                # (num_matched_target, 4)
+                #  4 is mean (batch_idx, prior_idx, grid_x, grid_y)
+                _mlvl_positive_info = mlvl_positive_infos[i]
+                if _mlvl_positive_info.shape[0] == 0:
+                    continue
+
+                idx = (_mlvl_positive_info[:, 0] == batch_idx)
+                _mlvl_positive_info = _mlvl_positive_info[idx]
+                _mlvl_positive_infos.append(_mlvl_positive_info)
+
+                priors = mlvl_priors[i][idx]
+                _mlvl_priors.append(priors)
+
+                _from_which_layer.append(
+                    _mlvl_positive_info.new_full(
+                        size=(_mlvl_positive_info.shape[0], ), fill_value=i))
+
+                # (n,85)
+                level_batch_idx, prior_ind, \
+                    grid_x, grid_y = _mlvl_positive_info.T
+                pred_positive = head_pred[level_batch_idx, prior_ind, grid_y,
+                                          grid_x]
+                _mlvl_obj_cls.append(pred_positive[:, 4:])
+
+                # decoded
+                grid = torch.stack([grid_x, grid_y], dim=1)
+                pred_positive_cxcy = (pred_positive[:, :2].sigmoid() * 2. -
+                                      0.5 + grid) * self.featmap_strides[i]
+                pred_positive_wh = (pred_positive[:, 2:4].sigmoid() * 2) ** 2 \
+                    * priors * self.featmap_strides[i]
+                pred_positive_xywh = torch.cat(
+                    [pred_positive_cxcy, pred_positive_wh], dim=-1)
+                _mlvl_decoderd_bboxes.append(pred_positive_xywh)
+
+            if len(_mlvl_decoderd_bboxes) == 0:
+                continue
+
+            # 1 calc pair_wise_iou_loss
+            _mlvl_decoderd_bboxes = torch.cat(_mlvl_decoderd_bboxes, dim=0)
+            num_pred_positive = _mlvl_decoderd_bboxes.shape[0]
+
+            if num_pred_positive == 0:
+                continue
+
+            # scaled xywh
+            batch_input_shape_wh = pred_results[0].new_tensor(
+                batch_input_shape[::-1]).repeat((1, 2))
+            targets_scaled_bbox = targets_normed[:, 2:6] * batch_input_shape_wh
+
+            targets_scaled_bbox = bbox_cxcywh_to_xyxy(targets_scaled_bbox)
+            _mlvl_decoderd_bboxes = bbox_cxcywh_to_xyxy(_mlvl_decoderd_bboxes)
+            pair_wise_iou = bbox_overlaps(targets_scaled_bbox,
+                                          _mlvl_decoderd_bboxes)
+            pair_wise_iou_loss = -torch.log(pair_wise_iou + 1e-8)
+
+            # 2 calc pair_wise_cls_loss
+            _mlvl_obj_cls = torch.cat(_mlvl_obj_cls, dim=0).float().sigmoid()
+            _mlvl_positive_infos = torch.cat(_mlvl_positive_infos, dim=0)
+            _from_which_layer = torch.cat(_from_which_layer, dim=0)
+            _mlvl_priors = torch.cat(_mlvl_priors, dim=0)
+
+            gt_cls_per_image = (
+                F.one_hot(targets_normed[:, 1].to(torch.int64),
+                          self.num_classes).float().unsqueeze(1).repeat(
+                              1, num_pred_positive, 1))
+            # cls_score * obj
+            cls_preds_ = _mlvl_obj_cls[:, 1:]\
+                .unsqueeze(0)\
+                .repeat(num_gts, 1, 1) \
+                * _mlvl_obj_cls[:, 0:1]\
+                .unsqueeze(0).repeat(num_gts, 1, 1)
+            y = cls_preds_.sqrt_()
+            pair_wise_cls_loss = F.binary_cross_entropy_with_logits(
+                torch.log(y / (1 - y)), gt_cls_per_image,
+                reduction='none').sum(-1)
+            del cls_preds_
+
+            # calc cost
+            cost = (
+                self.cls_weight * pair_wise_cls_loss +
+                self.iou_weight * pair_wise_iou_loss)
+
+            # num_gt, num_match_pred
+            matching_matrix = torch.zeros_like(cost)
+
+            top_k, _ = torch.topk(
+                pair_wise_iou,
+                min(self.candidate_topk, pair_wise_iou.shape[1]),
+                dim=1)
+            dynamic_ks = torch.clamp(top_k.sum(1).int(), min=1)
+
+            # Select only topk matches per gt
+            for gt_idx in range(num_gts):
+                _, pos_idx = torch.topk(
+                    cost[gt_idx], k=dynamic_ks[gt_idx].item(), largest=False)
+                matching_matrix[gt_idx][pos_idx] = 1.0
+            del top_k, dynamic_ks
+
+            # Each prediction box can match at most one gt box,
+            # and if there are more than one,
+            # only the least costly one can be taken
+            anchor_matching_gt = matching_matrix.sum(0)
+            if (anchor_matching_gt > 1).sum() > 0:
+                _, cost_argmin = torch.min(
+                    cost[:, anchor_matching_gt > 1], dim=0)
+                matching_matrix[:, anchor_matching_gt > 1] *= 0.0
+                matching_matrix[cost_argmin, anchor_matching_gt > 1] = 1.0
+            fg_mask_inboxes = matching_matrix.sum(0) > 0.0
+            matched_gt_inds = matching_matrix[:, fg_mask_inboxes].argmax(0)
+
+            targets_normed = targets_normed[matched_gt_inds]
+            _mlvl_positive_infos = _mlvl_positive_infos[fg_mask_inboxes]
+            _from_which_layer = _from_which_layer[fg_mask_inboxes]
+            _mlvl_priors = _mlvl_priors[fg_mask_inboxes]
+
+            # Rearranged in the order of the prediction layers
+            # to facilitate loss
+            for i in range(num_levels):
+                layer_idx = _from_which_layer == i
+                mlvl_positive_infos_matched[i].append(
+                    _mlvl_positive_infos[layer_idx])
+                mlvl_priors_matched[i].append(_mlvl_priors[layer_idx])
+                mlvl_targets_normed_matched[i].append(
+                    targets_normed[layer_idx])
+
+        results = mlvl_positive_infos_matched, \
+            mlvl_priors_matched, \
+            mlvl_targets_normed_matched
+        return results
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/models/task_modules/assigners/pose_sim_ota_assigner.py b/mmdetection_practice/third_party/mmyolo/mmyolo/models/task_modules/assigners/pose_sim_ota_assigner.py
new file mode 100644
index 0000000..e66a9bf
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/models/task_modules/assigners/pose_sim_ota_assigner.py
@@ -0,0 +1,210 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from typing import Optional, Tuple
+
+import torch
+import torch.nn.functional as F
+from mmdet.models.task_modules.assigners import AssignResult, SimOTAAssigner
+from mmdet.utils import ConfigType
+from mmengine.structures import InstanceData
+from torch import Tensor
+
+from mmyolo.registry import MODELS, TASK_UTILS
+
+INF = 100000.0
+EPS = 1.0e-7
+
+
+@TASK_UTILS.register_module()
+class PoseSimOTAAssigner(SimOTAAssigner):
+
+    def __init__(self,
+                 center_radius: float = 2.5,
+                 candidate_topk: int = 10,
+                 iou_weight: float = 3.0,
+                 cls_weight: float = 1.0,
+                 oks_weight: float = 0.0,
+                 vis_weight: float = 0.0,
+                 iou_calculator: ConfigType = dict(type='BboxOverlaps2D'),
+                 oks_calculator: ConfigType = dict(type='OksLoss')):
+
+        self.center_radius = center_radius
+        self.candidate_topk = candidate_topk
+        self.iou_weight = iou_weight
+        self.cls_weight = cls_weight
+        self.oks_weight = oks_weight
+        self.vis_weight = vis_weight
+
+        self.iou_calculator = TASK_UTILS.build(iou_calculator)
+        self.oks_calculator = MODELS.build(oks_calculator)
+
+    def assign(self,
+               pred_instances: InstanceData,
+               gt_instances: InstanceData,
+               gt_instances_ignore: Optional[InstanceData] = None,
+               **kwargs) -> AssignResult:
+        """Assign gt to priors using SimOTA.
+
+        Args:
+            pred_instances (:obj:`InstanceData`): Instances of model
+                predictions. It includes ``priors``, and the priors can
+                be anchors or points, or the bboxes predicted by the
+                previous stage, has shape (n, 4). The bboxes predicted by
+                the current model or stage will be named ``bboxes``,
+                ``labels``, and ``scores``, the same as the ``InstanceData``
+                in other places.
+            gt_instances (:obj:`InstanceData`): Ground truth of instance
+                annotations. It usually includes ``bboxes``, with shape (k, 4),
+                and ``labels``, with shape (k, ).
+            gt_instances_ignore (:obj:`InstanceData`, optional): Instances
+                to be ignored during training. It includes ``bboxes``
+                attribute data that is ignored during training and testing.
+                Defaults to None.
+        Returns:
+            obj:`AssignResult`: The assigned result.
+        """
+        gt_bboxes = gt_instances.bboxes
+        gt_labels = gt_instances.labels
+        gt_keypoints = gt_instances.keypoints
+        gt_keypoints_visible = gt_instances.keypoints_visible
+        num_gt = gt_bboxes.size(0)
+
+        decoded_bboxes = pred_instances.bboxes[..., :4]
+        pred_kpts = pred_instances.bboxes[..., 4:]
+        pred_kpts = pred_kpts.reshape(*pred_kpts.shape[:-1], -1, 3)
+        pred_kpts_vis = pred_kpts[..., -1]
+        pred_kpts = pred_kpts[..., :2]
+        pred_scores = pred_instances.scores
+        priors = pred_instances.priors
+        num_bboxes = decoded_bboxes.size(0)
+
+        # assign 0 by default
+        assigned_gt_inds = decoded_bboxes.new_full((num_bboxes, ),
+                                                   0,
+                                                   dtype=torch.long)
+        if num_gt == 0 or num_bboxes == 0:
+            # No ground truth or boxes, return empty assignment
+            max_overlaps = decoded_bboxes.new_zeros((num_bboxes, ))
+            assigned_labels = decoded_bboxes.new_full((num_bboxes, ),
+                                                      -1,
+                                                      dtype=torch.long)
+            return AssignResult(
+                num_gt, assigned_gt_inds, max_overlaps, labels=assigned_labels)
+
+        valid_mask, is_in_boxes_and_center = self.get_in_gt_and_in_center_info(
+            priors, gt_bboxes)
+        valid_decoded_bbox = decoded_bboxes[valid_mask]
+        valid_pred_scores = pred_scores[valid_mask]
+        valid_pred_kpts = pred_kpts[valid_mask]
+        valid_pred_kpts_vis = pred_kpts_vis[valid_mask]
+        num_valid = valid_decoded_bbox.size(0)
+        if num_valid == 0:
+            # No valid bboxes, return empty assignment
+            max_overlaps = decoded_bboxes.new_zeros((num_bboxes, ))
+            assigned_labels = decoded_bboxes.new_full((num_bboxes, ),
+                                                      -1,
+                                                      dtype=torch.long)
+            return AssignResult(
+                num_gt, assigned_gt_inds, max_overlaps, labels=assigned_labels)
+
+        cost_matrix = (~is_in_boxes_and_center) * INF
+
+        # calculate iou
+        pairwise_ious = self.iou_calculator(valid_decoded_bbox, gt_bboxes)
+        if self.iou_weight > 0:
+            iou_cost = -torch.log(pairwise_ious + EPS)
+            cost_matrix = cost_matrix + iou_cost * self.iou_weight
+
+        # calculate oks
+        pairwise_oks = self.oks_calculator.compute_oks(
+            valid_pred_kpts.unsqueeze(1),  # [num_valid, -1, k, 2]
+            gt_keypoints.unsqueeze(0),  # [1, num_gt, k, 2]
+            gt_keypoints_visible.unsqueeze(0),  # [1, num_gt, k]
+            bboxes=gt_bboxes.unsqueeze(0),  # [1, num_gt, 4]
+        )  # -> [num_valid, num_gt]
+        if self.oks_weight > 0:
+            oks_cost = -torch.log(pairwise_oks + EPS)
+            cost_matrix = cost_matrix + oks_cost * self.oks_weight
+
+        # calculate cls
+        if self.cls_weight > 0:
+            gt_onehot_label = (
+                F.one_hot(gt_labels.to(torch.int64),
+                          pred_scores.shape[-1]).float().unsqueeze(0).repeat(
+                              num_valid, 1, 1))
+
+            valid_pred_scores = valid_pred_scores.unsqueeze(1).repeat(
+                1, num_gt, 1)
+            # disable AMP autocast to avoid overflow
+            with torch.cuda.amp.autocast(enabled=False):
+                cls_cost = (
+                    F.binary_cross_entropy(
+                        valid_pred_scores.to(dtype=torch.float32),
+                        gt_onehot_label,
+                        reduction='none',
+                    ).sum(-1).to(dtype=valid_pred_scores.dtype))
+            cost_matrix = cost_matrix + cls_cost * self.cls_weight
+
+        # calculate vis
+        if self.vis_weight > 0:
+            valid_pred_kpts_vis = valid_pred_kpts_vis.sigmoid().unsqueeze(
+                1).repeat(1, num_gt, 1)  # [num_valid, 1, k]
+            gt_kpt_vis = gt_keypoints_visible.unsqueeze(
+                0).float()  # [1, num_gt, k]
+            with torch.cuda.amp.autocast(enabled=False):
+                vis_cost = (
+                    F.binary_cross_entropy(
+                        valid_pred_kpts_vis.to(dtype=torch.float32),
+                        gt_kpt_vis.repeat(num_valid, 1, 1),
+                        reduction='none',
+                    ).sum(-1).to(dtype=valid_pred_kpts_vis.dtype))
+            cost_matrix = cost_matrix + vis_cost * self.vis_weight
+
+        # mixed metric
+        pairwise_oks = pairwise_oks.pow(0.5)
+        matched_pred_oks, matched_gt_inds = \
+            self.dynamic_k_matching(
+                cost_matrix, pairwise_ious, pairwise_oks, num_gt, valid_mask)
+
+        # convert to AssignResult format
+        assigned_gt_inds[valid_mask] = matched_gt_inds + 1
+        assigned_labels = assigned_gt_inds.new_full((num_bboxes, ), -1)
+        assigned_labels[valid_mask] = gt_labels[matched_gt_inds].long()
+        max_overlaps = assigned_gt_inds.new_full((num_bboxes, ),
+                                                 -INF,
+                                                 dtype=torch.float32)
+        max_overlaps[valid_mask] = matched_pred_oks
+        return AssignResult(
+            num_gt, assigned_gt_inds, max_overlaps, labels=assigned_labels)
+
+    def dynamic_k_matching(self, cost: Tensor, pairwise_ious: Tensor,
+                           pairwise_oks: Tensor, num_gt: int,
+                           valid_mask: Tensor) -> Tuple[Tensor, Tensor]:
+        """Use IoU and matching cost to calculate the dynamic top-k positive
+        targets."""
+        matching_matrix = torch.zeros_like(cost, dtype=torch.uint8)
+        # select candidate topk ious for dynamic-k calculation
+        candidate_topk = min(self.candidate_topk, pairwise_ious.size(0))
+        topk_ious, _ = torch.topk(pairwise_ious, candidate_topk, dim=0)
+        # calculate dynamic k for each gt
+        dynamic_ks = torch.clamp(topk_ious.sum(0).int(), min=1)
+        for gt_idx in range(num_gt):
+            _, pos_idx = torch.topk(
+                cost[:, gt_idx], k=dynamic_ks[gt_idx], largest=False)
+            matching_matrix[:, gt_idx][pos_idx] = 1
+
+        del topk_ious, dynamic_ks, pos_idx
+
+        prior_match_gt_mask = matching_matrix.sum(1) > 1
+        if prior_match_gt_mask.sum() > 0:
+            cost_min, cost_argmin = torch.min(
+                cost[prior_match_gt_mask, :], dim=1)
+            matching_matrix[prior_match_gt_mask, :] *= 0
+            matching_matrix[prior_match_gt_mask, cost_argmin] = 1
+        # get foreground mask inside box and center prior
+        fg_mask_inboxes = matching_matrix.sum(1) > 0
+        valid_mask[valid_mask.clone()] = fg_mask_inboxes
+
+        matched_gt_inds = matching_matrix[fg_mask_inboxes, :].argmax(1)
+        matched_pred_oks = (matching_matrix *
+                            pairwise_oks).sum(1)[fg_mask_inboxes]
+        return matched_pred_oks, matched_gt_inds
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/models/task_modules/assigners/utils.py b/mmdetection_practice/third_party/mmyolo/mmyolo/models/task_modules/assigners/utils.py
new file mode 100644
index 0000000..5843200
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/models/task_modules/assigners/utils.py
@@ -0,0 +1,110 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+
+from typing import Tuple
+
+import torch
+import torch.nn.functional as F
+from torch import Tensor
+
+
+def select_candidates_in_gts(priors_points: Tensor,
+                             gt_bboxes: Tensor,
+                             eps: float = 1e-9) -> Tensor:
+    """Select the positive priors' center in gt.
+
+    Args:
+        priors_points (Tensor): Model priors points,
+            shape(num_priors, 2)
+        gt_bboxes (Tensor): Ground true bboxes,
+            shape(batch_size, num_gt, 4)
+        eps (float): Default to 1e-9.
+    Return:
+        (Tensor): shape(batch_size, num_gt, num_priors)
+    """
+    batch_size, num_gt, _ = gt_bboxes.size()
+    gt_bboxes = gt_bboxes.reshape([-1, 4])
+
+    priors_number = priors_points.size(0)
+    priors_points = priors_points.unsqueeze(0).repeat(batch_size * num_gt, 1,
+                                                      1)
+
+    # calculate the left, top, right, bottom distance between positive
+    # prior center and gt side
+    gt_bboxes_lt = gt_bboxes[:, 0:2].unsqueeze(1).repeat(1, priors_number, 1)
+    gt_bboxes_rb = gt_bboxes[:, 2:4].unsqueeze(1).repeat(1, priors_number, 1)
+    bbox_deltas = torch.cat(
+        [priors_points - gt_bboxes_lt, gt_bboxes_rb - priors_points], dim=-1)
+    bbox_deltas = bbox_deltas.reshape([batch_size, num_gt, priors_number, -1])
+
+    return (bbox_deltas.min(axis=-1)[0] > eps).to(gt_bboxes.dtype)
+
+
+def select_highest_overlaps(pos_mask: Tensor, overlaps: Tensor,
+                            num_gt: int) -> Tuple[Tensor, Tensor, Tensor]:
+    """If an anchor box is assigned to multiple gts, the one with the highest
+    iou will be selected.
+
+    Args:
+        pos_mask (Tensor): The assigned positive sample mask,
+            shape(batch_size, num_gt, num_priors)
+        overlaps (Tensor): IoU between all bbox and ground truth,
+            shape(batch_size, num_gt, num_priors)
+        num_gt (int): Number of ground truth.
+    Return:
+        gt_idx_pre_prior (Tensor): Target ground truth index,
+            shape(batch_size, num_priors)
+        fg_mask_pre_prior (Tensor): Force matching ground truth,
+            shape(batch_size, num_priors)
+        pos_mask (Tensor): The assigned positive sample mask,
+            shape(batch_size, num_gt, num_priors)
+    """
+    fg_mask_pre_prior = pos_mask.sum(axis=-2)
+
+    # Make sure the positive sample matches the only one and is the largest IoU
+    if fg_mask_pre_prior.max() > 1:
+        mask_multi_gts = (fg_mask_pre_prior.unsqueeze(1) > 1).repeat(
+            [1, num_gt, 1])
+        index = overlaps.argmax(axis=1)
+        is_max_overlaps = F.one_hot(index, num_gt)
+        is_max_overlaps = \
+            is_max_overlaps.permute(0, 2, 1).to(overlaps.dtype)
+
+        pos_mask = torch.where(mask_multi_gts, is_max_overlaps, pos_mask)
+        fg_mask_pre_prior = pos_mask.sum(axis=-2)
+
+    gt_idx_pre_prior = pos_mask.argmax(axis=-2)
+    return gt_idx_pre_prior, fg_mask_pre_prior, pos_mask
+
+
+# TODO:'mmdet.BboxOverlaps2D' will cause gradient inconsistency,
+# which will be found and solved in a later version.
+def yolov6_iou_calculator(bbox1: Tensor,
+                          bbox2: Tensor,
+                          eps: float = 1e-9) -> Tensor:
+    """Calculate iou for batch.
+
+    Args:
+        bbox1 (Tensor): shape(batch size, num_gt, 4)
+        bbox2 (Tensor): shape(batch size, num_priors, 4)
+        eps (float): Default to 1e-9.
+    Return:
+        (Tensor): IoU, shape(size, num_gt, num_priors)
+    """
+    bbox1 = bbox1.unsqueeze(2)  # [N, M1, 4] -> [N, M1, 1, 4]
+    bbox2 = bbox2.unsqueeze(1)  # [N, M2, 4] -> [N, 1, M2, 4]
+
+    # calculate xy info of predict and gt bbox
+    bbox1_x1y1, bbox1_x2y2 = bbox1[:, :, :, 0:2], bbox1[:, :, :, 2:4]
+    bbox2_x1y1, bbox2_x2y2 = bbox2[:, :, :, 0:2], bbox2[:, :, :, 2:4]
+
+    # calculate overlap area
+    overlap = (torch.minimum(bbox1_x2y2, bbox2_x2y2) -
+               torch.maximum(bbox1_x1y1, bbox2_x1y1)).clip(0).prod(-1)
+
+    # calculate bbox area
+    bbox1_area = (bbox1_x2y2 - bbox1_x1y1).clip(0).prod(-1)
+    bbox2_area = (bbox2_x2y2 - bbox2_x1y1).clip(0).prod(-1)
+
+    union = bbox1_area + bbox2_area - overlap + eps
+
+    return overlap / union
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/models/task_modules/coders/__init__.py b/mmdetection_practice/third_party/mmyolo/mmyolo/models/task_modules/coders/__init__.py
new file mode 100644
index 0000000..75b6e7d
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/models/task_modules/coders/__init__.py
@@ -0,0 +1,10 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from .distance_angle_point_coder import DistanceAnglePointCoder
+from .distance_point_bbox_coder import DistancePointBBoxCoder
+from .yolov5_bbox_coder import YOLOv5BBoxCoder
+from .yolox_bbox_coder import YOLOXBBoxCoder
+
+__all__ = [
+    'YOLOv5BBoxCoder', 'YOLOXBBoxCoder', 'DistancePointBBoxCoder',
+    'DistanceAnglePointCoder'
+]
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/models/task_modules/coders/distance_angle_point_coder.py b/mmdetection_practice/third_party/mmyolo/mmyolo/models/task_modules/coders/distance_angle_point_coder.py
new file mode 100644
index 0000000..a7e322f
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/models/task_modules/coders/distance_angle_point_coder.py
@@ -0,0 +1,94 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from typing import Optional, Sequence, Union
+
+import torch
+
+from mmyolo.registry import TASK_UTILS
+
+try:
+    from mmrotate.models.task_modules.coders import \
+        DistanceAnglePointCoder as MMROTATE_DistanceAnglePointCoder
+    MMROTATE_AVAILABLE = True
+except ImportError:
+    from mmdet.models.task_modules.coders import BaseBBoxCoder
+    MMROTATE_DistanceAnglePointCoder = BaseBBoxCoder
+    MMROTATE_AVAILABLE = False
+
+
+@TASK_UTILS.register_module()
+class DistanceAnglePointCoder(MMROTATE_DistanceAnglePointCoder):
+    """Distance Angle Point BBox coder.
+
+    This coder encodes gt bboxes (x, y, w, h, theta) into (top, bottom, left,
+    right, theta) and decode it back to the original.
+    """
+
+    def __init__(self, clip_border=True, angle_version='oc'):
+        if not MMROTATE_AVAILABLE:
+            raise ImportError(
+                'Please run "mim install -r requirements/mmrotate.txt" '
+                'to install mmrotate first for rotated detection.')
+
+        super().__init__(clip_border=clip_border, angle_version=angle_version)
+
+    def decode(
+        self,
+        points: torch.Tensor,
+        pred_bboxes: torch.Tensor,
+        stride: torch.Tensor,
+        max_shape: Optional[Union[Sequence[int], torch.Tensor,
+                                  Sequence[Sequence[int]]]] = None,
+    ) -> torch.Tensor:
+        """Decode distance prediction to bounding box.
+
+        Args:
+            points (Tensor): Shape (B, N, 2) or (N, 2).
+            pred_bboxes (Tensor): Distance from the given point to 4
+                boundaries and angle (left, top, right, bottom, angle).
+                Shape (B, N, 5) or (N, 5)
+            max_shape (Sequence[int] or torch.Tensor or Sequence[
+                Sequence[int]],optional): Maximum bounds for boxes, specifies
+                (H, W, C) or (H, W). If priors shape is (B, N, 4), then
+                the max_shape should be a Sequence[Sequence[int]],
+                and the length of max_shape should also be B.
+                Default None.
+        Returns:
+            Tensor: Boxes with shape (N, 5) or (B, N, 5)
+        """
+        assert points.size(-2) == pred_bboxes.size(-2)
+        assert points.size(-1) == 2
+        assert pred_bboxes.size(-1) == 5
+        if self.clip_border is False:
+            max_shape = None
+
+        if pred_bboxes.dim() == 2:
+            stride = stride[:, None]
+        else:
+            stride = stride[None, :, None]
+        pred_bboxes[..., :4] = pred_bboxes[..., :4] * stride
+
+        return self.distance2obb(points, pred_bboxes, max_shape,
+                                 self.angle_version)
+
+    def encode(self,
+               points: torch.Tensor,
+               gt_bboxes: torch.Tensor,
+               max_dis: float = 16.,
+               eps: float = 0.01) -> torch.Tensor:
+        """Encode bounding box to distances.
+
+        Args:
+            points (Tensor): Shape (N, 2), The format is [x, y].
+            gt_bboxes (Tensor): Shape (N, 5), The format is "xywha"
+            max_dis (float): Upper bound of the distance. Default None.
+            eps (float): a small value to ensure target < max_dis, instead <=.
+                Default 0.1.
+
+        Returns:
+            Tensor: Box transformation deltas. The shape is (N, 5).
+        """
+
+        assert points.size(-2) == gt_bboxes.size(-2)
+        assert points.size(-1) == 2
+        assert gt_bboxes.size(-1) == 5
+        return self.obb2distance(points, gt_bboxes, max_dis, eps)
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/models/task_modules/coders/distance_point_bbox_coder.py b/mmdetection_practice/third_party/mmyolo/mmyolo/models/task_modules/coders/distance_point_bbox_coder.py
new file mode 100644
index 0000000..16417b8
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/models/task_modules/coders/distance_point_bbox_coder.py
@@ -0,0 +1,79 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from typing import Optional, Sequence, Union
+
+import torch
+from mmdet.models.task_modules.coders import \
+    DistancePointBBoxCoder as MMDET_DistancePointBBoxCoder
+from mmdet.structures.bbox import bbox2distance, distance2bbox
+
+from mmyolo.registry import TASK_UTILS
+
+
+@TASK_UTILS.register_module()
+class DistancePointBBoxCoder(MMDET_DistancePointBBoxCoder):
+    """Distance Point BBox coder.
+
+    This coder encodes gt bboxes (x1, y1, x2, y2) into (top, bottom, left,
+    right) and decode it back to the original.
+    """
+
+    def decode(
+        self,
+        points: torch.Tensor,
+        pred_bboxes: torch.Tensor,
+        stride: torch.Tensor,
+        max_shape: Optional[Union[Sequence[int], torch.Tensor,
+                                  Sequence[Sequence[int]]]] = None
+    ) -> torch.Tensor:
+        """Decode distance prediction to bounding box.
+
+        Args:
+            points (Tensor): Shape (B, N, 2) or (N, 2).
+            pred_bboxes (Tensor): Distance from the given point to 4
+                boundaries (left, top, right, bottom). Shape (B, N, 4)
+                or (N, 4)
+            stride (Tensor): Featmap stride.
+            max_shape (Sequence[int] or torch.Tensor or Sequence[
+                Sequence[int]],optional): Maximum bounds for boxes, specifies
+                (H, W, C) or (H, W). If priors shape is (B, N, 4), then
+                the max_shape should be a Sequence[Sequence[int]],
+                and the length of max_shape should also be B.
+                Default None.
+        Returns:
+            Tensor: Boxes with shape (N, 4) or (B, N, 4)
+        """
+        assert points.size(-2) == pred_bboxes.size(-2)
+        assert points.size(-1) == 2
+        assert pred_bboxes.size(-1) == 4
+        if self.clip_border is False:
+            max_shape = None
+
+        pred_bboxes = pred_bboxes * stride[None, :, None]
+
+        return distance2bbox(points, pred_bboxes, max_shape)
+
+    def encode(self,
+               points: torch.Tensor,
+               gt_bboxes: torch.Tensor,
+               max_dis: float = 16.,
+               eps: float = 0.01) -> torch.Tensor:
+        """Encode bounding box to distances. The rewrite is to support batch
+        operations.
+
+        Args:
+            points (Tensor): Shape (B, N, 2) or (N, 2), The format is [x, y].
+            gt_bboxes (Tensor or :obj:`BaseBoxes`): Shape (N, 4), The format
+                is "xyxy"
+            max_dis (float): Upper bound of the distance. Default to 16..
+            eps (float): a small value to ensure target < max_dis, instead <=.
+                Default 0.01.
+
+        Returns:
+            Tensor: Box transformation deltas. The shape is (N, 4) or
+             (B, N, 4).
+        """
+
+        assert points.size(-2) == gt_bboxes.size(-2)
+        assert points.size(-1) == 2
+        assert gt_bboxes.size(-1) == 4
+        return bbox2distance(points, gt_bboxes, max_dis, eps)
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/models/task_modules/coders/yolov5_bbox_coder.py b/mmdetection_practice/third_party/mmyolo/mmyolo/models/task_modules/coders/yolov5_bbox_coder.py
new file mode 100644
index 0000000..bab5f0e
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/models/task_modules/coders/yolov5_bbox_coder.py
@@ -0,0 +1,55 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from typing import Union
+
+import torch
+from mmdet.models.task_modules.coders.base_bbox_coder import BaseBBoxCoder
+
+from mmyolo.registry import TASK_UTILS
+
+
+@TASK_UTILS.register_module()
+class YOLOv5BBoxCoder(BaseBBoxCoder):
+    """YOLOv5 BBox coder.
+
+    This decoder decodes pred bboxes (delta_x, delta_x, w, h) to bboxes (tl_x,
+    tl_y, br_x, br_y).
+    """
+
+    def encode(self, **kwargs):
+        """Encode deltas between bboxes and ground truth boxes."""
+        pass
+
+    def decode(self, priors: torch.Tensor, pred_bboxes: torch.Tensor,
+               stride: Union[torch.Tensor, int]) -> torch.Tensor:
+        """Decode regression results (delta_x, delta_x, w, h) to bboxes (tl_x,
+        tl_y, br_x, br_y).
+
+        Args:
+            priors (torch.Tensor): Basic boxes or points, e.g. anchors.
+            pred_bboxes (torch.Tensor): Encoded boxes with shape
+            stride (torch.Tensor | int): Strides of bboxes.
+
+        Returns:
+            torch.Tensor: Decoded boxes.
+        """
+        assert pred_bboxes.size(-1) == priors.size(-1) == 4
+
+        pred_bboxes = pred_bboxes.sigmoid()
+
+        x_center = (priors[..., 0] + priors[..., 2]) * 0.5
+        y_center = (priors[..., 1] + priors[..., 3]) * 0.5
+        w = priors[..., 2] - priors[..., 0]
+        h = priors[..., 3] - priors[..., 1]
+
+        # The anchor of mmdet has been offset by 0.5
+        x_center_pred = (pred_bboxes[..., 0] - 0.5) * 2 * stride + x_center
+        y_center_pred = (pred_bboxes[..., 1] - 0.5) * 2 * stride + y_center
+        w_pred = (pred_bboxes[..., 2] * 2)**2 * w
+        h_pred = (pred_bboxes[..., 3] * 2)**2 * h
+
+        decoded_bboxes = torch.stack(
+            (x_center_pred - w_pred / 2, y_center_pred - h_pred / 2,
+             x_center_pred + w_pred / 2, y_center_pred + h_pred / 2),
+            dim=-1)
+
+        return decoded_bboxes
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/models/task_modules/coders/yolox_bbox_coder.py b/mmdetection_practice/third_party/mmyolo/mmyolo/models/task_modules/coders/yolox_bbox_coder.py
new file mode 100644
index 0000000..02c898d
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/models/task_modules/coders/yolox_bbox_coder.py
@@ -0,0 +1,45 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from typing import Union
+
+import torch
+from mmdet.models.task_modules.coders.base_bbox_coder import BaseBBoxCoder
+
+from mmyolo.registry import TASK_UTILS
+
+
+@TASK_UTILS.register_module()
+class YOLOXBBoxCoder(BaseBBoxCoder):
+    """YOLOX BBox coder.
+
+    This decoder decodes pred bboxes (delta_x, delta_x, w, h) to bboxes (tl_x,
+    tl_y, br_x, br_y).
+    """
+
+    def encode(self, **kwargs):
+        """Encode deltas between bboxes and ground truth boxes."""
+        pass
+
+    def decode(self, priors: torch.Tensor, pred_bboxes: torch.Tensor,
+               stride: Union[torch.Tensor, int]) -> torch.Tensor:
+        """Decode regression results (delta_x, delta_x, w, h) to bboxes (tl_x,
+        tl_y, br_x, br_y).
+
+        Args:
+            priors (torch.Tensor): Basic boxes or points, e.g. anchors.
+            pred_bboxes (torch.Tensor): Encoded boxes with shape
+            stride (torch.Tensor | int): Strides of bboxes.
+
+        Returns:
+            torch.Tensor: Decoded boxes.
+        """
+        stride = stride[None, :, None]
+        xys = (pred_bboxes[..., :2] * stride) + priors
+        whs = pred_bboxes[..., 2:].exp() * stride
+
+        tl_x = (xys[..., 0] - whs[..., 0] / 2)
+        tl_y = (xys[..., 1] - whs[..., 1] / 2)
+        br_x = (xys[..., 0] + whs[..., 0] / 2)
+        br_y = (xys[..., 1] + whs[..., 1] / 2)
+
+        decoded_bboxes = torch.stack([tl_x, tl_y, br_x, br_y], -1)
+        return decoded_bboxes
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/models/utils/__init__.py b/mmdetection_practice/third_party/mmyolo/mmyolo/models/utils/__init__.py
new file mode 100644
index 0000000..d62ff80
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/models/utils/__init__.py
@@ -0,0 +1,8 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from .misc import (OutputSaveFunctionWrapper, OutputSaveObjectWrapper,
+                   gt_instances_preprocess, make_divisible, make_round)
+
+__all__ = [
+    'make_divisible', 'make_round', 'gt_instances_preprocess',
+    'OutputSaveFunctionWrapper', 'OutputSaveObjectWrapper'
+]
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/models/utils/misc.py b/mmdetection_practice/third_party/mmyolo/mmyolo/models/utils/misc.py
new file mode 100644
index 0000000..96cd119
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/models/utils/misc.py
@@ -0,0 +1,186 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+import math
+from collections import defaultdict
+from copy import deepcopy
+from typing import Any, Callable, Dict, Optional, Sequence, Tuple, Union
+
+import torch
+from mmdet.structures.bbox.transforms import get_box_tensor
+from torch import Tensor
+
+
+def make_divisible(x: float,
+                   widen_factor: float = 1.0,
+                   divisor: int = 8) -> int:
+    """Make sure that x*widen_factor is divisible by divisor."""
+    return math.ceil(x * widen_factor / divisor) * divisor
+
+
+def make_round(x: float, deepen_factor: float = 1.0) -> int:
+    """Make sure that x*deepen_factor becomes an integer not less than 1."""
+    return max(round(x * deepen_factor), 1) if x > 1 else x
+
+
+def gt_instances_preprocess(batch_gt_instances: Union[Tensor, Sequence],
+                            batch_size: int) -> Tensor:
+    """Split batch_gt_instances with batch size.
+
+    From [all_gt_bboxes, box_dim+2] to [batch_size, number_gt, box_dim+1].
+    For horizontal box, box_dim=4, for rotated box, box_dim=5
+
+    If some shape of single batch smaller than
+    gt bbox len, then using zeros to fill.
+
+    Args:
+        batch_gt_instances (Sequence[Tensor]): Ground truth
+            instances for whole batch, shape [all_gt_bboxes, box_dim+2]
+        batch_size (int): Batch size.
+
+    Returns:
+        Tensor: batch gt instances data, shape
+                [batch_size, number_gt, box_dim+1]
+    """
+    if isinstance(batch_gt_instances, Sequence):
+        max_gt_bbox_len = max(
+            [len(gt_instances) for gt_instances in batch_gt_instances])
+        # fill zeros with length box_dim+1 if some shape of
+        # single batch not equal max_gt_bbox_len
+        batch_instance_list = []
+        for index, gt_instance in enumerate(batch_gt_instances):
+            bboxes = gt_instance.bboxes
+            labels = gt_instance.labels
+            box_dim = get_box_tensor(bboxes).size(-1)
+            batch_instance_list.append(
+                torch.cat((labels[:, None], bboxes), dim=-1))
+
+            if bboxes.shape[0] >= max_gt_bbox_len:
+                continue
+
+            fill_tensor = bboxes.new_full(
+                [max_gt_bbox_len - bboxes.shape[0], box_dim + 1], 0)
+            batch_instance_list[index] = torch.cat(
+                (batch_instance_list[index], fill_tensor), dim=0)
+
+        return torch.stack(batch_instance_list)
+    else:
+        # faster version
+        # format of batch_gt_instances: [img_ind, cls_ind, (box)]
+        # For example horizontal box should be:
+        # [img_ind, cls_ind, x1, y1, x2, y2]
+        # Rotated box should be
+        # [img_ind, cls_ind, x, y, w, h, a]
+
+        # sqlit batch gt instance [all_gt_bboxes, box_dim+2] ->
+        # [batch_size, max_gt_bbox_len, box_dim+1]
+        assert isinstance(batch_gt_instances, Tensor)
+        box_dim = batch_gt_instances.size(-1) - 2
+        if len(batch_gt_instances) > 0:
+            gt_images_indexes = batch_gt_instances[:, 0]
+            max_gt_bbox_len = gt_images_indexes.unique(
+                return_counts=True)[1].max()
+            # fill zeros with length box_dim+1 if some shape of
+            # single batch not equal max_gt_bbox_len
+            batch_instance = torch.zeros(
+                (batch_size, max_gt_bbox_len, box_dim + 1),
+                dtype=batch_gt_instances.dtype,
+                device=batch_gt_instances.device)
+
+            for i in range(batch_size):
+                match_indexes = gt_images_indexes == i
+                gt_num = match_indexes.sum()
+                if gt_num:
+                    batch_instance[i, :gt_num] = batch_gt_instances[
+                        match_indexes, 1:]
+        else:
+            batch_instance = torch.zeros((batch_size, 0, box_dim + 1),
+                                         dtype=batch_gt_instances.dtype,
+                                         device=batch_gt_instances.device)
+
+        return batch_instance
+
+
+class OutputSaveObjectWrapper:
+    """A wrapper class that saves the output of function calls on an object."""
+
+    def __init__(self, obj: Any) -> None:
+        self.obj = obj
+        self.log = defaultdict(list)
+
+    def __getattr__(self, attr: str) -> Any:
+        """Overrides the default behavior when an attribute is accessed.
+
+        - If the attribute is callable, hooks the attribute and saves the
+        returned value of the function call to the log.
+        - If the attribute is not callable, saves the attribute's value to the
+        log and returns the value.
+        """
+        orig_attr = getattr(self.obj, attr)
+
+        if not callable(orig_attr):
+            self.log[attr].append(orig_attr)
+            return orig_attr
+
+        def hooked(*args: Tuple, **kwargs: Dict) -> Any:
+            """The hooked function that logs the return value of the original
+            function."""
+            result = orig_attr(*args, **kwargs)
+            self.log[attr].append(result)
+            return result
+
+        return hooked
+
+    def clear(self):
+        """Clears the log of function call outputs."""
+        self.log.clear()
+
+    def __deepcopy__(self, memo):
+        """Only copy the object when applying deepcopy."""
+        other = type(self)(deepcopy(self.obj))
+        memo[id(self)] = other
+        return other
+
+
+class OutputSaveFunctionWrapper:
+    """A class that wraps a function and saves its outputs.
+
+    This class can be used to decorate a function to save its outputs. It wraps
+    the function with a `__call__` method that calls the original function and
+    saves the results in a log attribute.
+    Args:
+        func (Callable): A function to wrap.
+        spec (Optional[Dict]): A dictionary of global variables to use as the
+            namespace for the wrapper. If `None`, the global namespace of the
+            original function is used.
+    """
+
+    def __init__(self, func: Callable, spec: Optional[Dict]) -> None:
+        """Initializes the OutputSaveFunctionWrapper instance."""
+        assert callable(func)
+        self.log = []
+        self.func = func
+        self.func_name = func.__name__
+
+        if isinstance(spec, dict):
+            self.spec = spec
+        elif hasattr(func, '__globals__'):
+            self.spec = func.__globals__
+        else:
+            raise ValueError
+
+    def __call__(self, *args, **kwargs) -> Any:
+        """Calls the wrapped function with the given arguments and saves the
+        results in the `log` attribute."""
+        results = self.func(*args, **kwargs)
+        self.log.append(results)
+        return results
+
+    def __enter__(self) -> None:
+        """Enters the context and sets the wrapped function to be a global
+        variable in the specified namespace."""
+        self.spec[self.func_name] = self
+        return self.log
+
+    def __exit__(self, exc_type, exc_val, exc_tb) -> None:
+        """Exits the context and resets the wrapped function to its original
+        value in the specified namespace."""
+        self.spec[self.func_name] = self.func
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/registry.py b/mmdetection_practice/third_party/mmyolo/mmyolo/registry.py
new file mode 100644
index 0000000..71f43e6
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/registry.py
@@ -0,0 +1,103 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+"""MMYOLO provides 17 registry nodes to support using modules across projects.
+Each node is a child of the root registry in MMEngine.
+
+More details can be found at
+https://mmengine.readthedocs.io/en/latest/tutorials/registry.html.
+"""
+
+from mmengine.registry import DATA_SAMPLERS as MMENGINE_DATA_SAMPLERS
+from mmengine.registry import DATASETS as MMENGINE_DATASETS
+from mmengine.registry import HOOKS as MMENGINE_HOOKS
+from mmengine.registry import LOOPS as MMENGINE_LOOPS
+from mmengine.registry import METRICS as MMENGINE_METRICS
+from mmengine.registry import MODEL_WRAPPERS as MMENGINE_MODEL_WRAPPERS
+from mmengine.registry import MODELS as MMENGINE_MODELS
+from mmengine.registry import \
+    OPTIM_WRAPPER_CONSTRUCTORS as MMENGINE_OPTIM_WRAPPER_CONSTRUCTORS
+from mmengine.registry import OPTIM_WRAPPERS as MMENGINE_OPTIM_WRAPPERS
+from mmengine.registry import OPTIMIZERS as MMENGINE_OPTIMIZERS
+from mmengine.registry import PARAM_SCHEDULERS as MMENGINE_PARAM_SCHEDULERS
+from mmengine.registry import \
+    RUNNER_CONSTRUCTORS as MMENGINE_RUNNER_CONSTRUCTORS
+from mmengine.registry import RUNNERS as MMENGINE_RUNNERS
+from mmengine.registry import TASK_UTILS as MMENGINE_TASK_UTILS
+from mmengine.registry import TRANSFORMS as MMENGINE_TRANSFORMS
+from mmengine.registry import VISBACKENDS as MMENGINE_VISBACKENDS
+from mmengine.registry import VISUALIZERS as MMENGINE_VISUALIZERS
+from mmengine.registry import \
+    WEIGHT_INITIALIZERS as MMENGINE_WEIGHT_INITIALIZERS
+from mmengine.registry import Registry
+
+# manage all kinds of runners like `EpochBasedRunner` and `IterBasedRunner`
+RUNNERS = Registry(
+    'runner', parent=MMENGINE_RUNNERS, locations=['mmyolo.engine'])
+# manage runner constructors that define how to initialize runners
+RUNNER_CONSTRUCTORS = Registry(
+    'runner constructor',
+    parent=MMENGINE_RUNNER_CONSTRUCTORS,
+    locations=['mmyolo.engine'])
+# manage all kinds of loops like `EpochBasedTrainLoop`
+LOOPS = Registry('loop', parent=MMENGINE_LOOPS, locations=['mmyolo.engine'])
+# manage all kinds of hooks like `CheckpointHook`
+HOOKS = Registry(
+    'hook', parent=MMENGINE_HOOKS, locations=['mmyolo.engine.hooks'])
+
+# manage data-related modules
+DATASETS = Registry(
+    'dataset', parent=MMENGINE_DATASETS, locations=['mmyolo.datasets'])
+DATA_SAMPLERS = Registry(
+    'data sampler',
+    parent=MMENGINE_DATA_SAMPLERS,
+    locations=['mmyolo.datasets'])
+TRANSFORMS = Registry(
+    'transform',
+    parent=MMENGINE_TRANSFORMS,
+    locations=['mmyolo.datasets.transforms'])
+
+# manage all kinds of modules inheriting `nn.Module`
+MODELS = Registry('model', parent=MMENGINE_MODELS, locations=['mmyolo.models'])
+# manage all kinds of model wrappers like 'MMDistributedDataParallel'
+MODEL_WRAPPERS = Registry(
+    'model_wrapper',
+    parent=MMENGINE_MODEL_WRAPPERS,
+    locations=['mmyolo.models'])
+# manage all kinds of weight initialization modules like `Uniform`
+WEIGHT_INITIALIZERS = Registry(
+    'weight initializer',
+    parent=MMENGINE_WEIGHT_INITIALIZERS,
+    locations=['mmyolo.models'])
+
+# manage all kinds of optimizers like `SGD` and `Adam`
+OPTIMIZERS = Registry(
+    'optimizer',
+    parent=MMENGINE_OPTIMIZERS,
+    locations=['mmyolo.engine.optimizers'])
+OPTIM_WRAPPERS = Registry(
+    'optim_wrapper',
+    parent=MMENGINE_OPTIM_WRAPPERS,
+    locations=['mmyolo.engine.optimizers'])
+# manage constructors that customize the optimization hyperparameters.
+OPTIM_WRAPPER_CONSTRUCTORS = Registry(
+    'optimizer constructor',
+    parent=MMENGINE_OPTIM_WRAPPER_CONSTRUCTORS,
+    locations=['mmyolo.engine.optimizers'])
+# manage all kinds of parameter schedulers like `MultiStepLR`
+PARAM_SCHEDULERS = Registry(
+    'parameter scheduler',
+    parent=MMENGINE_PARAM_SCHEDULERS,
+    locations=['mmyolo.engine.optimizers'])
+# manage all kinds of metrics
+METRICS = Registry(
+    'metric', parent=MMENGINE_METRICS, locations=['mmyolo.engine'])
+
+# manage task-specific modules like anchor generators and box coders
+TASK_UTILS = Registry(
+    'task util', parent=MMENGINE_TASK_UTILS, locations=['mmyolo.models'])
+
+# manage visualizer
+VISUALIZERS = Registry(
+    'visualizer', parent=MMENGINE_VISUALIZERS, locations=['mmyolo.utils'])
+# manage visualizer backend
+VISBACKENDS = Registry(
+    'vis_backend', parent=MMENGINE_VISBACKENDS, locations=['mmyolo.utils'])
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/testing/__init__.py b/mmdetection_practice/third_party/mmyolo/mmyolo/testing/__init__.py
new file mode 100644
index 0000000..b6d7a01
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/testing/__init__.py
@@ -0,0 +1,4 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from ._utils import get_detector_cfg
+
+__all__ = ['get_detector_cfg']
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/testing/_utils.py b/mmdetection_practice/third_party/mmyolo/mmyolo/testing/_utils.py
new file mode 100644
index 0000000..9ccf2fe
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/testing/_utils.py
@@ -0,0 +1,53 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+import copy
+from os.path import dirname, exists, join
+
+import numpy as np
+from mmengine.config import Config
+
+
+def _get_config_directory():
+    """Find the predefined detector config directory."""
+    try:
+        # Assume we are running in the source mmyolo repo
+        repo_dpath = dirname(dirname(dirname(__file__)))
+    except NameError:
+        # For IPython development when this __file__ is not defined
+        import mmyolo
+        repo_dpath = dirname(dirname(mmyolo.__file__))
+    config_dpath = join(repo_dpath, 'configs')
+    if not exists(config_dpath):
+        raise Exception('Cannot find config path')
+    return config_dpath
+
+
+def _get_config_module(fname):
+    """Load a configuration as a python module."""
+    config_dpath = _get_config_directory()
+    config_fpath = join(config_dpath, fname)
+    config_mod = Config.fromfile(config_fpath)
+    return config_mod
+
+
+def get_detector_cfg(fname):
+    """Grab configs necessary to create a detector.
+
+    These are deep copied to allow for safe modification of parameters without
+    influencing other tests.
+    """
+    config = _get_config_module(fname)
+    model = copy.deepcopy(config.model)
+    return model
+
+
+def _rand_bboxes(rng, num_boxes, w, h):
+    """Randomly generate a specified number of bboxes."""
+    cx, cy, bw, bh = rng.rand(num_boxes, 4).T
+
+    tl_x = ((cx * w) - (w * bw / 2)).clip(0, w)
+    tl_y = ((cy * h) - (h * bh / 2)).clip(0, h)
+    br_x = ((cx * w) + (w * bw / 2)).clip(0, w)
+    br_y = ((cy * h) + (h * bh / 2)).clip(0, h)
+
+    bboxes = np.vstack([tl_x, tl_y, br_x, br_y]).T
+    return bboxes
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/utils/__init__.py b/mmdetection_practice/third_party/mmyolo/mmyolo/utils/__init__.py
new file mode 100644
index 0000000..f4e9684
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/utils/__init__.py
@@ -0,0 +1,9 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from .collect_env import collect_env
+from .misc import is_metainfo_lower, switch_to_deploy
+from .setup_env import register_all_modules
+
+__all__ = [
+    'register_all_modules', 'collect_env', 'switch_to_deploy',
+    'is_metainfo_lower'
+]
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/utils/boxam_utils.py b/mmdetection_practice/third_party/mmyolo/mmyolo/utils/boxam_utils.py
new file mode 100644
index 0000000..50d6c09
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/utils/boxam_utils.py
@@ -0,0 +1,517 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+import bisect
+import copy
+import warnings
+from pathlib import Path
+from typing import Callable, List, Optional, Tuple, Union
+
+import cv2
+import numpy as np
+import torch
+import torch.nn as nn
+import torchvision
+from mmcv.transforms import Compose
+from mmdet.evaluation import get_classes
+from mmdet.utils import ConfigType
+from mmengine.config import Config
+from mmengine.registry import init_default_scope
+from mmengine.runner import load_checkpoint
+from mmengine.structures import InstanceData
+from torch import Tensor
+
+from mmyolo.registry import MODELS
+
+try:
+    from pytorch_grad_cam import (AblationCAM, AblationLayer,
+                                  ActivationsAndGradients)
+    from pytorch_grad_cam import GradCAM as Base_GradCAM
+    from pytorch_grad_cam import GradCAMPlusPlus as Base_GradCAMPlusPlus
+    from pytorch_grad_cam.base_cam import BaseCAM
+    from pytorch_grad_cam.utils.image import scale_cam_image, show_cam_on_image
+    from pytorch_grad_cam.utils.svd_on_activations import get_2d_projection
+except ImportError:
+    pass
+
+
+def init_detector(
+    config: Union[str, Path, Config],
+    checkpoint: Optional[str] = None,
+    palette: str = 'coco',
+    device: str = 'cuda:0',
+    cfg_options: Optional[dict] = None,
+) -> nn.Module:
+    """Initialize a detector from config file.
+
+    Args:
+        config (str, :obj:`Path`, or :obj:`mmengine.Config`): Config file path,
+            :obj:`Path`, or the config object.
+        checkpoint (str, optional): Checkpoint path. If left as None, the model
+            will not load any weights.
+        palette (str): Color palette used for visualization. If palette
+            is stored in checkpoint, use checkpoint's palette first, otherwise
+            use externally passed palette. Currently, supports 'coco', 'voc',
+            'citys' and 'random'. Defaults to coco.
+        device (str): The device where the anchors will be put on.
+            Defaults to cuda:0.
+        cfg_options (dict, optional): Options to override some settings in
+            the used config.
+
+    Returns:
+        nn.Module: The constructed detector.
+    """
+    if isinstance(config, (str, Path)):
+        config = Config.fromfile(config)
+    elif not isinstance(config, Config):
+        raise TypeError('config must be a filename or Config object, '
+                        f'but got {type(config)}')
+    if cfg_options is not None:
+        config.merge_from_dict(cfg_options)
+    elif 'init_cfg' in config.model.backbone:
+        config.model.backbone.init_cfg = None
+
+    # only change this
+    # grad based method requires train_cfg
+    # config.model.train_cfg = None
+    init_default_scope(config.get('default_scope', 'mmyolo'))
+
+    model = MODELS.build(config.model)
+    if checkpoint is not None:
+        checkpoint = load_checkpoint(model, checkpoint, map_location='cpu')
+        # Weights converted from elsewhere may not have meta fields.
+        checkpoint_meta = checkpoint.get('meta', {})
+        # save the dataset_meta in the model for convenience
+        if 'dataset_meta' in checkpoint_meta:
+            # mmdet 3.x, all keys should be lowercase
+            model.dataset_meta = {
+                k.lower(): v
+                for k, v in checkpoint_meta['dataset_meta'].items()
+            }
+        elif 'CLASSES' in checkpoint_meta:
+            # < mmdet 3.x
+            classes = checkpoint_meta['CLASSES']
+            model.dataset_meta = {'classes': classes, 'palette': palette}
+        else:
+            warnings.simplefilter('once')
+            warnings.warn(
+                'dataset_meta or class names are not saved in the '
+                'checkpoint\'s meta data, use COCO classes by default.')
+            model.dataset_meta = {
+                'classes': get_classes('coco'),
+                'palette': palette
+            }
+
+    model.cfg = config  # save the config in the model for convenience
+    model.to(device)
+    model.eval()
+    return model
+
+
+def reshape_transform(feats: Union[Tensor, List[Tensor]],
+                      max_shape: Tuple[int, int] = (20, 20),
+                      is_need_grad: bool = False):
+    """Reshape and aggregate feature maps when the input is a multi-layer
+    feature map.
+
+    Takes these tensors with different sizes, resizes them to a common shape,
+    and concatenates them.
+    """
+    if len(max_shape) == 1:
+        max_shape = max_shape * 2
+
+    if isinstance(feats, torch.Tensor):
+        feats = [feats]
+    else:
+        if is_need_grad:
+            raise NotImplementedError('The `grad_base` method does not '
+                                      'support output multi-activation layers')
+
+    max_h = max([im.shape[-2] for im in feats])
+    max_w = max([im.shape[-1] for im in feats])
+    if -1 in max_shape:
+        max_shape = (max_h, max_w)
+    else:
+        max_shape = (min(max_h, max_shape[0]), min(max_w, max_shape[1]))
+
+    activations = []
+    for feat in feats:
+        activations.append(
+            torch.nn.functional.interpolate(
+                torch.abs(feat), max_shape, mode='bilinear'))
+
+    activations = torch.cat(activations, axis=1)
+    return activations
+
+
+class BoxAMDetectorWrapper(nn.Module):
+    """Wrap the mmdet model class to facilitate handling of non-tensor
+    situations during inference."""
+
+    def __init__(self,
+                 cfg: ConfigType,
+                 checkpoint: str,
+                 score_thr: float,
+                 device: str = 'cuda:0'):
+        super().__init__()
+        self.cfg = cfg
+        self.device = device
+        self.score_thr = score_thr
+        self.checkpoint = checkpoint
+        self.detector = init_detector(self.cfg, self.checkpoint, device=device)
+
+        pipeline_cfg = copy.deepcopy(self.cfg.test_dataloader.dataset.pipeline)
+        pipeline_cfg[0].type = 'mmdet.LoadImageFromNDArray'
+
+        new_test_pipeline = []
+        for pipeline in pipeline_cfg:
+            if not pipeline['type'].endswith('LoadAnnotations'):
+                new_test_pipeline.append(pipeline)
+        self.test_pipeline = Compose(new_test_pipeline)
+
+        self.is_need_loss = False
+        self.input_data = None
+        self.image = None
+
+    def need_loss(self, is_need_loss: bool):
+        """Grad-based methods require loss."""
+        self.is_need_loss = is_need_loss
+
+    def set_input_data(self,
+                       image: np.ndarray,
+                       pred_instances: Optional[InstanceData] = None):
+        """Set the input data to be used in the next step."""
+        self.image = image
+
+        if self.is_need_loss:
+            assert pred_instances is not None
+            pred_instances = pred_instances.numpy()
+            data = dict(
+                img=self.image,
+                img_id=0,
+                gt_bboxes=pred_instances.bboxes,
+                gt_bboxes_labels=pred_instances.labels)
+            data = self.test_pipeline(data)
+        else:
+            data = dict(img=self.image, img_id=0)
+            data = self.test_pipeline(data)
+            data['inputs'] = [data['inputs']]
+            data['data_samples'] = [data['data_samples']]
+        self.input_data = data
+
+    def __call__(self, *args, **kwargs):
+        assert self.input_data is not None
+        if self.is_need_loss:
+            # Maybe this is a direction that can be optimized
+            # self.detector.init_weights()
+            if hasattr(self.detector.bbox_head, 'head_module'):
+                self.detector.bbox_head.head_module.training = True
+            else:
+                self.detector.bbox_head.training = True
+            if hasattr(self.detector.bbox_head, 'featmap_sizes'):
+                # Prevent the model algorithm error when calculating loss
+                self.detector.bbox_head.featmap_sizes = None
+
+            data_ = {}
+            data_['inputs'] = [self.input_data['inputs']]
+            data_['data_samples'] = [self.input_data['data_samples']]
+            data = self.detector.data_preprocessor(data_, training=False)
+            loss = self.detector._run_forward(data, mode='loss')
+
+            if hasattr(self.detector.bbox_head, 'featmap_sizes'):
+                self.detector.bbox_head.featmap_sizes = None
+
+            return [loss]
+        else:
+            if hasattr(self.detector.bbox_head, 'head_module'):
+                self.detector.bbox_head.head_module.training = False
+            else:
+                self.detector.bbox_head.training = False
+            with torch.no_grad():
+                results = self.detector.test_step(self.input_data)
+                return results
+
+
+class BoxAMDetectorVisualizer:
+    """Box AM visualization class."""
+
+    def __init__(self,
+                 method_class,
+                 model: nn.Module,
+                 target_layers: List,
+                 reshape_transform: Optional[Callable] = None,
+                 is_need_grad: bool = False,
+                 extra_params: Optional[dict] = None):
+        self.target_layers = target_layers
+        self.reshape_transform = reshape_transform
+        self.is_need_grad = is_need_grad
+
+        if method_class.__name__ == 'AblationCAM':
+            batch_size = extra_params.get('batch_size', 1)
+            ratio_channels_to_ablate = extra_params.get(
+                'ratio_channels_to_ablate', 1.)
+            self.cam = AblationCAM(
+                model,
+                target_layers,
+                use_cuda=True if 'cuda' in model.device else False,
+                reshape_transform=reshape_transform,
+                batch_size=batch_size,
+                ablation_layer=extra_params['ablation_layer'],
+                ratio_channels_to_ablate=ratio_channels_to_ablate)
+        else:
+            self.cam = method_class(
+                model,
+                target_layers,
+                use_cuda=True if 'cuda' in model.device else False,
+                reshape_transform=reshape_transform,
+            )
+            if self.is_need_grad:
+                self.cam.activations_and_grads.release()
+
+        self.classes = model.detector.dataset_meta['classes']
+        self.COLORS = np.random.uniform(0, 255, size=(len(self.classes), 3))
+
+    def switch_activations_and_grads(self, model) -> None:
+        """In the grad-based method, we need to switch
+        ``ActivationsAndGradients`` layer, otherwise an error will occur."""
+        self.cam.model = model
+
+        if self.is_need_grad is True:
+            self.cam.activations_and_grads = ActivationsAndGradients(
+                model, self.target_layers, self.reshape_transform)
+            self.is_need_grad = False
+        else:
+            self.cam.activations_and_grads.release()
+            self.is_need_grad = True
+
+    def __call__(self, img, targets, aug_smooth=False, eigen_smooth=False):
+        img = torch.from_numpy(img)[None].permute(0, 3, 1, 2)
+        return self.cam(img, targets, aug_smooth, eigen_smooth)[0, :]
+
+    def show_am(self,
+                image: np.ndarray,
+                pred_instance: InstanceData,
+                grayscale_am: np.ndarray,
+                with_norm_in_bboxes: bool = False):
+        """Normalize the AM to be in the range [0, 1] inside every bounding
+        boxes, and zero outside of the bounding boxes."""
+
+        boxes = pred_instance.bboxes
+        labels = pred_instance.labels
+
+        if with_norm_in_bboxes is True:
+            boxes = boxes.astype(np.int32)
+            renormalized_am = np.zeros(grayscale_am.shape, dtype=np.float32)
+            images = []
+            for x1, y1, x2, y2 in boxes:
+                img = renormalized_am * 0
+                img[y1:y2, x1:x2] = scale_cam_image(
+                    [grayscale_am[y1:y2, x1:x2].copy()])[0]
+                images.append(img)
+
+            renormalized_am = np.max(np.float32(images), axis=0)
+            renormalized_am = scale_cam_image([renormalized_am])[0]
+        else:
+            renormalized_am = grayscale_am
+
+        am_image_renormalized = show_cam_on_image(
+            image / 255, renormalized_am, use_rgb=False)
+
+        image_with_bounding_boxes = self._draw_boxes(
+            boxes, labels, am_image_renormalized, pred_instance.get('scores'))
+        return image_with_bounding_boxes
+
+    def _draw_boxes(self,
+                    boxes: List,
+                    labels: List,
+                    image: np.ndarray,
+                    scores: Optional[List] = None):
+        """draw boxes on image."""
+        for i, box in enumerate(boxes):
+            label = labels[i]
+            color = self.COLORS[label]
+            cv2.rectangle(image, (int(box[0]), int(box[1])),
+                          (int(box[2]), int(box[3])), color, 2)
+            if scores is not None:
+                score = scores[i]
+                text = str(self.classes[label]) + ': ' + str(
+                    round(score * 100, 1))
+            else:
+                text = self.classes[label]
+
+            cv2.putText(
+                image,
+                text, (int(box[0]), int(box[1] - 5)),
+                cv2.FONT_HERSHEY_SIMPLEX,
+                0.5,
+                color,
+                1,
+                lineType=cv2.LINE_AA)
+        return image
+
+
+class DetAblationLayer(AblationLayer):
+    """Det AblationLayer."""
+
+    def __init__(self):
+        super().__init__()
+        self.activations = None
+
+    def set_next_batch(self, input_batch_index, activations,
+                       num_channels_to_ablate):
+        """Extract the next batch member from activations, and repeat it
+        num_channels_to_ablate times."""
+        if isinstance(activations, torch.Tensor):
+            return super().set_next_batch(input_batch_index, activations,
+                                          num_channels_to_ablate)
+
+        self.activations = []
+        for activation in activations:
+            activation = activation[
+                input_batch_index, :, :, :].clone().unsqueeze(0)
+            self.activations.append(
+                activation.repeat(num_channels_to_ablate, 1, 1, 1))
+
+    def __call__(self, x):
+        """Go over the activation indices to be ablated, stored in
+        self.indices."""
+        result = self.activations
+
+        if isinstance(result, torch.Tensor):
+            return super().__call__(x)
+
+        channel_cumsum = np.cumsum([r.shape[1] for r in result])
+        num_channels_to_ablate = result[0].size(0)  # batch
+        for i in range(num_channels_to_ablate):
+            pyramid_layer = bisect.bisect_right(channel_cumsum,
+                                                self.indices[i])
+            if pyramid_layer > 0:
+                index_in_pyramid_layer = self.indices[i] - channel_cumsum[
+                    pyramid_layer - 1]
+            else:
+                index_in_pyramid_layer = self.indices[i]
+            result[pyramid_layer][i, index_in_pyramid_layer, :, :] = -1000
+        return result
+
+
+class DetBoxScoreTarget:
+    """Det Score calculation class.
+
+    In the case of the grad-free method, the calculation method is that
+    for every original detected bounding box specified in "bboxes",
+    assign a score on how the current bounding boxes match it,
+
+        1. In Bbox IoU
+        2. In the classification score.
+        3. In Mask IoU if ``segms`` exist.
+
+    If there is not a large enough overlap, or the category changed,
+    assign a score of 0. The total score is the sum of all the box scores.
+
+    In the case of the grad-based method, the calculation method is
+    the sum of losses after excluding a specific key.
+    """
+
+    def __init__(self,
+                 pred_instance: InstanceData,
+                 match_iou_thr: float = 0.5,
+                 device: str = 'cuda:0',
+                 ignore_loss_params: Optional[List] = None):
+        self.focal_bboxes = pred_instance.bboxes
+        self.focal_labels = pred_instance.labels
+        self.match_iou_thr = match_iou_thr
+        self.device = device
+        self.ignore_loss_params = ignore_loss_params
+        if ignore_loss_params is not None:
+            assert isinstance(self.ignore_loss_params, list)
+
+    def __call__(self, results):
+        output = torch.tensor([0.], device=self.device)
+
+        if 'loss_cls' in results:
+            # grad-based method
+            # results is dict
+            for loss_key, loss_value in results.items():
+                if 'loss' not in loss_key or \
+                        loss_key in self.ignore_loss_params:
+                    continue
+                if isinstance(loss_value, list):
+                    output += sum(loss_value)
+                else:
+                    output += loss_value
+            return output
+        else:
+            # grad-free method
+            # results is DetDataSample
+            pred_instances = results.pred_instances
+            if len(pred_instances) == 0:
+                return output
+
+            pred_bboxes = pred_instances.bboxes
+            pred_scores = pred_instances.scores
+            pred_labels = pred_instances.labels
+
+            for focal_box, focal_label in zip(self.focal_bboxes,
+                                              self.focal_labels):
+                ious = torchvision.ops.box_iou(focal_box[None],
+                                               pred_bboxes[..., :4])
+                index = ious.argmax()
+                if ious[0, index] > self.match_iou_thr and pred_labels[
+                        index] == focal_label:
+                    # TODO: Adaptive adjustment of weights based on algorithms
+                    score = ious[0, index] + pred_scores[index]
+                    output = output + score
+            return output
+
+
+class SpatialBaseCAM(BaseCAM):
+    """CAM that maintains spatial information.
+
+    Gradients are often averaged over the spatial dimension in CAM
+    visualization for classification, but this is unreasonable in detection
+    tasks. There is no need to average the gradients in the detection task.
+    """
+
+    def get_cam_image(self,
+                      input_tensor: torch.Tensor,
+                      target_layer: torch.nn.Module,
+                      targets: List[torch.nn.Module],
+                      activations: torch.Tensor,
+                      grads: torch.Tensor,
+                      eigen_smooth: bool = False) -> np.ndarray:
+
+        weights = self.get_cam_weights(input_tensor, target_layer, targets,
+                                       activations, grads)
+        weighted_activations = weights * activations
+        if eigen_smooth:
+            cam = get_2d_projection(weighted_activations)
+        else:
+            cam = weighted_activations.sum(axis=1)
+        return cam
+
+
+class GradCAM(SpatialBaseCAM, Base_GradCAM):
+    """Gradients are no longer averaged over the spatial dimension."""
+
+    def get_cam_weights(self, input_tensor, target_layer, target_category,
+                        activations, grads):
+        return grads
+
+
+class GradCAMPlusPlus(SpatialBaseCAM, Base_GradCAMPlusPlus):
+    """Gradients are no longer averaged over the spatial dimension."""
+
+    def get_cam_weights(self, input_tensor, target_layers, target_category,
+                        activations, grads):
+        grads_power_2 = grads**2
+        grads_power_3 = grads_power_2 * grads
+        # Equation 19 in https://arxiv.org/abs/1710.11063
+        sum_activations = np.sum(activations, axis=(2, 3))
+        eps = 0.000001
+        aij = grads_power_2 / (
+            2 * grads_power_2 +
+            sum_activations[:, :, None, None] * grads_power_3 + eps)
+        # Now bring back the ReLU from eq.7 in the paper,
+        # And zero out aijs where the activations are 0
+        aij = np.where(grads != 0, aij, 0)
+
+        weights = np.maximum(grads, 0) * aij
+        return weights
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/utils/collect_env.py b/mmdetection_practice/third_party/mmyolo/mmyolo/utils/collect_env.py
new file mode 100644
index 0000000..89bad65
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/utils/collect_env.py
@@ -0,0 +1,21 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+import mmcv
+import mmdet
+from mmengine.utils import get_git_hash
+from mmengine.utils.dl_utils import collect_env as collect_base_env
+
+import mmyolo
+
+
+def collect_env() -> dict:
+    """Collect the information of the running environments."""
+    env_info = collect_base_env()
+    env_info['MMCV'] = mmcv.__version__
+    env_info['MMDetection'] = mmdet.__version__
+    env_info['MMYOLO'] = mmyolo.__version__ + '+' + get_git_hash()[:7]
+    return env_info
+
+
+if __name__ == '__main__':
+    for name, val in collect_env().items():
+        print(f'{name}: {val}')
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/utils/labelme_utils.py b/mmdetection_practice/third_party/mmyolo/mmyolo/utils/labelme_utils.py
new file mode 100644
index 0000000..0981919
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/utils/labelme_utils.py
@@ -0,0 +1,92 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+import json
+import os.path
+
+from mmengine.structures import InstanceData
+
+
+class LabelmeFormat:
+    """Predict results save into labelme file.
+
+    Base on https://github.com/wkentaro/labelme/blob/main/labelme/label_file.py
+
+    Args:
+        classes (tuple): Model classes name.
+    """
+
+    def __init__(self, classes: tuple):
+        super().__init__()
+        self.classes = classes
+
+    def __call__(self, pred_instances: InstanceData, metainfo: dict,
+                 output_path: str, selected_classes: list):
+        """Get image data field for labelme.
+
+        Args:
+            pred_instances (InstanceData): Candidate prediction info.
+            metainfo (dict): Meta info of prediction.
+            output_path (str): Image file path.
+            selected_classes (list): Selected class name.
+
+        Labelme file eg.
+            {
+              "version": "5.1.1",
+              "flags": {},
+              "imagePath": "/data/cat/1.jpg",
+              "imageData": null,
+              "imageHeight": 3000,
+              "imageWidth": 4000,
+              "shapes": [
+                {
+                  "label": "cat",
+                  "points": [
+                    [
+                      1148.076923076923,
+                      1188.4615384615383
+                    ],
+                    [
+                      2471.1538461538457,
+                      2176.923076923077
+                    ]
+                  ],
+                  "group_id": null,
+                  "shape_type": "rectangle",
+                  "flags": {}
+                },
+                {...}
+              ]
+            }
+        """
+
+        image_path = os.path.abspath(metainfo['img_path'])
+
+        json_info = {
+            'version': '5.1.1',
+            'flags': {},
+            'imagePath': image_path,
+            'imageData': None,
+            'imageHeight': metainfo['ori_shape'][0],
+            'imageWidth': metainfo['ori_shape'][1],
+            'shapes': []
+        }
+
+        for pred_instance in pred_instances:
+            pred_bbox = pred_instance.bboxes.cpu().numpy().tolist()[0]
+            pred_label = self.classes[pred_instance.labels]
+
+            if selected_classes is not None and \
+                    pred_label not in selected_classes:
+                # filter class name
+                continue
+
+            sub_dict = {
+                'label': pred_label,
+                'points': [pred_bbox[:2], pred_bbox[2:]],
+                'group_id': None,
+                'shape_type': 'rectangle',
+                'flags': {}
+            }
+            json_info['shapes'].append(sub_dict)
+
+        with open(output_path, 'w', encoding='utf-8') as f_json:
+            json.dump(json_info, f_json, ensure_ascii=False, indent=2)
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/utils/large_image.py b/mmdetection_practice/third_party/mmyolo/mmyolo/utils/large_image.py
new file mode 100644
index 0000000..8670804
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/utils/large_image.py
@@ -0,0 +1,103 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from typing import Sequence, Tuple
+
+import torch
+from mmcv.ops import batched_nms
+from mmdet.structures import DetDataSample, SampleList
+from mmengine.structures import InstanceData
+
+
+def shift_rbboxes(bboxes: torch.Tensor, offset: Sequence[int]):
+    """Shift rotated bboxes with offset.
+
+    Args:
+        bboxes (Tensor): The rotated bboxes need to be translated.
+            With shape (n, 5), which means (x, y, w, h, a).
+        offset (Sequence[int]): The translation offsets with shape of (2, ).
+    Returns:
+        Tensor: Shifted rotated bboxes.
+    """
+    offset_tensor = bboxes.new_tensor(offset)
+    shifted_bboxes = bboxes.clone()
+    shifted_bboxes[:, 0:2] = shifted_bboxes[:, 0:2] + offset_tensor
+    return shifted_bboxes
+
+
+def shift_predictions(det_data_samples: SampleList,
+                      offsets: Sequence[Tuple[int, int]],
+                      src_image_shape: Tuple[int, int]) -> SampleList:
+    """Shift predictions to the original image.
+
+    Args:
+        det_data_samples (List[:obj:`DetDataSample`]): A list of patch results.
+        offsets (Sequence[Tuple[int, int]]): Positions of the left top points
+            of patches.
+        src_image_shape (Tuple[int, int]): A (height, width) tuple of the large
+            image's width and height.
+    Returns:
+        (List[:obj:`DetDataSample`]): shifted results.
+    """
+    try:
+        from sahi.slicing import shift_bboxes, shift_masks
+    except ImportError:
+        raise ImportError('Please run "pip install -U sahi" '
+                          'to install sahi first for large image inference.')
+
+    assert len(det_data_samples) == len(
+        offsets), 'The `results` should has the ' 'same length with `offsets`.'
+    shifted_predictions = []
+    for det_data_sample, offset in zip(det_data_samples, offsets):
+        pred_inst = det_data_sample.pred_instances.clone()
+
+        # Check bbox type
+        if pred_inst.bboxes.size(-1) == 4:
+            # Horizontal bboxes
+            shifted_bboxes = shift_bboxes(pred_inst.bboxes, offset)
+        elif pred_inst.bboxes.size(-1) == 5:
+            # Rotated bboxes
+            shifted_bboxes = shift_rbboxes(pred_inst.bboxes, offset)
+        else:
+            raise NotImplementedError
+
+        # shift bboxes and masks
+        pred_inst.bboxes = shifted_bboxes
+        if 'masks' in det_data_sample:
+            pred_inst.masks = shift_masks(pred_inst.masks, offset,
+                                          src_image_shape)
+
+        shifted_predictions.append(pred_inst.clone())
+
+    shifted_predictions = InstanceData.cat(shifted_predictions)
+
+    return shifted_predictions
+
+
+def merge_results_by_nms(results: SampleList, offsets: Sequence[Tuple[int,
+                                                                      int]],
+                         src_image_shape: Tuple[int, int],
+                         nms_cfg: dict) -> DetDataSample:
+    """Merge patch results by nms.
+
+    Args:
+        results (List[:obj:`DetDataSample`]): A list of patch results.
+        offsets (Sequence[Tuple[int, int]]): Positions of the left top points
+            of patches.
+        src_image_shape (Tuple[int, int]): A (height, width) tuple of the large
+            image's width and height.
+        nms_cfg (dict): it should specify nms type and other parameters
+            like `iou_threshold`.
+    Returns:
+        :obj:`DetDataSample`: merged results.
+    """
+    shifted_instances = shift_predictions(results, offsets, src_image_shape)
+
+    _, keeps = batched_nms(
+        boxes=shifted_instances.bboxes,
+        scores=shifted_instances.scores,
+        idxs=shifted_instances.labels,
+        nms_cfg=nms_cfg)
+    merged_instances = shifted_instances[keeps]
+
+    merged_result = results[0].clone()
+    merged_result.pred_instances = merged_instances
+    return merged_result
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/utils/misc.py b/mmdetection_practice/third_party/mmyolo/mmyolo/utils/misc.py
new file mode 100644
index 0000000..f5d366d
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/utils/misc.py
@@ -0,0 +1,135 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+import os
+import urllib
+
+import numpy as np
+import torch
+from mmengine.utils import scandir
+from prettytable import PrettyTable
+
+from mmyolo.models import RepVGGBlock
+
+IMG_EXTENSIONS = ('.jpg', '.jpeg', '.png', '.ppm', '.bmp', '.pgm', '.tif',
+                  '.tiff', '.webp')
+
+
+def switch_to_deploy(model):
+    """Model switch to deploy status."""
+    for layer in model.modules():
+        if isinstance(layer, RepVGGBlock):
+            layer.switch_to_deploy()
+
+    print('Switch model to deploy modality.')
+
+
+def auto_arrange_images(image_list: list, image_column: int = 2) -> np.ndarray:
+    """Auto arrange image to image_column x N row.
+
+    Args:
+        image_list (list): cv2 image list.
+        image_column (int): Arrange to N column. Default: 2.
+    Return:
+        (np.ndarray): image_column x N row merge image
+    """
+    img_count = len(image_list)
+    if img_count <= image_column:
+        # no need to arrange
+        image_show = np.concatenate(image_list, axis=1)
+    else:
+        # arrange image according to image_column
+        image_row = round(img_count / image_column)
+        fill_img_list = [np.ones(image_list[0].shape, dtype=np.uint8) * 255
+                         ] * (
+                             image_row * image_column - img_count)
+        image_list.extend(fill_img_list)
+        merge_imgs_col = []
+        for i in range(image_row):
+            start_col = image_column * i
+            end_col = image_column * (i + 1)
+            merge_col = np.hstack(image_list[start_col:end_col])
+            merge_imgs_col.append(merge_col)
+
+        # merge to one image
+        image_show = np.vstack(merge_imgs_col)
+
+    return image_show
+
+
+def get_file_list(source_root: str) -> [list, dict]:
+    """Get file list.
+
+    Args:
+        source_root (str): image or video source path
+
+    Return:
+        source_file_path_list (list): A list for all source file.
+        source_type (dict): Source type: file or url or dir.
+    """
+    is_dir = os.path.isdir(source_root)
+    is_url = source_root.startswith(('http:/', 'https:/'))
+    is_file = os.path.splitext(source_root)[-1].lower() in IMG_EXTENSIONS
+
+    source_file_path_list = []
+    if is_dir:
+        # when input source is dir
+        for file in scandir(
+                source_root, IMG_EXTENSIONS, recursive=True,
+                case_sensitive=False):
+            source_file_path_list.append(os.path.join(source_root, file))
+    elif is_url:
+        # when input source is url
+        filename = os.path.basename(
+            urllib.parse.unquote(source_root).split('?')[0])
+        file_save_path = os.path.join(os.getcwd(), filename)
+        print(f'Downloading source file to {file_save_path}')
+        torch.hub.download_url_to_file(source_root, file_save_path)
+        source_file_path_list = [file_save_path]
+    elif is_file:
+        # when input source is single image
+        source_file_path_list = [source_root]
+    else:
+        print('Cannot find image file.')
+
+    source_type = dict(is_dir=is_dir, is_url=is_url, is_file=is_file)
+
+    return source_file_path_list, source_type
+
+
+def show_data_classes(data_classes):
+    """When printing an error, all class names of the dataset."""
+    print('\n\nThe name of the class contained in the dataset:')
+    data_classes_info = PrettyTable()
+    data_classes_info.title = 'Information of dataset class'
+    # List Print Settings
+    # If the quantity is too large, 25 rows will be displayed in each column
+    if len(data_classes) < 25:
+        data_classes_info.add_column('Class name', data_classes)
+    elif len(data_classes) % 25 != 0 and len(data_classes) > 25:
+        col_num = int(len(data_classes) / 25) + 1
+        data_name_list = list(data_classes)
+        for i in range(0, (col_num * 25) - len(data_classes)):
+            data_name_list.append('')
+        for i in range(0, len(data_name_list), 25):
+            data_classes_info.add_column('Class name',
+                                         data_name_list[i:i + 25])
+
+    # Align display data to the left
+    data_classes_info.align['Class name'] = 'l'
+    print(data_classes_info)
+
+
+def is_metainfo_lower(cfg):
+    """Determine whether the custom metainfo fields are all lowercase."""
+
+    def judge_keys(dataloader_cfg):
+        while 'dataset' in dataloader_cfg:
+            dataloader_cfg = dataloader_cfg['dataset']
+        if 'metainfo' in dataloader_cfg:
+            all_keys = dataloader_cfg['metainfo'].keys()
+            all_is_lower = all([str(k).islower() for k in all_keys])
+            assert all_is_lower, f'The keys in dataset metainfo must be all lowercase, but got {all_keys}. ' \
+                                 f'Please refer to https://github.com/open-mmlab/mmyolo/blob/e62c8c4593/configs/yolov5/yolov5_s-v61_syncbn_fast_1xb4-300e_balloon.py#L8' # noqa
+
+    judge_keys(cfg.get('train_dataloader', {}))
+    judge_keys(cfg.get('val_dataloader', {}))
+    judge_keys(cfg.get('test_dataloader', {}))
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/utils/setup_env.py b/mmdetection_practice/third_party/mmyolo/mmyolo/utils/setup_env.py
new file mode 100644
index 0000000..f51ed92
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/utils/setup_env.py
@@ -0,0 +1,41 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+import datetime
+import warnings
+
+from mmengine import DefaultScope
+
+
+def register_all_modules(init_default_scope: bool = True):
+    """Register all modules in mmdet into the registries.
+
+    Args:
+        init_default_scope (bool): Whether initialize the mmdet default scope.
+            When `init_default_scope=True`, the global default scope will be
+            set to `mmyolo`, and all registries will build modules from mmdet's
+            registry node. To understand more about the registry, please refer
+            to https://github.com/open-mmlab/mmengine/blob/main/docs/en/tutorials/registry.md
+            Defaults to True.
+    """  # noqa
+    import mmdet.engine  # noqa: F401,F403
+    import mmdet.visualization  # noqa: F401,F403
+
+    import mmyolo.datasets  # noqa: F401,F403
+    import mmyolo.engine  # noqa: F401,F403
+    import mmyolo.models  # noqa: F401,F403
+
+    if init_default_scope:
+        never_created = DefaultScope.get_current_instance() is None \
+                        or not DefaultScope.check_instance_created('mmyolo')
+        if never_created:
+            DefaultScope.get_instance('mmyolo', scope_name='mmyolo')
+            return
+        current_scope = DefaultScope.get_current_instance()
+        if current_scope.scope_name != 'mmyolo':
+            warnings.warn('The current default scope '
+                          f'"{current_scope.scope_name}" is not "mmyolo", '
+                          '`register_all_modules` will force the current'
+                          'default scope to be "mmyolo". If this is not '
+                          'expected, please set `init_default_scope=False`.')
+            # avoid name conflict
+            new_instance_name = f'mmyolo-{datetime.datetime.now()}'
+            DefaultScope.get_instance(new_instance_name, scope_name='mmyolo')
diff --git a/mmdetection_practice/third_party/mmyolo/mmyolo/version.py b/mmdetection_practice/third_party/mmyolo/mmyolo/version.py
new file mode 100644
index 0000000..6e4f0e8
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/mmyolo/version.py
@@ -0,0 +1,23 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+
+__version__ = '0.6.0'
+
+from typing import Tuple
+
+short_version = __version__
+
+
+def parse_version_info(version_str: str) -> Tuple:
+    """Parse version info of MMYOLO."""
+    version_info = []
+    for x in version_str.split('.'):
+        if x.isdigit():
+            version_info.append(int(x))
+        elif x.find('rc') != -1:
+            patch_version = x.split('rc')
+            version_info.append(int(patch_version[0]))
+            version_info.append(f'rc{patch_version[1]}')
+    return tuple(version_info)
+
+
+version_info = parse_version_info(__version__)
diff --git a/mmdetection_practice/third_party/mmyolo/model-index.yml b/mmdetection_practice/third_party/mmyolo/model-index.yml
new file mode 100644
index 0000000..9aa0288
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/model-index.yml
@@ -0,0 +1,8 @@
+Import:
+  - configs/yolov5/metafile.yml
+  - configs/yolov6/metafile.yml
+  - configs/yolox/metafile.yml
+  - configs/rtmdet/metafile.yml
+  - configs/yolov7/metafile.yml
+  - configs/ppyoloe/metafile.yml
+  - configs/yolov8/metafile.yml
diff --git a/mmdetection_practice/third_party/mmyolo/projects/assigner_visualization/README.md b/mmdetection_practice/third_party/mmyolo/projects/assigner_visualization/README.md
new file mode 100644
index 0000000..918589f
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/projects/assigner_visualization/README.md
@@ -0,0 +1,43 @@
+# MMYOLO Model Assigner Visualization
+
+<img src="https://user-images.githubusercontent.com/40284075/208255302-dbcf8cb0-b9d1-495f-8908-57dd2370dba8.png"/>
+
+## Introduction
+
+This project is developed for easily showing assigning results. The script allows users to analyze where and how many positive samples each gt is assigned in the image.
+
+Now, the script supports `YOLOv5`, `YOLOv7`, `YOLOv8` and `RTMDet`.
+
+## Usage
+
+### Command
+
+YOLOv5 assigner visualization command:
+
+```shell
+python projects/assigner_visualization/assigner_visualization.py projects/assigner_visualization/configs/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_assignervisualization.py
+```
+
+Note: `YOLOv5` does not need to load the trained weights.
+
+YOLOv7 assigner visualization command:
+
+```shell
+python projects/assigner_visualization/assigner_visualization.py projects/assigner_visualization/configs/yolov7_tiny_syncbn_fast_8xb16-300e_coco_assignervisualization.py -c ${checkpont}
+```
+
+YOLOv8 assigner visualization command:
+
+```shell
+python projects/assigner_visualization/assigner_visualization.py projects/assigner_visualization/configs/yolov8_s_syncbn_fast_8xb16-500e_coco_assignervisualization.py  -c ${checkpont}
+```
+
+RTMdet assigner visualization command:
+
+```shell
+python projects/assigner_visualization/assigner_visualization.py projects/assigner_visualization/configs/rtmdet_s_syncbn_fast_8xb32-300e_coco_assignervisualization.py -c ${checkpont}
+```
+
+${checkpont} is the checkpont file path. Dynamic label assignment is used in `YOLOv7`, `YOLOv8` and `RTMDet`, model weights will affect the positive sample allocation results, so it is recommended to load the trained model weights.
+
+If you want to know details about label assignment, you can check the [RTMDet](https://mmyolo.readthedocs.io/zh_CN/latest/algorithm_descriptions/rtmdet_description.html#id5).
diff --git a/mmdetection_practice/third_party/mmyolo/projects/assigner_visualization/assigner_visualization.py b/mmdetection_practice/third_party/mmyolo/projects/assigner_visualization/assigner_visualization.py
new file mode 100644
index 0000000..e290d26
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/projects/assigner_visualization/assigner_visualization.py
@@ -0,0 +1,177 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+import argparse
+import os
+import os.path as osp
+import sys
+import warnings
+
+import mmcv
+import numpy as np
+import torch
+from mmengine import ProgressBar
+from mmengine.config import Config, DictAction
+from mmengine.dataset import COLLATE_FUNCTIONS
+from mmengine.runner.checkpoint import load_checkpoint
+from numpy import random
+
+from mmyolo.registry import DATASETS, MODELS
+from mmyolo.utils import register_all_modules
+from projects.assigner_visualization.dense_heads import (RTMHeadAssigner,
+                                                         YOLOv5HeadAssigner,
+                                                         YOLOv7HeadAssigner,
+                                                         YOLOv8HeadAssigner)
+from projects.assigner_visualization.visualization import \
+    YOLOAssignerVisualizer
+
+
+def parse_args():
+    parser = argparse.ArgumentParser(
+        description='MMYOLO show the positive sample assigning'
+        ' results.')
+    parser.add_argument('config', help='config file path')
+    parser.add_argument('--checkpoint', '-c', type=str, help='checkpoint file')
+    parser.add_argument(
+        '--show-number',
+        '-n',
+        type=int,
+        default=sys.maxsize,
+        help='number of images selected to save, '
+        'must bigger than 0. if the number is bigger than length '
+        'of dataset, show all the images in dataset; '
+        'default "sys.maxsize", show all images in dataset')
+    parser.add_argument(
+        '--output-dir',
+        default='assigned_results',
+        type=str,
+        help='The name of the folder where the image is saved.')
+    parser.add_argument(
+        '--device', default='cuda:0', help='Device used for inference.')
+    parser.add_argument(
+        '--show-prior',
+        default=False,
+        action='store_true',
+        help='Whether to show prior on image.')
+    parser.add_argument(
+        '--not-show-label',
+        default=False,
+        action='store_true',
+        help='Whether to show label on image.')
+    parser.add_argument('--seed', default=-1, type=int, help='random seed')
+    parser.add_argument(
+        '--cfg-options',
+        nargs='+',
+        action=DictAction,
+        help='override some settings in the used config, the key-value pair '
+        'in xxx=yyy format will be merged into config file. If the value to '
+        'be overwritten is a list, it should be like key="[a,b]" or key=a,b '
+        'It also allows nested list/tuple values, e.g. key="[(a,b),(c,d)]" '
+        'Note that the quotation marks are necessary and that no white space '
+        'is allowed.')
+
+    args = parser.parse_args()
+    return args
+
+
+def main():
+    args = parse_args()
+    register_all_modules()
+
+    # set random seed
+    seed = int(args.seed)
+    if seed != -1:
+        print(f'Set the global seed: {seed}')
+        random.seed(int(args.seed))
+
+    cfg = Config.fromfile(args.config)
+    if args.cfg_options is not None:
+        cfg.merge_from_dict(args.cfg_options)
+
+    # build model
+    model = MODELS.build(cfg.model)
+    if args.checkpoint is not None:
+        load_checkpoint(model, args.checkpoint)
+    elif isinstance(model.bbox_head, (YOLOv7HeadAssigner, RTMHeadAssigner)):
+        warnings.warn(
+            'if you use dynamic_assignment methods such as YOLOv7 or '
+            'YOLOv8 or RTMDet assigner, please load the checkpoint.')
+    assert isinstance(model.bbox_head, (YOLOv5HeadAssigner,
+                                        YOLOv7HeadAssigner,
+                                        YOLOv8HeadAssigner,
+                                        RTMHeadAssigner)), \
+        'Now, this script only support YOLOv5, YOLOv7, YOLOv8 and RTMdet, ' \
+        'and bbox_head must use ' \
+        '`YOLOv5HeadAssigner or YOLOv7HeadAssigne or YOLOv8HeadAssigner ' \
+        'or RTMHeadAssigner`. Please use `' \
+        'yolov5_s-v61_syncbn_fast_8xb16-300e_coco_assignervisualization.py' \
+        'or yolov7_tiny_syncbn_fast_8x16b-300e_coco_assignervisualization.py' \
+        'or yolov8_s_syncbn_fast_8xb16-500e_coco_assignervisualization.py' \
+        'or rtmdet_s_syncbn_fast_8xb32-300e_coco_assignervisualization.py' \
+        """` as config file."""
+    model.eval()
+    model.to(args.device)
+
+    # build dataset
+    dataset_cfg = cfg.get('train_dataloader').get('dataset')
+    dataset = DATASETS.build(dataset_cfg)
+
+    # get collate_fn
+    collate_fn_cfg = cfg.get('train_dataloader').pop(
+        'collate_fn', dict(type='pseudo_collate'))
+    collate_fn_type = collate_fn_cfg.pop('type')
+    collate_fn = COLLATE_FUNCTIONS.get(collate_fn_type)
+
+    # init visualizer
+    visualizer = YOLOAssignerVisualizer(
+        vis_backends=[{
+            'type': 'LocalVisBackend'
+        }], name='visualizer')
+    visualizer.dataset_meta = dataset.metainfo
+    # need priors size to draw priors
+
+    if hasattr(model.bbox_head.prior_generator, 'base_anchors'):
+        visualizer.priors_size = model.bbox_head.prior_generator.base_anchors
+
+    # make output dir
+    os.makedirs(args.output_dir, exist_ok=True)
+    print('Results will save to ', args.output_dir)
+
+    # init visualization image number
+    assert args.show_number > 0
+    display_number = min(args.show_number, len(dataset))
+
+    progress_bar = ProgressBar(display_number)
+    for ind_img in range(display_number):
+        data = dataset.prepare_data(ind_img)
+        if data is None:
+            print('Unable to visualize {} due to strong data augmentations'.
+                  format(dataset[ind_img]['data_samples'].img_path))
+            continue
+        # convert data to batch format
+        batch_data = collate_fn([data])
+        with torch.no_grad():
+            assign_results = model.assign(batch_data)
+
+        img = data['inputs'].cpu().numpy().astype(np.uint8).transpose(
+            (1, 2, 0))
+        # bgr2rgb
+        img = mmcv.bgr2rgb(img)
+
+        gt_instances = data['data_samples'].gt_instances
+
+        img_show = visualizer.draw_assign(img, assign_results, gt_instances,
+                                          args.show_prior, args.not_show_label)
+
+        if hasattr(data['data_samples'], 'img_path'):
+            filename = osp.basename(data['data_samples'].img_path)
+        else:
+            # some dataset have not image path
+            filename = f'{ind_img}.jpg'
+        out_file = osp.join(args.output_dir, filename)
+
+        # convert rgb 2 bgr and save img
+        mmcv.imwrite(mmcv.rgb2bgr(img_show), out_file)
+        progress_bar.update()
+
+
+if __name__ == '__main__':
+    main()
diff --git a/mmdetection_practice/third_party/mmyolo/projects/assigner_visualization/configs/rtmdet_s_syncbn_fast_8xb32-300e_coco_assignervisualization.py b/mmdetection_practice/third_party/mmyolo/projects/assigner_visualization/configs/rtmdet_s_syncbn_fast_8xb32-300e_coco_assignervisualization.py
new file mode 100644
index 0000000..006502e
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/projects/assigner_visualization/configs/rtmdet_s_syncbn_fast_8xb32-300e_coco_assignervisualization.py
@@ -0,0 +1,9 @@
+_base_ = ['../../../configs/rtmdet/rtmdet_s_syncbn_fast_8xb32-300e_coco.py']
+
+custom_imports = dict(imports=[
+    'projects.assigner_visualization.detectors',
+    'projects.assigner_visualization.dense_heads'
+])
+
+model = dict(
+    type='YOLODetectorAssigner', bbox_head=dict(type='RTMHeadAssigner'))
diff --git a/mmdetection_practice/third_party/mmyolo/projects/assigner_visualization/configs/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_assignervisualization.py b/mmdetection_practice/third_party/mmyolo/projects/assigner_visualization/configs/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_assignervisualization.py
new file mode 100644
index 0000000..1db799b
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/projects/assigner_visualization/configs/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_assignervisualization.py
@@ -0,0 +1,11 @@
+_base_ = [
+    '../../../configs/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py'
+]
+
+custom_imports = dict(imports=[
+    'projects.assigner_visualization.detectors',
+    'projects.assigner_visualization.dense_heads'
+])
+
+model = dict(
+    type='YOLODetectorAssigner', bbox_head=dict(type='YOLOv5HeadAssigner'))
diff --git a/mmdetection_practice/third_party/mmyolo/projects/assigner_visualization/configs/yolov7_tiny_syncbn_fast_8xb16-300e_coco_assignervisualization.py b/mmdetection_practice/third_party/mmyolo/projects/assigner_visualization/configs/yolov7_tiny_syncbn_fast_8xb16-300e_coco_assignervisualization.py
new file mode 100644
index 0000000..626dc18
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/projects/assigner_visualization/configs/yolov7_tiny_syncbn_fast_8xb16-300e_coco_assignervisualization.py
@@ -0,0 +1,9 @@
+_base_ = ['../../../configs/yolov7/yolov7_tiny_syncbn_fast_8x16b-300e_coco.py']
+
+custom_imports = dict(imports=[
+    'projects.assigner_visualization.detectors',
+    'projects.assigner_visualization.dense_heads'
+])
+
+model = dict(
+    type='YOLODetectorAssigner', bbox_head=dict(type='YOLOv7HeadAssigner'))
diff --git a/mmdetection_practice/third_party/mmyolo/projects/assigner_visualization/configs/yolov8_s_syncbn_fast_8xb16-500e_coco_assignervisualization.py b/mmdetection_practice/third_party/mmyolo/projects/assigner_visualization/configs/yolov8_s_syncbn_fast_8xb16-500e_coco_assignervisualization.py
new file mode 100644
index 0000000..03dcae8
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/projects/assigner_visualization/configs/yolov8_s_syncbn_fast_8xb16-500e_coco_assignervisualization.py
@@ -0,0 +1,9 @@
+_base_ = ['../../../configs/yolov8/yolov8_s_syncbn_fast_8xb16-500e_coco.py']
+
+custom_imports = dict(imports=[
+    'projects.assigner_visualization.detectors',
+    'projects.assigner_visualization.dense_heads'
+])
+
+model = dict(
+    type='YOLODetectorAssigner', bbox_head=dict(type='YOLOv8HeadAssigner'))
diff --git a/mmdetection_practice/third_party/mmyolo/projects/assigner_visualization/dense_heads/__init__.py b/mmdetection_practice/third_party/mmyolo/projects/assigner_visualization/dense_heads/__init__.py
new file mode 100644
index 0000000..82adaab
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/projects/assigner_visualization/dense_heads/__init__.py
@@ -0,0 +1,10 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from .rtmdet_head_assigner import RTMHeadAssigner
+from .yolov5_head_assigner import YOLOv5HeadAssigner
+from .yolov7_head_assigner import YOLOv7HeadAssigner
+from .yolov8_head_assigner import YOLOv8HeadAssigner
+
+__all__ = [
+    'YOLOv5HeadAssigner', 'YOLOv7HeadAssigner', 'YOLOv8HeadAssigner',
+    'RTMHeadAssigner'
+]
diff --git a/mmdetection_practice/third_party/mmyolo/projects/assigner_visualization/dense_heads/rtmdet_head_assigner.py b/mmdetection_practice/third_party/mmyolo/projects/assigner_visualization/dense_heads/rtmdet_head_assigner.py
new file mode 100644
index 0000000..d3ae1c8
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/projects/assigner_visualization/dense_heads/rtmdet_head_assigner.py
@@ -0,0 +1,175 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from typing import List, Union
+
+import torch
+from mmdet.structures.bbox import distance2bbox
+from mmdet.utils import InstanceList
+from torch import Tensor
+
+from mmyolo.models import RTMDetHead
+from mmyolo.models.utils import gt_instances_preprocess
+from mmyolo.registry import MODELS
+
+
+@MODELS.register_module()
+class RTMHeadAssigner(RTMDetHead):
+
+    def assign_by_gt_and_feat(
+        self,
+        cls_scores: List[Tensor],
+        bbox_preds: List[Tensor],
+        batch_gt_instances: InstanceList,
+        batch_img_metas: List[dict],
+        inputs_hw: Union[Tensor, tuple] = (640, 640)
+    ) -> dict:
+        """Calculate the assigning results based on the gt and features
+        extracted by the detection head.
+
+        Args:
+            cls_scores (list[Tensor]): Box scores for each scale level
+                Has shape (N, num_anchors * num_classes, H, W)
+            bbox_preds (list[Tensor]): Decoded box for each scale
+                level with shape (N, num_anchors * 4, H, W) in
+                [tl_x, tl_y, br_x, br_y] format.
+            batch_gt_instances (list[:obj:`InstanceData`]): Batch of
+                gt_instance.  It usually includes ``bboxes`` and ``labels``
+                attributes.
+            batch_img_metas (list[dict]): Meta information of each image, e.g.,
+                image size, scaling factor, etc.
+            inputs_hw (Union[Tensor, tuple]): Height and width of inputs size.
+        Returns:
+            dict[str, Tensor]: A dictionary of assigning results.
+        """
+        num_imgs = len(batch_img_metas)
+        featmap_sizes = [featmap.size()[-2:] for featmap in cls_scores]
+        assert len(featmap_sizes) == self.prior_generator.num_levels
+        # rtmdet's prior offset differs from others
+        prior_offset = self.prior_generator.offset
+
+        gt_info = gt_instances_preprocess(batch_gt_instances, num_imgs)
+        gt_labels = gt_info[:, :, :1]
+        gt_bboxes = gt_info[:, :, 1:]  # xyxy
+        pad_bbox_flag = (gt_bboxes.sum(-1, keepdim=True) > 0).float()
+
+        device = cls_scores[0].device
+
+        # If the shape does not equal, generate new one
+        if featmap_sizes != self.featmap_sizes_train:
+            self.featmap_sizes_train = featmap_sizes
+            mlvl_priors_with_stride = self.prior_generator.grid_priors(
+                featmap_sizes, device=device, with_stride=True)
+            self.flatten_priors_train = torch.cat(
+                mlvl_priors_with_stride, dim=0)
+
+        flatten_cls_scores = torch.cat([
+            cls_score.permute(0, 2, 3, 1).reshape(num_imgs, -1,
+                                                  self.cls_out_channels)
+            for cls_score in cls_scores
+        ], 1).contiguous()
+
+        flatten_bboxes = torch.cat([
+            bbox_pred.permute(0, 2, 3, 1).reshape(num_imgs, -1, 4)
+            for bbox_pred in bbox_preds
+        ], 1)
+        flatten_bboxes = flatten_bboxes * self.flatten_priors_train[..., -1,
+                                                                    None]
+        flatten_bboxes = distance2bbox(self.flatten_priors_train[..., :2],
+                                       flatten_bboxes)
+
+        assigned_result = self.assigner(flatten_bboxes.detach(),
+                                        flatten_cls_scores.detach(),
+                                        self.flatten_priors_train, gt_labels,
+                                        gt_bboxes, pad_bbox_flag)
+
+        labels = assigned_result['assigned_labels'].reshape(-1)
+        bbox_targets = assigned_result['assigned_bboxes'].reshape(-1, 4)
+
+        # FG cat_id: [0, num_classes -1], BG cat_id: num_classes
+        bg_class_ind = self.num_classes
+        pos_inds = ((labels >= 0)
+                    & (labels < bg_class_ind)).nonzero().squeeze(1)
+        targets = bbox_targets[pos_inds]
+        gt_bboxes = gt_bboxes.squeeze(0)
+        matched_gt_inds = torch.tensor(
+            [((t == gt_bboxes).sum(dim=1) == t.shape[0]).nonzero()[0]
+             for t in targets],
+            device=device)
+
+        level_inds = torch.zeros_like(labels)
+        img_inds = torch.zeros_like(labels)
+        level_nums = [0] + [f[0] * f[1] for f in featmap_sizes]
+        for i in range(len(level_nums) - 1):
+            level_nums[i + 1] = level_nums[i] + level_nums[i + 1]
+            level_inds[level_nums[i]:level_nums[i + 1]] = i
+        level_inds_pos = level_inds[pos_inds]
+
+        img_inds = img_inds[pos_inds]
+        labels = labels[pos_inds]
+
+        inputs_hw = batch_img_metas[0]['batch_input_shape']
+        assign_results = []
+        for i in range(self.num_levels):
+            retained_inds = level_inds_pos == i
+            if not retained_inds.any():
+                assign_results_prior = {
+                    'stride':
+                    self.featmap_strides[i],
+                    'grid_x_inds':
+                    torch.zeros([0], dtype=torch.int64).to(device),
+                    'grid_y_inds':
+                    torch.zeros([0], dtype=torch.int64).to(device),
+                    'img_inds':
+                    torch.zeros([0], dtype=torch.int64).to(device),
+                    'class_inds':
+                    torch.zeros([0], dtype=torch.int64).to(device),
+                    'retained_gt_inds':
+                    torch.zeros([0], dtype=torch.int64).to(device),
+                    'prior_ind':
+                    0,
+                    'offset':
+                    prior_offset
+                }
+            else:
+                w = inputs_hw[1] // self.featmap_strides[i]
+
+                retained_pos_inds = pos_inds[retained_inds] - level_nums[i]
+                grid_y_inds = retained_pos_inds // w
+                grid_x_inds = retained_pos_inds - retained_pos_inds // w * w
+                assign_results_prior = {
+                    'stride': self.featmap_strides[i],
+                    'grid_x_inds': grid_x_inds,
+                    'grid_y_inds': grid_y_inds,
+                    'img_inds': img_inds[retained_inds],
+                    'class_inds': labels[retained_inds],
+                    'retained_gt_inds': matched_gt_inds[retained_inds],
+                    'prior_ind': 0,
+                    'offset': prior_offset
+                }
+            assign_results.append([assign_results_prior])
+        return assign_results
+
+    def assign(self, batch_data_samples: Union[list, dict],
+               inputs_hw: Union[tuple, torch.Size]) -> dict:
+        """Calculate assigning results. This function is provided to the
+        `assigner_visualization.py` script.
+
+        Args:
+            batch_data_samples (List[:obj:`DetDataSample`], dict): The Data
+                Samples. It usually includes information such as
+                `gt_instance`, `gt_panoptic_seg` and `gt_sem_seg`.
+            inputs_hw: Height and width of inputs size
+
+        Returns:
+            dict: A dictionary of assigning components.
+        """
+        if isinstance(batch_data_samples, list):
+            raise NotImplementedError(
+                'assigning results_list is not implemented')
+        else:
+            # Fast version
+            cls_scores, bbox_preds = self(batch_data_samples['feats'])
+            assign_inputs = (cls_scores, bbox_preds,
+                             batch_data_samples['bboxes_labels'],
+                             batch_data_samples['img_metas'], inputs_hw)
+        assign_results = self.assign_by_gt_and_feat(*assign_inputs)
+        return assign_results
diff --git a/mmdetection_practice/third_party/mmyolo/projects/assigner_visualization/dense_heads/yolov5_head_assigner.py b/mmdetection_practice/third_party/mmyolo/projects/assigner_visualization/dense_heads/yolov5_head_assigner.py
new file mode 100644
index 0000000..599963f
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/projects/assigner_visualization/dense_heads/yolov5_head_assigner.py
@@ -0,0 +1,188 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from typing import Sequence, Union
+
+import torch
+from mmdet.models.utils import unpack_gt_instances
+from mmengine.structures import InstanceData
+from torch import Tensor
+
+from mmyolo.models import YOLOv5Head
+from mmyolo.registry import MODELS
+
+
+@MODELS.register_module()
+class YOLOv5HeadAssigner(YOLOv5Head):
+
+    def assign_by_gt_and_feat(
+        self,
+        batch_gt_instances: Sequence[InstanceData],
+        batch_img_metas: Sequence[dict],
+        inputs_hw: Union[Tensor, tuple] = (640, 640)
+    ) -> dict:
+        """Calculate the assigning results based on the gt and features
+        extracted by the detection head.
+
+        Args:
+            batch_gt_instances (Sequence[InstanceData]): Batch of
+                gt_instance. It usually includes ``bboxes`` and ``labels``
+                attributes.
+            batch_img_metas (Sequence[dict]): Meta information of each image,
+                e.g., image size, scaling factor, etc.
+            batch_gt_instances_ignore (list[:obj:`InstanceData`], optional):
+                Batch of gt_instances_ignore. It includes ``bboxes`` attribute
+                data that is ignored during training and testing.
+                Defaults to None.
+            inputs_hw (Union[Tensor, tuple]): Height and width of inputs size.
+        Returns:
+            dict[str, Tensor]: A dictionary of assigning results.
+        """
+        # 1. Convert gt to norm format
+        batch_targets_normed = self._convert_gt_to_norm_format(
+            batch_gt_instances, batch_img_metas)
+
+        device = batch_targets_normed.device
+        scaled_factor = torch.ones(7, device=device)
+        gt_inds = torch.arange(
+            batch_targets_normed.shape[1],
+            dtype=torch.long,
+            device=device,
+            requires_grad=False).unsqueeze(0).repeat((self.num_base_priors, 1))
+
+        assign_results = []
+        for i in range(self.num_levels):
+            assign_results_feat = []
+            h = inputs_hw[0] // self.featmap_strides[i]
+            w = inputs_hw[1] // self.featmap_strides[i]
+
+            # empty gt bboxes
+            if batch_targets_normed.shape[1] == 0:
+                for k in range(self.num_base_priors):
+                    assign_results_feat.append({
+                        'stride':
+                        self.featmap_strides[i],
+                        'grid_x_inds':
+                        torch.zeros([0], dtype=torch.int64).to(device),
+                        'grid_y_inds':
+                        torch.zeros([0], dtype=torch.int64).to(device),
+                        'img_inds':
+                        torch.zeros([0], dtype=torch.int64).to(device),
+                        'class_inds':
+                        torch.zeros([0], dtype=torch.int64).to(device),
+                        'retained_gt_inds':
+                        torch.zeros([0], dtype=torch.int64).to(device),
+                        'prior_ind':
+                        k
+                    })
+                assign_results.append(assign_results_feat)
+                continue
+
+            priors_base_sizes_i = self.priors_base_sizes[i]
+            # feature map scale whwh
+            scaled_factor[2:6] = torch.tensor([w, h, w, h])
+            # Scale batch_targets from range 0-1 to range 0-features_maps size.
+            # (num_base_priors, num_bboxes, 7)
+            batch_targets_scaled = batch_targets_normed * scaled_factor
+
+            # 2. Shape match
+            wh_ratio = batch_targets_scaled[...,
+                                            4:6] / priors_base_sizes_i[:, None]
+            match_inds = torch.max(
+                wh_ratio, 1 / wh_ratio).max(2)[0] < self.prior_match_thr
+            batch_targets_scaled = batch_targets_scaled[match_inds]
+            match_gt_inds = gt_inds[match_inds]
+
+            # no gt bbox matches anchor
+            if batch_targets_scaled.shape[0] == 0:
+                for k in range(self.num_base_priors):
+                    assign_results_feat.append({
+                        'stride':
+                        self.featmap_strides[i],
+                        'grid_x_inds':
+                        torch.zeros([0], dtype=torch.int64).to(device),
+                        'grid_y_inds':
+                        torch.zeros([0], dtype=torch.int64).to(device),
+                        'img_inds':
+                        torch.zeros([0], dtype=torch.int64).to(device),
+                        'class_inds':
+                        torch.zeros([0], dtype=torch.int64).to(device),
+                        'retained_gt_inds':
+                        torch.zeros([0], dtype=torch.int64).to(device),
+                        'prior_ind':
+                        k
+                    })
+                assign_results.append(assign_results_feat)
+                continue
+
+            # 3. Positive samples with additional neighbors
+
+            # check the left, up, right, bottom sides of the
+            # targets grid, and determine whether assigned
+            # them as positive samples as well.
+            batch_targets_cxcy = batch_targets_scaled[:, 2:4]
+            grid_xy = scaled_factor[[2, 3]] - batch_targets_cxcy
+            left, up = ((batch_targets_cxcy % 1 < self.near_neighbor_thr) &
+                        (batch_targets_cxcy > 1)).T
+            right, bottom = ((grid_xy % 1 < self.near_neighbor_thr) &
+                             (grid_xy > 1)).T
+            offset_inds = torch.stack(
+                (torch.ones_like(left), left, up, right, bottom))
+
+            batch_targets_scaled = batch_targets_scaled.repeat(
+                (5, 1, 1))[offset_inds]
+            retained_gt_inds = match_gt_inds.repeat((5, 1))[offset_inds]
+            retained_offsets = self.grid_offset.repeat(1, offset_inds.shape[1],
+                                                       1)[offset_inds]
+
+            # prepare pred results and positive sample indexes to
+            # calculate class loss and bbox lo
+            _chunk_targets = batch_targets_scaled.chunk(4, 1)
+            img_class_inds, grid_xy, grid_wh, priors_inds = _chunk_targets
+            priors_inds, (img_inds, class_inds) = priors_inds.long().view(
+                -1), img_class_inds.long().T
+
+            grid_xy_long = (grid_xy -
+                            retained_offsets * self.near_neighbor_thr).long()
+            grid_x_inds, grid_y_inds = grid_xy_long.T
+            for k in range(self.num_base_priors):
+                retained_inds = priors_inds == k
+                assign_results_prior = {
+                    'stride': self.featmap_strides[i],
+                    'grid_x_inds': grid_x_inds[retained_inds],
+                    'grid_y_inds': grid_y_inds[retained_inds],
+                    'img_inds': img_inds[retained_inds],
+                    'class_inds': class_inds[retained_inds],
+                    'retained_gt_inds': retained_gt_inds[retained_inds],
+                    'prior_ind': k
+                }
+                assign_results_feat.append(assign_results_prior)
+            assign_results.append(assign_results_feat)
+        return assign_results
+
+    def assign(self, batch_data_samples: Union[list, dict],
+               inputs_hw: Union[tuple, torch.Size]) -> dict:
+        """Calculate assigning results. This function is provided to the
+        `assigner_visualization.py` script.
+
+        Args:
+            batch_data_samples (List[:obj:`DetDataSample`], dict): The Data
+                Samples. It usually includes information such as
+                `gt_instance`, `gt_panoptic_seg` and `gt_sem_seg`.
+            inputs_hw: Height and width of inputs size
+
+        Returns:
+            dict: A dictionary of assigning components.
+        """
+        if isinstance(batch_data_samples, list):
+            outputs = unpack_gt_instances(batch_data_samples)
+            (batch_gt_instances, batch_gt_instances_ignore,
+             batch_img_metas) = outputs
+
+            assign_inputs = (batch_gt_instances, batch_img_metas,
+                             batch_gt_instances_ignore, inputs_hw)
+        else:
+            # Fast version
+            assign_inputs = (batch_data_samples['bboxes_labels'],
+                             batch_data_samples['img_metas'], inputs_hw)
+        assign_results = self.assign_by_gt_and_feat(*assign_inputs)
+
+        return assign_results
diff --git a/mmdetection_practice/third_party/mmyolo/projects/assigner_visualization/dense_heads/yolov7_head_assigner.py b/mmdetection_practice/third_party/mmyolo/projects/assigner_visualization/dense_heads/yolov7_head_assigner.py
new file mode 100644
index 0000000..de2a90e
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/projects/assigner_visualization/dense_heads/yolov7_head_assigner.py
@@ -0,0 +1,159 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from typing import List, Union
+
+import torch
+from mmdet.utils import InstanceList
+from torch import Tensor
+
+from mmyolo.models import YOLOv7Head
+from mmyolo.registry import MODELS
+
+
+@MODELS.register_module()
+class YOLOv7HeadAssigner(YOLOv7Head):
+
+    def assign_by_gt_and_feat(
+        self,
+        cls_scores: List[Tensor],
+        bbox_preds: List[Tensor],
+        objectnesses: List[Tensor],
+        batch_gt_instances: InstanceList,
+        batch_img_metas: List[dict],
+        inputs_hw: Union[Tensor, tuple],
+    ) -> dict:
+        """Calculate the assigning results based on the gt and features
+        extracted by the detection head.
+        Args:
+            cls_scores (Sequence[Tensor]): Box scores for each scale level,
+                each is a 4D-tensor, the channel number is
+                num_priors * num_classes.
+            bbox_preds (Sequence[Tensor]): Box energies / deltas for each scale
+                level, each is a 4D-tensor, the channel number is
+                num_priors * 4.
+            objectnesses (Sequence[Tensor]): Score factor for
+                all scale level, each is a 4D-tensor, has shape
+                (batch_size, 1, H, W)
+            batch_gt_instances (list[:obj:`InstanceData`]): Batch of
+                gt_instance. It usually includes ``bboxes`` and ``labels``
+                attributes.
+            batch_img_metas (list[dict]): Meta information of each image, e.g.,
+                image size, scaling factor, etc.
+            inputs_hw (Union[Tensor, tuple]): Height and width of inputs size.
+        Returns:
+            dict[str, Tensor]: A dictionary of assigning results.
+        """
+        device = cls_scores[0][0].device
+
+        head_preds = self._merge_predict_results(bbox_preds, objectnesses,
+                                                 cls_scores)
+
+        batch_targets_normed = self._convert_gt_to_norm_format(
+            batch_gt_instances, batch_img_metas)
+
+        # yolov5_assign and simota_assign
+        assigner_results = self.assigner(
+            head_preds,
+            batch_targets_normed,
+            batch_img_metas[0]['batch_input_shape'],
+            self.priors_base_sizes,
+            self.grid_offset,
+            near_neighbor_thr=self.near_neighbor_thr)
+
+        # multi-level positive sample position.
+        mlvl_positive_infos = assigner_results['mlvl_positive_infos']
+        # assigned results with label and bboxes information.
+        mlvl_targets_normed = assigner_results['mlvl_targets_normed']
+
+        assign_results = []
+        for i in range(self.num_levels):
+            assign_results_feat = []
+            # no gt bbox matches anchor
+            if mlvl_positive_infos[i].shape[0] == 0:
+                for k in range(self.num_base_priors):
+                    assign_results_feat.append({
+                        'stride':
+                        self.featmap_strides[i],
+                        'grid_x_inds':
+                        torch.zeros([0], dtype=torch.int64).to(device),
+                        'grid_y_inds':
+                        torch.zeros([0], dtype=torch.int64).to(device),
+                        'img_inds':
+                        torch.zeros([0], dtype=torch.int64).to(device),
+                        'class_inds':
+                        torch.zeros([0], dtype=torch.int64).to(device),
+                        'retained_gt_inds':
+                        torch.zeros([0], dtype=torch.int64).to(device),
+                        'prior_ind':
+                        k
+                    })
+                assign_results.append(assign_results_feat)
+                continue
+
+            # (batch_idx, prior_idx, x_scaled, y_scaled)
+            positive_info = mlvl_positive_infos[i]
+            targets_normed = mlvl_targets_normed[i]
+            priors_inds = positive_info[:, 1]
+            grid_x_inds = positive_info[:, 2]
+            grid_y_inds = positive_info[:, 3]
+            img_inds = targets_normed[:, 0]
+            class_inds = targets_normed[:, 1].long()
+            retained_gt_inds = self.get_gt_inds(
+                targets_normed, batch_targets_normed[0]).long()
+            for k in range(self.num_base_priors):
+                retained_inds = priors_inds == k
+                assign_results_prior = {
+                    'stride': self.featmap_strides[i],
+                    'grid_x_inds': grid_x_inds[retained_inds],
+                    'grid_y_inds': grid_y_inds[retained_inds],
+                    'img_inds': img_inds[retained_inds],
+                    'class_inds': class_inds[retained_inds],
+                    'retained_gt_inds': retained_gt_inds[retained_inds],
+                    'prior_ind': k
+                }
+                assign_results_feat.append(assign_results_prior)
+            assign_results.append(assign_results_feat)
+        return assign_results
+
+    def get_gt_inds(self, assigned_target, gt_instance):
+        """Judging which one gt_ind is assigned by comparing assign_target and
+        origin target.
+
+        Args:
+           assigned_target (Tensor(assign_nums,7)): YOLOv7 assigning results.
+           gt_instance (Tensor(gt_nums,7)):  Normalized gt_instance, It
+                usually includes ``bboxes`` and ``labels`` attributes.
+        Returns:
+           gt_inds (Tensor): the index which one gt is assigned.
+        """
+        gt_inds = torch.zeros(assigned_target.shape[0])
+        for i in range(assigned_target.shape[0]):
+            gt_inds[i] = ((assigned_target[i] == gt_instance).sum(
+                dim=1) == 7).nonzero().squeeze()
+        return gt_inds
+
+    def assign(self, batch_data_samples: Union[list, dict],
+               inputs_hw: Union[tuple, torch.Size]) -> dict:
+        """Calculate assigning results.
+
+        This function is provided to the
+        `assigner_visualization.py` script.
+        Args:
+            batch_data_samples (List[:obj:`DetDataSample`], dict): The Data
+                Samples. It usually includes information such as
+                `gt_instance`, `gt_panoptic_seg` and `gt_sem_seg`.
+            inputs_hw: Height and width of inputs size
+        Returns:
+            dict: A dictionary of assigning components.
+        """
+        if isinstance(batch_data_samples, list):
+            raise NotImplementedError(
+                'assigning results_list is not implemented')
+        else:
+            # Fast version
+            cls_scores, bbox_preds, objectnesses = self(
+                batch_data_samples['feats'])
+            assign_inputs = (cls_scores, bbox_preds, objectnesses,
+                             batch_data_samples['bboxes_labels'],
+                             batch_data_samples['img_metas'], inputs_hw)
+        assign_results = self.assign_by_gt_and_feat(*assign_inputs)
+        return assign_results
diff --git a/mmdetection_practice/third_party/mmyolo/projects/assigner_visualization/dense_heads/yolov8_head_assigner.py b/mmdetection_practice/third_party/mmyolo/projects/assigner_visualization/dense_heads/yolov8_head_assigner.py
new file mode 100644
index 0000000..49d254f
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/projects/assigner_visualization/dense_heads/yolov8_head_assigner.py
@@ -0,0 +1,180 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from typing import List, Union
+
+import torch
+from mmdet.utils import InstanceList
+from torch import Tensor
+
+from mmyolo.models import YOLOv8Head
+from mmyolo.models.utils import gt_instances_preprocess
+from mmyolo.registry import MODELS
+
+
+@MODELS.register_module()
+class YOLOv8HeadAssigner(YOLOv8Head):
+
+    def assign_by_gt_and_feat(
+        self,
+        cls_scores: List[Tensor],
+        bbox_preds: List[Tensor],
+        batch_gt_instances: InstanceList,
+        batch_img_metas: List[dict],
+        inputs_hw: Union[Tensor, tuple] = (640, 640)
+    ) -> dict:
+        """Calculate the assigning results based on the gt and features
+        extracted by the detection head.
+        Args:
+            cls_scores (Sequence[Tensor]): Box scores for each scale level,
+                each is a 4D-tensor, the channel number is
+                num_priors * num_classes.
+            bbox_preds (Sequence[Tensor]): Box energies / deltas for each scale
+                level, each is a 4D-tensor, the channel number is
+                num_priors * 4.
+            bbox_dist_preds (Sequence[Tensor]): Box distribution logits for
+                each scale level with shape (bs, reg_max + 1, H*W, 4).
+            batch_gt_instances (list[:obj:`InstanceData`]): Batch of
+                gt_instance. It usually includes ``bboxes`` and ``labels``
+                attributes.
+            batch_img_metas (list[dict]): Meta information of each image, e.g.,
+                image size, scaling factor, etc.
+            inputs_hw (Union[Tensor, tuple]): Height and width of inputs size.
+        Returns:
+            dict[str, Tensor]: A dictionary of assigning results.
+        """
+        num_imgs = len(batch_img_metas)
+        device = cls_scores[0].device
+
+        current_featmap_sizes = [
+            cls_score.shape[2:] for cls_score in cls_scores
+        ]
+        # If the shape does not equal, generate new one
+        if current_featmap_sizes != self.featmap_sizes_train:
+            self.featmap_sizes_train = current_featmap_sizes
+
+            mlvl_priors_with_stride = self.prior_generator.grid_priors(
+                self.featmap_sizes_train,
+                dtype=cls_scores[0].dtype,
+                device=device,
+                with_stride=True)
+
+            self.num_level_priors = [len(n) for n in mlvl_priors_with_stride]
+            self.flatten_priors_train = torch.cat(
+                mlvl_priors_with_stride, dim=0)
+            self.stride_tensor = self.flatten_priors_train[..., [2]]
+
+        # gt info
+        gt_info = gt_instances_preprocess(batch_gt_instances, num_imgs)
+        gt_labels = gt_info[:, :, :1]
+        gt_bboxes = gt_info[:, :, 1:]  # xyxy
+        pad_bbox_flag = (gt_bboxes.sum(-1, keepdim=True) > 0).float()
+
+        # pred info
+        flatten_cls_preds = [
+            cls_pred.permute(0, 2, 3, 1).reshape(num_imgs, -1,
+                                                 self.num_classes)
+            for cls_pred in cls_scores
+        ]
+        flatten_pred_bboxes = [
+            bbox_pred.permute(0, 2, 3, 1).reshape(num_imgs, -1, 4)
+            for bbox_pred in bbox_preds
+        ]
+        # (bs, n, 4 * reg_max)
+
+        flatten_cls_preds = torch.cat(flatten_cls_preds, dim=1)
+        flatten_pred_bboxes = torch.cat(flatten_pred_bboxes, dim=1)
+        flatten_pred_bboxes = self.bbox_coder.decode(
+            self.flatten_priors_train[..., :2], flatten_pred_bboxes,
+            self.stride_tensor[..., 0])
+
+        assigned_result = self.assigner(
+            (flatten_pred_bboxes.detach()).type(gt_bboxes.dtype),
+            flatten_cls_preds.detach().sigmoid(), self.flatten_priors_train,
+            gt_labels, gt_bboxes, pad_bbox_flag)
+
+        labels = assigned_result['assigned_labels'].reshape(-1)
+        bbox_targets = assigned_result['assigned_bboxes'].reshape(-1, 4)
+        fg_mask_pre_prior = assigned_result['fg_mask_pre_prior'].squeeze(0)
+
+        pos_inds = fg_mask_pre_prior.nonzero().squeeze(1)
+
+        targets = bbox_targets[pos_inds]
+        gt_bboxes = gt_bboxes.squeeze(0)
+        matched_gt_inds = torch.tensor(
+            [((t == gt_bboxes).sum(dim=1) == t.shape[0]).nonzero()[0]
+             for t in targets],
+            device=device)
+
+        level_inds = torch.zeros_like(labels)
+        img_inds = torch.zeros_like(labels)
+        level_nums = [0] + self.num_level_priors
+        for i in range(len(level_nums) - 1):
+            level_nums[i + 1] = level_nums[i] + level_nums[i + 1]
+            level_inds[level_nums[i]:level_nums[i + 1]] = i
+        level_inds_pos = level_inds[pos_inds]
+
+        img_inds = img_inds[pos_inds]
+        labels = labels[pos_inds]
+
+        assign_results = []
+        for i in range(self.num_levels):
+            retained_inds = level_inds_pos == i
+            if not retained_inds.any():
+                assign_results_prior = {
+                    'stride':
+                    self.featmap_strides[i],
+                    'grid_x_inds':
+                    torch.zeros([0], dtype=torch.int64).to(device),
+                    'grid_y_inds':
+                    torch.zeros([0], dtype=torch.int64).to(device),
+                    'img_inds':
+                    torch.zeros([0], dtype=torch.int64).to(device),
+                    'class_inds':
+                    torch.zeros([0], dtype=torch.int64).to(device),
+                    'retained_gt_inds':
+                    torch.zeros([0], dtype=torch.int64).to(device),
+                    'prior_ind':
+                    0
+                }
+            else:
+                w = inputs_hw[1] // self.featmap_strides[i]
+
+                retained_pos_inds = pos_inds[retained_inds] - level_nums[i]
+                grid_y_inds = retained_pos_inds // w
+                grid_x_inds = retained_pos_inds - retained_pos_inds // w * w
+                assign_results_prior = {
+                    'stride': self.featmap_strides[i],
+                    'grid_x_inds': grid_x_inds,
+                    'grid_y_inds': grid_y_inds,
+                    'img_inds': img_inds[retained_inds],
+                    'class_inds': labels[retained_inds],
+                    'retained_gt_inds': matched_gt_inds[retained_inds],
+                    'prior_ind': 0
+                }
+            assign_results.append([assign_results_prior])
+        return assign_results
+
+    def assign(self, batch_data_samples: Union[list, dict],
+               inputs_hw: Union[tuple, torch.Size]) -> dict:
+        """Calculate assigning results.
+
+        This function is provided to the
+        `assigner_visualization.py` script.
+        Args:
+            batch_data_samples (List[:obj:`DetDataSample`], dict): The Data
+                Samples. It usually includes information such as
+                `gt_instance`, `gt_panoptic_seg` and `gt_sem_seg`.
+            inputs_hw: Height and width of inputs size
+        Returns:
+            dict: A dictionary of assigning components.
+        """
+        if isinstance(batch_data_samples, list):
+            raise NotImplementedError(
+                'assigning results_list is not implemented')
+        else:
+            # Fast version
+            cls_scores, bbox_preds = self(batch_data_samples['feats'])
+            assign_inputs = (cls_scores, bbox_preds,
+                             batch_data_samples['bboxes_labels'],
+                             batch_data_samples['img_metas'], inputs_hw)
+        assign_results = self.assign_by_gt_and_feat(*assign_inputs)
+        return assign_results
diff --git a/mmdetection_practice/third_party/mmyolo/projects/assigner_visualization/detectors/__init__.py b/mmdetection_practice/third_party/mmyolo/projects/assigner_visualization/detectors/__init__.py
new file mode 100644
index 0000000..155606a
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/projects/assigner_visualization/detectors/__init__.py
@@ -0,0 +1,5 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from projects.assigner_visualization.detectors.yolo_detector_assigner import \
+    YOLODetectorAssigner
+
+__all__ = ['YOLODetectorAssigner']
diff --git a/mmdetection_practice/third_party/mmyolo/projects/assigner_visualization/detectors/yolo_detector_assigner.py b/mmdetection_practice/third_party/mmyolo/projects/assigner_visualization/detectors/yolo_detector_assigner.py
new file mode 100644
index 0000000..5b723e0
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/projects/assigner_visualization/detectors/yolo_detector_assigner.py
@@ -0,0 +1,34 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from typing import Union
+
+from mmyolo.models import YOLODetector
+from mmyolo.registry import MODELS
+from projects.assigner_visualization.dense_heads import (RTMHeadAssigner,
+                                                         YOLOv7HeadAssigner,
+                                                         YOLOv8HeadAssigner)
+
+
+@MODELS.register_module()
+class YOLODetectorAssigner(YOLODetector):
+
+    def assign(self, data: dict) -> Union[dict, list]:
+        """Calculate assigning results from a batch of inputs and data
+        samples.This function is provided to the `assigner_visualization.py`
+        script.
+
+        Args:
+            data (dict or tuple or list): Data sampled from dataset.
+
+        Returns:
+            dict: A dictionary of assigning components.
+        """
+        assert isinstance(data, dict)
+        assert len(data['inputs']) == 1, 'Only support batchsize == 1'
+        data = self.data_preprocessor(data, True)
+        available_assigners = (YOLOv7HeadAssigner, YOLOv8HeadAssigner,
+                               RTMHeadAssigner)
+        if isinstance(self.bbox_head, available_assigners):
+            data['data_samples']['feats'] = self.extract_feat(data['inputs'])
+        inputs_hw = data['inputs'].shape[-2:]
+        assign_results = self.bbox_head.assign(data['data_samples'], inputs_hw)
+        return assign_results
diff --git a/mmdetection_practice/third_party/mmyolo/projects/assigner_visualization/visualization/__init__.py b/mmdetection_practice/third_party/mmyolo/projects/assigner_visualization/visualization/__init__.py
new file mode 100644
index 0000000..521a25b
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/projects/assigner_visualization/visualization/__init__.py
@@ -0,0 +1,4 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from .assigner_visualizer import YOLOAssignerVisualizer
+
+__all__ = ['YOLOAssignerVisualizer']
diff --git a/mmdetection_practice/third_party/mmyolo/projects/assigner_visualization/visualization/assigner_visualizer.py b/mmdetection_practice/third_party/mmyolo/projects/assigner_visualization/visualization/assigner_visualizer.py
new file mode 100644
index 0000000..fe1f4f0
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/projects/assigner_visualization/visualization/assigner_visualizer.py
@@ -0,0 +1,326 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+import math
+from typing import List, Union
+
+import mmcv
+import numpy as np
+import torch
+from mmdet.structures.bbox import HorizontalBoxes
+from mmdet.visualization import DetLocalVisualizer
+from mmdet.visualization.palette import _get_adaptive_scales, get_palette
+from mmengine.structures import InstanceData
+from torch import Tensor
+
+from mmyolo.registry import VISUALIZERS
+
+
+@VISUALIZERS.register_module()
+class YOLOAssignerVisualizer(DetLocalVisualizer):
+    """MMYOLO Detection Assigner Visualizer.
+
+    This class is provided to the `assigner_visualization.py` script.
+    Args:
+        name (str): Name of the instance. Defaults to 'visualizer'.
+    """
+
+    def __init__(self, name: str = 'visualizer', *args, **kwargs):
+        super().__init__(name=name, *args, **kwargs)
+        # need priors_size from config
+        self.priors_size = None
+
+    def draw_grid(self,
+                  stride: int = 8,
+                  line_styles: Union[str, List[str]] = ':',
+                  colors: Union[str, tuple, List[str],
+                                List[tuple]] = (180, 180, 180),
+                  line_widths: Union[Union[int, float],
+                                     List[Union[int, float]]] = 1):
+        """Draw grids on image.
+
+        Args:
+            stride (int): Downsample factor of feature map.
+            line_styles (Union[str, List[str]]): The linestyle
+                of lines. ``line_styles`` can have the same length with
+                texts or just single value. If ``line_styles`` is single
+                value, all the lines will have the same linestyle.
+                Reference to
+                https://matplotlib.org/stable/api/collections_api.html?highlight=collection#matplotlib.collections.AsteriskPolygonCollection.set_linestyle
+                for more details. Defaults to ':'.
+            colors (Union[str, tuple, List[str], List[tuple]]): The colors of
+                lines. ``colors`` can have the same length with lines or just
+                single value. If ``colors`` is single value, all the lines
+                will have the same colors. Reference to
+                https://matplotlib.org/stable/gallery/color/named_colors.html
+                for more details. Defaults to (180, 180, 180).
+            line_widths (Union[Union[int, float], List[Union[int, float]]]):
+                The linewidth of lines. ``line_widths`` can have
+                the same length with lines or just single value.
+                If ``line_widths`` is single value, all the lines will
+                have the same linewidth. Defaults to 1.
+        """
+        assert self._image is not None, 'Please set image using `set_image`'
+        # draw vertical lines
+        x_datas_vertical = ((np.arange(self.width // stride - 1) + 1) *
+                            stride).reshape((-1, 1)).repeat(
+                                2, axis=1)
+        y_datas_vertical = np.array([[0, self.height - 1]]).repeat(
+            self.width // stride - 1, axis=0)
+        self.draw_lines(
+            x_datas_vertical,
+            y_datas_vertical,
+            colors=colors,
+            line_styles=line_styles,
+            line_widths=line_widths)
+
+        # draw horizontal lines
+        x_datas_horizontal = np.array([[0, self.width - 1]]).repeat(
+            self.height // stride - 1, axis=0)
+        y_datas_horizontal = ((np.arange(self.height // stride - 1) + 1) *
+                              stride).reshape((-1, 1)).repeat(
+                                  2, axis=1)
+        self.draw_lines(
+            x_datas_horizontal,
+            y_datas_horizontal,
+            colors=colors,
+            line_styles=line_styles,
+            line_widths=line_widths)
+
+    def draw_instances_assign(self,
+                              instances: InstanceData,
+                              retained_gt_inds: Tensor,
+                              not_show_label: bool = False):
+        """Draw instances of GT.
+
+        Args:
+            instances (:obj:`InstanceData`): gt_instance. It usually
+             includes ``bboxes`` and ``labels`` attributes.
+            retained_gt_inds (Tensor): The gt indexes assigned as the
+                positive sample in the current prior.
+            not_show_label (bool): Whether to show gt labels on images.
+        """
+        assert self.dataset_meta is not None
+        classes = self.dataset_meta['classes']
+        palette = self.dataset_meta['palette']
+        if len(retained_gt_inds) == 0:
+            return self.get_image()
+        draw_gt_inds = torch.from_numpy(
+            np.array(
+                list(set(retained_gt_inds.cpu().numpy())), dtype=np.int64))
+        bboxes = instances.bboxes[draw_gt_inds]
+        labels = instances.labels[draw_gt_inds]
+
+        if not isinstance(bboxes, Tensor):
+            bboxes = bboxes.tensor
+
+        edge_colors = [palette[i] for i in labels]
+
+        max_label = int(max(labels) if len(labels) > 0 else 0)
+        text_palette = get_palette(self.text_color, max_label + 1)
+        text_colors = [text_palette[label] for label in labels]
+
+        self.draw_bboxes(
+            bboxes,
+            edge_colors=edge_colors,
+            alpha=self.alpha,
+            line_widths=self.line_width)
+
+        if not not_show_label:
+            positions = bboxes[:, :2] + self.line_width
+            areas = (bboxes[:, 3] - bboxes[:, 1]) * (
+                bboxes[:, 2] - bboxes[:, 0])
+            scales = _get_adaptive_scales(areas)
+            for i, (pos, label) in enumerate(zip(positions, labels)):
+                label_text = classes[
+                    label] if classes is not None else f'class {label}'
+
+                self.draw_texts(
+                    label_text,
+                    pos,
+                    colors=text_colors[i],
+                    font_sizes=int(13 * scales[i]),
+                    bboxes=[{
+                        'facecolor': 'black',
+                        'alpha': 0.8,
+                        'pad': 0.7,
+                        'edgecolor': 'none'
+                    }])
+
+    def draw_positive_assign(self,
+                             grid_x_inds: Tensor,
+                             grid_y_inds: Tensor,
+                             class_inds: Tensor,
+                             stride: int,
+                             bboxes: Union[Tensor, HorizontalBoxes],
+                             retained_gt_inds: Tensor,
+                             offset: float = 0.5):
+        """
+
+        Args:
+            grid_x_inds (Tensor): The X-axis indexes of the positive sample
+                in current prior.
+            grid_y_inds (Tensor): The Y-axis indexes of the positive sample
+                in current prior.
+            class_inds (Tensor): The classes indexes of the positive sample
+                in current prior.
+            stride (int): Downsample factor of feature map.
+            bboxes (Union[Tensor, HorizontalBoxes]): Bounding boxes of GT.
+            retained_gt_inds (Tensor): The gt indexes assigned as the
+                positive sample in the current prior.
+            offset (float): The offset of points, the value is normalized
+                with corresponding stride. Defaults to 0.5.
+        """
+        if not isinstance(bboxes, Tensor):
+            # Convert HorizontalBoxes to Tensor
+            bboxes = bboxes.tensor
+
+        # The PALETTE in the dataset_meta is required
+        assert self.dataset_meta is not None
+        palette = self.dataset_meta['palette']
+        x = ((grid_x_inds + offset) * stride).long()
+        y = ((grid_y_inds + offset) * stride).long()
+        center = torch.stack((x, y), dim=-1)
+
+        retained_bboxes = bboxes[retained_gt_inds]
+        bbox_wh = retained_bboxes[:, 2:] - retained_bboxes[:, :2]
+        bbox_area = bbox_wh[:, 0] * bbox_wh[:, 1]
+        radius = _get_adaptive_scales(bbox_area) * 4
+        colors = [palette[i] for i in class_inds]
+
+        self.draw_circles(
+            center,
+            radius,
+            colors,
+            line_widths=0,
+            face_colors=colors,
+            alpha=1.0)
+
+    def draw_prior(self,
+                   grid_x_inds: Tensor,
+                   grid_y_inds: Tensor,
+                   class_inds: Tensor,
+                   stride: int,
+                   feat_ind: int,
+                   prior_ind: int,
+                   offset: float = 0.5):
+        """Draw priors on image.
+
+        Args:
+            grid_x_inds (Tensor): The X-axis indexes of the positive sample
+                in current prior.
+            grid_y_inds (Tensor): The Y-axis indexes of the positive sample
+                in current prior.
+            class_inds (Tensor): The classes indexes of the positive sample
+                in current prior.
+            stride (int): Downsample factor of feature map.
+            feat_ind (int): Index of featmap.
+            prior_ind (int): Index of prior in current featmap.
+            offset (float): The offset of points, the value is normalized
+                with corresponding stride. Defaults to 0.5.
+        """
+
+        palette = self.dataset_meta['palette']
+        center_x = ((grid_x_inds + offset) * stride)
+        center_y = ((grid_y_inds + offset) * stride)
+        xyxy = torch.stack((center_x, center_y, center_x, center_y), dim=1)
+        device = xyxy.device
+        if self.priors_size is not None:
+            xyxy += self.priors_size[feat_ind][prior_ind].to(device)
+        else:
+            xyxy += torch.tensor(
+                [[-stride / 2, -stride / 2, stride / 2, stride / 2]],
+                device=device)
+
+        colors = [palette[i] for i in class_inds]
+        self.draw_bboxes(
+            xyxy,
+            edge_colors=colors,
+            alpha=self.alpha,
+            line_styles='--',
+            line_widths=math.ceil(self.line_width * 0.3))
+
+    def draw_assign(self,
+                    image: np.ndarray,
+                    assign_results: List[List[dict]],
+                    gt_instances: InstanceData,
+                    show_prior: bool = False,
+                    not_show_label: bool = False) -> np.ndarray:
+        """Draw assigning results.
+
+        Args:
+            image (np.ndarray): The image to draw.
+            assign_results (list): The assigning results.
+            gt_instances (:obj:`InstanceData`): Data structure for
+                instance-level annotations or predictions.
+            show_prior (bool): Whether to show prior on image.
+            not_show_label (bool): Whether to show gt labels on images.
+
+        Returns:
+            np.ndarray: the drawn image which channel is RGB.
+        """
+        img_show_list = []
+        for feat_ind, assign_results_feat in enumerate(assign_results):
+            img_show_list_feat = []
+            for prior_ind, assign_results_prior in enumerate(
+                    assign_results_feat):
+                self.set_image(image)
+                h, w = image.shape[:2]
+
+                # draw grid
+                stride = assign_results_prior['stride']
+                self.draw_grid(stride)
+
+                # draw prior on matched gt
+                grid_x_inds = assign_results_prior['grid_x_inds']
+                grid_y_inds = assign_results_prior['grid_y_inds']
+                class_inds = assign_results_prior['class_inds']
+                prior_ind = assign_results_prior['prior_ind']
+                offset = assign_results_prior.get('offset', 0.5)
+
+                if show_prior:
+                    self.draw_prior(grid_x_inds, grid_y_inds, class_inds,
+                                    stride, feat_ind, prior_ind, offset)
+
+                # draw matched gt
+                retained_gt_inds = assign_results_prior['retained_gt_inds']
+                self.draw_instances_assign(gt_instances, retained_gt_inds,
+                                           not_show_label)
+
+                # draw positive
+                self.draw_positive_assign(grid_x_inds, grid_y_inds, class_inds,
+                                          stride, gt_instances.bboxes,
+                                          retained_gt_inds, offset)
+
+                # draw title
+                if self.priors_size is not None:
+                    base_prior = self.priors_size[feat_ind][prior_ind]
+                else:
+                    base_prior = [stride, stride, stride * 2, stride * 2]
+                prior_size = (base_prior[2] - base_prior[0],
+                              base_prior[3] - base_prior[1])
+                pos = np.array((20, 20))
+                text = f'feat_ind: {feat_ind}  ' \
+                       f'prior_ind: {prior_ind} ' \
+                       f'prior_size: ({prior_size[0]}, {prior_size[1]})'
+                scales = _get_adaptive_scales(np.array([h * w / 16]))
+                font_sizes = int(13 * scales)
+                self.draw_texts(
+                    text,
+                    pos,
+                    colors=self.text_color,
+                    font_sizes=font_sizes,
+                    bboxes=[{
+                        'facecolor': 'black',
+                        'alpha': 0.8,
+                        'pad': 0.7,
+                        'edgecolor': 'none'
+                    }])
+
+                img_show = self.get_image()
+                img_show = mmcv.impad(img_show, padding=(5, 5, 5, 5))
+                img_show_list_feat.append(img_show)
+            img_show_list.append(np.concatenate(img_show_list_feat, axis=1))
+
+        # Merge all images into one image
+        # setting axis is to beautify the merged image
+        axis = 0 if len(assign_results[0]) > 1 else 1
+        return np.concatenate(img_show_list, axis=axis)
diff --git a/mmdetection_practice/third_party/mmyolo/projects/easydeploy/README.md b/mmdetection_practice/third_party/mmyolo/projects/easydeploy/README.md
new file mode 100644
index 0000000..1816e7e
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/projects/easydeploy/README.md
@@ -0,0 +1,11 @@
+# MMYOLO Model Easy-Deployment
+
+## Introduction
+
+This project is developed for easily converting your MMYOLO models to other inference backends without the need of MMDeploy, which reduces the cost of both time and effort on getting familiar with MMDeploy.
+
+Currently we support converting to `ONNX` and `TensorRT` formats, other inference backends such `ncnn` will be added to this project as well.
+
+## Supported Backends
+
+- [Model Convert](docs/model_convert.md)
diff --git a/mmdetection_practice/third_party/mmyolo/projects/easydeploy/README_zh-CN.md b/mmdetection_practice/third_party/mmyolo/projects/easydeploy/README_zh-CN.md
new file mode 100644
index 0000000..4c6bc0c
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/projects/easydeploy/README_zh-CN.md
@@ -0,0 +1,11 @@
+# MMYOLO 模型转换
+
+## 介绍
+
+本项目作为 MMYOLO 的部署 project 单独存在,意图剥离 MMDeploy 当前的体系,独自支持用户完成模型训练后的转换和部署功能,使用户的学习和工程成本下降。
+
+当前支持对 ONNX 格式和 TensorRT 格式的转换,后续对其他推理平台也会支持起来。
+
+## 转换教程
+
+- [Model Convert](docs/model_convert.md)
diff --git a/mmdetection_practice/third_party/mmyolo/projects/easydeploy/backbone/__init__.py b/mmdetection_practice/third_party/mmyolo/projects/easydeploy/backbone/__init__.py
new file mode 100644
index 0000000..dc167f8
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/projects/easydeploy/backbone/__init__.py
@@ -0,0 +1,5 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from .common import DeployC2f
+from .focus import DeployFocus, GConvFocus, NcnnFocus
+
+__all__ = ['DeployFocus', 'NcnnFocus', 'GConvFocus', 'DeployC2f']
diff --git a/mmdetection_practice/third_party/mmyolo/projects/easydeploy/backbone/common.py b/mmdetection_practice/third_party/mmyolo/projects/easydeploy/backbone/common.py
new file mode 100644
index 0000000..617875b
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/projects/easydeploy/backbone/common.py
@@ -0,0 +1,16 @@
+import torch
+import torch.nn as nn
+from torch import Tensor
+
+
+class DeployC2f(nn.Module):
+
+    def __init__(self, *args, **kwargs):
+        super().__init__()
+
+    def forward(self, x: Tensor) -> Tensor:
+        x_main = self.main_conv(x)
+        x_main = [x_main, x_main[:, self.mid_channels:, ...]]
+        x_main.extend(blocks(x_main[-1]) for blocks in self.blocks)
+        x_main.pop(1)
+        return self.final_conv(torch.cat(x_main, 1))
diff --git a/mmdetection_practice/third_party/mmyolo/projects/easydeploy/backbone/focus.py b/mmdetection_practice/third_party/mmyolo/projects/easydeploy/backbone/focus.py
new file mode 100644
index 0000000..2a19afc
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/projects/easydeploy/backbone/focus.py
@@ -0,0 +1,79 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+import torch
+import torch.nn as nn
+import torch.nn.functional as F
+from torch import Tensor
+
+
+class DeployFocus(nn.Module):
+
+    def __init__(self, orin_Focus: nn.Module):
+        super().__init__()
+        self.__dict__.update(orin_Focus.__dict__)
+
+    def forward(self, x: Tensor) -> Tensor:
+        batch_size, channel, height, width = x.shape
+        x = x.reshape(batch_size, channel, -1, 2, width)
+        x = x.reshape(batch_size, channel, x.shape[2], 2, -1, 2)
+        half_h = x.shape[2]
+        half_w = x.shape[4]
+        x = x.permute(0, 5, 3, 1, 2, 4)
+        x = x.reshape(batch_size, channel * 4, half_h, half_w)
+
+        return self.conv(x)
+
+
+class NcnnFocus(nn.Module):
+
+    def __init__(self, orin_Focus: nn.Module):
+        super().__init__()
+        self.__dict__.update(orin_Focus.__dict__)
+
+    def forward(self, x: Tensor) -> Tensor:
+        batch_size, c, h, w = x.shape
+        assert h % 2 == 0 and w % 2 == 0, f'focus for yolox needs even feature\
+            height and width, got {(h, w)}.'
+
+        x = x.reshape(batch_size, c * h, 1, w)
+        _b, _c, _h, _w = x.shape
+        g = _c // 2
+        # fuse to ncnn's shufflechannel
+        x = x.view(_b, g, 2, _h, _w)
+        x = torch.transpose(x, 1, 2).contiguous()
+        x = x.view(_b, -1, _h, _w)
+
+        x = x.reshape(_b, c * h * w, 1, 1)
+
+        _b, _c, _h, _w = x.shape
+        g = _c // 2
+        # fuse to ncnn's shufflechannel
+        x = x.view(_b, g, 2, _h, _w)
+        x = torch.transpose(x, 1, 2).contiguous()
+        x = x.view(_b, -1, _h, _w)
+
+        x = x.reshape(_b, c * 4, h // 2, w // 2)
+
+        return self.conv(x)
+
+
+class GConvFocus(nn.Module):
+
+    def __init__(self, orin_Focus: nn.Module):
+        super().__init__()
+        device = next(orin_Focus.parameters()).device
+        self.weight1 = torch.tensor([[1., 0], [0, 0]]).expand(3, 1, 2,
+                                                              2).to(device)
+        self.weight2 = torch.tensor([[0, 0], [1., 0]]).expand(3, 1, 2,
+                                                              2).to(device)
+        self.weight3 = torch.tensor([[0, 1.], [0, 0]]).expand(3, 1, 2,
+                                                              2).to(device)
+        self.weight4 = torch.tensor([[0, 0], [0, 1.]]).expand(3, 1, 2,
+                                                              2).to(device)
+        self.__dict__.update(orin_Focus.__dict__)
+
+    def forward(self, x: Tensor) -> Tensor:
+        conv1 = F.conv2d(x, self.weight1, stride=2, groups=3)
+        conv2 = F.conv2d(x, self.weight2, stride=2, groups=3)
+        conv3 = F.conv2d(x, self.weight3, stride=2, groups=3)
+        conv4 = F.conv2d(x, self.weight4, stride=2, groups=3)
+        return self.conv(torch.cat([conv1, conv2, conv3, conv4], dim=1))
diff --git a/mmdetection_practice/third_party/mmyolo/projects/easydeploy/bbox_code/__init__.py b/mmdetection_practice/third_party/mmyolo/projects/easydeploy/bbox_code/__init__.py
new file mode 100644
index 0000000..b85a815
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/projects/easydeploy/bbox_code/__init__.py
@@ -0,0 +1,5 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from .bbox_coder import (rtmdet_bbox_decoder, yolov5_bbox_decoder,
+                         yolox_bbox_decoder)
+
+__all__ = ['yolov5_bbox_decoder', 'rtmdet_bbox_decoder', 'yolox_bbox_decoder']
diff --git a/mmdetection_practice/third_party/mmyolo/projects/easydeploy/bbox_code/bbox_coder.py b/mmdetection_practice/third_party/mmyolo/projects/easydeploy/bbox_code/bbox_coder.py
new file mode 100644
index 0000000..6483cf8
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/projects/easydeploy/bbox_code/bbox_coder.py
@@ -0,0 +1,46 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from typing import Optional
+
+import torch
+from torch import Tensor
+
+
+def yolov5_bbox_decoder(priors: Tensor, bbox_preds: Tensor,
+                        stride: Tensor) -> Tensor:
+    bbox_preds = bbox_preds.sigmoid()
+
+    x_center = (priors[..., 0] + priors[..., 2]) * 0.5
+    y_center = (priors[..., 1] + priors[..., 3]) * 0.5
+    w = priors[..., 2] - priors[..., 0]
+    h = priors[..., 3] - priors[..., 1]
+
+    x_center_pred = (bbox_preds[..., 0] - 0.5) * 2 * stride + x_center
+    y_center_pred = (bbox_preds[..., 1] - 0.5) * 2 * stride + y_center
+    w_pred = (bbox_preds[..., 2] * 2)**2 * w
+    h_pred = (bbox_preds[..., 3] * 2)**2 * h
+
+    decoded_bboxes = torch.stack(
+        [x_center_pred, y_center_pred, w_pred, h_pred], dim=-1)
+
+    return decoded_bboxes
+
+
+def rtmdet_bbox_decoder(priors: Tensor, bbox_preds: Tensor,
+                        stride: Optional[Tensor]) -> Tensor:
+    stride = stride[None, :, None]
+    bbox_preds *= stride
+    tl_x = (priors[..., 0] - bbox_preds[..., 0])
+    tl_y = (priors[..., 1] - bbox_preds[..., 1])
+    br_x = (priors[..., 0] + bbox_preds[..., 2])
+    br_y = (priors[..., 1] + bbox_preds[..., 3])
+    decoded_bboxes = torch.stack([tl_x, tl_y, br_x, br_y], -1)
+    return decoded_bboxes
+
+
+def yolox_bbox_decoder(priors: Tensor, bbox_preds: Tensor,
+                       stride: Optional[Tensor]) -> Tensor:
+    stride = stride[None, :, None]
+    xys = (bbox_preds[..., :2] * stride) + priors
+    whs = bbox_preds[..., 2:].exp() * stride
+    decoded_bboxes = torch.cat([xys, whs], -1)
+    return decoded_bboxes
diff --git a/mmdetection_practice/third_party/mmyolo/projects/easydeploy/deepstream/CMakeLists.txt b/mmdetection_practice/third_party/mmyolo/projects/easydeploy/deepstream/CMakeLists.txt
new file mode 100644
index 0000000..f640bea
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/projects/easydeploy/deepstream/CMakeLists.txt
@@ -0,0 +1,35 @@
+cmake_minimum_required(VERSION 2.8.12)
+
+set(CMAKE_CUDA_ARCHITECTURES 60 61 62 70 72 75 86)
+set(CMAKE_CUDA_COMPILER /usr/local/cuda/bin/nvcc)
+
+project(nvdsparsebbox_mmyolo LANGUAGES CXX)
+
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 -O3 -g -Wall -Werror -shared -fPIC")
+set(CMAKE_CXX_STANDARD 14)
+set(CMAKE_BUILD_TYPE Release)
+option(CUDA_USE_STATIC_CUDA_RUNTIME OFF)
+
+# CUDA
+find_package(CUDA REQUIRED)
+
+# TensorRT
+set(TensorRT_INCLUDE_DIRS "/usr/include/x86_64-linux-gnu" CACHE STRING "TensorRT headers path")
+set(TensorRT_LIBRARIES "/usr/lib/x86_64-linux-gnu" CACHE STRING "TensorRT libs path")
+
+# DeepStream
+set(DEEPSTREAM "/opt/nvidia/deepstream/deepstream" CACHE STRING "DeepStream root path")
+set(DS_LIBRARIES ${DEEPSTREAM}/lib)
+set(DS_INCLUDE_DIRS ${DEEPSTREAM}/sources/includes)
+
+include_directories(
+        ${CUDA_INCLUDE_DIRS}
+        ${TensorRT_INCLUDE_DIRS}
+        ${DS_INCLUDE_DIRS})
+
+add_library(
+        ${PROJECT_NAME}
+        SHARED
+        custom_mmyolo_bbox_parser/nvdsparsebbox_mmyolo.cpp)
+
+target_link_libraries(${PROJECT_NAME} PRIVATE nvinfer nvinfer_plugin)
diff --git a/mmdetection_practice/third_party/mmyolo/projects/easydeploy/deepstream/README.md b/mmdetection_practice/third_party/mmyolo/projects/easydeploy/deepstream/README.md
new file mode 100644
index 0000000..111f376
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/projects/easydeploy/deepstream/README.md
@@ -0,0 +1,48 @@
+# Inference MMYOLO Models with DeepStream
+
+This project demonstrates how to inference MMYOLO models with customized parsers in [DeepStream SDK](https://developer.nvidia.com/deepstream-sdk).
+
+## Pre-requisites
+
+### 1. Install Nvidia Driver and CUDA
+
+First, please follow the official documents and instructions to install dedicated Nvidia graphic driver and CUDA matched to your gpu and target Nvidia AIoT devices.
+
+### 2. Install DeepStream SDK
+
+Second, please follow the official instruction to download and install DeepStream SDK. Currently stable version of DeepStream is v6.2.
+
+### 3. Generate TensorRT Engine
+
+As DeepStream builds on top of several NVIDIA libraries, you need to first convert your trained MMYOLO models to TensorRT engine files. We strongly recommend you to try the supported TensorRT deployment solution in [EasyDeploy](../../easydeploy/).
+
+## Build and Run
+
+Please make sure that your converted TensorRT engine is already located in the `deepstream` folder as the config shows. Create your own model config files and change the `config-file` parameter in [deepstream_app_config.txt](deepstream_app_config.txt) to the model you want to run with.
+
+```bash
+mkdir build && cd build
+cmake ..
+make -j$(nproc) && make install
+```
+
+Then you can run the inference with this command.
+
+```bash
+deepstream-app -c deepstream_app_config.txt
+```
+
+## Code Structure
+
+```bash
+├── deepstream
+│   ├── configs                   # config file for MMYOLO models
+│   │   └── config_infer_rtmdet.txt
+│   ├── custom_mmyolo_bbox_parser # customized parser for MMYOLO models to DeepStream formats
+│   │   └── nvdsparsebbox_mmyolo.cpp
+|   ├── CMakeLists.txt
+│   ├── coco_labels.txt           # labels for coco detection
+│   ├── deepstream_app_config.txt # deepStream reference app configs for MMYOLO models
+│   ├── README_zh-CN.md
+│   └── README.md
+```
diff --git a/mmdetection_practice/third_party/mmyolo/projects/easydeploy/deepstream/README_zh-CN.md b/mmdetection_practice/third_party/mmyolo/projects/easydeploy/deepstream/README_zh-CN.md
new file mode 100644
index 0000000..13a85d5
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/projects/easydeploy/deepstream/README_zh-CN.md
@@ -0,0 +1,48 @@
+# 使用 DeepStream SDK 推理 MMYOLO 模型
+
+本项目演示了如何使用 [DeepStream SDK](https://developer.nvidia.com/deepstream-sdk) 配合改写的 parser 来推理 MMYOLO 的模型。
+
+## 预先准备
+
+### 1. 安装 Nidia 驱动和 CUDA
+
+首先请根据当前的显卡驱动和目标使用设备的驱动完成显卡驱动和 CUDA 的安装。
+
+### 2. 安装 DeepStream SDK
+
+目前 DeepStream SDK 稳定版本已经更新到 v6.2,官方推荐使用这个版本。
+
+### 3. 将 MMYOLO 模型转换为 TensorRT Engine
+
+推荐使用 EasyDeploy 中的 TensorRT 方案完成目标模型的转换部署,具体可参考 [此文档](../../easydeploy/docs/model_convert.md) 。
+
+## 编译使用
+
+当前项目使用的是 MMYOLO 的 rtmdet 模型,若想使用其他的模型,请参照目录下的配置文件进行改写。然后将转换完的 TensorRT engine 放在当前目录下并执行如下命令:
+
+```bash
+mkdir build && cd build
+cmake ..
+make -j$(nproc) && make install
+```
+
+完成编译后可使用如下命令进行推理:
+
+```bash
+deepstream-app -c deepstream_app_config.txt
+```
+
+## 项目代码结构
+
+```bash
+├── deepstream
+│   ├── configs                   # MMYOLO 模型对应的 DeepStream 配置
+│   │   └── config_infer_rtmdet.txt
+│   ├── custom_mmyolo_bbox_parser # 适配 DeepStream formats 的 parser
+│   │   └── nvdsparsebbox_mmyolo.cpp
+|   ├── CMakeLists.txt
+│   ├── coco_labels.txt           # coco labels
+│   ├── deepstream_app_config.txt # DeepStream app 配置
+│   ├── README_zh-CN.md
+│   └── README.md
+```
diff --git a/mmdetection_practice/third_party/mmyolo/projects/easydeploy/deepstream/coco_labels.txt b/mmdetection_practice/third_party/mmyolo/projects/easydeploy/deepstream/coco_labels.txt
new file mode 100644
index 0000000..ca76c80
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/projects/easydeploy/deepstream/coco_labels.txt
@@ -0,0 +1,80 @@
+person
+bicycle
+car
+motorbike
+aeroplane
+bus
+train
+truck
+boat
+traffic light
+fire hydrant
+stop sign
+parking meter
+bench
+bird
+cat
+dog
+horse
+sheep
+cow
+elephant
+bear
+zebra
+giraffe
+backpack
+umbrella
+handbag
+tie
+suitcase
+frisbee
+skis
+snowboard
+sports ball
+kite
+baseball bat
+baseball glove
+skateboard
+surfboard
+tennis racket
+bottle
+wine glass
+cup
+fork
+knife
+spoon
+bowl
+banana
+apple
+sandwich
+orange
+broccoli
+carrot
+hot dog
+pizza
+donut
+cake
+chair
+sofa
+pottedplant
+bed
+diningtable
+toilet
+tvmonitor
+laptop
+mouse
+remote
+keyboard
+cell phone
+microwave
+oven
+toaster
+sink
+refrigerator
+book
+clock
+vase
+scissors
+teddy bear
+hair drier
+toothbrush
diff --git a/mmdetection_practice/third_party/mmyolo/projects/easydeploy/deepstream/configs/config_infer_rtmdet.txt b/mmdetection_practice/third_party/mmyolo/projects/easydeploy/deepstream/configs/config_infer_rtmdet.txt
new file mode 100644
index 0000000..a1e5efd
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/projects/easydeploy/deepstream/configs/config_infer_rtmdet.txt
@@ -0,0 +1,22 @@
+[property]
+gpu-id=0
+net-scale-factor=0.01735207357279195
+offsets=57.375;57.12;58.395
+model-color-format=1
+model-engine-file=../end2end.engine
+labelfile-path=../coco_labels.txt
+batch-size=1
+network-mode=0
+num-detected-classes=80
+interval=0
+gie-unique-id=1
+process-mode=1
+network-type=0
+cluster-mode=2
+maintain-aspect-ratio=1
+parse-bbox-func-name=NvDsInferParseCustomMMYOLO
+custom-lib-path=../build/libnvdsparsebbox_mmyolo.so
+
+[class-attrs-all]
+pre-cluster-threshold=0.45
+topk=100
diff --git a/mmdetection_practice/third_party/mmyolo/projects/easydeploy/deepstream/configs/config_infer_yolov5.txt b/mmdetection_practice/third_party/mmyolo/projects/easydeploy/deepstream/configs/config_infer_yolov5.txt
new file mode 100644
index 0000000..6ad7d64
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/projects/easydeploy/deepstream/configs/config_infer_yolov5.txt
@@ -0,0 +1,21 @@
+[property]
+gpu-id=0
+net-scale-factor=0.0039215697906911373
+model-color-format=0
+model-engine-file=../end2end.engine
+labelfile-path=../coco_labels.txt
+batch-size=1
+network-mode=0
+num-detected-classes=80
+interval=0
+gie-unique-id=1
+process-mode=1
+network-type=0
+cluster-mode=2
+maintain-aspect-ratio=1
+parse-bbox-func-name=NvDsInferParseCustomMMYOLO
+custom-lib-path=../build/libnvdsparsebbox_mmyolo.so
+
+[class-attrs-all]
+pre-cluster-threshold=0.45
+topk=100
diff --git a/mmdetection_practice/third_party/mmyolo/projects/easydeploy/deepstream/configs/config_infer_yolov8.txt b/mmdetection_practice/third_party/mmyolo/projects/easydeploy/deepstream/configs/config_infer_yolov8.txt
new file mode 100644
index 0000000..6ad7d64
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/projects/easydeploy/deepstream/configs/config_infer_yolov8.txt
@@ -0,0 +1,21 @@
+[property]
+gpu-id=0
+net-scale-factor=0.0039215697906911373
+model-color-format=0
+model-engine-file=../end2end.engine
+labelfile-path=../coco_labels.txt
+batch-size=1
+network-mode=0
+num-detected-classes=80
+interval=0
+gie-unique-id=1
+process-mode=1
+network-type=0
+cluster-mode=2
+maintain-aspect-ratio=1
+parse-bbox-func-name=NvDsInferParseCustomMMYOLO
+custom-lib-path=../build/libnvdsparsebbox_mmyolo.so
+
+[class-attrs-all]
+pre-cluster-threshold=0.45
+topk=100
diff --git a/mmdetection_practice/third_party/mmyolo/projects/easydeploy/deepstream/custom_mmyolo_bbox_parser/nvdsparsebbox_mmyolo.cpp b/mmdetection_practice/third_party/mmyolo/projects/easydeploy/deepstream/custom_mmyolo_bbox_parser/nvdsparsebbox_mmyolo.cpp
new file mode 100644
index 0000000..eb78085
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/projects/easydeploy/deepstream/custom_mmyolo_bbox_parser/nvdsparsebbox_mmyolo.cpp
@@ -0,0 +1,118 @@
+#include "nvdsinfer_custom_impl.h"
+#include <cassert>
+#include <iostream>
+
+/**
+ * Function expected by DeepStream for decoding the MMYOLO output.
+ *
+ * C-linkage [extern "C"] was written to prevent name-mangling. This function must return true after
+ * adding all bounding boxes to the objectList vector.
+ *
+ * @param [outputLayersInfo] std::vector of NvDsInferLayerInfo objects with information about the output layer.
+ * @param [networkInfo] NvDsInferNetworkInfo object with information about the MMYOLO network.
+ * @param [detectionParams] NvDsInferParseDetectionParams with information about some config params.
+ * @param [objectList] std::vector of NvDsInferParseObjectInfo objects to which bounding box information must
+ * be stored.
+ *
+ * @return true
+ */
+
+// This is just the function prototype. The definition is written at the end of the file.
+extern "C" bool NvDsInferParseCustomMMYOLO(
+	std::vector<NvDsInferLayerInfo> const& outputLayersInfo,
+	NvDsInferNetworkInfo const& networkInfo,
+	NvDsInferParseDetectionParams const& detectionParams,
+	std::vector<NvDsInferParseObjectInfo>& objectList);
+
+static __inline__ float clamp(float& val, float min, float max)
+{
+	return val > min ? (val < max ? val : max) : min;
+}
+
+static std::vector<NvDsInferParseObjectInfo> decodeMMYoloTensor(
+	const int* num_dets,
+	const float* bboxes,
+	const float* scores,
+	const int* labels,
+	const float& conf_thres,
+	const unsigned int& img_w,
+	const unsigned int& img_h
+)
+{
+	std::vector<NvDsInferParseObjectInfo> bboxInfo;
+	size_t nums = num_dets[0];
+	for (size_t i = 0; i < nums; i++)
+	{
+		float score = scores[i];
+		if (score < conf_thres)continue;
+		float x0 = (bboxes[i * 4]);
+		float y0 = (bboxes[i * 4 + 1]);
+		float x1 = (bboxes[i * 4 + 2]);
+		float y1 = (bboxes[i * 4 + 3]);
+		x0 = clamp(x0, 0.f, img_w);
+		y0 = clamp(y0, 0.f, img_h);
+		x1 = clamp(x1, 0.f, img_w);
+		y1 = clamp(y1, 0.f, img_h);
+		NvDsInferParseObjectInfo obj;
+		obj.left = x0;
+		obj.top = y0;
+		obj.width = x1 - x0;
+		obj.height = y1 - y0;
+		obj.detectionConfidence = score;
+		obj.classId = labels[i];
+		bboxInfo.push_back(obj);
+	}
+
+	return bboxInfo;
+}
+
+/* C-linkage to prevent name-mangling */
+extern "C" bool NvDsInferParseCustomMMYOLO(
+	std::vector<NvDsInferLayerInfo> const& outputLayersInfo,
+	NvDsInferNetworkInfo const& networkInfo,
+	NvDsInferParseDetectionParams const& detectionParams,
+	std::vector<NvDsInferParseObjectInfo>& objectList)
+{
+
+// Some assertions and error checking.
+	if (outputLayersInfo.empty() || outputLayersInfo.size() != 4)
+	{
+		std::cerr << "Could not find output layer in bbox parsing" << std::endl;
+		return false;
+	}
+
+//	Score threshold of bboxes.
+	const float conf_thres = detectionParams.perClassThreshold[0];
+
+// Obtaining the output layer.
+	const NvDsInferLayerInfo& num_dets = outputLayersInfo[0];
+	const NvDsInferLayerInfo& bboxes = outputLayersInfo[1];
+	const NvDsInferLayerInfo& scores = outputLayersInfo[2];
+	const NvDsInferLayerInfo& labels = outputLayersInfo[3];
+
+// num_dets(int) bboxes(float) scores(float) labels(int)
+	assert (num_dets.dims.numDims == 2);
+	assert (bboxes.dims.numDims == 3);
+	assert (scores.dims.numDims == 2);
+	assert (labels.dims.numDims == 2);
+
+
+// Decoding the output tensor of MMYOLO to the NvDsInferParseObjectInfo format.
+	std::vector<NvDsInferParseObjectInfo> objects =
+		decodeMMYoloTensor(
+			(const int*)(num_dets.buffer),
+			(const float*)(bboxes.buffer),
+			(const float*)(scores.buffer),
+			(const int*)(labels.buffer),
+			conf_thres,
+			networkInfo.width,
+			networkInfo.height
+		);
+
+	objectList.clear();
+	objectList = objects;
+	return true;
+}
+
+/* Check that the custom function has been defined correctly */
+CHECK_CUSTOM_PARSE_FUNC_PROTOTYPE(NvDsInferParseCustomMMYOLO);
diff --git a/mmdetection_practice/third_party/mmyolo/projects/easydeploy/deepstream/deepstream_app_config.txt b/mmdetection_practice/third_party/mmyolo/projects/easydeploy/deepstream/deepstream_app_config.txt
new file mode 100644
index 0000000..3317768
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/projects/easydeploy/deepstream/deepstream_app_config.txt
@@ -0,0 +1,62 @@
+[application]
+enable-perf-measurement=1
+perf-measurement-interval-sec=5
+
+[tiled-display]
+enable=1
+rows=1
+columns=1
+width=1280
+height=720
+gpu-id=0
+nvbuf-memory-type=0
+
+[source0]
+enable=1
+type=3
+uri=file:///opt/nvidia/deepstream/deepstream/samples/streams/sample_1080p_h264.mp4
+num-sources=1
+gpu-id=0
+cudadec-memtype=0
+
+[sink0]
+enable=1
+type=2
+sync=0
+gpu-id=0
+nvbuf-memory-type=0
+
+[osd]
+enable=1
+gpu-id=0
+border-width=5
+text-size=15
+text-color=1;1;1;1;
+text-bg-color=0.3;0.3;0.3;1
+font=Serif
+show-clock=0
+clock-x-offset=800
+clock-y-offset=820
+clock-text-size=12
+clock-color=1;0;0;0
+nvbuf-memory-type=0
+
+[streammux]
+gpu-id=0
+live-source=0
+batch-size=1
+batched-push-timeout=40000
+width=1920
+height=1080
+enable-padding=0
+nvbuf-memory-type=0
+
+[primary-gie]
+enable=1
+gpu-id=0
+gie-unique-id=1
+nvbuf-memory-type=0
+config-file=configs/config_infer_rtmdet.txt
+
+[tests]
+file-loop=0
diff --git a/mmdetection_practice/third_party/mmyolo/projects/easydeploy/docs/model_convert.md b/mmdetection_practice/third_party/mmyolo/projects/easydeploy/docs/model_convert.md
new file mode 100644
index 0000000..9af6259
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/projects/easydeploy/docs/model_convert.md
@@ -0,0 +1,156 @@
+# MMYOLO 模型 ONNX 转换
+
+## 1. 导出后端支持的 ONNX
+
+## 环境依赖
+
+- [onnx](https://github.com/onnx/onnx)
+
+  ```shell
+  pip install onnx
+  ```
+
+  [onnx-simplifier](https://github.com/daquexian/onnx-simplifier) (可选,用于简化模型)
+
+  ```shell
+  pip install onnx-simplifier
+  ```
+
+\*\*\* 请确保您在 `MMYOLO` 根目录下运行相关脚本,避免无法找到相关依赖包。\*\*\*
+
+## 使用方法
+
+[模型导出脚本](./projects/easydeploy/tools/export_onnx.py)用于将 `MMYOLO` 模型转换为 `onnx` 。
+
+### 参数介绍:
+
+- `config` : 构建模型使用的配置文件,如 [`yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py`](./configs/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py) 。
+- `checkpoint` : 训练得到的权重文件,如 `yolov5s.pth` 。
+- `--work-dir` : 转换后的模型保存路径。
+- `--img-size`: 转换模型时输入的尺寸,如 `640 640`。
+- `--batch-size`: 转换后的模型输入 `batch size` 。
+- `--device`: 转换模型使用的设备,默认为 `cuda:0`。
+- `--simplify`: 是否简化导出的 `onnx` 模型,需要安装 [onnx-simplifier](https://github.com/daquexian/onnx-simplifier),默认关闭。
+- `--opset`: 指定导出 `onnx` 的 `opset`,默认为 `11` 。
+- `--backend`: 指定导出 `onnx` 用于的后端名称,`ONNXRuntime`: `onnxruntime`, `TensorRT8`: `tensorrt8`, `TensorRT7`: `tensorrt7`,默认为`onnxruntime`即 `ONNXRuntime`。
+- `--pre-topk`: 指定导出 `onnx` 的后处理筛选候选框个数阈值,默认为 `1000`。
+- `--keep-topk`: 指定导出 `onnx` 的非极大值抑制输出的候选框个数阈值,默认为 `100`。
+- `--iou-threshold`: 非极大值抑制中过滤重复候选框的 `iou` 阈值,默认为 `0.65`。
+- `--score-threshold`: 非极大值抑制中过滤候选框得分的阈值,默认为 `0.25`。
+- `--model-only`: 指定仅导出模型 backbone + neck, 不包含后处理,默认关闭。
+
+例子:
+
+```shell
+python ./projects/easydeploy/tools/export.py \
+	configs/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py \
+	yolov5s.pth \
+	--work-dir work_dir \
+    --img-size 640 640 \
+    --batch 1 \
+    --device cpu \
+    --simplify \
+	--opset 11 \
+	--backend 1 \
+	--pre-topk 1000 \
+	--keep-topk 100 \
+	--iou-threshold 0.65 \
+	--score-threshold 0.25
+```
+
+然后利用后端支持的工具如 `TensorRT` 读取 `onnx` 再次转换为后端支持的模型格式如 `.engine/.plan` 等。
+
+`MMYOLO` 目前支持 `TensorRT8`, `TensorRT7`, `ONNXRuntime` 后端的端到端模型转换,目前仅支持静态 shape 模型的导出和转换,动态 batch 或动态长宽的模型端到端转换会在未来继续支持。
+
+端到端转换得到的 `onnx` 模型输入输出如图:
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/92794867/232403745-101ca999-2003-46fa-bc5b-6b0eb2b2d41b.png"/>
+</div>
+
+输入名: `images`, 尺寸 640x640
+
+输出名: `num_dets`, 尺寸 1x1,表示检测目标数量。
+
+输出名: `boxes`, 尺寸 1x100x4,表示检测框的坐标,格式为 `x1y1x2y1`。
+
+输出名: `scores`, 尺寸 1x100,表示检测框的分数。
+
+输出名: `labels`, 尺寸 1x100,表示检测框的类别 id。
+
+可以利用 `num_dets` 中的个数对 `boxes`, `scores`, `labels` 进行截断,从 100 个检测结果中抽取前 `num_dets` 个目标作为最终检测结果。
+
+## 2. 仅导出模型 Backbone + Neck
+
+当您需要部署在非 `TensorRT`, `ONNXRuntime` 等支持端到端部署的平台时,您可以考虑使用`--model-only` 参数并且不要传递 `--backend` 参数,您将会导出仅包含 `Backbone` + `neck` 的模型,模型的部分输出如图:
+
+<div align=center>
+<img src="https://user-images.githubusercontent.com/92794867/232406169-40eee9fd-bc53-4fdc-bd37-d0e9033826f9.png"/>
+</div>
+
+这种导出方式获取的 `ONNX` 模型具有如下优点:
+
+- 算子简单,一般而言只包含 `Conv`,激活函数等简单算子,几乎不存在无法正确导出的情况,对于嵌入式部署更加友好。
+- 方便不同算法之间对比速度性能,由于不同的算法后处理不同,仅对比 `backbone` + `Neck` 的速度更加公平。
+
+也有如下缺点:
+
+- 后处理逻辑需要单独完成,会有额外的 `decode` + `nms` 的操作需要实现。
+- 与 `TensorRT` 相比,由于 `TensorRT` 可以利用多核优势并行进行后处理,使用 `--model-only` 方式导出的模型性能会差很多。
+
+### 使用方法
+
+```shell
+python ./projects/easydeploy/tools/export.py \
+	configs/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py \
+	yolov5s.pth \
+	--work-dir work_dir \
+    --img-size 640 640 \
+    --batch 1 \
+    --device cpu \
+    --simplify \
+	--opset 11 \
+	--model-only
+```
+
+## 使用 `model-only` 导出的 ONNX 进行推理
+
+[模型推理脚本](./projects/easydeploy/examples/main_onnxruntime.py)用于推理导出的 `ONNX` 模型,需要安装基础依赖环境:
+
+[`onnxruntime`](https://github.com/microsoft/onnxruntime) 和 [`opencv-python`](https://github.com/opencv/opencv-python)
+
+```shell
+pip install onnxruntime
+pip install opencv-python==4.7.0.72 # 建议使用最新的 opencv
+```
+
+### 参数介绍:
+
+- `img` : 待检测的图片路径或图片文件夹路径。
+- `onnx` : 导出的 `model-only` ONNX 模型。
+- `--type` : 模型名称,目前支持 `yolov5`, `yolox`, `yolov6`, `ppyoloe`, `ppyoloep`, `yolov7`, `rtmdet`, `yolov8`。
+- `--img-size`: 转换模型时输入的尺寸,如 `640 640`。
+- `--out-dir`: 保存检测结果的路径 。
+- `--show`: 是否可视化检测结果。
+- `--score-thr`: 模型检测后处理的置信度分数 。
+- `--iou-thr`: 模型检测后处理的 IOU 分数 。
+
+## 使用方法
+
+```shell
+cd ./projects/easydeploy/examples
+python main_onnxruntime.py \
+	"image_path_to_detect" \
+	yolov5_s_model-only.onnx \
+	--out-dir work_dir \
+    --img-size 640 640 \
+    --show \
+    --score-thr 0.3 \
+    --iou-thr 0.7
+```
+
+*注意!!!*
+
+当您使用自定义数据集训练得到的模型时,请修改 [`config.py`](./projects/easydeploy/examples/config.py) 中 `CLASS_NAMES` 和 `CLASS_COLORS`,如果是 `yolov5` 或者 `yolov7` 基于 `anchor` 的模型请同时修改 `YOLOv5_ANCHORS` 和 `YOLOv7_ANCHORS`。
+
+[`numpy_coder.py`](./projects/easydeploy/examples/numpy_coder.py) 是目前所有算法仅使用 `numpy` 实现的 `decoder`,如果您对性能有较高的要求,可以参照相关代码改写为 `c/c++`。
diff --git a/mmdetection_practice/third_party/mmyolo/projects/easydeploy/examples/config.py b/mmdetection_practice/third_party/mmyolo/projects/easydeploy/examples/config.py
new file mode 100644
index 0000000..4a85ff3
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/projects/easydeploy/examples/config.py
@@ -0,0 +1,64 @@
+from enum import Enum
+
+
+class TASK_TYPE(Enum):
+    DET = 'det'
+    SEG = 'seg'
+    POSE = 'pose'
+
+
+class ModelType(Enum):
+    YOLOV5 = 'yolov5'
+    YOLOX = 'yolox'
+    PPYOLOE = 'ppyoloe'
+    PPYOLOEP = 'ppyoloep'
+    YOLOV6 = 'yolov6'
+    YOLOV7 = 'yolov7'
+    RTMDET = 'rtmdet'
+    YOLOV8 = 'yolov8'
+
+
+CLASS_NAMES = ('person', 'bicycle', 'car', 'motorcycle', 'airplane', 'bus',
+               'train', 'truck', 'boat', 'traffic light', 'fire hydrant',
+               'stop sign', 'parking meter', 'bench', 'bird', 'cat', 'dog',
+               'horse', 'sheep', 'cow', 'elephant', 'bear', 'zebra', 'giraffe',
+               'backpack', 'umbrella', 'handbag', 'tie', 'suitcase', 'frisbee',
+               'skis', 'snowboard', 'sports ball', 'kite', 'baseball bat',
+               'baseball glove', 'skateboard', 'surfboard', 'tennis racket',
+               'bottle', 'wine glass', 'cup', 'fork', 'knife', 'spoon', 'bowl',
+               'banana', 'apple', 'sandwich', 'orange', 'broccoli', 'carrot',
+               'hot dog', 'pizza', 'donut', 'cake', 'chair', 'couch',
+               'potted plant', 'bed', 'dining table', 'toilet', 'tv', 'laptop',
+               'mouse', 'remote', 'keyboard', 'cell phone', 'microwave',
+               'oven', 'toaster', 'sink', 'refrigerator', 'book', 'clock',
+               'vase', 'scissors', 'teddy bear', 'hair drier', 'toothbrush')
+
+CLASS_COLORS = [(220, 20, 60), (119, 11, 32), (0, 0, 142), (0, 0, 230),
+                (106, 0, 228), (0, 60, 100), (0, 80, 100), (0, 0, 70),
+                (0, 0, 192), (250, 170, 30), (100, 170, 30), (220, 220, 0),
+                (175, 116, 175), (250, 0, 30), (165, 42, 42), (255, 77, 255),
+                (0, 226, 252), (182, 182, 255), (0, 82, 0), (120, 166, 157),
+                (110, 76, 0), (174, 57, 255), (199, 100, 0), (72, 0, 118),
+                (255, 179, 240), (0, 125, 92), (209, 0, 151), (188, 208, 182),
+                (0, 220, 176), (255, 99, 164), (92, 0, 73), (133, 129, 255),
+                (78, 180, 255), (0, 228, 0), (174, 255, 243), (45, 89, 255),
+                (134, 134, 103), (145, 148, 174), (255, 208, 186),
+                (197, 226, 255), (171, 134, 1), (109, 63, 54), (207, 138, 255),
+                (151, 0, 95), (9, 80, 61), (84, 105, 51), (74, 65, 105),
+                (166, 196, 102), (208, 195, 210), (255, 109, 65),
+                (0, 143, 149), (179, 0, 194), (209, 99, 106), (5, 121, 0),
+                (227, 255, 205), (147, 186, 208), (153, 69, 1), (3, 95, 161),
+                (163, 255, 0), (119, 0, 170), (0, 182, 199), (0, 165, 120),
+                (183, 130, 88), (95, 32, 0), (130, 114, 135), (110, 129, 133),
+                (166, 74, 118), (219, 142, 185), (79, 210, 114), (178, 90, 62),
+                (65, 70, 15), (127, 167, 115), (59, 105, 106), (142, 108, 45),
+                (196, 172, 0), (95, 54, 80), (128, 76, 255), (201, 57, 1),
+                (246, 0, 122), (191, 162, 208)]
+
+YOLOv5_ANCHORS = [[(10, 13), (16, 30), (33, 23)],
+                  [(30, 61), (62, 45), (59, 119)],
+                  [(116, 90), (156, 198), (373, 326)]]
+
+YOLOv7_ANCHORS = [[(12, 16), (19, 36), (40, 28)],
+                  [(36, 75), (76, 55), (72, 146)],
+                  [(142, 110), (192, 243), (459, 401)]]
diff --git a/mmdetection_practice/third_party/mmyolo/projects/easydeploy/examples/cv2_nms.py b/mmdetection_practice/third_party/mmyolo/projects/easydeploy/examples/cv2_nms.py
new file mode 100644
index 0000000..79e3763
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/projects/easydeploy/examples/cv2_nms.py
@@ -0,0 +1,36 @@
+from typing import List, Tuple, Union
+
+import cv2
+from numpy import ndarray
+
+MAJOR, MINOR = map(int, cv2.__version__.split('.')[:2])
+assert MAJOR == 4
+
+
+def non_max_suppression(boxes: Union[List[ndarray], Tuple[ndarray]],
+                        scores: Union[List[float], Tuple[float]],
+                        labels: Union[List[int], Tuple[int]],
+                        conf_thres: float = 0.25,
+                        iou_thres: float = 0.65) -> Tuple[List, List, List]:
+    if MINOR >= 7:
+        indices = cv2.dnn.NMSBoxesBatched(boxes, scores, labels, conf_thres,
+                                          iou_thres)
+    elif MINOR == 6:
+        indices = cv2.dnn.NMSBoxes(boxes, scores, conf_thres, iou_thres)
+    else:
+        indices = cv2.dnn.NMSBoxes(boxes, scores, conf_thres,
+                                   iou_thres).flatten()
+
+    nmsd_boxes = []
+    nmsd_scores = []
+    nmsd_labels = []
+    for idx in indices:
+        box = boxes[idx]
+        # x0y0wh -> x0y0x1y1
+        box[2:] = box[:2] + box[2:]
+        score = scores[idx]
+        label = labels[idx]
+        nmsd_boxes.append(box)
+        nmsd_scores.append(score)
+        nmsd_labels.append(label)
+    return nmsd_boxes, nmsd_scores, nmsd_labels
diff --git a/mmdetection_practice/third_party/mmyolo/projects/easydeploy/examples/main_onnxruntime.py b/mmdetection_practice/third_party/mmyolo/projects/easydeploy/examples/main_onnxruntime.py
new file mode 100644
index 0000000..bc0ad1b
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/projects/easydeploy/examples/main_onnxruntime.py
@@ -0,0 +1,110 @@
+import math
+import sys
+from argparse import ArgumentParser
+from pathlib import Path
+
+import cv2
+import onnxruntime
+from config import (CLASS_COLORS, CLASS_NAMES, ModelType, YOLOv5_ANCHORS,
+                    YOLOv7_ANCHORS)
+from cv2_nms import non_max_suppression
+from numpy_coder import Decoder
+from preprocess import Preprocess
+from tqdm import tqdm
+
+# Add __FILE__  to sys.path
+sys.path.append(str(Path(__file__).resolve().parents[0]))
+
+IMG_EXTENSIONS = ('.jpg', '.jpeg', '.png', '.ppm', '.bmp', '.pgm', '.tif',
+                  '.tiff', '.webp')
+
+
+def path_to_list(path: str):
+    path = Path(path)
+    if path.is_file() and path.suffix in IMG_EXTENSIONS:
+        res_list = [str(path.absolute())]
+    elif path.is_dir():
+        res_list = [
+            str(p.absolute()) for p in path.iterdir()
+            if p.suffix in IMG_EXTENSIONS
+        ]
+    else:
+        raise RuntimeError
+    return res_list
+
+
+def parse_args():
+    parser = ArgumentParser()
+    parser.add_argument(
+        'img', help='Image path, include image file, dir and URL.')
+    parser.add_argument('onnx', type=str, help='Onnx file')
+    parser.add_argument('--type', type=str, help='Model type')
+    parser.add_argument(
+        '--img-size',
+        nargs='+',
+        type=int,
+        default=[640, 640],
+        help='Image size of height and width')
+    parser.add_argument(
+        '--out-dir', default='./output', type=str, help='Path to output file')
+    parser.add_argument(
+        '--show', action='store_true', help='Show the detection results')
+    parser.add_argument(
+        '--score-thr', type=float, default=0.3, help='Bbox score threshold')
+    parser.add_argument(
+        '--iou-thr', type=float, default=0.7, help='Bbox iou threshold')
+    args = parser.parse_args()
+    return args
+
+
+def main():
+    args = parse_args()
+    out_dir = Path(args.out_dir)
+    model_type = ModelType(args.type.lower())
+
+    if not args.show:
+        out_dir.mkdir(parents=True, exist_ok=True)
+
+    files = path_to_list(args.img)
+    session = onnxruntime.InferenceSession(
+        args.onnx, providers=['CPUExecutionProvider'])
+    preprocessor = Preprocess(model_type)
+    decoder = Decoder(model_type, model_only=True)
+    if model_type == ModelType.YOLOV5:
+        anchors = YOLOv5_ANCHORS
+    elif model_type == ModelType.YOLOV7:
+        anchors = YOLOv7_ANCHORS
+    else:
+        anchors = None
+
+    for file in tqdm(files):
+        image = cv2.imread(file)
+        image_h, image_w = image.shape[:2]
+        img, (ratio_w, ratio_h) = preprocessor(image, args.img_size)
+        features = session.run(None, {'images': img})
+        decoder_outputs = decoder(
+            features,
+            args.score_thr,
+            num_labels=len(CLASS_NAMES),
+            anchors=anchors)
+        nmsd_boxes, nmsd_scores, nmsd_labels = non_max_suppression(
+            *decoder_outputs, args.score_thr, args.iou_thr)
+        for box, score, label in zip(nmsd_boxes, nmsd_scores, nmsd_labels):
+            x0, y0, x1, y1 = box
+            x0 = math.floor(min(max(x0 / ratio_w, 1), image_w - 1))
+            y0 = math.floor(min(max(y0 / ratio_h, 1), image_h - 1))
+            x1 = math.ceil(min(max(x1 / ratio_w, 1), image_w - 1))
+            y1 = math.ceil(min(max(y1 / ratio_h, 1), image_h - 1))
+            cv2.rectangle(image, (x0, y0), (x1, y1), CLASS_COLORS[label], 2)
+            cv2.putText(image, f'{CLASS_NAMES[label]}: {score:.2f}',
+                        (x0, y0 - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5,
+                        (0, 255, 255), 2)
+        if args.show:
+            cv2.imshow('result', image)
+            cv2.waitKey(0)
+        else:
+            cv2.imwrite(f'{out_dir / Path(file).name}', image)
+
+
+if __name__ == '__main__':
+    main()
diff --git a/mmdetection_practice/third_party/mmyolo/projects/easydeploy/examples/numpy_coder.py b/mmdetection_practice/third_party/mmyolo/projects/easydeploy/examples/numpy_coder.py
new file mode 100644
index 0000000..ccd3687
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/projects/easydeploy/examples/numpy_coder.py
@@ -0,0 +1,310 @@
+from typing import List, Tuple, Union
+
+import numpy as np
+from config import ModelType
+from numpy import ndarray
+
+
+def softmax(x: ndarray, axis: int = -1) -> ndarray:
+    e_x = np.exp(x - np.max(x, axis=axis, keepdims=True))
+    y = e_x / e_x.sum(axis=axis, keepdims=True)
+    return y
+
+
+def sigmoid(x: ndarray) -> ndarray:
+    return 1. / (1. + np.exp(-x))
+
+
+class Decoder:
+
+    def __init__(self, model_type: ModelType, model_only: bool = False):
+        self.model_type = model_type
+        self.model_only = model_only
+        self.boxes_pro = []
+        self.scores_pro = []
+        self.labels_pro = []
+        self.is_logging = False
+
+    def __call__(self,
+                 feats: Union[List, Tuple],
+                 conf_thres: float,
+                 num_labels: int = 80,
+                 **kwargs) -> Tuple:
+        if not self.is_logging:
+            print('Only support decode in batch==1')
+            self.is_logging = True
+        self.boxes_pro.clear()
+        self.scores_pro.clear()
+        self.labels_pro.clear()
+
+        if self.model_only:
+            # transpose channel to last dim for easy decoding
+            feats = [
+                np.ascontiguousarray(feat[0].transpose(1, 2, 0))
+                for feat in feats
+            ]
+        else:
+            # ax620a horizonX3 transpose channel to last dim by default
+            feats = [np.ascontiguousarray(feat) for feat in feats]
+        if self.model_type == ModelType.YOLOV5:
+            self.__yolov5_decode(feats, conf_thres, num_labels, **kwargs)
+        elif self.model_type == ModelType.YOLOX:
+            self.__yolox_decode(feats, conf_thres, num_labels, **kwargs)
+        elif self.model_type in (ModelType.PPYOLOE, ModelType.PPYOLOEP):
+            self.__ppyoloe_decode(feats, conf_thres, num_labels, **kwargs)
+        elif self.model_type == ModelType.YOLOV6:
+            self.__yolov6_decode(feats, conf_thres, num_labels, **kwargs)
+        elif self.model_type == ModelType.YOLOV7:
+            self.__yolov7_decode(feats, conf_thres, num_labels, **kwargs)
+        elif self.model_type == ModelType.RTMDET:
+            self.__rtmdet_decode(feats, conf_thres, num_labels, **kwargs)
+        elif self.model_type == ModelType.YOLOV8:
+            self.__yolov8_decode(feats, conf_thres, num_labels, **kwargs)
+        else:
+            raise NotImplementedError
+        return self.boxes_pro, self.scores_pro, self.labels_pro
+
+    def __yolov5_decode(self,
+                        feats: List[ndarray],
+                        conf_thres: float,
+                        num_labels: int = 80,
+                        **kwargs):
+        anchors: Union[List, Tuple] = kwargs.get(
+            'anchors',
+            [[(10, 13), (16, 30),
+              (33, 23)], [(30, 61), (62, 45),
+                          (59, 119)], [(116, 90), (156, 198), (373, 326)]])
+        for i, feat in enumerate(feats):
+            stride = 8 << i
+            feat_h, feat_w, _ = feat.shape
+            anchor = anchors[i]
+            feat = sigmoid(feat)
+            feat = feat.reshape((feat_h, feat_w, len(anchor), -1))
+            box_feat, conf_feat, score_feat = np.split(feat, [4, 5], -1)
+
+            hIdx, wIdx, aIdx, _ = np.where(conf_feat > conf_thres)
+
+            num_proposal = hIdx.size
+            if not num_proposal:
+                continue
+
+            score_feat = score_feat[hIdx, wIdx, aIdx] * conf_feat[hIdx, wIdx,
+                                                                  aIdx]
+            boxes = box_feat[hIdx, wIdx, aIdx]
+            labels = score_feat.argmax(-1)
+            scores = score_feat.max(-1)
+
+            indices = np.where(scores > conf_thres)[0]
+            if len(indices) == 0:
+                continue
+
+            for idx in indices:
+                a_w, a_h = anchor[aIdx[idx]]
+                x, y, w, h = boxes[idx]
+                x = (x * 2.0 - 0.5 + wIdx[idx]) * stride
+                y = (y * 2.0 - 0.5 + hIdx[idx]) * stride
+                w = (w * 2.0)**2 * a_w
+                h = (h * 2.0)**2 * a_h
+
+                x0 = x - w / 2
+                y0 = y - h / 2
+
+                self.scores_pro.append(float(scores[idx]))
+                self.boxes_pro.append(
+                    np.array([x0, y0, w, h], dtype=np.float32))
+                self.labels_pro.append(int(labels[idx]))
+
+    def __yolox_decode(self,
+                       feats: List[ndarray],
+                       conf_thres: float,
+                       num_labels: int = 80,
+                       **kwargs):
+        for i, feat in enumerate(feats):
+            stride = 8 << i
+            score_feat, box_feat, conf_feat = np.split(
+                feat, [num_labels, num_labels + 4], -1)
+            conf_feat = sigmoid(conf_feat)
+
+            hIdx, wIdx, _ = np.where(conf_feat > conf_thres)
+
+            num_proposal = hIdx.size
+            if not num_proposal:
+                continue
+
+            score_feat = sigmoid(score_feat[hIdx, wIdx]) * conf_feat[hIdx,
+                                                                     wIdx]
+            boxes = box_feat[hIdx, wIdx]
+            labels = score_feat.argmax(-1)
+            scores = score_feat.max(-1)
+            indices = np.where(scores > conf_thres)[0]
+
+            if len(indices) == 0:
+                continue
+
+            for idx in indices:
+                score = scores[idx]
+                label = labels[idx]
+
+                x, y, w, h = boxes[idx]
+
+                x = (x + wIdx[idx]) * stride
+                y = (y + hIdx[idx]) * stride
+                w = np.exp(w) * stride
+                h = np.exp(h) * stride
+
+                x0 = x - w / 2
+                y0 = y - h / 2
+
+                self.scores_pro.append(float(score))
+                self.boxes_pro.append(
+                    np.array([x0, y0, w, h], dtype=np.float32))
+                self.labels_pro.append(int(label))
+
+    def __ppyoloe_decode(self,
+                         feats: List[ndarray],
+                         conf_thres: float,
+                         num_labels: int = 80,
+                         **kwargs):
+        reg_max: int = kwargs.get('reg_max', 17)
+        dfl = np.arange(0, reg_max, dtype=np.float32)
+        for i, feat in enumerate(feats):
+            stride = 8 << i
+            score_feat, box_feat = np.split(feat, [
+                num_labels,
+            ], -1)
+            score_feat = sigmoid(score_feat)
+            _argmax = score_feat.argmax(-1)
+            _max = score_feat.max(-1)
+            indices = np.where(_max > conf_thres)
+            hIdx, wIdx = indices
+            num_proposal = hIdx.size
+            if not num_proposal:
+                continue
+
+            scores = _max[hIdx, wIdx]
+            boxes = box_feat[hIdx, wIdx].reshape(num_proposal, 4, reg_max)
+            boxes = softmax(boxes, -1) @ dfl
+            labels = _argmax[hIdx, wIdx]
+
+            for k in range(num_proposal):
+                score = scores[k]
+                label = labels[k]
+
+                x0, y0, x1, y1 = boxes[k]
+
+                x0 = (wIdx[k] + 0.5 - x0) * stride
+                y0 = (hIdx[k] + 0.5 - y0) * stride
+                x1 = (wIdx[k] + 0.5 + x1) * stride
+                y1 = (hIdx[k] + 0.5 + y1) * stride
+
+                w = x1 - x0
+                h = y1 - y0
+
+                self.scores_pro.append(float(score))
+                self.boxes_pro.append(
+                    np.array([x0, y0, w, h], dtype=np.float32))
+                self.labels_pro.append(int(label))
+
+    def __yolov6_decode(self,
+                        feats: List[ndarray],
+                        conf_thres: float,
+                        num_labels: int = 80,
+                        **kwargs):
+        for i, feat in enumerate(feats):
+            stride = 8 << i
+            score_feat, box_feat = np.split(feat, [
+                num_labels,
+            ], -1)
+            score_feat = sigmoid(score_feat)
+            _argmax = score_feat.argmax(-1)
+            _max = score_feat.max(-1)
+            indices = np.where(_max > conf_thres)
+            hIdx, wIdx = indices
+            num_proposal = hIdx.size
+            if not num_proposal:
+                continue
+
+            scores = _max[hIdx, wIdx]
+            boxes = box_feat[hIdx, wIdx]
+            labels = _argmax[hIdx, wIdx]
+
+            for k in range(num_proposal):
+                score = scores[k]
+                label = labels[k]
+
+                x0, y0, x1, y1 = boxes[k]
+
+                x0 = (wIdx[k] + 0.5 - x0) * stride
+                y0 = (hIdx[k] + 0.5 - y0) * stride
+                x1 = (wIdx[k] + 0.5 + x1) * stride
+                y1 = (hIdx[k] + 0.5 + y1) * stride
+
+                w = x1 - x0
+                h = y1 - y0
+
+                self.scores_pro.append(float(score))
+                self.boxes_pro.append(
+                    np.array([x0, y0, w, h], dtype=np.float32))
+                self.labels_pro.append(int(label))
+
+    def __yolov7_decode(self,
+                        feats: List[ndarray],
+                        conf_thres: float,
+                        num_labels: int = 80,
+                        **kwargs):
+        anchors: Union[List, Tuple] = kwargs.get(
+            'anchors',
+            [[(12, 16), (19, 36),
+              (40, 28)], [(36, 75), (76, 55),
+                          (72, 146)], [(142, 110), (192, 243), (459, 401)]])
+        self.__yolov5_decode(feats, conf_thres, num_labels, anchors=anchors)
+
+    def __rtmdet_decode(self,
+                        feats: List[ndarray],
+                        conf_thres: float,
+                        num_labels: int = 80,
+                        **kwargs):
+        for i, feat in enumerate(feats):
+            stride = 8 << i
+            score_feat, box_feat = np.split(feat, [
+                num_labels,
+            ], -1)
+            score_feat = sigmoid(score_feat)
+            _argmax = score_feat.argmax(-1)
+            _max = score_feat.max(-1)
+            indices = np.where(_max > conf_thres)
+            hIdx, wIdx = indices
+            num_proposal = hIdx.size
+            if not num_proposal:
+                continue
+
+            scores = _max[hIdx, wIdx]
+            boxes = box_feat[hIdx, wIdx]
+            labels = _argmax[hIdx, wIdx]
+
+            for k in range(num_proposal):
+                score = scores[k]
+                label = labels[k]
+
+                x0, y0, x1, y1 = boxes[k]
+
+                x0 = (wIdx[k] - x0) * stride
+                y0 = (hIdx[k] - y0) * stride
+                x1 = (wIdx[k] + x1) * stride
+                y1 = (hIdx[k] + y1) * stride
+
+                w = x1 - x0
+                h = y1 - y0
+
+                self.scores_pro.append(float(score))
+                self.boxes_pro.append(
+                    np.array([x0, y0, w, h], dtype=np.float32))
+                self.labels_pro.append(int(label))
+
+    def __yolov8_decode(self,
+                        feats: List[ndarray],
+                        conf_thres: float,
+                        num_labels: int = 80,
+                        **kwargs):
+        reg_max: int = kwargs.get('reg_max', 16)
+        self.__ppyoloe_decode(feats, conf_thres, num_labels, reg_max=reg_max)
diff --git a/mmdetection_practice/third_party/mmyolo/projects/easydeploy/examples/preprocess.py b/mmdetection_practice/third_party/mmyolo/projects/easydeploy/examples/preprocess.py
new file mode 100644
index 0000000..6b6fb56
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/projects/easydeploy/examples/preprocess.py
@@ -0,0 +1,57 @@
+from typing import List, Tuple, Union
+
+import cv2
+import numpy as np
+from config import ModelType
+from numpy import ndarray
+
+
+class Preprocess:
+
+    def __init__(self, model_type: ModelType):
+        if model_type in (ModelType.YOLOV5, ModelType.YOLOV6, ModelType.YOLOV7,
+                          ModelType.YOLOV8):
+            mean = np.array([0, 0, 0], dtype=np.float32)
+            std = np.array([255, 255, 255], dtype=np.float32)
+            is_rgb = True
+        elif model_type == ModelType.YOLOX:
+            mean = np.array([0, 0, 0], dtype=np.float32)
+            std = np.array([1, 1, 1], dtype=np.float32)
+            is_rgb = False
+        elif model_type == ModelType.PPYOLOE:
+            mean = np.array([123.675, 116.28, 103.53], dtype=np.float32)
+            std = np.array([58.395, 57.12, 57.375], dtype=np.float32)
+            is_rgb = True
+
+        elif model_type == ModelType.PPYOLOEP:
+            mean = np.array([0, 0, 0], dtype=np.float32)
+            std = np.array([255, 255, 255], dtype=np.float32)
+            is_rgb = True
+        elif model_type == ModelType.RTMDET:
+            mean = np.array([103.53, 116.28, 123.675], dtype=np.float32)
+            std = np.array([57.375, 57.12, 58.3955], dtype=np.float32)
+            is_rgb = False
+        else:
+            raise NotImplementedError
+
+        self.mean = mean.reshape((3, 1, 1))
+        self.std = std.reshape((3, 1, 1))
+        self.is_rgb = is_rgb
+
+    def __call__(self,
+                 image: ndarray,
+                 new_size: Union[List[int], Tuple[int]] = (640, 640),
+                 **kwargs) -> Tuple[ndarray, Tuple[float, float]]:
+        # new_size: (height, width)
+        height, width = image.shape[:2]
+        ratio_h, ratio_w = new_size[0] / height, new_size[1] / width
+        image = cv2.resize(
+            image, (0, 0),
+            fx=ratio_w,
+            fy=ratio_h,
+            interpolation=cv2.INTER_LINEAR)
+        image = np.ascontiguousarray(image.transpose(2, 0, 1))
+        image = image.astype(np.float32)
+        image -= self.mean
+        image /= self.std
+        return image[np.newaxis], (ratio_w, ratio_h)
diff --git a/mmdetection_practice/third_party/mmyolo/projects/easydeploy/examples/requirements.txt b/mmdetection_practice/third_party/mmyolo/projects/easydeploy/examples/requirements.txt
new file mode 100644
index 0000000..0b76118
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/projects/easydeploy/examples/requirements.txt
@@ -0,0 +1,2 @@
+onnxruntime
+opencv-python==4.7.0.72
diff --git a/mmdetection_practice/third_party/mmyolo/projects/easydeploy/model/__init__.py b/mmdetection_practice/third_party/mmyolo/projects/easydeploy/model/__init__.py
new file mode 100644
index 0000000..38af8bc
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/projects/easydeploy/model/__init__.py
@@ -0,0 +1,6 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from .backend import MMYOLOBackend
+from .backendwrapper import ORTWrapper, TRTWrapper
+from .model import DeployModel
+
+__all__ = ['DeployModel', 'TRTWrapper', 'ORTWrapper', 'MMYOLOBackend']
diff --git a/mmdetection_practice/third_party/mmyolo/projects/easydeploy/model/backend.py b/mmdetection_practice/third_party/mmyolo/projects/easydeploy/model/backend.py
new file mode 100644
index 0000000..64d6e3f
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/projects/easydeploy/model/backend.py
@@ -0,0 +1,23 @@
+from enum import Enum
+
+import torch
+import torch.nn.functional as F
+
+
+class MMYOLOBackend(Enum):
+    AX620A = 'ax620a'
+    COREML = 'coreml'
+    HORIZONX3 = 'horizonx3'
+    NCNN = 'ncnn'
+    ONNXRUNTIME = 'onnxruntime'
+    OPENVINO = 'openvino'
+    PPLNN = 'pplnn'
+    RKNN = 'rknn'
+    TENSORRT8 = 'tensorrt8'
+    TENSORRT7 = 'tensorrt7'
+    TORCHSCRIPT = 'torchscript'
+    TVM = 'tvm'
+
+
+def HSigmoid__forward(self, x: torch.Tensor) -> torch.Tensor:
+    return F.hardsigmoid(x, inplace=True)
diff --git a/mmdetection_practice/third_party/mmyolo/projects/easydeploy/model/backendwrapper.py b/mmdetection_practice/third_party/mmyolo/projects/easydeploy/model/backendwrapper.py
new file mode 100644
index 0000000..2997d84
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/projects/easydeploy/model/backendwrapper.py
@@ -0,0 +1,202 @@
+import warnings
+from collections import namedtuple
+from functools import partial
+from pathlib import Path
+from typing import List, Optional, Union
+
+import numpy as np
+import onnxruntime
+
+try:
+    import tensorrt as trt
+except Exception:
+    trt = None
+import torch
+
+warnings.filterwarnings(action='ignore', category=DeprecationWarning)
+
+
+class TRTWrapper(torch.nn.Module):
+    dtype_mapping = {}
+
+    def __init__(self, weight: Union[str, Path],
+                 device: Optional[torch.device]):
+        super().__init__()
+        weight = Path(weight) if isinstance(weight, str) else weight
+        assert weight.exists() and weight.suffix in ('.engine', '.plan')
+        if isinstance(device, str):
+            device = torch.device(device)
+        elif isinstance(device, int):
+            device = torch.device(f'cuda:{device}')
+        self.weight = weight
+        self.device = device
+        self.stream = torch.cuda.Stream(device=device)
+        self.__update_mapping()
+        self.__init_engine()
+        self.__init_bindings()
+
+    def __update_mapping(self):
+        self.dtype_mapping.update({
+            trt.bool: torch.bool,
+            trt.int8: torch.int8,
+            trt.int32: torch.int32,
+            trt.float16: torch.float16,
+            trt.float32: torch.float32
+        })
+
+    def __init_engine(self):
+        logger = trt.Logger(trt.Logger.ERROR)
+        self.log = partial(logger.log, trt.Logger.ERROR)
+        trt.init_libnvinfer_plugins(logger, namespace='')
+        self.logger = logger
+        with trt.Runtime(logger) as runtime:
+            model = runtime.deserialize_cuda_engine(self.weight.read_bytes())
+
+        context = model.create_execution_context()
+
+        names = [model.get_binding_name(i) for i in range(model.num_bindings)]
+
+        num_inputs, num_outputs = 0, 0
+
+        for i in range(model.num_bindings):
+            if model.binding_is_input(i):
+                num_inputs += 1
+            else:
+                num_outputs += 1
+
+        self.is_dynamic = -1 in model.get_binding_shape(0)
+
+        self.model = model
+        self.context = context
+        self.input_names = names[:num_inputs]
+        self.output_names = names[num_inputs:]
+        self.num_inputs = num_inputs
+        self.num_outputs = num_outputs
+        self.num_bindings = num_inputs + num_outputs
+        self.bindings: List[int] = [0] * self.num_bindings
+
+    def __init_bindings(self):
+        Binding = namedtuple('Binding', ('name', 'dtype', 'shape'))
+        inputs_info = []
+        outputs_info = []
+
+        for i, name in enumerate(self.input_names):
+            assert self.model.get_binding_name(i) == name
+            dtype = self.dtype_mapping[self.model.get_binding_dtype(i)]
+            shape = tuple(self.model.get_binding_shape(i))
+            inputs_info.append(Binding(name, dtype, shape))
+
+        for i, name in enumerate(self.output_names):
+            i += self.num_inputs
+            assert self.model.get_binding_name(i) == name
+            dtype = self.dtype_mapping[self.model.get_binding_dtype(i)]
+            shape = tuple(self.model.get_binding_shape(i))
+            outputs_info.append(Binding(name, dtype, shape))
+        self.inputs_info = inputs_info
+        self.outputs_info = outputs_info
+        if not self.is_dynamic:
+            self.output_tensor = [
+                torch.empty(o.shape, dtype=o.dtype, device=self.device)
+                for o in outputs_info
+            ]
+
+    def forward(self, *inputs):
+
+        assert len(inputs) == self.num_inputs
+
+        contiguous_inputs: List[torch.Tensor] = [
+            i.contiguous() for i in inputs
+        ]
+
+        for i in range(self.num_inputs):
+            self.bindings[i] = contiguous_inputs[i].data_ptr()
+            if self.is_dynamic:
+                self.context.set_binding_shape(
+                    i, tuple(contiguous_inputs[i].shape))
+
+        # create output tensors
+        outputs: List[torch.Tensor] = []
+
+        for i in range(self.num_outputs):
+            j = i + self.num_inputs
+            if self.is_dynamic:
+                shape = tuple(self.context.get_binding_shape(j))
+                output = torch.empty(
+                    size=shape,
+                    dtype=self.output_dtypes[i],
+                    device=self.device)
+
+            else:
+                output = self.output_tensor[i]
+            outputs.append(output)
+            self.bindings[j] = output.data_ptr()
+
+        self.context.execute_async_v2(self.bindings, self.stream.cuda_stream)
+        self.stream.synchronize()
+
+        return tuple(outputs)
+
+
+class ORTWrapper(torch.nn.Module):
+
+    def __init__(self, weight: Union[str, Path],
+                 device: Optional[torch.device]):
+        super().__init__()
+        weight = Path(weight) if isinstance(weight, str) else weight
+        assert weight.exists() and weight.suffix == '.onnx'
+
+        if isinstance(device, str):
+            device = torch.device(device)
+        elif isinstance(device, int):
+            device = torch.device(f'cuda:{device}')
+        self.weight = weight
+        self.device = device
+        self.__init_session()
+        self.__init_bindings()
+
+    def __init_session(self):
+        providers = ['CPUExecutionProvider']
+        if 'cuda' in self.device.type:
+            providers.insert(0, 'CUDAExecutionProvider')
+
+        session = onnxruntime.InferenceSession(
+            str(self.weight), providers=providers)
+        self.session = session
+
+    def __init_bindings(self):
+        Binding = namedtuple('Binding', ('name', 'dtype', 'shape'))
+        inputs_info = []
+        outputs_info = []
+        self.is_dynamic = False
+        for i, tensor in enumerate(self.session.get_inputs()):
+            if any(not isinstance(i, int) for i in tensor.shape):
+                self.is_dynamic = True
+            inputs_info.append(
+                Binding(tensor.name, tensor.type, tuple(tensor.shape)))
+
+        for i, tensor in enumerate(self.session.get_outputs()):
+            outputs_info.append(
+                Binding(tensor.name, tensor.type, tuple(tensor.shape)))
+        self.inputs_info = inputs_info
+        self.outputs_info = outputs_info
+        self.num_inputs = len(inputs_info)
+
+    def forward(self, *inputs):
+
+        assert len(inputs) == self.num_inputs
+
+        contiguous_inputs: List[np.ndarray] = [
+            i.contiguous().cpu().numpy() for i in inputs
+        ]
+
+        if not self.is_dynamic:
+            # make sure input shape is right for static input shape
+            for i in range(self.num_inputs):
+                assert contiguous_inputs[i].shape == self.inputs_info[i].shape
+
+        outputs = self.session.run([o.name for o in self.outputs_info], {
+            j.name: contiguous_inputs[i]
+            for i, j in enumerate(self.inputs_info)
+        })
+
+        return tuple(torch.from_numpy(o).to(self.device) for o in outputs)
diff --git a/mmdetection_practice/third_party/mmyolo/projects/easydeploy/model/model.py b/mmdetection_practice/third_party/mmyolo/projects/easydeploy/model/model.py
new file mode 100644
index 0000000..c67ed28
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/projects/easydeploy/model/model.py
@@ -0,0 +1,205 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from copy import deepcopy
+from functools import partial
+from typing import List, Optional, Tuple
+
+import torch
+import torch.nn as nn
+from mmdet.models.backbones.csp_darknet import Focus
+from mmdet.models.layers import ChannelAttention
+from mmengine.config import ConfigDict
+from torch import Tensor
+
+from mmyolo.models import RepVGGBlock
+from mmyolo.models.dense_heads import (PPYOLOEHead, RTMDetHead, YOLOv5Head,
+                                       YOLOv7Head, YOLOv8Head, YOLOXHead)
+from mmyolo.models.layers import ImplicitA, ImplicitM
+from ..backbone import DeployFocus, GConvFocus, NcnnFocus
+from ..bbox_code import (rtmdet_bbox_decoder, yolov5_bbox_decoder,
+                         yolox_bbox_decoder)
+from ..nms import batched_nms, efficient_nms, onnx_nms
+from .backend import MMYOLOBackend
+
+
+class DeployModel(nn.Module):
+    transpose = False
+
+    def __init__(self,
+                 baseModel: nn.Module,
+                 backend: MMYOLOBackend,
+                 postprocess_cfg: Optional[ConfigDict] = None):
+        super().__init__()
+        self.baseModel = baseModel
+        self.baseHead = baseModel.bbox_head
+        self.backend = backend
+        if postprocess_cfg is None:
+            self.with_postprocess = False
+        else:
+            self.with_postprocess = True
+            self.__init_sub_attributes()
+            self.detector_type = type(self.baseHead)
+            self.pre_top_k = postprocess_cfg.get('pre_top_k', 1000)
+            self.keep_top_k = postprocess_cfg.get('keep_top_k', 100)
+            self.iou_threshold = postprocess_cfg.get('iou_threshold', 0.65)
+            self.score_threshold = postprocess_cfg.get('score_threshold', 0.25)
+        self.__switch_deploy()
+
+    def __init_sub_attributes(self):
+        self.bbox_decoder = self.baseHead.bbox_coder.decode
+        self.prior_generate = self.baseHead.prior_generator.grid_priors
+        self.num_base_priors = self.baseHead.num_base_priors
+        self.featmap_strides = self.baseHead.featmap_strides
+        self.num_classes = self.baseHead.num_classes
+
+    def __switch_deploy(self):
+        headType = type(self.baseHead)
+        if not self.with_postprocess:
+            if headType in (YOLOv5Head, YOLOv7Head):
+                self.baseHead.head_module.forward_single = self.forward_single
+            elif headType in (PPYOLOEHead, YOLOv8Head):
+                self.baseHead.head_module.reg_max = 0
+
+        if self.backend in (MMYOLOBackend.HORIZONX3, MMYOLOBackend.NCNN,
+                            MMYOLOBackend.TORCHSCRIPT):
+            self.transpose = True
+        for layer in self.baseModel.modules():
+            if isinstance(layer, RepVGGBlock):
+                layer.switch_to_deploy()
+            elif isinstance(layer, ChannelAttention):
+                layer.global_avgpool.forward = self.forward_gvp
+            elif isinstance(layer, Focus):
+                # onnxruntime openvino tensorrt8 tensorrt7
+                if self.backend in (MMYOLOBackend.ONNXRUNTIME,
+                                    MMYOLOBackend.OPENVINO,
+                                    MMYOLOBackend.TENSORRT8,
+                                    MMYOLOBackend.TENSORRT7):
+                    self.baseModel.backbone.stem = DeployFocus(layer)
+                # ncnn
+                elif self.backend == MMYOLOBackend.NCNN:
+                    self.baseModel.backbone.stem = NcnnFocus(layer)
+                # switch focus to group conv
+                else:
+                    self.baseModel.backbone.stem = GConvFocus(layer)
+
+    def pred_by_feat(self,
+                     cls_scores: List[Tensor],
+                     bbox_preds: List[Tensor],
+                     objectnesses: Optional[List[Tensor]] = None,
+                     **kwargs):
+        assert len(cls_scores) == len(bbox_preds)
+        dtype = cls_scores[0].dtype
+        device = cls_scores[0].device
+
+        nms_func = self.select_nms()
+        if self.detector_type in (YOLOv5Head, YOLOv7Head):
+            bbox_decoder = yolov5_bbox_decoder
+        elif self.detector_type is RTMDetHead:
+            bbox_decoder = rtmdet_bbox_decoder
+        elif self.detector_type is YOLOXHead:
+            bbox_decoder = yolox_bbox_decoder
+        else:
+            bbox_decoder = self.bbox_decoder
+
+        num_imgs = cls_scores[0].shape[0]
+        featmap_sizes = [cls_score.shape[2:] for cls_score in cls_scores]
+
+        mlvl_priors = self.prior_generate(
+            featmap_sizes, dtype=dtype, device=device)
+
+        flatten_priors = torch.cat(mlvl_priors)
+
+        mlvl_strides = [
+            flatten_priors.new_full(
+                (featmap_size[0] * featmap_size[1] * self.num_base_priors, ),
+                stride) for featmap_size, stride in zip(
+                    featmap_sizes, self.featmap_strides)
+        ]
+        flatten_stride = torch.cat(mlvl_strides)
+
+        # flatten cls_scores, bbox_preds and objectness
+        flatten_cls_scores = [
+            cls_score.permute(0, 2, 3, 1).reshape(num_imgs, -1,
+                                                  self.num_classes)
+            for cls_score in cls_scores
+        ]
+        cls_scores = torch.cat(flatten_cls_scores, dim=1).sigmoid()
+
+        flatten_bbox_preds = [
+            bbox_pred.permute(0, 2, 3, 1).reshape(num_imgs, -1, 4)
+            for bbox_pred in bbox_preds
+        ]
+        flatten_bbox_preds = torch.cat(flatten_bbox_preds, dim=1)
+
+        if objectnesses is not None:
+            flatten_objectness = [
+                objectness.permute(0, 2, 3, 1).reshape(num_imgs, -1)
+                for objectness in objectnesses
+            ]
+            flatten_objectness = torch.cat(flatten_objectness, dim=1).sigmoid()
+            cls_scores = cls_scores * (flatten_objectness.unsqueeze(-1))
+
+        scores = cls_scores
+
+        bboxes = bbox_decoder(flatten_priors[None], flatten_bbox_preds,
+                              flatten_stride)
+
+        return nms_func(bboxes, scores, self.keep_top_k, self.iou_threshold,
+                        self.score_threshold, self.pre_top_k, self.keep_top_k)
+
+    def select_nms(self):
+        if self.backend in (MMYOLOBackend.ONNXRUNTIME, MMYOLOBackend.OPENVINO):
+            nms_func = onnx_nms
+        elif self.backend == MMYOLOBackend.TENSORRT8:
+            nms_func = efficient_nms
+        elif self.backend == MMYOLOBackend.TENSORRT7:
+            nms_func = batched_nms
+        else:
+            raise NotImplementedError
+        if type(self.baseHead) in (YOLOv5Head, YOLOv7Head, YOLOXHead):
+            nms_func = partial(nms_func, box_coding=1)
+
+        return nms_func
+
+    def forward(self, inputs: Tensor):
+        neck_outputs = self.baseModel(inputs)
+        if self.with_postprocess:
+            return self.pred_by_feat(*neck_outputs)
+        else:
+            outputs = []
+            if self.transpose:
+                for feats in zip(*neck_outputs):
+                    if self.backend in (MMYOLOBackend.NCNN,
+                                        MMYOLOBackend.TORCHSCRIPT):
+                        outputs.append(
+                            torch.cat(
+                                [feat.permute(0, 2, 3, 1) for feat in feats],
+                                -1))
+                    else:
+                        outputs.append(torch.cat(feats, 1).permute(0, 2, 3, 1))
+            else:
+                for feats in zip(*neck_outputs):
+                    outputs.append(torch.cat(feats, 1))
+            return tuple(outputs)
+
+    @staticmethod
+    def forward_single(x: Tensor, convs: nn.Module) -> Tuple[Tensor]:
+        if isinstance(convs, nn.Sequential) and any(
+                type(m) in (ImplicitA, ImplicitM) for m in convs):
+            a, c, m = convs
+            aw = a.implicit.clone()
+            mw = m.implicit.clone()
+            c = deepcopy(c)
+            nw, cw, _, _ = c.weight.shape
+            na, ca, _, _ = aw.shape
+            nm, cm, _, _ = mw.shape
+            c.bias = nn.Parameter(c.bias + (
+                c.weight.reshape(nw, cw) @ aw.reshape(ca, na)).squeeze(1))
+            c.bias = nn.Parameter(c.bias * mw.reshape(cm))
+            c.weight = nn.Parameter(c.weight * mw.transpose(0, 1))
+            convs = c
+        feat = convs(x)
+        return (feat, )
+
+    @staticmethod
+    def forward_gvp(x: Tensor) -> Tensor:
+        return torch.mean(x, [2, 3], keepdim=True)
diff --git a/mmdetection_practice/third_party/mmyolo/projects/easydeploy/nms/__init__.py b/mmdetection_practice/third_party/mmyolo/projects/easydeploy/nms/__init__.py
new file mode 100644
index 0000000..59c5cdb
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/projects/easydeploy/nms/__init__.py
@@ -0,0 +1,5 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from .ort_nms import onnx_nms
+from .trt_nms import batched_nms, efficient_nms
+
+__all__ = ['efficient_nms', 'batched_nms', 'onnx_nms']
diff --git a/mmdetection_practice/third_party/mmyolo/projects/easydeploy/nms/ort_nms.py b/mmdetection_practice/third_party/mmyolo/projects/easydeploy/nms/ort_nms.py
new file mode 100644
index 0000000..aad93cf
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/projects/easydeploy/nms/ort_nms.py
@@ -0,0 +1,122 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+import torch
+from torch import Tensor
+
+_XYWH2XYXY = torch.tensor([[1.0, 0.0, 1.0, 0.0], [0.0, 1.0, 0.0, 1.0],
+                           [-0.5, 0.0, 0.5, 0.0], [0.0, -0.5, 0.0, 0.5]],
+                          dtype=torch.float32)
+
+
+def select_nms_index(scores: Tensor,
+                     boxes: Tensor,
+                     nms_index: Tensor,
+                     batch_size: int,
+                     keep_top_k: int = -1):
+    batch_inds, cls_inds = nms_index[:, 0], nms_index[:, 1]
+    box_inds = nms_index[:, 2]
+
+    scores = scores[batch_inds, cls_inds, box_inds].unsqueeze(1)
+    boxes = boxes[batch_inds, box_inds, ...]
+    dets = torch.cat([boxes, scores], dim=1)
+
+    batched_dets = dets.unsqueeze(0).repeat(batch_size, 1, 1)
+    batch_template = torch.arange(
+        0, batch_size, dtype=batch_inds.dtype, device=batch_inds.device)
+    batched_dets = batched_dets.where(
+        (batch_inds == batch_template.unsqueeze(1)).unsqueeze(-1),
+        batched_dets.new_zeros(1))
+
+    batched_labels = cls_inds.unsqueeze(0).repeat(batch_size, 1)
+    batched_labels = batched_labels.where(
+        (batch_inds == batch_template.unsqueeze(1)),
+        batched_labels.new_ones(1) * -1)
+
+    N = batched_dets.shape[0]
+
+    batched_dets = torch.cat((batched_dets, batched_dets.new_zeros((N, 1, 5))),
+                             1)
+    batched_labels = torch.cat((batched_labels, -batched_labels.new_ones(
+        (N, 1))), 1)
+
+    _, topk_inds = batched_dets[:, :, -1].sort(dim=1, descending=True)
+    topk_batch_inds = torch.arange(
+        batch_size, dtype=topk_inds.dtype,
+        device=topk_inds.device).view(-1, 1)
+    batched_dets = batched_dets[topk_batch_inds, topk_inds, ...]
+    batched_labels = batched_labels[topk_batch_inds, topk_inds, ...]
+    batched_dets, batched_scores = batched_dets.split([4, 1], 2)
+    batched_scores = batched_scores.squeeze(-1)
+
+    num_dets = (batched_scores > 0).sum(1, keepdim=True)
+    return num_dets, batched_dets, batched_scores, batched_labels
+
+
+class ONNXNMSop(torch.autograd.Function):
+
+    @staticmethod
+    def forward(
+        ctx,
+        boxes: Tensor,
+        scores: Tensor,
+        max_output_boxes_per_class: Tensor = torch.tensor([100]),
+        iou_threshold: Tensor = torch.tensor([0.5]),
+        score_threshold: Tensor = torch.tensor([0.05])
+    ) -> Tensor:
+        device = boxes.device
+        batch = scores.shape[0]
+        num_det = 20
+        batches = torch.randint(0, batch, (num_det, )).sort()[0].to(device)
+        idxs = torch.arange(100, 100 + num_det).to(device)
+        zeros = torch.zeros((num_det, ), dtype=torch.int64).to(device)
+        selected_indices = torch.cat([batches[None], zeros[None], idxs[None]],
+                                     0).T.contiguous()
+        selected_indices = selected_indices.to(torch.int64)
+
+        return selected_indices
+
+    @staticmethod
+    def symbolic(
+            g,
+            boxes: Tensor,
+            scores: Tensor,
+            max_output_boxes_per_class: Tensor = torch.tensor([100]),
+            iou_threshold: Tensor = torch.tensor([0.5]),
+            score_threshold: Tensor = torch.tensor([0.05]),
+    ):
+        return g.op(
+            'NonMaxSuppression',
+            boxes,
+            scores,
+            max_output_boxes_per_class,
+            iou_threshold,
+            score_threshold,
+            outputs=1)
+
+
+def onnx_nms(
+    boxes: torch.Tensor,
+    scores: torch.Tensor,
+    max_output_boxes_per_class: int = 100,
+    iou_threshold: float = 0.5,
+    score_threshold: float = 0.05,
+    pre_top_k: int = -1,
+    keep_top_k: int = 100,
+    box_coding: int = 0,
+):
+    max_output_boxes_per_class = torch.tensor([max_output_boxes_per_class])
+    iou_threshold = torch.tensor([iou_threshold])
+    score_threshold = torch.tensor([score_threshold])
+
+    batch_size, _, _ = scores.shape
+    if box_coding == 1:
+        boxes = boxes @ (_XYWH2XYXY.to(boxes.device))
+    scores = scores.transpose(1, 2).contiguous()
+    selected_indices = ONNXNMSop.apply(boxes, scores,
+                                       max_output_boxes_per_class,
+                                       iou_threshold, score_threshold)
+
+    num_dets, batched_dets, batched_scores, batched_labels = select_nms_index(
+        scores, boxes, selected_indices, batch_size, keep_top_k=keep_top_k)
+
+    return num_dets, batched_dets, batched_scores, batched_labels.to(
+        torch.int32)
diff --git a/mmdetection_practice/third_party/mmyolo/projects/easydeploy/nms/trt_nms.py b/mmdetection_practice/third_party/mmyolo/projects/easydeploy/nms/trt_nms.py
new file mode 100644
index 0000000..e0db1e2
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/projects/easydeploy/nms/trt_nms.py
@@ -0,0 +1,226 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+import torch
+from torch import Tensor
+
+_XYWH2XYXY = torch.tensor([[1.0, 0.0, 1.0, 0.0], [0.0, 1.0, 0.0, 1.0],
+                           [-0.5, 0.0, 0.5, 0.0], [0.0, -0.5, 0.0, 0.5]],
+                          dtype=torch.float32)
+
+
+class TRTEfficientNMSop(torch.autograd.Function):
+
+    @staticmethod
+    def forward(
+        ctx,
+        boxes: Tensor,
+        scores: Tensor,
+        background_class: int = -1,
+        box_coding: int = 0,
+        iou_threshold: float = 0.45,
+        max_output_boxes: int = 100,
+        plugin_version: str = '1',
+        score_activation: int = 0,
+        score_threshold: float = 0.25,
+    ):
+        batch_size, _, num_classes = scores.shape
+        num_det = torch.randint(
+            0, max_output_boxes, (batch_size, 1), dtype=torch.int32)
+        det_boxes = torch.randn(batch_size, max_output_boxes, 4)
+        det_scores = torch.randn(batch_size, max_output_boxes)
+        det_classes = torch.randint(
+            0, num_classes, (batch_size, max_output_boxes), dtype=torch.int32)
+        return num_det, det_boxes, det_scores, det_classes
+
+    @staticmethod
+    def symbolic(g,
+                 boxes: Tensor,
+                 scores: Tensor,
+                 background_class: int = -1,
+                 box_coding: int = 0,
+                 iou_threshold: float = 0.45,
+                 max_output_boxes: int = 100,
+                 plugin_version: str = '1',
+                 score_activation: int = 0,
+                 score_threshold: float = 0.25):
+        out = g.op(
+            'TRT::EfficientNMS_TRT',
+            boxes,
+            scores,
+            background_class_i=background_class,
+            box_coding_i=box_coding,
+            iou_threshold_f=iou_threshold,
+            max_output_boxes_i=max_output_boxes,
+            plugin_version_s=plugin_version,
+            score_activation_i=score_activation,
+            score_threshold_f=score_threshold,
+            outputs=4)
+        num_det, det_boxes, det_scores, det_classes = out
+        return num_det, det_boxes, det_scores, det_classes
+
+
+class TRTbatchedNMSop(torch.autograd.Function):
+    """TensorRT NMS operation."""
+
+    @staticmethod
+    def forward(
+        ctx,
+        boxes: Tensor,
+        scores: Tensor,
+        plugin_version: str = '1',
+        shareLocation: int = 1,
+        backgroundLabelId: int = -1,
+        numClasses: int = 80,
+        topK: int = 1000,
+        keepTopK: int = 100,
+        scoreThreshold: float = 0.25,
+        iouThreshold: float = 0.45,
+        isNormalized: int = 0,
+        clipBoxes: int = 0,
+        scoreBits: int = 16,
+        caffeSemantics: int = 1,
+    ):
+        batch_size, _, numClasses = scores.shape
+        num_det = torch.randint(
+            0, keepTopK, (batch_size, 1), dtype=torch.int32)
+        det_boxes = torch.randn(batch_size, keepTopK, 4)
+        det_scores = torch.randn(batch_size, keepTopK)
+        det_classes = torch.randint(0, numClasses,
+                                    (batch_size, keepTopK)).float()
+        return num_det, det_boxes, det_scores, det_classes
+
+    @staticmethod
+    def symbolic(
+        g,
+        boxes: Tensor,
+        scores: Tensor,
+        plugin_version: str = '1',
+        shareLocation: int = 1,
+        backgroundLabelId: int = -1,
+        numClasses: int = 80,
+        topK: int = 1000,
+        keepTopK: int = 100,
+        scoreThreshold: float = 0.25,
+        iouThreshold: float = 0.45,
+        isNormalized: int = 0,
+        clipBoxes: int = 0,
+        scoreBits: int = 16,
+        caffeSemantics: int = 1,
+    ):
+        out = g.op(
+            'TRT::BatchedNMSDynamic_TRT',
+            boxes,
+            scores,
+            shareLocation_i=shareLocation,
+            plugin_version_s=plugin_version,
+            backgroundLabelId_i=backgroundLabelId,
+            numClasses_i=numClasses,
+            topK_i=topK,
+            keepTopK_i=keepTopK,
+            scoreThreshold_f=scoreThreshold,
+            iouThreshold_f=iouThreshold,
+            isNormalized_i=isNormalized,
+            clipBoxes_i=clipBoxes,
+            scoreBits_i=scoreBits,
+            caffeSemantics_i=caffeSemantics,
+            outputs=4)
+        num_det, det_boxes, det_scores, det_classes = out
+        return num_det, det_boxes, det_scores, det_classes
+
+
+def _efficient_nms(
+    boxes: Tensor,
+    scores: Tensor,
+    max_output_boxes_per_class: int = 1000,
+    iou_threshold: float = 0.5,
+    score_threshold: float = 0.05,
+    pre_top_k: int = -1,
+    keep_top_k: int = 100,
+    box_coding: int = 0,
+):
+    """Wrapper for `efficient_nms` with TensorRT.
+    Args:
+        boxes (Tensor): The bounding boxes of shape [N, num_boxes, 4].
+        scores (Tensor): The detection scores of shape
+            [N, num_boxes, num_classes].
+        max_output_boxes_per_class (int): Maximum number of output
+            boxes per class of nms. Defaults to 1000.
+        iou_threshold (float): IOU threshold of nms. Defaults to 0.5.
+        score_threshold (float): score threshold of nms.
+            Defaults to 0.05.
+        pre_top_k (int): Number of top K boxes to keep before nms.
+            Defaults to -1.
+        keep_top_k (int): Number of top K boxes to keep after nms.
+            Defaults to -1.
+        box_coding (int): Bounding boxes format for nms.
+            Defaults to 0 means [x1, y1 ,x2, y2].
+            Set to 1 means [x, y, w, h].
+    Returns:
+        tuple[Tensor, Tensor, Tensor, Tensor]:
+        (num_det, det_boxes, det_scores, det_classes),
+        `num_det` of shape [N, 1]
+        `det_boxes` of shape [N, num_det, 4]
+        `det_scores` of shape [N, num_det]
+        `det_classes` of shape [N, num_det]
+    """
+    num_det, det_boxes, det_scores, det_classes = TRTEfficientNMSop.apply(
+        boxes, scores, -1, box_coding, iou_threshold, keep_top_k, '1', 0,
+        score_threshold)
+    return num_det, det_boxes, det_scores, det_classes
+
+
+def _batched_nms(
+    boxes: Tensor,
+    scores: Tensor,
+    max_output_boxes_per_class: int = 1000,
+    iou_threshold: float = 0.5,
+    score_threshold: float = 0.05,
+    pre_top_k: int = -1,
+    keep_top_k: int = 100,
+    box_coding: int = 0,
+):
+    """Wrapper for `efficient_nms` with TensorRT.
+    Args:
+        boxes (Tensor): The bounding boxes of shape [N, num_boxes, 4].
+        scores (Tensor): The detection scores of shape
+            [N, num_boxes, num_classes].
+        max_output_boxes_per_class (int): Maximum number of output
+            boxes per class of nms. Defaults to 1000.
+        iou_threshold (float): IOU threshold of nms. Defaults to 0.5.
+        score_threshold (float): score threshold of nms.
+            Defaults to 0.05.
+        pre_top_k (int): Number of top K boxes to keep before nms.
+            Defaults to -1.
+        keep_top_k (int): Number of top K boxes to keep after nms.
+            Defaults to -1.
+        box_coding (int): Bounding boxes format for nms.
+            Defaults to 0 means [x1, y1 ,x2, y2].
+            Set to 1 means [x, y, w, h].
+    Returns:
+        tuple[Tensor, Tensor, Tensor, Tensor]:
+        (num_det, det_boxes, det_scores, det_classes),
+        `num_det` of shape [N, 1]
+        `det_boxes` of shape [N, num_det, 4]
+        `det_scores` of shape [N, num_det]
+        `det_classes` of shape [N, num_det]
+    """
+    if box_coding == 1:
+        boxes = boxes @ (_XYWH2XYXY.to(boxes.device))
+    boxes = boxes if boxes.dim() == 4 else boxes.unsqueeze(2)
+    _, _, numClasses = scores.shape
+
+    num_det, det_boxes, det_scores, det_classes = TRTbatchedNMSop.apply(
+        boxes, scores, '1', 1, -1, int(numClasses), min(pre_top_k, 4096),
+        keep_top_k, score_threshold, iou_threshold, 0, 0, 16, 1)
+
+    det_classes = det_classes.int()
+    return num_det, det_boxes, det_scores, det_classes
+
+
+def efficient_nms(*args, **kwargs):
+    """Wrapper function for `_efficient_nms`."""
+    return _efficient_nms(*args, **kwargs)
+
+
+def batched_nms(*args, **kwargs):
+    """Wrapper function for `_batched_nms`."""
+    return _batched_nms(*args, **kwargs)
diff --git a/mmdetection_practice/third_party/mmyolo/projects/easydeploy/tools/build_engine.py b/mmdetection_practice/third_party/mmyolo/projects/easydeploy/tools/build_engine.py
new file mode 100644
index 0000000..b400c9d
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/projects/easydeploy/tools/build_engine.py
@@ -0,0 +1,136 @@
+import argparse
+from pathlib import Path
+from typing import List, Optional, Tuple, Union
+
+try:
+    import tensorrt as trt
+except Exception:
+    trt = None
+import warnings
+
+import numpy as np
+import torch
+
+warnings.filterwarnings(action='ignore', category=DeprecationWarning)
+
+
+class EngineBuilder:
+
+    def __init__(
+            self,
+            checkpoint: Union[str, Path],
+            opt_shape: Union[Tuple, List] = (1, 3, 640, 640),
+            device: Optional[Union[str, int, torch.device]] = None) -> None:
+        checkpoint = Path(checkpoint) if isinstance(checkpoint,
+                                                    str) else checkpoint
+        assert checkpoint.exists() and checkpoint.suffix == '.onnx'
+        if isinstance(device, str):
+            device = torch.device(device)
+        elif isinstance(device, int):
+            device = torch.device(f'cuda:{device}')
+
+        self.checkpoint = checkpoint
+        self.opt_shape = np.array(opt_shape, dtype=np.float32)
+        self.device = device
+
+    def __build_engine(self,
+                       scale: Optional[List[List]] = None,
+                       fp16: bool = True,
+                       with_profiling: bool = True) -> None:
+        logger = trt.Logger(trt.Logger.WARNING)
+        trt.init_libnvinfer_plugins(logger, namespace='')
+        builder = trt.Builder(logger)
+        config = builder.create_builder_config()
+        config.max_workspace_size = torch.cuda.get_device_properties(
+            self.device).total_memory
+        flag = (1 << int(trt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH))
+        network = builder.create_network(flag)
+        parser = trt.OnnxParser(network, logger)
+        if not parser.parse_from_file(str(self.checkpoint)):
+            raise RuntimeError(
+                f'failed to load ONNX file: {str(self.checkpoint)}')
+        inputs = [network.get_input(i) for i in range(network.num_inputs)]
+        outputs = [network.get_output(i) for i in range(network.num_outputs)]
+        profile = None
+        dshape = -1 in network.get_input(0).shape
+        if dshape:
+            profile = builder.create_optimization_profile()
+            if scale is None:
+                scale = np.array(
+                    [[1, 1, 0.5, 0.5], [1, 1, 1, 1], [4, 1, 1.5, 1.5]],
+                    dtype=np.float32)
+                scale = (self.opt_shape * scale).astype(np.int32)
+            elif isinstance(scale, List):
+                scale = np.array(scale, dtype=np.int32)
+                assert scale.shape[0] == 3, 'Input a wrong scale list'
+            else:
+                raise NotImplementedError
+
+        for inp in inputs:
+            logger.log(
+                trt.Logger.WARNING,
+                f'input "{inp.name}" with shape{inp.shape} {inp.dtype}')
+            if dshape:
+                profile.set_shape(inp.name, *scale)
+        for out in outputs:
+            logger.log(
+                trt.Logger.WARNING,
+                f'output "{out.name}" with shape{out.shape} {out.dtype}')
+        if fp16 and builder.platform_has_fast_fp16:
+            config.set_flag(trt.BuilderFlag.FP16)
+        self.weight = self.checkpoint.with_suffix('.engine')
+        if dshape:
+            config.add_optimization_profile(profile)
+        if with_profiling:
+            config.profiling_verbosity = trt.ProfilingVerbosity.DETAILED
+        with builder.build_engine(network, config) as engine:
+            self.weight.write_bytes(engine.serialize())
+        logger.log(
+            trt.Logger.WARNING, f'Build tensorrt engine finish.\n'
+            f'Save in {str(self.weight.absolute())}')
+
+    def build(self,
+              scale: Optional[List[List]] = None,
+              fp16: bool = True,
+              with_profiling=True):
+        self.__build_engine(scale, fp16, with_profiling)
+
+
+def parse_args():
+    parser = argparse.ArgumentParser()
+    parser.add_argument('checkpoint', help='Checkpoint file')
+    parser.add_argument(
+        '--img-size',
+        nargs='+',
+        type=int,
+        default=[640, 640],
+        help='Image size of height and width')
+    parser.add_argument(
+        '--device', type=str, default='cuda:0', help='TensorRT builder device')
+    parser.add_argument(
+        '--scales',
+        type=str,
+        default='[[1,3,640,640],[1,3,640,640],[1,3,640,640]]',
+        help='Input scales for build dynamic input shape engine')
+    parser.add_argument(
+        '--fp16', action='store_true', help='Build model with fp16 mode')
+    args = parser.parse_args()
+    args.img_size *= 2 if len(args.img_size) == 1 else 1
+    return args
+
+
+def main(args):
+    img_size = (1, 3, *args.img_size)
+    try:
+        scales = eval(args.scales)
+    except Exception:
+        print('Input scales is not a python variable')
+        print('Set scales default None')
+        scales = None
+    builder = EngineBuilder(args.checkpoint, img_size, args.device)
+    builder.build(scales, fp16=args.fp16)
+
+
+if __name__ == '__main__':
+    args = parse_args()
+    main(args)
diff --git a/mmdetection_practice/third_party/mmyolo/projects/easydeploy/tools/export_onnx.py b/mmdetection_practice/third_party/mmyolo/projects/easydeploy/tools/export_onnx.py
new file mode 100644
index 0000000..b937cc8
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/projects/easydeploy/tools/export_onnx.py
@@ -0,0 +1,157 @@
+import argparse
+import os
+import sys
+import warnings
+from io import BytesIO
+from pathlib import Path
+
+import onnx
+import torch
+from mmdet.apis import init_detector
+from mmengine.config import ConfigDict
+from mmengine.logging import print_log
+from mmengine.utils.path import mkdir_or_exist
+
+# Add MMYOLO ROOT to sys.path
+sys.path.append(str(Path(__file__).resolve().parents[3]))
+from projects.easydeploy.model import DeployModel, MMYOLOBackend  # noqa E402
+
+warnings.filterwarnings(action='ignore', category=torch.jit.TracerWarning)
+warnings.filterwarnings(action='ignore', category=torch.jit.ScriptWarning)
+warnings.filterwarnings(action='ignore', category=UserWarning)
+warnings.filterwarnings(action='ignore', category=FutureWarning)
+warnings.filterwarnings(action='ignore', category=ResourceWarning)
+
+
+def parse_args():
+    parser = argparse.ArgumentParser()
+    parser.add_argument('config', help='Config file')
+    parser.add_argument('checkpoint', help='Checkpoint file')
+    parser.add_argument(
+        '--model-only', action='store_true', help='Export model only')
+    parser.add_argument(
+        '--work-dir', default='./work_dir', help='Path to save export model')
+    parser.add_argument(
+        '--img-size',
+        nargs='+',
+        type=int,
+        default=[640, 640],
+        help='Image size of height and width')
+    parser.add_argument('--batch-size', type=int, default=1, help='Batch size')
+    parser.add_argument(
+        '--device', default='cuda:0', help='Device used for inference')
+    parser.add_argument(
+        '--simplify',
+        action='store_true',
+        help='Simplify onnx model by onnx-sim')
+    parser.add_argument(
+        '--opset', type=int, default=11, help='ONNX opset version')
+    parser.add_argument(
+        '--backend',
+        type=str,
+        default='onnxruntime',
+        help='Backend for export onnx')
+    parser.add_argument(
+        '--pre-topk',
+        type=int,
+        default=1000,
+        help='Postprocess pre topk bboxes feed into NMS')
+    parser.add_argument(
+        '--keep-topk',
+        type=int,
+        default=100,
+        help='Postprocess keep topk bboxes out of NMS')
+    parser.add_argument(
+        '--iou-threshold',
+        type=float,
+        default=0.65,
+        help='IoU threshold for NMS')
+    parser.add_argument(
+        '--score-threshold',
+        type=float,
+        default=0.25,
+        help='Score threshold for NMS')
+    args = parser.parse_args()
+    args.img_size *= 2 if len(args.img_size) == 1 else 1
+    return args
+
+
+def build_model_from_cfg(config_path, checkpoint_path, device):
+    model = init_detector(config_path, checkpoint_path, device=device)
+    model.eval()
+    return model
+
+
+def main():
+    args = parse_args()
+    mkdir_or_exist(args.work_dir)
+    backend = MMYOLOBackend(args.backend.lower())
+    if backend in (MMYOLOBackend.ONNXRUNTIME, MMYOLOBackend.OPENVINO,
+                   MMYOLOBackend.TENSORRT8, MMYOLOBackend.TENSORRT7):
+        if not args.model_only:
+            print_log('Export ONNX with bbox decoder and NMS ...')
+    else:
+        args.model_only = True
+        print_log(f'Can not export postprocess for {args.backend.lower()}.\n'
+                  f'Set "args.model_only=True" default.')
+    if args.model_only:
+        postprocess_cfg = None
+        output_names = None
+    else:
+        postprocess_cfg = ConfigDict(
+            pre_top_k=args.pre_topk,
+            keep_top_k=args.keep_topk,
+            iou_threshold=args.iou_threshold,
+            score_threshold=args.score_threshold)
+        output_names = ['num_dets', 'boxes', 'scores', 'labels']
+    baseModel = build_model_from_cfg(args.config, args.checkpoint, args.device)
+
+    deploy_model = DeployModel(
+        baseModel=baseModel, backend=backend, postprocess_cfg=postprocess_cfg)
+    deploy_model.eval()
+
+    fake_input = torch.randn(args.batch_size, 3,
+                             *args.img_size).to(args.device)
+    # dry run
+    deploy_model(fake_input)
+
+    save_onnx_path = os.path.join(
+        args.work_dir,
+        os.path.basename(args.checkpoint).replace('pth', 'onnx'))
+    # export onnx
+    with BytesIO() as f:
+        torch.onnx.export(
+            deploy_model,
+            fake_input,
+            f,
+            input_names=['images'],
+            output_names=output_names,
+            opset_version=args.opset)
+        f.seek(0)
+        onnx_model = onnx.load(f)
+        onnx.checker.check_model(onnx_model)
+
+        # Fix tensorrt onnx output shape, just for view
+        if not args.model_only and backend in (MMYOLOBackend.TENSORRT8,
+                                               MMYOLOBackend.TENSORRT7):
+            shapes = [
+                args.batch_size, 1, args.batch_size, args.keep_topk, 4,
+                args.batch_size, args.keep_topk, args.batch_size,
+                args.keep_topk
+            ]
+            for i in onnx_model.graph.output:
+                for j in i.type.tensor_type.shape.dim:
+                    j.dim_param = str(shapes.pop(0))
+    if args.simplify:
+        try:
+            import onnxsim
+            onnx_model, check = onnxsim.simplify(onnx_model)
+            assert check, 'assert check failed'
+        except Exception as e:
+            print_log(f'Simplify failure: {e}')
+    onnx.save(onnx_model, save_onnx_path)
+    print_log(f'ONNX export success, save into {save_onnx_path}')
+
+
+if __name__ == '__main__':
+    main()
diff --git a/mmdetection_practice/third_party/mmyolo/projects/easydeploy/tools/image-demo.py b/mmdetection_practice/third_party/mmyolo/projects/easydeploy/tools/image-demo.py
new file mode 100644
index 0000000..c85f31a
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/projects/easydeploy/tools/image-demo.py
@@ -0,0 +1,152 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from projects.easydeploy.model import ORTWrapper, TRTWrapper  # isort:skip
+import os
+import random
+from argparse import ArgumentParser
+
+import cv2
+import mmcv
+import numpy as np
+import torch
+from mmcv.transforms import Compose
+from mmdet.utils import get_test_pipeline_cfg
+from mmengine.config import Config, ConfigDict
+from mmengine.utils import ProgressBar, path
+
+from mmyolo.utils import register_all_modules
+from mmyolo.utils.misc import get_file_list
+
+
+def parse_args():
+    parser = ArgumentParser()
+    parser.add_argument(
+        'img', help='Image path, include image file, dir and URL.')
+    parser.add_argument('config', help='Config file')
+    parser.add_argument('checkpoint', help='Checkpoint file')
+    parser.add_argument(
+        '--out-dir', default='./output', help='Path to output file')
+    parser.add_argument(
+        '--device', default='cuda:0', help='Device used for inference')
+    parser.add_argument(
+        '--show', action='store_true', help='Show the detection results')
+    args = parser.parse_args()
+    return args
+
+
+def preprocess(config):
+    data_preprocess = config.get('model', {}).get('data_preprocessor', {})
+    mean = data_preprocess.get('mean', [0., 0., 0.])
+    std = data_preprocess.get('std', [1., 1., 1.])
+    mean = torch.tensor(mean, dtype=torch.float32).reshape(1, 3, 1, 1)
+    std = torch.tensor(std, dtype=torch.float32).reshape(1, 3, 1, 1)
+
+    class PreProcess(torch.nn.Module):
+
+        def __init__(self):
+            super().__init__()
+
+        def forward(self, x):
+            x = x[None].float()
+            x -= mean.to(x.device)
+            x /= std.to(x.device)
+            return x
+
+    return PreProcess().eval()
+
+
+def main():
+    args = parse_args()
+
+    # register all modules in mmdet into the registries
+    register_all_modules()
+
+    colors = [[random.randint(0, 255) for _ in range(3)] for _ in range(1000)]
+
+    # build the model from a config file and a checkpoint file
+    if args.checkpoint.endswith('.onnx'):
+        model = ORTWrapper(args.checkpoint, args.device)
+    elif args.checkpoint.endswith('.engine') or args.checkpoint.endswith(
+            '.plan'):
+        model = TRTWrapper(args.checkpoint, args.device)
+    else:
+        raise NotImplementedError
+
+    model.to(args.device)
+
+    cfg = Config.fromfile(args.config)
+    class_names = cfg.get('class_name')
+
+    test_pipeline = get_test_pipeline_cfg(cfg)
+    test_pipeline[0] = ConfigDict({'type': 'mmdet.LoadImageFromNDArray'})
+    test_pipeline = Compose(test_pipeline)
+
+    pre_pipeline = preprocess(cfg)
+
+    if not args.show:
+        path.mkdir_or_exist(args.out_dir)
+
+    # get file list
+    files, source_type = get_file_list(args.img)
+
+    # start detector inference
+    progress_bar = ProgressBar(len(files))
+    for i, file in enumerate(files):
+        bgr = mmcv.imread(file)
+        rgb = mmcv.imconvert(bgr, 'bgr', 'rgb')
+        data, samples = test_pipeline(dict(img=rgb, img_id=i)).values()
+        pad_param = samples.get('pad_param',
+                                np.array([0, 0, 0, 0], dtype=np.float32))
+        h, w = samples.get('ori_shape', rgb.shape[:2])
+        pad_param = torch.asarray(
+            [pad_param[2], pad_param[0], pad_param[2], pad_param[0]],
+            device=args.device)
+        scale_factor = samples.get('scale_factor', [1., 1])
+        scale_factor = torch.asarray(scale_factor * 2, device=args.device)
+        data = pre_pipeline(data).to(args.device)
+
+        result = model(data)
+        if source_type['is_dir']:
+            filename = os.path.relpath(file, args.img).replace('/', '_')
+        else:
+            filename = os.path.basename(file)
+        out_file = None if args.show else os.path.join(args.out_dir, filename)
+
+        # Get candidate predict info by num_dets
+        num_dets, bboxes, scores, labels = result
+        scores = scores[0, :num_dets]
+        bboxes = bboxes[0, :num_dets]
+        labels = labels[0, :num_dets]
+        bboxes -= pad_param
+        bboxes /= scale_factor
+
+        bboxes[:, 0::2].clamp_(0, w)
+        bboxes[:, 1::2].clamp_(0, h)
+        bboxes = bboxes.round().int()
+
+        for (bbox, score, label) in zip(bboxes, scores, labels):
+            bbox = bbox.tolist()
+            color = colors[label]
+
+            if class_names is not None:
+                label_name = class_names[label]
+                name = f'cls:{label_name}_score:{score:0.4f}'
+            else:
+                name = f'cls:{label}_score:{score:0.4f}'
+
+            cv2.rectangle(bgr, bbox[:2], bbox[2:], color, 2)
+            cv2.putText(
+                bgr,
+                name, (bbox[0], bbox[1] - 2),
+                cv2.FONT_HERSHEY_SIMPLEX,
+                2.0, [225, 255, 255],
+                thickness=3)
+
+        if args.show:
+            mmcv.imshow(bgr, 'result', 0)
+        else:
+            mmcv.imwrite(bgr, out_file)
+        progress_bar.update()
+
+
+if __name__ == '__main__':
+    main()
diff --git a/mmdetection_practice/third_party/mmyolo/projects/example_project/README.md b/mmdetection_practice/third_party/mmyolo/projects/example_project/README.md
new file mode 100644
index 0000000..24c84d9
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/projects/example_project/README.md
@@ -0,0 +1,141 @@
+# Dummy YOLOv5CSPDarknet Wrapper
+
+This is an example README for community `projects/`. We have provided detailed explanations for each field in the form of html comments, which are visible when you read the source of this README file. If you wish to submit your project to our main repository, then all the fields in this README are mandatory for others to understand what you have achieved in this implementation. For more details, read our [contribution guide](https://mmyolo.readthedocs.io/en/latest/community/contributing.html) or approach us in [Discussions](https://github.com/open-mmlab/mmyolo/discussions).
+
+## Description
+
+<!-- Share any information you would like others to know. For example:
+Author: @xxx.
+This is an implementation of \[XXX\]. -->
+
+This project implements a dummy YOLOv5CSPDarknet wrapper, which literally does nothing new but prints "hello world" during initialization.
+
+## Usage
+
+<!-- For a typical model, this section should contain the commands for training and testing. You are also suggested to dump your environment specification to env.yml by `conda env export > env.yml`. -->
+
+### Training commands
+
+In MMYOLO's root directory, run the following command to train the model:
+
+```bash
+python tools/train.py projects/example_project/configs/yolov5_s_dummy-backbone_v61_syncbn_8xb16-300e_coco.py
+```
+
+### Testing commands
+
+In MMYOLO's root directory, run the following command to test the model:
+
+```bash
+python tools/test.py projects/example_project/configs/yolov5_s_dummy-backbone_v61_syncbn_8xb16-300e_coco.py ${CHECKPOINT_PATH}
+```
+
+## Results
+
+<!-- List the results as usually done in other model's README. [Example](https://github.com/open-mmlab/mmyolo/tree/main/configs/yolov5#results-and-models)
+You should claim whether this is based on the pre-trained weights, which are converted from the official release; or it's a reproduced result obtained from retraining the model in this project. -->
+
+|                                    Method                                     |       Backbone        | Pretrained Model |  Training set  |   Test set   | #epoch | box AP |         Download         |
+| :---------------------------------------------------------------------------: | :-------------------: | :--------------: | :------------: | :----------: | :----: | :----: | :----------------------: |
+| [YOLOv5 dummy](configs/yolov5_s_dummy-backbone_v61_syncbn_8xb16-300e_coco.py) | DummyYOLOv5CSPDarknet |        -         | COCO2017 Train | COCO2017 Val |  300   |  37.7  | [model](<>) \| [log](<>) |
+
+## Citation
+
+<!-- You may remove this section if not applicable. -->
+
+```latex
+@software{glenn_jocher_2022_7002879,
+  author       = {Glenn Jocher and
+                  Ayush Chaurasia and
+                  Alex Stoken and
+                  Jirka Borovec and
+                  NanoCode012 and
+                  Yonghye Kwon and
+                  TaoXie and
+                  Kalen Michael and
+                  Jiacong Fang and
+                  imyhxy and
+                  Lorna and
+                  Colin Wong and
+                  曾逸夫(Zeng Yifu) and
+                  Abhiram V and
+                  Diego Montes and
+                  Zhiqiang Wang and
+                  Cristi Fati and
+                  Jebastin Nadar and
+                  Laughing and
+                  UnglvKitDe and
+                  tkianai and
+                  yxNONG and
+                  Piotr Skalski and
+                  Adam Hogan and
+                  Max Strobel and
+                  Mrinal Jain and
+                  Lorenzo Mammana and
+                  xylieong},
+  title        = {{ultralytics/yolov5: v6.2 - YOLOv5 Classification
+                   Models, Apple M1, Reproducibility, ClearML and
+                   Deci.ai integrations}},
+  month        = aug,
+  year         = 2022,
+  publisher    = {Zenodo},
+  version      = {v6.2},
+  doi          = {10.5281/zenodo.7002879},
+  url          = {https://doi.org/10.5281/zenodo.7002879}
+}
+```
+
+## Checklist
+
+<!-- Here is a checklist illustrating a usual development workflow of a successful project, and also serves as an overview of this project's progress. The PIC (person in charge) or contributors of this project should check all the items that they believe have been finished, which will further be verified by codebase maintainers via a PR.
+OpenMMLab's maintainer will review the code to ensure the project's quality. Reaching the first milestone means that this project suffices the minimum requirement of being merged into 'projects/'. But this project is only eligible to become a part of the core package upon attaining the last milestone.
+Note that keeping this section up-to-date is crucial not only for this project's developers but the entire community, since there might be some other contributors joining this project and deciding their starting point from this list. It also helps maintainers accurately estimate time and effort on further code polishing, if needed.
+A project does not necessarily have to be finished in a single PR, but it's essential for the project to at least reach the first milestone in its very first PR. -->
+
+- [ ] Milestone 1: PR-ready, and acceptable to be one of the `projects/`.
+
+  - [ ] Finish the code
+
+    <!-- The code's design shall follow existing interfaces and convention. For example, each model component should be registered into `mmyolo.registry.MODELS` and configurable via a config file. -->
+
+  - [ ] Basic docstrings & proper citation
+
+    <!-- Each major object should contain a docstring, describing its functionality and arguments. If you have adapted the code from other open-source projects, don't forget to cite the source project in docstring and make sure your behavior is not against its license. Typically, we do not accept any code snippet under GPL license. [A Short Guide to Open Source Licenses](https://medium.com/nationwide-technology/a-short-guide-to-open-source-licenses-cf5b1c329edd) -->
+
+  - [ ] Test-time correctness
+
+    <!-- If you are reproducing the result from a paper, make sure your model's inference-time performance matches that in the original paper. The weights usually could be obtained by simply renaming the keys in the official pre-trained weights. This test could be skipped though, if you are able to prove the training-time correctness and check the second milestone. -->
+
+  - [ ] A full README
+
+    <!-- As this template does. -->
+
+- [ ] Milestone 2: Indicates a successful model implementation.
+
+  - [ ] Training-time correctness
+
+    <!-- If you are reproducing the result from a paper, checking this item means that you should have trained your model from scratch based on the original paper's specification and verified that the final result matches the report within a minor error range. -->
+
+- [ ] Milestone 3: Good to be a part of our core package!
+
+  - [ ] Type hints and docstrings
+
+    <!-- Ideally *all* the methods should have [type hints](https://www.pythontutorial.net/python-basics/python-type-hints/) and [docstrings](https://google.github.io/styleguide/pyguide.html#381-docstrings). [Example](https://github.com/open-mmlab/mmyolo/blob/27487fd587398348d59eb8c40af740cabee6b7fe/mmyolo/models/layers/yolo_bricks.py#L32-L54) -->
+
+  - [ ] Unit tests
+
+    <!-- Unit tests for each module are required. [Example](https://github.com/open-mmlab/mmyolo/blob/27487fd587398348d59eb8c40af740cabee6b7fe/tests/test_models/test_layers/test_yolo_bricks.py#L13-L34) -->
+
+  - [ ] Code polishing
+
+    <!-- Refactor your code according to reviewer's comment. -->
+
+  - [ ] Metafile.yml
+
+    <!-- It will be parsed by MIM and Inference. [Example](https://github.com/open-mmlab/mmyolo/blob/main/configs/yolov5/metafile.yml) -->
+
+- [ ] Move your modules into the core package following the codebase's file hierarchy structure.
+
+  <!-- In particular, you may have to refactor this README into a standard one. [Example](https://github.com/open-mmlab/mmyolo/blob/main/configs/yolov5/README.md) -->
+
+- [ ] Refactor your modules into the core package following the codebase's file hierarchy structure.
diff --git a/mmdetection_practice/third_party/mmyolo/projects/example_project/configs/yolov5_s_dummy-backbone_v61_syncbn_8xb16-300e_coco.py b/mmdetection_practice/third_party/mmyolo/projects/example_project/configs/yolov5_s_dummy-backbone_v61_syncbn_8xb16-300e_coco.py
new file mode 100644
index 0000000..55b43bb
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/projects/example_project/configs/yolov5_s_dummy-backbone_v61_syncbn_8xb16-300e_coco.py
@@ -0,0 +1,5 @@
+_base_ = '../../../configs/yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py'
+
+custom_imports = dict(imports=['projects.example_project.dummy'])
+
+_base_.model.backbone.type = 'DummyYOLOv5CSPDarknet'
diff --git a/mmdetection_practice/third_party/mmyolo/projects/example_project/dummy/__init__.py b/mmdetection_practice/third_party/mmyolo/projects/example_project/dummy/__init__.py
new file mode 100644
index 0000000..ca1028c
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/projects/example_project/dummy/__init__.py
@@ -0,0 +1,4 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from .dummy_yolov5cspdarknet import DummyYOLOv5CSPDarknet
+
+__all__ = ['DummyYOLOv5CSPDarknet']
diff --git a/mmdetection_practice/third_party/mmyolo/projects/example_project/dummy/dummy_yolov5cspdarknet.py b/mmdetection_practice/third_party/mmyolo/projects/example_project/dummy/dummy_yolov5cspdarknet.py
new file mode 100644
index 0000000..c500abb
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/projects/example_project/dummy/dummy_yolov5cspdarknet.py
@@ -0,0 +1,16 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+
+from mmyolo.models import YOLOv5CSPDarknet
+from mmyolo.registry import MODELS
+
+
+@MODELS.register_module()
+class DummyYOLOv5CSPDarknet(YOLOv5CSPDarknet):
+    """Implements a dummy YOLOv5CSPDarknet wrapper for demonstration purpose.
+    Args:
+        **kwargs: All the arguments are passed to the parent class.
+    """
+
+    def __init__(self, **kwargs) -> None:
+        print('Hello world!')
+        super().__init__(**kwargs)
diff --git a/mmdetection_practice/third_party/mmyolo/projects/misc/custom_dataset/README.md b/mmdetection_practice/third_party/mmyolo/projects/misc/custom_dataset/README.md
new file mode 100644
index 0000000..e98fa73
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/projects/misc/custom_dataset/README.md
@@ -0,0 +1,3 @@
+Tips: 这个是自定义数据集的 config 文件,请结合 [标注+训练+测试+部署全流程](https://github.com/open-mmlab/mmyolo/blob/main/docs/zh_cn/recommended_topics/labeling_to_deployment_tutorials.md) 来使用。
+
+Tips: This is the config file of the custom dataset. Please use it in combination with [Annotation-to-deployment workflow for custom dataset](https://github.com/open-mmlab/mmyolo/blob/main/docs/en/recommended_topics/labeling_to_deployment_tutorials.md).
diff --git a/mmdetection_practice/third_party/mmyolo/projects/misc/custom_dataset/yolov5_s-v61_syncbn_fast_1xb32-100e_cat.py b/mmdetection_practice/third_party/mmyolo/projects/misc/custom_dataset/yolov5_s-v61_syncbn_fast_1xb32-100e_cat.py
new file mode 100644
index 0000000..1d6a9d3
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/projects/misc/custom_dataset/yolov5_s-v61_syncbn_fast_1xb32-100e_cat.py
@@ -0,0 +1,76 @@
+_base_ = '../yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py'
+
+max_epochs = 100
+data_root = './data/cat/'
+# data_root = '/root/workspace/mmyolo/data/cat/'  # Docker
+
+work_dir = './work_dirs/yolov5_s-v61_syncbn_fast_1xb32-100e_cat'
+
+load_from = 'https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth'  # noqa
+
+train_batch_size_per_gpu = 32
+train_num_workers = 4
+
+save_epoch_intervals = 2
+
+# base_lr_default * (your_bs / default_bs)
+base_lr = _base_.base_lr / 4
+
+anchors = [
+    [(68, 69), (154, 91), (143, 162)],  # P3/8
+    [(242, 160), (189, 287), (391, 207)],  # P4/16
+    [(353, 337), (539, 341), (443, 432)]  # P5/32
+]
+
+class_name = ('cat', )
+num_classes = len(class_name)
+metainfo = dict(classes=class_name, palette=[(220, 20, 60)])
+
+train_cfg = dict(
+    max_epochs=max_epochs, val_begin=20, val_interval=save_epoch_intervals)
+
+model = dict(
+    bbox_head=dict(
+        head_module=dict(num_classes=num_classes),
+        prior_generator=dict(base_sizes=anchors),
+        loss_cls=dict(loss_weight=0.5 *
+                      (num_classes / 80 * 3 / _base_.num_det_layers))))
+
+train_dataloader = dict(
+    batch_size=train_batch_size_per_gpu,
+    num_workers=train_num_workers,
+    dataset=dict(
+        _delete_=True,
+        type='RepeatDataset',
+        times=5,
+        dataset=dict(
+            type=_base_.dataset_type,
+            data_root=data_root,
+            metainfo=metainfo,
+            ann_file='annotations/trainval.json',
+            data_prefix=dict(img='images/'),
+            filter_cfg=dict(filter_empty_gt=False, min_size=32),
+            pipeline=_base_.train_pipeline)))
+
+val_dataloader = dict(
+    dataset=dict(
+        metainfo=metainfo,
+        data_root=data_root,
+        ann_file='annotations/trainval.json',
+        data_prefix=dict(img='images/')))
+
+test_dataloader = val_dataloader
+
+val_evaluator = dict(ann_file=data_root + 'annotations/trainval.json')
+test_evaluator = val_evaluator
+
+optim_wrapper = dict(optimizer=dict(lr=base_lr))
+
+default_hooks = dict(
+    checkpoint=dict(
+        type='CheckpointHook',
+        interval=save_epoch_intervals,
+        max_keep_ckpts=5,
+        save_best='auto'),
+    param_scheduler=dict(max_epochs=max_epochs),
+    logger=dict(type='LoggerHook', interval=10))
diff --git a/mmdetection_practice/third_party/mmyolo/projects/misc/custom_dataset/yolov6_s_syncbn_fast_1xb32-100e_cat.py b/mmdetection_practice/third_party/mmyolo/projects/misc/custom_dataset/yolov6_s_syncbn_fast_1xb32-100e_cat.py
new file mode 100644
index 0000000..67d5638
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/projects/misc/custom_dataset/yolov6_s_syncbn_fast_1xb32-100e_cat.py
@@ -0,0 +1,85 @@
+_base_ = '../yolov6/yolov6_s_syncbn_fast_8xb32-400e_coco.py'
+
+max_epochs = 100
+data_root = './data/cat/'
+
+work_dir = './work_dirs/yolov6_s_syncbn_fast_1xb32-100e_cat'
+
+load_from = 'https://download.openmmlab.com/mmyolo/v0/yolov6/yolov6_s_syncbn_fast_8xb32-400e_coco/yolov6_s_syncbn_fast_8xb32-400e_coco_20221102_203035-932e1d91.pth'  # noqa
+
+train_batch_size_per_gpu = 32
+train_num_workers = 4  # train_num_workers = nGPU x 4
+
+save_epoch_intervals = 2
+
+# base_lr_default * (your_bs / default_bs)
+base_lr = _base_.base_lr / 8
+
+class_name = ('cat', )
+num_classes = len(class_name)
+metainfo = dict(classes=class_name, palette=[(220, 20, 60)])
+
+train_cfg = dict(
+    max_epochs=max_epochs,
+    val_begin=20,
+    val_interval=save_epoch_intervals,
+    dynamic_intervals=[(max_epochs - _base_.num_last_epochs, 1)])
+
+model = dict(
+    bbox_head=dict(head_module=dict(num_classes=num_classes)),
+    train_cfg=dict(
+        initial_assigner=dict(num_classes=num_classes),
+        assigner=dict(num_classes=num_classes)))
+
+train_dataloader = dict(
+    batch_size=train_batch_size_per_gpu,
+    num_workers=train_num_workers,
+    dataset=dict(
+        _delete_=True,
+        type='RepeatDataset',
+        times=5,
+        dataset=dict(
+            type=_base_.dataset_type,
+            data_root=data_root,
+            metainfo=metainfo,
+            ann_file='annotations/trainval.json',
+            data_prefix=dict(img='images/'),
+            filter_cfg=dict(filter_empty_gt=False, min_size=32),
+            pipeline=_base_.train_pipeline)))
+
+val_dataloader = dict(
+    dataset=dict(
+        metainfo=metainfo,
+        data_root=data_root,
+        ann_file='annotations/trainval.json',
+        data_prefix=dict(img='images/')))
+
+test_dataloader = val_dataloader
+
+val_evaluator = dict(ann_file=data_root + 'annotations/trainval.json')
+test_evaluator = val_evaluator
+
+optim_wrapper = dict(optimizer=dict(lr=base_lr))
+
+default_hooks = dict(
+    checkpoint=dict(
+        type='CheckpointHook',
+        interval=save_epoch_intervals,
+        max_keep_ckpts=5,
+        save_best='auto'),
+    param_scheduler=dict(max_epochs=max_epochs),
+    logger=dict(type='LoggerHook', interval=10))
+
+custom_hooks = [
+    dict(
+        type='EMAHook',
+        ema_type='ExpMomentumEMA',
+        momentum=0.0001,
+        update_buffers=True,
+        strict_load=False,
+        priority=49),
+    dict(
+        type='mmdet.PipelineSwitchHook',
+        switch_epoch=max_epochs - _base_.num_last_epochs,
+        switch_pipeline=_base_.train_pipeline_stage2)
+]
diff --git a/mmdetection_practice/third_party/mmyolo/projects/misc/custom_dataset/yolov7_tiny_syncbn_fast_1xb32-100e_cat.py b/mmdetection_practice/third_party/mmyolo/projects/misc/custom_dataset/yolov7_tiny_syncbn_fast_1xb32-100e_cat.py
new file mode 100644
index 0000000..fff59cb
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/projects/misc/custom_dataset/yolov7_tiny_syncbn_fast_1xb32-100e_cat.py
@@ -0,0 +1,78 @@
+_base_ = '../yolov7/yolov7_tiny_syncbn_fast_8x16b-300e_coco.py'
+
+max_epochs = 100
+data_root = './data/cat/'
+
+work_dir = './work_dirs/yolov7_tiny_syncbn_fast_1xb32-100e_cat'
+
+load_from = 'https://download.openmmlab.com/mmyolo/v0/yolov7/yolov7_tiny_syncbn_fast_8x16b-300e_coco/yolov7_tiny_syncbn_fast_8x16b-300e_coco_20221126_102719-0ee5bbdf.pth'  # noqa
+
+train_batch_size_per_gpu = 32
+train_num_workers = 4  # train_num_workers = nGPU x 4
+
+save_epoch_intervals = 2
+
+# base_lr_default * (your_bs / default_bs)
+base_lr = 0.01 / 4
+
+anchors = [
+    [(68, 69), (154, 91), (143, 162)],  # P3/8
+    [(242, 160), (189, 287), (391, 207)],  # P4/16
+    [(353, 337), (539, 341), (443, 432)]  # P5/32
+]
+
+class_name = ('cat', )
+num_classes = len(class_name)
+metainfo = dict(classes=class_name, palette=[(220, 20, 60)])
+
+train_cfg = dict(
+    max_epochs=max_epochs,
+    val_begin=20,
+    val_interval=save_epoch_intervals,
+    dynamic_intervals=[(max_epochs - 10, 1)])
+
+model = dict(
+    bbox_head=dict(
+        head_module=dict(num_classes=num_classes),
+        prior_generator=dict(base_sizes=anchors),
+        loss_cls=dict(loss_weight=0.5 *
+                      (num_classes / 80 * 3 / _base_.num_det_layers))))
+
+train_dataloader = dict(
+    batch_size=train_batch_size_per_gpu,
+    num_workers=train_num_workers,
+    dataset=dict(
+        _delete_=True,
+        type='RepeatDataset',
+        times=5,
+        dataset=dict(
+            type=_base_.dataset_type,
+            data_root=data_root,
+            metainfo=metainfo,
+            ann_file='annotations/trainval.json',
+            data_prefix=dict(img='images/'),
+            filter_cfg=dict(filter_empty_gt=False, min_size=32),
+            pipeline=_base_.train_pipeline)))
+
+val_dataloader = dict(
+    dataset=dict(
+        metainfo=metainfo,
+        data_root=data_root,
+        ann_file='annotations/trainval.json',
+        data_prefix=dict(img='images/')))
+
+test_dataloader = val_dataloader
+
+val_evaluator = dict(ann_file=data_root + 'annotations/trainval.json')
+test_evaluator = val_evaluator
+
+optim_wrapper = dict(optimizer=dict(lr=base_lr))
+
+default_hooks = dict(
+    checkpoint=dict(
+        type='CheckpointHook',
+        interval=save_epoch_intervals,
+        max_keep_ckpts=2,
+        save_best='auto'),
+    param_scheduler=dict(max_epochs=max_epochs),
+    logger=dict(type='LoggerHook', interval=10))
diff --git a/mmdetection_practice/third_party/mmyolo/projects/misc/ionogram_detection/README.md b/mmdetection_practice/third_party/mmyolo/projects/misc/ionogram_detection/README.md
new file mode 100644
index 0000000..eb7ddd5
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/projects/misc/ionogram_detection/README.md
@@ -0,0 +1,3 @@
+Tips: 这是 MMYOLO 应用范例的配置文件,请结合 [基于 MMYOLO 的频高图实时目标检测 benchmark](/docs/zh_cn/recommended_topics/application_examples/ionogram_detection.md) 来使用。
+
+Tips: This is the config file of the MMYOLO application examples. Please use it in combination with [A Benchmark for Ionogram Detection Based on MMYOLO](/docs/en/recommended_topics/application_examples/ionogram_detection.md).
diff --git a/mmdetection_practice/third_party/mmyolo/projects/misc/ionogram_detection/rtmdet/rtmdet_l_fast_1xb32-100e_ionogram.py b/mmdetection_practice/third_party/mmyolo/projects/misc/ionogram_detection/rtmdet/rtmdet_l_fast_1xb32-100e_ionogram.py
new file mode 100644
index 0000000..f1829ee
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/projects/misc/ionogram_detection/rtmdet/rtmdet_l_fast_1xb32-100e_ionogram.py
@@ -0,0 +1,107 @@
+_base_ = 'mmyolo::rtmdet/rtmdet_l_syncbn_fast_8xb32-300e_coco.py'
+
+# ======================== Modified parameters ======================
+# -----data related-----
+data_root = './Iono4311/'
+train_ann_file = 'annotations/train.json'
+train_data_prefix = 'train_images/'
+val_ann_file = 'annotations/val.json'
+val_data_prefix = 'val_images/'
+test_ann_file = 'annotations/test.json'
+test_data_prefix = 'test_images/'
+
+class_name = ('E', 'Es-l', 'Es-c', 'F1', 'F2', 'Spread-F')
+num_classes = len(class_name)
+metainfo = dict(
+    classes=class_name,
+    palette=[(250, 165, 30), (120, 69, 125), (53, 125, 34), (0, 11, 123),
+             (130, 20, 12), (120, 121, 80)])
+
+train_batch_size_per_gpu = 32
+train_num_workers = 8
+val_batch_size_per_gpu = train_batch_size_per_gpu
+
+# Config of batch shapes. Only on val.
+batch_shapes_cfg = dict(batch_size=val_batch_size_per_gpu)
+
+# -----train val related-----
+load_from = 'https://download.openmmlab.com/mmyolo/v0/rtmdet/rtmdet_l_syncbn_fast_8xb32-300e_coco/rtmdet_l_syncbn_fast_8xb32-300e_coco_20230102_135928-ee3abdc4.pth'  # noqa
+
+# default hooks
+save_epoch_intervals = 10
+max_epochs = 100
+max_keep_ckpts = 1
+
+# learning rate
+param_scheduler = [
+    dict(
+        type='LinearLR', start_factor=1.0e-5, by_epoch=False, begin=0,
+        end=300),
+    dict(
+        # use cosine lr from 20 to 100 epoch
+        type='CosineAnnealingLR',
+        eta_min=_base_.base_lr * 0.05,
+        begin=max_epochs // 5,
+        end=max_epochs,
+        T_max=max_epochs * 4 // 5,
+        by_epoch=True,
+        convert_to_iter_based=True),
+]
+
+# train_cfg
+val_interval = 2
+val_begin = 20
+
+tta_model = None
+tta_pipeline = None
+
+visualizer = dict(
+    vis_backends=[dict(type='LocalVisBackend'),
+                  dict(type='WandbVisBackend')])
+
+# ===================== Unmodified in most cases ==================
+model = dict(
+    bbox_head=dict(head_module=dict(num_classes=num_classes)),
+    train_cfg=dict(assigner=dict(num_classes=num_classes)))
+
+train_dataloader = dict(
+    batch_size=train_batch_size_per_gpu,
+    num_workers=train_num_workers,
+    dataset=dict(
+        metainfo=metainfo,
+        data_root=data_root,
+        ann_file=train_ann_file,
+        data_prefix=dict(img=train_data_prefix)))
+
+val_dataloader = dict(
+    batch_size=val_batch_size_per_gpu,
+    num_workers=train_num_workers,
+    dataset=dict(
+        metainfo=metainfo,
+        data_root=data_root,
+        data_prefix=dict(img=val_data_prefix),
+        ann_file=val_ann_file))
+
+test_dataloader = dict(
+    batch_size=val_batch_size_per_gpu,
+    num_workers=train_num_workers,
+    dataset=dict(
+        metainfo=metainfo,
+        data_root=data_root,
+        data_prefix=dict(img=test_data_prefix),
+        ann_file=test_ann_file))
+
+default_hooks = dict(
+    checkpoint=dict(
+        interval=save_epoch_intervals,
+        max_keep_ckpts=max_keep_ckpts,
+        save_best='auto'))
+
+val_evaluator = dict(ann_file=data_root + val_ann_file)
+test_evaluator = dict(ann_file=data_root + test_ann_file)
+
+train_cfg = dict(
+    type='EpochBasedTrainLoop',
+    max_epochs=max_epochs,
+    val_begin=val_begin,
+    val_interval=val_interval)
diff --git a/mmdetection_practice/third_party/mmyolo/projects/misc/ionogram_detection/rtmdet/rtmdet_s_fast_1xb32-100e_ionogram.py b/mmdetection_practice/third_party/mmyolo/projects/misc/ionogram_detection/rtmdet/rtmdet_s_fast_1xb32-100e_ionogram.py
new file mode 100644
index 0000000..49b284b
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/projects/misc/ionogram_detection/rtmdet/rtmdet_s_fast_1xb32-100e_ionogram.py
@@ -0,0 +1,83 @@
+_base_ = './rtmdet_l_fast_1xb32-100e_ionogram.py'
+
+load_from = 'https://download.openmmlab.com/mmyolo/v0/rtmdet/rtmdet_s_syncbn_fast_8xb32-300e_coco/rtmdet_s_syncbn_fast_8xb32-300e_coco_20221230_182329-0a8c901a.pth'  # noqa
+
+# ======================= Modified parameters =====================
+deepen_factor = 0.33
+widen_factor = 0.5
+img_scale = _base_.img_scale
+
+# ratio range for random resize
+random_resize_ratio_range = (0.5, 2.0)
+# Number of cached images in mosaic
+mosaic_max_cached_images = 40
+# Number of cached images in mixup
+mixup_max_cached_images = 20
+
+# ===================== Unmodified in most cases ==================
+model = dict(
+    backbone=dict(deepen_factor=deepen_factor, widen_factor=widen_factor),
+    neck=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+    ),
+    bbox_head=dict(head_module=dict(widen_factor=widen_factor)))
+
+train_pipeline = [
+    dict(type='LoadImageFromFile', backend_args=_base_.backend_args),
+    dict(type='LoadAnnotations', with_bbox=True),
+    dict(
+        type='Mosaic',
+        img_scale=img_scale,
+        use_cached=True,
+        max_cached_images=mosaic_max_cached_images,
+        pad_val=114.0),
+    dict(
+        type='mmdet.RandomResize',
+        # img_scale is (width, height)
+        scale=(img_scale[0] * 2, img_scale[1] * 2),
+        ratio_range=random_resize_ratio_range,  # note
+        resize_type='mmdet.Resize',
+        keep_ratio=True),
+    dict(type='mmdet.RandomCrop', crop_size=img_scale),
+    dict(type='mmdet.YOLOXHSVRandomAug'),
+    dict(type='mmdet.RandomFlip', prob=0.5),
+    dict(type='mmdet.Pad', size=img_scale, pad_val=dict(img=(114, 114, 114))),
+    dict(
+        type='YOLOv5MixUp',
+        use_cached=True,
+        max_cached_images=mixup_max_cached_images),
+    dict(type='mmdet.PackDetInputs')
+]
+
+train_pipeline_stage2 = [
+    dict(type='LoadImageFromFile', backend_args=_base_.backend_args),
+    dict(type='LoadAnnotations', with_bbox=True),
+    dict(
+        type='mmdet.RandomResize',
+        scale=img_scale,
+        ratio_range=random_resize_ratio_range,  # note
+        resize_type='mmdet.Resize',
+        keep_ratio=True),
+    dict(type='mmdet.RandomCrop', crop_size=img_scale),
+    dict(type='mmdet.YOLOXHSVRandomAug'),
+    dict(type='mmdet.RandomFlip', prob=0.5),
+    dict(type='mmdet.Pad', size=img_scale, pad_val=dict(img=(114, 114, 114))),
+    dict(type='mmdet.PackDetInputs')
+]
+
+train_dataloader = dict(dataset=dict(pipeline=train_pipeline))
+
+custom_hooks = [
+    dict(
+        type='EMAHook',
+        ema_type='ExpMomentumEMA',
+        momentum=0.0002,
+        update_buffers=True,
+        strict_load=False,
+        priority=49),
+    dict(
+        type='mmdet.PipelineSwitchHook',
+        switch_epoch=_base_.max_epochs - _base_.num_epochs_stage2,
+        switch_pipeline=train_pipeline_stage2)
+]
diff --git a/mmdetection_practice/third_party/mmyolo/projects/misc/ionogram_detection/rtmdet/rtmdet_tiny_fast_1xb32-100e_ionogram.py b/mmdetection_practice/third_party/mmyolo/projects/misc/ionogram_detection/rtmdet/rtmdet_tiny_fast_1xb32-100e_ionogram.py
new file mode 100644
index 0000000..acdaa07
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/projects/misc/ionogram_detection/rtmdet/rtmdet_tiny_fast_1xb32-100e_ionogram.py
@@ -0,0 +1,62 @@
+_base_ = './rtmdet_s_fast_1xb32-100e_ionogram.py'
+
+# ======================= Modified parameters ======================
+deepen_factor = 0.167
+widen_factor = 0.375
+img_scale = _base_.img_scale
+
+load_from = 'https://download.openmmlab.com/mmyolo/v0/rtmdet/rtmdet_tiny_syncbn_fast_8xb32-300e_coco/rtmdet_tiny_syncbn_fast_8xb32-300e_coco_20230102_140117-dbb1dc83.pth'  # noqa
+
+# learning rate
+param_scheduler = [
+    dict(
+        type='LinearLR', start_factor=1.0e-5, by_epoch=False, begin=0,
+        end=300),
+    dict(
+        # use cosine lr from 50 to 100 epoch
+        type='CosineAnnealingLR',
+        eta_min=_base_.base_lr * 0.05,
+        begin=_base_.max_epochs // 2,
+        end=_base_.max_epochs,
+        T_max=_base_.max_epochs // 2,
+        by_epoch=True,
+        convert_to_iter_based=True),
+]
+
+# =======================Unmodified in most cases==================
+model = dict(
+    backbone=dict(deepen_factor=deepen_factor, widen_factor=widen_factor),
+    neck=dict(deepen_factor=deepen_factor, widen_factor=widen_factor),
+    bbox_head=dict(head_module=dict(widen_factor=widen_factor)))
+
+train_pipeline = [
+    dict(type='LoadImageFromFile', backend_args=_base_.backend_args),
+    dict(type='LoadAnnotations', with_bbox=True),
+    dict(
+        type='Mosaic',
+        img_scale=img_scale,
+        use_cached=True,
+        max_cached_images=20,  # note
+        random_pop=False,  # note
+        pad_val=114.0),
+    dict(
+        type='mmdet.RandomResize',
+        # img_scale is (width, height)
+        scale=(img_scale[0] * 2, img_scale[1] * 2),
+        ratio_range=(0.5, 2.0),
+        resize_type='mmdet.Resize',
+        keep_ratio=True),
+    dict(type='mmdet.RandomCrop', crop_size=img_scale),
+    dict(type='mmdet.YOLOXHSVRandomAug'),
+    dict(type='mmdet.RandomFlip', prob=0.5),
+    dict(type='mmdet.Pad', size=img_scale, pad_val=dict(img=(114, 114, 114))),
+    dict(
+        type='YOLOv5MixUp',
+        use_cached=True,
+        random_pop=False,
+        max_cached_images=10,
+        prob=0.5),
+    dict(type='mmdet.PackDetInputs')
+]
+
+train_dataloader = dict(dataset=dict(pipeline=train_pipeline))
diff --git a/mmdetection_practice/third_party/mmyolo/projects/misc/ionogram_detection/yolov5/yolov5_m-v61_fast_1xb32-100e_ionogram.py b/mmdetection_practice/third_party/mmyolo/projects/misc/ionogram_detection/yolov5/yolov5_m-v61_fast_1xb32-100e_ionogram.py
new file mode 100644
index 0000000..737aeae
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/projects/misc/ionogram_detection/yolov5/yolov5_m-v61_fast_1xb32-100e_ionogram.py
@@ -0,0 +1,95 @@
+_base_ = './yolov5_s-v61_fast_1xb96-100e_ionogram.py'
+
+# ======================= Modified parameters =====================
+# Copied from '../../yolov5/yolov5_m-v61_syncbn_fast_8xb16-300e_coco.py'
+deepen_factor = 0.67
+widen_factor = 0.75
+lr_factor = 0.1
+affine_scale = 0.9
+loss_cls_weight = 0.3
+loss_obj_weight = 0.7
+mixup_prob = 0.1
+
+# -----data related-----
+train_batch_size_per_gpu = 32
+
+# -----train val related-----
+# Scale lr for SGD
+base_lr = _base_.base_lr * train_batch_size_per_gpu \
+    / _base_.train_batch_size_per_gpu
+load_from = 'https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_m-v61_syncbn_fast_8xb16-300e_coco/yolov5_m-v61_syncbn_fast_8xb16-300e_coco_20220917_204944-516a710f.pth'  # noqa
+
+# ===================== Unmodified in most cases ==================
+num_classes = _base_.num_classes
+num_det_layers = _base_.num_det_layers
+img_scale = _base_.img_scale
+
+model = dict(
+    backbone=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+    ),
+    neck=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+    ),
+    bbox_head=dict(
+        head_module=dict(widen_factor=widen_factor),
+        loss_cls=dict(loss_weight=loss_cls_weight *
+                      (num_classes / 80 * 3 / num_det_layers)),
+        loss_obj=dict(loss_weight=loss_obj_weight *
+                      ((img_scale[0] / 640)**2 * 3 / num_det_layers))))
+
+pre_transform = _base_.pre_transform
+albu_train_transforms = _base_.albu_train_transforms
+
+mosaic_affine_pipeline = [
+    dict(
+        type='Mosaic',
+        img_scale=img_scale,
+        pad_val=114.0,
+        pre_transform=pre_transform),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        scaling_ratio_range=(1 - affine_scale, 1 + affine_scale),
+        # img_scale is (width, height)
+        border=(-img_scale[0] // 2, -img_scale[1] // 2),
+        border_val=(114, 114, 114))
+]
+
+# enable mixup
+train_pipeline = [
+    *pre_transform, *mosaic_affine_pipeline,
+    dict(
+        type='YOLOv5MixUp',
+        prob=mixup_prob,
+        pre_transform=[*pre_transform, *mosaic_affine_pipeline]),
+    dict(
+        type='mmdet.Albu',
+        transforms=albu_train_transforms,
+        bbox_params=dict(
+            type='BboxParams',
+            format='pascal_voc',
+            label_fields=['gt_bboxes_labels', 'gt_ignore_flags']),
+        keymap={
+            'img': 'image',
+            'gt_bboxes': 'bboxes'
+        }),
+    dict(type='YOLOv5HSVRandomAug'),
+    dict(type='mmdet.RandomFlip', prob=0.5),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                   'flip_direction'))
+]
+
+train_dataloader = dict(
+    batch_size=train_batch_size_per_gpu,
+    dataset=dict(dataset=dict(pipeline=train_pipeline)))
+
+val_dataloader = dict(batch_size=train_batch_size_per_gpu)
+test_dataloader = dict(batch_size=train_batch_size_per_gpu)
+optim_wrapper = dict(optimizer=dict(lr=base_lr))
+default_hooks = dict(param_scheduler=dict(lr_factor=lr_factor))
diff --git a/mmdetection_practice/third_party/mmyolo/projects/misc/ionogram_detection/yolov5/yolov5_s-v61_fast_1xb32-100e_ionogram_mosaic.py b/mmdetection_practice/third_party/mmyolo/projects/misc/ionogram_detection/yolov5/yolov5_s-v61_fast_1xb32-100e_ionogram_mosaic.py
new file mode 100644
index 0000000..1252ebf
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/projects/misc/ionogram_detection/yolov5/yolov5_s-v61_fast_1xb32-100e_ionogram_mosaic.py
@@ -0,0 +1,35 @@
+_base_ = './yolov5_s-v61_fast_1xb96-100e_ionogram.py'
+
+# ======================= Modified parameters =====================
+# -----data related-----
+train_batch_size_per_gpu = 32
+
+# -----train val related-----
+base_lr = _base_.base_lr * train_batch_size_per_gpu \
+    / _base_.train_batch_size_per_gpu / 2
+train_pipeline = [
+    dict(type='LoadImageFromFile'),
+    dict(type='LoadAnnotations', with_bbox=True),
+    dict(
+        type='Mosaic',
+        img_scale=(640, 640),
+        pad_val=114.0,
+        pre_transform=[
+            dict(type='LoadImageFromFile'),
+            dict(type='LoadAnnotations', with_bbox=True)
+        ]),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape'))
+]
+
+# ===================== Unmodified in most cases ==================
+train_dataloader = dict(
+    batch_size=train_batch_size_per_gpu,
+    dataset=dict(dataset=dict(pipeline=train_pipeline)))
+
+val_dataloader = dict(batch_size=train_batch_size_per_gpu)
+
+test_dataloader = dict(batch_size=train_batch_size_per_gpu)
+
+optim_wrapper = dict(optimizer=dict(lr=base_lr))
diff --git a/mmdetection_practice/third_party/mmyolo/projects/misc/ionogram_detection/yolov5/yolov5_s-v61_fast_1xb96-100e_ionogram.py b/mmdetection_practice/third_party/mmyolo/projects/misc/ionogram_detection/yolov5/yolov5_s-v61_fast_1xb96-100e_ionogram.py
new file mode 100644
index 0000000..dbe1305
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/projects/misc/ionogram_detection/yolov5/yolov5_s-v61_fast_1xb96-100e_ionogram.py
@@ -0,0 +1,108 @@
+_base_ = 'mmyolo::yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py'
+
+# ======================= Modified parameters =====================
+# -----data related-----
+data_root = './Iono4311/'
+train_ann_file = 'annotations/train.json'
+train_data_prefix = 'train_images/'
+val_ann_file = 'annotations/val.json'
+val_data_prefix = 'val_images/'
+test_ann_file = 'annotations/test.json'
+test_data_prefix = 'test_images/'
+class_name = ('E', 'Es-l', 'Es-c', 'F1', 'F2', 'Spread-F')
+num_classes = len(class_name)
+metainfo = dict(
+    classes=class_name,
+    palette=[(250, 165, 30), (120, 69, 125), (53, 125, 34), (0, 11, 123),
+             (130, 20, 12), (120, 121, 80)])
+# Batch size of a single GPU during training
+train_batch_size_per_gpu = 96
+# Worker to pre-fetch data for each single GPU during training
+train_num_workers = 8
+
+# -----model related-----
+# Basic size of multi-scale prior box
+anchors = [[[8, 6], [24, 4], [19, 9]], [[22, 19], [17, 49], [29, 45]],
+           [[44, 66], [96, 76], [126, 59]]]
+
+# -----train val related-----
+# base_lr_default * (your_bs / default_bs (8x16)) for SGD
+base_lr = _base_.base_lr * train_batch_size_per_gpu / (8 * 16)
+max_epochs = 100
+load_from = 'https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth'  # noqa
+
+# default_hooks
+save_epoch_intervals = 10
+logger_interval = 20
+max_keep_ckpts = 1
+
+# train_cfg
+val_interval = 2
+val_begin = 20
+
+tta_model = None
+tta_pipeline = None
+
+visualizer = dict(
+    vis_backends=[dict(type='LocalVisBackend'),
+                  dict(type='WandbVisBackend')])
+
+# ===================== Unmodified in most cases ==================
+model = dict(
+    bbox_head=dict(
+        head_module=dict(num_classes=num_classes),
+        prior_generator=dict(base_sizes=anchors),
+        loss_cls=dict(loss_weight=0.5 *
+                      (num_classes / 80 * 3 / _base_.num_det_layers))))
+
+train_dataloader = dict(
+    batch_size=train_batch_size_per_gpu,
+    num_workers=train_num_workers,
+    dataset=dict(
+        _delete_=True,
+        type='RepeatDataset',
+        times=1,
+        dataset=dict(
+            type=_base_.dataset_type,
+            data_root=data_root,
+            metainfo=metainfo,
+            ann_file=train_ann_file,
+            data_prefix=dict(img=train_data_prefix),
+            filter_cfg=dict(filter_empty_gt=False, min_size=32),
+            pipeline=_base_.train_pipeline)))
+
+val_dataloader = dict(
+    batch_size=train_batch_size_per_gpu,
+    num_workers=train_num_workers,
+    dataset=dict(
+        metainfo=metainfo,
+        data_root=data_root,
+        ann_file=val_ann_file,
+        data_prefix=dict(img=val_data_prefix)))
+
+test_dataloader = dict(
+    batch_size=train_batch_size_per_gpu,
+    num_workers=train_num_workers,
+    dataset=dict(
+        metainfo=metainfo,
+        data_root=data_root,
+        ann_file=test_ann_file,
+        data_prefix=dict(img=test_data_prefix)))
+
+optim_wrapper = dict(optimizer=dict(lr=base_lr))
+
+default_hooks = dict(
+    checkpoint=dict(
+        type='CheckpointHook',
+        save_param_scheduler=None,  # for yolov5
+        interval=save_epoch_intervals,
+        max_keep_ckpts=max_keep_ckpts,
+        save_best='auto'),
+    param_scheduler=dict(max_epochs=max_epochs),
+    logger=dict(type='LoggerHook', interval=logger_interval))
+
+val_evaluator = dict(ann_file=data_root + val_ann_file)
+test_evaluator = dict(ann_file=data_root + test_ann_file)
+
+train_cfg = dict(
+    max_epochs=max_epochs, val_begin=val_begin, val_interval=val_interval)
diff --git a/mmdetection_practice/third_party/mmyolo/projects/misc/ionogram_detection/yolov5/yolov5_s-v61_fast_1xb96-100e_ionogram_aug0.py b/mmdetection_practice/third_party/mmyolo/projects/misc/ionogram_detection/yolov5/yolov5_s-v61_fast_1xb96-100e_ionogram_aug0.py
new file mode 100644
index 0000000..39ffb6b
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/projects/misc/ionogram_detection/yolov5/yolov5_s-v61_fast_1xb96-100e_ionogram_aug0.py
@@ -0,0 +1,21 @@
+_base_ = './yolov5_s-v61_fast_1xb96-100e_ionogram.py'
+
+# ======================= Modified parameters =====================
+# -----train val related-----
+train_pipeline = [
+    dict(type='LoadImageFromFile'),
+    dict(type='LoadAnnotations', with_bbox=True),
+    dict(type='YOLOv5KeepRatioResize', scale=(640, 640)),
+    dict(
+        type='LetterResize',
+        scale=(640, 640),
+        allow_scale_up=False,
+        pad_val=dict(img=114)),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
+                   'scale_factor', 'pad_param'))
+]
+
+# ===================== Unmodified in most cases ==================
+train_dataloader = dict(dataset=dict(dataset=dict(pipeline=train_pipeline)))
diff --git a/mmdetection_practice/third_party/mmyolo/projects/misc/ionogram_detection/yolov5/yolov5_s-v61_fast_1xb96-100e_ionogram_mosaic_affine.py b/mmdetection_practice/third_party/mmyolo/projects/misc/ionogram_detection/yolov5/yolov5_s-v61_fast_1xb96-100e_ionogram_mosaic_affine.py
new file mode 100644
index 0000000..10c114c
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/projects/misc/ionogram_detection/yolov5/yolov5_s-v61_fast_1xb96-100e_ionogram_mosaic_affine.py
@@ -0,0 +1,29 @@
+_base_ = './yolov5_s-v61_fast_1xb96-100e_ionogram.py'
+
+# ======================= Modified parameters =====================
+# -----train val related-----
+train_pipeline = [
+    dict(type='LoadImageFromFile'),
+    dict(type='LoadAnnotations', with_bbox=True),
+    dict(
+        type='Mosaic',
+        img_scale=(640, 640),
+        pad_val=114.0,
+        pre_transform=[
+            dict(type='LoadImageFromFile'),
+            dict(type='LoadAnnotations', with_bbox=True)
+        ]),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        scaling_ratio_range=(0.5, 1.5),
+        border=(-320, -320),
+        border_val=(114, 114, 114)),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape'))
+]
+
+# ===================== Unmodified in most cases ==================
+train_dataloader = dict(dataset=dict(dataset=dict(pipeline=train_pipeline)))
diff --git a/mmdetection_practice/third_party/mmyolo/projects/misc/ionogram_detection/yolov5/yolov5_s-v61_fast_1xb96-100e_ionogram_mosaic_affine_albu_hsv.py b/mmdetection_practice/third_party/mmyolo/projects/misc/ionogram_detection/yolov5/yolov5_s-v61_fast_1xb96-100e_ionogram_mosaic_affine_albu_hsv.py
new file mode 100644
index 0000000..df8f6a2
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/projects/misc/ionogram_detection/yolov5/yolov5_s-v61_fast_1xb96-100e_ionogram_mosaic_affine_albu_hsv.py
@@ -0,0 +1,44 @@
+_base_ = './yolov5_s-v61_fast_1xb96-100e_ionogram.py'
+
+# ======================= Modified parameters =====================
+# -----train val related-----
+train_pipeline = [
+    dict(type='LoadImageFromFile'),
+    dict(type='LoadAnnotations', with_bbox=True),
+    dict(
+        type='Mosaic',
+        img_scale=(640, 640),
+        pad_val=114.0,
+        pre_transform=[
+            dict(type='LoadImageFromFile'),
+            dict(type='LoadAnnotations', with_bbox=True)
+        ]),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        scaling_ratio_range=(0.5, 1.5),
+        border=(-320, -320),
+        border_val=(114, 114, 114)),
+    dict(
+        type='mmdet.Albu',
+        transforms=[
+            dict(type='Blur', p=0.01),
+            dict(type='MedianBlur', p=0.01),
+            dict(type='ToGray', p=0.01),
+            dict(type='CLAHE', p=0.01)
+        ],
+        bbox_params=dict(
+            type='BboxParams',
+            format='pascal_voc',
+            label_fields=['gt_bboxes_labels', 'gt_ignore_flags']),
+        keymap=dict(img='image', gt_bboxes='bboxes')),
+    dict(type='YOLOv5HSVRandomAug'),
+    # dict(type='mmdet.RandomFlip', prob=0.5),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape'))
+]
+
+# ===================== Unmodified in most cases ==================
+train_dataloader = dict(dataset=dict(dataset=dict(pipeline=train_pipeline)))
diff --git a/mmdetection_practice/third_party/mmyolo/projects/misc/ionogram_detection/yolov5/yolov5_s-v61_fast_1xb96-200e_ionogram_pre0.py b/mmdetection_practice/third_party/mmyolo/projects/misc/ionogram_detection/yolov5/yolov5_s-v61_fast_1xb96-200e_ionogram_pre0.py
new file mode 100644
index 0000000..9f62fac
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/projects/misc/ionogram_detection/yolov5/yolov5_s-v61_fast_1xb96-200e_ionogram_pre0.py
@@ -0,0 +1,17 @@
+_base_ = './yolov5_s-v61_fast_1xb96-100e_ionogram.py'
+
+# ======================= Modified parameters =====================
+# -----train val related-----
+base_lr = _base_.base_lr * 4
+max_epochs = 200
+load_from = None
+logger_interval = 50
+
+train_cfg = dict(max_epochs=max_epochs, )
+
+# ===================== Unmodified in most cases ==================
+optim_wrapper = dict(optimizer=dict(lr=base_lr))
+
+default_hooks = dict(
+    param_scheduler=dict(max_epochs=max_epochs),
+    logger=dict(type='LoggerHook', interval=logger_interval))
diff --git a/mmdetection_practice/third_party/mmyolo/projects/misc/ionogram_detection/yolov6/yolov6_l_fast_1xb32-100e_ionogram.py b/mmdetection_practice/third_party/mmyolo/projects/misc/ionogram_detection/yolov6/yolov6_l_fast_1xb32-100e_ionogram.py
new file mode 100644
index 0000000..dc5918d
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/projects/misc/ionogram_detection/yolov6/yolov6_l_fast_1xb32-100e_ionogram.py
@@ -0,0 +1,29 @@
+_base_ = './yolov6_m_fast_1xb32-100e_ionogram.py'
+
+# ======================= Modified parameters =======================
+# -----model related-----
+deepen_factor = 1
+widen_factor = 1
+
+# -----train val related-----
+load_from = 'https://download.openmmlab.com/mmyolo/v0/yolov6/yolov6_l_syncbn_fast_8xb32-300e_coco/yolov6_l_syncbn_fast_8xb32-300e_coco_20221109_183156-91e3c447.pth'  # noqa
+
+# ====================== Unmodified in most cases ===================
+model = dict(
+    backbone=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+        hidden_ratio=1. / 2,
+        block_cfg=dict(
+            type='ConvWrapper',
+            norm_cfg=dict(type='BN', momentum=0.03, eps=0.001)),
+        act_cfg=dict(type='SiLU', inplace=True)),
+    neck=dict(
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+        hidden_ratio=1. / 2,
+        block_cfg=dict(
+            type='ConvWrapper',
+            norm_cfg=dict(type='BN', momentum=0.03, eps=0.001)),
+        block_act_cfg=dict(type='SiLU', inplace=True)),
+    bbox_head=dict(head_module=dict(widen_factor=widen_factor)))
diff --git a/mmdetection_practice/third_party/mmyolo/projects/misc/ionogram_detection/yolov6/yolov6_m_fast_1xb32-100e_ionogram.py b/mmdetection_practice/third_party/mmyolo/projects/misc/ionogram_detection/yolov6/yolov6_m_fast_1xb32-100e_ionogram.py
new file mode 100644
index 0000000..00ea8ff
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/projects/misc/ionogram_detection/yolov6/yolov6_m_fast_1xb32-100e_ionogram.py
@@ -0,0 +1,63 @@
+_base_ = './yolov6_s_fast_1xb32-100e_ionogram.py'
+
+# ======================= Modified parameters =======================
+# -----model related-----
+# The scaling factor that controls the depth of the network structure
+deepen_factor = 0.6
+# The scaling factor that controls the width of the network structure
+widen_factor = 0.75
+
+# -----train val related-----
+affine_scale = 0.9  # YOLOv5RandomAffine scaling ratio
+load_from = 'https://download.openmmlab.com/mmyolo/v0/yolov6/yolov6_m_syncbn_fast_8xb32-300e_coco/yolov6_m_syncbn_fast_8xb32-300e_coco_20221109_182658-85bda3f4.pth'  # noqa
+
+# ====================== Unmodified in most cases ===================
+model = dict(
+    backbone=dict(
+        type='YOLOv6CSPBep',
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+        hidden_ratio=2. / 3,
+        block_cfg=dict(type='RepVGGBlock'),
+        act_cfg=dict(type='ReLU', inplace=True)),
+    neck=dict(
+        type='YOLOv6CSPRepPAFPN',
+        deepen_factor=deepen_factor,
+        widen_factor=widen_factor,
+        block_cfg=dict(type='RepVGGBlock'),
+        hidden_ratio=2. / 3,
+        block_act_cfg=dict(type='ReLU', inplace=True)),
+    bbox_head=dict(
+        type='YOLOv6Head', head_module=dict(widen_factor=widen_factor)))
+
+mosaic_affine_pipeline = [
+    dict(
+        type='Mosaic',
+        img_scale=_base_.img_scale,
+        pad_val=114.0,
+        pre_transform=_base_.pre_transform),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        scaling_ratio_range=(1 - affine_scale, 1 + affine_scale),
+        # img_scale is (width, height)
+        border=(-_base_.img_scale[0] // 2, -_base_.img_scale[1] // 2),
+        border_val=(114, 114, 114))
+]
+
+train_pipeline = [
+    *_base_.pre_transform, *mosaic_affine_pipeline,
+    dict(
+        type='YOLOv5MixUp',
+        prob=0.1,
+        pre_transform=[*_base_.pre_transform, *mosaic_affine_pipeline]),
+    dict(type='YOLOv5HSVRandomAug'),
+    dict(type='mmdet.RandomFlip', prob=0.5),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                   'flip_direction'))
+]
+
+train_dataloader = dict(dataset=dict(dataset=dict(pipeline=train_pipeline)))
diff --git a/mmdetection_practice/third_party/mmyolo/projects/misc/ionogram_detection/yolov6/yolov6_s_fast_1xb32-100e_ionogram.py b/mmdetection_practice/third_party/mmyolo/projects/misc/ionogram_detection/yolov6/yolov6_s_fast_1xb32-100e_ionogram.py
new file mode 100644
index 0000000..c9748b4
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/projects/misc/ionogram_detection/yolov6/yolov6_s_fast_1xb32-100e_ionogram.py
@@ -0,0 +1,108 @@
+_base_ = 'mmyolo::yolov6/yolov6_s_syncbn_fast_8xb32-400e_coco.py'
+
+# ======================= Modified parameters =====================
+# -----data related-----
+data_root = './Iono4311/'
+train_ann_file = 'annotations/train.json'
+train_data_prefix = 'train_images/'
+val_ann_file = 'annotations/val.json'
+val_data_prefix = 'val_images/'
+test_ann_file = 'annotations/test.json'
+test_data_prefix = 'test_images/'
+
+class_name = ('E', 'Es-l', 'Es-c', 'F1', 'F2', 'Spread-F')
+num_classes = len(class_name)
+metainfo = dict(
+    classes=class_name,
+    palette=[(250, 165, 30), (120, 69, 125), (53, 125, 34), (0, 11, 123),
+             (130, 20, 12), (120, 121, 80)])
+
+train_batch_size_per_gpu = 32
+train_num_workers = 8
+
+tta_model = None
+tta_pipeline = None
+
+# -----train val related-----
+load_from = 'https://download.openmmlab.com/mmyolo/v0/yolov6/yolov6_s_syncbn_fast_8xb32-400e_coco/yolov6_s_syncbn_fast_8xb32-400e_coco_20221102_203035-932e1d91.pth'  # noqa
+#  base_lr_default * (your_bs 32 / default_bs (8 x 32))
+base_lr = _base_.base_lr * train_batch_size_per_gpu / (8 * 32)
+max_epochs = 100
+save_epoch_intervals = 10
+val_begin = 20
+max_keep_ckpts = 1
+log_interval = 50
+visualizer = dict(
+    vis_backends=[dict(type='LocalVisBackend'),
+                  dict(type='WandbVisBackend')])
+
+# ==================== Unmodified in most cases ===================
+train_cfg = dict(
+    max_epochs=max_epochs,
+    val_begin=val_begin,
+    val_interval=save_epoch_intervals,
+    dynamic_intervals=None)
+
+model = dict(
+    bbox_head=dict(head_module=dict(num_classes=num_classes)),
+    train_cfg=dict(
+        initial_assigner=dict(num_classes=num_classes),
+        assigner=dict(num_classes=num_classes)))
+
+train_dataloader = dict(
+    batch_size=train_batch_size_per_gpu,
+    num_workers=train_num_workers,
+    dataset=dict(
+        _delete_=True,
+        type='RepeatDataset',
+        times=1,
+        dataset=dict(
+            type=_base_.dataset_type,
+            data_root=data_root,
+            metainfo=metainfo,
+            ann_file=train_ann_file,
+            data_prefix=dict(img=train_data_prefix),
+            filter_cfg=dict(filter_empty_gt=False, min_size=32),
+            pipeline=_base_.train_pipeline)))
+
+val_dataloader = dict(
+    dataset=dict(
+        metainfo=metainfo,
+        data_root=data_root,
+        ann_file=val_ann_file,
+        data_prefix=dict(img=val_data_prefix)))
+
+test_dataloader = dict(
+    dataset=dict(
+        metainfo=metainfo,
+        data_root=data_root,
+        ann_file=test_ann_file,
+        data_prefix=dict(img=test_data_prefix)))
+
+val_evaluator = dict(ann_file=data_root + val_data_prefix)
+test_evaluator = dict(ann_file=data_root + test_data_prefix)
+
+optim_wrapper = dict(optimizer=dict(lr=base_lr))
+
+default_hooks = dict(
+    checkpoint=dict(
+        type='CheckpointHook',
+        interval=save_epoch_intervals,
+        max_keep_ckpts=max_keep_ckpts,
+        save_best='auto'),
+    param_scheduler=dict(max_epochs=max_epochs),
+    logger=dict(type='LoggerHook', interval=log_interval))
+
+custom_hooks = [
+    dict(
+        type='EMAHook',
+        ema_type='ExpMomentumEMA',
+        momentum=0.0001,
+        update_buffers=True,
+        strict_load=False,
+        priority=49),
+    dict(
+        type='mmdet.PipelineSwitchHook',
+        switch_epoch=max_epochs - _base_.num_last_epochs,
+        switch_pipeline=_base_.train_pipeline_stage2)
+]
diff --git a/mmdetection_practice/third_party/mmyolo/projects/misc/ionogram_detection/yolov6/yolov6_s_fast_1xb32-200e_ionogram_pre0.py b/mmdetection_practice/third_party/mmyolo/projects/misc/ionogram_detection/yolov6/yolov6_s_fast_1xb32-200e_ionogram_pre0.py
new file mode 100644
index 0000000..cc38730
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/projects/misc/ionogram_detection/yolov6/yolov6_s_fast_1xb32-200e_ionogram_pre0.py
@@ -0,0 +1,17 @@
+_base_ = './yolov6_s_fast_1xb32-100e_ionogram.py'
+
+# ======================= Modified parameters =====================
+base_lr = _base_.base_lr * 4
+optim_wrapper = dict(optimizer=dict(lr=base_lr))
+max_epochs = 200
+load_from = None
+
+# ==================== Unmodified in most cases ===================
+train_cfg = dict(
+    max_epochs=max_epochs,
+    val_begin=20,
+)
+
+default_hooks = dict(
+    param_scheduler=dict(max_epochs=max_epochs),
+    logger=dict(type='LoggerHook', interval=50))
diff --git a/mmdetection_practice/third_party/mmyolo/projects/misc/ionogram_detection/yolov7/yolov7_l_fast_1xb16-100e_ionogram.py b/mmdetection_practice/third_party/mmyolo/projects/misc/ionogram_detection/yolov7/yolov7_l_fast_1xb16-100e_ionogram.py
new file mode 100644
index 0000000..44d58c1
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/projects/misc/ionogram_detection/yolov7/yolov7_l_fast_1xb16-100e_ionogram.py
@@ -0,0 +1,98 @@
+_base_ = 'mmyolo::yolov7/yolov7_l_syncbn_fast_8x16b-300e_coco.py'
+
+# ======================== Modified parameters ======================
+# -----data related-----
+data_root = './Iono4311/'
+train_ann_file = 'annotations/train.json'
+train_data_prefix = 'train_images/'
+val_ann_file = 'annotations/val.json'
+val_data_prefix = 'val_images/'
+test_ann_file = 'annotations/test.json'
+test_data_prefix = 'test_images/'
+
+class_name = ('E', 'Es-l', 'Es-c', 'F1', 'F2', 'Spread-F')
+num_classes = len(class_name)
+metainfo = dict(
+    classes=class_name,
+    palette=[(250, 165, 30), (120, 69, 125), (53, 125, 34), (0, 11, 123),
+             (130, 20, 12), (120, 121, 80)])
+
+train_batch_size_per_gpu = 16
+train_num_workers = 8
+
+# -----model related-----
+anchors = [[[14, 14], [35, 6], [32, 18]], [[32, 45], [28, 97], [52, 80]],
+           [[71, 122], [185, 94], [164, 134]]]
+
+# -----train val related-----
+#  base_lr_default * (your_bs 32 / default_bs (8 x 16))
+base_lr = _base_.base_lr * train_batch_size_per_gpu / (8 * 16)
+load_from = 'https://download.openmmlab.com/mmyolo/v0/yolov7/yolov7_l_syncbn_fast_8x16b-300e_coco/yolov7_l_syncbn_fast_8x16b-300e_coco_20221123_023601-8113c0eb.pth'  # noqa
+
+# default hooks
+save_epoch_intervals = 10
+max_epochs = 100
+max_keep_ckpts = 1
+
+# train_cfg
+val_interval = 2
+val_begin = 20
+
+tta_model = None
+tta_pipeline = None
+
+visualizer = dict(
+    vis_backends=[dict(type='LocalVisBackend'),
+                  dict(type='WandbVisBackend')])
+
+# ===================== Unmodified in most cases ==================
+model = dict(
+    bbox_head=dict(
+        head_module=dict(num_classes=num_classes),
+        prior_generator=dict(base_sizes=anchors),
+        loss_cls=dict(loss_weight=_base_.loss_cls_weight *
+                      (num_classes / 80 * 3 / _base_.num_det_layers))))
+
+train_dataloader = dict(
+    batch_size=train_batch_size_per_gpu,
+    num_workers=train_num_workers,
+    dataset=dict(
+        metainfo=metainfo,
+        data_root=data_root,
+        ann_file=train_ann_file,
+        data_prefix=dict(img=train_data_prefix)))
+
+val_dataloader = dict(
+    batch_size=train_batch_size_per_gpu,
+    num_workers=train_num_workers,
+    dataset=dict(
+        metainfo=metainfo,
+        data_root=data_root,
+        data_prefix=dict(img=val_data_prefix),
+        ann_file=val_ann_file))
+
+test_dataloader = dict(
+    batch_size=train_batch_size_per_gpu,
+    num_workers=train_num_workers,
+    dataset=dict(
+        metainfo=metainfo,
+        data_root=data_root,
+        data_prefix=dict(img=test_data_prefix),
+        ann_file=test_ann_file))
+
+optim_wrapper = dict(
+    optimizer=dict(lr=base_lr, batch_size_per_gpu=train_batch_size_per_gpu))
+
+default_hooks = dict(
+    param_scheduler=dict(max_epochs=max_epochs),
+    checkpoint=dict(
+        interval=save_epoch_intervals, max_keep_ckpts=max_keep_ckpts))
+
+val_evaluator = dict(ann_file=data_root + val_ann_file)
+test_evaluator = dict(ann_file=data_root + test_ann_file)
+
+train_cfg = dict(
+    type='EpochBasedTrainLoop',
+    max_epochs=max_epochs,
+    val_begin=val_begin,
+    val_interval=val_interval)
diff --git a/mmdetection_practice/third_party/mmyolo/projects/misc/ionogram_detection/yolov7/yolov7_tiny_fast_1xb16-100e_ionogram.py b/mmdetection_practice/third_party/mmyolo/projects/misc/ionogram_detection/yolov7/yolov7_tiny_fast_1xb16-100e_ionogram.py
new file mode 100644
index 0000000..9c2d63d
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/projects/misc/ionogram_detection/yolov7/yolov7_tiny_fast_1xb16-100e_ionogram.py
@@ -0,0 +1,101 @@
+_base_ = './yolov7_l_fast_1xb16-100e_ionogram.py'
+
+# ======================== Modified parameters =======================
+# pre-train
+load_from = 'https://download.openmmlab.com/mmyolo/v0/yolov7/yolov7_tiny_syncbn_fast_8x16b-300e_coco/yolov7_tiny_syncbn_fast_8x16b-300e_coco_20221126_102719-0ee5bbdf.pth'  # noqa
+
+# -----model related-----
+# Data augmentation
+max_translate_ratio = 0.1  # YOLOv5RandomAffine
+scaling_ratio_range = (0.5, 1.6)  # YOLOv5RandomAffine
+mixup_prob = 0.05  # YOLOv5MixUp
+randchoice_mosaic_prob = [0.8, 0.2]
+mixup_alpha = 8.0  # YOLOv5MixUp
+mixup_beta = 8.0  # YOLOv5MixUp
+
+# -----train val related-----
+loss_cls_weight = 0.5
+loss_obj_weight = 1.0
+
+lr_factor = 0.01  # Learning rate scaling factor
+
+# ====================== Unmodified in most cases ====================
+num_classes = _base_.num_classes
+num_det_layers = _base_.num_det_layers
+img_scale = _base_.img_scale
+pre_transform = _base_.pre_transform
+model = dict(
+    backbone=dict(
+        arch='Tiny', act_cfg=dict(type='LeakyReLU', negative_slope=0.1)),
+    neck=dict(
+        is_tiny_version=True,
+        in_channels=[128, 256, 512],
+        out_channels=[64, 128, 256],
+        block_cfg=dict(
+            _delete_=True, type='TinyDownSampleBlock', middle_ratio=0.25),
+        act_cfg=dict(type='LeakyReLU', negative_slope=0.1),
+        use_repconv_outs=False),
+    bbox_head=dict(
+        head_module=dict(in_channels=[128, 256, 512]),
+        loss_cls=dict(loss_weight=loss_cls_weight *
+                      (num_classes / 80 * 3 / num_det_layers)),
+        loss_obj=dict(loss_weight=loss_obj_weight *
+                      ((img_scale[0] / 640)**2 * 3 / num_det_layers))))
+
+mosiac4_pipeline = [
+    dict(
+        type='Mosaic',
+        img_scale=img_scale,
+        pad_val=114.0,
+        pre_transform=pre_transform),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        max_translate_ratio=max_translate_ratio,  # change
+        scaling_ratio_range=scaling_ratio_range,  # change
+        # img_scale is (width, height)
+        border=(-img_scale[0] // 2, -img_scale[1] // 2),
+        border_val=(114, 114, 114)),
+]
+
+mosiac9_pipeline = [
+    dict(
+        type='Mosaic9',
+        img_scale=img_scale,
+        pad_val=114.0,
+        pre_transform=pre_transform),
+    dict(
+        type='YOLOv5RandomAffine',
+        max_rotate_degree=0.0,
+        max_shear_degree=0.0,
+        max_translate_ratio=max_translate_ratio,  # change
+        scaling_ratio_range=scaling_ratio_range,  # change
+        border=(-img_scale[0] // 2, -img_scale[1] // 2),
+        border_val=(114, 114, 114)),
+]
+
+randchoice_mosaic_pipeline = dict(
+    type='RandomChoice',
+    transforms=[mosiac4_pipeline, mosiac9_pipeline],
+    prob=randchoice_mosaic_prob)
+
+train_pipeline = [
+    *pre_transform,
+    randchoice_mosaic_pipeline,
+    dict(
+        type='YOLOv5MixUp',
+        alpha=mixup_alpha,
+        beta=mixup_beta,
+        prob=mixup_prob,  # change
+        pre_transform=[*pre_transform, randchoice_mosaic_pipeline]),
+    dict(type='YOLOv5HSVRandomAug'),
+    dict(type='mmdet.RandomFlip', prob=0.5),
+    dict(
+        type='mmdet.PackDetInputs',
+        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'flip',
+                   'flip_direction'))
+]
+
+train_dataloader = dict(dataset=dict(pipeline=train_pipeline))
+default_hooks = dict(param_scheduler=dict(lr_factor=lr_factor))
diff --git a/mmdetection_practice/third_party/mmyolo/projects/misc/ionogram_detection/yolov7/yolov7_x_fast_1xb16-100e_ionogram.py b/mmdetection_practice/third_party/mmyolo/projects/misc/ionogram_detection/yolov7/yolov7_x_fast_1xb16-100e_ionogram.py
new file mode 100644
index 0000000..606232a
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/projects/misc/ionogram_detection/yolov7/yolov7_x_fast_1xb16-100e_ionogram.py
@@ -0,0 +1,19 @@
+_base_ = './yolov7_l_fast_1xb16-100e_ionogram.py'
+
+# ======================== Modified parameters =======================
+load_from = 'https://download.openmmlab.com/mmyolo/v0/yolov7/yolov7_x_syncbn_fast_8x16b-300e_coco/yolov7_x_syncbn_fast_8x16b-300e_coco_20221124_215331-ef949a68.pth'  # noqa
+
+# ===================== Unmodified in most cases ==================
+model = dict(
+    backbone=dict(arch='X'),
+    neck=dict(
+        in_channels=[640, 1280, 1280],
+        out_channels=[160, 320, 640],
+        block_cfg=dict(
+            type='ELANBlock',
+            middle_ratio=0.4,
+            block_ratio=0.4,
+            num_blocks=3,
+            num_convs_in_block=2),
+        use_repconv_outs=False),
+    bbox_head=dict(head_module=dict(in_channels=[320, 640, 1280])))
diff --git a/mmdetection_practice/third_party/mmyolo/pytest.ini b/mmdetection_practice/third_party/mmyolo/pytest.ini
new file mode 100644
index 0000000..9796e87
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/pytest.ini
@@ -0,0 +1,7 @@
+[pytest]
+addopts = --xdoctest --xdoctest-style=auto
+norecursedirs = .git ignore build __pycache__ data docker docs .eggs
+
+filterwarnings= default
+                ignore:.*No cfgstr given in Cacher constructor or call.*:Warning
+                ignore:.*Define the __nice__ method for.*:Warning
diff --git a/mmdetection_practice/third_party/mmyolo/requirements.txt b/mmdetection_practice/third_party/mmyolo/requirements.txt
new file mode 100644
index 0000000..5f50cbd
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/requirements.txt
@@ -0,0 +1,3 @@
+-r requirements/build.txt
+-r requirements/runtime.txt
+-r requirements/tests.txt
diff --git a/mmdetection_practice/third_party/mmyolo/requirements/albu.txt b/mmdetection_practice/third_party/mmyolo/requirements/albu.txt
new file mode 100644
index 0000000..2957391
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/requirements/albu.txt
@@ -0,0 +1 @@
+albumentations --no-binary qudida,albumentations
diff --git a/mmdetection_practice/third_party/mmyolo/requirements/build.txt b/mmdetection_practice/third_party/mmyolo/requirements/build.txt
new file mode 100644
index 0000000..c96c69a
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/requirements/build.txt
@@ -0,0 +1,3 @@
+# These must be installed before building mmyolo
+cython
+numpy
diff --git a/mmdetection_practice/third_party/mmyolo/requirements/docs.txt b/mmdetection_practice/third_party/mmyolo/requirements/docs.txt
new file mode 100644
index 0000000..a93a376
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/requirements/docs.txt
@@ -0,0 +1,13 @@
+docutils==0.16.0
+mmcv>=2.0.0rc4,<=2.1.0
+mmdet>=3.0.0
+mmengine>=0.7.1
+myst-parser
+-e git+https://github.com/open-mmlab/pytorch_sphinx_theme.git#egg=pytorch_sphinx_theme
+sphinx==4.0.2
+sphinx-copybutton
+sphinx_markdown_tables
+sphinx_rtd_theme==0.5.2
+torch
+torchvision
+urllib3<2.0.0
diff --git a/mmdetection_practice/third_party/mmyolo/requirements/mminstall.txt b/mmdetection_practice/third_party/mmyolo/requirements/mminstall.txt
new file mode 100644
index 0000000..843738f
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/requirements/mminstall.txt
@@ -0,0 +1,3 @@
+mmcv>=2.0.0rc4,<=2.1.0
+mmdet>=3.0.0
+mmengine>=0.7.1
diff --git a/mmdetection_practice/third_party/mmyolo/requirements/mmpose.txt b/mmdetection_practice/third_party/mmyolo/requirements/mmpose.txt
new file mode 100644
index 0000000..8e4726e
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/requirements/mmpose.txt
@@ -0,0 +1 @@
+mmpose>=1.0.0
diff --git a/mmdetection_practice/third_party/mmyolo/requirements/mmrotate.txt b/mmdetection_practice/third_party/mmyolo/requirements/mmrotate.txt
new file mode 100644
index 0000000..15f05d3
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/requirements/mmrotate.txt
@@ -0,0 +1 @@
+mmrotate>=1.0.0rc1
diff --git a/mmdetection_practice/third_party/mmyolo/requirements/runtime.txt b/mmdetection_practice/third_party/mmyolo/requirements/runtime.txt
new file mode 100644
index 0000000..794a9ca
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/requirements/runtime.txt
@@ -0,0 +1,2 @@
+numpy
+prettytable
diff --git a/mmdetection_practice/third_party/mmyolo/requirements/sahi.txt b/mmdetection_practice/third_party/mmyolo/requirements/sahi.txt
new file mode 100644
index 0000000..0e7b7b8
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/requirements/sahi.txt
@@ -0,0 +1 @@
+sahi>=0.11.4
diff --git a/mmdetection_practice/third_party/mmyolo/requirements/tests.txt b/mmdetection_practice/third_party/mmyolo/requirements/tests.txt
new file mode 100644
index 0000000..285b3f3
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/requirements/tests.txt
@@ -0,0 +1,17 @@
+flake8
+interrogate
+isort==4.3.21
+# Note: used for kwarray.group_items, this may be ported to mmcv in the future.
+kwarray
+memory_profiler
+mmcls>=1.0.0rc4
+mmpose>=1.0.0
+mmrazor>=1.0.0rc2
+mmrotate>=1.0.0rc1
+parameterized
+protobuf<=3.20.1
+psutil
+pytest
+ubelt
+xdoctest>=0.10.0
+yapf
diff --git a/mmdetection_practice/third_party/mmyolo/resources/mmyolo-logo.png b/mmdetection_practice/third_party/mmyolo/resources/mmyolo-logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..41318aec92d86749d327bc5f9b9c689632ffc735
GIT binary patch
literal 30145
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
Gp$PzrcXhV_

literal 0
HcmV?d00001

diff --git a/mmdetection_practice/third_party/mmyolo/resources/qq_group_qrcode.jpg b/mmdetection_practice/third_party/mmyolo/resources/qq_group_qrcode.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..95c4bd1b56367798b632133112e6392ef637debf
GIT binary patch
literal 207584
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%0A^kCKq${ORQ&0TL^jPuYFMTVIiNH$HN`AA06c9
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%0D{w;;~&NKhnG3EQ?n!pR>Doe>SMi@bC8P
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
aEwt_3e}*fjNnsam%mm$%GB9i7Zvp`Q^IjVO

literal 0
HcmV?d00001

diff --git a/mmdetection_practice/third_party/mmyolo/resources/zhihu_qrcode.jpg b/mmdetection_practice/third_party/mmyolo/resources/zhihu_qrcode.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..c745fb027f06564d41794e9a40069b06c34e2bb5
GIT binary patch
literal 397245
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%0DelUO2zSHN0vrfzGI{HD9^@`92
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

literal 0
HcmV?d00001

diff --git a/mmdetection_practice/third_party/mmyolo/setup.cfg b/mmdetection_practice/third_party/mmyolo/setup.cfg
new file mode 100644
index 0000000..d30673d
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/setup.cfg
@@ -0,0 +1,21 @@
+[isort]
+line_length = 79
+multi_line_output = 0
+extra_standard_library = setuptools
+known_first_party = mmyolo
+known_third_party = PIL,asynctest,cityscapesscripts,cv2,gather_models,matplotlib,mmcv,numpy,onnx,onnxruntime,pycocotools,pytest,parameterized,pytorch_sphinx_theme,requests,scipy,seaborn,six,terminaltables,torch,ts,yaml,mmengine,mmdet,mmdeploy
+no_lines_before = STDLIB,LOCALFOLDER
+default_section = THIRDPARTY
+
+[yapf]
+BASED_ON_STYLE = pep8
+BLANK_LINE_BEFORE_NESTED_CLASS_OR_DEF = true
+SPLIT_BEFORE_EXPRESSION_AFTER_OPENING_PAREN = true
+
+# ignore-words-list needs to be lowercase format. For example, if we want to
+# ignore word "BA", then we need to append "ba" to ignore-words-list rather
+# than "BA"
+[codespell]
+skip = *.ipynb
+quiet-level = 3
+ignore-words-list = patten,nd,ty,mot,hist,formating,winn,gool,datas,wan,confids,tood,ba,warmup,elease,dota
diff --git a/mmdetection_practice/third_party/mmyolo/setup.py b/mmdetection_practice/third_party/mmyolo/setup.py
new file mode 100755
index 0000000..f37c897
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/setup.py
@@ -0,0 +1,191 @@
+#!/usr/bin/env python
+# Copyright (c) OpenMMLab. All rights reserved.
+import os
+import os.path as osp
+import platform
+import shutil
+import sys
+import warnings
+from setuptools import find_packages, setup
+
+from torch.utils.cpp_extension import BuildExtension
+
+
+def readme():
+    with open('README.md', encoding='utf-8') as f:
+        content = f.read()
+    return content
+
+
+version_file = 'mmyolo/version.py'
+
+
+def get_version():
+    with open(version_file) as f:
+        exec(compile(f.read(), version_file, 'exec'))
+    return locals()['__version__']
+
+
+def parse_requirements(fname='requirements.txt', with_version=True):
+    """Parse the package dependencies listed in a requirements file but strips
+    specific versioning information.
+
+    Args:
+        fname (str): path to requirements file
+        with_version (bool, default=False): if True include version specs
+
+    Returns:
+        List[str]: list of requirements items
+
+    CommandLine:
+        python -c "import setup; print(setup.parse_requirements())"
+    """
+    import re
+    import sys
+    from os.path import exists
+    require_fpath = fname
+
+    def parse_line(line):
+        """Parse information from a line in a requirements text file."""
+        if line.startswith('-r '):
+            # Allow specifying requirements in other files
+            target = line.split(' ')[1]
+            for info in parse_require_file(target):
+                yield info
+        else:
+            info = {'line': line}
+            if line.startswith('-e '):
+                info['package'] = line.split('#egg=')[1]
+            elif '@git+' in line:
+                info['package'] = line
+            else:
+                # Remove versioning from the package
+                pat = '(' + '|'.join(['>=', '==', '>']) + ')'
+                parts = re.split(pat, line, maxsplit=1)
+                parts = [p.strip() for p in parts]
+
+                info['package'] = parts[0]
+                if len(parts) > 1:
+                    op, rest = parts[1:]
+                    if ';' in rest:
+                        # Handle platform specific dependencies
+                        # http://setuptools.readthedocs.io/en/latest/setuptools.html#declaring-platform-specific-dependencies
+                        version, platform_deps = map(str.strip,
+                                                     rest.split(';'))
+                        info['platform_deps'] = platform_deps
+                    else:
+                        version = rest  # NOQA
+                    info['version'] = (op, version)
+            yield info
+
+    def parse_require_file(fpath):
+        with open(fpath) as f:
+            for line in f.readlines():
+                line = line.strip()
+                if line and not line.startswith('#'):
+                    yield from parse_line(line)
+
+    def gen_packages_items():
+        if exists(require_fpath):
+            for info in parse_require_file(require_fpath):
+                parts = [info['package']]
+                if with_version and 'version' in info:
+                    parts.extend(info['version'])
+                if not sys.version.startswith('3.4'):
+                    # apparently package_deps are broken in 3.4
+                    platform_deps = info.get('platform_deps')
+                    if platform_deps is not None:
+                        parts.append(';' + platform_deps)
+                item = ''.join(parts)
+                yield item
+
+    packages = list(gen_packages_items())
+    return packages
+
+
+def add_mim_extension():
+    """Add extra files that are required to support MIM into the package.
+
+    These files will be added by creating a symlink to the originals if the
+    package is installed in `editable` mode (e.g. pip install -e .), or by
+    copying from the originals otherwise.
+    """
+
+    # parse installment mode
+    if 'develop' in sys.argv:
+        # installed by `pip install -e .`
+        if platform.system() == 'Windows':
+            # set `copy` mode here since symlink fails on Windows.
+            mode = 'copy'
+        else:
+            mode = 'symlink'
+    elif 'sdist' in sys.argv or 'bdist_wheel' in sys.argv:
+        # installed by `pip install .`
+        # or create source distribution by `python setup.py sdist`
+        mode = 'copy'
+    else:
+        return
+
+    filenames = ['tools', 'configs', 'demo', 'model-index.yml']
+    repo_path = osp.dirname(__file__)
+    mim_path = osp.join(repo_path, 'mmyolo', '.mim')
+    os.makedirs(mim_path, exist_ok=True)
+
+    for filename in filenames:
+        if osp.exists(filename):
+            src_path = osp.join(repo_path, filename)
+            tar_path = osp.join(mim_path, filename)
+
+            if osp.isfile(tar_path) or osp.islink(tar_path):
+                os.remove(tar_path)
+            elif osp.isdir(tar_path):
+                shutil.rmtree(tar_path)
+
+            if mode == 'symlink':
+                src_relpath = osp.relpath(src_path, osp.dirname(tar_path))
+                os.symlink(src_relpath, tar_path)
+            elif mode == 'copy':
+                if osp.isfile(src_path):
+                    shutil.copyfile(src_path, tar_path)
+                elif osp.isdir(src_path):
+                    shutil.copytree(src_path, tar_path)
+                else:
+                    warnings.warn(f'Cannot copy file {src_path}.')
+            else:
+                raise ValueError(f'Invalid mode {mode}')
+
+
+if __name__ == '__main__':
+    add_mim_extension()
+    setup(
+        name='mmyolo',
+        version=get_version(),
+        description='OpenMMLab Toolbox of YOLO',
+        long_description=readme(),
+        long_description_content_type='text/markdown',
+        author='MMYOLO Contributors',
+        author_email='openmmlab@gmail.com',
+        keywords='computer vision, object detection',
+        url='https://github.com/open-mmlab/mmyolo',
+        packages=find_packages(exclude=('configs', 'tools', 'demo')),
+        include_package_data=True,
+        classifiers=[
+            'Development Status :: 5 - Production/Stable',
+            'License :: OSI Approved :: Apache Software License',
+            'Operating System :: OS Independent',
+            'Programming Language :: Python :: 3',
+            'Programming Language :: Python :: 3.7',
+            'Programming Language :: Python :: 3.8',
+            'Programming Language :: Python :: 3.9',
+        ],
+        license='GPL License 3.0',
+        install_requires=parse_requirements('requirements/runtime.txt'),
+        extras_require={
+            'all': parse_requirements('requirements.txt'),
+            'tests': parse_requirements('requirements/tests.txt'),
+            'build': parse_requirements('requirements/build.txt'),
+            'mim': parse_requirements('requirements/mminstall.txt'),
+        },
+        ext_modules=[],
+        cmdclass={'build_ext': BuildExtension},
+        zip_safe=False)
diff --git a/mmdetection_practice/third_party/mmyolo/tests/regression/mmyolo.yml b/mmdetection_practice/third_party/mmyolo/tests/regression/mmyolo.yml
new file mode 100644
index 0000000..55eaec3
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tests/regression/mmyolo.yml
@@ -0,0 +1,81 @@
+globals:
+  codebase_dir: ../mmyolo
+  checkpoint_force_download: False
+  images:
+    input_img: &input_img ../mmyolo/demo/demo.jpg
+    test_img: &test_img ./tests/data/tiger.jpeg
+  metric_info: &metric_info
+    box AP: # named after metafile.Results.Metrics
+      metric_key: coco/bbox_mAP # eval OrderedDict key name
+      tolerance: 1 # metric ±n%
+      multi_value: 100
+  convert_image: &convert_image
+    input_img: *input_img
+    test_img: *test_img
+  backend_test: &default_backend_test True
+
+onnxruntime:
+  pipeline_ort_static_fp32: &pipeline_ort_static_fp32
+    convert_image: *convert_image
+    backend_test: False
+    deploy_config: configs/mmyolo/detection_onnxruntime_static.py
+
+  pipeline_ort_dynamic_fp32: &pipeline_ort_dynamic_fp32
+    convert_image: *convert_image
+    backend_test: False
+    deploy_config: configs/mmyolo/detection_onnxruntime_dynamic.py
+
+tensorrt:
+  pipeline_trt_static_fp32: &pipeline_trt_static_fp32_640x640
+    convert_image: *convert_image
+    backend_test: False
+    deploy_config: configs/mmyolo/detection_tensorrt_static-640x640.py
+
+  pipeline_trt_static_fp16: &pipeline_trt_static_fp16_640x640
+    convert_image: *convert_image
+    backend_test: False
+    deploy_config: configs/mmyolo/detection_tensorrt-fp16_static-640x640.py
+
+  pipeline_trt_dynamic_fp32: &pipeline_trt_dynamic_fp32
+    convert_image: *convert_image
+    backend_test: *default_backend_test
+    deploy_config: configs/mmyolo/detection_tensorrt_dynamic-192x192-960x960.py
+
+  pipeline_trt_dynamic_fp16: &pipeline_trt_dynamic_fp16
+    convert_image: *convert_image
+    backend_test: *default_backend_test
+    deploy_config: configs/mmyolo/detection_tensorrt-fp16_dynamic-64x64-1344x1344.py
+
+models:
+  - name: YOLOv5
+    metafile: configs/yolov5/metafile.yml
+    model_configs:
+      - configs/yolov5/yolov5_s-p6-v62_syncbn_fast_8xb16-300e_coco.py
+    pipelines:
+      - *pipeline_ort_dynamic_fp32
+      - *pipeline_trt_dynamic_fp16
+
+  - name: YOLOv6
+    metafile: configs/yolov6/metafile.yml
+    model_configs:
+      - configs/yolov6/yolov6_s_syncbn_fast_8xb32-400e_coco.py
+    pipelines:
+      - *pipeline_ort_dynamic_fp32
+      - *pipeline_trt_dynamic_fp16
+
+  - name: YOLOX
+    metafile: configs/yolox/metafile.yml
+    model_configs:
+      - configs/yolox/yolox_s_8xb8-300e_coco.py
+    pipelines:
+      - *pipeline_ort_dynamic_fp32
+      - *pipeline_trt_dynamic_fp16
+
+
+  - name: RTMDet
+    metafile: configs/rtmdet/metafile.yml
+    model_configs:
+      - configs/rtmdet/rtmdet_s_syncbn_8xb32-300e_coco.py
+    pipelines:
+      - *pipeline_ort_dynamic_fp32
+      - *pipeline_trt_dynamic_fp16
diff --git a/mmdetection_practice/third_party/mmyolo/tests/test_datasets/__init__.py b/mmdetection_practice/third_party/mmyolo/tests/test_datasets/__init__.py
new file mode 100644
index 0000000..ef101fe
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tests/test_datasets/__init__.py
@@ -0,0 +1 @@
+# Copyright (c) OpenMMLab. All rights reserved.
diff --git a/mmdetection_practice/third_party/mmyolo/tests/test_datasets/test_transforms/__init__.py b/mmdetection_practice/third_party/mmyolo/tests/test_datasets/test_transforms/__init__.py
new file mode 100644
index 0000000..ef101fe
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tests/test_datasets/test_transforms/__init__.py
@@ -0,0 +1 @@
+# Copyright (c) OpenMMLab. All rights reserved.
diff --git a/mmdetection_practice/third_party/mmyolo/tests/test_datasets/test_transforms/test_formatting.py b/mmdetection_practice/third_party/mmyolo/tests/test_datasets/test_transforms/test_formatting.py
new file mode 100644
index 0000000..c75475d
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tests/test_datasets/test_transforms/test_formatting.py
@@ -0,0 +1,119 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+import copy
+import os.path as osp
+import unittest
+
+import numpy as np
+from mmdet.structures import DetDataSample
+from mmdet.structures.mask import BitmapMasks
+from mmengine.structures import InstanceData, PixelData
+
+from mmyolo.datasets.transforms import PackDetInputs
+
+
+class TestPackDetInputs(unittest.TestCase):
+
+    def setUp(self):
+        """Setup the model and optimizer which are used in every test method.
+
+        TestCase calls functions in this order: setUp() -> testMethod() ->
+        tearDown() -> cleanUp()
+        """
+        data_prefix = osp.join(osp.dirname(__file__), '../../data')
+        img_path = osp.join(data_prefix, 'color.jpg')
+        rng = np.random.RandomState(0)
+        self.results1 = {
+            'img_id': 1,
+            'img_path': img_path,
+            'ori_shape': (300, 400),
+            'img_shape': (600, 800),
+            'scale_factor': 2.0,
+            'flip': False,
+            'img': rng.rand(300, 400),
+            'gt_seg_map': rng.rand(300, 400),
+            'gt_masks':
+            BitmapMasks(rng.rand(3, 300, 400), height=300, width=400),
+            'gt_bboxes_labels': rng.rand(3, ),
+            'gt_ignore_flags': np.array([0, 0, 1], dtype=bool),
+            'proposals': rng.rand(2, 4),
+            'proposals_scores': rng.rand(2, )
+        }
+        self.results2 = {
+            'img_id': 1,
+            'img_path': img_path,
+            'ori_shape': (300, 400),
+            'img_shape': (600, 800),
+            'scale_factor': 2.0,
+            'flip': False,
+            'img': rng.rand(300, 400),
+            'gt_seg_map': rng.rand(300, 400),
+            'gt_masks':
+            BitmapMasks(rng.rand(3, 300, 400), height=300, width=400),
+            'gt_bboxes_labels': rng.rand(3, ),
+            'proposals': rng.rand(2, 4),
+            'proposals_scores': rng.rand(2, )
+        }
+        self.results3 = {
+            'img_id': 1,
+            'img_path': img_path,
+            'ori_shape': (300, 400),
+            'img_shape': (600, 800),
+            'scale_factor': 2.0,
+            'flip': False,
+            'img': rng.rand(300, 400),
+            'gt_seg_map': rng.rand(300, 400),
+            'gt_masks':
+            BitmapMasks(rng.rand(3, 300, 400), height=300, width=400),
+            'gt_panoptic_seg': rng.rand(1, 300, 400),
+            'gt_bboxes_labels': rng.rand(3, ),
+            'proposals': rng.rand(2, 4),
+            'proposals_scores': rng.rand(2, )
+        }
+        self.meta_keys = ('img_id', 'img_path', 'ori_shape', 'scale_factor',
+                          'flip')
+
+    def test_transform(self):
+        transform = PackDetInputs(meta_keys=self.meta_keys)
+        results = transform(copy.deepcopy(self.results1))
+        self.assertIn('data_samples', results)
+        self.assertIsInstance(results['data_samples'], DetDataSample)
+        self.assertIsInstance(results['data_samples'].gt_instances,
+                              InstanceData)
+        self.assertIsInstance(results['data_samples'].ignored_instances,
+                              InstanceData)
+        self.assertEqual(len(results['data_samples'].gt_instances), 2)
+        self.assertEqual(len(results['data_samples'].ignored_instances), 1)
+        self.assertIsInstance(results['data_samples'].gt_sem_seg, PixelData)
+
+    def test_transform_without_ignore(self):
+        transform = PackDetInputs(meta_keys=self.meta_keys)
+        results = transform(copy.deepcopy(self.results2))
+        self.assertIn('data_samples', results)
+        self.assertIsInstance(results['data_samples'], DetDataSample)
+        self.assertIsInstance(results['data_samples'].gt_instances,
+                              InstanceData)
+        self.assertIsInstance(results['data_samples'].ignored_instances,
+                              InstanceData)
+        self.assertEqual(len(results['data_samples'].gt_instances), 3)
+        self.assertEqual(len(results['data_samples'].ignored_instances), 0)
+        self.assertIsInstance(results['data_samples'].gt_sem_seg, PixelData)
+
+    def test_transform_with_panoptic_seg(self):
+        transform = PackDetInputs(meta_keys=self.meta_keys)
+        results = transform(copy.deepcopy(self.results3))
+        self.assertIn('data_samples', results)
+        self.assertIsInstance(results['data_samples'], DetDataSample)
+        self.assertIsInstance(results['data_samples'].gt_instances,
+                              InstanceData)
+        self.assertIsInstance(results['data_samples'].ignored_instances,
+                              InstanceData)
+        self.assertEqual(len(results['data_samples'].gt_instances), 3)
+        self.assertEqual(len(results['data_samples'].ignored_instances), 0)
+        self.assertIsInstance(results['data_samples'].gt_sem_seg, PixelData)
+        self.assertIsInstance(results['data_samples'].gt_panoptic_seg,
+                              PixelData)
+
+    def test_repr(self):
+        transform = PackDetInputs(meta_keys=self.meta_keys)
+        self.assertEqual(
+            repr(transform), f'PackDetInputs(meta_keys={self.meta_keys})')
diff --git a/mmdetection_practice/third_party/mmyolo/tests/test_datasets/test_transforms/test_mix_img_transforms.py b/mmdetection_practice/third_party/mmyolo/tests/test_datasets/test_transforms/test_mix_img_transforms.py
new file mode 100644
index 0000000..2e9bf20
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tests/test_datasets/test_transforms/test_mix_img_transforms.py
@@ -0,0 +1,416 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+import copy
+import os.path as osp
+import unittest
+
+import numpy as np
+import torch
+from mmdet.structures.bbox import HorizontalBoxes
+from mmdet.structures.mask import BitmapMasks, PolygonMasks
+
+from mmyolo.datasets import YOLOv5CocoDataset
+from mmyolo.datasets.transforms import Mosaic, Mosaic9, YOLOv5MixUp, YOLOXMixUp
+from mmyolo.utils import register_all_modules
+
+register_all_modules()
+
+
+class TestMosaic(unittest.TestCase):
+
+    def setUp(self):
+        """Setup the data info which are used in every test method.
+
+        TestCase calls functions in this order: setUp() -> testMethod() ->
+        tearDown() -> cleanUp()
+        """
+        self.pre_transform = [
+            dict(type='LoadImageFromFile'),
+            dict(type='LoadAnnotations', with_bbox=True)
+        ]
+
+        self.dataset = YOLOv5CocoDataset(
+            data_prefix=dict(
+                img=osp.join(osp.dirname(__file__), '../../data')),
+            ann_file=osp.join(
+                osp.dirname(__file__), '../../data/coco_sample_color.json'),
+            filter_cfg=dict(filter_empty_gt=False, min_size=32),
+            pipeline=[])
+        self.results = {
+            'img':
+            np.random.random((224, 224, 3)),
+            'img_shape': (224, 224),
+            'gt_bboxes_labels':
+            np.array([1, 2, 3], dtype=np.int64),
+            'gt_bboxes':
+            np.array([[10, 10, 20, 20], [20, 20, 40, 40], [40, 40, 80, 80]],
+                     dtype=np.float32),
+            'gt_ignore_flags':
+            np.array([0, 0, 1], dtype=bool),
+            'dataset':
+            self.dataset
+        }
+
+    def test_transform(self):
+        # test assertion for invalid img_scale
+        with self.assertRaises(AssertionError):
+            transform = Mosaic(img_scale=640)
+
+        # test assertion for invalid probability
+        with self.assertRaises(AssertionError):
+            transform = Mosaic(prob=1.5)
+
+        # test assertion for invalid max_cached_images
+        with self.assertRaises(AssertionError):
+            transform = Mosaic(use_cached=True, max_cached_images=1)
+
+        transform = Mosaic(
+            img_scale=(12, 10), pre_transform=self.pre_transform)
+        results = transform(copy.deepcopy(self.results))
+        self.assertTrue(results['img'].shape[:2] == (20, 24))
+        self.assertTrue(results['gt_bboxes_labels'].shape[0] ==
+                        results['gt_bboxes'].shape[0])
+        self.assertTrue(results['gt_bboxes_labels'].dtype == np.int64)
+        self.assertTrue(results['gt_bboxes'].dtype == np.float32)
+        self.assertTrue(results['gt_ignore_flags'].dtype == bool)
+
+    def test_transform_with_no_gt(self):
+        self.results['gt_bboxes'] = np.empty((0, 4), dtype=np.float32)
+        self.results['gt_bboxes_labels'] = np.empty((0, ), dtype=np.int64)
+        self.results['gt_ignore_flags'] = np.empty((0, ), dtype=bool)
+        transform = Mosaic(
+            img_scale=(12, 10), pre_transform=self.pre_transform)
+        results = transform(copy.deepcopy(self.results))
+        self.assertIsInstance(results, dict)
+        self.assertTrue(results['img'].shape[:2] == (20, 24))
+        self.assertTrue(
+            results['gt_bboxes_labels'].shape[0] == results['gt_bboxes'].
+            shape[0] == results['gt_ignore_flags'].shape[0])
+        self.assertTrue(results['gt_bboxes_labels'].dtype == np.int64)
+        self.assertTrue(results['gt_bboxes'].dtype == np.float32)
+        self.assertTrue(results['gt_ignore_flags'].dtype == bool)
+
+    def test_transform_with_box_list(self):
+        transform = Mosaic(
+            img_scale=(12, 10), pre_transform=self.pre_transform)
+        results = copy.deepcopy(self.results)
+        results['gt_bboxes'] = HorizontalBoxes(results['gt_bboxes'])
+        results = transform(results)
+        self.assertTrue(results['img'].shape[:2] == (20, 24))
+        self.assertTrue(results['gt_bboxes_labels'].shape[0] ==
+                        results['gt_bboxes'].shape[0])
+        self.assertTrue(results['gt_bboxes_labels'].dtype == np.int64)
+        self.assertTrue(results['gt_bboxes'].dtype == torch.float32)
+        self.assertTrue(results['gt_ignore_flags'].dtype == bool)
+
+    def test_transform_with_mask(self):
+        rng = np.random.RandomState(0)
+        pre_transform = [
+            dict(type='LoadImageFromFile'),
+            dict(type='LoadAnnotations', with_bbox=True, with_mask=True)
+        ]
+
+        dataset = YOLOv5CocoDataset(
+            data_prefix=dict(
+                img=osp.join(osp.dirname(__file__), '../../data')),
+            ann_file=osp.join(
+                osp.dirname(__file__), '../../data/coco_sample_color.json'),
+            filter_cfg=dict(filter_empty_gt=False, min_size=32),
+            pipeline=[])
+        results = {
+            'img':
+            np.random.random((224, 224, 3)),
+            'img_shape': (224, 224),
+            'gt_bboxes_labels':
+            np.array([1, 2, 3], dtype=np.int64),
+            'gt_bboxes':
+            np.array([[10, 10, 20, 20], [20, 20, 40, 40], [40, 40, 80, 80]],
+                     dtype=np.float32),
+            'gt_ignore_flags':
+            np.array([0, 0, 1], dtype=bool),
+            'gt_masks':
+            PolygonMasks.random(num_masks=3, height=224, width=224, rng=rng),
+            'dataset':
+            dataset
+        }
+        transform = Mosaic(img_scale=(12, 10), pre_transform=pre_transform)
+        results['gt_bboxes'] = HorizontalBoxes(results['gt_bboxes'])
+        results = transform(results)
+        self.assertTrue(results['img'].shape[:2] == (20, 24))
+        self.assertTrue(results['gt_bboxes_labels'].shape[0] ==
+                        results['gt_bboxes'].shape[0])
+        self.assertTrue(results['gt_bboxes_labels'].dtype == np.int64)
+        self.assertTrue(results['gt_bboxes'].dtype == torch.float32)
+        self.assertTrue(results['gt_ignore_flags'].dtype == bool)
+
+
+class TestMosaic9(unittest.TestCase):
+
+    def setUp(self):
+        """Setup the data info which are used in every test method.
+
+        TestCase calls functions in this order: setUp() -> testMethod() ->
+        tearDown() -> cleanUp()
+        """
+        rng = np.random.RandomState(0)
+        self.pre_transform = [
+            dict(type='LoadImageFromFile'),
+            dict(type='LoadAnnotations', with_bbox=True)
+        ]
+
+        self.dataset = YOLOv5CocoDataset(
+            data_prefix=dict(
+                img=osp.join(osp.dirname(__file__), '../../data')),
+            ann_file=osp.join(
+                osp.dirname(__file__), '../../data/coco_sample_color.json'),
+            filter_cfg=dict(filter_empty_gt=False, min_size=32),
+            pipeline=[])
+        self.results = {
+            'img':
+            np.random.random((224, 224, 3)),
+            'img_shape': (224, 224),
+            'gt_bboxes_labels':
+            np.array([1, 2, 3], dtype=np.int64),
+            'gt_bboxes':
+            np.array([[10, 10, 20, 20], [20, 20, 40, 40], [40, 40, 80, 80]],
+                     dtype=np.float32),
+            'gt_ignore_flags':
+            np.array([0, 0, 1], dtype=bool),
+            'gt_masks':
+            BitmapMasks(rng.rand(3, 224, 224), height=224, width=224),
+            'dataset':
+            self.dataset
+        }
+
+    def test_transform(self):
+        # test assertion for invalid img_scale
+        with self.assertRaises(AssertionError):
+            transform = Mosaic9(img_scale=640)
+
+        # test assertion for invalid probability
+        with self.assertRaises(AssertionError):
+            transform = Mosaic9(prob=1.5)
+
+        # test assertion for invalid max_cached_images
+        with self.assertRaises(AssertionError):
+            transform = Mosaic9(use_cached=True, max_cached_images=1)
+
+        transform = Mosaic9(
+            img_scale=(12, 10), pre_transform=self.pre_transform)
+        results = transform(copy.deepcopy(self.results))
+        self.assertTrue(results['img'].shape[:2] == (20, 24))
+        self.assertTrue(results['gt_bboxes_labels'].shape[0] ==
+                        results['gt_bboxes'].shape[0])
+        self.assertTrue(results['gt_bboxes_labels'].dtype == np.int64)
+        self.assertTrue(results['gt_bboxes'].dtype == np.float32)
+        self.assertTrue(results['gt_ignore_flags'].dtype == bool)
+
+    def test_transform_with_no_gt(self):
+        self.results['gt_bboxes'] = np.empty((0, 4), dtype=np.float32)
+        self.results['gt_bboxes_labels'] = np.empty((0, ), dtype=np.int64)
+        self.results['gt_ignore_flags'] = np.empty((0, ), dtype=bool)
+        transform = Mosaic9(
+            img_scale=(12, 10), pre_transform=self.pre_transform)
+        results = transform(copy.deepcopy(self.results))
+        self.assertIsInstance(results, dict)
+        self.assertTrue(results['img'].shape[:2] == (20, 24))
+        self.assertTrue(
+            results['gt_bboxes_labels'].shape[0] == results['gt_bboxes'].
+            shape[0] == results['gt_ignore_flags'].shape[0])
+        self.assertTrue(results['gt_bboxes_labels'].dtype == np.int64)
+        self.assertTrue(results['gt_bboxes'].dtype == np.float32)
+        self.assertTrue(results['gt_ignore_flags'].dtype == bool)
+
+    def test_transform_with_box_list(self):
+        transform = Mosaic9(
+            img_scale=(12, 10), pre_transform=self.pre_transform)
+        results = copy.deepcopy(self.results)
+        results['gt_bboxes'] = HorizontalBoxes(results['gt_bboxes'])
+        results = transform(results)
+        self.assertTrue(results['img'].shape[:2] == (20, 24))
+        self.assertTrue(results['gt_bboxes_labels'].shape[0] ==
+                        results['gt_bboxes'].shape[0])
+        self.assertTrue(results['gt_bboxes_labels'].dtype == np.int64)
+        self.assertTrue(results['gt_bboxes'].dtype == torch.float32)
+        self.assertTrue(results['gt_ignore_flags'].dtype == bool)
+
+
+class TestYOLOv5MixUp(unittest.TestCase):
+
+    def setUp(self):
+        """Setup the data info which are used in every test method.
+
+        TestCase calls functions in this order: setUp() -> testMethod() ->
+        tearDown() -> cleanUp()
+        """
+        self.pre_transform = [
+            dict(type='LoadImageFromFile'),
+            dict(type='LoadAnnotations', with_bbox=True)
+        ]
+        self.dataset = YOLOv5CocoDataset(
+            data_prefix=dict(
+                img=osp.join(osp.dirname(__file__), '../../data')),
+            ann_file=osp.join(
+                osp.dirname(__file__), '../../data/coco_sample_color.json'),
+            filter_cfg=dict(filter_empty_gt=False, min_size=32),
+            pipeline=[])
+
+        self.results = {
+            'img':
+            np.random.random((288, 512, 3)),
+            'img_shape': (288, 512),
+            'gt_bboxes_labels':
+            np.array([1, 2, 3], dtype=np.int64),
+            'gt_bboxes':
+            np.array([[10, 10, 20, 20], [20, 20, 40, 40], [40, 40, 80, 80]],
+                     dtype=np.float32),
+            'gt_ignore_flags':
+            np.array([0, 0, 1], dtype=bool),
+            'dataset':
+            self.dataset
+        }
+
+    def test_transform(self):
+        transform = YOLOv5MixUp(pre_transform=self.pre_transform)
+        results = transform(copy.deepcopy(self.results))
+        self.assertTrue(results['img'].shape[:2] == (288, 512))
+        self.assertTrue(results['gt_bboxes_labels'].shape[0] ==
+                        results['gt_bboxes'].shape[0])
+        self.assertTrue(results['gt_bboxes_labels'].dtype == np.int64)
+        self.assertTrue(results['gt_bboxes'].dtype == np.float32)
+        self.assertTrue(results['gt_ignore_flags'].dtype == bool)
+
+        # test assertion for invalid max_cached_images
+        with self.assertRaises(AssertionError):
+            transform = YOLOv5MixUp(use_cached=True, max_cached_images=1)
+
+    def test_transform_with_box_list(self):
+        results = copy.deepcopy(self.results)
+        results['gt_bboxes'] = HorizontalBoxes(results['gt_bboxes'])
+
+        transform = YOLOv5MixUp(pre_transform=self.pre_transform)
+        results = transform(results)
+        self.assertTrue(results['img'].shape[:2] == (288, 512))
+        self.assertTrue(results['gt_bboxes_labels'].shape[0] ==
+                        results['gt_bboxes'].shape[0])
+        self.assertTrue(results['gt_bboxes_labels'].dtype == np.int64)
+        self.assertTrue(results['gt_bboxes'].dtype == torch.float32)
+        self.assertTrue(results['gt_ignore_flags'].dtype == bool)
+
+    def test_transform_with_mask(self):
+        rng = np.random.RandomState(0)
+        pre_transform = [
+            dict(type='LoadImageFromFile'),
+            dict(type='LoadAnnotations', with_bbox=True, with_mask=True)
+        ]
+        dataset = YOLOv5CocoDataset(
+            data_prefix=dict(
+                img=osp.join(osp.dirname(__file__), '../../data')),
+            ann_file=osp.join(
+                osp.dirname(__file__), '../../data/coco_sample_color.json'),
+            filter_cfg=dict(filter_empty_gt=False, min_size=32),
+            pipeline=[])
+
+        results = {
+            'img':
+            np.random.random((288, 512, 3)),
+            'img_shape': (288, 512),
+            'gt_bboxes_labels':
+            np.array([1, 2, 3], dtype=np.int64),
+            'gt_bboxes':
+            np.array([[10, 10, 20, 20], [20, 20, 40, 40], [40, 40, 80, 80]],
+                     dtype=np.float32),
+            'gt_ignore_flags':
+            np.array([0, 0, 1], dtype=bool),
+            'gt_masks':
+            PolygonMasks.random(num_masks=3, height=288, width=512, rng=rng),
+            'dataset':
+            dataset
+        }
+
+        transform = YOLOv5MixUp(pre_transform=pre_transform)
+        results = transform(copy.deepcopy(results))
+        self.assertTrue(results['img'].shape[:2] == (288, 512))
+        self.assertTrue(results['gt_bboxes_labels'].shape[0] ==
+                        results['gt_bboxes'].shape[0])
+        self.assertTrue(results['gt_bboxes_labels'].dtype == np.int64)
+        self.assertTrue(results['gt_bboxes'].dtype == np.float32)
+        self.assertTrue(results['gt_ignore_flags'].dtype == bool)
+
+
+class TestYOLOXMixUp(unittest.TestCase):
+
+    def setUp(self):
+        """Setup the data info which are used in every test method.
+
+        TestCase calls functions in this order: setUp() -> testMethod() ->
+        tearDown() -> cleanUp()
+        """
+        rng = np.random.RandomState(0)
+        self.pre_transform = [
+            dict(type='LoadImageFromFile'),
+            dict(type='LoadAnnotations', with_bbox=True)
+        ]
+        self.dataset = YOLOv5CocoDataset(
+            data_prefix=dict(
+                img=osp.join(osp.dirname(__file__), '../../data')),
+            ann_file=osp.join(
+                osp.dirname(__file__), '../../data/coco_sample_color.json'),
+            filter_cfg=dict(filter_empty_gt=False, min_size=32),
+            pipeline=[])
+        self.results = {
+            'img':
+            np.random.random((224, 224, 3)),
+            'img_shape': (224, 224),
+            'gt_bboxes_labels':
+            np.array([1, 2, 3], dtype=np.int64),
+            'gt_bboxes':
+            np.array([[10, 10, 20, 20], [20, 20, 40, 40], [40, 40, 80, 80]],
+                     dtype=np.float32),
+            'gt_ignore_flags':
+            np.array([0, 0, 1], dtype=bool),
+            'gt_masks':
+            BitmapMasks(rng.rand(3, 224, 224), height=224, width=224),
+            'dataset':
+            self.dataset
+        }
+
+    def test_transform(self):
+        # test assertion for invalid img_scale
+        with self.assertRaises(AssertionError):
+            transform = YOLOXMixUp(img_scale=640)
+
+        # test assertion for invalid max_cached_images
+        with self.assertRaises(AssertionError):
+            transform = YOLOXMixUp(use_cached=True, max_cached_images=1)
+
+        transform = YOLOXMixUp(
+            img_scale=(10, 12),
+            ratio_range=(0.8, 1.6),
+            pad_val=114.0,
+            pre_transform=self.pre_transform)
+
+        # self.results['mix_results'] = [copy.deepcopy(self.results)]
+        results = transform(copy.deepcopy(self.results))
+        self.assertTrue(results['img'].shape[:2] == (224, 224))
+        self.assertTrue(results['gt_bboxes_labels'].shape[0] ==
+                        results['gt_bboxes'].shape[0])
+        self.assertTrue(results['gt_bboxes_labels'].dtype == np.int64)
+        self.assertTrue(results['gt_bboxes'].dtype == np.float32)
+        self.assertTrue(results['gt_ignore_flags'].dtype == bool)
+
+    def test_transform_with_boxlist(self):
+        results = copy.deepcopy(self.results)
+        results['gt_bboxes'] = HorizontalBoxes(results['gt_bboxes'])
+
+        transform = YOLOXMixUp(
+            img_scale=(10, 12),
+            ratio_range=(0.8, 1.6),
+            pad_val=114.0,
+            pre_transform=self.pre_transform)
+        results = transform(results)
+        self.assertTrue(results['img'].shape[:2] == (224, 224))
+        self.assertTrue(results['gt_bboxes_labels'].shape[0] ==
+                        results['gt_bboxes'].shape[0])
+        self.assertTrue(results['gt_bboxes_labels'].dtype == np.int64)
+        self.assertTrue(results['gt_bboxes'].dtype == torch.float32)
+        self.assertTrue(results['gt_ignore_flags'].dtype == bool)
diff --git a/mmdetection_practice/third_party/mmyolo/tests/test_datasets/test_transforms/test_transforms.py b/mmdetection_practice/third_party/mmyolo/tests/test_datasets/test_transforms/test_transforms.py
new file mode 100644
index 0000000..a8b7ea4
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tests/test_datasets/test_transforms/test_transforms.py
@@ -0,0 +1,493 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+import copy
+import os.path as osp
+import unittest
+
+import mmcv
+import numpy as np
+import torch
+from mmdet.structures.bbox import HorizontalBoxes
+from mmdet.structures.mask import BitmapMasks, PolygonMasks
+
+from mmyolo.datasets.transforms import (LetterResize, LoadAnnotations,
+                                        YOLOv5HSVRandomAug,
+                                        YOLOv5KeepRatioResize,
+                                        YOLOv5RandomAffine)
+from mmyolo.datasets.transforms.transforms import (PPYOLOERandomCrop,
+                                                   PPYOLOERandomDistort,
+                                                   YOLOv5CopyPaste)
+
+
+class TestLetterResize(unittest.TestCase):
+
+    def setUp(self):
+        """Set up the data info which are used in every test method.
+
+        TestCase calls functions in this order: setUp() -> testMethod() ->
+        tearDown() -> cleanUp()
+        """
+        rng = np.random.RandomState(0)
+        self.data_info1 = dict(
+            img=np.random.random((300, 400, 3)),
+            gt_bboxes=np.array([[0, 0, 150, 150]], dtype=np.float32),
+            batch_shape=np.array([192, 672], dtype=np.int64),
+            gt_masks=PolygonMasks.random(1, height=300, width=400, rng=rng))
+        self.data_info2 = dict(
+            img=np.random.random((300, 400, 3)),
+            gt_bboxes=np.array([[0, 0, 150, 150]], dtype=np.float32))
+        self.data_info3 = dict(
+            img=np.random.random((300, 400, 3)),
+            batch_shape=np.array([192, 672], dtype=np.int64))
+        self.data_info4 = dict(img=np.random.random((300, 400, 3)))
+
+    def test_letter_resize(self):
+        # Test allow_scale_up
+        transform = LetterResize(scale=(640, 640), allow_scale_up=False)
+        results = transform(copy.deepcopy(self.data_info1))
+        self.assertEqual(results['img_shape'], (192, 672, 3))
+        self.assertTrue(
+            (results['gt_bboxes'] == np.array([[208., 0., 304., 96.]])).all())
+        self.assertTrue((results['batch_shape'] == np.array([192, 672])).all())
+        self.assertTrue((results['pad_param'] == np.array([0., 0., 208.,
+                                                           208.])).all())
+        self.assertTrue(
+            (np.array(results['scale_factor'], dtype=np.float32) <= 1.).all())
+
+        # Test pad_val
+        transform = LetterResize(scale=(640, 640), pad_val=dict(img=144))
+        results = transform(copy.deepcopy(self.data_info1))
+        self.assertEqual(results['img_shape'], (192, 672, 3))
+        self.assertTrue(
+            (results['gt_bboxes'] == np.array([[208., 0., 304., 96.]])).all())
+        self.assertTrue((results['batch_shape'] == np.array([192, 672])).all())
+        self.assertTrue((results['pad_param'] == np.array([0., 0., 208.,
+                                                           208.])).all())
+        self.assertTrue(
+            (np.array(results['scale_factor'], dtype=np.float32) <= 1.).all())
+
+        # Test use_mini_pad
+        transform = LetterResize(scale=(640, 640), use_mini_pad=True)
+        results = transform(copy.deepcopy(self.data_info1))
+        self.assertEqual(results['img_shape'], (192, 256, 3))
+        self.assertTrue((results['gt_bboxes'] == np.array([[0., 0., 96.,
+                                                            96.]])).all())
+        self.assertTrue((results['batch_shape'] == np.array([192, 672])).all())
+        self.assertTrue((results['pad_param'] == np.array([0., 0., 0.,
+                                                           0.])).all())
+        self.assertTrue(
+            (np.array(results['scale_factor'], dtype=np.float32) <= 1.).all())
+
+        # Test stretch_only
+        transform = LetterResize(scale=(640, 640), stretch_only=True)
+        results = transform(copy.deepcopy(self.data_info1))
+        self.assertEqual(results['img_shape'], (192, 672, 3))
+        self.assertTrue((results['gt_bboxes'] == np.array(
+            [[0., 0., 251.99998474121094, 96.]])).all())
+        self.assertTrue((results['batch_shape'] == np.array([192, 672])).all())
+        self.assertTrue((results['pad_param'] == np.array([0., 0., 0.,
+                                                           0.])).all())
+
+        # Test
+        transform = LetterResize(scale=(640, 640), pad_val=dict(img=144))
+        for _ in range(5):
+            input_h, input_w = np.random.randint(100, 700), np.random.randint(
+                100, 700)
+            output_h, output_w = np.random.randint(100,
+                                                   700), np.random.randint(
+                                                       100, 700)
+            data_info = dict(
+                img=np.random.random((input_h, input_w, 3)),
+                gt_bboxes=np.array([[0, 0, 10, 10]], dtype=np.float32),
+                batch_shape=np.array([output_h, output_w], dtype=np.int64),
+                gt_masks=PolygonMasks(
+                    [[np.array([0., 0., 0., 10., 10., 10., 10., 0.])]],
+                    height=input_h,
+                    width=input_w))
+            results = transform(data_info)
+            self.assertEqual(results['img_shape'], (output_h, output_w, 3))
+            self.assertTrue(
+                (results['batch_shape'] == np.array([output_h,
+                                                     output_w])).all())
+
+        # Test without batchshape
+        transform = LetterResize(scale=(640, 640), pad_val=dict(img=144))
+        for _ in range(5):
+            input_h, input_w = np.random.randint(100, 700), np.random.randint(
+                100, 700)
+            data_info = dict(
+                img=np.random.random((input_h, input_w, 3)),
+                gt_bboxes=np.array([[0, 0, 10, 10]], dtype=np.float32),
+                gt_masks=PolygonMasks(
+                    [[np.array([0., 0., 0., 10., 10., 10., 10., 0.])]],
+                    height=input_h,
+                    width=input_w))
+            results = transform(data_info)
+            self.assertEqual(results['img_shape'], (640, 640, 3))
+
+        # TODO: Testing the existence of multiple scale_factor and pad_param
+        transform = [
+            YOLOv5KeepRatioResize(scale=(32, 32)),
+            LetterResize(scale=(64, 68), pad_val=dict(img=144))
+        ]
+        for _ in range(5):
+            input_h, input_w = np.random.randint(100, 700), np.random.randint(
+                100, 700)
+            output_h, output_w = np.random.randint(100,
+                                                   700), np.random.randint(
+                                                       100, 700)
+            data_info = dict(
+                img=np.random.random((input_h, input_w, 3)),
+                gt_bboxes=np.array([[0, 0, 5, 5]], dtype=np.float32),
+                batch_shape=np.array([output_h, output_w], dtype=np.int64))
+            for t in transform:
+                data_info = t(data_info)
+            # because of the "math.round" operation,
+            # it is unable to strictly restore the original input shape
+            # we just validate the correctness of scale_factor and pad_param
+            self.assertIn('scale_factor', data_info)
+            self.assertIn('pad_param', data_info)
+            pad_param = data_info['pad_param'].reshape(-1, 2).sum(
+                1)  # (top, b, l, r) -> (h, w)
+            scale_factor = np.asarray(data_info['scale_factor'])  # (w, h)
+
+            max_long_edge = max((32, 32))
+            max_short_edge = min((32, 32))
+            scale_factor_keepratio = min(
+                max_long_edge / max(input_h, input_w),
+                max_short_edge / min(input_h, input_w))
+            validate_shape = np.asarray(
+                (int(input_h * scale_factor_keepratio),
+                 int(input_w * scale_factor_keepratio)))
+            scale_factor_keepratio = np.asarray(
+                (validate_shape[1] / input_w, validate_shape[0] / input_h))
+
+            scale_factor_letter = ((np.asarray(
+                (output_h, output_w)) - pad_param) / validate_shape)[::-1]
+            self.assertTrue(data_info['img_shape'][:2] == (output_h, output_w))
+            self.assertTrue((scale_factor == (scale_factor_keepratio *
+                                              scale_factor_letter)).all())
+
+
+class TestYOLOv5KeepRatioResize(unittest.TestCase):
+
+    def setUp(self):
+        """Set up the data info which are used in every test method.
+
+        TestCase calls functions in this order: setUp() -> testMethod() ->
+        tearDown() -> cleanUp()
+        """
+        rng = np.random.RandomState(0)
+        self.data_info1 = dict(
+            img=np.random.random((300, 400, 3)),
+            gt_bboxes=np.array([[0, 0, 150, 150]], dtype=np.float32),
+            gt_masks=PolygonMasks.random(
+                num_masks=1, height=300, width=400, rng=rng))
+        self.data_info2 = dict(img=np.random.random((300, 400, 3)))
+
+    def test_yolov5_keep_ratio_resize(self):
+        # test assertion for invalid keep_ratio
+        with self.assertRaises(AssertionError):
+            transform = YOLOv5KeepRatioResize(scale=(640, 640))
+            transform.keep_ratio = False
+            results = transform(copy.deepcopy(self.data_info1))
+
+        # Test with gt_bboxes
+        transform = YOLOv5KeepRatioResize(scale=(640, 640))
+        results = transform(copy.deepcopy(self.data_info1))
+        self.assertTrue(transform.keep_ratio, True)
+        self.assertEqual(results['img_shape'], (480, 640))
+        self.assertTrue(
+            (results['gt_bboxes'] == np.array([[0., 0., 240., 240.]])).all())
+        self.assertTrue((np.array(results['scale_factor'],
+                                  dtype=np.float32) == 1.6).all())
+
+        # Test only img
+        transform = YOLOv5KeepRatioResize(scale=(640, 640))
+        results = transform(copy.deepcopy(self.data_info2))
+        self.assertEqual(results['img_shape'], (480, 640))
+        self.assertTrue((np.array(results['scale_factor'],
+                                  dtype=np.float32) == 1.6).all())
+
+
+class TestYOLOv5HSVRandomAug(unittest.TestCase):
+
+    def setUp(self):
+        """Set up the data info which are used in every test method.
+
+        TestCase calls functions in this order: setUp() -> testMethod() ->
+        tearDown() -> cleanUp()
+        """
+        self.data_info = dict(
+            img=mmcv.imread(
+                osp.join(osp.dirname(__file__), '../../data/color.jpg'),
+                'color'))
+
+    def test_yolov5_hsv_random_aug(self):
+        # Test with gt_bboxes
+        transform = YOLOv5HSVRandomAug(
+            hue_delta=0.015, saturation_delta=0.7, value_delta=0.4)
+        results = transform(copy.deepcopy(self.data_info))
+        self.assertTrue(
+            results['img'].shape[:2] == self.data_info['img'].shape[:2])
+
+
+class TestLoadAnnotations(unittest.TestCase):
+
+    def setUp(self):
+        """Set up the data info which are used in every test method.
+
+        TestCase calls functions in this order: setUp() -> testMethod() ->
+        tearDown() -> cleanUp()
+        """
+        data_prefix = osp.join(osp.dirname(__file__), '../../data')
+        seg_map = osp.join(data_prefix, 'gray.jpg')
+        self.results = {
+            'ori_shape': (300, 400),
+            'seg_map_path':
+            seg_map,
+            'instances': [{
+                'bbox': [0, 0, 10, 20],
+                'bbox_label': 1,
+                'mask': [[0, 0, 0, 20, 10, 20, 10, 0]],
+                'ignore_flag': 0
+            }, {
+                'bbox': [10, 10, 110, 120],
+                'bbox_label': 2,
+                'mask': [[10, 10, 110, 10, 110, 120, 110, 10]],
+                'ignore_flag': 0
+            }, {
+                'bbox': [50, 50, 60, 80],
+                'bbox_label': 2,
+                'mask': [[50, 50, 60, 50, 60, 80, 50, 80]],
+                'ignore_flag': 1
+            }]
+        }
+
+    def test_load_bboxes(self):
+        transform = LoadAnnotations(
+            with_bbox=True,
+            with_label=False,
+            with_seg=False,
+            with_mask=False,
+            box_type=None)
+        results = transform(copy.deepcopy(self.results))
+        self.assertIn('gt_bboxes', results)
+        self.assertTrue((results['gt_bboxes'] == np.array([[0, 0, 10, 20],
+                                                           [10, 10, 110,
+                                                            120]])).all())
+        self.assertEqual(results['gt_bboxes'].dtype, np.float32)
+        self.assertTrue(
+            (results['gt_ignore_flags'] == np.array([False, False])).all())
+        self.assertEqual(results['gt_ignore_flags'].dtype, bool)
+
+        # test empty instance
+        results = transform({})
+        self.assertIn('gt_bboxes', results)
+        self.assertTrue(results['gt_bboxes'].shape == (0, 4))
+        self.assertIn('gt_ignore_flags', results)
+        self.assertTrue(results['gt_ignore_flags'].shape == (0, ))
+
+    def test_load_labels(self):
+        transform = LoadAnnotations(
+            with_bbox=False,
+            with_label=True,
+            with_seg=False,
+            with_mask=False,
+        )
+        results = transform(copy.deepcopy(self.results))
+        self.assertIn('gt_bboxes_labels', results)
+        self.assertTrue((results['gt_bboxes_labels'] == np.array([1,
+                                                                  2])).all())
+        self.assertEqual(results['gt_bboxes_labels'].dtype, np.int64)
+
+        # test empty instance
+        results = transform({})
+        self.assertIn('gt_bboxes_labels', results)
+        self.assertTrue(results['gt_bboxes_labels'].shape == (0, ))
+
+
+class TestYOLOv5RandomAffine(unittest.TestCase):
+
+    def setUp(self):
+        """Setup the data info which are used in every test method.
+
+        TestCase calls functions in this order: setUp() -> testMethod() ->
+        tearDown() -> cleanUp()
+        """
+        self.results = {
+            'img':
+            np.random.random((224, 224, 3)),
+            'img_shape': (224, 224),
+            'gt_bboxes_labels':
+            np.array([1, 2, 3], dtype=np.int64),
+            'gt_bboxes':
+            np.array([[10, 10, 20, 20], [20, 20, 40, 40], [40, 40, 80, 80]],
+                     dtype=np.float32),
+            'gt_ignore_flags':
+            np.array([0, 0, 1], dtype=bool),
+        }
+
+    def test_transform(self):
+        # test assertion for invalid translate_ratio
+        with self.assertRaises(AssertionError):
+            transform = YOLOv5RandomAffine(max_translate_ratio=1.5)
+
+        # test assertion for invalid scaling_ratio_range
+        with self.assertRaises(AssertionError):
+            transform = YOLOv5RandomAffine(scaling_ratio_range=(1.5, 0.5))
+
+        with self.assertRaises(AssertionError):
+            transform = YOLOv5RandomAffine(scaling_ratio_range=(0, 0.5))
+
+        transform = YOLOv5RandomAffine()
+        results = transform(copy.deepcopy(self.results))
+        self.assertTrue(results['img'].shape[:2] == (224, 224))
+        self.assertTrue(results['gt_bboxes_labels'].shape[0] ==
+                        results['gt_bboxes'].shape[0])
+        self.assertTrue(results['gt_bboxes_labels'].dtype == np.int64)
+        self.assertTrue(results['gt_bboxes'].dtype == np.float32)
+        self.assertTrue(results['gt_ignore_flags'].dtype == bool)
+
+    def test_transform_with_boxlist(self):
+        results = copy.deepcopy(self.results)
+        results['gt_bboxes'] = HorizontalBoxes(results['gt_bboxes'])
+
+        transform = YOLOv5RandomAffine()
+        results = transform(copy.deepcopy(results))
+        self.assertTrue(results['img'].shape[:2] == (224, 224))
+        self.assertTrue(results['gt_bboxes_labels'].shape[0] ==
+                        results['gt_bboxes'].shape[0])
+        self.assertTrue(results['gt_bboxes_labels'].dtype == np.int64)
+        self.assertTrue(results['gt_bboxes'].dtype == torch.float32)
+        self.assertTrue(results['gt_ignore_flags'].dtype == bool)
+
+
+class TestPPYOLOERandomCrop(unittest.TestCase):
+
+    def setUp(self):
+        """Setup the data info which are used in every test method.
+
+        TestCase calls functions in this order: setUp() -> testMethod() ->
+        tearDown() -> cleanUp()
+        """
+        self.results = {
+            'img':
+            np.random.random((224, 224, 3)),
+            'img_shape': (224, 224),
+            'gt_bboxes_labels':
+            np.array([1, 2, 3], dtype=np.int64),
+            'gt_bboxes':
+            np.array([[10, 10, 20, 20], [20, 20, 40, 40], [40, 40, 80, 80]],
+                     dtype=np.float32),
+            'gt_ignore_flags':
+            np.array([0, 0, 1], dtype=bool),
+        }
+
+    def test_transform(self):
+        transform = PPYOLOERandomCrop()
+        results = transform(copy.deepcopy(self.results))
+        self.assertTrue(results['gt_bboxes_labels'].shape[0] ==
+                        results['gt_bboxes'].shape[0])
+        self.assertTrue(results['gt_bboxes_labels'].dtype == np.int64)
+        self.assertTrue(results['gt_bboxes'].dtype == np.float32)
+        self.assertTrue(results['gt_ignore_flags'].dtype == bool)
+
+    def test_transform_with_boxlist(self):
+        results = copy.deepcopy(self.results)
+        results['gt_bboxes'] = HorizontalBoxes(results['gt_bboxes'])
+
+        transform = PPYOLOERandomCrop()
+        results = transform(copy.deepcopy(results))
+        self.assertTrue(results['gt_bboxes_labels'].shape[0] ==
+                        results['gt_bboxes'].shape[0])
+        self.assertTrue(results['gt_bboxes_labels'].dtype == np.int64)
+        self.assertTrue(results['gt_bboxes'].dtype == torch.float32)
+        self.assertTrue(results['gt_ignore_flags'].dtype == bool)
+
+
+class TestPPYOLOERandomDistort(unittest.TestCase):
+
+    def setUp(self):
+        """Setup the data info which are used in every test method.
+
+        TestCase calls functions in this order: setUp() -> testMethod() ->
+        tearDown() -> cleanUp()
+        """
+        self.results = {
+            'img':
+            np.random.random((224, 224, 3)),
+            'img_shape': (224, 224),
+            'gt_bboxes_labels':
+            np.array([1, 2, 3], dtype=np.int64),
+            'gt_bboxes':
+            np.array([[10, 10, 20, 20], [20, 20, 40, 40], [40, 40, 80, 80]],
+                     dtype=np.float32),
+            'gt_ignore_flags':
+            np.array([0, 0, 1], dtype=bool),
+        }
+
+    def test_transform(self):
+        # test assertion for invalid prob
+        with self.assertRaises(AssertionError):
+            transform = PPYOLOERandomDistort(
+                hue_cfg=dict(min=-18, max=18, prob=1.5))
+
+        # test assertion for invalid num_distort_func
+        with self.assertRaises(AssertionError):
+            transform = PPYOLOERandomDistort(num_distort_func=5)
+
+        transform = PPYOLOERandomDistort()
+        results = transform(copy.deepcopy(self.results))
+        self.assertTrue(results['img'].shape[:2] == (224, 224))
+        self.assertTrue(results['gt_bboxes_labels'].shape[0] ==
+                        results['gt_bboxes'].shape[0])
+        self.assertTrue(results['gt_bboxes_labels'].dtype == np.int64)
+        self.assertTrue(results['gt_bboxes'].dtype == np.float32)
+        self.assertTrue(results['gt_ignore_flags'].dtype == bool)
+
+    def test_transform_with_boxlist(self):
+        results = copy.deepcopy(self.results)
+        results['gt_bboxes'] = HorizontalBoxes(results['gt_bboxes'])
+
+        transform = PPYOLOERandomDistort()
+        results = transform(copy.deepcopy(results))
+        self.assertTrue(results['img'].shape[:2] == (224, 224))
+        self.assertTrue(results['gt_bboxes_labels'].shape[0] ==
+                        results['gt_bboxes'].shape[0])
+        self.assertTrue(results['gt_bboxes_labels'].dtype == np.int64)
+        self.assertTrue(results['gt_bboxes'].dtype == torch.float32)
+        self.assertTrue(results['gt_ignore_flags'].dtype == bool)
+
+
+class TestYOLOv5CopyPaste(unittest.TestCase):
+
+    def setUp(self):
+        """Set up the data info which are used in every test method.
+
+        TestCase calls functions in this order: setUp() -> testMethod() ->
+        tearDown() -> cleanUp()
+        """
+        self.data_info = dict(
+            img=np.random.random((300, 400, 3)),
+            gt_bboxes=np.array([[0, 0, 10, 10]], dtype=np.float32),
+            gt_masks=PolygonMasks(
+                [[np.array([0., 0., 0., 10., 10., 10., 10., 0.])]],
+                height=300,
+                width=400))
+
+    def test_transform(self):
+        # test transform
+        transform = YOLOv5CopyPaste(prob=1.0)
+        results = transform(copy.deepcopy(self.data_info))
+        self.assertTrue(len(results['gt_bboxes']) == 2)
+        self.assertTrue(len(results['gt_masks']) == 2)
+
+        rng = np.random.RandomState(0)
+        # test with bitmap
+        with self.assertRaises(AssertionError):
+            results = transform(
+                dict(
+                    img=np.random.random((300, 400, 3)),
+                    gt_bboxes=np.array([[0, 0, 10, 10]], dtype=np.float32),
+                    gt_masks=BitmapMasks(
+                        rng.rand(1, 300, 400), height=300, width=400)))
diff --git a/mmdetection_practice/third_party/mmyolo/tests/test_datasets/test_utils.py b/mmdetection_practice/third_party/mmyolo/tests/test_datasets/test_utils.py
new file mode 100644
index 0000000..dc7b902
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tests/test_datasets/test_utils.py
@@ -0,0 +1,138 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+import unittest
+
+import numpy as np
+import torch
+from mmdet.structures import DetDataSample
+from mmdet.structures.bbox import HorizontalBoxes
+from mmengine.structures import InstanceData
+
+from mmyolo.datasets import BatchShapePolicy, yolov5_collate
+
+
+def _rand_bboxes(rng, num_boxes, w, h):
+    cx, cy, bw, bh = rng.rand(num_boxes, 4).T
+
+    tl_x = ((cx * w) - (w * bw / 2)).clip(0, w)
+    tl_y = ((cy * h) - (h * bh / 2)).clip(0, h)
+    br_x = ((cx * w) + (w * bw / 2)).clip(0, w)
+    br_y = ((cy * h) + (h * bh / 2)).clip(0, h)
+
+    bboxes = np.vstack([tl_x, tl_y, br_x, br_y]).T
+    return bboxes
+
+
+class TestYOLOv5Collate(unittest.TestCase):
+
+    def test_yolov5_collate(self):
+        rng = np.random.RandomState(0)
+
+        inputs = torch.randn((3, 10, 10))
+        data_samples = DetDataSample()
+        gt_instances = InstanceData()
+        bboxes = _rand_bboxes(rng, 4, 6, 8)
+        gt_instances.bboxes = HorizontalBoxes(bboxes, dtype=torch.float32)
+        labels = rng.randint(1, 2, size=len(bboxes))
+        gt_instances.labels = torch.LongTensor(labels)
+        data_samples.gt_instances = gt_instances
+
+        out = yolov5_collate([dict(inputs=inputs, data_samples=data_samples)])
+        self.assertIsInstance(out, dict)
+        self.assertTrue(out['inputs'].shape == (1, 3, 10, 10))
+        self.assertTrue(out['data_samples'], dict)
+        self.assertTrue(out['data_samples']['bboxes_labels'].shape == (4, 6))
+
+        out = yolov5_collate([dict(inputs=inputs, data_samples=data_samples)] *
+                             2)
+        self.assertIsInstance(out, dict)
+        self.assertTrue(out['inputs'].shape == (2, 3, 10, 10))
+        self.assertTrue(out['data_samples'], dict)
+        self.assertTrue(out['data_samples']['bboxes_labels'].shape == (8, 6))
+
+    def test_yolov5_collate_with_multi_scale(self):
+        rng = np.random.RandomState(0)
+
+        inputs = torch.randn((3, 10, 10))
+        data_samples = DetDataSample()
+        gt_instances = InstanceData()
+        bboxes = _rand_bboxes(rng, 4, 6, 8)
+        gt_instances.bboxes = HorizontalBoxes(bboxes, dtype=torch.float32)
+        labels = rng.randint(1, 2, size=len(bboxes))
+        gt_instances.labels = torch.LongTensor(labels)
+        data_samples.gt_instances = gt_instances
+
+        out = yolov5_collate([dict(inputs=inputs, data_samples=data_samples)],
+                             use_ms_training=True)
+        self.assertIsInstance(out, dict)
+        self.assertTrue(out['inputs'][0].shape == (3, 10, 10))
+        self.assertTrue(out['data_samples'], dict)
+        self.assertTrue(out['data_samples']['bboxes_labels'].shape == (4, 6))
+        self.assertIsInstance(out['inputs'], list)
+        self.assertIsInstance(out['data_samples']['bboxes_labels'],
+                              torch.Tensor)
+
+        out = yolov5_collate(
+            [dict(inputs=inputs, data_samples=data_samples)] * 2,
+            use_ms_training=True)
+        self.assertIsInstance(out, dict)
+        self.assertTrue(out['inputs'][0].shape == (3, 10, 10))
+        self.assertTrue(out['data_samples'], dict)
+        self.assertTrue(out['data_samples']['bboxes_labels'].shape == (8, 6))
+        self.assertIsInstance(out['inputs'], list)
+        self.assertIsInstance(out['data_samples']['bboxes_labels'],
+                              torch.Tensor)
+
+
+class TestBatchShapePolicy(unittest.TestCase):
+
+    def test_batch_shape_policy(self):
+        src_data_infos = [{
+            'height': 20,
+            'width': 100,
+        }, {
+            'height': 11,
+            'width': 100,
+        }, {
+            'height': 21,
+            'width': 100,
+        }, {
+            'height': 30,
+            'width': 100,
+        }, {
+            'height': 10,
+            'width': 100,
+        }]
+
+        expected_data_infos = [{
+            'height': 10,
+            'width': 100,
+            'batch_shape': np.array([96, 672])
+        }, {
+            'height': 11,
+            'width': 100,
+            'batch_shape': np.array([96, 672])
+        }, {
+            'height': 20,
+            'width': 100,
+            'batch_shape': np.array([160, 672])
+        }, {
+            'height': 21,
+            'width': 100,
+            'batch_shape': np.array([160, 672])
+        }, {
+            'height': 30,
+            'width': 100,
+            'batch_shape': np.array([224, 672])
+        }]
+
+        batch_shapes_policy = BatchShapePolicy(batch_size=2)
+        out_data_infos = batch_shapes_policy(src_data_infos)
+
+        for i in range(5):
+            self.assertEqual(
+                (expected_data_infos[i]['height'],
+                 expected_data_infos[i]['width']),
+                (out_data_infos[i]['height'], out_data_infos[i]['width']))
+            self.assertTrue(
+                np.allclose(expected_data_infos[i]['batch_shape'],
+                            out_data_infos[i]['batch_shape']))
diff --git a/mmdetection_practice/third_party/mmyolo/tests/test_datasets/test_yolov5_coco.py b/mmdetection_practice/third_party/mmyolo/tests/test_datasets/test_yolov5_coco.py
new file mode 100644
index 0000000..b7e1c9a
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tests/test_datasets/test_yolov5_coco.py
@@ -0,0 +1,71 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+import unittest
+
+from mmyolo.datasets import YOLOv5CocoDataset
+
+
+class TestYOLOv5CocoDataset(unittest.TestCase):
+
+    def test_batch_shapes_cfg(self):
+        batch_shapes_cfg = dict(
+            type='BatchShapePolicy',
+            batch_size=2,
+            img_size=640,
+            size_divisor=32,
+            extra_pad_ratio=0.5)
+
+        # test serialize_data=True
+        dataset = YOLOv5CocoDataset(
+            data_prefix=dict(img='imgs'),
+            ann_file='tests/data/coco_sample.json',
+            filter_cfg=dict(filter_empty_gt=False, min_size=0),
+            pipeline=[],
+            serialize_data=True,
+            batch_shapes_cfg=batch_shapes_cfg,
+        )
+
+        expected_img_ids = [3, 0, 2, 1]
+        expected_batch_shapes = [[512, 672], [512, 672], [672, 672],
+                                 [672, 672]]
+        for i, data in enumerate(dataset):
+            assert data['img_id'] == expected_img_ids[i]
+            assert data['batch_shape'].tolist() == expected_batch_shapes[i]
+
+        # test serialize_data=True
+        dataset = YOLOv5CocoDataset(
+            data_prefix=dict(img='imgs'),
+            ann_file='tests/data/coco_sample.json',
+            filter_cfg=dict(filter_empty_gt=False, min_size=0),
+            pipeline=[],
+            serialize_data=False,
+            batch_shapes_cfg=batch_shapes_cfg,
+        )
+
+        expected_img_ids = [3, 0, 2, 1]
+        expected_batch_shapes = [[512, 672], [512, 672], [672, 672],
+                                 [672, 672]]
+        for i, data in enumerate(dataset):
+            assert data['img_id'] == expected_img_ids[i]
+            assert data['batch_shape'].tolist() == expected_batch_shapes[i]
+
+    def test_prepare_data(self):
+        dataset = YOLOv5CocoDataset(
+            data_prefix=dict(img='imgs'),
+            ann_file='tests/data/coco_sample.json',
+            filter_cfg=dict(filter_empty_gt=False, min_size=0),
+            pipeline=[],
+            serialize_data=True,
+            batch_shapes_cfg=None,
+        )
+        for data in dataset:
+            assert 'dataset' in data
+
+        # test with test_mode = True
+        dataset = YOLOv5CocoDataset(
+            data_prefix=dict(img='imgs'),
+            ann_file='tests/data/coco_sample.json',
+            test_mode=True,
+            pipeline=[])
+
+        for data in dataset:
+            assert 'dataset' not in data
diff --git a/mmdetection_practice/third_party/mmyolo/tests/test_datasets/test_yolov5_voc.py b/mmdetection_practice/third_party/mmyolo/tests/test_datasets/test_yolov5_voc.py
new file mode 100644
index 0000000..f7e9b98
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tests/test_datasets/test_yolov5_voc.py
@@ -0,0 +1,86 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+import unittest
+
+from mmengine.dataset import ConcatDataset
+
+from mmyolo.datasets import YOLOv5VOCDataset
+from mmyolo.utils import register_all_modules
+
+register_all_modules()
+
+
+class TestYOLOv5VocDataset(unittest.TestCase):
+
+    def test_batch_shapes_cfg(self):
+        batch_shapes_cfg = dict(
+            type='BatchShapePolicy',
+            batch_size=2,
+            img_size=640,
+            size_divisor=32,
+            extra_pad_ratio=0.5)
+
+        # test serialize_data=True
+        dataset = YOLOv5VOCDataset(
+            data_root='tests/data/VOCdevkit/',
+            ann_file='VOC2007/ImageSets/Main/trainval.txt',
+            data_prefix=dict(sub_data_root='VOC2007/'),
+            test_mode=True,
+            pipeline=[],
+            batch_shapes_cfg=batch_shapes_cfg,
+        )
+
+        expected_img_ids = ['000001']
+        expected_batch_shapes = [[672, 480]]
+        for i, data in enumerate(dataset):
+            assert data['img_id'] == expected_img_ids[i]
+            assert data['batch_shape'].tolist() == expected_batch_shapes[i]
+
+    def test_prepare_data(self):
+        dataset = YOLOv5VOCDataset(
+            data_root='tests/data/VOCdevkit/',
+            ann_file='VOC2007/ImageSets/Main/trainval.txt',
+            data_prefix=dict(sub_data_root='VOC2007/'),
+            filter_cfg=dict(filter_empty_gt=False, min_size=0),
+            pipeline=[],
+            serialize_data=True,
+            batch_shapes_cfg=None,
+        )
+        for data in dataset:
+            assert 'dataset' in data
+
+        # test with test_mode = True
+        dataset = YOLOv5VOCDataset(
+            data_root='tests/data/VOCdevkit/',
+            ann_file='VOC2007/ImageSets/Main/trainval.txt',
+            data_prefix=dict(sub_data_root='VOC2007/'),
+            filter_cfg=dict(
+                filter_empty_gt=True, min_size=32, bbox_min_size=None),
+            pipeline=[],
+            test_mode=True,
+            batch_shapes_cfg=None)
+
+        for data in dataset:
+            assert 'dataset' not in data
+
+    def test_concat_dataset(self):
+        dataset = ConcatDataset(
+            datasets=[
+                dict(
+                    type='YOLOv5VOCDataset',
+                    data_root='tests/data/VOCdevkit/',
+                    ann_file='VOC2007/ImageSets/Main/trainval.txt',
+                    data_prefix=dict(sub_data_root='VOC2007/'),
+                    filter_cfg=dict(filter_empty_gt=False, min_size=32),
+                    pipeline=[]),
+                dict(
+                    type='YOLOv5VOCDataset',
+                    data_root='tests/data/VOCdevkit/',
+                    ann_file='VOC2012/ImageSets/Main/trainval.txt',
+                    data_prefix=dict(sub_data_root='VOC2012/'),
+                    filter_cfg=dict(filter_empty_gt=False, min_size=32),
+                    pipeline=[])
+            ],
+            ignore_keys='dataset_type')
+
+        dataset.full_init()
+        self.assertEqual(len(dataset), 2)
diff --git a/mmdetection_practice/third_party/mmyolo/tests/test_deploy/conftest.py b/mmdetection_practice/third_party/mmyolo/tests/test_deploy/conftest.py
new file mode 100644
index 0000000..ed1bd3d
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tests/test_deploy/conftest.py
@@ -0,0 +1,13 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+import pytest
+
+
+@pytest.fixture(autouse=True)
+def init_test():
+    # init default scope
+    from mmdet.utils import register_all_modules as register_det
+
+    from mmyolo.utils import register_all_modules as register_yolo
+
+    register_yolo(True)
+    register_det(False)
diff --git a/mmdetection_practice/third_party/mmyolo/tests/test_deploy/test_mmyolo_models.py b/mmdetection_practice/third_party/mmyolo/tests/test_deploy/test_mmyolo_models.py
new file mode 100644
index 0000000..65394e5
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tests/test_deploy/test_mmyolo_models.py
@@ -0,0 +1,165 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+import os
+import random
+
+import numpy as np
+import pytest
+import torch
+from mmengine import Config
+
+try:
+    import importlib
+    importlib.import_module('mmdeploy')
+except ImportError:
+    pytest.skip('mmdeploy is not installed.', allow_module_level=True)
+
+from mmdeploy.codebase import import_codebase
+from mmdeploy.utils import Backend
+from mmdeploy.utils.config_utils import register_codebase
+from mmdeploy.utils.test import (WrapModel, check_backend, get_model_outputs,
+                                 get_rewrite_outputs)
+
+try:
+    codebase = register_codebase('mmyolo')
+    import_codebase(codebase, ['mmyolo.deploy'])
+except ImportError:
+    pytest.skip('mmyolo is not installed.', allow_module_level=True)
+
+
+def seed_everything(seed=1029):
+    random.seed(seed)
+    os.environ['PYTHONHASHSEED'] = str(seed)
+    np.random.seed(seed)
+    torch.manual_seed(seed)
+    if torch.cuda.is_available():
+        torch.cuda.manual_seed(seed)
+        torch.cuda.manual_seed_all(seed)  # if you are using multi-GPU.
+        torch.backends.cudnn.benchmark = False
+        torch.backends.cudnn.deterministic = True
+        torch.backends.cudnn.enabled = False
+
+
+def get_yolov5_head_model():
+    """YOLOv5 Head Config."""
+    test_cfg = Config(
+        dict(
+            multi_label=True,
+            nms_pre=30000,
+            score_thr=0.001,
+            nms=dict(type='nms', iou_threshold=0.65),
+            max_per_img=300))
+
+    from mmyolo.models.dense_heads import YOLOv5Head
+    head_module = dict(
+        type='YOLOv5HeadModule',
+        num_classes=4,
+        in_channels=[2, 4, 8],
+        featmap_strides=[8, 16, 32],
+        num_base_priors=1)
+
+    model = YOLOv5Head(head_module, test_cfg=test_cfg)
+
+    model.requires_grad_(False)
+    return model
+
+
+@pytest.mark.parametrize('backend_type', [Backend.ONNXRUNTIME])
+def test_yolov5_head_predict_by_feat(backend_type: Backend):
+    """Test predict_by_feat rewrite of YOLOXHead."""
+    check_backend(backend_type)
+    yolov5_head = get_yolov5_head_model()
+    yolov5_head.cpu().eval()
+    s = 256
+    batch_img_metas = [{
+        'scale_factor': (1.0, 1.0),
+        'pad_shape': (s, s, 3),
+        'img_shape': (s, s, 3),
+        'ori_shape': (s, s, 3)
+    }]
+    output_names = ['dets', 'labels']
+    deploy_cfg = Config(
+        dict(
+            backend_config=dict(type=backend_type.value),
+            onnx_config=dict(output_names=output_names, input_shape=None),
+            codebase_config=dict(
+                type='mmyolo',
+                task='ObjectDetection',
+                post_processing=dict(
+                    score_threshold=0.05,
+                    iou_threshold=0.5,
+                    max_output_boxes_per_class=20,
+                    pre_top_k=-1,
+                    keep_top_k=10,
+                    background_label_id=-1,
+                ),
+                module=['mmyolo.deploy'])))
+    seed_everything(1234)
+    cls_scores = [
+        torch.rand(1, yolov5_head.num_classes * yolov5_head.num_base_priors,
+                   4 * pow(2, i), 4 * pow(2, i)) for i in range(3, 0, -1)
+    ]
+    seed_everything(5678)
+    bbox_preds = [
+        torch.rand(1, 4 * yolov5_head.num_base_priors, 4 * pow(2, i),
+                   4 * pow(2, i)) for i in range(3, 0, -1)
+    ]
+    seed_everything(9101)
+    objectnesses = [
+        torch.rand(1, 1 * yolov5_head.num_base_priors, 4 * pow(2, i),
+                   4 * pow(2, i)) for i in range(3, 0, -1)
+    ]
+
+    # to get outputs of pytorch model
+    model_inputs = {
+        'cls_scores': cls_scores,
+        'bbox_preds': bbox_preds,
+        'objectnesses': objectnesses,
+        'batch_img_metas': batch_img_metas,
+        'with_nms': True
+    }
+    model_outputs = get_model_outputs(yolov5_head, 'predict_by_feat',
+                                      model_inputs)
+
+    # to get outputs of onnx model after rewrite
+    wrapped_model = WrapModel(
+        yolov5_head,
+        'predict_by_feat',
+        batch_img_metas=batch_img_metas,
+        with_nms=True)
+    rewrite_inputs = {
+        'cls_scores': cls_scores,
+        'bbox_preds': bbox_preds,
+        'objectnesses': objectnesses,
+    }
+    rewrite_outputs, is_backend_output = get_rewrite_outputs(
+        wrapped_model=wrapped_model,
+        model_inputs=rewrite_inputs,
+        deploy_cfg=deploy_cfg)
+
+    if is_backend_output:
+        # hard code to make two tensors with the same shape
+        # rewrite and original codes applied different nms strategy
+        min_shape = min(model_outputs[0].bboxes.shape[0],
+                        rewrite_outputs[0].shape[1], 5)
+        for i in range(len(model_outputs)):
+            rewrite_outputs[0][i, :min_shape, 0::2] = \
+                rewrite_outputs[0][i, :min_shape, 0::2].clamp_(0, s)
+            rewrite_outputs[0][i, :min_shape, 1::2] = \
+                rewrite_outputs[0][i, :min_shape, 1::2].clamp_(0, s)
+            assert np.allclose(
+                model_outputs[i].bboxes[:min_shape],
+                rewrite_outputs[0][i, :min_shape, :4],
+                rtol=1e-03,
+                atol=1e-05)
+            assert np.allclose(
+                model_outputs[i].scores[:min_shape],
+                rewrite_outputs[0][i, :min_shape, 4],
+                rtol=1e-03,
+                atol=1e-05)
+            assert np.allclose(
+                model_outputs[i].labels[:min_shape],
+                rewrite_outputs[1][i, :min_shape],
+                rtol=1e-03,
+                atol=1e-05)
+    else:
+        assert rewrite_outputs is not None
diff --git a/mmdetection_practice/third_party/mmyolo/tests/test_deploy/test_object_detection.py b/mmdetection_practice/third_party/mmyolo/tests/test_deploy/test_object_detection.py
new file mode 100644
index 0000000..b701e25
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tests/test_deploy/test_object_detection.py
@@ -0,0 +1,96 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+import os
+from tempfile import NamedTemporaryFile, TemporaryDirectory
+
+import numpy as np
+import pytest
+import torch
+from mmengine import Config
+
+try:
+    import importlib
+    importlib.import_module('mmdeploy')
+except ImportError:
+    pytest.skip('mmdeploy is not installed.', allow_module_level=True)
+
+import mmdeploy.backend.onnxruntime as ort_apis
+from mmdeploy.apis import build_task_processor
+from mmdeploy.codebase import import_codebase
+from mmdeploy.utils import load_config
+from mmdeploy.utils.config_utils import register_codebase
+from mmdeploy.utils.test import SwitchBackendWrapper
+
+try:
+    codebase = register_codebase('mmyolo')
+    import_codebase(codebase, ['mmyolo.deploy'])
+except ImportError:
+    pytest.skip('mmyolo is not installed.', allow_module_level=True)
+
+model_cfg_path = 'tests/test_deploy/data/model.py'
+model_cfg = load_config(model_cfg_path)[0]
+model_cfg.test_dataloader.dataset.data_root = \
+    'tests/data'
+model_cfg.test_dataloader.dataset.ann_file = 'coco_sample.json'
+model_cfg.test_evaluator.ann_file = \
+    'tests/coco_sample.json'
+deploy_cfg = Config(
+    dict(
+        backend_config=dict(type='onnxruntime'),
+        codebase_config=dict(
+            type='mmyolo',
+            task='ObjectDetection',
+            post_processing=dict(
+                score_threshold=0.05,
+                confidence_threshold=0.005,  # for YOLOv3
+                iou_threshold=0.5,
+                max_output_boxes_per_class=200,
+                pre_top_k=5000,
+                keep_top_k=100,
+                background_label_id=-1,
+            ),
+            module=['mmyolo.deploy']),
+        onnx_config=dict(
+            type='onnx',
+            export_params=True,
+            keep_initializers_as_inputs=False,
+            opset_version=11,
+            input_shape=None,
+            input_names=['input'],
+            output_names=['dets', 'labels'])))
+onnx_file = NamedTemporaryFile(suffix='.onnx').name
+task_processor = None
+img_shape = (32, 32)
+img = np.random.rand(*img_shape, 3)
+
+
+@pytest.fixture(autouse=True)
+def init_task_processor():
+    global task_processor
+    task_processor = build_task_processor(model_cfg, deploy_cfg, 'cpu')
+
+
+@pytest.fixture
+def backend_model():
+    from mmdeploy.backend.onnxruntime import ORTWrapper
+    ort_apis.__dict__.update({'ORTWrapper': ORTWrapper})
+    wrapper = SwitchBackendWrapper(ORTWrapper)
+    wrapper.set(
+        outputs={
+            'dets': torch.rand(1, 10, 5).sort(2).values,
+            'labels': torch.randint(0, 10, (1, 10))
+        })
+
+    yield task_processor.build_backend_model([''])
+
+    wrapper.recover()
+
+
+def test_visualize(backend_model):
+    img_path = 'tests/data/color.jpg'
+    input_dict, _ = task_processor.create_input(
+        img_path, input_shape=img_shape)
+    results = backend_model.test_step(input_dict)[0]
+    with TemporaryDirectory() as dir:
+        filename = dir + 'tmp.jpg'
+        task_processor.visualize(img, results, filename, 'window')
+        assert os.path.exists(filename)
diff --git a/mmdetection_practice/third_party/mmyolo/tests/test_downstream/test_mmrazor.py b/mmdetection_practice/third_party/mmyolo/tests/test_downstream/test_mmrazor.py
new file mode 100644
index 0000000..dc3090d
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tests/test_downstream/test_mmrazor.py
@@ -0,0 +1,21 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+import copy
+
+import pytest
+from mmcls.models.backbones.base_backbone import BaseBackbone
+
+from mmyolo.testing import get_detector_cfg
+
+
+@pytest.mark.parametrize('cfg_file', [
+    'razor/subnets/'
+    'yolov5_s_spos_shufflenetv2_syncbn_8xb16-300e_coco.py', 'razor/subnets/'
+    'rtmdet_tiny_ofa_lat31_syncbn_16xb16-300e_coco.py', 'razor/subnets/'
+    'yolov6_l_attentivenas_a6_d12_syncbn_fast_8xb32-300e_coco.py'
+])
+def test_razor_backbone_init(cfg_file):
+    model = get_detector_cfg(cfg_file)
+    model_cfg = copy.deepcopy(model.backbone)
+    from mmrazor.registry import MODELS
+    model = MODELS.build(model_cfg)
+    assert isinstance(model, BaseBackbone)
diff --git a/mmdetection_practice/third_party/mmyolo/tests/test_engine/__init__.py b/mmdetection_practice/third_party/mmyolo/tests/test_engine/__init__.py
new file mode 100644
index 0000000..ef101fe
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tests/test_engine/__init__.py
@@ -0,0 +1 @@
+# Copyright (c) OpenMMLab. All rights reserved.
diff --git a/mmdetection_practice/third_party/mmyolo/tests/test_engine/test_hooks/test_switch_to_deploy_hook.py b/mmdetection_practice/third_party/mmyolo/tests/test_engine/test_hooks/test_switch_to_deploy_hook.py
new file mode 100644
index 0000000..52d6e9f
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tests/test_engine/test_hooks/test_switch_to_deploy_hook.py
@@ -0,0 +1,24 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from unittest import TestCase
+from unittest.mock import Mock
+
+from mmyolo.engine.hooks import SwitchToDeployHook
+from mmyolo.models import RepVGGBlock
+from mmyolo.utils import register_all_modules
+
+register_all_modules()
+
+
+class TestSwitchToDeployHook(TestCase):
+
+    def test(self):
+
+        runner = Mock()
+        runner.model = RepVGGBlock(256, 256)
+
+        hook = SwitchToDeployHook()
+        self.assertFalse(runner.model.deploy)
+
+        # test after change mode
+        hook.before_test_epoch(runner)
+        self.assertTrue(runner.model.deploy)
diff --git a/mmdetection_practice/third_party/mmyolo/tests/test_engine/test_hooks/test_yolov5_param_scheduler_hook.py b/mmdetection_practice/third_party/mmyolo/tests/test_engine/test_hooks/test_yolov5_param_scheduler_hook.py
new file mode 100644
index 0000000..1a52733
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tests/test_engine/test_hooks/test_yolov5_param_scheduler_hook.py
@@ -0,0 +1,124 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from unittest import TestCase
+from unittest.mock import Mock
+
+import torch
+from mmengine.config import Config
+from mmengine.optim import build_optim_wrapper
+from mmengine.runner import Runner
+from torch import nn
+from torch.utils.data import Dataset
+
+from mmyolo.engine.hooks import YOLOv5ParamSchedulerHook
+from mmyolo.utils import register_all_modules
+
+
+class ToyModel(nn.Module):
+
+    def __init__(self):
+        super().__init__()
+        self.linear = nn.Linear(2, 1)
+
+    def forward(self, inputs, data_samples, mode='tensor'):
+        labels = torch.stack(data_samples)
+        inputs = torch.stack(inputs)
+        outputs = self.linear(inputs)
+        if mode == 'tensor':
+            return outputs
+        elif mode == 'loss':
+            loss = (labels - outputs).sum()
+            outputs = dict(loss=loss)
+            return outputs
+        else:
+            return outputs
+
+
+class DummyDataset(Dataset):
+    METAINFO = dict()  # type: ignore
+    data = torch.randn(12, 2)
+    label = torch.ones(12)
+
+    @property
+    def metainfo(self):
+        return self.METAINFO
+
+    def __len__(self):
+        return self.data.size(0)
+
+    def __getitem__(self, index):
+        return dict(inputs=self.data[index], data_sample=self.label[index])
+
+
+optim_wrapper = dict(
+    type='OptimWrapper',
+    optimizer=dict(
+        type='SGD',
+        lr=0.01,
+        momentum=0.937,
+        weight_decay=0.0005,
+        nesterov=True,
+        batch_size_per_gpu=1),
+    constructor='YOLOv5OptimizerConstructor')
+
+register_all_modules()
+
+
+class TestYOLOv5ParamSchelerHook(TestCase):
+
+    def test(self):
+        model = ToyModel()
+        train_dataloader = dict(
+            dataset=DummyDataset(),
+            sampler=dict(type='DefaultSampler', shuffle=True),
+            batch_size=3,
+            num_workers=0)
+
+        runner = Mock()
+        runner.model = model
+        runner.optim_wrapper = build_optim_wrapper(model, optim_wrapper)
+        runner.cfg.train_dataloader = Config(train_dataloader)
+        runner.train_dataloader = Runner.build_dataloader(train_dataloader)
+
+        hook = YOLOv5ParamSchedulerHook(
+            scheduler_type='linear', lr_factor=0.01, max_epochs=300)
+
+        # test before train
+        runner.epoch = 0
+        runner.iter = 0
+        hook.before_train(runner)
+
+        for group in runner.optim_wrapper.param_groups:
+            self.assertEqual(group['lr'], 0.01)
+            self.assertEqual(group['momentum'], 0.937)
+
+        self.assertFalse(hook._warmup_end)
+
+        # test after training 10 steps
+        for i in range(10):
+            runner.iter += 1
+            hook.before_train_iter(runner, 0)
+
+        for group_idx, group in enumerate(runner.optim_wrapper.param_groups):
+            if group_idx == 2:
+                self.assertEqual(round(group['lr'], 5), 0.0991)
+            self.assertEqual(group['momentum'], 0.80137)
+            self.assertFalse(hook._warmup_end)
+
+        # test after warm up
+        runner.iter = 1000
+        hook.before_train_iter(runner, 0)
+        self.assertFalse(hook._warmup_end)
+
+        for group in runner.optim_wrapper.param_groups:
+            self.assertEqual(group['lr'], 0.01)
+            self.assertEqual(group['momentum'], 0.937)
+
+        runner.iter = 1001
+        hook.before_train_iter(runner, 0)
+        self.assertTrue(hook._warmup_end)
+
+        # test after train_epoch
+        hook.after_train_epoch(runner)
+        for group in runner.optim_wrapper.param_groups:
+            self.assertEqual(group['lr'], 0.01)
+            self.assertEqual(group['momentum'], 0.937)
diff --git a/mmdetection_practice/third_party/mmyolo/tests/test_engine/test_hooks/test_yolox_mode_switch_hook.py b/mmdetection_practice/third_party/mmyolo/tests/test_engine/test_hooks/test_yolox_mode_switch_hook.py
new file mode 100644
index 0000000..fbe1341
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tests/test_engine/test_hooks/test_yolox_mode_switch_hook.py
@@ -0,0 +1,67 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from unittest import TestCase
+from unittest.mock import Mock
+
+import torch
+from mmengine.config import Config
+from mmengine.runner import Runner
+from torch.utils.data import Dataset
+
+from mmyolo.engine.hooks import YOLOXModeSwitchHook
+from mmyolo.utils import register_all_modules
+
+
+class DummyDataset(Dataset):
+    METAINFO = dict()  # type: ignore
+    data = torch.randn(12, 2)
+    label = torch.ones(12)
+
+    @property
+    def metainfo(self):
+        return self.METAINFO
+
+    def __len__(self):
+        return self.data.size(0)
+
+    def __getitem__(self, index):
+        return dict(inputs=self.data[index], data_sample=self.label[index])
+
+
+pipeline1 = [
+    dict(type='mmdet.Resize'),
+]
+
+pipeline2 = [
+    dict(type='mmdet.RandomFlip'),
+]
+register_all_modules()
+
+
+class TestYOLOXModeSwitchHook(TestCase):
+
+    def test(self):
+        train_dataloader = dict(
+            dataset=DummyDataset(),
+            sampler=dict(type='DefaultSampler', shuffle=True),
+            batch_size=3,
+            num_workers=0)
+
+        runner = Mock()
+        runner.model = Mock()
+        runner.model.module = Mock()
+
+        runner.model.bbox_head.use_bbox_aux = False
+        runner.cfg.train_dataloader = Config(train_dataloader)
+        runner.train_dataloader = Runner.build_dataloader(train_dataloader)
+        runner.train_dataloader.dataset.pipeline = pipeline1
+
+        hook = YOLOXModeSwitchHook(
+            num_last_epochs=15, new_train_pipeline=pipeline2)
+
+        # test after change mode
+        runner.epoch = 284
+        runner.max_epochs = 300
+        hook.before_train_epoch(runner)
+        self.assertTrue(runner.model.bbox_head.use_bbox_aux)
+        self.assertEqual(runner.train_loop.dataloader.dataset.pipeline,
+                         pipeline2)
diff --git a/mmdetection_practice/third_party/mmyolo/tests/test_engine/test_optimizers/__init__.py b/mmdetection_practice/third_party/mmyolo/tests/test_engine/test_optimizers/__init__.py
new file mode 100644
index 0000000..ef101fe
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tests/test_engine/test_optimizers/__init__.py
@@ -0,0 +1 @@
+# Copyright (c) OpenMMLab. All rights reserved.
diff --git a/mmdetection_practice/third_party/mmyolo/tests/test_engine/test_optimizers/test_yolov5_optim_constructor.py b/mmdetection_practice/third_party/mmyolo/tests/test_engine/test_optimizers/test_yolov5_optim_constructor.py
new file mode 100644
index 0000000..4830e5c
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tests/test_engine/test_optimizers/test_yolov5_optim_constructor.py
@@ -0,0 +1,81 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+
+import copy
+from unittest import TestCase
+
+import torch
+import torch.nn as nn
+from mmengine.optim import build_optim_wrapper
+
+from mmyolo.engine import YOLOv5OptimizerConstructor
+from mmyolo.utils import register_all_modules
+
+register_all_modules()
+
+
+class ExampleModel(nn.Module):
+
+    def __init__(self):
+        super().__init__()
+        self.param1 = nn.Parameter(torch.ones(1))
+        self.conv1 = nn.Conv2d(3, 4, kernel_size=1, bias=False)
+        self.conv2 = nn.Conv2d(4, 2, kernel_size=1)
+        self.bn = nn.BatchNorm2d(2)
+
+
+class TestYOLOv5OptimizerConstructor(TestCase):
+
+    def setUp(self):
+        self.model = ExampleModel()
+        self.base_lr = 0.01
+        self.weight_decay = 0.0001
+        self.optim_wrapper_cfg = dict(
+            type='OptimWrapper',
+            optimizer=dict(
+                type='SGD',
+                lr=self.base_lr,
+                momentum=0.9,
+                weight_decay=self.weight_decay,
+                batch_size_per_gpu=16))
+
+    def test_init(self):
+        YOLOv5OptimizerConstructor(copy.deepcopy(self.optim_wrapper_cfg))
+        YOLOv5OptimizerConstructor(
+            copy.deepcopy(self.optim_wrapper_cfg),
+            paramwise_cfg={'base_total_batch_size': 64})
+
+        # `paramwise_cfg` must include `base_total_batch_size` if not None.
+        with self.assertRaises(AssertionError):
+            YOLOv5OptimizerConstructor(
+                copy.deepcopy(self.optim_wrapper_cfg), paramwise_cfg={'a': 64})
+
+    def test_build(self):
+        optim_wrapper = YOLOv5OptimizerConstructor(
+            copy.deepcopy(self.optim_wrapper_cfg))(
+                self.model)
+        # test param_groups
+        assert len(optim_wrapper.optimizer.param_groups) == 3
+        for i in range(3):
+            param_groups_i = optim_wrapper.optimizer.param_groups[i]
+            assert param_groups_i['lr'] == self.base_lr
+            if i == 0:
+                assert param_groups_i['weight_decay'] == self.weight_decay
+            else:
+                assert param_groups_i['weight_decay'] == 0
+
+        # test weight_decay linear scaling
+        optim_wrapper_cfg = copy.deepcopy(self.optim_wrapper_cfg)
+        optim_wrapper_cfg['optimizer']['batch_size_per_gpu'] = 128
+        optim_wrapper = YOLOv5OptimizerConstructor(optim_wrapper_cfg)(
+            self.model)
+        assert optim_wrapper.optimizer.param_groups[0][
+            'weight_decay'] == self.weight_decay * 2
+
+        # test without batch_size_per_gpu
+        optim_wrapper_cfg = copy.deepcopy(self.optim_wrapper_cfg)
+        optim_wrapper_cfg['optimizer'].pop('batch_size_per_gpu')
+        optim_wrapper = dict(
+            optim_wrapper_cfg, constructor='YOLOv5OptimizerConstructor')
+        optim_wrapper = build_optim_wrapper(self.model, optim_wrapper)
+        assert optim_wrapper.optimizer.param_groups[0][
+            'weight_decay'] == self.weight_decay
diff --git a/mmdetection_practice/third_party/mmyolo/tests/test_engine/test_optimizers/test_yolov7_optim_wrapper_constructor.py b/mmdetection_practice/third_party/mmyolo/tests/test_engine/test_optimizers/test_yolov7_optim_wrapper_constructor.py
new file mode 100644
index 0000000..a2f445b
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tests/test_engine/test_optimizers/test_yolov7_optim_wrapper_constructor.py
@@ -0,0 +1,81 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+
+import copy
+from unittest import TestCase
+
+import torch
+import torch.nn as nn
+from mmengine.optim import build_optim_wrapper
+
+from mmyolo.engine import YOLOv7OptimWrapperConstructor
+from mmyolo.utils import register_all_modules
+
+register_all_modules()
+
+
+class ExampleModel(nn.Module):
+
+    def __init__(self):
+        super().__init__()
+        self.param1 = nn.Parameter(torch.ones(1))
+        self.conv1 = nn.Conv2d(3, 4, kernel_size=1, bias=False)
+        self.conv2 = nn.Conv2d(4, 2, kernel_size=1)
+        self.bn = nn.BatchNorm2d(2)
+
+
+class TestYOLOv7OptimWrapperConstructor(TestCase):
+
+    def setUp(self):
+        self.model = ExampleModel()
+        self.base_lr = 0.01
+        self.weight_decay = 0.0001
+        self.optim_wrapper_cfg = dict(
+            type='OptimWrapper',
+            optimizer=dict(
+                type='SGD',
+                lr=self.base_lr,
+                momentum=0.9,
+                weight_decay=self.weight_decay,
+                batch_size_per_gpu=16))
+
+    def test_init(self):
+        YOLOv7OptimWrapperConstructor(copy.deepcopy(self.optim_wrapper_cfg))
+        YOLOv7OptimWrapperConstructor(
+            copy.deepcopy(self.optim_wrapper_cfg),
+            paramwise_cfg={'base_total_batch_size': 64})
+
+        # `paramwise_cfg` must include `base_total_batch_size` if not None.
+        with self.assertRaises(AssertionError):
+            YOLOv7OptimWrapperConstructor(
+                copy.deepcopy(self.optim_wrapper_cfg), paramwise_cfg={'a': 64})
+
+    def test_build(self):
+        optim_wrapper = YOLOv7OptimWrapperConstructor(
+            copy.deepcopy(self.optim_wrapper_cfg))(
+                self.model)
+        # test param_groups
+        assert len(optim_wrapper.optimizer.param_groups) == 3
+        for i in range(3):
+            param_groups_i = optim_wrapper.optimizer.param_groups[i]
+            assert param_groups_i['lr'] == self.base_lr
+            if i == 0:
+                assert param_groups_i['weight_decay'] == self.weight_decay
+            else:
+                assert param_groups_i['weight_decay'] == 0
+
+        # test weight_decay linear scaling
+        optim_wrapper_cfg = copy.deepcopy(self.optim_wrapper_cfg)
+        optim_wrapper_cfg['optimizer']['batch_size_per_gpu'] = 128
+        optim_wrapper = YOLOv7OptimWrapperConstructor(optim_wrapper_cfg)(
+            self.model)
+        assert optim_wrapper.optimizer.param_groups[0][
+            'weight_decay'] == self.weight_decay * 2
+
+        # test without batch_size_per_gpu
+        optim_wrapper_cfg = copy.deepcopy(self.optim_wrapper_cfg)
+        optim_wrapper_cfg['optimizer'].pop('batch_size_per_gpu')
+        optim_wrapper = dict(
+            optim_wrapper_cfg, constructor='YOLOv7OptimWrapperConstructor')
+        optim_wrapper = build_optim_wrapper(self.model, optim_wrapper)
+        assert optim_wrapper.optimizer.param_groups[0][
+            'weight_decay'] == self.weight_decay
diff --git a/mmdetection_practice/third_party/mmyolo/tests/test_models/__init__.py b/mmdetection_practice/third_party/mmyolo/tests/test_models/__init__.py
new file mode 100644
index 0000000..ef101fe
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tests/test_models/__init__.py
@@ -0,0 +1 @@
+# Copyright (c) OpenMMLab. All rights reserved.
diff --git a/mmdetection_practice/third_party/mmyolo/tests/test_models/test_backbone/__init__.py b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_backbone/__init__.py
new file mode 100644
index 0000000..ef101fe
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_backbone/__init__.py
@@ -0,0 +1 @@
+# Copyright (c) OpenMMLab. All rights reserved.
diff --git a/mmdetection_practice/third_party/mmyolo/tests/test_models/test_backbone/test_csp_darknet.py b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_backbone/test_csp_darknet.py
new file mode 100644
index 0000000..82dceb5
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_backbone/test_csp_darknet.py
@@ -0,0 +1,119 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from unittest import TestCase
+
+import pytest
+import torch
+from parameterized import parameterized
+from torch.nn.modules.batchnorm import _BatchNorm
+
+from mmyolo.models.backbones import (YOLOv5CSPDarknet, YOLOv8CSPDarknet,
+                                     YOLOXCSPDarknet)
+from mmyolo.utils import register_all_modules
+from .utils import check_norm_state, is_norm
+
+register_all_modules()
+
+
+class TestCSPDarknet(TestCase):
+
+    @parameterized.expand([(YOLOv5CSPDarknet, ), (YOLOXCSPDarknet, ),
+                           (YOLOv8CSPDarknet, )])
+    def test_init(self, module_class):
+        # out_indices in range(len(arch_setting) + 1)
+        with pytest.raises(AssertionError):
+            module_class(out_indices=(6, ))
+
+        with pytest.raises(ValueError):
+            # frozen_stages must in range(-1, len(arch_setting) + 1)
+            module_class(frozen_stages=6)
+
+    @parameterized.expand([(YOLOv5CSPDarknet, ), (YOLOXCSPDarknet, ),
+                           (YOLOv8CSPDarknet, )])
+    def test_forward(self, module_class):
+        # Test CSPDarknet with first stage frozen
+        frozen_stages = 1
+        model = module_class(frozen_stages=frozen_stages)
+        model.init_weights()
+        model.train()
+
+        for mod in model.stem.modules():
+            for param in mod.parameters():
+                assert param.requires_grad is False
+        for i in range(1, frozen_stages + 1):
+            layer = getattr(model, f'stage{i}')
+            for mod in layer.modules():
+                if isinstance(mod, _BatchNorm):
+                    assert mod.training is False
+            for param in layer.parameters():
+                assert param.requires_grad is False
+
+        # Test CSPDarknet with norm_eval=True
+        model = module_class(norm_eval=True)
+        model.train()
+
+        assert check_norm_state(model.modules(), False)
+
+        # Test CSPDarknet-P5 forward with widen_factor=0.25
+        model = module_class(
+            arch='P5', widen_factor=0.25, out_indices=range(0, 5))
+        model.train()
+
+        imgs = torch.randn(1, 3, 64, 64)
+        feat = model(imgs)
+        assert len(feat) == 5
+        assert feat[0].shape == torch.Size((1, 16, 32, 32))
+        assert feat[1].shape == torch.Size((1, 32, 16, 16))
+        assert feat[2].shape == torch.Size((1, 64, 8, 8))
+        assert feat[3].shape == torch.Size((1, 128, 4, 4))
+        assert feat[4].shape == torch.Size((1, 256, 2, 2))
+
+        # Test CSPDarknet forward with dict(type='ReLU')
+        model = module_class(
+            widen_factor=0.125,
+            act_cfg=dict(type='ReLU'),
+            out_indices=range(0, 5))
+        model.train()
+
+        imgs = torch.randn(1, 3, 64, 64)
+        feat = model(imgs)
+        assert len(feat) == 5
+        assert feat[0].shape == torch.Size((1, 8, 32, 32))
+        assert feat[1].shape == torch.Size((1, 16, 16, 16))
+        assert feat[2].shape == torch.Size((1, 32, 8, 8))
+        assert feat[3].shape == torch.Size((1, 64, 4, 4))
+        assert feat[4].shape == torch.Size((1, 128, 2, 2))
+
+        # Test CSPDarknet with BatchNorm forward
+        model = module_class(widen_factor=0.125, out_indices=range(0, 5))
+        for m in model.modules():
+            if is_norm(m):
+                assert isinstance(m, _BatchNorm)
+        model.train()
+
+        imgs = torch.randn(1, 3, 64, 64)
+        feat = model(imgs)
+        assert len(feat) == 5
+        assert feat[0].shape == torch.Size((1, 8, 32, 32))
+        assert feat[1].shape == torch.Size((1, 16, 16, 16))
+        assert feat[2].shape == torch.Size((1, 32, 8, 8))
+        assert feat[3].shape == torch.Size((1, 64, 4, 4))
+        assert feat[4].shape == torch.Size((1, 128, 2, 2))
+
+        # Test CSPDarknet with Dropout Block
+        model = module_class(plugins=[
+            dict(
+                cfg=dict(type='mmdet.DropBlock', drop_prob=0.1, block_size=3),
+                stages=(False, False, True, True)),
+        ])
+
+        assert len(model.stage1) == 2
+        assert len(model.stage2) == 2
+        assert len(model.stage3) == 3  # +DropBlock
+        assert len(model.stage4) == 4  # +SPPF+DropBlock
+        model.train()
+        imgs = torch.randn(1, 3, 256, 256)
+        feat = model(imgs)
+        assert len(feat) == 3
+        assert feat[0].shape == torch.Size((1, 256, 32, 32))
+        assert feat[1].shape == torch.Size((1, 512, 16, 16))
+        assert feat[2].shape == torch.Size((1, 1024, 8, 8))
diff --git a/mmdetection_practice/third_party/mmyolo/tests/test_models/test_backbone/test_csp_resnet.py b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_backbone/test_csp_resnet.py
new file mode 100644
index 0000000..dd0f3c4
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_backbone/test_csp_resnet.py
@@ -0,0 +1,113 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from unittest import TestCase
+
+import pytest
+import torch
+from torch.nn.modules.batchnorm import _BatchNorm
+
+from mmyolo.models import PPYOLOECSPResNet
+from mmyolo.utils import register_all_modules
+from .utils import check_norm_state, is_norm
+
+register_all_modules()
+
+
+class TestPPYOLOECSPResNet(TestCase):
+
+    def test_init(self):
+        # out_indices in range(len(arch_setting) + 1)
+        with pytest.raises(AssertionError):
+            PPYOLOECSPResNet(out_indices=(6, ))
+
+        with pytest.raises(ValueError):
+            # frozen_stages must in range(-1, len(arch_setting) + 1)
+            PPYOLOECSPResNet(frozen_stages=6)
+
+    def test_forward(self):
+        # Test PPYOLOECSPResNet with first stage frozen
+        frozen_stages = 1
+        model = PPYOLOECSPResNet(frozen_stages=frozen_stages)
+        model.init_weights()
+        model.train()
+
+        for mod in model.stem.modules():
+            for param in mod.parameters():
+                assert param.requires_grad is False
+        for i in range(1, frozen_stages + 1):
+            layer = getattr(model, f'stage{i}')
+            for mod in layer.modules():
+                if isinstance(mod, _BatchNorm):
+                    assert mod.training is False
+            for param in layer.parameters():
+                assert param.requires_grad is False
+
+        # Test PPYOLOECSPResNet with norm_eval=True
+        model = PPYOLOECSPResNet(norm_eval=True)
+        model.train()
+
+        assert check_norm_state(model.modules(), False)
+
+        # Test PPYOLOECSPResNet-P5 forward with widen_factor=0.25
+        model = PPYOLOECSPResNet(
+            arch='P5', widen_factor=0.25, out_indices=range(0, 5))
+        model.train()
+
+        imgs = torch.randn(1, 3, 64, 64)
+        feat = model(imgs)
+        assert len(feat) == 5
+        assert feat[0].shape == torch.Size((1, 16, 32, 32))
+        assert feat[1].shape == torch.Size((1, 32, 16, 16))
+        assert feat[2].shape == torch.Size((1, 64, 8, 8))
+        assert feat[3].shape == torch.Size((1, 128, 4, 4))
+        assert feat[4].shape == torch.Size((1, 256, 2, 2))
+
+        # Test PPYOLOECSPResNet forward with dict(type='ReLU')
+        model = PPYOLOECSPResNet(
+            widen_factor=0.125,
+            act_cfg=dict(type='ReLU'),
+            out_indices=range(0, 5))
+        model.train()
+
+        imgs = torch.randn(1, 3, 64, 64)
+        feat = model(imgs)
+        assert len(feat) == 5
+        assert feat[0].shape == torch.Size((1, 8, 32, 32))
+        assert feat[1].shape == torch.Size((1, 16, 16, 16))
+        assert feat[2].shape == torch.Size((1, 32, 8, 8))
+        assert feat[3].shape == torch.Size((1, 64, 4, 4))
+        assert feat[4].shape == torch.Size((1, 128, 2, 2))
+
+        # Test PPYOLOECSPResNet with BatchNorm forward
+        model = PPYOLOECSPResNet(widen_factor=0.125, out_indices=range(0, 5))
+        for m in model.modules():
+            if is_norm(m):
+                assert isinstance(m, _BatchNorm)
+        model.train()
+
+        imgs = torch.randn(1, 3, 64, 64)
+        feat = model(imgs)
+        assert len(feat) == 5
+        assert feat[0].shape == torch.Size((1, 8, 32, 32))
+        assert feat[1].shape == torch.Size((1, 16, 16, 16))
+        assert feat[2].shape == torch.Size((1, 32, 8, 8))
+        assert feat[3].shape == torch.Size((1, 64, 4, 4))
+        assert feat[4].shape == torch.Size((1, 128, 2, 2))
+
+        # Test PPYOLOECSPResNet with BatchNorm forward
+        model = PPYOLOECSPResNet(plugins=[
+            dict(
+                cfg=dict(type='mmdet.DropBlock', drop_prob=0.1, block_size=3),
+                stages=(False, False, True, True)),
+        ])
+
+        assert len(model.stage1) == 1
+        assert len(model.stage2) == 1
+        assert len(model.stage3) == 2  # +DropBlock
+        assert len(model.stage4) == 2  # +DropBlock
+        model.train()
+        imgs = torch.randn(1, 3, 256, 256)
+        feat = model(imgs)
+        assert len(feat) == 3
+        assert feat[0].shape == torch.Size((1, 256, 32, 32))
+        assert feat[1].shape == torch.Size((1, 512, 16, 16))
+        assert feat[2].shape == torch.Size((1, 1024, 8, 8))
diff --git a/mmdetection_practice/third_party/mmyolo/tests/test_models/test_backbone/test_efficient_rep.py b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_backbone/test_efficient_rep.py
new file mode 100644
index 0000000..53af202
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_backbone/test_efficient_rep.py
@@ -0,0 +1,202 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from unittest import TestCase
+
+import pytest
+import torch
+from torch.nn.modules.batchnorm import _BatchNorm
+
+from mmyolo.models.backbones import YOLOv6CSPBep, YOLOv6EfficientRep
+from mmyolo.utils import register_all_modules
+from .utils import check_norm_state, is_norm
+
+register_all_modules()
+
+
+class TestYOLOv6EfficientRep(TestCase):
+
+    def test_init(self):
+        # out_indices in range(len(arch_setting) + 1)
+        with pytest.raises(AssertionError):
+            YOLOv6EfficientRep(out_indices=(6, ))
+
+        with pytest.raises(ValueError):
+            # frozen_stages must in range(-1, len(arch_setting) + 1)
+            YOLOv6EfficientRep(frozen_stages=6)
+
+    def test_YOLOv6EfficientRep_forward(self):
+        # Test YOLOv6EfficientRep with first stage frozen
+        frozen_stages = 1
+        model = YOLOv6EfficientRep(frozen_stages=frozen_stages)
+        model.init_weights()
+        model.train()
+
+        for mod in model.stem.modules():
+            for param in mod.parameters():
+                assert param.requires_grad is False
+        for i in range(1, frozen_stages + 1):
+            layer = getattr(model, f'stage{i}')
+            for mod in layer.modules():
+                if isinstance(mod, _BatchNorm):
+                    assert mod.training is False
+            for param in layer.parameters():
+                assert param.requires_grad is False
+
+        # Test YOLOv6EfficientRep with norm_eval=True
+        model = YOLOv6EfficientRep(norm_eval=True)
+        model.train()
+
+        assert check_norm_state(model.modules(), False)
+
+        # Test YOLOv6EfficientRep-P5 forward with widen_factor=0.25
+        model = YOLOv6EfficientRep(
+            arch='P5', widen_factor=0.25, out_indices=range(0, 5))
+        model.train()
+
+        imgs = torch.randn(1, 3, 64, 64)
+        feat = model(imgs)
+        assert len(feat) == 5
+        assert feat[0].shape == torch.Size((1, 16, 32, 32))
+        assert feat[1].shape == torch.Size((1, 32, 16, 16))
+        assert feat[2].shape == torch.Size((1, 64, 8, 8))
+        assert feat[3].shape == torch.Size((1, 128, 4, 4))
+        assert feat[4].shape == torch.Size((1, 256, 2, 2))
+
+        # Test YOLOv6EfficientRep forward with dict(type='ReLU')
+        model = YOLOv6EfficientRep(
+            widen_factor=0.125,
+            act_cfg=dict(type='ReLU'),
+            out_indices=range(0, 5))
+        model.train()
+
+        imgs = torch.randn(1, 3, 64, 64)
+        feat = model(imgs)
+        assert len(feat) == 5
+        assert feat[0].shape == torch.Size((1, 8, 32, 32))
+        assert feat[1].shape == torch.Size((1, 16, 16, 16))
+        assert feat[2].shape == torch.Size((1, 32, 8, 8))
+        assert feat[3].shape == torch.Size((1, 64, 4, 4))
+        assert feat[4].shape == torch.Size((1, 128, 2, 2))
+
+        # Test YOLOv6EfficientRep with BatchNorm forward
+        model = YOLOv6EfficientRep(widen_factor=0.125, out_indices=range(0, 5))
+        for m in model.modules():
+            if is_norm(m):
+                assert isinstance(m, _BatchNorm)
+        model.train()
+
+        imgs = torch.randn(1, 3, 64, 64)
+        feat = model(imgs)
+        assert len(feat) == 5
+        assert feat[0].shape == torch.Size((1, 8, 32, 32))
+        assert feat[1].shape == torch.Size((1, 16, 16, 16))
+        assert feat[2].shape == torch.Size((1, 32, 8, 8))
+        assert feat[3].shape == torch.Size((1, 64, 4, 4))
+        assert feat[4].shape == torch.Size((1, 128, 2, 2))
+
+        # Test YOLOv6EfficientRep with BatchNorm forward
+        model = YOLOv6EfficientRep(plugins=[
+            dict(
+                cfg=dict(type='mmdet.DropBlock', drop_prob=0.1, block_size=3),
+                stages=(False, False, True, True)),
+        ])
+
+        assert len(model.stage1) == 1
+        assert len(model.stage2) == 1
+        assert len(model.stage3) == 2  # +DropBlock
+        assert len(model.stage4) == 3  # +SPPF+DropBlock
+        model.train()
+        imgs = torch.randn(1, 3, 256, 256)
+        feat = model(imgs)
+        assert len(feat) == 3
+        assert feat[0].shape == torch.Size((1, 256, 32, 32))
+        assert feat[1].shape == torch.Size((1, 512, 16, 16))
+        assert feat[2].shape == torch.Size((1, 1024, 8, 8))
+
+    def test_YOLOv6CSPBep_forward(self):
+        # Test YOLOv6CSPBep with first stage frozen
+        frozen_stages = 1
+        model = YOLOv6CSPBep(frozen_stages=frozen_stages)
+        model.init_weights()
+        model.train()
+
+        for mod in model.stem.modules():
+            for param in mod.parameters():
+                assert param.requires_grad is False
+        for i in range(1, frozen_stages + 1):
+            layer = getattr(model, f'stage{i}')
+            for mod in layer.modules():
+                if isinstance(mod, _BatchNorm):
+                    assert mod.training is False
+            for param in layer.parameters():
+                assert param.requires_grad is False
+
+        # Test YOLOv6CSPBep with norm_eval=True
+        model = YOLOv6CSPBep(norm_eval=True)
+        model.train()
+
+        assert check_norm_state(model.modules(), False)
+
+        # Test YOLOv6CSPBep forward with widen_factor=0.25
+        model = YOLOv6CSPBep(
+            arch='P5', widen_factor=0.25, out_indices=range(0, 5))
+        model.train()
+
+        imgs = torch.randn(1, 3, 64, 64)
+        feat = model(imgs)
+        assert len(feat) == 5
+        assert feat[0].shape == torch.Size((1, 16, 32, 32))
+        assert feat[1].shape == torch.Size((1, 32, 16, 16))
+        assert feat[2].shape == torch.Size((1, 64, 8, 8))
+        assert feat[3].shape == torch.Size((1, 128, 4, 4))
+        assert feat[4].shape == torch.Size((1, 256, 2, 2))
+
+        # Test YOLOv6CSPBep forward with dict(type='ReLU')
+        model = YOLOv6CSPBep(
+            widen_factor=0.125,
+            act_cfg=dict(type='ReLU'),
+            out_indices=range(0, 5))
+        model.train()
+
+        imgs = torch.randn(1, 3, 64, 64)
+        feat = model(imgs)
+        assert len(feat) == 5
+        assert feat[0].shape == torch.Size((1, 8, 32, 32))
+        assert feat[1].shape == torch.Size((1, 16, 16, 16))
+        assert feat[2].shape == torch.Size((1, 32, 8, 8))
+        assert feat[3].shape == torch.Size((1, 64, 4, 4))
+        assert feat[4].shape == torch.Size((1, 128, 2, 2))
+
+        # Test YOLOv6CSPBep with BatchNorm forward
+        model = YOLOv6CSPBep(widen_factor=0.125, out_indices=range(0, 5))
+        for m in model.modules():
+            if is_norm(m):
+                assert isinstance(m, _BatchNorm)
+        model.train()
+
+        imgs = torch.randn(1, 3, 64, 64)
+        feat = model(imgs)
+        assert len(feat) == 5
+        assert feat[0].shape == torch.Size((1, 8, 32, 32))
+        assert feat[1].shape == torch.Size((1, 16, 16, 16))
+        assert feat[2].shape == torch.Size((1, 32, 8, 8))
+        assert feat[3].shape == torch.Size((1, 64, 4, 4))
+        assert feat[4].shape == torch.Size((1, 128, 2, 2))
+
+        # Test YOLOv6CSPBep with BatchNorm forward
+        model = YOLOv6CSPBep(plugins=[
+            dict(
+                cfg=dict(type='mmdet.DropBlock', drop_prob=0.1, block_size=3),
+                stages=(False, False, True, True)),
+        ])
+
+        assert len(model.stage1) == 1
+        assert len(model.stage2) == 1
+        assert len(model.stage3) == 2  # +DropBlock
+        assert len(model.stage4) == 3  # +SPPF+DropBlock
+        model.train()
+        imgs = torch.randn(1, 3, 256, 256)
+        feat = model(imgs)
+        assert len(feat) == 3
+        assert feat[0].shape == torch.Size((1, 256, 32, 32))
+        assert feat[1].shape == torch.Size((1, 512, 16, 16))
+        assert feat[2].shape == torch.Size((1, 1024, 8, 8))
diff --git a/mmdetection_practice/third_party/mmyolo/tests/test_models/test_backbone/test_yolov7_backbone.py b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_backbone/test_yolov7_backbone.py
new file mode 100644
index 0000000..76b40aa
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_backbone/test_yolov7_backbone.py
@@ -0,0 +1,154 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from unittest import TestCase
+
+import pytest
+import torch
+from torch.nn.modules.batchnorm import _BatchNorm
+
+from mmyolo.models.backbones import YOLOv7Backbone
+from mmyolo.utils import register_all_modules
+from .utils import check_norm_state
+
+register_all_modules()
+
+
+class TestYOLOv7Backbone(TestCase):
+
+    def test_init(self):
+        # out_indices in range(len(arch_setting) + 1)
+        with pytest.raises(AssertionError):
+            YOLOv7Backbone(out_indices=(6, ))
+
+        with pytest.raises(ValueError):
+            # frozen_stages must in range(-1, len(arch_setting) + 1)
+            YOLOv7Backbone(frozen_stages=6)
+
+    def test_forward(self):
+        # Test YOLOv7Backbone-L with first stage frozen
+        frozen_stages = 1
+        model = YOLOv7Backbone(frozen_stages=frozen_stages)
+        model.init_weights()
+        model.train()
+
+        for mod in model.stem.modules():
+            for param in mod.parameters():
+                assert param.requires_grad is False
+        for i in range(1, frozen_stages + 1):
+            layer = getattr(model, f'stage{i}')
+            for mod in layer.modules():
+                if isinstance(mod, _BatchNorm):
+                    assert mod.training is False
+            for param in layer.parameters():
+                assert param.requires_grad is False
+
+        # Test YOLOv7Backbone-L with norm_eval=True
+        model = YOLOv7Backbone(norm_eval=True)
+        model.train()
+
+        assert check_norm_state(model.modules(), False)
+
+        # Test YOLOv7Backbone-L forward with widen_factor=0.25
+        model = YOLOv7Backbone(
+            widen_factor=0.25, out_indices=tuple(range(0, 5)))
+        model.train()
+
+        imgs = torch.randn(1, 3, 64, 64)
+        feat = model(imgs)
+        assert len(feat) == 5
+        assert feat[0].shape == torch.Size((1, 16, 32, 32))
+        assert feat[1].shape == torch.Size((1, 64, 16, 16))
+        assert feat[2].shape == torch.Size((1, 128, 8, 8))
+        assert feat[3].shape == torch.Size((1, 256, 4, 4))
+        assert feat[4].shape == torch.Size((1, 256, 2, 2))
+
+        # Test YOLOv7Backbone-L with plugins
+        model = YOLOv7Backbone(
+            widen_factor=0.25,
+            plugins=[
+                dict(
+                    cfg=dict(
+                        type='mmdet.DropBlock', drop_prob=0.1, block_size=3),
+                    stages=(False, False, True, True)),
+            ])
+
+        assert len(model.stage1) == 2
+        assert len(model.stage2) == 2
+        assert len(model.stage3) == 3  # +DropBlock
+        assert len(model.stage4) == 3  # +DropBlock
+        model.train()
+        imgs = torch.randn(1, 3, 128, 128)
+        feat = model(imgs)
+        assert len(feat) == 3
+        assert feat[0].shape == torch.Size((1, 128, 16, 16))
+        assert feat[1].shape == torch.Size((1, 256, 8, 8))
+        assert feat[2].shape == torch.Size((1, 256, 4, 4))
+
+        # Test YOLOv7Backbone-X forward with widen_factor=0.25
+        model = YOLOv7Backbone(arch='X', widen_factor=0.25)
+        model.train()
+
+        imgs = torch.randn(1, 3, 64, 64)
+        feat = model(imgs)
+        assert len(feat) == 3
+        assert feat[0].shape == torch.Size((1, 160, 8, 8))
+        assert feat[1].shape == torch.Size((1, 320, 4, 4))
+        assert feat[2].shape == torch.Size((1, 320, 2, 2))
+
+        # Test YOLOv7Backbone-tiny forward with widen_factor=0.25
+        model = YOLOv7Backbone(arch='Tiny', widen_factor=0.25)
+        model.train()
+
+        feat = model(imgs)
+        assert len(feat) == 3
+        assert feat[0].shape == torch.Size((1, 32, 8, 8))
+        assert feat[1].shape == torch.Size((1, 64, 4, 4))
+        assert feat[2].shape == torch.Size((1, 128, 2, 2))
+
+        # Test YOLOv7Backbone-w forward with widen_factor=0.25
+        model = YOLOv7Backbone(
+            arch='W', widen_factor=0.25, out_indices=(2, 3, 4, 5))
+        model.train()
+
+        imgs = torch.randn(1, 3, 128, 128)
+        feat = model(imgs)
+        assert len(feat) == 4
+        assert feat[0].shape == torch.Size((1, 64, 16, 16))
+        assert feat[1].shape == torch.Size((1, 128, 8, 8))
+        assert feat[2].shape == torch.Size((1, 192, 4, 4))
+        assert feat[3].shape == torch.Size((1, 256, 2, 2))
+
+        # Test YOLOv7Backbone-w forward with widen_factor=0.25
+        model = YOLOv7Backbone(
+            arch='D', widen_factor=0.25, out_indices=(2, 3, 4, 5))
+        model.train()
+
+        feat = model(imgs)
+        assert len(feat) == 4
+        assert feat[0].shape == torch.Size((1, 96, 16, 16))
+        assert feat[1].shape == torch.Size((1, 192, 8, 8))
+        assert feat[2].shape == torch.Size((1, 288, 4, 4))
+        assert feat[3].shape == torch.Size((1, 384, 2, 2))
+
+        # Test YOLOv7Backbone-w forward with widen_factor=0.25
+        model = YOLOv7Backbone(
+            arch='E', widen_factor=0.25, out_indices=(2, 3, 4, 5))
+        model.train()
+
+        feat = model(imgs)
+        assert len(feat) == 4
+        assert feat[0].shape == torch.Size((1, 80, 16, 16))
+        assert feat[1].shape == torch.Size((1, 160, 8, 8))
+        assert feat[2].shape == torch.Size((1, 240, 4, 4))
+        assert feat[3].shape == torch.Size((1, 320, 2, 2))
+
+        # Test YOLOv7Backbone-w forward with widen_factor=0.25
+        model = YOLOv7Backbone(
+            arch='E2E', widen_factor=0.25, out_indices=(2, 3, 4, 5))
+        model.train()
+
+        feat = model(imgs)
+        assert len(feat) == 4
+        assert feat[0].shape == torch.Size((1, 80, 16, 16))
+        assert feat[1].shape == torch.Size((1, 160, 8, 8))
+        assert feat[2].shape == torch.Size((1, 240, 4, 4))
+        assert feat[3].shape == torch.Size((1, 320, 2, 2))
diff --git a/mmdetection_practice/third_party/mmyolo/tests/test_models/test_backbone/utils.py b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_backbone/utils.py
new file mode 100644
index 0000000..d65db56
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_backbone/utils.py
@@ -0,0 +1,31 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from mmdet.models.backbones.res2net import Bottle2neck
+from mmdet.models.backbones.resnet import BasicBlock, Bottleneck
+from mmdet.models.backbones.resnext import Bottleneck as BottleneckX
+from mmdet.models.layers import SimplifiedBasicBlock
+from torch.nn.modules import GroupNorm
+from torch.nn.modules.batchnorm import _BatchNorm
+
+
+def is_block(modules):
+    """Check if is ResNet building block."""
+    if isinstance(modules, (BasicBlock, Bottleneck, BottleneckX, Bottle2neck,
+                            SimplifiedBasicBlock)):
+        return True
+    return False
+
+
+def is_norm(modules):
+    """Check if is one of the norms."""
+    if isinstance(modules, (GroupNorm, _BatchNorm)):
+        return True
+    return False
+
+
+def check_norm_state(modules, train_state):
+    """Check if norm layer is in correct train state."""
+    for mod in modules:
+        if isinstance(mod, _BatchNorm):
+            if mod.training != train_state:
+                return False
+    return True
diff --git a/mmdetection_practice/third_party/mmyolo/tests/test_models/test_data_preprocessor/__init__.py b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_data_preprocessor/__init__.py
new file mode 100644
index 0000000..ef101fe
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_data_preprocessor/__init__.py
@@ -0,0 +1 @@
+# Copyright (c) OpenMMLab. All rights reserved.
diff --git a/mmdetection_practice/third_party/mmyolo/tests/test_models/test_data_preprocessor/test_data_preprocessor.py b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_data_preprocessor/test_data_preprocessor.py
new file mode 100644
index 0000000..2c7e441
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_data_preprocessor/test_data_preprocessor.py
@@ -0,0 +1,156 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from unittest import TestCase
+
+import torch
+from mmdet.structures import DetDataSample
+from mmengine import MessageHub
+
+from mmyolo.models import PPYOLOEBatchRandomResize, PPYOLOEDetDataPreprocessor
+from mmyolo.models.data_preprocessors import (YOLOv5DetDataPreprocessor,
+                                              YOLOXBatchSyncRandomResize)
+from mmyolo.utils import register_all_modules
+
+register_all_modules()
+
+
+class TestYOLOv5DetDataPreprocessor(TestCase):
+
+    def test_forward(self):
+        processor = YOLOv5DetDataPreprocessor(mean=[0, 0, 0], std=[1, 1, 1])
+
+        data = {
+            'inputs': [torch.randint(0, 256, (3, 11, 10))],
+            'data_samples': [DetDataSample()]
+        }
+        out_data = processor(data, training=False)
+        batch_inputs, batch_data_samples = out_data['inputs'], out_data[
+            'data_samples']
+
+        self.assertEqual(batch_inputs.shape, (1, 3, 11, 10))
+        self.assertEqual(len(batch_data_samples), 1)
+
+        # test channel_conversion
+        processor = YOLOv5DetDataPreprocessor(
+            mean=[0., 0., 0.], std=[1., 1., 1.], bgr_to_rgb=True)
+        out_data = processor(data, training=False)
+        batch_inputs, batch_data_samples = out_data['inputs'], out_data[
+            'data_samples']
+        self.assertEqual(batch_inputs.shape, (1, 3, 11, 10))
+        self.assertEqual(len(batch_data_samples), 1)
+
+        # test padding, training=False
+        data = {
+            'inputs': [
+                torch.randint(0, 256, (3, 10, 11)),
+                torch.randint(0, 256, (3, 9, 14))
+            ]
+        }
+        processor = YOLOv5DetDataPreprocessor(
+            mean=[0., 0., 0.], std=[1., 1., 1.], bgr_to_rgb=True)
+        out_data = processor(data, training=False)
+        batch_inputs, batch_data_samples = out_data['inputs'], out_data[
+            'data_samples']
+        self.assertEqual(batch_inputs.shape, (2, 3, 10, 14))
+        self.assertIsNone(batch_data_samples)
+
+        # test training
+        data = {
+            'inputs': torch.randint(0, 256, (2, 3, 10, 11)),
+            'data_samples': {
+                'bboxes_labels': torch.randint(0, 11, (18, 6))
+            },
+        }
+        out_data = processor(data, training=True)
+        batch_inputs, batch_data_samples = out_data['inputs'], out_data[
+            'data_samples']
+        self.assertIn('img_metas', batch_data_samples)
+        self.assertIn('bboxes_labels', batch_data_samples)
+        self.assertEqual(batch_inputs.shape, (2, 3, 10, 11))
+        self.assertIsInstance(batch_data_samples['bboxes_labels'],
+                              torch.Tensor)
+        self.assertIsInstance(batch_data_samples['img_metas'], list)
+
+        data = {
+            'inputs': [torch.randint(0, 256, (3, 11, 10))],
+            'data_samples': [DetDataSample()]
+        }
+        # data_samples must be dict
+        with self.assertRaises(AssertionError):
+            processor(data, training=True)
+
+
+class TestPPYOLOEDetDataPreprocessor(TestCase):
+
+    def test_batch_random_resize(self):
+        processor = PPYOLOEDetDataPreprocessor(
+            pad_size_divisor=32,
+            batch_augments=[
+                dict(
+                    type='PPYOLOEBatchRandomResize',
+                    random_size_range=(320, 480),
+                    interval=1,
+                    size_divisor=32,
+                    random_interp=True,
+                    keep_ratio=False)
+            ],
+            mean=[0., 0., 0.],
+            std=[255., 255., 255.],
+            bgr_to_rgb=True)
+        self.assertTrue(
+            isinstance(processor.batch_augments[0], PPYOLOEBatchRandomResize))
+        message_hub = MessageHub.get_instance('test_batch_random_resize')
+        message_hub.update_info('iter', 0)
+
+        # test training
+        data = {
+            'inputs': [
+                torch.randint(0, 256, (3, 10, 11)),
+                torch.randint(0, 256, (3, 10, 11))
+            ],
+            'data_samples': {
+                'bboxes_labels': torch.randint(0, 11, (18, 6)).float()
+            },
+        }
+        out_data = processor(data, training=True)
+        batch_data_samples = out_data['data_samples']
+        self.assertIn('img_metas', batch_data_samples)
+        self.assertIn('bboxes_labels', batch_data_samples)
+        self.assertIsInstance(batch_data_samples['bboxes_labels'],
+                              torch.Tensor)
+        self.assertIsInstance(batch_data_samples['img_metas'], list)
+
+        data = {
+            'inputs': [torch.randint(0, 256, (3, 11, 10))],
+            'data_samples': DetDataSample()
+        }
+        # data_samples must be list
+        with self.assertRaises(AssertionError):
+            processor(data, training=True)
+
+
+class TestYOLOXDetDataPreprocessor(TestCase):
+
+    def test_batch_sync_random_size(self):
+        processor = YOLOXBatchSyncRandomResize(
+            random_size_range=(480, 800), size_divisor=32, interval=1)
+        self.assertTrue(isinstance(processor, YOLOXBatchSyncRandomResize))
+        message_hub = MessageHub.get_instance(
+            'test_yolox_batch_sync_random_resize')
+        message_hub.update_info('iter', 0)
+
+        # test training
+        inputs = torch.randint(0, 256, (4, 3, 10, 11))
+        data_samples = {'bboxes_labels': torch.randint(0, 11, (18, 6)).float()}
+
+        inputs, data_samples = processor(inputs, data_samples)
+
+        self.assertIn('bboxes_labels', data_samples)
+        self.assertIsInstance(data_samples['bboxes_labels'], torch.Tensor)
+        self.assertIsInstance(inputs, torch.Tensor)
+
+        inputs = torch.randint(0, 256, (4, 3, 10, 11))
+        data_samples = DetDataSample()
+
+        # data_samples must be dict
+        with self.assertRaises(AssertionError):
+            processor(inputs, data_samples)
diff --git a/mmdetection_practice/third_party/mmyolo/tests/test_models/test_dense_heads/__init__.py b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_dense_heads/__init__.py
new file mode 100644
index 0000000..ef101fe
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_dense_heads/__init__.py
@@ -0,0 +1 @@
+# Copyright (c) OpenMMLab. All rights reserved.
diff --git a/mmdetection_practice/third_party/mmyolo/tests/test_models/test_dense_heads/test_ppyoloe_head.py b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_dense_heads/test_ppyoloe_head.py
new file mode 100644
index 0000000..20e0c45
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_dense_heads/test_ppyoloe_head.py
@@ -0,0 +1,205 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from unittest import TestCase
+
+import torch
+from mmengine import ConfigDict, MessageHub
+from mmengine.config import Config
+from mmengine.model import bias_init_with_prob
+from mmengine.testing import assert_allclose
+
+from mmyolo.models import PPYOLOEHead
+from mmyolo.utils import register_all_modules
+
+register_all_modules()
+
+
+class TestPPYOLOEHead(TestCase):
+
+    def setUp(self):
+        self.head_module = dict(
+            type='PPYOLOEHeadModule',
+            num_classes=4,
+            in_channels=[32, 64, 128],
+            featmap_strides=(8, 16, 32))
+
+    def test_init_weights(self):
+        head = PPYOLOEHead(head_module=self.head_module)
+        head.head_module.init_weights()
+        bias_init = bias_init_with_prob(0.01)
+        for conv_cls, conv_reg in zip(head.head_module.cls_preds,
+                                      head.head_module.reg_preds):
+            assert_allclose(conv_cls.weight.data,
+                            torch.zeros_like(conv_cls.weight.data))
+            assert_allclose(conv_reg.weight.data,
+                            torch.zeros_like(conv_reg.weight.data))
+
+            assert_allclose(conv_cls.bias.data,
+                            torch.ones_like(conv_cls.bias.data) * bias_init)
+            assert_allclose(conv_reg.bias.data,
+                            torch.ones_like(conv_reg.bias.data))
+
+    def test_predict_by_feat(self):
+        s = 256
+        img_metas = [{
+            'img_shape': (s, s, 3),
+            'ori_shape': (s, s, 3),
+            'scale_factor': (1.0, 1.0),
+        }]
+        test_cfg = Config(
+            dict(
+                multi_label=True,
+                nms_pre=1000,
+                score_thr=0.01,
+                nms=dict(type='nms', iou_threshold=0.7),
+                max_per_img=300))
+
+        head = PPYOLOEHead(head_module=self.head_module, test_cfg=test_cfg)
+        head.eval()
+        feat = [
+            torch.rand(1, in_channels, s // feat_size, s // feat_size)
+            for in_channels, feat_size in [[32, 8], [64, 16], [128, 32]]
+        ]
+        cls_scores, bbox_preds = head.forward(feat)
+        head.predict_by_feat(
+            cls_scores,
+            bbox_preds,
+            None,
+            img_metas,
+            cfg=test_cfg,
+            rescale=True,
+            with_nms=True)
+        head.predict_by_feat(
+            cls_scores,
+            bbox_preds,
+            None,
+            img_metas,
+            cfg=test_cfg,
+            rescale=False,
+            with_nms=False)
+
+    def test_loss_by_feat(self):
+        message_hub = MessageHub.get_instance('test_ppyoloe_loss_by_feat')
+        message_hub.update_info('epoch', 1)
+
+        s = 256
+        img_metas = [{
+            'img_shape': (s, s, 3),
+            'batch_input_shape': (s, s),
+            'scale_factor': 1,
+        }]
+
+        head = PPYOLOEHead(
+            head_module=self.head_module,
+            train_cfg=ConfigDict(
+                initial_epoch=31,
+                initial_assigner=dict(
+                    type='BatchATSSAssigner',
+                    num_classes=4,
+                    topk=9,
+                    iou_calculator=dict(type='mmdet.BboxOverlaps2D')),
+                assigner=dict(
+                    type='BatchTaskAlignedAssigner',
+                    num_classes=4,
+                    topk=13,
+                    alpha=1,
+                    beta=6)))
+        head.train()
+
+        feat = []
+        for i in range(len(self.head_module['in_channels'])):
+            in_channel = self.head_module['in_channels'][i]
+            feat_size = self.head_module['featmap_strides'][i]
+            feat.append(
+                torch.rand(1, in_channel, s // feat_size, s // feat_size))
+
+        cls_scores, bbox_preds, bbox_dist_preds = head.forward(feat)
+
+        # Test that empty ground truth encourages the network to predict
+        # background
+        gt_instances = torch.empty((0, 6), dtype=torch.float32)
+
+        empty_gt_losses = head.loss_by_feat(cls_scores, bbox_preds,
+                                            bbox_dist_preds, gt_instances,
+                                            img_metas)
+        # When there is no truth, the cls loss should be nonzero but there
+        # should be no box loss.
+        empty_cls_loss = empty_gt_losses['loss_cls'].sum()
+        empty_box_loss = empty_gt_losses['loss_bbox'].sum()
+        empty_dfl_loss = empty_gt_losses['loss_dfl'].sum()
+        self.assertGreater(empty_cls_loss.item(), 0,
+                           'cls loss should be non-zero')
+        self.assertEqual(
+            empty_box_loss.item(), 0,
+            'there should be no box loss when there are no true boxes')
+        self.assertEqual(
+            empty_dfl_loss.item(), 0,
+            'there should be df loss when there are no true boxes')
+
+        # When truth is non-empty then both cls and box loss should be nonzero
+        # for random inputs
+        head = PPYOLOEHead(
+            head_module=self.head_module,
+            train_cfg=ConfigDict(
+                initial_epoch=31,
+                initial_assigner=dict(
+                    type='BatchATSSAssigner',
+                    num_classes=4,
+                    topk=9,
+                    iou_calculator=dict(type='mmdet.BboxOverlaps2D')),
+                assigner=dict(
+                    type='BatchTaskAlignedAssigner',
+                    num_classes=4,
+                    topk=13,
+                    alpha=1,
+                    beta=6)))
+        head.train()
+        gt_instances = torch.Tensor(
+            [[0., 0., 23.6667, 23.8757, 238.6326, 151.8874]])
+
+        one_gt_losses = head.loss_by_feat(cls_scores, bbox_preds,
+                                          bbox_dist_preds, gt_instances,
+                                          img_metas)
+        onegt_cls_loss = one_gt_losses['loss_cls'].sum()
+        onegt_box_loss = one_gt_losses['loss_bbox'].sum()
+        onegt_loss_dfl = one_gt_losses['loss_dfl'].sum()
+        self.assertGreater(onegt_cls_loss.item(), 0,
+                           'cls loss should be non-zero')
+        self.assertGreater(onegt_box_loss.item(), 0,
+                           'box loss should be non-zero')
+        self.assertGreater(onegt_loss_dfl.item(), 0,
+                           'obj loss should be non-zero')
+
+        # test num_class = 1
+        self.head_module['num_classes'] = 1
+        head = PPYOLOEHead(
+            head_module=self.head_module,
+            train_cfg=ConfigDict(
+                initial_epoch=31,
+                initial_assigner=dict(
+                    type='BatchATSSAssigner',
+                    num_classes=1,
+                    topk=9,
+                    iou_calculator=dict(type='mmdet.BboxOverlaps2D')),
+                assigner=dict(
+                    type='BatchTaskAlignedAssigner',
+                    num_classes=1,
+                    topk=13,
+                    alpha=1,
+                    beta=6)))
+        head.train()
+        gt_instances = torch.Tensor(
+            [[0., 0., 23.6667, 23.8757, 238.6326, 151.8874]])
+        cls_scores, bbox_preds, bbox_dist_preds = head.forward(feat)
+
+        one_gt_losses = head.loss_by_feat(cls_scores, bbox_preds,
+                                          bbox_dist_preds, gt_instances,
+                                          img_metas)
+        onegt_cls_loss = one_gt_losses['loss_cls'].sum()
+        onegt_box_loss = one_gt_losses['loss_bbox'].sum()
+        onegt_loss_dfl = one_gt_losses['loss_dfl'].sum()
+        self.assertGreater(onegt_cls_loss.item(), 0,
+                           'cls loss should be non-zero')
+        self.assertGreater(onegt_box_loss.item(), 0,
+                           'box loss should be non-zero')
+        self.assertGreater(onegt_loss_dfl.item(), 0,
+                           'obj loss should be non-zero')
diff --git a/mmdetection_practice/third_party/mmyolo/tests/test_models/test_dense_heads/test_rotated_rtmdet_head.py b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_dense_heads/test_rotated_rtmdet_head.py
new file mode 100644
index 0000000..21e1d4d
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_dense_heads/test_rotated_rtmdet_head.py
@@ -0,0 +1,264 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from unittest import TestCase
+
+import pytest
+import torch
+from mmengine.config import Config
+from mmengine.structures import InstanceData
+
+from mmyolo.models.dense_heads import RTMDetRotatedHead
+from mmyolo.utils import register_all_modules
+
+register_all_modules()
+
+
+class TestRTMDetRotatedHead(TestCase):
+
+    def setUp(self):
+        self.head_module = dict(
+            type='RTMDetRotatedSepBNHeadModule',
+            num_classes=4,
+            in_channels=1,
+            stacked_convs=1,
+            feat_channels=64,
+            featmap_strides=[4, 8, 16])
+
+    def test_init_weights(self):
+        head = RTMDetRotatedHead(head_module=self.head_module)
+        head.head_module.init_weights()
+
+    def test_predict_by_feat(self):
+        s = 256
+        img_metas = [{
+            'img_shape': (s, s, 3),
+            'ori_shape': (s, s, 3),
+            'scale_factor': (1.0, 1.0),
+        }]
+        test_cfg = dict(
+            multi_label=True,
+            decode_with_angle=True,
+            nms_pre=2000,
+            score_thr=0.01,
+            nms=dict(type='nms_rotated', iou_threshold=0.1),
+            max_per_img=300)
+        test_cfg = Config(test_cfg)
+
+        head = RTMDetRotatedHead(
+            head_module=self.head_module, test_cfg=test_cfg)
+        feat = [
+            torch.rand(1, 1, s // feat_size, s // feat_size)
+            for feat_size in [4, 8, 16]
+        ]
+        cls_scores, bbox_preds, angle_preds = head.forward(feat)
+        head.predict_by_feat(
+            cls_scores,
+            bbox_preds,
+            angle_preds,
+            batch_img_metas=img_metas,
+            cfg=test_cfg,
+            rescale=True,
+            with_nms=True)
+        head.predict_by_feat(
+            cls_scores,
+            bbox_preds,
+            angle_preds,
+            batch_img_metas=img_metas,
+            cfg=test_cfg,
+            rescale=False,
+            with_nms=False)
+
+    def test_loss_by_feat(self):
+        if not torch.cuda.is_available():
+            pytest.skip('test requires GPU and torch+cuda')
+
+        s = 256
+        img_metas = [{
+            'img_shape': (s, s, 3),
+            'batch_input_shape': (s, s),
+            'scale_factor': 1,
+        }]
+        train_cfg = dict(
+            assigner=dict(
+                type='BatchDynamicSoftLabelAssigner',
+                num_classes=80,
+                topk=13,
+                iou_calculator=dict(type='mmrotate.RBboxOverlaps2D'),
+                batch_iou=False),
+            allowed_border=-1,
+            pos_weight=-1,
+            debug=False)
+        train_cfg = Config(train_cfg)
+        head = RTMDetRotatedHead(
+            head_module=self.head_module, train_cfg=train_cfg).cuda()
+
+        feat = [
+            torch.rand(1, 1, s // feat_size, s // feat_size).cuda()
+            for feat_size in [4, 8, 16]
+        ]
+        cls_scores, bbox_preds, angle_preds = head.forward(feat)
+
+        # Test that empty ground truth encourages the network to predict
+        # background
+        gt_instances = InstanceData(
+            bboxes=torch.empty((0, 5)).cuda(),
+            labels=torch.LongTensor([]).cuda())
+
+        empty_gt_losses = head.loss_by_feat(cls_scores, bbox_preds,
+                                            angle_preds, [gt_instances],
+                                            img_metas)
+        # When there is no truth, the cls loss should be nonzero but there
+        # should be no box loss.
+        empty_cls_loss = empty_gt_losses['loss_cls'].sum()
+        empty_box_loss = empty_gt_losses['loss_bbox'].sum()
+        self.assertGreater(empty_cls_loss.item(), 0,
+                           'classification loss should be non-zero')
+        self.assertEqual(
+            empty_box_loss.item(), 0,
+            'there should be no box loss when there are no true boxes')
+
+        # When truth is non-empty then both cls and box loss should be nonzero
+        # for random inputs
+        head = RTMDetRotatedHead(
+            head_module=self.head_module, train_cfg=train_cfg).cuda()
+        gt_instances = InstanceData(
+            bboxes=torch.Tensor([[130.6667, 86.8757, 100.6326, 70.8874,
+                                  0.2]]).cuda(),
+            labels=torch.LongTensor([1]).cuda())
+
+        one_gt_losses = head.loss_by_feat(cls_scores, bbox_preds, angle_preds,
+                                          [gt_instances], img_metas)
+        onegt_cls_loss = one_gt_losses['loss_cls'].sum()
+        onegt_box_loss = one_gt_losses['loss_bbox'].sum()
+        self.assertGreater(onegt_cls_loss.item(), 0,
+                           'cls loss should be non-zero')
+        self.assertGreater(onegt_box_loss.item(), 0,
+                           'box loss should be non-zero')
+
+        # test num_class = 1
+        self.head_module['num_classes'] = 1
+        head = RTMDetRotatedHead(
+            head_module=self.head_module, train_cfg=train_cfg).cuda()
+        gt_instances = InstanceData(
+            bboxes=torch.Tensor([[130.6667, 86.8757, 100.6326, 70.8874,
+                                  0.2]]).cuda(),
+            labels=torch.LongTensor([0]).cuda())
+
+        cls_scores, bbox_preds, angle_preds = head.forward(feat)
+
+        one_gt_losses = head.loss_by_feat(cls_scores, bbox_preds, angle_preds,
+                                          [gt_instances], img_metas)
+        onegt_cls_loss = one_gt_losses['loss_cls'].sum()
+        onegt_box_loss = one_gt_losses['loss_bbox'].sum()
+        self.assertGreater(onegt_cls_loss.item(), 0,
+                           'cls loss should be non-zero')
+        self.assertGreater(onegt_box_loss.item(), 0,
+                           'box loss should be non-zero')
+
+    def test_hbb_loss_by_feat(self):
+
+        s = 256
+        img_metas = [{
+            'img_shape': (s, s, 3),
+            'batch_input_shape': (s, s),
+            'scale_factor': 1,
+        }]
+        train_cfg = dict(
+            assigner=dict(
+                type='BatchDynamicSoftLabelAssigner',
+                num_classes=80,
+                topk=13,
+                iou_calculator=dict(type='mmrotate.RBboxOverlaps2D'),
+                batch_iou=False),
+            allowed_border=-1,
+            pos_weight=-1,
+            debug=False)
+        train_cfg = Config(train_cfg)
+        hbb_cfg = dict(
+            bbox_coder=dict(
+                type='DistanceAnglePointCoder', angle_version='le90'),
+            loss_bbox=dict(type='mmdet.GIoULoss', loss_weight=2.0),
+            angle_coder=dict(
+                type='mmrotate.CSLCoder',
+                angle_version='le90',
+                omega=1,
+                window='gaussian',
+                radius=1),
+            loss_angle=dict(
+                type='mmrotate.SmoothFocalLoss',
+                gamma=2.0,
+                alpha=0.25,
+                loss_weight=0.2),
+            use_hbbox_loss=True,
+        )
+        head = RTMDetRotatedHead(
+            head_module=self.head_module, **hbb_cfg, train_cfg=train_cfg)
+
+        feat = [
+            torch.rand(1, 1, s // feat_size, s // feat_size)
+            for feat_size in [4, 8, 16]
+        ]
+        cls_scores, bbox_preds, angle_preds = head.forward(feat)
+
+        # Test that empty ground truth encourages the network to predict
+        # background
+        gt_instances = InstanceData(
+            bboxes=torch.empty((0, 5)), labels=torch.LongTensor([]))
+
+        empty_gt_losses = head.loss_by_feat(cls_scores, bbox_preds,
+                                            angle_preds, [gt_instances],
+                                            img_metas)
+        # When there is no truth, the cls loss should be nonzero but there
+        # should be no box loss.
+        empty_cls_loss = empty_gt_losses['loss_cls'].sum()
+        empty_box_loss = empty_gt_losses['loss_bbox'].sum()
+        empty_angle_loss = empty_gt_losses['loss_angle'].sum()
+        self.assertGreater(empty_cls_loss.item(), 0,
+                           'classification loss should be non-zero')
+        self.assertEqual(
+            empty_box_loss.item(), 0,
+            'there should be no box loss when there are no true boxes')
+        self.assertEqual(
+            empty_angle_loss.item(), 0,
+            'there should be no angle loss when there are no true boxes')
+
+        # When truth is non-empty then both cls and box loss should be nonzero
+        # for random inputs
+        head = RTMDetRotatedHead(
+            head_module=self.head_module, **hbb_cfg, train_cfg=train_cfg)
+        gt_instances = InstanceData(
+            bboxes=torch.Tensor([[130.6667, 86.8757, 100.6326, 70.8874, 0.2]]),
+            labels=torch.LongTensor([1]))
+
+        one_gt_losses = head.loss_by_feat(cls_scores, bbox_preds, angle_preds,
+                                          [gt_instances], img_metas)
+        onegt_cls_loss = one_gt_losses['loss_cls'].sum()
+        onegt_box_loss = one_gt_losses['loss_bbox'].sum()
+        onegt_angle_loss = one_gt_losses['loss_angle'].sum()
+        self.assertGreater(onegt_cls_loss.item(), 0,
+                           'cls loss should be non-zero')
+        self.assertGreater(onegt_box_loss.item(), 0,
+                           'box loss should be non-zero')
+        self.assertGreater(onegt_angle_loss.item(), 0,
+                           'angle loss should be non-zero')
+
+        # test num_class = 1
+        self.head_module['num_classes'] = 1
+        head = RTMDetRotatedHead(
+            head_module=self.head_module, **hbb_cfg, train_cfg=train_cfg)
+        gt_instances = InstanceData(
+            bboxes=torch.Tensor([[130.6667, 86.8757, 100.6326, 70.8874, 0.2]]),
+            labels=torch.LongTensor([0]))
+
+        cls_scores, bbox_preds, angle_preds = head.forward(feat)
+
+        one_gt_losses = head.loss_by_feat(cls_scores, bbox_preds, angle_preds,
+                                          [gt_instances], img_metas)
+        onegt_cls_loss = one_gt_losses['loss_cls'].sum()
+        onegt_box_loss = one_gt_losses['loss_bbox'].sum()
+        onegt_angle_loss = one_gt_losses['loss_angle'].sum()
+        self.assertGreater(onegt_cls_loss.item(), 0,
+                           'cls loss should be non-zero')
+        self.assertGreater(onegt_box_loss.item(), 0,
+                           'box loss should be non-zero')
+        self.assertGreater(onegt_angle_loss.item(), 0,
+                           'angle loss should be non-zero')
diff --git a/mmdetection_practice/third_party/mmyolo/tests/test_models/test_dense_heads/test_rtmdet_head.py b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_dense_heads/test_rtmdet_head.py
new file mode 100644
index 0000000..cce5ee6
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_dense_heads/test_rtmdet_head.py
@@ -0,0 +1,223 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from unittest import TestCase
+
+import numpy as np
+import torch
+from mmengine.config import Config
+from mmengine.structures import InstanceData
+
+from mmyolo.models import RTMDetInsSepBNHead
+from mmyolo.models.dense_heads import RTMDetHead
+from mmyolo.utils import register_all_modules
+
+register_all_modules()
+
+
+class TestRTMDetHead(TestCase):
+
+    def setUp(self):
+        self.head_module = dict(
+            type='RTMDetSepBNHeadModule',
+            num_classes=4,
+            in_channels=1,
+            stacked_convs=1,
+            feat_channels=64,
+            featmap_strides=[4, 8, 16])
+
+    def test_init_weights(self):
+        head = RTMDetHead(head_module=self.head_module)
+        head.head_module.init_weights()
+
+    def test_predict_by_feat(self):
+        s = 256
+        img_metas = [{
+            'img_shape': (s, s, 3),
+            'ori_shape': (s, s, 3),
+            'scale_factor': (1.0, 1.0),
+        }]
+        test_cfg = dict(
+            multi_label=True,
+            nms_pre=30000,
+            score_thr=0.001,
+            nms=dict(type='nms', iou_threshold=0.65),
+            max_per_img=300)
+        test_cfg = Config(test_cfg)
+
+        head = RTMDetHead(head_module=self.head_module, test_cfg=test_cfg)
+        feat = [
+            torch.rand(1, 1, s // feat_size, s // feat_size)
+            for feat_size in [4, 8, 16]
+        ]
+        cls_scores, bbox_preds = head.forward(feat)
+        head.predict_by_feat(
+            cls_scores,
+            bbox_preds,
+            batch_img_metas=img_metas,
+            cfg=test_cfg,
+            rescale=True,
+            with_nms=True)
+        head.predict_by_feat(
+            cls_scores,
+            bbox_preds,
+            batch_img_metas=img_metas,
+            cfg=test_cfg,
+            rescale=False,
+            with_nms=False)
+
+    def test_loss_by_feat(self):
+        s = 256
+        img_metas = [{
+            'img_shape': (s, s, 3),
+            'batch_input_shape': (s, s),
+            'scale_factor': 1,
+        }]
+        train_cfg = dict(
+            assigner=dict(
+                num_classes=80,
+                type='BatchDynamicSoftLabelAssigner',
+                topk=13,
+                iou_calculator=dict(type='mmdet.BboxOverlaps2D')),
+            allowed_border=-1,
+            pos_weight=-1,
+            debug=False)
+        train_cfg = Config(train_cfg)
+        head = RTMDetHead(head_module=self.head_module, train_cfg=train_cfg)
+
+        feat = [
+            torch.rand(1, 1, s // feat_size, s // feat_size)
+            for feat_size in [4, 8, 16]
+        ]
+        cls_scores, bbox_preds = head.forward(feat)
+
+        # Test that empty ground truth encourages the network to predict
+        # background
+        gt_instances = InstanceData(
+            bboxes=torch.empty((0, 4)), labels=torch.LongTensor([]))
+
+        empty_gt_losses = head.loss_by_feat(cls_scores, bbox_preds,
+                                            [gt_instances], img_metas)
+        # When there is no truth, the cls loss should be nonzero but there
+        # should be no box loss.
+        empty_cls_loss = empty_gt_losses['loss_cls'].sum()
+        empty_box_loss = empty_gt_losses['loss_bbox'].sum()
+        self.assertGreater(empty_cls_loss.item(), 0,
+                           'classification loss should be non-zero')
+        self.assertEqual(
+            empty_box_loss.item(), 0,
+            'there should be no box loss when there are no true boxes')
+
+        # When truth is non-empty then both cls and box loss should be nonzero
+        # for random inputs
+        head = RTMDetHead(head_module=self.head_module, train_cfg=train_cfg)
+        gt_instances = InstanceData(
+            bboxes=torch.Tensor([[23.6667, 23.8757, 238.6326, 151.8874]]),
+            labels=torch.LongTensor([1]))
+
+        one_gt_losses = head.loss_by_feat(cls_scores, bbox_preds,
+                                          [gt_instances], img_metas)
+        onegt_cls_loss = one_gt_losses['loss_cls'].sum()
+        onegt_box_loss = one_gt_losses['loss_bbox'].sum()
+        self.assertGreater(onegt_cls_loss.item(), 0,
+                           'cls loss should be non-zero')
+        self.assertGreater(onegt_box_loss.item(), 0,
+                           'box loss should be non-zero')
+
+        # test num_class = 1
+        self.head_module['num_classes'] = 1
+        head = RTMDetHead(head_module=self.head_module, train_cfg=train_cfg)
+        gt_instances = InstanceData(
+            bboxes=torch.Tensor([[23.6667, 23.8757, 238.6326, 151.8874]]),
+            labels=torch.LongTensor([0]))
+
+        cls_scores, bbox_preds = head.forward(feat)
+
+        one_gt_losses = head.loss_by_feat(cls_scores, bbox_preds,
+                                          [gt_instances], img_metas)
+        onegt_cls_loss = one_gt_losses['loss_cls'].sum()
+        onegt_box_loss = one_gt_losses['loss_bbox'].sum()
+        self.assertGreater(onegt_cls_loss.item(), 0,
+                           'cls loss should be non-zero')
+        self.assertGreater(onegt_box_loss.item(), 0,
+                           'box loss should be non-zero')
+
+
+class TestRTMDetInsHead(TestCase):
+
+    def setUp(self):
+        self.head_module = dict(
+            type='RTMDetInsSepBNHeadModule',
+            num_classes=4,
+            in_channels=1,
+            stacked_convs=1,
+            feat_channels=64,
+            featmap_strides=[4, 8, 16],
+            num_prototypes=8,
+            dyconv_channels=8,
+            num_dyconvs=3,
+            share_conv=True,
+            use_sigmoid_cls=True)
+
+    def test_init_weights(self):
+        head = RTMDetInsSepBNHead(head_module=self.head_module)
+        head.head_module.init_weights()
+
+    def test_predict_by_feat(self):
+        s = 256
+        img_metas = [{
+            'img_shape': (s, s, 3),
+            'ori_shape': (s, s, 3),
+            'scale_factor': (1.0, 1.0),
+            'pad_param': np.array([0., 0., 0., 0.])
+        }]
+        test_cfg = dict(
+            multi_label=False,
+            nms_pre=1000,
+            min_bbox_size=0,
+            score_thr=0.05,
+            nms=dict(type='nms', iou_threshold=0.6),
+            max_per_img=100,
+            mask_thr_binary=0.5)
+        test_cfg = Config(test_cfg)
+
+        head = RTMDetInsSepBNHead(
+            head_module=self.head_module, test_cfg=test_cfg)
+        feat = [
+            torch.rand(1, 1, s // feat_size, s // feat_size)
+            for feat_size in [4, 8, 16]
+        ]
+        cls_scores, bbox_preds, kernel_preds, mask_feat = head.forward(feat)
+        head.predict_by_feat(
+            cls_scores,
+            bbox_preds,
+            kernel_preds,
+            mask_feat,
+            batch_img_metas=img_metas,
+            cfg=test_cfg,
+            rescale=True,
+            with_nms=True)
+
+        img_metas_without_pad_param = [{
+            'img_shape': (s, s, 3),
+            'ori_shape': (s, s, 3),
+            'scale_factor': (1.0, 1.0)
+        }]
+        head.predict_by_feat(
+            cls_scores,
+            bbox_preds,
+            kernel_preds,
+            mask_feat,
+            batch_img_metas=img_metas_without_pad_param,
+            cfg=test_cfg,
+            rescale=True,
+            with_nms=True)
+
+        with self.assertRaises(AssertionError):
+            head.predict_by_feat(
+                cls_scores,
+                bbox_preds,
+                kernel_preds,
+                mask_feat,
+                batch_img_metas=img_metas,
+                cfg=test_cfg,
+                rescale=False,
+                with_nms=False)
diff --git a/mmdetection_practice/third_party/mmyolo/tests/test_models/test_dense_heads/test_yolov5_head.py b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_dense_heads/test_yolov5_head.py
new file mode 100644
index 0000000..974b9a9
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_dense_heads/test_yolov5_head.py
@@ -0,0 +1,411 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from unittest import TestCase
+
+import numpy as np
+import torch
+from mmengine.config import Config
+from mmengine.structures import InstanceData
+
+from mmyolo.models.dense_heads import YOLOv5Head, YOLOv5InsHead
+from mmyolo.utils import register_all_modules
+
+register_all_modules()
+
+
+class TestYOLOv5Head(TestCase):
+
+    def setUp(self):
+        self.head_module = dict(
+            type='YOLOv5HeadModule',
+            num_classes=2,
+            in_channels=[32, 64, 128],
+            featmap_strides=[8, 16, 32],
+            num_base_priors=3)
+
+    def test_predict_by_feat(self):
+        s = 256
+        img_metas = [{
+            'img_shape': (s, s, 3),
+            'ori_shape': (s, s, 3),
+            'scale_factor': (1.0, 1.0),
+        }]
+        test_cfg = Config(
+            dict(
+                multi_label=True,
+                max_per_img=300,
+                score_thr=0.01,
+                nms=dict(type='nms', iou_threshold=0.65)))
+
+        head = YOLOv5Head(head_module=self.head_module, test_cfg=test_cfg)
+
+        feat = []
+        for i in range(len(self.head_module['in_channels'])):
+            in_channel = self.head_module['in_channels'][i]
+            feat_size = self.head_module['featmap_strides'][i]
+            feat.append(
+                torch.rand(1, in_channel, s // feat_size, s // feat_size))
+
+        cls_scores, bbox_preds, objectnesses = head.forward(feat)
+        head.predict_by_feat(
+            cls_scores,
+            bbox_preds,
+            objectnesses,
+            img_metas,
+            cfg=test_cfg,
+            rescale=True,
+            with_nms=True)
+        head.predict_by_feat(
+            cls_scores,
+            bbox_preds,
+            objectnesses,
+            img_metas,
+            cfg=test_cfg,
+            rescale=False,
+            with_nms=False)
+
+    def test_loss_by_feat(self):
+        s = 256
+        img_metas = [{
+            'img_shape': (s, s, 3),
+            'batch_input_shape': (s, s),
+            'scale_factor': 1,
+        }]
+
+        head = YOLOv5Head(head_module=self.head_module)
+
+        feat = []
+        for i in range(len(self.head_module['in_channels'])):
+            in_channel = self.head_module['in_channels'][i]
+            feat_size = self.head_module['featmap_strides'][i]
+            feat.append(
+                torch.rand(1, in_channel, s // feat_size, s // feat_size))
+
+        cls_scores, bbox_preds, objectnesses = head.forward(feat)
+
+        # Test that empty ground truth encourages the network to predict
+        # background
+        gt_instances = InstanceData(
+            bboxes=torch.empty((0, 4)), labels=torch.LongTensor([]))
+
+        empty_gt_losses = head.loss_by_feat(cls_scores, bbox_preds,
+                                            objectnesses, [gt_instances],
+                                            img_metas)
+        # When there is no truth, the cls loss should be nonzero but there
+        # should be no box loss.
+        empty_cls_loss = empty_gt_losses['loss_cls'].sum()
+        empty_box_loss = empty_gt_losses['loss_bbox'].sum()
+        empty_obj_loss = empty_gt_losses['loss_obj'].sum()
+        self.assertEqual(
+            empty_cls_loss.item(), 0,
+            'there should be no cls loss when there are no true boxes')
+        self.assertEqual(
+            empty_box_loss.item(), 0,
+            'there should be no box loss when there are no true boxes')
+        self.assertGreater(empty_obj_loss.item(), 0,
+                           'objectness loss should be non-zero')
+
+        # When truth is non-empty then both cls and box loss should be nonzero
+        # for random inputs
+        head = YOLOv5Head(head_module=self.head_module)
+        gt_instances = InstanceData(
+            bboxes=torch.Tensor([[23.6667, 23.8757, 238.6326, 151.8874]]),
+            labels=torch.LongTensor([1]))
+
+        one_gt_losses = head.loss_by_feat(cls_scores, bbox_preds, objectnesses,
+                                          [gt_instances], img_metas)
+        onegt_cls_loss = one_gt_losses['loss_cls'].sum()
+        onegt_box_loss = one_gt_losses['loss_bbox'].sum()
+        onegt_obj_loss = one_gt_losses['loss_obj'].sum()
+        self.assertGreater(onegt_cls_loss.item(), 0,
+                           'cls loss should be non-zero')
+        self.assertGreater(onegt_box_loss.item(), 0,
+                           'box loss should be non-zero')
+        self.assertGreater(onegt_obj_loss.item(), 0,
+                           'obj loss should be non-zero')
+
+        # test num_class = 1
+        self.head_module['num_classes'] = 1
+        head = YOLOv5Head(head_module=self.head_module)
+        gt_instances = InstanceData(
+            bboxes=torch.Tensor([[23.6667, 23.8757, 238.6326, 151.8874]]),
+            labels=torch.LongTensor([0]))
+
+        one_gt_losses = head.loss_by_feat(cls_scores, bbox_preds, objectnesses,
+                                          [gt_instances], img_metas)
+        onegt_cls_loss = one_gt_losses['loss_cls'].sum()
+        onegt_box_loss = one_gt_losses['loss_bbox'].sum()
+        onegt_obj_loss = one_gt_losses['loss_obj'].sum()
+        self.assertEqual(onegt_cls_loss.item(), 0,
+                         'cls loss should be non-zero')
+        self.assertGreater(onegt_box_loss.item(), 0,
+                           'box loss should be non-zero')
+        self.assertGreater(onegt_obj_loss.item(), 0,
+                           'obj loss should be non-zero')
+
+    def test_loss_by_feat_with_ignore(self):
+        s = 256
+        img_metas = [{
+            'img_shape': (s, s, 3),
+            'batch_input_shape': (s, s),
+            'scale_factor': 1,
+        }]
+
+        head = YOLOv5Head(head_module=self.head_module, ignore_iof_thr=0.8)
+
+        feat = []
+        for i in range(len(self.head_module['in_channels'])):
+            in_channel = self.head_module['in_channels'][i]
+            feat_size = self.head_module['featmap_strides'][i]
+            feat.append(
+                torch.rand(1, in_channel, s // feat_size, s // feat_size))
+
+        cls_scores, bbox_preds, objectnesses = head.forward(feat)
+
+        # Test that empty ground truth encourages the network to predict
+        # background
+        gt_instances = InstanceData(
+            bboxes=torch.empty((0, 4)), labels=torch.LongTensor([]))
+        # ignore boxes
+        gt_instances_ignore = torch.tensor(
+            [[0, 0, 69.7688, 0, 619.3611, 62.2711]], dtype=torch.float32)
+
+        empty_gt_losses = head._loss_by_feat_with_ignore(
+            cls_scores, bbox_preds, objectnesses, [gt_instances], img_metas,
+            gt_instances_ignore)
+        # When there is no truth, the cls loss should be nonzero but there
+        # should be no box loss.
+        empty_cls_loss = empty_gt_losses['loss_cls'].sum()
+        empty_box_loss = empty_gt_losses['loss_bbox'].sum()
+        empty_obj_loss = empty_gt_losses['loss_obj'].sum()
+        self.assertEqual(
+            empty_cls_loss.item(), 0,
+            'there should be no cls loss when there are no true boxes')
+        self.assertEqual(
+            empty_box_loss.item(), 0,
+            'there should be no box loss when there are no true boxes')
+        self.assertGreater(empty_obj_loss.item(), 0,
+                           'objectness loss should be non-zero')
+
+        # When truth is non-empty then both cls and box loss should be nonzero
+        # for random inputs
+        head = YOLOv5Head(head_module=self.head_module, ignore_iof_thr=0.8)
+        gt_instances = InstanceData(
+            bboxes=torch.Tensor([[23.6667, 23.8757, 238.6326, 151.8874]]),
+            labels=torch.LongTensor([1]))
+
+        gt_instances_ignore = torch.tensor(
+            [[0, 0, 69.7688, 0, 619.3611, 62.2711]], dtype=torch.float32)
+
+        one_gt_losses = head._loss_by_feat_with_ignore(cls_scores, bbox_preds,
+                                                       objectnesses,
+                                                       [gt_instances],
+                                                       img_metas,
+                                                       gt_instances_ignore)
+        onegt_cls_loss = one_gt_losses['loss_cls'].sum()
+        onegt_box_loss = one_gt_losses['loss_bbox'].sum()
+        onegt_obj_loss = one_gt_losses['loss_obj'].sum()
+        self.assertGreater(onegt_cls_loss.item(), 0,
+                           'cls loss should be non-zero')
+        self.assertGreater(onegt_box_loss.item(), 0,
+                           'box loss should be non-zero')
+        self.assertGreater(onegt_obj_loss.item(), 0,
+                           'obj loss should be non-zero')
+
+        # test num_class = 1
+        self.head_module['num_classes'] = 1
+        head = YOLOv5Head(head_module=self.head_module, ignore_iof_thr=0.8)
+        gt_instances = InstanceData(
+            bboxes=torch.Tensor([[23.6667, 23.8757, 238.6326, 151.8874]]),
+            labels=torch.LongTensor([0]))
+
+        gt_instances_ignore = torch.tensor(
+            [[0, 0, 69.7688, 0, 619.3611, 62.2711]], dtype=torch.float32)
+
+        one_gt_losses = head._loss_by_feat_with_ignore(cls_scores, bbox_preds,
+                                                       objectnesses,
+                                                       [gt_instances],
+                                                       img_metas,
+                                                       gt_instances_ignore)
+        onegt_cls_loss = one_gt_losses['loss_cls'].sum()
+        onegt_box_loss = one_gt_losses['loss_bbox'].sum()
+        onegt_obj_loss = one_gt_losses['loss_obj'].sum()
+        self.assertEqual(onegt_cls_loss.item(), 0,
+                         'cls loss should be non-zero')
+        self.assertGreater(onegt_box_loss.item(), 0,
+                           'box loss should be non-zero')
+        self.assertGreater(onegt_obj_loss.item(), 0,
+                           'obj loss should be non-zero')
+
+
+class TestYOLOv5InsHead(TestCase):
+
+    def setUp(self):
+        self.head_module = dict(
+            type='YOLOv5InsHeadModule',
+            num_classes=4,
+            in_channels=[32, 64, 128],
+            featmap_strides=[8, 16, 32],
+            mask_channels=32,
+            proto_channels=32,
+            widen_factor=1.0)
+
+    def test_init_weights(self):
+        head = YOLOv5InsHead(head_module=self.head_module)
+        head.head_module.init_weights()
+
+    def test_predict_by_feat(self):
+        s = 256
+        img_metas = [{
+            'img_shape': (s, s, 3),
+            'ori_shape': (s, s, 3),
+            'batch_input_shape': (s, s),
+            'scale_factor': (1.0, 1.0),
+        }]
+        test_cfg = Config(
+            dict(
+                multi_label=True,
+                nms_pre=30000,
+                min_bbox_size=0,
+                score_thr=0.001,
+                nms=dict(type='nms', iou_threshold=0.6),
+                max_per_img=300,
+                mask_thr_binary=0.5))
+
+        head = YOLOv5InsHead(head_module=self.head_module, test_cfg=test_cfg)
+        head.eval()
+
+        feat = []
+        for i in range(len(self.head_module['in_channels'])):
+            in_channel = self.head_module['in_channels'][i]
+            feat_size = self.head_module['featmap_strides'][i]
+            feat.append(
+                torch.rand(1, in_channel, s // feat_size, s // feat_size))
+
+        with torch.no_grad():
+            res = head.forward(feat)
+            cls_scores, bbox_preds, objectnesses,\
+                coeff_preds, proto_preds = res
+            head.predict_by_feat(
+                cls_scores,
+                bbox_preds,
+                objectnesses,
+                coeff_preds,
+                proto_preds,
+                img_metas,
+                cfg=test_cfg,
+                rescale=True,
+                with_nms=True)
+
+            with self.assertRaises(AssertionError):
+                head.predict_by_feat(
+                    cls_scores,
+                    bbox_preds,
+                    coeff_preds,
+                    proto_preds,
+                    img_metas,
+                    cfg=test_cfg,
+                    rescale=True,
+                    with_nms=False)
+
+    def test_loss_by_feat(self):
+        s = 256
+        img_metas = [{
+            'img_shape': (s, s, 3),
+            'batch_input_shape': (s, s),
+            'scale_factor': 1,
+        }]
+
+        head = YOLOv5InsHead(head_module=self.head_module)
+        rng = np.random.RandomState(0)
+
+        feat = []
+        for i in range(len(self.head_module['in_channels'])):
+            in_channel = self.head_module['in_channels'][i]
+            feat_size = self.head_module['featmap_strides'][i]
+            feat.append(
+                torch.rand(1, in_channel, s // feat_size, s // feat_size))
+
+        cls_scores, bbox_preds, objectnesses,\
+            coeff_preds, proto_preds = head.forward(feat)
+
+        # Test that empty ground truth encourages the network to predict
+        # background
+        gt_bboxes_labels = torch.empty((0, 6))
+        gt_masks = rng.rand(0, s // 4, s // 4)
+
+        empty_gt_losses = head.loss_by_feat(cls_scores, bbox_preds,
+                                            objectnesses, coeff_preds,
+                                            proto_preds, gt_bboxes_labels,
+                                            gt_masks, img_metas)
+        # When there is no truth, the cls loss should be nonzero but there
+        # should be no box loss.
+        empty_cls_loss = empty_gt_losses['loss_cls'].sum()
+        empty_box_loss = empty_gt_losses['loss_bbox'].sum()
+        empty_obj_loss = empty_gt_losses['loss_obj'].sum()
+        empty_mask_loss = empty_gt_losses['loss_mask'].sum()
+        self.assertEqual(
+            empty_cls_loss.item(), 0,
+            'there should be no cls loss when there are no true boxes')
+        self.assertEqual(
+            empty_box_loss.item(), 0,
+            'there should be no box loss when there are no true boxes')
+        self.assertGreater(empty_obj_loss.item(), 0,
+                           'objectness loss should be non-zero')
+        self.assertEqual(
+            empty_mask_loss.item(), 0,
+            'there should be no mask loss when there are no true masks')
+
+        # When truth is non-empty then both cls and box loss should be nonzero
+        # for random inputs
+        head = YOLOv5InsHead(head_module=self.head_module)
+
+        bboxes = torch.Tensor([[23.6667, 23.8757, 238.6326, 151.8874]])
+        labels = torch.Tensor([1.])
+        batch_id = torch.LongTensor([0])
+        gt_bboxes_labels = torch.cat([batch_id[None], labels[None], bboxes],
+                                     dim=1)
+        gt_masks = torch.from_numpy(rng.rand(1, s // 4, s // 4)).int()
+
+        one_gt_losses = head.loss_by_feat(cls_scores, bbox_preds, objectnesses,
+                                          coeff_preds, proto_preds,
+                                          gt_bboxes_labels, gt_masks,
+                                          img_metas)
+        onegt_cls_loss = one_gt_losses['loss_cls'].sum()
+        onegt_box_loss = one_gt_losses['loss_bbox'].sum()
+        onegt_obj_loss = one_gt_losses['loss_obj'].sum()
+        onegt_mask_loss = one_gt_losses['loss_mask'].sum()
+        self.assertGreater(onegt_cls_loss.item(), 0,
+                           'cls loss should be non-zero')
+        self.assertGreater(onegt_box_loss.item(), 0,
+                           'box loss should be non-zero')
+        self.assertGreater(onegt_obj_loss.item(), 0,
+                           'obj loss should be non-zero')
+        self.assertGreater(onegt_mask_loss.item(), 0,
+                           'mask loss should be non-zero')
+
+        # test num_class = 1
+        self.head_module['num_classes'] = 1
+        head = YOLOv5InsHead(head_module=self.head_module)
+        bboxes = torch.Tensor([[23.6667, 23.8757, 238.6326, 151.8874]])
+        labels = torch.Tensor([1.])
+        batch_id = torch.LongTensor([0])
+        gt_bboxes_labels = torch.cat([batch_id[None], labels[None], bboxes],
+                                     dim=1)
+        gt_masks = torch.from_numpy(rng.rand(1, s // 4, s // 4)).int()
+
+        one_gt_losses = head.loss_by_feat(cls_scores, bbox_preds, objectnesses,
+                                          coeff_preds, proto_preds,
+                                          gt_bboxes_labels, gt_masks,
+                                          img_metas)
+        onegt_cls_loss = one_gt_losses['loss_cls'].sum()
+        onegt_box_loss = one_gt_losses['loss_bbox'].sum()
+        onegt_obj_loss = one_gt_losses['loss_obj'].sum()
+        onegt_mask_loss = one_gt_losses['loss_mask'].sum()
+        self.assertEqual(onegt_cls_loss.item(), 0,
+                         'cls loss should be non-zero')
+        self.assertGreater(onegt_box_loss.item(), 0,
+                           'box loss should be non-zero')
+        self.assertGreater(onegt_obj_loss.item(), 0,
+                           'obj loss should be non-zero')
+        self.assertGreater(onegt_mask_loss.item(), 0,
+                           'mask loss should be non-zero')
diff --git a/mmdetection_practice/third_party/mmyolo/tests/test_models/test_dense_heads/test_yolov6_head.py b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_dense_heads/test_yolov6_head.py
new file mode 100644
index 0000000..5bb951d
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_dense_heads/test_yolov6_head.py
@@ -0,0 +1,62 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from unittest import TestCase
+
+import torch
+from mmengine.config import Config
+
+from mmyolo.models.dense_heads import YOLOv6Head
+from mmyolo.utils import register_all_modules
+
+register_all_modules()
+
+
+class TestYOLOv6Head(TestCase):
+
+    def setUp(self):
+        self.head_module = dict(
+            type='YOLOv6HeadModule',
+            num_classes=2,
+            in_channels=[32, 64, 128],
+            featmap_strides=[8, 16, 32])
+
+    def test_predict_by_feat(self):
+        s = 256
+        img_metas = [{
+            'img_shape': (s, s, 3),
+            'ori_shape': (s, s, 3),
+            'scale_factor': (1.0, 1.0),
+        }]
+        test_cfg = Config(
+            dict(
+                multi_label=True,
+                max_per_img=300,
+                score_thr=0.01,
+                nms=dict(type='nms', iou_threshold=0.65)))
+
+        head = YOLOv6Head(head_module=self.head_module, test_cfg=test_cfg)
+        head.eval()
+
+        feat = []
+        for i in range(len(self.head_module['in_channels'])):
+            in_channel = self.head_module['in_channels'][i]
+            feat_size = self.head_module['featmap_strides'][i]
+            feat.append(
+                torch.rand(1, in_channel, s // feat_size, s // feat_size))
+
+        cls_scores, bbox_preds = head.forward(feat)
+        head.predict_by_feat(
+            cls_scores,
+            bbox_preds,
+            None,
+            img_metas,
+            cfg=test_cfg,
+            rescale=True,
+            with_nms=True)
+        head.predict_by_feat(
+            cls_scores,
+            bbox_preds,
+            None,
+            img_metas,
+            cfg=test_cfg,
+            rescale=False,
+            with_nms=False)
diff --git a/mmdetection_practice/third_party/mmyolo/tests/test_models/test_dense_heads/test_yolov7_head.py b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_dense_heads/test_yolov7_head.py
new file mode 100644
index 0000000..5033f97
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_dense_heads/test_yolov7_head.py
@@ -0,0 +1,145 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from unittest import TestCase
+
+import torch
+from mmengine.config import Config
+from mmengine.structures import InstanceData
+
+from mmyolo.models.dense_heads import YOLOv7Head
+from mmyolo.utils import register_all_modules
+
+register_all_modules()
+
+
+# TODO: Test YOLOv7p6HeadModule
+class TestYOLOv7Head(TestCase):
+
+    def setUp(self):
+        self.head_module = dict(
+            type='YOLOv7HeadModule',
+            num_classes=2,
+            in_channels=[32, 64, 128],
+            featmap_strides=[8, 16, 32],
+            num_base_priors=3)
+
+    def test_predict_by_feat(self):
+        s = 256
+        img_metas = [{
+            'img_shape': (s, s, 3),
+            'ori_shape': (s, s, 3),
+            'scale_factor': (1.0, 1.0),
+        }]
+        test_cfg = Config(
+            dict(
+                multi_label=True,
+                max_per_img=300,
+                score_thr=0.01,
+                nms=dict(type='nms', iou_threshold=0.65)))
+
+        head = YOLOv7Head(head_module=self.head_module, test_cfg=test_cfg)
+
+        feat = []
+        for i in range(len(self.head_module['in_channels'])):
+            in_channel = self.head_module['in_channels'][i]
+            feat_size = self.head_module['featmap_strides'][i]
+            feat.append(
+                torch.rand(1, in_channel, s // feat_size, s // feat_size))
+
+        cls_scores, bbox_preds, objectnesses = head.forward(feat)
+        head.predict_by_feat(
+            cls_scores,
+            bbox_preds,
+            objectnesses,
+            img_metas,
+            cfg=test_cfg,
+            rescale=True,
+            with_nms=True)
+        head.predict_by_feat(
+            cls_scores,
+            bbox_preds,
+            objectnesses,
+            img_metas,
+            cfg=test_cfg,
+            rescale=False,
+            with_nms=False)
+
+    def test_loss_by_feat(self):
+        s = 256
+        img_metas = [{
+            'img_shape': (s, s, 3),
+            'batch_input_shape': (s, s),
+            'scale_factor': 1,
+        }]
+
+        head = YOLOv7Head(head_module=self.head_module)
+
+        feat = []
+        for i in range(len(self.head_module['in_channels'])):
+            in_channel = self.head_module['in_channels'][i]
+            feat_size = self.head_module['featmap_strides'][i]
+            feat.append(
+                torch.rand(1, in_channel, s // feat_size, s // feat_size))
+
+        cls_scores, bbox_preds, objectnesses = head.forward(feat)
+
+        # Test that empty ground truth encourages the network to predict
+        # background
+        gt_instances = InstanceData(
+            bboxes=torch.empty((0, 4)), labels=torch.LongTensor([]))
+
+        empty_gt_losses = head.loss_by_feat(cls_scores, bbox_preds,
+                                            objectnesses, [gt_instances],
+                                            img_metas)
+        # When there is no truth, the cls loss should be nonzero but there
+        # should be no box loss.
+        empty_cls_loss = empty_gt_losses['loss_cls'].sum()
+        empty_box_loss = empty_gt_losses['loss_bbox'].sum()
+        empty_obj_loss = empty_gt_losses['loss_obj'].sum()
+        self.assertEqual(
+            empty_cls_loss.item(), 0,
+            'there should be no cls loss when there are no true boxes')
+        self.assertEqual(
+            empty_box_loss.item(), 0,
+            'there should be no box loss when there are no true boxes')
+        self.assertGreater(empty_obj_loss.item(), 0,
+                           'objectness loss should be non-zero')
+
+        # When truth is non-empty then both cls and box loss should be nonzero
+        # for random inputs
+        head = YOLOv7Head(head_module=self.head_module)
+        gt_instances = InstanceData(
+            bboxes=torch.Tensor([[23.6667, 23.8757, 238.6326, 151.8874]]),
+            labels=torch.LongTensor([1]))
+
+        one_gt_losses = head.loss_by_feat(cls_scores, bbox_preds, objectnesses,
+                                          [gt_instances], img_metas)
+        onegt_cls_loss = one_gt_losses['loss_cls'].sum()
+        onegt_box_loss = one_gt_losses['loss_bbox'].sum()
+        onegt_obj_loss = one_gt_losses['loss_obj'].sum()
+        self.assertGreater(onegt_cls_loss.item(), 0,
+                           'cls loss should be non-zero')
+        self.assertGreater(onegt_box_loss.item(), 0,
+                           'box loss should be non-zero')
+        self.assertGreater(onegt_obj_loss.item(), 0,
+                           'obj loss should be non-zero')
+
+        # test num_class = 1
+        self.head_module['num_classes'] = 1
+        head = YOLOv7Head(head_module=self.head_module)
+        gt_instances = InstanceData(
+            bboxes=torch.Tensor([[23.6667, 23.8757, 238.6326, 151.8874]]),
+            labels=torch.LongTensor([0]))
+
+        cls_scores, bbox_preds, objectnesses = head.forward(feat)
+
+        one_gt_losses = head.loss_by_feat(cls_scores, bbox_preds, objectnesses,
+                                          [gt_instances], img_metas)
+        onegt_cls_loss = one_gt_losses['loss_cls'].sum()
+        onegt_box_loss = one_gt_losses['loss_bbox'].sum()
+        onegt_obj_loss = one_gt_losses['loss_obj'].sum()
+        self.assertEqual(onegt_cls_loss.item(), 0,
+                         'cls loss should be non-zero')
+        self.assertGreater(onegt_box_loss.item(), 0,
+                           'box loss should be non-zero')
+        self.assertGreater(onegt_obj_loss.item(), 0,
+                           'obj loss should be non-zero')
diff --git a/mmdetection_practice/third_party/mmyolo/tests/test_models/test_dense_heads/test_yolov8_head.py b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_dense_heads/test_yolov8_head.py
new file mode 100644
index 0000000..8980387
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_dense_heads/test_yolov8_head.py
@@ -0,0 +1,161 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from unittest import TestCase
+
+import torch
+from mmengine import ConfigDict
+from mmengine.config import Config
+
+from mmyolo.models import YOLOv8Head
+from mmyolo.utils import register_all_modules
+
+register_all_modules()
+
+
+class TestYOLOv8Head(TestCase):
+
+    def setUp(self):
+        self.head_module = dict(
+            type='YOLOv8HeadModule',
+            num_classes=4,
+            in_channels=[32, 64, 128],
+            featmap_strides=[8, 16, 32])
+
+    def test_predict_by_feat(self):
+        s = 256
+        img_metas = [{
+            'img_shape': (s, s, 3),
+            'ori_shape': (s, s, 3),
+            'scale_factor': (1.0, 1.0),
+        }]
+        test_cfg = Config(
+            dict(
+                multi_label=True,
+                max_per_img=300,
+                score_thr=0.01,
+                nms=dict(type='nms', iou_threshold=0.65)))
+
+        head = YOLOv8Head(head_module=self.head_module, test_cfg=test_cfg)
+        head.eval()
+
+        feat = []
+        for i in range(len(self.head_module['in_channels'])):
+            in_channel = self.head_module['in_channels'][i]
+            feat_size = self.head_module['featmap_strides'][i]
+            feat.append(
+                torch.rand(1, in_channel, s // feat_size, s // feat_size))
+
+        cls_scores, bbox_preds = head.forward(feat)
+        head.predict_by_feat(
+            cls_scores,
+            bbox_preds,
+            None,
+            img_metas,
+            cfg=test_cfg,
+            rescale=True,
+            with_nms=True)
+        head.predict_by_feat(
+            cls_scores,
+            bbox_preds,
+            None,
+            img_metas,
+            cfg=test_cfg,
+            rescale=False,
+            with_nms=False)
+
+    def test_loss_by_feat(self):
+        s = 256
+        img_metas = [{
+            'img_shape': (s, s, 3),
+            'batch_input_shape': (s, s),
+            'scale_factor': 1,
+        }]
+
+        head = YOLOv8Head(
+            head_module=self.head_module,
+            train_cfg=ConfigDict(
+                assigner=dict(
+                    type='BatchTaskAlignedAssigner',
+                    num_classes=4,
+                    topk=10,
+                    alpha=0.5,
+                    beta=6)))
+        head.train()
+
+        feat = []
+        for i in range(len(self.head_module['in_channels'])):
+            in_channel = self.head_module['in_channels'][i]
+            feat_size = self.head_module['featmap_strides'][i]
+            feat.append(
+                torch.rand(1, in_channel, s // feat_size, s // feat_size))
+
+        cls_scores, bbox_preds, bbox_dist_preds = head.forward(feat)
+
+        # Test that empty ground truth encourages the network to predict
+        # background
+        gt_instances = torch.empty((0, 6), dtype=torch.float32)
+
+        empty_gt_losses = head.loss_by_feat(cls_scores, bbox_preds,
+                                            bbox_dist_preds, gt_instances,
+                                            img_metas)
+        # When there is no truth, the cls loss should be nonzero but there
+        # should be no box loss.
+        empty_cls_loss = empty_gt_losses['loss_cls'].sum()
+        empty_box_loss = empty_gt_losses['loss_bbox'].sum()
+        empty_dfl_loss = empty_gt_losses['loss_dfl'].sum()
+        self.assertGreater(empty_cls_loss.item(), 0,
+                           'cls loss should be non-zero')
+        self.assertEqual(
+            empty_box_loss.item(), 0,
+            'there should be no box loss when there are no true boxes')
+        self.assertEqual(
+            empty_dfl_loss.item(), 0,
+            'there should be df loss when there are no true boxes')
+
+        # When truth is non-empty then both cls and box loss should be nonzero
+        # for random inputs
+        gt_instances = torch.Tensor(
+            [[0., 0., 23.6667, 23.8757, 238.6326, 151.8874]])
+
+        one_gt_losses = head.loss_by_feat(cls_scores, bbox_preds,
+                                          bbox_dist_preds, gt_instances,
+                                          img_metas)
+        onegt_cls_loss = one_gt_losses['loss_cls'].sum()
+        onegt_box_loss = one_gt_losses['loss_bbox'].sum()
+        onegt_loss_dfl = one_gt_losses['loss_dfl'].sum()
+        self.assertGreater(onegt_cls_loss.item(), 0,
+                           'cls loss should be non-zero')
+        self.assertGreater(onegt_box_loss.item(), 0,
+                           'box loss should be non-zero')
+        self.assertGreater(onegt_loss_dfl.item(), 0,
+                           'obj loss should be non-zero')
+
+        # test num_class = 1
+        self.head_module['num_classes'] = 1
+        head = YOLOv8Head(
+            head_module=self.head_module,
+            train_cfg=ConfigDict(
+                assigner=dict(
+                    type='BatchTaskAlignedAssigner',
+                    num_classes=1,
+                    topk=10,
+                    alpha=0.5,
+                    beta=6)))
+        head.train()
+
+        gt_instances = torch.Tensor(
+            [[0., 0., 23.6667, 23.8757, 238.6326, 151.8874],
+             [1., 0., 24.6667, 27.8757, 28.6326, 51.8874]])
+        cls_scores, bbox_preds, bbox_dist_preds = head.forward(feat)
+
+        one_gt_losses = head.loss_by_feat(cls_scores, bbox_preds,
+                                          bbox_dist_preds, gt_instances,
+                                          img_metas)
+        onegt_cls_loss = one_gt_losses['loss_cls'].sum()
+        onegt_box_loss = one_gt_losses['loss_bbox'].sum()
+        onegt_loss_dfl = one_gt_losses['loss_dfl'].sum()
+        self.assertGreater(onegt_cls_loss.item(), 0,
+                           'cls loss should be non-zero')
+        self.assertGreater(onegt_box_loss.item(), 0,
+                           'box loss should be non-zero')
+        self.assertGreater(onegt_loss_dfl.item(), 0,
+                           'obj loss should be non-zero')
diff --git a/mmdetection_practice/third_party/mmyolo/tests/test_models/test_dense_heads/test_yolox_head.py b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_dense_heads/test_yolox_head.py
new file mode 100644
index 0000000..3909944
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_dense_heads/test_yolox_head.py
@@ -0,0 +1,379 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from unittest import TestCase
+
+import torch
+from mmengine.config import Config
+from mmengine.model import bias_init_with_prob
+from mmengine.testing import assert_allclose
+
+from mmyolo.models.dense_heads import YOLOXHead, YOLOXPoseHead
+from mmyolo.utils import register_all_modules
+
+register_all_modules()
+
+
+class TestYOLOXHead(TestCase):
+
+    def setUp(self):
+        self.head_module = dict(
+            type='YOLOXHeadModule',
+            num_classes=4,
+            in_channels=1,
+            stacked_convs=1,
+        )
+
+    def test_init_weights(self):
+        head = YOLOXHead(head_module=self.head_module)
+        head.head_module.init_weights()
+        bias_init = bias_init_with_prob(0.01)
+        for conv_cls, conv_obj in zip(head.head_module.multi_level_conv_cls,
+                                      head.head_module.multi_level_conv_obj):
+            assert_allclose(conv_cls.bias.data,
+                            torch.ones_like(conv_cls.bias.data) * bias_init)
+            assert_allclose(conv_obj.bias.data,
+                            torch.ones_like(conv_obj.bias.data) * bias_init)
+
+    def test_predict_by_feat(self):
+        s = 256
+        img_metas = [{
+            'img_shape': (s, s, 3),
+            'ori_shape': (s, s, 3),
+            'scale_factor': (1.0, 1.0),
+        }]
+        test_cfg = Config(
+            dict(
+                multi_label=True,
+                max_per_img=300,
+                score_thr=0.01,
+                nms=dict(type='nms', iou_threshold=0.65)))
+
+        head = YOLOXHead(head_module=self.head_module, test_cfg=test_cfg)
+        feat = [
+            torch.rand(1, 1, s // feat_size, s // feat_size)
+            for feat_size in [4, 8, 16]
+        ]
+        cls_scores, bbox_preds, objectnesses = head.forward(feat)
+        head.predict_by_feat(
+            cls_scores,
+            bbox_preds,
+            objectnesses,
+            img_metas,
+            cfg=test_cfg,
+            rescale=True,
+            with_nms=True)
+        head.predict_by_feat(
+            cls_scores,
+            bbox_preds,
+            objectnesses,
+            img_metas,
+            cfg=test_cfg,
+            rescale=False,
+            with_nms=False)
+
+    def test_loss_by_feat(self):
+        s = 256
+        img_metas = [{
+            'img_shape': (s, s, 3),
+            'scale_factor': 1,
+        }]
+        train_cfg = Config(
+            dict(
+                assigner=dict(
+                    type='mmdet.SimOTAAssigner',
+                    iou_calculator=dict(type='mmdet.BboxOverlaps2D'),
+                    center_radius=2.5,
+                    candidate_topk=10,
+                    iou_weight=3.0,
+                    cls_weight=1.0)))
+
+        head = YOLOXHead(head_module=self.head_module, train_cfg=train_cfg)
+        assert not head.use_bbox_aux
+
+        feat = [
+            torch.rand(1, 1, s // feat_size, s // feat_size)
+            for feat_size in [4, 8, 16]
+        ]
+        cls_scores, bbox_preds, objectnesses = head.forward(feat)
+
+        # Test that empty ground truth encourages the network to predict
+        # background
+        gt_instances = torch.empty((0, 6))
+
+        empty_gt_losses = head.loss_by_feat(cls_scores, bbox_preds,
+                                            objectnesses, gt_instances,
+                                            img_metas)
+        # When there is no truth, the cls loss should be nonzero but there
+        # should be no box loss.
+        empty_cls_loss = empty_gt_losses['loss_cls'].sum()
+        empty_box_loss = empty_gt_losses['loss_bbox'].sum()
+        empty_obj_loss = empty_gt_losses['loss_obj'].sum()
+        self.assertEqual(
+            empty_cls_loss.item(), 0,
+            'there should be no cls loss when there are no true boxes')
+        self.assertEqual(
+            empty_box_loss.item(), 0,
+            'there should be no box loss when there are no true boxes')
+        self.assertGreater(empty_obj_loss.item(), 0,
+                           'objectness loss should be non-zero')
+
+        # When truth is non-empty then both cls and box loss should be nonzero
+        # for random inputs
+        head = YOLOXHead(head_module=self.head_module, train_cfg=train_cfg)
+        head.use_bbox_aux = True
+        gt_instances = torch.Tensor(
+            [[0, 2, 23.6667, 23.8757, 238.6326, 151.8874]])
+
+        one_gt_losses = head.loss_by_feat(cls_scores, bbox_preds, objectnesses,
+                                          gt_instances, img_metas)
+        onegt_cls_loss = one_gt_losses['loss_cls'].sum()
+        onegt_box_loss = one_gt_losses['loss_bbox'].sum()
+        onegt_obj_loss = one_gt_losses['loss_obj'].sum()
+        onegt_l1_loss = one_gt_losses['loss_bbox_aux'].sum()
+        self.assertGreater(onegt_cls_loss.item(), 0,
+                           'cls loss should be non-zero')
+        self.assertGreater(onegt_box_loss.item(), 0,
+                           'box loss should be non-zero')
+        self.assertGreater(onegt_obj_loss.item(), 0,
+                           'obj loss should be non-zero')
+        self.assertGreater(onegt_l1_loss.item(), 0,
+                           'l1 loss should be non-zero')
+
+        # Test groud truth out of bound
+        gt_instances = torch.Tensor(
+            [[0, 2, s * 4, s * 4, s * 4 + 10, s * 4 + 10]])
+        empty_gt_losses = head.loss_by_feat(cls_scores, bbox_preds,
+                                            objectnesses, gt_instances,
+                                            img_metas)
+        # When gt_bboxes out of bound, the assign results should be empty,
+        # so the cls and bbox loss should be zero.
+        empty_cls_loss = empty_gt_losses['loss_cls'].sum()
+        empty_box_loss = empty_gt_losses['loss_bbox'].sum()
+        empty_obj_loss = empty_gt_losses['loss_obj'].sum()
+        self.assertEqual(
+            empty_cls_loss.item(), 0,
+            'there should be no cls loss when gt_bboxes out of bound')
+        self.assertEqual(
+            empty_box_loss.item(), 0,
+            'there should be no box loss when gt_bboxes out of bound')
+        self.assertGreater(empty_obj_loss.item(), 0,
+                           'objectness loss should be non-zero')
+
+
+class TestYOLOXPoseHead(TestCase):
+
+    def setUp(self):
+        self.head_module = dict(
+            type='YOLOXPoseHeadModule',
+            num_classes=1,
+            num_keypoints=17,
+            in_channels=1,
+            stacked_convs=1,
+        )
+        self.train_cfg = Config(
+            dict(
+                assigner=dict(
+                    type='PoseSimOTAAssigner',
+                    center_radius=2.5,
+                    oks_weight=3.0,
+                    iou_calculator=dict(type='mmdet.BboxOverlaps2D'),
+                    oks_calculator=dict(
+                        type='OksLoss',
+                        metainfo='configs/_base_/pose/coco.py'))))
+        self.loss_pose = Config(
+            dict(
+                type='OksLoss',
+                metainfo='configs/_base_/pose/coco.py',
+                loss_weight=30.0))
+
+    def test_init_weights(self):
+        head = YOLOXPoseHead(
+            head_module=self.head_module,
+            loss_pose=self.loss_pose,
+            train_cfg=self.train_cfg)
+        head.head_module.init_weights()
+        bias_init = bias_init_with_prob(0.01)
+        for conv_cls, conv_obj, conv_vis in zip(
+                head.head_module.multi_level_conv_cls,
+                head.head_module.multi_level_conv_obj,
+                head.head_module.multi_level_conv_vis):
+            assert_allclose(conv_cls.bias.data,
+                            torch.ones_like(conv_cls.bias.data) * bias_init)
+            assert_allclose(conv_obj.bias.data,
+                            torch.ones_like(conv_obj.bias.data) * bias_init)
+            assert_allclose(conv_vis.bias.data,
+                            torch.ones_like(conv_vis.bias.data) * bias_init)
+
+    def test_predict_by_feat(self):
+        s = 256
+        img_metas = [{
+            'img_shape': (s, s, 3),
+            'ori_shape': (s, s, 3),
+            'scale_factor': (1.0, 1.0),
+        }]
+        test_cfg = Config(
+            dict(
+                multi_label=True,
+                max_per_img=300,
+                score_thr=0.01,
+                nms=dict(type='nms', iou_threshold=0.65)))
+
+        head = YOLOXPoseHead(
+            head_module=self.head_module,
+            loss_pose=self.loss_pose,
+            train_cfg=self.train_cfg,
+            test_cfg=test_cfg)
+        feat = [
+            torch.rand(1, 1, s // feat_size, s // feat_size)
+            for feat_size in [4, 8, 16]
+        ]
+        cls_scores, bbox_preds, objectnesses, \
+            offsets_preds, vis_preds = head.forward(feat)
+        head.predict_by_feat(
+            cls_scores,
+            bbox_preds,
+            objectnesses,
+            offsets_preds,
+            vis_preds,
+            img_metas,
+            cfg=test_cfg,
+            rescale=True,
+            with_nms=True)
+
+    def test_loss_by_feat(self):
+        s = 256
+        img_metas = [{
+            'img_shape': (s, s, 3),
+            'scale_factor': 1,
+        }]
+
+        head = YOLOXPoseHead(
+            head_module=self.head_module,
+            loss_pose=self.loss_pose,
+            train_cfg=self.train_cfg)
+        assert not head.use_bbox_aux
+
+        feat = [
+            torch.rand(1, 1, s // feat_size, s // feat_size)
+            for feat_size in [4, 8, 16]
+        ]
+        cls_scores, bbox_preds, objectnesses, \
+            offsets_preds, vis_preds = head.forward(feat)
+
+        # Test that empty ground truth encourages the network to predict
+        # background
+        gt_instances = torch.empty((0, 6))
+        gt_keypoints = torch.empty((0, 17, 2))
+        gt_keypoints_visible = torch.empty((0, 17))
+
+        empty_gt_losses = head.loss_by_feat(cls_scores, bbox_preds,
+                                            objectnesses, offsets_preds,
+                                            vis_preds, gt_instances,
+                                            gt_keypoints, gt_keypoints_visible,
+                                            img_metas)
+        # When there is no truth, the cls loss should be nonzero but there
+        # should be no box loss.
+        empty_cls_loss = empty_gt_losses['loss_cls'].sum()
+        empty_box_loss = empty_gt_losses['loss_bbox'].sum()
+        empty_obj_loss = empty_gt_losses['loss_obj'].sum()
+        empty_loss_kpt = empty_gt_losses['loss_kpt'].sum()
+        empty_loss_vis = empty_gt_losses['loss_vis'].sum()
+        self.assertEqual(
+            empty_cls_loss.item(), 0,
+            'there should be no cls loss when there are no true boxes')
+        self.assertEqual(
+            empty_box_loss.item(), 0,
+            'there should be no box loss when there are no true boxes')
+        self.assertGreater(empty_obj_loss.item(), 0,
+                           'objectness loss should be non-zero')
+        self.assertEqual(
+            empty_loss_kpt.item(), 0,
+            'there should be no kpt loss when there are no true keypoints')
+        self.assertEqual(
+            empty_loss_vis.item(), 0,
+            'there should be no vis loss when there are no true keypoints')
+        # When truth is non-empty then both cls and box loss should be nonzero
+        # for random inputs
+        head = YOLOXPoseHead(
+            head_module=self.head_module,
+            loss_pose=self.loss_pose,
+            train_cfg=self.train_cfg)
+        gt_instances = torch.Tensor(
+            [[0, 0, 23.6667, 23.8757, 238.6326, 151.8874]])
+        gt_keypoints = torch.Tensor([[[317.1519,
+                                       429.8433], [338.3080, 416.9187],
+                                      [298.9951,
+                                       403.8911], [102.7025, 273.1329],
+                                      [255.4321,
+                                       404.8712], [400.0422, 554.4373],
+                                      [167.7857,
+                                       516.7591], [397.4943, 737.4575],
+                                      [116.3247,
+                                       674.5684], [102.7025, 273.1329],
+                                      [66.0319,
+                                       808.6383], [102.7025, 273.1329],
+                                      [157.6150,
+                                       819.1249], [102.7025, 273.1329],
+                                      [102.7025,
+                                       273.1329], [102.7025, 273.1329],
+                                      [102.7025, 273.1329]]])
+        gt_keypoints_visible = torch.Tensor([[
+            1., 1., 1., 0., 1., 1., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.
+        ]])
+
+        one_gt_losses = head.loss_by_feat(cls_scores, bbox_preds, objectnesses,
+                                          offsets_preds, vis_preds,
+                                          gt_instances, gt_keypoints,
+                                          gt_keypoints_visible, img_metas)
+        onegt_cls_loss = one_gt_losses['loss_cls'].sum()
+        onegt_box_loss = one_gt_losses['loss_bbox'].sum()
+        onegt_obj_loss = one_gt_losses['loss_obj'].sum()
+        onegt_loss_kpt = one_gt_losses['loss_kpt'].sum()
+        onegt_loss_vis = one_gt_losses['loss_vis'].sum()
+
+        self.assertGreater(onegt_cls_loss.item(), 0,
+                           'cls loss should be non-zero')
+        self.assertGreater(onegt_box_loss.item(), 0,
+                           'box loss should be non-zero')
+        self.assertGreater(onegt_obj_loss.item(), 0,
+                           'obj loss should be non-zero')
+        self.assertGreater(onegt_loss_kpt.item(), 0,
+                           'kpt loss should be non-zero')
+        self.assertGreater(onegt_loss_vis.item(), 0,
+                           'vis loss should be non-zero')
+
+        # Test groud truth out of bound
+        gt_instances = torch.Tensor(
+            [[0, 2, s * 4, s * 4, s * 4 + 10, s * 4 + 10]])
+        gt_keypoints = torch.Tensor([[[s * 4, s * 4 + 10], [s * 4, s * 4 + 10],
+                                      [s * 4, s * 4 + 10], [s * 4, s * 4 + 10],
+                                      [s * 4, s * 4 + 10], [s * 4, s * 4 + 10],
+                                      [s * 4, s * 4 + 10], [s * 4, s * 4 + 10],
+                                      [s * 4, s * 4 + 10], [s * 4, s * 4 + 10],
+                                      [s * 4, s * 4 + 10], [s * 4, s * 4 + 10],
+                                      [s * 4, s * 4 + 10], [s * 4, s * 4 + 10],
+                                      [s * 4, s * 4 + 10], [s * 4, s * 4 + 10],
+                                      [s * 4, s * 4 + 10]]])
+        empty_gt_losses = head.loss_by_feat(cls_scores, bbox_preds,
+                                            objectnesses, offsets_preds,
+                                            vis_preds, gt_instances,
+                                            gt_keypoints, gt_keypoints_visible,
+                                            img_metas)
+        # When gt_bboxes out of bound, the assign results should be empty,
+        # so the cls and bbox loss should be zero.
+        empty_cls_loss = empty_gt_losses['loss_cls'].sum()
+        empty_box_loss = empty_gt_losses['loss_bbox'].sum()
+        empty_obj_loss = empty_gt_losses['loss_obj'].sum()
+        empty_kpt_loss = empty_gt_losses['loss_kpt'].sum()
+        empty_vis_loss = empty_gt_losses['loss_vis'].sum()
+        self.assertEqual(
+            empty_cls_loss.item(), 0,
+            'there should be no cls loss when gt_bboxes out of bound')
+        self.assertEqual(
+            empty_box_loss.item(), 0,
+            'there should be no box loss when gt_bboxes out of bound')
+        self.assertGreater(empty_obj_loss.item(), 0,
+                           'objectness loss should be non-zero')
+        self.assertEqual(empty_kpt_loss.item(), 0,
+                         'kps loss should be non-zero')
+        self.assertEqual(empty_vis_loss.item(), 0,
+                         'vis loss should be non-zero')
diff --git a/mmdetection_practice/third_party/mmyolo/tests/test_models/test_detectors/test_yolo_detector.py b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_detectors/test_yolo_detector.py
new file mode 100644
index 0000000..4b29520
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_detectors/test_yolo_detector.py
@@ -0,0 +1,137 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+import time
+import unittest
+from unittest import TestCase
+
+import torch
+from mmdet.structures import DetDataSample
+from mmdet.testing import demo_mm_inputs
+from mmengine.logging import MessageHub
+from parameterized import parameterized
+
+from mmyolo.testing import get_detector_cfg
+from mmyolo.utils import register_all_modules
+
+
+class TestSingleStageDetector(TestCase):
+
+    def setUp(self):
+        register_all_modules()
+
+    @parameterized.expand([
+        'yolov5/yolov5_n-v61_syncbn_fast_8xb16-300e_coco.py',
+        'yolov6/yolov6_s_syncbn_fast_8xb32-400e_coco.py',
+        'yolox/yolox_tiny_fast_8xb8-300e_coco.py',
+        'rtmdet/rtmdet_tiny_syncbn_fast_8xb32-300e_coco.py',
+        'yolov7/yolov7_tiny_syncbn_fast_8x16b-300e_coco.py',
+        'yolov8/yolov8_n_syncbn_fast_8xb16-500e_coco.py'
+    ])
+    def test_init(self, cfg_file):
+        model = get_detector_cfg(cfg_file)
+        model.backbone.init_cfg = None
+
+        from mmyolo.registry import MODELS
+        detector = MODELS.build(model)
+        self.assertTrue(detector.backbone)
+        self.assertTrue(detector.neck)
+        self.assertTrue(detector.bbox_head)
+
+    @parameterized.expand([
+        ('yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py', ('cuda', 'cpu')),
+        ('yolov7/yolov7_tiny_syncbn_fast_8x16b-300e_coco.py', ('cuda', 'cpu')),
+        ('rtmdet/rtmdet_tiny_syncbn_fast_8xb32-300e_coco.py', ('cuda', 'cpu')),
+        ('yolov8/yolov8_n_syncbn_fast_8xb16-500e_coco.py', ('cuda', 'cpu'))
+    ])
+    def test_forward_loss_mode(self, cfg_file, devices):
+        message_hub = MessageHub.get_instance(
+            f'test_single_stage_forward_loss_mode-{time.time()}')
+        message_hub.update_info('iter', 0)
+        message_hub.update_info('epoch', 0)
+        model = get_detector_cfg(cfg_file)
+        model.backbone.init_cfg = None
+
+        if 'fast' in cfg_file:
+            model.data_preprocessor = dict(
+                type='mmdet.DetDataPreprocessor',
+                mean=[0., 0., 0.],
+                std=[255., 255., 255.],
+                bgr_to_rgb=True)
+
+        from mmyolo.registry import MODELS
+        assert all([device in ['cpu', 'cuda'] for device in devices])
+
+        for device in devices:
+            detector = MODELS.build(model)
+            detector.init_weights()
+
+            if device == 'cuda':
+                if not torch.cuda.is_available():
+                    return unittest.skip('test requires GPU and torch+cuda')
+                detector = detector.cuda()
+
+            packed_inputs = demo_mm_inputs(2, [[3, 320, 128], [3, 125, 320]])
+            data = detector.data_preprocessor(packed_inputs, True)
+            losses = detector.forward(**data, mode='loss')
+            self.assertIsInstance(losses, dict)
+
+    @parameterized.expand([
+        ('yolov5/yolov5_n-v61_syncbn_fast_8xb16-300e_coco.py', ('cuda',
+                                                                'cpu')),
+        ('yolov6/yolov6_s_syncbn_fast_8xb32-400e_coco.py', ('cuda', 'cpu')),
+        ('yolox/yolox_tiny_fast_8xb8-300e_coco.py', ('cuda', 'cpu')),
+        ('yolov7/yolov7_tiny_syncbn_fast_8x16b-300e_coco.py', ('cuda', 'cpu')),
+        ('rtmdet/rtmdet_tiny_syncbn_fast_8xb32-300e_coco.py', ('cuda', 'cpu')),
+        ('yolov8/yolov8_n_syncbn_fast_8xb16-500e_coco.py', ('cuda', 'cpu'))
+    ])
+    def test_forward_predict_mode(self, cfg_file, devices):
+        model = get_detector_cfg(cfg_file)
+        model.backbone.init_cfg = None
+
+        from mmyolo.registry import MODELS
+        assert all([device in ['cpu', 'cuda'] for device in devices])
+
+        for device in devices:
+            detector = MODELS.build(model)
+
+            if device == 'cuda':
+                if not torch.cuda.is_available():
+                    return unittest.skip('test requires GPU and torch+cuda')
+                detector = detector.cuda()
+
+            packed_inputs = demo_mm_inputs(2, [[3, 320, 128], [3, 125, 320]])
+            data = detector.data_preprocessor(packed_inputs, False)
+            # Test forward test
+            detector.eval()
+            with torch.no_grad():
+                batch_results = detector.forward(**data, mode='predict')
+                self.assertEqual(len(batch_results), 2)
+                self.assertIsInstance(batch_results[0], DetDataSample)
+
+    @parameterized.expand([
+        ('yolov5/yolov5_n-v61_syncbn_fast_8xb16-300e_coco.py', ('cuda',
+                                                                'cpu')),
+        ('yolov6/yolov6_s_syncbn_fast_8xb32-400e_coco.py', ('cuda', 'cpu')),
+        ('yolox/yolox_tiny_fast_8xb8-300e_coco.py', ('cuda', 'cpu')),
+        ('yolov7/yolov7_tiny_syncbn_fast_8x16b-300e_coco.py', ('cuda', 'cpu')),
+        ('rtmdet/rtmdet_tiny_syncbn_fast_8xb32-300e_coco.py', ('cuda', 'cpu')),
+        ('yolov8/yolov8_n_syncbn_fast_8xb16-500e_coco.py', ('cuda', 'cpu'))
+    ])
+    def test_forward_tensor_mode(self, cfg_file, devices):
+        model = get_detector_cfg(cfg_file)
+        model.backbone.init_cfg = None
+
+        from mmyolo.registry import MODELS
+        assert all([device in ['cpu', 'cuda'] for device in devices])
+
+        for device in devices:
+            detector = MODELS.build(model)
+
+            if device == 'cuda':
+                if not torch.cuda.is_available():
+                    return unittest.skip('test requires GPU and torch+cuda')
+                detector = detector.cuda()
+
+            packed_inputs = demo_mm_inputs(2, [[3, 320, 128], [3, 125, 320]])
+            data = detector.data_preprocessor(packed_inputs, False)
+            batch_results = detector.forward(**data, mode='tensor')
+            self.assertIsInstance(batch_results, tuple)
diff --git a/mmdetection_practice/third_party/mmyolo/tests/test_models/test_layers/__init__.py b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_layers/__init__.py
new file mode 100644
index 0000000..ef101fe
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_layers/__init__.py
@@ -0,0 +1 @@
+# Copyright (c) OpenMMLab. All rights reserved.
diff --git a/mmdetection_practice/third_party/mmyolo/tests/test_models/test_layers/test_ema.py b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_layers/test_ema.py
new file mode 100644
index 0000000..b358382
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_layers/test_ema.py
@@ -0,0 +1,94 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+import itertools
+import math
+from unittest import TestCase
+
+import torch
+import torch.nn as nn
+from mmengine.testing import assert_allclose
+
+from mmyolo.models.layers import ExpMomentumEMA
+
+
+class TestEMA(TestCase):
+
+    def test_exp_momentum_ema(self):
+        model = nn.Sequential(nn.Conv2d(1, 5, kernel_size=3), nn.Linear(5, 10))
+        # Test invalid gamma
+        with self.assertRaisesRegex(AssertionError,
+                                    'gamma must be greater than 0'):
+            ExpMomentumEMA(model, gamma=-1)
+
+        # Test EMA
+        model = torch.nn.Sequential(
+            torch.nn.Conv2d(1, 5, kernel_size=3), torch.nn.Linear(5, 10))
+        momentum = 0.1
+        gamma = 4
+
+        ema_model = ExpMomentumEMA(model, momentum=momentum, gamma=gamma)
+        averaged_params = [
+            torch.zeros_like(param) for param in model.parameters()
+        ]
+        n_updates = 10
+        for i in range(n_updates):
+            updated_averaged_params = []
+            for p, p_avg in zip(model.parameters(), averaged_params):
+                p.detach().add_(torch.randn_like(p))
+                if i == 0:
+                    updated_averaged_params.append(p.clone())
+                else:
+                    m = (1 - momentum) * math.exp(-(1 + i) / gamma) + momentum
+                    updated_averaged_params.append(
+                        (p_avg * (1 - m) + p * m).clone())
+            ema_model.update_parameters(model)
+            averaged_params = updated_averaged_params
+
+        for p_target, p_ema in zip(averaged_params, ema_model.parameters()):
+            assert_allclose(p_target, p_ema)
+
+    def test_exp_momentum_ema_update_buffer(self):
+        model = nn.Sequential(
+            nn.Conv2d(1, 5, kernel_size=3), nn.BatchNorm2d(5, momentum=0.3),
+            nn.Linear(5, 10))
+        # Test invalid gamma
+        with self.assertRaisesRegex(AssertionError,
+                                    'gamma must be greater than 0'):
+            ExpMomentumEMA(model, gamma=-1)
+
+        # Test EMA with momentum annealing.
+        momentum = 0.1
+        gamma = 4
+
+        ema_model = ExpMomentumEMA(
+            model, gamma=gamma, momentum=momentum, update_buffers=True)
+        averaged_params = [
+            torch.zeros_like(param)
+            for param in itertools.chain(model.parameters(), model.buffers())
+            if param.size() != torch.Size([])
+        ]
+        n_updates = 10
+        for i in range(n_updates):
+            updated_averaged_params = []
+            params = [
+                param for param in itertools.chain(model.parameters(),
+                                                   model.buffers())
+                if param.size() != torch.Size([])
+            ]
+            for p, p_avg in zip(params, averaged_params):
+                p.detach().add_(torch.randn_like(p))
+                if i == 0:
+                    updated_averaged_params.append(p.clone())
+                else:
+                    m = (1 - momentum) * math.exp(-(1 + i) / gamma) + momentum
+                    updated_averaged_params.append(
+                        (p_avg * (1 - m) + p * m).clone())
+            ema_model.update_parameters(model)
+            averaged_params = updated_averaged_params
+
+        ema_params = [
+            param for param in itertools.chain(ema_model.module.parameters(),
+                                               ema_model.module.buffers())
+            if param.size() != torch.Size([])
+        ]
+        for p_target, p_ema in zip(averaged_params, ema_params):
+            assert_allclose(p_target, p_ema)
diff --git a/mmdetection_practice/third_party/mmyolo/tests/test_models/test_layers/test_yolo_bricks.py b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_layers/test_yolo_bricks.py
new file mode 100644
index 0000000..5331a4e
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_layers/test_yolo_bricks.py
@@ -0,0 +1,34 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+
+from unittest import TestCase
+
+import torch
+
+from mmyolo.models.layers import SPPFBottleneck
+from mmyolo.utils import register_all_modules
+
+register_all_modules()
+
+
+class TestSPPFBottleneck(TestCase):
+
+    def test_forward(self):
+        input_tensor = torch.randn((1, 3, 20, 20))
+        bottleneck = SPPFBottleneck(3, 16)
+        out_tensor = bottleneck(input_tensor)
+        self.assertEqual(out_tensor.shape, (1, 16, 20, 20))
+
+        bottleneck = SPPFBottleneck(3, 16, kernel_sizes=[3, 5, 7])
+        out_tensor = bottleneck(input_tensor)
+        self.assertEqual(out_tensor.shape, (1, 16, 20, 20))
+
+        # set len(kernel_sizes)=4
+        bottleneck = SPPFBottleneck(3, 16, kernel_sizes=[3, 5, 7, 9])
+        out_tensor = bottleneck(input_tensor)
+        self.assertEqual(out_tensor.shape, (1, 16, 20, 20))
+
+        # set use_conv_first=False
+        bottleneck = SPPFBottleneck(
+            3, 16, use_conv_first=False, kernel_sizes=[3, 5, 7, 9])
+        out_tensor = bottleneck(input_tensor)
+        self.assertEqual(out_tensor.shape, (1, 16, 20, 20))
diff --git a/mmdetection_practice/third_party/mmyolo/tests/test_models/test_necks/__init__.py b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_necks/__init__.py
new file mode 100644
index 0000000..ef101fe
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_necks/__init__.py
@@ -0,0 +1 @@
+# Copyright (c) OpenMMLab. All rights reserved.
diff --git a/mmdetection_practice/third_party/mmyolo/tests/test_models/test_necks/test_cspnext_pafpn.py b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_necks/test_cspnext_pafpn.py
new file mode 100644
index 0000000..b26c99a
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_necks/test_cspnext_pafpn.py
@@ -0,0 +1,37 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from unittest import TestCase
+
+import torch
+
+from mmyolo.models.necks import CSPNeXtPAFPN
+from mmyolo.utils import register_all_modules
+
+register_all_modules()
+
+
+class TestCSPNeXtPAFPN(TestCase):
+
+    def test_forward(self):
+        s = 64
+        in_channels = [8, 16, 32]
+        feat_sizes = [s // 2**i for i in range(4)]  # [32, 16, 8]
+        out_channels = 24
+        feats = [
+            torch.rand(1, in_channels[i], feat_sizes[i], feat_sizes[i])
+            for i in range(len(in_channels))
+        ]
+        neck = CSPNeXtPAFPN(in_channels=in_channels, out_channels=out_channels)
+        outs = neck(feats)
+        assert len(outs) == len(feats)
+        for i in range(len(feats)):
+            assert outs[i].shape[1] == out_channels
+            assert outs[i].shape[2] == outs[i].shape[3] == s // (2**i)
+
+        # test depth-wise
+        neck = CSPNeXtPAFPN(
+            in_channels=in_channels,
+            out_channels=out_channels,
+            use_depthwise=True)
+
+        from mmcv.cnn.bricks import DepthwiseSeparableConvModule
+        self.assertTrue(neck.conv, DepthwiseSeparableConvModule)
diff --git a/mmdetection_practice/third_party/mmyolo/tests/test_models/test_necks/test_ppyoloe_csppan.py b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_necks/test_ppyoloe_csppan.py
new file mode 100644
index 0000000..b79c1ce
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_necks/test_ppyoloe_csppan.py
@@ -0,0 +1,53 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from unittest import TestCase
+
+import torch
+
+from mmyolo.models import PPYOLOECSPPAFPN
+from mmyolo.utils import register_all_modules
+
+register_all_modules()
+
+
+class TestPPYOLOECSPPAFPN(TestCase):
+
+    def test_forward(self):
+        s = 64
+        in_channels = [8, 16, 32]
+        feat_sizes = [s // 2**i for i in range(4)]  # [32, 16, 8]
+        out_channels = [8, 16, 32]
+        feats = [
+            torch.rand(1, in_channels[i], feat_sizes[i], feat_sizes[i])
+            for i in range(len(in_channels))
+        ]
+        neck = PPYOLOECSPPAFPN(
+            in_channels=in_channels, out_channels=out_channels)
+        outs = neck(feats)
+        assert len(outs) == len(feats)
+        for i in range(len(feats)):
+            assert outs[i].shape[1] == out_channels[i]
+            assert outs[i].shape[2] == outs[i].shape[3] == s // (2**i)
+
+    def test_drop_block(self):
+        s = 64
+        in_channels = [8, 16, 32]
+        feat_sizes = [s // 2**i for i in range(4)]  # [32, 16, 8]
+        out_channels = [8, 16, 32]
+        feats = [
+            torch.rand(1, in_channels[i], feat_sizes[i], feat_sizes[i])
+            for i in range(len(in_channels))
+        ]
+        neck = PPYOLOECSPPAFPN(
+            in_channels=in_channels,
+            out_channels=out_channels,
+            drop_block_cfg=dict(
+                type='mmdet.DropBlock',
+                drop_prob=0.1,
+                block_size=3,
+                warm_iters=0))
+        neck.train()
+        outs = neck(feats)
+        assert len(outs) == len(feats)
+        for i in range(len(feats)):
+            assert outs[i].shape[1] == out_channels[i]
+            assert outs[i].shape[2] == outs[i].shape[3] == s // (2**i)
diff --git a/mmdetection_practice/third_party/mmyolo/tests/test_models/test_necks/test_yolov5_pafpn.py b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_necks/test_yolov5_pafpn.py
new file mode 100644
index 0000000..339621e
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_necks/test_yolov5_pafpn.py
@@ -0,0 +1,28 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from unittest import TestCase
+
+import torch
+
+from mmyolo.models.necks import YOLOv5PAFPN
+from mmyolo.utils import register_all_modules
+
+register_all_modules()
+
+
+class TestYOLOv5PAFPN(TestCase):
+
+    def test_forward(self):
+        s = 64
+        in_channels = [8, 16, 32]
+        feat_sizes = [s // 2**i for i in range(4)]  # [32, 16, 8]
+        out_channels = [8, 16, 32]
+        feats = [
+            torch.rand(1, in_channels[i], feat_sizes[i], feat_sizes[i])
+            for i in range(len(in_channels))
+        ]
+        neck = YOLOv5PAFPN(in_channels=in_channels, out_channels=out_channels)
+        outs = neck(feats)
+        assert len(outs) == len(feats)
+        for i in range(len(feats)):
+            assert outs[i].shape[1] == out_channels[i]
+            assert outs[i].shape[2] == outs[i].shape[3] == s // (2**i)
diff --git a/mmdetection_practice/third_party/mmyolo/tests/test_models/test_necks/test_yolov6_pafpn.py b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_necks/test_yolov6_pafpn.py
new file mode 100644
index 0000000..e766aa8
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_necks/test_yolov6_pafpn.py
@@ -0,0 +1,81 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from unittest import TestCase
+
+import torch
+
+from mmyolo.models.necks import (YOLOv6CSPRepBiPAFPN, YOLOv6CSPRepPAFPN,
+                                 YOLOv6RepBiPAFPN, YOLOv6RepPAFPN)
+from mmyolo.utils import register_all_modules
+
+register_all_modules()
+
+
+class TestYOLOv6PAFPN(TestCase):
+
+    def test_YOLOv6RepPAFP_forward(self):
+        s = 64
+        in_channels = [8, 16, 32]
+        feat_sizes = [s // 2**i for i in range(4)]  # [32, 16, 8]
+        out_channels = [8, 16, 32]
+        feats = [
+            torch.rand(1, in_channels[i], feat_sizes[i], feat_sizes[i])
+            for i in range(len(in_channels))
+        ]
+        neck = YOLOv6RepPAFPN(
+            in_channels=in_channels, out_channels=out_channels)
+        outs = neck(feats)
+        assert len(outs) == len(feats)
+        for i in range(len(feats)):
+            assert outs[i].shape[1] == out_channels[i]
+            assert outs[i].shape[2] == outs[i].shape[3] == s // (2**i)
+
+    def test_YOLOv6CSPRepPAFPN_forward(self):
+        s = 64
+        in_channels = [8, 16, 32]
+        feat_sizes = [s // 2**i for i in range(4)]  # [32, 16, 8]
+        out_channels = [8, 16, 32]
+        feats = [
+            torch.rand(1, in_channels[i], feat_sizes[i], feat_sizes[i])
+            for i in range(len(in_channels))
+        ]
+        neck = YOLOv6CSPRepPAFPN(
+            in_channels=in_channels, out_channels=out_channels)
+        outs = neck(feats)
+        assert len(outs) == len(feats)
+        for i in range(len(feats)):
+            assert outs[i].shape[1] == out_channels[i]
+            assert outs[i].shape[2] == outs[i].shape[3] == s // (2**i)
+
+    def test_YOLOv6CSPRepBiPAFPN_forward(self):
+        s = 64
+        in_channels = [4, 8, 16, 32]  # includes an extra input for BiFusion
+        feat_sizes = [s // 2**i for i in range(4)]  # [64, 32, 16, 8]
+        out_channels = [8, 16, 32]
+        feats = [
+            torch.rand(1, in_channels[i], feat_sizes[i], feat_sizes[i])
+            for i in range(len(in_channels))
+        ]
+        neck = YOLOv6CSPRepBiPAFPN(
+            in_channels=in_channels, out_channels=out_channels)
+        outs = neck(feats)
+        assert len(outs) == len(feats) - 1
+        for i in range(len(feats) - 1):
+            assert outs[i].shape[1] == out_channels[i]
+            assert outs[i].shape[2] == outs[i].shape[3] == feat_sizes[i + 1]
+
+    def test_YOLOv6RepBiPAFPN_forward(self):
+        s = 64
+        in_channels = [4, 8, 16, 32]  # includes an extra input for BiFusion
+        feat_sizes = [s // 2**i for i in range(4)]  # [64, 32, 16, 8]
+        out_channels = [8, 16, 32]
+        feats = [
+            torch.rand(1, in_channels[i], feat_sizes[i], feat_sizes[i])
+            for i in range(len(in_channels))
+        ]
+        neck = YOLOv6RepBiPAFPN(
+            in_channels=in_channels, out_channels=out_channels)
+        outs = neck(feats)
+        assert len(outs) == len(feats) - 1
+        for i in range(len(feats) - 1):
+            assert outs[i].shape[1] == out_channels[i]
+            assert outs[i].shape[2] == outs[i].shape[3] == feat_sizes[i + 1]
diff --git a/mmdetection_practice/third_party/mmyolo/tests/test_models/test_necks/test_yolov7_pafpn.py b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_necks/test_yolov7_pafpn.py
new file mode 100644
index 0000000..17bf455
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_necks/test_yolov7_pafpn.py
@@ -0,0 +1,79 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from unittest import TestCase
+
+import torch
+from mmcv.cnn import ConvModule
+
+from mmyolo.models.necks import YOLOv7PAFPN
+from mmyolo.utils import register_all_modules
+
+register_all_modules()
+
+
+class TestYOLOv7PAFPN(TestCase):
+
+    def test_forward(self):
+        # test P5
+        s = 64
+        in_channels = [8, 16, 32]
+        feat_sizes = [s // 2**i for i in range(4)]  # [32, 16, 8]
+        out_channels = [8, 16, 32]
+        feats = [
+            torch.rand(1, in_channels[i], feat_sizes[i], feat_sizes[i])
+            for i in range(len(in_channels))
+        ]
+        neck = YOLOv7PAFPN(in_channels=in_channels, out_channels=out_channels)
+        outs = neck(feats)
+        assert len(outs) == len(feats)
+        for i in range(len(feats)):
+            assert outs[i].shape[1] == out_channels[i] * 2
+            assert outs[i].shape[2] == outs[i].shape[3] == s // (2**i)
+
+        # test is_tiny_version
+        neck = YOLOv7PAFPN(
+            in_channels=in_channels,
+            out_channels=out_channels,
+            is_tiny_version=True)
+        outs = neck(feats)
+        assert len(outs) == len(feats)
+        for i in range(len(feats)):
+            assert outs[i].shape[1] == out_channels[i] * 2
+            assert outs[i].shape[2] == outs[i].shape[3] == s // (2**i)
+
+        # test use_in_channels_in_downsample
+        neck = YOLOv7PAFPN(
+            in_channels=in_channels,
+            out_channels=out_channels,
+            use_in_channels_in_downsample=True)
+        for f in feats:
+            print(f.shape)
+        outs = neck(feats)
+        for f in outs:
+            print(f.shape)
+        assert len(outs) == len(feats)
+        for i in range(len(feats)):
+            assert outs[i].shape[1] == out_channels[i] * 2
+            assert outs[i].shape[2] == outs[i].shape[3] == s // (2**i)
+
+        # test use_repconv_outs is False
+        neck = YOLOv7PAFPN(
+            in_channels=in_channels,
+            out_channels=out_channels,
+            use_repconv_outs=False)
+        self.assertIsInstance(neck.out_layers[0], ConvModule)
+
+        # test P6
+        s = 64
+        in_channels = [8, 16, 32, 64]
+        feat_sizes = [s // 2**i for i in range(4)]
+        out_channels = [8, 16, 32, 64]
+        feats = [
+            torch.rand(1, in_channels[i], feat_sizes[i], feat_sizes[i])
+            for i in range(len(in_channels))
+        ]
+        neck = YOLOv7PAFPN(in_channels=in_channels, out_channels=out_channels)
+        outs = neck(feats)
+        assert len(outs) == len(feats)
+        for i in range(len(feats)):
+            assert outs[i].shape[1] == out_channels[i]
+            assert outs[i].shape[2] == outs[i].shape[3] == s // (2**i)
diff --git a/mmdetection_practice/third_party/mmyolo/tests/test_models/test_necks/test_yolov8_pafpn.py b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_necks/test_yolov8_pafpn.py
new file mode 100644
index 0000000..66d136d
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_necks/test_yolov8_pafpn.py
@@ -0,0 +1,28 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from unittest import TestCase
+
+import torch
+
+from mmyolo.models import YOLOv8PAFPN
+from mmyolo.utils import register_all_modules
+
+register_all_modules()
+
+
+class TestYOLOv8PAFPN(TestCase):
+
+    def test_YOLOv8PAFPN_forward(self):
+        s = 64
+        in_channels = [8, 16, 32]
+        feat_sizes = [s // 2**i for i in range(4)]  # [32, 16, 8]
+        out_channels = [8, 16, 32]
+        feats = [
+            torch.rand(1, in_channels[i], feat_sizes[i], feat_sizes[i])
+            for i in range(len(in_channels))
+        ]
+        neck = YOLOv8PAFPN(in_channels=in_channels, out_channels=out_channels)
+        outs = neck(feats)
+        assert len(outs) == len(feats)
+        for i in range(len(feats)):
+            assert outs[i].shape[1] == out_channels[i]
+            assert outs[i].shape[2] == outs[i].shape[3] == s // (2**i)
diff --git a/mmdetection_practice/third_party/mmyolo/tests/test_models/test_necks/test_yolox_pafpn.py b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_necks/test_yolox_pafpn.py
new file mode 100644
index 0000000..25fe67a
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_necks/test_yolox_pafpn.py
@@ -0,0 +1,28 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from unittest import TestCase
+
+import torch
+
+from mmyolo.models.necks import YOLOXPAFPN
+from mmyolo.utils import register_all_modules
+
+register_all_modules()
+
+
+class TestYOLOXPAFPN(TestCase):
+
+    def test_forward(self):
+        s = 64
+        in_channels = [8, 16, 32]
+        feat_sizes = [s // 2**i for i in range(4)]  # [32, 16, 8]
+        out_channels = 24
+        feats = [
+            torch.rand(1, in_channels[i], feat_sizes[i], feat_sizes[i])
+            for i in range(len(in_channels))
+        ]
+        neck = YOLOXPAFPN(in_channels=in_channels, out_channels=out_channels)
+        outs = neck(feats)
+        assert len(outs) == len(feats)
+        for i in range(len(feats)):
+            assert outs[i].shape[1] == out_channels
+            assert outs[i].shape[2] == outs[i].shape[3] == s // (2**i)
diff --git a/mmdetection_practice/third_party/mmyolo/tests/test_models/test_plugins/__init__.py b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_plugins/__init__.py
new file mode 100644
index 0000000..ef101fe
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_plugins/__init__.py
@@ -0,0 +1 @@
+# Copyright (c) OpenMMLab. All rights reserved.
diff --git a/mmdetection_practice/third_party/mmyolo/tests/test_models/test_plugins/test_cbam.py b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_plugins/test_cbam.py
new file mode 100644
index 0000000..4af547c
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_plugins/test_cbam.py
@@ -0,0 +1,31 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+
+from unittest import TestCase
+
+import torch
+
+from mmyolo.models.plugins import CBAM
+from mmyolo.utils import register_all_modules
+
+register_all_modules()
+
+
+class TestCBAM(TestCase):
+
+    def test_forward(self):
+        tensor_shape = (2, 16, 20, 20)
+
+        images = torch.randn(*tensor_shape)
+        cbam = CBAM(16)
+        out = cbam(images)
+        self.assertEqual(out.shape, tensor_shape)
+
+        # test other ratio
+        cbam = CBAM(16, reduce_ratio=8)
+        out = cbam(images)
+        self.assertEqual(out.shape, tensor_shape)
+
+        # test other act_cfg in ChannelAttention
+        cbam = CBAM(in_channels=16, act_cfg=dict(type='Sigmoid'))
+        out = cbam(images)
+        self.assertEqual(out.shape, tensor_shape)
diff --git a/mmdetection_practice/third_party/mmyolo/tests/test_models/test_task_modules/__init__.py b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_task_modules/__init__.py
new file mode 100644
index 0000000..ef101fe
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_task_modules/__init__.py
@@ -0,0 +1 @@
+# Copyright (c) OpenMMLab. All rights reserved.
diff --git a/mmdetection_practice/third_party/mmyolo/tests/test_models/test_task_modules/test_assigners/__init__.py b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_task_modules/test_assigners/__init__.py
new file mode 100644
index 0000000..ef101fe
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_task_modules/test_assigners/__init__.py
@@ -0,0 +1 @@
+# Copyright (c) OpenMMLab. All rights reserved.
diff --git a/mmdetection_practice/third_party/mmyolo/tests/test_models/test_task_modules/test_assigners/test_batch_atss_assigner.py b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_task_modules/test_assigners/test_batch_atss_assigner.py
new file mode 100644
index 0000000..a01e4fc
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_task_modules/test_assigners/test_batch_atss_assigner.py
@@ -0,0 +1,175 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from unittest import TestCase
+
+import torch
+
+from mmyolo.models.task_modules.assigners import BatchATSSAssigner
+
+
+class TestBatchATSSAssigner(TestCase):
+
+    def test_batch_atss_assigner(self):
+        num_classes = 2
+        batch_size = 2
+        batch_atss_assigner = BatchATSSAssigner(
+            topk=3,
+            iou_calculator=dict(type='mmdet.BboxOverlaps2D'),
+            num_classes=num_classes)
+        priors = torch.FloatTensor([
+            [4., 4., 8., 8.],
+            [12., 4., 8., 8.],
+            [20., 4., 8., 8.],
+            [28., 4., 8., 8.],
+        ]).repeat(21, 1)
+        gt_bboxes = torch.FloatTensor([
+            [0, 0, 60, 93],
+            [229, 0, 532, 157],
+        ]).unsqueeze(0).repeat(batch_size, 1, 1)
+        gt_labels = torch.LongTensor([
+            [0],
+            [11],
+        ]).unsqueeze(0).repeat(batch_size, 1, 1)
+        num_level_bboxes = [64, 16, 4]
+        pad_bbox_flag = torch.FloatTensor([
+            [1],
+            [0],
+        ]).unsqueeze(0).repeat(batch_size, 1, 1)
+        pred_bboxes = torch.FloatTensor([
+            [-4., -4., 12., 12.],
+            [4., -4., 20., 12.],
+            [12., -4., 28., 12.],
+            [20., -4., 36., 12.],
+        ]).unsqueeze(0).repeat(batch_size, 21, 1)
+        batch_assign_result = batch_atss_assigner.forward(
+            pred_bboxes, priors, num_level_bboxes, gt_labels, gt_bboxes,
+            pad_bbox_flag)
+
+        assigned_labels = batch_assign_result['assigned_labels']
+        assigned_bboxes = batch_assign_result['assigned_bboxes']
+        assigned_scores = batch_assign_result['assigned_scores']
+        fg_mask_pre_prior = batch_assign_result['fg_mask_pre_prior']
+
+        self.assertEqual(assigned_labels.shape, torch.Size([batch_size, 84]))
+        self.assertEqual(assigned_bboxes.shape, torch.Size([batch_size, 84,
+                                                            4]))
+        self.assertEqual(assigned_scores.shape,
+                         torch.Size([batch_size, 84, num_classes]))
+        self.assertEqual(fg_mask_pre_prior.shape, torch.Size([batch_size, 84]))
+
+    def test_batch_atss_assigner_with_empty_gt(self):
+        """Test corner case where an image might have no true detections."""
+        num_classes = 2
+        batch_size = 2
+        batch_atss_assigner = BatchATSSAssigner(
+            topk=3,
+            iou_calculator=dict(type='mmdet.BboxOverlaps2D'),
+            num_classes=num_classes)
+        priors = torch.FloatTensor([
+            [4., 4., 8., 8.],
+            [12., 4., 8., 8.],
+            [20., 4., 8., 8.],
+            [28., 4., 8., 8.],
+        ]).repeat(21, 1)
+        num_level_bboxes = [64, 16, 4]
+        pad_bbox_flag = torch.FloatTensor([
+            [1],
+            [0],
+        ]).unsqueeze(0).repeat(batch_size, 1, 1)
+        pred_bboxes = torch.FloatTensor([
+            [-4., -4., 12., 12.],
+            [4., -4., 20., 12.],
+            [12., -4., 28., 12.],
+            [20., -4., 36., 12.],
+        ]).unsqueeze(0).repeat(batch_size, 21, 1)
+
+        gt_bboxes = torch.zeros(batch_size, 0, 4)
+        gt_labels = torch.zeros(batch_size, 0, 1)
+
+        batch_assign_result = batch_atss_assigner.forward(
+            pred_bboxes, priors, num_level_bboxes, gt_labels, gt_bboxes,
+            pad_bbox_flag)
+
+        assigned_labels = batch_assign_result['assigned_labels']
+        assigned_bboxes = batch_assign_result['assigned_bboxes']
+        assigned_scores = batch_assign_result['assigned_scores']
+        fg_mask_pre_prior = batch_assign_result['fg_mask_pre_prior']
+
+        self.assertEqual(assigned_labels.shape, torch.Size([batch_size, 84]))
+        self.assertEqual(assigned_bboxes.shape, torch.Size([batch_size, 84,
+                                                            4]))
+        self.assertEqual(assigned_scores.shape,
+                         torch.Size([batch_size, 84, num_classes]))
+        self.assertEqual(fg_mask_pre_prior.shape, torch.Size([batch_size, 84]))
+
+    def test_batch_atss_assigner_with_empty_boxs(self):
+        """Test corner case where a network might predict no boxes."""
+        num_classes = 2
+        batch_size = 2
+        batch_atss_assigner = BatchATSSAssigner(
+            topk=3,
+            iou_calculator=dict(type='mmdet.BboxOverlaps2D'),
+            num_classes=num_classes)
+        priors = torch.zeros(84, 4)
+        gt_bboxes = torch.FloatTensor([
+            [0, 0, 60, 93],
+            [229, 0, 532, 157],
+        ]).unsqueeze(0).repeat(batch_size, 1, 1)
+        gt_labels = torch.LongTensor([
+            [0],
+            [11],
+        ]).unsqueeze(0).repeat(batch_size, 1, 1)
+        num_level_bboxes = [64, 16, 4]
+        pad_bbox_flag = torch.FloatTensor([[1], [0]]).unsqueeze(0).repeat(
+            batch_size, 1, 1)
+        pred_bboxes = torch.FloatTensor([
+            [-4., -4., 12., 12.],
+            [4., -4., 20., 12.],
+            [12., -4., 28., 12.],
+            [20., -4., 36., 12.],
+        ]).unsqueeze(0).repeat(batch_size, 21, 1)
+
+        batch_assign_result = batch_atss_assigner.forward(
+            pred_bboxes, priors, num_level_bboxes, gt_labels, gt_bboxes,
+            pad_bbox_flag)
+        assigned_labels = batch_assign_result['assigned_labels']
+        assigned_bboxes = batch_assign_result['assigned_bboxes']
+        assigned_scores = batch_assign_result['assigned_scores']
+        fg_mask_pre_prior = batch_assign_result['fg_mask_pre_prior']
+
+        self.assertEqual(assigned_labels.shape, torch.Size([batch_size, 84]))
+        self.assertEqual(assigned_bboxes.shape, torch.Size([batch_size, 84,
+                                                            4]))
+        self.assertEqual(assigned_scores.shape,
+                         torch.Size([batch_size, 84, num_classes]))
+        self.assertEqual(fg_mask_pre_prior.shape, torch.Size([batch_size, 84]))
+
+    def test_batch_atss_assigner_with_empty_boxes_and_gt(self):
+        """Test corner case where a network might predict no boxes and no
+        gt."""
+        num_classes = 2
+        batch_size = 2
+        batch_atss_assigner = BatchATSSAssigner(
+            topk=3,
+            iou_calculator=dict(type='mmdet.BboxOverlaps2D'),
+            num_classes=num_classes)
+        priors = torch.zeros(84, 4)
+        gt_bboxes = torch.zeros(batch_size, 0, 4)
+        gt_labels = torch.zeros(batch_size, 0, 1)
+        num_level_bboxes = [64, 16, 4]
+        pad_bbox_flag = torch.zeros(batch_size, 0, 1)
+        pred_bboxes = torch.zeros(batch_size, 0, 4)
+
+        batch_assign_result = batch_atss_assigner.forward(
+            pred_bboxes, priors, num_level_bboxes, gt_labels, gt_bboxes,
+            pad_bbox_flag)
+        assigned_labels = batch_assign_result['assigned_labels']
+        assigned_bboxes = batch_assign_result['assigned_bboxes']
+        assigned_scores = batch_assign_result['assigned_scores']
+        fg_mask_pre_prior = batch_assign_result['fg_mask_pre_prior']
+
+        self.assertEqual(assigned_labels.shape, torch.Size([batch_size, 84]))
+        self.assertEqual(assigned_bboxes.shape, torch.Size([batch_size, 84,
+                                                            4]))
+        self.assertEqual(assigned_scores.shape,
+                         torch.Size([batch_size, 84, num_classes]))
+        self.assertEqual(fg_mask_pre_prior.shape, torch.Size([batch_size, 84]))
diff --git a/mmdetection_practice/third_party/mmyolo/tests/test_models/test_task_modules/test_assigners/test_batch_dsl_assigner.py b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_task_modules/test_assigners/test_batch_dsl_assigner.py
new file mode 100644
index 0000000..9644896
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_task_modules/test_assigners/test_batch_dsl_assigner.py
@@ -0,0 +1,192 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from unittest import TestCase
+
+import pytest
+import torch
+
+from mmyolo.models.task_modules.assigners import BatchDynamicSoftLabelAssigner
+
+
+class TestBatchDynamicSoftLabelAssigner(TestCase):
+
+    def test_assign(self):
+        num_classes = 2
+        batch_size = 2
+
+        assigner = BatchDynamicSoftLabelAssigner(
+            num_classes=num_classes,
+            soft_center_radius=3.0,
+            topk=1,
+            iou_weight=3.0)
+
+        pred_bboxes = torch.FloatTensor([
+            [23, 23, 43, 43],
+            [4, 5, 6, 7],
+        ]).unsqueeze(0).repeat(batch_size, 10, 1)
+
+        pred_scores = torch.FloatTensor([
+            [0.2],
+            [0.8],
+        ]).unsqueeze(0).repeat(batch_size, 10, 1)
+
+        priors = torch.FloatTensor([[30, 30, 8, 8], [4, 5, 6,
+                                                     7]]).repeat(10, 1)
+
+        gt_bboxes = torch.FloatTensor([[23, 23, 43, 43]]).unsqueeze(0).repeat(
+            batch_size, 1, 1)
+
+        gt_labels = torch.LongTensor([[0]
+                                      ]).unsqueeze(0).repeat(batch_size, 1, 1)
+        pad_bbox_flag = torch.FloatTensor([[1]]).unsqueeze(0).repeat(
+            batch_size, 1, 1)
+
+        assign_result = assigner.forward(pred_bboxes, pred_scores, priors,
+                                         gt_labels, gt_bboxes, pad_bbox_flag)
+
+        assigned_labels = assign_result['assigned_labels']
+        assigned_labels_weights = assign_result['assigned_labels_weights']
+        assigned_bboxes = assign_result['assigned_bboxes']
+        assign_metrics = assign_result['assign_metrics']
+
+        self.assertEqual(assigned_labels.shape, torch.Size([batch_size, 20]))
+        self.assertEqual(assigned_bboxes.shape, torch.Size([batch_size, 20,
+                                                            4]))
+        self.assertEqual(assigned_labels_weights.shape,
+                         torch.Size([batch_size, 20]))
+        self.assertEqual(assign_metrics.shape, torch.Size([batch_size, 20]))
+
+    def test_assign_with_empty_gt(self):
+        num_classes = 2
+        batch_size = 2
+
+        assigner = BatchDynamicSoftLabelAssigner(
+            num_classes=num_classes,
+            soft_center_radius=3.0,
+            topk=1,
+            iou_weight=3.0)
+
+        pred_bboxes = torch.FloatTensor([
+            [23, 23, 43, 43],
+            [4, 5, 6, 7],
+        ]).unsqueeze(0).repeat(batch_size, 10, 1)
+
+        pred_scores = torch.FloatTensor([
+            [0.2],
+            [0.8],
+        ]).unsqueeze(0).repeat(batch_size, 10, 1)
+
+        priors = torch.FloatTensor([[30, 30, 8, 8], [4, 5, 6,
+                                                     7]]).repeat(10, 1)
+
+        gt_bboxes = torch.zeros(batch_size, 0, 4)
+        gt_labels = torch.zeros(batch_size, 0, 1)
+        pad_bbox_flag = torch.zeros(batch_size, 0, 1)
+
+        assign_result = assigner.forward(pred_bboxes, pred_scores, priors,
+                                         gt_labels, gt_bboxes, pad_bbox_flag)
+
+        assigned_labels = assign_result['assigned_labels']
+        assigned_labels_weights = assign_result['assigned_labels_weights']
+        assigned_bboxes = assign_result['assigned_bboxes']
+        assign_metrics = assign_result['assign_metrics']
+
+        self.assertEqual(assigned_labels.shape, torch.Size([batch_size, 20]))
+        self.assertEqual(assigned_bboxes.shape, torch.Size([batch_size, 20,
+                                                            4]))
+        self.assertEqual(assigned_labels_weights.shape,
+                         torch.Size([batch_size, 20]))
+        self.assertEqual(assign_metrics.shape, torch.Size([batch_size, 20]))
+
+    def test_assign_with_empty_boxs(self):
+        num_classes = 2
+        batch_size = 2
+
+        assigner = BatchDynamicSoftLabelAssigner(
+            num_classes=num_classes,
+            soft_center_radius=3.0,
+            topk=1,
+            iou_weight=3.0)
+
+        pred_bboxes = torch.zeros(batch_size, 0, 4)
+
+        pred_scores = torch.zeros(batch_size, 0, 4)
+
+        priors = torch.zeros(0, 4)
+        gt_bboxes = torch.FloatTensor([[23, 23, 43, 43]]).unsqueeze(0).repeat(
+            batch_size, 1, 1)
+
+        gt_labels = torch.LongTensor([[0]
+                                      ]).unsqueeze(0).repeat(batch_size, 1, 1)
+        pad_bbox_flag = torch.FloatTensor([[1]]).unsqueeze(0).repeat(
+            batch_size, 1, 1)
+
+        assign_result = assigner.forward(pred_bboxes, pred_scores, priors,
+                                         gt_labels, gt_bboxes, pad_bbox_flag)
+
+        assigned_labels = assign_result['assigned_labels']
+        assigned_labels_weights = assign_result['assigned_labels_weights']
+        assigned_bboxes = assign_result['assigned_bboxes']
+        assign_metrics = assign_result['assign_metrics']
+
+        self.assertEqual(assigned_labels.shape, torch.Size([batch_size, 0]))
+        self.assertEqual(assigned_bboxes.shape, torch.Size([batch_size, 0, 4]))
+        self.assertEqual(assigned_labels_weights.shape,
+                         torch.Size([batch_size, 0]))
+        self.assertEqual(assign_metrics.shape, torch.Size([batch_size, 0]))
+
+    def test_assign_rotate_box(self):
+        try:
+            import importlib
+            importlib.import_module('mmrotate')
+        except ImportError:
+            pytest.skip('mmrotate is not installed.', allow_module_level=True)
+
+        num_classes = 2
+        batch_size = 2
+
+        assigner = BatchDynamicSoftLabelAssigner(
+            num_classes=num_classes,
+            soft_center_radius=3.0,
+            topk=1,
+            iou_weight=3.0,
+            iou_calculator=dict(type='mmrotate.RBboxOverlaps2D'),
+            # RBboxOverlaps2D doesn't support batch input, use loop instead.
+            batch_iou=False,
+        )
+
+        pred_bboxes = torch.FloatTensor([
+            [23, 23, 20, 20, 0.078],
+            [4, 5, 2, 2, 0.078],
+        ]).unsqueeze(0).repeat(batch_size, 10, 1)
+
+        pred_scores = torch.FloatTensor([
+            [0.2],
+            [0.8],
+        ]).unsqueeze(0).repeat(batch_size, 10, 1)
+
+        priors = torch.FloatTensor([[30, 30, 8, 8], [4, 5, 6,
+                                                     7]]).repeat(10, 1)
+
+        gt_bboxes = torch.FloatTensor([[23, 23, 20, 20,
+                                        0.078]]).unsqueeze(0).repeat(
+                                            batch_size, 1, 1)
+
+        gt_labels = torch.LongTensor([[0]
+                                      ]).unsqueeze(0).repeat(batch_size, 1, 1)
+        pad_bbox_flag = torch.FloatTensor([[1]]).unsqueeze(0).repeat(
+            batch_size, 1, 1)
+
+        assign_result = assigner.forward(pred_bboxes, pred_scores, priors,
+                                         gt_labels, gt_bboxes, pad_bbox_flag)
+
+        assigned_labels = assign_result['assigned_labels']
+        assigned_labels_weights = assign_result['assigned_labels_weights']
+        assigned_bboxes = assign_result['assigned_bboxes']
+        assign_metrics = assign_result['assign_metrics']
+
+        self.assertEqual(assigned_labels.shape, torch.Size([batch_size, 20]))
+        self.assertEqual(assigned_bboxes.shape, torch.Size([batch_size, 20,
+                                                            5]))
+        self.assertEqual(assigned_labels_weights.shape,
+                         torch.Size([batch_size, 20]))
+        self.assertEqual(assign_metrics.shape, torch.Size([batch_size, 20]))
diff --git a/mmdetection_practice/third_party/mmyolo/tests/test_models/test_task_modules/test_assigners/test_batch_task_aligned_assigner.py b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_task_modules/test_assigners/test_batch_task_aligned_assigner.py
new file mode 100644
index 0000000..fe474b5
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_task_modules/test_assigners/test_batch_task_aligned_assigner.py
@@ -0,0 +1,56 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from unittest import TestCase
+
+import torch
+
+from mmyolo.models.task_modules.assigners import BatchTaskAlignedAssigner
+
+
+class TestBatchTaskAlignedAssigner(TestCase):
+
+    def test_batch_task_aligned_assigner(self):
+        batch_size = 2
+        num_classes = 4
+        assigner = BatchTaskAlignedAssigner(
+            num_classes=num_classes, alpha=1, beta=6, topk=13, eps=1e-9)
+        pred_scores = torch.FloatTensor([
+            [0.1, 0.2],
+            [0.2, 0.3],
+            [0.3, 0.4],
+            [0.4, 0.5],
+        ]).unsqueeze(0).repeat(batch_size, 21, 1)
+        priors = torch.FloatTensor([
+            [0, 0, 4., 4.],
+            [0, 0, 12., 4.],
+            [0, 0, 20., 4.],
+            [0, 0, 28., 4.],
+        ]).repeat(21, 1)
+        gt_bboxes = torch.FloatTensor([
+            [0, 0, 60, 93],
+            [229, 0, 532, 157],
+        ]).unsqueeze(0).repeat(batch_size, 1, 1)
+        gt_labels = torch.LongTensor([[0], [1]
+                                      ]).unsqueeze(0).repeat(batch_size, 1, 1)
+        pad_bbox_flag = torch.FloatTensor([[1], [0]]).unsqueeze(0).repeat(
+            batch_size, 1, 1)
+        pred_bboxes = torch.FloatTensor([
+            [-4., -4., 12., 12.],
+            [4., -4., 20., 12.],
+            [12., -4., 28., 12.],
+            [20., -4., 36., 12.],
+        ]).unsqueeze(0).repeat(batch_size, 21, 1)
+
+        assign_result = assigner.forward(pred_bboxes, pred_scores, priors,
+                                         gt_labels, gt_bboxes, pad_bbox_flag)
+
+        assigned_labels = assign_result['assigned_labels']
+        assigned_bboxes = assign_result['assigned_bboxes']
+        assigned_scores = assign_result['assigned_scores']
+        fg_mask_pre_prior = assign_result['fg_mask_pre_prior']
+
+        self.assertEqual(assigned_labels.shape, torch.Size([batch_size, 84]))
+        self.assertEqual(assigned_bboxes.shape, torch.Size([batch_size, 84,
+                                                            4]))
+        self.assertEqual(assigned_scores.shape,
+                         torch.Size([batch_size, 84, num_classes]))
+        self.assertEqual(fg_mask_pre_prior.shape, torch.Size([batch_size, 84]))
diff --git a/mmdetection_practice/third_party/mmyolo/tests/test_models/test_task_modules/test_assigners/test_pose_sim_ota_assigner.py b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_task_modules/test_assigners/test_pose_sim_ota_assigner.py
new file mode 100644
index 0000000..fb4793f
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_task_modules/test_assigners/test_pose_sim_ota_assigner.py
@@ -0,0 +1,85 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from unittest import TestCase
+
+import torch
+from mmengine.structures import InstanceData
+from mmengine.testing import assert_allclose
+
+from mmyolo.models.task_modules.assigners import PoseSimOTAAssigner
+
+
+class TestPoseSimOTAAssigner(TestCase):
+
+    def test_assign(self):
+        assigner = PoseSimOTAAssigner(
+            center_radius=2.5,
+            candidate_topk=1,
+            iou_weight=3.0,
+            cls_weight=1.0,
+            iou_calculator=dict(type='mmdet.BboxOverlaps2D'))
+        pred_instances = InstanceData(
+            bboxes=torch.Tensor([[23, 23, 43, 43] + [1] * 51,
+                                 [4, 5, 6, 7] + [1] * 51]),
+            scores=torch.FloatTensor([[0.2], [0.8]]),
+            priors=torch.Tensor([[30, 30, 8, 8], [4, 5, 6, 7]]))
+        gt_instances = InstanceData(
+            bboxes=torch.Tensor([[23, 23, 43, 43]]),
+            labels=torch.LongTensor([0]),
+            keypoints_visible=torch.Tensor([[
+                1., 1., 1., 1., 1., 1., 1., 1., 0., 1., 1., 0., 0., 0., 0., 0.,
+                0.
+            ]]),
+            keypoints=torch.Tensor([[[30, 30], [30, 30], [30, 30], [30, 30],
+                                     [30, 30], [30, 30], [30, 30], [30, 30],
+                                     [30, 30], [30, 30], [30, 30], [30, 30],
+                                     [30, 30], [30, 30], [30, 30], [30, 30],
+                                     [30, 30]]]))
+        assign_result = assigner.assign(
+            pred_instances=pred_instances, gt_instances=gt_instances)
+
+        expected_gt_inds = torch.LongTensor([1, 0])
+        assert_allclose(assign_result.gt_inds, expected_gt_inds)
+
+    def test_assign_with_no_valid_bboxes(self):
+        assigner = PoseSimOTAAssigner(
+            center_radius=2.5,
+            candidate_topk=1,
+            iou_weight=3.0,
+            cls_weight=1.0,
+            iou_calculator=dict(type='mmdet.BboxOverlaps2D'))
+        pred_instances = InstanceData(
+            bboxes=torch.Tensor([[123, 123, 143, 143], [114, 151, 161, 171]]),
+            scores=torch.FloatTensor([[0.2], [0.8]]),
+            priors=torch.Tensor([[30, 30, 8, 8], [55, 55, 8, 8]]))
+        gt_instances = InstanceData(
+            bboxes=torch.Tensor([[0, 0, 1, 1]]),
+            labels=torch.LongTensor([0]),
+            keypoints_visible=torch.zeros((1, 17)),
+            keypoints=torch.zeros((1, 17, 2)))
+        assign_result = assigner.assign(
+            pred_instances=pred_instances, gt_instances=gt_instances)
+
+        expected_gt_inds = torch.LongTensor([0, 0])
+        assert_allclose(assign_result.gt_inds, expected_gt_inds)
+
+    def test_assign_with_empty_gt(self):
+        assigner = PoseSimOTAAssigner(
+            center_radius=2.5,
+            candidate_topk=1,
+            iou_weight=3.0,
+            cls_weight=1.0,
+            iou_calculator=dict(type='mmdet.BboxOverlaps2D'))
+        pred_instances = InstanceData(
+            bboxes=torch.Tensor([[[30, 40, 50, 60]], [[4, 5, 6, 7]]]),
+            scores=torch.FloatTensor([[0.2], [0.8]]),
+            priors=torch.Tensor([[0, 12, 23, 34], [4, 5, 6, 7]]))
+        gt_instances = InstanceData(
+            bboxes=torch.empty(0, 4),
+            labels=torch.empty(0),
+            keypoints_visible=torch.empty(0, 17),
+            keypoints=torch.empty(0, 17, 2))
+
+        assign_result = assigner.assign(
+            pred_instances=pred_instances, gt_instances=gt_instances)
+        expected_gt_inds = torch.LongTensor([0, 0])
+        assert_allclose(assign_result.gt_inds, expected_gt_inds)
diff --git a/mmdetection_practice/third_party/mmyolo/tests/test_models/test_task_modules/test_coders/__init__.py b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_task_modules/test_coders/__init__.py
new file mode 100644
index 0000000..ef101fe
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_task_modules/test_coders/__init__.py
@@ -0,0 +1 @@
+# Copyright (c) OpenMMLab. All rights reserved.
diff --git a/mmdetection_practice/third_party/mmyolo/tests/test_models/test_task_modules/test_coders/test_distance_point_bbox_coder.py b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_task_modules/test_coders/test_distance_point_bbox_coder.py
new file mode 100644
index 0000000..10b0215
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_task_modules/test_coders/test_distance_point_bbox_coder.py
@@ -0,0 +1,29 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from unittest import TestCase
+
+import torch
+
+from mmyolo.models.task_modules.coders import DistancePointBBoxCoder
+
+
+class TestDistancePointBBoxCoder(TestCase):
+
+    def test_decoder(self):
+        coder = DistancePointBBoxCoder()
+
+        points = torch.Tensor([[74., 61.], [-29., 106.], [138., 61.],
+                               [29., 170.]])
+        pred_bboxes = torch.Tensor([[0, -1, 3, 3], [-1, -7, -4.8, 9],
+                                    [-23, -1, 12, 1], [14.5, -13, 10, 18.3]])
+        expected_distance = torch.Tensor([[74, 63, 80, 67],
+                                          [-25, 134, -48.2, 142],
+                                          [276, 67, 210, 67],
+                                          [-58, 248, 89, 279.8]])
+        strides = torch.Tensor([2, 4, 6, 6])
+        out_distance = coder.decode(points, pred_bboxes, strides)
+        assert expected_distance.allclose(out_distance)
+
+        batch_priors = points.unsqueeze(0).repeat(2, 1, 1)
+        batch_pred_bboxes = pred_bboxes.unsqueeze(0).repeat(2, 1, 1)
+        batch_out = coder.decode(batch_priors, batch_pred_bboxes, strides)[0]
+        assert out_distance.allclose(batch_out)
diff --git a/mmdetection_practice/third_party/mmyolo/tests/test_models/test_task_modules/test_coders/test_yolov5_bbox_coder.py b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_task_modules/test_coders/test_yolov5_bbox_coder.py
new file mode 100644
index 0000000..e1d4ebe
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_task_modules/test_coders/test_yolov5_bbox_coder.py
@@ -0,0 +1,32 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from unittest import TestCase
+
+import torch
+
+from mmyolo.models.task_modules.coders import YOLOv5BBoxCoder
+
+
+class TestYOLOv5Coder(TestCase):
+
+    def test_decoder(self):
+        coder = YOLOv5BBoxCoder()
+
+        priors = torch.Tensor([[10., 10., 20., 20.], [10., 8., 10., 10.],
+                               [15., 8., 20., 3.], [2., 5., 5., 8.]])
+        pred_bboxes = torch.Tensor([[0.0000, 0.0000, 1.0000, 1.0000],
+                                    [0.1409, 0.1409, 2.8591, 2.8591],
+                                    [0.0000, 0.3161, 4.1945, 0.6839],
+                                    [1.0000, 5.0000, 9.0000, 5.0000]])
+        strides = torch.Tensor([2, 4, 8, 8])
+        expected_decode_bboxes = torch.Tensor(
+            [[4.3111, 4.3111, 25.6889, 25.6889],
+             [10.2813, 5.7033, 10.2813, 12.8594],
+             [7.7949, 11.1710, 27.2051, 2.3369],
+             [1.1984, 8.4730, 13.1955, 20.3129]])
+        out = coder.decode(priors, pred_bboxes, strides)
+        assert expected_decode_bboxes.allclose(out, atol=1e-04)
+
+        batch_priors = priors.unsqueeze(0).repeat(2, 1, 1)
+        batch_pred_bboxes = pred_bboxes.unsqueeze(0).repeat(2, 1, 1)
+        batch_out = coder.decode(batch_priors, batch_pred_bboxes, strides)[0]
+        assert out.allclose(batch_out)
diff --git a/mmdetection_practice/third_party/mmyolo/tests/test_models/test_task_modules/test_coders/test_yolox_bbox_coder.py b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_task_modules/test_coders/test_yolox_bbox_coder.py
new file mode 100644
index 0000000..00d6c31
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_task_modules/test_coders/test_yolox_bbox_coder.py
@@ -0,0 +1,31 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from unittest import TestCase
+
+import torch
+
+from mmyolo.models.task_modules.coders import YOLOXBBoxCoder
+
+
+class TestYOLOv5Coder(TestCase):
+
+    def test_decoder(self):
+        coder = YOLOXBBoxCoder()
+
+        priors = torch.Tensor([[10., 10.], [8., 8.], [15., 8.], [2., 5.]])
+        pred_bboxes = torch.Tensor([[0.0000, 0.0000, 1.0000, 1.0000],
+                                    [0.0409, 0.1409, 0.8591, 0.8591],
+                                    [0.0000, 0.3161, 0.1945, 0.6839],
+                                    [1.0000, 5.0000, 0.2000, 0.6000]])
+        strides = torch.Tensor([2, 4, 6, 6])
+        expected_decode_bboxes = torch.Tensor(
+            [[7.2817, 7.2817, 12.7183, 12.7183],
+             [3.4415, 3.8415, 12.8857, 13.2857],
+             [11.3559, 3.9518, 18.6441, 15.8414],
+             [4.3358, 29.5336, 11.6642, 40.4664]])
+        out = coder.decode(priors, pred_bboxes, strides)
+        assert expected_decode_bboxes.allclose(out, atol=1e-04)
+
+        batch_priors = priors.unsqueeze(0).repeat(2, 1, 1)
+        batch_pred_bboxes = pred_bboxes.unsqueeze(0).repeat(2, 1, 1)
+        batch_out = coder.decode(batch_priors, batch_pred_bboxes, strides)[0]
+        assert out.allclose(batch_out)
diff --git a/mmdetection_practice/third_party/mmyolo/tests/test_models/test_utils/__init__.py b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_utils/__init__.py
new file mode 100644
index 0000000..ef101fe
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_utils/__init__.py
@@ -0,0 +1 @@
+# Copyright (c) OpenMMLab. All rights reserved.
diff --git a/mmdetection_practice/third_party/mmyolo/tests/test_models/test_utils/test_misc.py b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_utils/test_misc.py
new file mode 100644
index 0000000..dce9502
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tests/test_models/test_utils/test_misc.py
@@ -0,0 +1,35 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+import numpy as np
+import pytest
+import torch
+from mmengine.structures import InstanceData
+from torch import Tensor
+
+from mmyolo.models.utils import gt_instances_preprocess
+from mmyolo.utils import register_all_modules
+
+register_all_modules()
+
+
+class TestGtInstancesPreprocess:
+
+    @pytest.mark.parametrize('box_dim', [4, 5])
+    def test(self, box_dim):
+        gt_instances = InstanceData(
+            bboxes=torch.empty((0, box_dim)), labels=torch.LongTensor([]))
+        batch_size = 1
+        batch_instance = gt_instances_preprocess([gt_instances], batch_size)
+        assert isinstance(batch_instance, Tensor)
+        assert len(batch_instance.shape) == 3, 'the len of result must be 3.'
+        assert batch_instance.size(-1) == box_dim + 1
+
+    @pytest.mark.parametrize('box_dim', [4, 5])
+    def test_fast_version(self, box_dim: int):
+        gt_instances = torch.from_numpy(
+            np.array([[0., 1., *(0., ) * box_dim]], dtype=np.float32))
+        batch_size = 1
+        batch_instance = gt_instances_preprocess(gt_instances, batch_size)
+        assert isinstance(batch_instance, Tensor)
+        assert len(batch_instance.shape) == 3, 'the len of result must be 3.'
+        assert batch_instance.shape[1] == 1
+        assert batch_instance.shape[2] == box_dim + 1
diff --git a/mmdetection_practice/third_party/mmyolo/tests/test_utils/test_collect_env.py b/mmdetection_practice/third_party/mmyolo/tests/test_utils/test_collect_env.py
new file mode 100644
index 0000000..913f46f
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tests/test_utils/test_collect_env.py
@@ -0,0 +1,33 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+import sys
+from unittest import TestCase
+
+import mmcv
+import mmdet
+import mmengine
+
+from mmyolo.utils import collect_env
+
+
+class TestCollectEnv(TestCase):
+
+    def test_collect_env(self):
+        env_info = collect_env()
+        print(env_info)
+        expected_keys = [
+            'sys.platform', 'Python', 'CUDA available', 'PyTorch',
+            'PyTorch compiling details', 'OpenCV', 'MMEngine', 'GCC'
+        ]
+        for key in expected_keys:
+            assert key in env_info
+
+        if env_info['CUDA available']:
+            for key in ['CUDA_HOME', 'NVCC']:
+                assert key in env_info
+
+        assert env_info['sys.platform'] == sys.platform
+        assert env_info['Python'] == sys.version.replace('\n', '')
+
+        assert env_info['MMEngine'] == mmengine.__version__
+        assert env_info['MMCV'] == mmcv.__version__
+        assert env_info['MMDetection'] == mmdet.__version__
diff --git a/mmdetection_practice/third_party/mmyolo/tests/test_utils/test_setup_env.py b/mmdetection_practice/third_party/mmyolo/tests/test_utils/test_setup_env.py
new file mode 100644
index 0000000..e6bd689
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tests/test_utils/test_setup_env.py
@@ -0,0 +1,39 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+import datetime
+import sys
+from unittest import TestCase
+
+from mmengine import DefaultScope
+
+from mmyolo.utils import register_all_modules
+
+
+class TestSetupEnv(TestCase):
+
+    def test_register_all_modules(self):
+        from mmyolo.registry import DATASETS
+
+        # not init default scope
+        sys.modules.pop('mmyolo.datasets', None)
+        sys.modules.pop('mmyolo.datasets.yolov5_coco', None)
+        DATASETS._module_dict.pop('YOLOv5CocoDataset', None)
+        self.assertFalse('YOLOv5CocoDataset' in DATASETS.module_dict)
+        register_all_modules(init_default_scope=False)
+        self.assertTrue('YOLOv5CocoDataset' in DATASETS.module_dict)
+
+        # init default scope
+        sys.modules.pop('mmyolo.datasets', None)
+        sys.modules.pop('mmyolo.datasets.yolov5_coco', None)
+        DATASETS._module_dict.pop('YOLOv5CocoDataset', None)
+        self.assertFalse('YOLOv5CocoDataset' in DATASETS.module_dict)
+        register_all_modules(init_default_scope=True)
+        self.assertTrue('YOLOv5CocoDataset' in DATASETS.module_dict)
+        self.assertEqual(DefaultScope.get_current_instance().scope_name,
+                         'mmyolo')
+
+        # init default scope when another scope is init
+        name = f'test-{datetime.datetime.now()}'
+        DefaultScope.get_instance(name, scope_name='test')
+        with self.assertWarnsRegex(
+                Warning, 'The current default scope "test" is not "mmyolo"'):
+            register_all_modules(init_default_scope=True)
diff --git a/mmdetection_practice/third_party/mmyolo/tools/analysis_tools/benchmark.py b/mmdetection_practice/third_party/mmyolo/tools/analysis_tools/benchmark.py
new file mode 100644
index 0000000..29f53a4
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tools/analysis_tools/benchmark.py
@@ -0,0 +1,188 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+import argparse
+import copy
+import os
+import time
+
+import torch
+from mmengine import Config, DictAction
+from mmengine.dist import get_world_size, init_dist
+from mmengine.logging import MMLogger, print_log
+from mmengine.registry import init_default_scope
+from mmengine.runner import Runner, load_checkpoint
+from mmengine.utils import mkdir_or_exist
+from mmengine.utils.dl_utils import set_multi_processing
+
+from mmyolo.registry import MODELS
+
+
+# TODO: Refactoring and improving
+def parse_args():
+    parser = argparse.ArgumentParser(description='MMYOLO benchmark a model')
+    parser.add_argument('config', help='test config file path')
+    parser.add_argument('checkpoint', help='checkpoint file')
+    parser.add_argument(
+        '--repeat-num',
+        type=int,
+        default=1,
+        help='number of repeat times of measurement for averaging the results')
+    parser.add_argument(
+        '--max-iter', type=int, default=2000, help='num of max iter')
+    parser.add_argument(
+        '--log-interval', type=int, default=50, help='interval of logging')
+    parser.add_argument(
+        '--work-dir',
+        help='the directory to save the file containing '
+        'benchmark metrics')
+    parser.add_argument(
+        '--fuse-conv-bn',
+        action='store_true',
+        help='Whether to fuse conv and bn, this will slightly increase'
+        'the inference speed')
+    parser.add_argument(
+        '--cfg-options',
+        nargs='+',
+        action=DictAction,
+        help='override some settings in the used config, the key-value pair '
+        'in xxx=yyy format will be merged into config file. If the value to '
+        'be overwritten is a list, it should be like key="[a,b]" or key=a,b '
+        'It also allows nested list/tuple values, e.g. key="[(a,b),(c,d)]" '
+        'Note that the quotation marks are necessary and that no white space '
+        'is allowed.')
+    parser.add_argument(
+        '--launcher',
+        choices=['none', 'pytorch', 'slurm', 'mpi'],
+        default='none',
+        help='job launcher')
+    parser.add_argument('--local_rank', type=int, default=0)
+    args = parser.parse_args()
+    if 'LOCAL_RANK' not in os.environ:
+        os.environ['LOCAL_RANK'] = str(args.local_rank)
+    return args
+
+
+def measure_inference_speed(cfg, checkpoint, max_iter, log_interval,
+                            is_fuse_conv_bn):
+    env_cfg = cfg.get('env_cfg')
+    if env_cfg.get('cudnn_benchmark'):
+        torch.backends.cudnn.benchmark = True
+
+    mp_cfg: dict = env_cfg.get('mp_cfg', {})
+    set_multi_processing(**mp_cfg, distributed=cfg.distributed)
+
+    # Because multiple processes will occupy additional CPU resources,
+    # FPS statistics will be more unstable when num_workers is not 0.
+    # It is reasonable to set num_workers to 0.
+    dataloader_cfg = cfg.test_dataloader
+    dataloader_cfg['num_workers'] = 0
+    dataloader_cfg['batch_size'] = 1
+    dataloader_cfg['persistent_workers'] = False
+    data_loader = Runner.build_dataloader(dataloader_cfg)
+
+    # build the model and load checkpoint
+    model = MODELS.build(cfg.model)
+    load_checkpoint(model, checkpoint, map_location='cpu')
+    model = model.cuda()
+    model.eval()
+
+    # the first several iterations may be very slow so skip them
+    num_warmup = 5
+    pure_inf_time = 0
+    fps = 0
+
+    # benchmark with 2000 image and take the average
+    for i, data in enumerate(data_loader):
+
+        torch.cuda.synchronize()
+        start_time = time.perf_counter()
+
+        with torch.no_grad():
+            model.test_step(data)
+
+        torch.cuda.synchronize()
+        elapsed = time.perf_counter() - start_time
+
+        if i >= num_warmup:
+            pure_inf_time += elapsed
+            if (i + 1) % log_interval == 0:
+                fps = (i + 1 - num_warmup) / pure_inf_time
+                print_log(
+                    f'Done image [{i + 1:<3}/ {max_iter}], '
+                    f'fps: {fps:.1f} img / s, '
+                    f'times per image: {1000 / fps:.1f} ms / img', 'current')
+
+        if (i + 1) == max_iter:
+            fps = (i + 1 - num_warmup) / pure_inf_time
+            print_log(
+                f'Overall fps: {fps:.1f} img / s, '
+                f'times per image: {1000 / fps:.1f} ms / img', 'current')
+            break
+    return fps
+
+
+def repeat_measure_inference_speed(cfg,
+                                   checkpoint,
+                                   max_iter,
+                                   log_interval,
+                                   is_fuse_conv_bn,
+                                   repeat_num=1):
+    assert repeat_num >= 1
+
+    fps_list = []
+
+    for _ in range(repeat_num):
+        cp_cfg = copy.deepcopy(cfg)
+
+        fps_list.append(
+            measure_inference_speed(cp_cfg, checkpoint, max_iter, log_interval,
+                                    is_fuse_conv_bn))
+
+    if repeat_num > 1:
+        fps_list_ = [round(fps, 1) for fps in fps_list]
+        times_pre_image_list_ = [round(1000 / fps, 1) for fps in fps_list]
+        mean_fps_ = sum(fps_list_) / len(fps_list_)
+        mean_times_pre_image_ = sum(times_pre_image_list_) / len(
+            times_pre_image_list_)
+        print_log(
+            f'Overall fps: {fps_list_}[{mean_fps_:.1f}] img / s, '
+            f'times per image: '
+            f'{times_pre_image_list_}[{mean_times_pre_image_:.1f}] ms / img',
+            'current')
+        return fps_list
+
+    return fps_list[0]
+
+
+# TODO: refactoring
+def main():
+    args = parse_args()
+
+    cfg = Config.fromfile(args.config)
+    if args.cfg_options is not None:
+        cfg.merge_from_dict(args.cfg_options)
+
+    init_default_scope(cfg.get('default_scope', 'mmyolo'))
+
+    distributed = False
+    if args.launcher != 'none':
+        init_dist(args.launcher, **cfg.get('env_cfg', {}).get('dist_cfg', {}))
+        distributed = True
+        assert get_world_size(
+        ) == 1, 'Inference benchmark does not allow distributed multi-GPU'
+
+    cfg.distributed = distributed
+
+    log_file = None
+    if args.work_dir:
+        log_file = os.path.join(args.work_dir, 'benchmark.log')
+        mkdir_or_exist(args.work_dir)
+
+    MMLogger.get_instance('mmyolo', log_file=log_file, log_level='INFO')
+
+    repeat_measure_inference_speed(cfg, args.checkpoint, args.max_iter,
+                                   args.log_interval, args.fuse_conv_bn,
+                                   args.repeat_num)
+
+
+if __name__ == '__main__':
+    main()
diff --git a/mmdetection_practice/third_party/mmyolo/tools/analysis_tools/browse_coco_json.py b/mmdetection_practice/third_party/mmyolo/tools/analysis_tools/browse_coco_json.py
new file mode 100644
index 0000000..71a2fc2
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tools/analysis_tools/browse_coco_json.py
@@ -0,0 +1,147 @@
+import argparse
+import os.path as osp
+
+import cv2
+import matplotlib.pyplot as plt
+import numpy as np
+from matplotlib.collections import PatchCollection
+from matplotlib.patches import Polygon
+from pycocotools.coco import COCO
+
+
+def show_coco_json(args):
+    if args.data_root is not None:
+        coco = COCO(osp.join(args.data_root, args.ann_file))
+    else:
+        coco = COCO(args.ann_file)
+    print(f'Total number of images:{len(coco.getImgIds())}')
+    categories = coco.loadCats(coco.getCatIds())
+    category_names = [category['name'] for category in categories]
+    print(f'Total number of Categories : {len(category_names)}')
+    print('Categories: \n{}\n'.format(' '.join(category_names)))
+
+    if args.category_names is None:
+        category_ids = []
+    else:
+        assert set(category_names) > set(args.category_names)
+        category_ids = coco.getCatIds(args.category_names)
+
+    image_ids = coco.getImgIds(catIds=category_ids)
+
+    if args.shuffle:
+        np.random.shuffle(image_ids)
+
+    for i in range(len(image_ids)):
+        image_data = coco.loadImgs(image_ids[i])[0]
+        if args.data_root is not None:
+            image_path = osp.join(args.data_root, args.img_dir,
+                                  image_data['file_name'])
+        else:
+            image_path = osp.join(args.img_dir, image_data['file_name'])
+
+        annotation_ids = coco.getAnnIds(
+            imgIds=image_data['id'], catIds=category_ids, iscrowd=0)
+        annotations = coco.loadAnns(annotation_ids)
+
+        image = cv2.imread(image_path)
+        image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
+
+        plt.figure()
+        plt.imshow(image)
+
+        if args.disp_all:
+            coco.showAnns(annotations)
+        else:
+            show_bbox_only(coco, annotations)
+
+        if args.wait_time == 0:
+            plt.show()
+        else:
+            plt.show(block=False)
+            plt.pause(args.wait_time)
+
+        plt.close()
+
+
+def show_bbox_only(coco, anns, show_label_bbox=True, is_filling=True):
+    """Show bounding box of annotations Only."""
+    if len(anns) == 0:
+        return
+
+    ax = plt.gca()
+    ax.set_autoscale_on(False)
+
+    image2color = dict()
+    for cat in coco.getCatIds():
+        image2color[cat] = (np.random.random((1, 3)) * 0.7 + 0.3).tolist()[0]
+
+    polygons = []
+    colors = []
+
+    for ann in anns:
+        color = image2color[ann['category_id']]
+        bbox_x, bbox_y, bbox_w, bbox_h = ann['bbox']
+        poly = [[bbox_x, bbox_y], [bbox_x, bbox_y + bbox_h],
+                [bbox_x + bbox_w, bbox_y + bbox_h], [bbox_x + bbox_w, bbox_y]]
+        polygons.append(Polygon(np.array(poly).reshape((4, 2))))
+        colors.append(color)
+
+        if show_label_bbox:
+            label_bbox = dict(facecolor=color)
+        else:
+            label_bbox = None
+
+        ax.text(
+            bbox_x,
+            bbox_y,
+            '%s' % (coco.loadCats(ann['category_id'])[0]['name']),
+            color='white',
+            bbox=label_bbox)
+
+    if is_filling:
+        p = PatchCollection(
+            polygons, facecolor=colors, linewidths=0, alpha=0.4)
+        ax.add_collection(p)
+    p = PatchCollection(
+        polygons, facecolor='none', edgecolors=colors, linewidths=2)
+    ax.add_collection(p)
+
+
+def parse_args():
+    parser = argparse.ArgumentParser(description='Show coco json file')
+    parser.add_argument('--data-root', default=None, help='dataset root')
+    parser.add_argument(
+        '--img-dir', default='data/coco/train2017', help='image folder path')
+    parser.add_argument(
+        '--ann-file',
+        default='data/coco/annotations/instances_train2017.json',
+        help='ann file path')
+    parser.add_argument(
+        '--wait-time', type=float, default=2, help='the interval of show (s)')
+    parser.add_argument(
+        '--disp-all',
+        action='store_true',
+        help='Whether to display all types of data, '
+        'such as bbox and mask.'
+        ' Default is to display only bbox')
+    parser.add_argument(
+        '--category-names',
+        type=str,
+        default=None,
+        nargs='+',
+        help='Display category-specific data, e.g., "bicycle", "person"')
+    parser.add_argument(
+        '--shuffle',
+        action='store_true',
+        help='Whether to display in disorder')
+    args = parser.parse_args()
+    return args
+
+
+def main():
+    args = parse_args()
+    show_coco_json(args)
+
+
+if __name__ == '__main__':
+    main()
diff --git a/mmdetection_practice/third_party/mmyolo/tools/analysis_tools/browse_dataset.py b/mmdetection_practice/third_party/mmyolo/tools/analysis_tools/browse_dataset.py
new file mode 100644
index 0000000..21a1d70
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tools/analysis_tools/browse_dataset.py
@@ -0,0 +1,276 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+import argparse
+import os.path as osp
+import sys
+from typing import Tuple
+
+import cv2
+import mmcv
+import numpy as np
+from mmdet.models.utils import mask2ndarray
+from mmdet.structures.bbox import BaseBoxes
+from mmengine.config import Config, DictAction
+from mmengine.dataset import Compose
+from mmengine.registry import init_default_scope
+from mmengine.utils import ProgressBar
+from mmengine.visualization import Visualizer
+
+from mmyolo.registry import DATASETS, VISUALIZERS
+
+
+# TODO: Support for printing the change in key of results
+# TODO: Some bug. If you meet some bug, please use the original
+def parse_args():
+    parser = argparse.ArgumentParser(description='Browse a dataset')
+    parser.add_argument('config', help='train config file path')
+    parser.add_argument(
+        '--phase',
+        '-p',
+        default='train',
+        type=str,
+        choices=['train', 'test', 'val'],
+        help='phase of dataset to visualize, accept "train" "test" and "val".'
+        ' Defaults to "train".')
+    parser.add_argument(
+        '--mode',
+        '-m',
+        default='transformed',
+        type=str,
+        choices=['original', 'transformed', 'pipeline'],
+        help='display mode; display original pictures or '
+        'transformed pictures or comparison pictures. "original" '
+        'means show images load from disk; "transformed" means '
+        'to show images after transformed; "pipeline" means show all '
+        'the intermediate images. Defaults to "transformed".')
+    parser.add_argument(
+        '--out-dir',
+        default='output',
+        type=str,
+        help='If there is no display interface, you can save it.')
+    parser.add_argument('--not-show', default=False, action='store_true')
+    parser.add_argument(
+        '--show-number',
+        '-n',
+        type=int,
+        default=sys.maxsize,
+        help='number of images selected to visualize, '
+        'must bigger than 0. if the number is bigger than length '
+        'of dataset, show all the images in dataset; '
+        'default "sys.maxsize", show all images in dataset')
+    parser.add_argument(
+        '--show-interval',
+        '-i',
+        type=float,
+        default=3,
+        help='the interval of show (s)')
+    parser.add_argument(
+        '--cfg-options',
+        nargs='+',
+        action=DictAction,
+        help='override some settings in the used config, the key-value pair '
+        'in xxx=yyy format will be merged into config file. If the value to '
+        'be overwritten is a list, it should be like key="[a,b]" or key=a,b '
+        'It also allows nested list/tuple values, e.g. key="[(a,b),(c,d)]" '
+        'Note that the quotation marks are necessary and that no white space '
+        'is allowed.')
+    args = parser.parse_args()
+    return args
+
+
+def _get_adaptive_scale(img_shape: Tuple[int, int],
+                        min_scale: float = 0.3,
+                        max_scale: float = 3.0) -> float:
+    """Get adaptive scale according to image shape.
+
+    The target scale depends on the the short edge length of the image. If the
+    short edge length equals 224, the output is 1.0. And output linear
+    scales according the short edge length. You can also specify the minimum
+    scale and the maximum scale to limit the linear scale.
+
+    Args:
+        img_shape (Tuple[int, int]): The shape of the canvas image.
+        min_scale (int): The minimum scale. Defaults to 0.3.
+        max_scale (int): The maximum scale. Defaults to 3.0.
+    Returns:
+        int: The adaptive scale.
+    """
+    short_edge_length = min(img_shape)
+    scale = short_edge_length / 224.
+    return min(max(scale, min_scale), max_scale)
+
+
+def make_grid(imgs, names):
+    """Concat list of pictures into a single big picture, align height here."""
+    visualizer = Visualizer.get_current_instance()
+    ori_shapes = [img.shape[:2] for img in imgs]
+    max_height = int(max(img.shape[0] for img in imgs) * 1.1)
+    min_width = min(img.shape[1] for img in imgs)
+    horizontal_gap = min_width // 10
+    img_scale = _get_adaptive_scale((max_height, min_width))
+
+    texts = []
+    text_positions = []
+    start_x = 0
+    for i, img in enumerate(imgs):
+        pad_height = (max_height - img.shape[0]) // 2
+        pad_width = horizontal_gap // 2
+        # make border
+        imgs[i] = cv2.copyMakeBorder(
+            img,
+            pad_height,
+            max_height - img.shape[0] - pad_height + int(img_scale * 30 * 2),
+            pad_width,
+            pad_width,
+            cv2.BORDER_CONSTANT,
+            value=(255, 255, 255))
+        texts.append(f'{"execution: "}{i}\n{names[i]}\n{ori_shapes[i]}')
+        text_positions.append(
+            [start_x + img.shape[1] // 2 + pad_width, max_height])
+        start_x += img.shape[1] + horizontal_gap
+
+    display_img = np.concatenate(imgs, axis=1)
+    visualizer.set_image(display_img)
+    img_scale = _get_adaptive_scale(display_img.shape[:2])
+    visualizer.draw_texts(
+        texts,
+        positions=np.array(text_positions),
+        font_sizes=img_scale * 7,
+        colors='black',
+        horizontal_alignments='center',
+        font_families='monospace')
+    return visualizer.get_image()
+
+
+def swap_pipeline_position(dataset_cfg):
+    load_ann_tfm_name = 'LoadAnnotations'
+    pipeline = dataset_cfg.get('pipeline')
+    if (pipeline is None):
+        return dataset_cfg
+    all_transform_types = [tfm['type'] for tfm in pipeline]
+    if load_ann_tfm_name in all_transform_types:
+        load_ann_tfm_index = all_transform_types.index(load_ann_tfm_name)
+        load_ann_tfm = pipeline.pop(load_ann_tfm_index)
+        pipeline.insert(1, load_ann_tfm)
+
+
+class InspectCompose(Compose):
+    """Compose multiple transforms sequentially.
+
+    And record "img" field of all results in one list.
+    """
+
+    def __init__(self, transforms, intermediate_imgs):
+        super().__init__(transforms=transforms)
+        self.intermediate_imgs = intermediate_imgs
+
+    def __call__(self, data):
+        if 'img' in data:
+            self.intermediate_imgs.append({
+                'name': 'original',
+                'img': data['img'].copy()
+            })
+        self.ptransforms = [
+            self.transforms[i] for i in range(len(self.transforms) - 1)
+        ]
+        for t in self.ptransforms:
+            data = t(data)
+            # Keep the same meta_keys in the PackDetInputs
+            self.transforms[-1].meta_keys = [key for key in data]
+            data_sample = self.transforms[-1](data)
+            if data is None:
+                return None
+            if 'img' in data:
+                self.intermediate_imgs.append({
+                    'name':
+                    t.__class__.__name__,
+                    'dataset_sample':
+                    data_sample['data_samples']
+                })
+        return data
+
+
+def main():
+    args = parse_args()
+    cfg = Config.fromfile(args.config)
+    if args.cfg_options is not None:
+        cfg.merge_from_dict(args.cfg_options)
+
+    init_default_scope(cfg.get('default_scope', 'mmyolo'))
+
+    dataset_cfg = cfg.get(args.phase + '_dataloader').get('dataset')
+    if (args.phase in ['test', 'val']):
+        swap_pipeline_position(dataset_cfg)
+    dataset = DATASETS.build(dataset_cfg)
+    visualizer = VISUALIZERS.build(cfg.visualizer)
+    visualizer.dataset_meta = dataset.metainfo
+
+    intermediate_imgs = []
+
+    if not hasattr(dataset, 'pipeline'):
+        # for dataset_wrapper
+        dataset = dataset.dataset
+
+    # TODO: The dataset wrapper occasion is not considered here
+    dataset.pipeline = InspectCompose(dataset.pipeline.transforms,
+                                      intermediate_imgs)
+
+    # init visualization image number
+    assert args.show_number > 0
+    display_number = min(args.show_number, len(dataset))
+
+    progress_bar = ProgressBar(display_number)
+    for i, item in zip(range(display_number), dataset):
+        image_i = []
+        result_i = [result['dataset_sample'] for result in intermediate_imgs]
+        for k, datasample in enumerate(result_i):
+            image = datasample.img
+            gt_instances = datasample.gt_instances
+            image = image[..., [2, 1, 0]]  # bgr to rgb
+            gt_bboxes = gt_instances.get('bboxes', None)
+            if gt_bboxes is not None and isinstance(gt_bboxes, BaseBoxes):
+                gt_instances.bboxes = gt_bboxes.tensor
+            gt_masks = gt_instances.get('masks', None)
+            if gt_masks is not None:
+                masks = mask2ndarray(gt_masks)
+                gt_instances.masks = masks.astype(bool)
+                datasample.gt_instances = gt_instances
+            # get filename from dataset or just use index as filename
+            visualizer.add_datasample(
+                'result',
+                image,
+                datasample,
+                draw_pred=False,
+                draw_gt=True,
+                show=False)
+            image_show = visualizer.get_image()
+            image_i.append(image_show)
+
+        if args.mode == 'original':
+            image = image_i[0]
+        elif args.mode == 'transformed':
+            image = image_i[-1]
+        else:
+            image = make_grid([result for result in image_i],
+                              [result['name'] for result in intermediate_imgs])
+
+        if hasattr(datasample, 'img_path'):
+            filename = osp.basename(datasample.img_path)
+        else:
+            # some dataset have not image path
+            filename = f'{i}.jpg'
+        out_file = osp.join(args.out_dir,
+                            filename) if args.out_dir is not None else None
+
+        if out_file is not None:
+            mmcv.imwrite(image[..., ::-1], out_file)
+
+        if not args.not_show:
+            visualizer.show(
+                image, win_name=filename, wait_time=args.show_interval)
+
+        intermediate_imgs.clear()
+        progress_bar.update()
+
+
+if __name__ == '__main__':
+    main()
diff --git a/mmdetection_practice/third_party/mmyolo/tools/analysis_tools/browse_dataset_simple.py b/mmdetection_practice/third_party/mmyolo/tools/analysis_tools/browse_dataset_simple.py
new file mode 100644
index 0000000..ebacbde
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tools/analysis_tools/browse_dataset_simple.py
@@ -0,0 +1,89 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+import argparse
+import os.path as osp
+
+from mmdet.models.utils import mask2ndarray
+from mmdet.structures.bbox import BaseBoxes
+from mmengine.config import Config, DictAction
+from mmengine.registry import init_default_scope
+from mmengine.utils import ProgressBar
+
+from mmyolo.registry import DATASETS, VISUALIZERS
+
+
+def parse_args():
+    parser = argparse.ArgumentParser(description='Browse a dataset')
+    parser.add_argument('config', help='train config file path')
+    parser.add_argument(
+        '--output-dir',
+        default=None,
+        type=str,
+        help='If there is no display interface, you can save it')
+    parser.add_argument('--not-show', default=False, action='store_true')
+    parser.add_argument(
+        '--show-interval',
+        type=float,
+        default=0,
+        help='the interval of show (s)')
+    parser.add_argument(
+        '--cfg-options',
+        nargs='+',
+        action=DictAction,
+        help='override some settings in the used config, the key-value pair '
+        'in xxx=yyy format will be merged into config file. If the value to '
+        'be overwritten is a list, it should be like key="[a,b]" or key=a,b '
+        'It also allows nested list/tuple values, e.g. key="[(a,b),(c,d)]" '
+        'Note that the quotation marks are necessary and that no white space '
+        'is allowed.')
+    args = parser.parse_args()
+    return args
+
+
+def main():
+    args = parse_args()
+    cfg = Config.fromfile(args.config)
+    if args.cfg_options is not None:
+        cfg.merge_from_dict(args.cfg_options)
+
+    # register all modules in mmdet into the registries
+    init_default_scope(cfg.get('default_scope', 'mmyolo'))
+
+    dataset = DATASETS.build(cfg.train_dataloader.dataset)
+    visualizer = VISUALIZERS.build(cfg.visualizer)
+    visualizer.dataset_meta = dataset.metainfo
+
+    progress_bar = ProgressBar(len(dataset))
+    for item in dataset:
+        img = item['inputs'].permute(1, 2, 0).numpy()
+        data_sample = item['data_samples'].numpy()
+        gt_instances = data_sample.gt_instances
+        img_path = osp.basename(item['data_samples'].img_path)
+
+        out_file = osp.join(
+            args.output_dir,
+            osp.basename(img_path)) if args.output_dir is not None else None
+
+        img = img[..., [2, 1, 0]]  # bgr to rgb
+        gt_bboxes = gt_instances.get('bboxes', None)
+        if gt_bboxes is not None and isinstance(gt_bboxes, BaseBoxes):
+            gt_instances.bboxes = gt_bboxes.tensor
+        gt_masks = gt_instances.get('masks', None)
+        if gt_masks is not None:
+            masks = mask2ndarray(gt_masks)
+            gt_instances.masks = masks.astype(bool)
+        data_sample.gt_instances = gt_instances
+
+        visualizer.add_datasample(
+            osp.basename(img_path),
+            img,
+            data_sample,
+            draw_pred=False,
+            show=not args.not_show,
+            wait_time=args.show_interval,
+            out_file=out_file)
+
+        progress_bar.update()
+
+
+if __name__ == '__main__':
+    main()
diff --git a/mmdetection_practice/third_party/mmyolo/tools/analysis_tools/confusion_matrix.py b/mmdetection_practice/third_party/mmyolo/tools/analysis_tools/confusion_matrix.py
new file mode 100644
index 0000000..f48abdb
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tools/analysis_tools/confusion_matrix.py
@@ -0,0 +1,273 @@
+import argparse
+import os
+
+import matplotlib.pyplot as plt
+import numpy as np
+from matplotlib.ticker import MultipleLocator
+from mmcv.ops import nms
+from mmdet.evaluation import bbox_overlaps
+from mmdet.utils import replace_cfg_vals, update_data_root
+from mmengine import Config, DictAction
+from mmengine.fileio import load
+from mmengine.registry import init_default_scope
+from mmengine.utils import ProgressBar
+
+from mmyolo.registry import DATASETS
+
+
+def parse_args():
+    parser = argparse.ArgumentParser(
+        description='Generate confusion matrix from detection results')
+    parser.add_argument('config', help='test config file path')
+    parser.add_argument(
+        'prediction_path', help='prediction path where test .pkl result')
+    parser.add_argument(
+        'save_dir', help='directory where confusion matrix will be saved')
+    parser.add_argument(
+        '--show', action='store_true', help='show confusion matrix')
+    parser.add_argument(
+        '--color-theme',
+        default='plasma',
+        help='theme of the matrix color map')
+    parser.add_argument(
+        '--score-thr',
+        type=float,
+        default=0.3,
+        help='score threshold to filter detection bboxes')
+    parser.add_argument(
+        '--tp-iou-thr',
+        type=float,
+        default=0.5,
+        help='IoU threshold to be considered as matched')
+    parser.add_argument(
+        '--nms-iou-thr',
+        type=float,
+        default=None,
+        help='nms IoU threshold, only applied when users want to change the'
+        'nms IoU threshold.')
+    parser.add_argument(
+        '--cfg-options',
+        nargs='+',
+        action=DictAction,
+        help='override some settings in the used config, the key-value pair '
+        'in xxx=yyy format will be merged into config file. If the value to '
+        'be overwritten is a list, it should be like key="[a,b]" or key=a,b '
+        'It also allows nested list/tuple values, e.g. key="[(a,b),(c,d)]" '
+        'Note that the quotation marks are necessary and that no white space '
+        'is allowed.')
+    args = parser.parse_args()
+    return args
+
+
+def calculate_confusion_matrix(dataset,
+                               results,
+                               score_thr=0,
+                               nms_iou_thr=None,
+                               tp_iou_thr=0.5):
+    """Calculate the confusion matrix.
+
+    Args:
+        dataset (Dataset): Test or val dataset.
+        results (list[ndarray]): A list of detection results in each image.
+        score_thr (float|optional): Score threshold to filter bboxes.
+            Default: 0.
+        nms_iou_thr (float|optional): nms IoU threshold, the detection results
+            have done nms in the detector, only applied when users want to
+            change the nms IoU threshold. Default: None.
+        tp_iou_thr (float|optional): IoU threshold to be considered as matched.
+            Default: 0.5.
+    """
+    num_classes = len(dataset.metainfo['classes'])
+    confusion_matrix = np.zeros(shape=[num_classes + 1, num_classes + 1])
+    assert len(dataset) == len(results)
+    prog_bar = ProgressBar(len(results))
+    for idx, per_img_res in enumerate(results):
+        res_bboxes = per_img_res['pred_instances']
+        gts = dataset.get_data_info(idx)['instances']
+        analyze_per_img_dets(confusion_matrix, gts, res_bboxes, score_thr,
+                             tp_iou_thr, nms_iou_thr)
+        prog_bar.update()
+    return confusion_matrix
+
+
+def analyze_per_img_dets(confusion_matrix,
+                         gts,
+                         result,
+                         score_thr=0,
+                         tp_iou_thr=0.5,
+                         nms_iou_thr=None):
+    """Analyze detection results on each image.
+
+    Args:
+        confusion_matrix (ndarray): The confusion matrix,
+            has shape (num_classes + 1, num_classes + 1).
+        gt_bboxes (ndarray): Ground truth bboxes, has shape (num_gt, 4).
+        gt_labels (ndarray): Ground truth labels, has shape (num_gt).
+        result (ndarray): Detection results, has shape
+            (num_classes, num_bboxes, 5).
+        score_thr (float): Score threshold to filter bboxes.
+            Default: 0.
+        tp_iou_thr (float): IoU threshold to be considered as matched.
+            Default: 0.5.
+        nms_iou_thr (float|optional): nms IoU threshold, the detection results
+            have done nms in the detector, only applied when users want to
+            change the nms IoU threshold. Default: None.
+    """
+    true_positives = np.zeros(len(gts))
+    gt_bboxes = []
+    gt_labels = []
+    for gt in gts:
+        gt_bboxes.append(gt['bbox'])
+        gt_labels.append(gt['bbox_label'])
+
+    gt_bboxes = np.array(gt_bboxes)
+    gt_labels = np.array(gt_labels)
+
+    unique_label = np.unique(result['labels'].numpy())
+
+    for det_label in unique_label:
+        mask = (result['labels'] == det_label)
+        det_bboxes = result['bboxes'][mask].numpy()
+        det_scores = result['scores'][mask].numpy()
+
+        if nms_iou_thr:
+            det_bboxes, _ = nms(
+                det_bboxes, det_scores, nms_iou_thr, score_threshold=score_thr)
+        ious = bbox_overlaps(det_bboxes[:, :4], gt_bboxes)
+        for i, score in enumerate(det_scores):
+            det_match = 0
+            if score >= score_thr:
+                for j, gt_label in enumerate(gt_labels):
+                    if ious[i, j] >= tp_iou_thr:
+                        det_match += 1
+                        if gt_label == det_label:
+                            true_positives[j] += 1  # TP
+                        confusion_matrix[gt_label, det_label] += 1
+                if det_match == 0:  # BG FP
+                    confusion_matrix[-1, det_label] += 1
+    for num_tp, gt_label in zip(true_positives, gt_labels):
+        if num_tp == 0:  # FN
+            confusion_matrix[gt_label, -1] += 1
+
+
+def plot_confusion_matrix(confusion_matrix,
+                          labels,
+                          save_dir=None,
+                          show=True,
+                          title='Normalized Confusion Matrix',
+                          color_theme='plasma'):
+    """Draw confusion matrix with matplotlib.
+
+    Args:
+        confusion_matrix (ndarray): The confusion matrix.
+        labels (list[str]): List of class names.
+        save_dir (str|optional): If set, save the confusion matrix plot to the
+            given path. Default: None.
+        show (bool): Whether to show the plot. Default: True.
+        title (str): Title of the plot. Default: `Normalized Confusion Matrix`.
+        color_theme (str): Theme of the matrix color map. Default: `plasma`.
+    """
+    # normalize the confusion matrix
+    per_label_sums = confusion_matrix.sum(axis=1)[:, np.newaxis]
+    confusion_matrix = \
+        confusion_matrix.astype(np.float32) / per_label_sums * 100
+
+    num_classes = len(labels)
+    fig, ax = plt.subplots(
+        figsize=(0.5 * num_classes, 0.5 * num_classes * 0.8), dpi=180)
+    cmap = plt.get_cmap(color_theme)
+    im = ax.imshow(confusion_matrix, cmap=cmap)
+    plt.colorbar(mappable=im, ax=ax)
+
+    title_font = {'weight': 'bold', 'size': 12}
+    ax.set_title(title, fontdict=title_font)
+    label_font = {'size': 10}
+    plt.ylabel('Ground Truth Label', fontdict=label_font)
+    plt.xlabel('Prediction Label', fontdict=label_font)
+
+    # draw locator
+    xmajor_locator = MultipleLocator(1)
+    xminor_locator = MultipleLocator(0.5)
+    ax.xaxis.set_major_locator(xmajor_locator)
+    ax.xaxis.set_minor_locator(xminor_locator)
+    ymajor_locator = MultipleLocator(1)
+    yminor_locator = MultipleLocator(0.5)
+    ax.yaxis.set_major_locator(ymajor_locator)
+    ax.yaxis.set_minor_locator(yminor_locator)
+
+    # draw grid
+    ax.grid(True, which='minor', linestyle='-')
+
+    # draw label
+    ax.set_xticks(np.arange(num_classes))
+    ax.set_yticks(np.arange(num_classes))
+    ax.set_xticklabels(labels)
+    ax.set_yticklabels(labels)
+
+    ax.tick_params(
+        axis='x', bottom=False, top=True, labelbottom=False, labeltop=True)
+    plt.setp(
+        ax.get_xticklabels(), rotation=45, ha='left', rotation_mode='anchor')
+
+    # draw confution matrix value
+    for i in range(num_classes):
+        for j in range(num_classes):
+            ax.text(
+                j,
+                i,
+                '{}%'.format(
+                    int(confusion_matrix[
+                        i,
+                        j]) if not np.isnan(confusion_matrix[i, j]) else -1),
+                ha='center',
+                va='center',
+                color='w',
+                size=7)
+
+    ax.set_ylim(len(confusion_matrix) - 0.5, -0.5)  # matplotlib>3.1.1
+
+    fig.tight_layout()
+    if save_dir is not None:
+        plt.savefig(
+            os.path.join(save_dir, 'confusion_matrix.png'), format='png')
+    if show:
+        plt.show()
+
+
+def main():
+    args = parse_args()
+
+    cfg = Config.fromfile(args.config)
+
+    # replace the ${key} with the value of cfg.key
+    cfg = replace_cfg_vals(cfg)
+
+    # update data root according to MMYOLO_DATASETS
+    update_data_root(cfg)
+
+    if args.cfg_options is not None:
+        cfg.merge_from_dict(args.cfg_options)
+
+    init_default_scope(cfg.get('default_scope', 'mmyolo'))
+
+    results = load(args.prediction_path)
+
+    if not os.path.exists(args.save_dir):
+        os.makedirs(args.save_dir)
+
+    dataset = DATASETS.build(cfg.test_dataloader.dataset)
+
+    confusion_matrix = calculate_confusion_matrix(dataset, results,
+                                                  args.score_thr,
+                                                  args.nms_iou_thr,
+                                                  args.tp_iou_thr)
+    plot_confusion_matrix(
+        confusion_matrix,
+        dataset.metainfo['classes'] + ('background', ),
+        save_dir=args.save_dir,
+        show=args.show,
+        color_theme=args.color_theme)
+
+
+if __name__ == '__main__':
+    main()
diff --git a/mmdetection_practice/third_party/mmyolo/tools/analysis_tools/dataset_analysis.py b/mmdetection_practice/third_party/mmyolo/tools/analysis_tools/dataset_analysis.py
new file mode 100644
index 0000000..b2164e1
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tools/analysis_tools/dataset_analysis.py
@@ -0,0 +1,498 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+import argparse
+import os.path
+from statistics import median
+
+import matplotlib.patches as mpatches
+import matplotlib.pyplot as plt
+import numpy as np
+from mmengine.config import Config
+from mmengine.registry import init_default_scope
+from mmengine.utils import ProgressBar
+from prettytable import PrettyTable
+
+from mmyolo.registry import DATASETS
+from mmyolo.utils.misc import show_data_classes
+
+
+def parse_args():
+    parser = argparse.ArgumentParser(
+        description='Distribution of categories and bbox instances')
+    parser.add_argument('config', help='config file path')
+    parser.add_argument(
+        '--val-dataset',
+        default=False,
+        action='store_true',
+        help='The default train_dataset.'
+        'To change it to val_dataset, enter "--val-dataset"')
+    parser.add_argument(
+        '--class-name',
+        default=None,
+        type=str,
+        help='Display specific class, e.g., "bicycle"')
+    parser.add_argument(
+        '--area-rule',
+        default=None,
+        type=int,
+        nargs='+',
+        help='Redefine area rules,but no more than three numbers.'
+        ' e.g., 30 70 125')
+    parser.add_argument(
+        '--func',
+        default=None,
+        type=str,
+        choices=[
+            'show_bbox_num', 'show_bbox_wh', 'show_bbox_wh_ratio',
+            'show_bbox_area'
+        ],
+        help='Dataset analysis function selection.')
+    parser.add_argument(
+        '--out-dir',
+        default='./dataset_analysis',
+        type=str,
+        help='Output directory of dataset analysis visualization results,'
+        ' Save in "./dataset_analysis/" by default')
+    args = parser.parse_args()
+    return args
+
+
+def show_bbox_num(cfg, out_dir, fig_set, class_name, class_num):
+    """Display the distribution map of categories and number of bbox
+    instances."""
+    print('\n\nDrawing bbox_num figure:')
+    # Draw designs
+    fig = plt.figure(
+        figsize=(fig_set['figsize'][0], fig_set['figsize'][1]), dpi=300)
+    plt.bar(class_name, class_num, align='center')
+
+    # Draw titles, labels and so on
+    for x, y in enumerate(class_num):
+        plt.text(x, y, '%s' % y, ha='center', fontsize=fig_set['fontsize'] + 3)
+    plt.xticks(rotation=fig_set['xticks_angle'])
+    plt.xlabel('Category Name')
+    plt.ylabel('Num of instances')
+    plt.title(cfg.dataset_type)
+
+    # Save figure
+    if not os.path.exists(out_dir):
+        os.makedirs(out_dir)
+    out_name = fig_set['out_name']
+    fig.savefig(
+        f'{out_dir}/{out_name}_bbox_num.jpg',
+        bbox_inches='tight',
+        pad_inches=0.1)  # Save Image
+    plt.close()
+    print(f'End and save in {out_dir}/{out_name}_bbox_num.jpg')
+
+
+def show_bbox_wh(out_dir, fig_set, class_bbox_w, class_bbox_h, class_name):
+    """Display the width and height distribution of categories and bbox
+    instances."""
+    print('\n\nDrawing bbox_wh figure:')
+    # Draw designs
+    fig, ax = plt.subplots(
+        figsize=(fig_set['figsize'][0], fig_set['figsize'][1]), dpi=300)
+
+    # Set the position of the map and label on the x-axis
+    positions_w = list(range(0, 12 * len(class_name), 12))
+    positions_h = list(range(6, 12 * len(class_name), 12))
+    positions_x_label = list(range(3, 12 * len(class_name) + 1, 12))
+    ax.violinplot(
+        class_bbox_w, positions_w, showmeans=True, showmedians=True, widths=4)
+    ax.violinplot(
+        class_bbox_h, positions_h, showmeans=True, showmedians=True, widths=4)
+
+    # Draw titles, labels and so on
+    plt.xticks(rotation=fig_set['xticks_angle'])
+    plt.ylabel('The width or height of bbox')
+    plt.xlabel('Class name')
+    plt.title('Width or height distribution of classes and bbox instances')
+
+    # Draw the max, min and median of wide data in violin chart
+    for i in range(len(class_bbox_w)):
+        plt.text(
+            positions_w[i],
+            median(class_bbox_w[i]),
+            f'{"%.2f" % median(class_bbox_w[i])}',
+            ha='center',
+            fontsize=fig_set['fontsize'])
+        plt.text(
+            positions_w[i],
+            max(class_bbox_w[i]),
+            f'{"%.2f" % max(class_bbox_w[i])}',
+            ha='center',
+            fontsize=fig_set['fontsize'])
+        plt.text(
+            positions_w[i],
+            min(class_bbox_w[i]),
+            f'{"%.2f" % min(class_bbox_w[i])}',
+            ha='center',
+            fontsize=fig_set['fontsize'])
+
+    # Draw the max, min and median of height data in violin chart
+    for i in range(len(positions_h)):
+        plt.text(
+            positions_h[i],
+            median(class_bbox_h[i]),
+            f'{"%.2f" % median(class_bbox_h[i])}',
+            ha='center',
+            fontsize=fig_set['fontsize'])
+        plt.text(
+            positions_h[i],
+            max(class_bbox_h[i]),
+            f'{"%.2f" % max(class_bbox_h[i])}',
+            ha='center',
+            fontsize=fig_set['fontsize'])
+        plt.text(
+            positions_h[i],
+            min(class_bbox_h[i]),
+            f'{"%.2f" % min(class_bbox_h[i])}',
+            ha='center',
+            fontsize=fig_set['fontsize'])
+
+    # Draw Legend
+    plt.setp(ax, xticks=positions_x_label, xticklabels=class_name)
+    labels = ['bbox_w', 'bbox_h']
+    colors = ['steelblue', 'darkorange']
+    patches = [
+        mpatches.Patch(color=colors[i], label=f'{labels[i]:s}')
+        for i in range(len(colors))
+    ]
+    ax = plt.gca()
+    box = ax.get_position()
+    ax.set_position([box.x0, box.y0, box.width, box.height * 0.8])
+    ax.legend(loc='upper center', handles=patches, ncol=2)
+
+    # Save figure
+    if not os.path.exists(out_dir):
+        os.makedirs(out_dir)
+    out_name = fig_set['out_name']
+    fig.savefig(
+        f'{out_dir}/{out_name}_bbox_wh.jpg',
+        bbox_inches='tight',
+        pad_inches=0.1)  # Save Image
+    plt.close()
+    print(f'End and save in {out_dir}/{out_name}_bbox_wh.jpg')
+
+
+def show_bbox_wh_ratio(out_dir, fig_set, class_name, class_bbox_ratio):
+    """Display the distribution map of category and bbox instance width and
+    height ratio."""
+    print('\n\nDrawing bbox_wh_ratio figure:')
+    # Draw designs
+    fig, ax = plt.subplots(
+        figsize=(fig_set['figsize'][0], fig_set['figsize'][1]), dpi=300)
+
+    # Set the position of the map and label on the x-axis
+    positions = list(range(0, 6 * len(class_name), 6))
+    ax.violinplot(
+        class_bbox_ratio,
+        positions,
+        showmeans=True,
+        showmedians=True,
+        widths=5)
+
+    # Draw titles, labels and so on
+    plt.xticks(rotation=fig_set['xticks_angle'])
+    plt.ylabel('Ratio of width to height of bbox')
+    plt.xlabel('Class name')
+    plt.title('Width to height ratio distribution of class and bbox instances')
+
+    # Draw the max, min and median of wide data in violin chart
+    for i in range(len(class_bbox_ratio)):
+        plt.text(
+            positions[i],
+            median(class_bbox_ratio[i]),
+            f'{"%.2f" % median(class_bbox_ratio[i])}',
+            ha='center',
+            fontsize=fig_set['fontsize'])
+        plt.text(
+            positions[i],
+            max(class_bbox_ratio[i]),
+            f'{"%.2f" % max(class_bbox_ratio[i])}',
+            ha='center',
+            fontsize=fig_set['fontsize'])
+        plt.text(
+            positions[i],
+            min(class_bbox_ratio[i]),
+            f'{"%.2f" % min(class_bbox_ratio[i])}',
+            ha='center',
+            fontsize=fig_set['fontsize'])
+
+    # Set the position of the map and label on the x-axis
+    plt.setp(ax, xticks=positions, xticklabels=class_name)
+
+    # Save figure
+    if not os.path.exists(out_dir):
+        os.makedirs(out_dir)
+    out_name = fig_set['out_name']
+    fig.savefig(
+        f'{out_dir}/{out_name}_bbox_ratio.jpg',
+        bbox_inches='tight',
+        pad_inches=0.1)  # Save Image
+    plt.close()
+    print(f'End and save in {out_dir}/{out_name}_bbox_ratio.jpg')
+
+
+def show_bbox_area(out_dir, fig_set, area_rule, class_name, bbox_area_num):
+    """Display the distribution map of category and bbox instance area based on
+    the rules of large, medium and small objects."""
+    print('\n\nDrawing bbox_area figure:')
+    # Set the direct distance of each label and the width of each histogram
+    # Set the required labels and colors
+    positions = np.arange(0, 2 * len(class_name), 2)
+    width = 0.4
+    labels = ['Small', 'Mediun', 'Large', 'Huge']
+    colors = ['#438675', '#F7B469', '#6BA6DA', '#913221']
+
+    # Draw designs
+    fig = plt.figure(
+        figsize=(fig_set['figsize'][0], fig_set['figsize'][1]), dpi=300)
+    for i in range(len(area_rule) - 1):
+        area_num = [bbox_area_num[idx][i] for idx in range(len(class_name))]
+        plt.bar(
+            positions + width * i,
+            area_num,
+            width,
+            label=labels[i],
+            color=colors[i])
+        for idx, (x, y) in enumerate(zip(positions.tolist(), area_num)):
+            plt.text(
+                x + width * i,
+                y,
+                y,
+                ha='center',
+                fontsize=fig_set['fontsize'] - 1)
+
+    # Draw titles, labels and so on
+    plt.xticks(rotation=fig_set['xticks_angle'])
+    plt.xticks(positions + width * ((len(area_rule) - 2) / 2), class_name)
+    plt.ylabel('Class Area')
+    plt.xlabel('Class Name')
+    plt.title(
+        'Area and number of large, medium and small objects of each class')
+
+    # Set and Draw Legend
+    patches = [
+        mpatches.Patch(color=colors[i], label=f'{labels[i]:s}')
+        for i in range(len(area_rule) - 1)
+    ]
+    ax = plt.gca()
+    box = ax.get_position()
+    ax.set_position([box.x0, box.y0, box.width, box.height * 0.8])
+    ax.legend(loc='upper center', handles=patches, ncol=len(area_rule) - 1)
+
+    # Save figure
+    if not os.path.exists(out_dir):
+        os.makedirs(out_dir)
+    out_name = fig_set['out_name']
+    fig.savefig(
+        f'{out_dir}/{out_name}_bbox_area.jpg',
+        bbox_inches='tight',
+        pad_inches=0.1)  # Save Image
+    plt.close()
+    print(f'End and save in {out_dir}/{out_name}_bbox_area.jpg')
+
+
+def show_class_list(classes, class_num):
+    """Print the data of the class obtained by the current run."""
+    print('\n\nThe information obtained is as follows:')
+    class_info = PrettyTable()
+    class_info.title = 'Information of dataset class'
+    # List Print Settings
+    # If the quantity is too large, 25 rows will be displayed in each column
+    if len(classes) < 25:
+        class_info.add_column('Class name', classes)
+        class_info.add_column('Bbox num', class_num)
+    elif len(classes) % 25 != 0 and len(classes) > 25:
+        col_num = int(len(classes) / 25) + 1
+        class_nums = class_num.tolist()
+        class_name_list = list(classes)
+        for i in range(0, (col_num * 25) - len(classes)):
+            class_name_list.append('')
+            class_nums.append('')
+        for i in range(0, len(class_name_list), 25):
+            class_info.add_column('Class name', class_name_list[i:i + 25])
+            class_info.add_column('Bbox num', class_nums[i:i + 25])
+
+    # Align display data to the left
+    class_info.align['Class name'] = 'l'
+    class_info.align['Bbox num'] = 'l'
+    print(class_info)
+
+
+def show_data_list(args, area_rule):
+    """Print run setup information."""
+    print('\n\nPrint current running information:')
+    data_info = PrettyTable()
+    data_info.title = 'Dataset information'
+    # Print the corresponding information according to the settings
+    if args.val_dataset is False:
+        data_info.add_column('Dataset type', ['train_dataset'])
+    elif args.val_dataset is True:
+        data_info.add_column('Dataset type', ['val_dataset'])
+    if args.class_name is None:
+        data_info.add_column('Class name', ['All classes'])
+    else:
+        data_info.add_column('Class name', [args.class_name])
+    if args.func is None:
+        data_info.add_column('Function', ['All function'])
+    else:
+        data_info.add_column('Function', [args.func])
+    data_info.add_column('Area rule', [area_rule])
+
+    print(data_info)
+
+
+def main():
+    args = parse_args()
+    cfg = Config.fromfile(args.config)
+
+    init_default_scope(cfg.get('default_scope', 'mmyolo'))
+
+    def replace_pipeline_to_none(cfg):
+        """Recursively iterate over all dataset(or datasets) and set their
+        pipelines to none.Datasets are mean ConcatDataset.
+
+        Recursively terminates only when all dataset(or datasets) have been
+        traversed
+        """
+
+        if cfg.get('dataset', None) is None and cfg.get('datasets',
+                                                        None) is None:
+            return
+        dataset = cfg.dataset if cfg.get('dataset', None) else cfg.datasets
+        if isinstance(dataset, list):
+            for item in dataset:
+                item.pipeline = None
+        elif dataset.get('pipeline', None):
+            dataset.pipeline = None
+        else:
+            replace_pipeline_to_none(dataset)
+
+    # 1.Build Dataset
+    if args.val_dataset is False:
+        replace_pipeline_to_none(cfg.train_dataloader)
+        dataset = DATASETS.build(cfg.train_dataloader.dataset)
+    else:
+        replace_pipeline_to_none(cfg.val_dataloader)
+        dataset = DATASETS.build(cfg.val_dataloader.dataset)
+
+    # 2.Prepare data
+    # Drawing settings
+    fig_all_set = {
+        'figsize': [35, 18],
+        'fontsize': int(10 - 0.08 * len(dataset.metainfo['classes'])),
+        'xticks_angle': 70,
+        'out_name': cfg.dataset_type
+    }
+    fig_one_set = {
+        'figsize': [15, 10],
+        'fontsize': 10,
+        'xticks_angle': 0,
+        'out_name': args.class_name
+    }
+
+    # Call the category name and save address
+    if args.class_name is None:
+        classes = dataset.metainfo['classes']
+        classes_idx = [i for i in range(len(classes))]
+        fig_set = fig_all_set
+    elif args.class_name in dataset.metainfo['classes']:
+        classes = [args.class_name]
+        classes_idx = [dataset.metainfo['classes'].index(args.class_name)]
+        fig_set = fig_one_set
+    else:
+        data_classes = dataset.metainfo['classes']
+        show_data_classes(data_classes)
+        raise RuntimeError(f'Expected args.class_name to be one of the list,'
+                           f'but got "{args.class_name}"')
+
+    # Building Area Rules
+    if args.area_rule is None:
+        area_rule = [0, 32, 96, 1e5]
+    elif args.area_rule and len(args.area_rule) <= 3:
+        area_rules = [0] + args.area_rule + [1e5]
+        area_rule = sorted(area_rules)
+    else:
+        raise RuntimeError(
+            f'Expected the "{args.area_rule}" to be e.g. 30 60 120, '
+            'and no more than three numbers.')
+
+    # Build arrays or lists to store data for each category
+    class_num = np.zeros((len(classes), ), dtype=np.int64)
+    class_bbox = [[] for _ in classes]
+    class_name = []
+    class_bbox_w = []
+    class_bbox_h = []
+    class_bbox_ratio = []
+    bbox_area_num = []
+
+    show_data_list(args, area_rule)
+    # Get the quantity and bbox data corresponding to each category
+    print('\nRead the information of each picture in the dataset:')
+    progress_bar = ProgressBar(len(dataset))
+    for index in range(len(dataset)):
+        for instance in dataset[index]['instances']:
+            if instance[
+                    'bbox_label'] in classes_idx and args.class_name is None:
+                class_num[instance['bbox_label']] += 1
+                class_bbox[instance['bbox_label']].append(instance['bbox'])
+            elif instance['bbox_label'] in classes_idx and args.class_name:
+                class_num[0] += 1
+                class_bbox[0].append(instance['bbox'])
+        progress_bar.update()
+    show_class_list(classes, class_num)
+    # Get the width, height and area of bbox corresponding to each category
+    print('\nRead bbox information in each class:')
+    progress_bar_classes = ProgressBar(len(classes))
+    for idx, (classes, classes_idx) in enumerate(zip(classes, classes_idx)):
+        bbox = np.array(class_bbox[idx])
+        bbox_area_nums = np.zeros((len(area_rule) - 1, ), dtype=np.int64)
+        if len(bbox) > 0:
+            bbox_wh = bbox[:, 2:4] - bbox[:, 0:2]
+            bbox_ratio = bbox_wh[:, 0] / bbox_wh[:, 1]
+            bbox_area = bbox_wh[:, 0] * bbox_wh[:, 1]
+            class_bbox_w.append(bbox_wh[:, 0].tolist())
+            class_bbox_h.append(bbox_wh[:, 1].tolist())
+            class_bbox_ratio.append(bbox_ratio.tolist())
+
+            # The area rule, there is an section between two numbers
+            for i in range(len(area_rule) - 1):
+                bbox_area_nums[i] = np.logical_and(
+                    bbox_area >= area_rule[i]**2,
+                    bbox_area < area_rule[i + 1]**2).sum()
+        elif len(bbox) == 0:
+            class_bbox_w.append([0])
+            class_bbox_h.append([0])
+            class_bbox_ratio.append([0])
+
+        class_name.append(classes)
+        bbox_area_num.append(bbox_area_nums.tolist())
+        progress_bar_classes.update()
+
+    # 3.draw Dataset Information
+    if args.func is None:
+        show_bbox_num(cfg, args.out_dir, fig_set, class_name, class_num)
+        show_bbox_wh(args.out_dir, fig_set, class_bbox_w, class_bbox_h,
+                     class_name)
+        show_bbox_wh_ratio(args.out_dir, fig_set, class_name, class_bbox_ratio)
+        show_bbox_area(args.out_dir, fig_set, area_rule, class_name,
+                       bbox_area_num)
+    elif args.func == 'show_bbox_num':
+        show_bbox_num(cfg, args.out_dir, fig_set, class_name, class_num)
+    elif args.func == 'show_bbox_wh':
+        show_bbox_wh(args.out_dir, fig_set, class_bbox_w, class_bbox_h,
+                     class_name)
+    elif args.func == 'show_bbox_wh_ratio':
+        show_bbox_wh_ratio(args.out_dir, fig_set, class_name, class_bbox_ratio)
+    elif args.func == 'show_bbox_area':
+        show_bbox_area(args.out_dir, fig_set, area_rule, class_name,
+                       bbox_area_num)
+    else:
+        raise RuntimeError(
+            'Please enter the correct func name, e.g., show_bbox_num')
+
+
+if __name__ == '__main__':
+    main()
diff --git a/mmdetection_practice/third_party/mmyolo/tools/analysis_tools/get_flops.py b/mmdetection_practice/third_party/mmyolo/tools/analysis_tools/get_flops.py
new file mode 100644
index 0000000..965660f
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tools/analysis_tools/get_flops.py
@@ -0,0 +1,123 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+import argparse
+import tempfile
+from pathlib import Path
+
+import torch
+from mmdet.registry import MODELS
+from mmengine.analysis import get_model_complexity_info
+from mmengine.config import Config, DictAction
+from mmengine.logging import MMLogger
+from mmengine.model import revert_sync_batchnorm
+from mmengine.registry import init_default_scope
+
+from mmyolo.utils import switch_to_deploy
+
+
+def parse_args():
+    parser = argparse.ArgumentParser(description='Get a detector flops')
+    parser.add_argument('config', help='train config file path')
+    parser.add_argument(
+        '--shape',
+        type=int,
+        nargs='+',
+        default=[640, 640],
+        help='input image size')
+    parser.add_argument(
+        '--show-arch',
+        action='store_true',
+        help='whether return the statistics in the form of network layers')
+    parser.add_argument(
+        '--not-show-table',
+        action='store_true',
+        help='whether return the statistics in the form of table'),
+    parser.add_argument(
+        '--cfg-options',
+        nargs='+',
+        action=DictAction,
+        help='override some settings in the used config, the key-value pair '
+        'in xxx=yyy format will be merged into config file. If the value to '
+        'be overwritten is a list, it should be like key="[a,b]" or key=a,b '
+        'It also allows nested list/tuple values, e.g. key="[(a,b),(c,d)]" '
+        'Note that the quotation marks are necessary and that no white space '
+        'is allowed.')
+    return parser.parse_args()
+
+
+def inference(args, logger):
+    config_name = Path(args.config)
+    if not config_name.exists():
+        logger.error(f'{config_name} not found.')
+
+    cfg = Config.fromfile(args.config)
+    cfg.work_dir = tempfile.TemporaryDirectory().name
+    cfg.log_level = 'WARN'
+    if args.cfg_options is not None:
+        cfg.merge_from_dict(args.cfg_options)
+
+    init_default_scope(cfg.get('default_scope', 'mmyolo'))
+
+    if len(args.shape) == 1:
+        h = w = args.shape[0]
+    elif len(args.shape) == 2:
+        h, w = args.shape
+    else:
+        raise ValueError('invalid input shape')
+
+    # model
+    model = MODELS.build(cfg.model)
+    if torch.cuda.is_available():
+        model.cuda()
+    model = revert_sync_batchnorm(model)
+    model.eval()
+    switch_to_deploy(model)
+
+    # input tensor
+    # automatically generate a input tensor with the given input_shape.
+    data_batch = {'inputs': [torch.rand(3, h, w)], 'batch_samples': [None]}
+    data = model.data_preprocessor(data_batch)
+    result = {'ori_shape': (h, w), 'pad_shape': data['inputs'].shape[-2:]}
+    outputs = get_model_complexity_info(
+        model,
+        input_shape=None,
+        inputs=data['inputs'],  # the input tensor of the model
+        show_table=not args.not_show_table,  # show the complexity table
+        show_arch=args.show_arch)  # show the complexity arch
+
+    result['flops'] = outputs['flops_str']
+    result['params'] = outputs['params_str']
+    result['out_table'] = outputs['out_table']
+    result['out_arch'] = outputs['out_arch']
+
+    return result
+
+
+def main():
+    args = parse_args()
+    logger = MMLogger.get_instance(name='MMLogger')
+    result = inference(args, logger)
+
+    split_line = '=' * 30
+
+    ori_shape = result['ori_shape']
+    pad_shape = result['pad_shape']
+    flops = result['flops']
+    params = result['params']
+
+    print(result['out_table'])  # print related information by table
+    print(result['out_arch'])  # print related information by network layers
+
+    if pad_shape != ori_shape:
+        print(f'{split_line}\nUse size divisor set input shape '
+              f'from {ori_shape} to {pad_shape}')
+
+    print(f'{split_line}\n'
+          f'Input shape: {pad_shape}\nModel Flops: {flops}\n'
+          f'Model Parameters: {params}\n{split_line}')
+    print('!!!Please be cautious if you use the results in papers. '
+          'You may need to check if all ops are supported and verify '
+          'that the flops computation is correct.')
+
+
+if __name__ == '__main__':
+    main()
diff --git a/mmdetection_practice/third_party/mmyolo/tools/analysis_tools/optimize_anchors.py b/mmdetection_practice/third_party/mmyolo/tools/analysis_tools/optimize_anchors.py
new file mode 100644
index 0000000..34d4d06
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tools/analysis_tools/optimize_anchors.py
@@ -0,0 +1,647 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+"""Optimize anchor settings on a specific dataset.
+
+This script provides three methods to optimize YOLO anchors including k-means
+anchor cluster, differential evolution and v5-k-means. You can use
+``--algorithm k-means``, ``--algorithm differential_evolution`` and
+``--algorithm v5-k-means`` to switch those methods.
+
+Example:
+    Use k-means anchor cluster::
+
+        python tools/analysis_tools/optimize_anchors.py ${CONFIG} \
+        --algorithm k-means --input-shape ${INPUT_SHAPE [WIDTH HEIGHT]} \
+        --out-dir ${OUT_DIR}
+
+    Use differential evolution to optimize anchors::
+
+        python tools/analysis_tools/optimize_anchors.py ${CONFIG} \
+        --algorithm differential_evolution \
+        --input-shape ${INPUT_SHAPE [WIDTH HEIGHT]} \
+        --out-dir ${OUT_DIR}
+
+    Use v5-k-means to optimize anchors::
+
+        python tools/analysis_tools/optimize_anchors.py ${CONFIG} \
+        --algorithm v5-k-means \
+        --input-shape ${INPUT_SHAPE [WIDTH HEIGHT]} \
+        --prior_match_thr ${PRIOR_MATCH_THR} \
+        --out-dir ${OUT_DIR}
+"""
+import argparse
+import os.path as osp
+import random
+from typing import Tuple
+
+import numpy as np
+import torch
+from mmdet.structures.bbox import (bbox_cxcywh_to_xyxy, bbox_overlaps,
+                                   bbox_xyxy_to_cxcywh)
+from mmdet.utils import replace_cfg_vals, update_data_root
+from mmengine.config import Config
+from mmengine.fileio import dump
+from mmengine.logging import MMLogger
+from mmengine.registry import init_default_scope
+from mmengine.utils import ProgressBar
+from scipy.optimize import differential_evolution
+from torch import Tensor
+
+from mmyolo.registry import DATASETS
+
+try:
+    from scipy.cluster.vq import kmeans
+except ImportError:
+    kmeans = None
+
+
+def parse_args():
+    parser = argparse.ArgumentParser(description='Optimize anchor parameters.')
+    parser.add_argument('config', help='Train config file path.')
+    parser.add_argument(
+        '--input-shape',
+        type=int,
+        nargs='+',
+        default=[640, 640],
+        help='input image size, represent [width, height]')
+    parser.add_argument(
+        '--algorithm',
+        default='DE',
+        help='Algorithm used for anchor optimizing.'
+        'Support k-means and differential_evolution for YOLO,'
+        'and v5-k-means is special for YOLOV5.')
+    parser.add_argument(
+        '--iters',
+        default=1000,
+        type=int,
+        help='Maximum iterations for optimizer.')
+    parser.add_argument(
+        '--prior-match-thr',
+        default=4.0,
+        type=float,
+        help='anchor-label `gt_filter_sizes` ratio threshold '
+        'hyperparameter used for training, default=4.0, this '
+        'parameter is unique to v5-k-means')
+    parser.add_argument(
+        '--mutation-args',
+        type=float,
+        nargs='+',
+        default=[0.9, 0.1],
+        help='paramter of anchor optimize method genetic algorithm, '
+        'represent [prob, sigma], this parameter is unique to v5-k-means')
+    parser.add_argument(
+        '--augment-args',
+        type=float,
+        nargs='+',
+        default=[0.9, 1.1],
+        help='scale factor of box size augment when metric box and anchor, '
+        'represent [min, max], this parameter is unique to v5-k-means')
+    parser.add_argument(
+        '--device', default='cuda:0', help='Device used for calculating.')
+    parser.add_argument(
+        '--out-dir',
+        default=None,
+        type=str,
+        help='Path to save anchor optimize result.')
+
+    args = parser.parse_args()
+    return args
+
+
+class BaseAnchorOptimizer:
+    """Base class for anchor optimizer.
+
+    Args:
+        dataset (obj:`Dataset`): Dataset object.
+        input_shape (list[int]): Input image shape of the model.
+            Format in [width, height].
+        num_anchor_per_level (list[int]) : Number of anchors for each level.
+        logger (obj:`logging.Logger`): The logger for logging.
+        device (str, optional): Device used for calculating.
+            Default: 'cuda:0'
+        out_dir (str, optional): Path to save anchor optimize result.
+            Default: None
+    """
+
+    def __init__(self,
+                 dataset,
+                 input_shape,
+                 num_anchor_per_level,
+                 logger,
+                 device='cuda:0',
+                 out_dir=None):
+        self.dataset = dataset
+        self.input_shape = input_shape
+        self.num_anchor_per_level = num_anchor_per_level
+        self.num_anchors = sum(num_anchor_per_level)
+        self.logger = logger
+        self.device = device
+        self.out_dir = out_dir
+        bbox_whs, img_shapes = self.get_whs_and_shapes()
+        ratios = img_shapes.max(1, keepdims=True) / np.array([input_shape])
+
+        # resize to input shape
+        self.bbox_whs = bbox_whs / ratios
+
+    def get_whs_and_shapes(self):
+        """Get widths and heights of bboxes and shapes of images.
+
+        Returns:
+            tuple[np.ndarray]: Array of bbox shapes and array of image
+            shapes with shape (num_bboxes, 2) in [width, height] format.
+        """
+        self.logger.info('Collecting bboxes from annotation...')
+        bbox_whs = []
+        img_shapes = []
+        prog_bar = ProgressBar(len(self.dataset))
+        for idx in range(len(self.dataset)):
+            data_info = self.dataset.get_data_info(idx)
+            img_shape = np.array([data_info['width'], data_info['height']])
+            gt_instances = data_info['instances']
+            for instance in gt_instances:
+                bbox = np.array(instance['bbox'])
+                gt_filter_sizes = bbox[2:4] - bbox[0:2]
+                img_shapes.append(img_shape)
+                bbox_whs.append(gt_filter_sizes)
+
+            prog_bar.update()
+        print('\n')
+        bbox_whs = np.array(bbox_whs)
+        img_shapes = np.array(img_shapes)
+        self.logger.info(f'Collected {bbox_whs.shape[0]} bboxes.')
+        return bbox_whs, img_shapes
+
+    def get_zero_center_bbox_tensor(self):
+        """Get a tensor of bboxes centered at (0, 0).
+
+        Returns:
+            Tensor: Tensor of bboxes with shape (num_bboxes, 4)
+            in [xmin, ymin, xmax, ymax] format.
+        """
+        whs = torch.from_numpy(self.bbox_whs).to(
+            self.device, dtype=torch.float32)
+        bboxes = bbox_cxcywh_to_xyxy(
+            torch.cat([torch.zeros_like(whs), whs], dim=1))
+        return bboxes
+
+    def optimize(self):
+        raise NotImplementedError
+
+    def save_result(self, anchors, path=None):
+
+        anchor_results = []
+        start = 0
+        for num in self.num_anchor_per_level:
+            end = num + start
+            anchor_results.append([(round(w), round(h))
+                                   for w, h in anchors[start:end]])
+            start = end
+
+        self.logger.info(f'Anchor optimize result:{anchor_results}')
+        if path:
+            json_path = osp.join(path, 'anchor_optimize_result.json')
+            dump(anchor_results, json_path)
+            self.logger.info(f'Result saved in {json_path}')
+
+
+class YOLOKMeansAnchorOptimizer(BaseAnchorOptimizer):
+    r"""YOLO anchor optimizer using k-means. Code refer to `AlexeyAB/darknet.
+    <https://github.com/AlexeyAB/darknet/blob/master/src/detector.c>`_.
+
+    Args:
+        iters (int): Maximum iterations for k-means.
+    """
+
+    def __init__(self, iters, **kwargs):
+
+        super().__init__(**kwargs)
+        self.iters = iters
+
+    def optimize(self):
+        anchors = self.kmeans_anchors()
+        self.save_result(anchors, self.out_dir)
+
+    def kmeans_anchors(self):
+        self.logger.info(
+            f'Start cluster {self.num_anchors} YOLO anchors with K-means...')
+        bboxes = self.get_zero_center_bbox_tensor()
+        cluster_center_idx = torch.randint(
+            0, bboxes.shape[0], (self.num_anchors, )).to(self.device)
+
+        assignments = torch.zeros((bboxes.shape[0], )).to(self.device)
+        cluster_centers = bboxes[cluster_center_idx]
+        if self.num_anchors == 1:
+            cluster_centers = self.kmeans_maximization(bboxes, assignments,
+                                                       cluster_centers)
+            anchors = bbox_xyxy_to_cxcywh(cluster_centers)[:, 2:].cpu().numpy()
+            anchors = sorted(anchors, key=lambda x: x[0] * x[1])
+            return anchors
+
+        prog_bar = ProgressBar(self.iters)
+        for i in range(self.iters):
+            converged, assignments = self.kmeans_expectation(
+                bboxes, assignments, cluster_centers)
+            if converged:
+                self.logger.info(f'K-means process has converged at iter {i}.')
+                break
+            cluster_centers = self.kmeans_maximization(bboxes, assignments,
+                                                       cluster_centers)
+            prog_bar.update()
+        print('\n')
+        avg_iou = bbox_overlaps(bboxes,
+                                cluster_centers).max(1)[0].mean().item()
+
+        anchors = bbox_xyxy_to_cxcywh(cluster_centers)[:, 2:].cpu().numpy()
+        anchors = sorted(anchors, key=lambda x: x[0] * x[1])
+        self.logger.info(f'Anchor cluster finish. Average IOU: {avg_iou}')
+
+        return anchors
+
+    def kmeans_maximization(self, bboxes, assignments, centers):
+        """Maximization part of EM algorithm(Expectation-Maximization)"""
+        new_centers = torch.zeros_like(centers)
+        for i in range(centers.shape[0]):
+            mask = (assignments == i)
+            if mask.sum():
+                new_centers[i, :] = bboxes[mask].mean(0)
+        return new_centers
+
+    def kmeans_expectation(self, bboxes, assignments, centers):
+        """Expectation part of EM algorithm(Expectation-Maximization)"""
+        ious = bbox_overlaps(bboxes, centers)
+        closest = ious.argmax(1)
+        converged = (closest == assignments).all()
+        return converged, closest
+
+
+class YOLOV5KMeansAnchorOptimizer(BaseAnchorOptimizer):
+    r"""YOLOv5 anchor optimizer using shape k-means.
+    Code refer to `ultralytics/yolov5.
+    <https://github.com/ultralytics/yolov5/blob/master/utils/autoanchor.py>`_.
+
+    Args:
+        iters (int): Maximum iterations for k-means.
+        prior_match_thr (float): anchor-label width height
+            ratio threshold hyperparameter.
+    """
+
+    def __init__(self,
+                 iters,
+                 prior_match_thr=4.0,
+                 mutation_args=[0.9, 0.1],
+                 augment_args=[0.9, 1.1],
+                 **kwargs):
+
+        super().__init__(**kwargs)
+        self.iters = iters
+        self.prior_match_thr = prior_match_thr
+        [self.mutation_prob, self.mutation_sigma] = mutation_args
+        [self.augment_min, self.augment_max] = augment_args
+
+    def optimize(self):
+        self.logger.info(
+            f'Start cluster {self.num_anchors} YOLOv5 anchors with K-means...')
+
+        bbox_whs = torch.from_numpy(self.bbox_whs).to(
+            self.device, dtype=torch.float32)
+        anchors = self.anchor_generate(
+            bbox_whs,
+            num=self.num_anchors,
+            img_size=self.input_shape[0],
+            prior_match_thr=self.prior_match_thr,
+            iters=self.iters)
+        best_ratio, mean_matched = self.anchor_metric(bbox_whs, anchors)
+        self.logger.info(f'{mean_matched:.2f} anchors/target {best_ratio:.3f} '
+                         'Best Possible Recall (BPR). ')
+        self.save_result(anchors.tolist(), self.out_dir)
+
+    def anchor_generate(self,
+                        box_size: Tensor,
+                        num: int = 9,
+                        img_size: int = 640,
+                        prior_match_thr: float = 4.0,
+                        iters: int = 1000) -> Tensor:
+        """cluster boxes metric with anchors.
+
+        Args:
+            box_size (Tensor): The size of the bxes, which shape is
+                (box_num, 2),the number 2 means width and height.
+            num (int): number of anchors.
+            img_size (int): image size used for training
+            prior_match_thr (float): width/height ratio threshold
+                 used for training
+            iters (int): iterations to evolve anchors using genetic algorithm
+
+        Returns:
+            anchors (Tensor): kmeans evolved anchors
+        """
+
+        thr = 1 / prior_match_thr
+
+        # step1: filter small bbox
+        box_size = self._filter_box(box_size)
+        assert num <= len(box_size)
+
+        # step2: init anchors
+        if kmeans:
+            try:
+                self.logger.info(
+                    'beginning init anchors with scipy kmeans method')
+                # sigmas for whitening
+                sigmas = box_size.std(0).cpu().numpy()
+                anchors = kmeans(
+                    box_size.cpu().numpy() / sigmas, num, iter=30)[0] * sigmas
+                # kmeans may return fewer points than requested
+                # if width/height is insufficient or too similar
+                assert num == len(anchors)
+            except Exception:
+                self.logger.warning(
+                    'scipy kmeans method cannot get enough points '
+                    'because of width/height is insufficient or too similar, '
+                    'now switching strategies from kmeans to random init.')
+                anchors = np.sort(np.random.rand(num * 2)).reshape(
+                    num, 2) * img_size
+        else:
+            self.logger.info(
+                'cannot found scipy package, switching strategies from kmeans '
+                'to random init, you can install scipy package to '
+                'get better anchor init')
+            anchors = np.sort(np.random.rand(num * 2)).reshape(num,
+                                                               2) * img_size
+
+        self.logger.info('init done, beginning evolve anchors...')
+        # sort small to large
+        anchors = torch.tensor(anchors[np.argsort(anchors.prod(1))]).to(
+            box_size.device, dtype=torch.float32)
+
+        # step3: evolve anchors use Genetic Algorithm
+        prog_bar = ProgressBar(iters)
+        fitness = self._anchor_fitness(box_size, anchors, thr)
+        cluster_shape = anchors.shape
+
+        for _ in range(iters):
+            mutate_result = np.ones(cluster_shape)
+            # mutate until a change occurs (prevent duplicates)
+            while (mutate_result == 1).all():
+                # mutate_result is scale factor of anchors, between 0.3 and 3
+                mutate_result = (
+                    (np.random.random(cluster_shape) < self.mutation_prob) *
+                    random.random() * np.random.randn(*cluster_shape) *
+                    self.mutation_sigma + 1).clip(0.3, 3.0)
+            mutate_result = torch.from_numpy(mutate_result).to(box_size.device)
+            new_anchors = (anchors.clone() * mutate_result).clip(min=2.0)
+            new_fitness = self._anchor_fitness(box_size, new_anchors, thr)
+            if new_fitness > fitness:
+                fitness = new_fitness
+                anchors = new_anchors.clone()
+
+            prog_bar.update()
+        print('\n')
+        # sort small to large
+        anchors = anchors[torch.argsort(anchors.prod(1))]
+        self.logger.info(f'Anchor cluster finish. fitness = {fitness:.4f}')
+
+        return anchors
+
+    def anchor_metric(self,
+                      box_size: Tensor,
+                      anchors: Tensor,
+                      threshold: float = 4.0) -> Tuple:
+        """compute boxes metric with anchors.
+
+        Args:
+            box_size (Tensor): The size of the bxes, which shape
+                is (box_num, 2), the number 2 means width and height.
+            anchors (Tensor): The size of the bxes, which shape
+                is (anchor_num, 2), the number 2 means width and height.
+            threshold (float): the compare threshold of ratio
+
+        Returns:
+            Tuple: a tuple of metric result, best_ratio_mean and mean_matched
+        """
+        # step1: augment scale
+        # According to the uniform distribution,the scaling scale between
+        # augment_min and augment_max is randomly generated
+        scale = np.random.uniform(
+            self.augment_min, self.augment_max, size=(box_size.shape[0], 1))
+        box_size = torch.tensor(
+            np.array(
+                [l[:, ] * s for s, l in zip(scale,
+                                            box_size.cpu().numpy())])).to(
+                                                box_size.device,
+                                                dtype=torch.float32)
+        # step2: calculate ratio
+        min_ratio, best_ratio = self._metric(box_size, anchors)
+        mean_matched = (min_ratio > 1 / threshold).float().sum(1).mean()
+        best_ratio_mean = (best_ratio > 1 / threshold).float().mean()
+        return best_ratio_mean, mean_matched
+
+    def _filter_box(self, box_size: Tensor) -> Tensor:
+        small_cnt = (box_size < 3.0).any(1).sum()
+        if small_cnt:
+            self.logger.warning(
+                f'Extremely small objects found: {small_cnt} '
+                f'of {len(box_size)} labels are <3 pixels in size')
+        # filter > 2 pixels
+        filter_sizes = box_size[(box_size >= 2.0).any(1)]
+        return filter_sizes
+
+    def _anchor_fitness(self, box_size: Tensor, anchors: Tensor, thr: float):
+        """mutation fitness."""
+        _, best = self._metric(box_size, anchors)
+        return (best * (best > thr).float()).mean()
+
+    def _metric(self, box_size: Tensor, anchors: Tensor) -> Tuple:
+        """compute boxes metric with anchors.
+
+        Args:
+            box_size (Tensor): The size of the bxes, which shape is
+                (box_num, 2), the number 2 means width and height.
+            anchors (Tensor): The size of the bxes, which shape is
+                (anchor_num, 2), the number 2 means width and height.
+
+        Returns:
+            Tuple: a tuple of metric result, min_ratio and best_ratio
+        """
+
+        # ratio means the (width_1/width_2 and height_1/height_2) ratio of each
+        # box and anchor, the ratio shape is torch.Size([box_num,anchor_num,2])
+        ratio = box_size[:, None] / anchors[None]
+
+        # min_ratio records the min ratio of each box with all anchor,
+        # min_ratio.shape is torch.Size([box_num,anchor_num])
+        # notice:
+        # smaller ratio means worse shape-match between boxes and anchors
+        min_ratio = torch.min(ratio, 1 / ratio).min(2)[0]
+
+        # find the best shape-match ratio for each box
+        # box_best_ratio.shape is torch.Size([box_num])
+        best_ratio = min_ratio.max(1)[0]
+
+        return min_ratio, best_ratio
+
+
+class YOLODEAnchorOptimizer(BaseAnchorOptimizer):
+    """YOLO anchor optimizer using differential evolution algorithm.
+
+    Args:
+        iters (int): Maximum iterations for k-means.
+        strategy (str): The differential evolution strategy to use.
+            Should be one of:
+
+                - 'best1bin'
+                - 'best1exp'
+                - 'rand1exp'
+                - 'randtobest1exp'
+                - 'currenttobest1exp'
+                - 'best2exp'
+                - 'rand2exp'
+                - 'randtobest1bin'
+                - 'currenttobest1bin'
+                - 'best2bin'
+                - 'rand2bin'
+                - 'rand1bin'
+
+            Default: 'best1bin'.
+        population_size (int): Total population size of evolution algorithm.
+            Default: 15.
+        convergence_thr (float): Tolerance for convergence, the
+            optimizing stops when ``np.std(pop) <= abs(convergence_thr)
+            + convergence_thr * np.abs(np.mean(population_energies))``,
+            respectively. Default: 0.0001.
+        mutation (tuple[float]): Range of dithering randomly changes the
+            mutation constant. Default: (0.5, 1).
+        recombination (float): Recombination constant of crossover probability.
+            Default: 0.7.
+    """
+
+    def __init__(self,
+                 iters,
+                 strategy='best1bin',
+                 population_size=15,
+                 convergence_thr=0.0001,
+                 mutation=(0.5, 1),
+                 recombination=0.7,
+                 **kwargs):
+
+        super().__init__(**kwargs)
+
+        self.iters = iters
+        self.strategy = strategy
+        self.population_size = population_size
+        self.convergence_thr = convergence_thr
+        self.mutation = mutation
+        self.recombination = recombination
+
+    def optimize(self):
+        anchors = self.differential_evolution()
+        self.save_result(anchors, self.out_dir)
+
+    def differential_evolution(self):
+        bboxes = self.get_zero_center_bbox_tensor()
+
+        bounds = []
+        for i in range(self.num_anchors):
+            bounds.extend([(0, self.input_shape[0]), (0, self.input_shape[1])])
+
+        result = differential_evolution(
+            func=self.avg_iou_cost,
+            bounds=bounds,
+            args=(bboxes, ),
+            strategy=self.strategy,
+            maxiter=self.iters,
+            popsize=self.population_size,
+            tol=self.convergence_thr,
+            mutation=self.mutation,
+            recombination=self.recombination,
+            updating='immediate',
+            disp=True)
+        self.logger.info(
+            f'Anchor evolution finish. Average IOU: {1 - result.fun}')
+        anchors = [(w, h) for w, h in zip(result.x[::2], result.x[1::2])]
+        anchors = sorted(anchors, key=lambda x: x[0] * x[1])
+        return anchors
+
+    @staticmethod
+    def avg_iou_cost(anchor_params, bboxes):
+        assert len(anchor_params) % 2 == 0
+        anchor_whs = torch.tensor(
+            [[w, h]
+             for w, h in zip(anchor_params[::2], anchor_params[1::2])]).to(
+                 bboxes.device, dtype=bboxes.dtype)
+        anchor_boxes = bbox_cxcywh_to_xyxy(
+            torch.cat([torch.zeros_like(anchor_whs), anchor_whs], dim=1))
+        ious = bbox_overlaps(bboxes, anchor_boxes)
+        max_ious, _ = ious.max(1)
+        cost = 1 - max_ious.mean().item()
+        return cost
+
+
+def main():
+    logger = MMLogger.get_current_instance()
+    args = parse_args()
+    cfg = args.config
+    cfg = Config.fromfile(cfg)
+
+    # replace the ${key} with the value of cfg.key
+    cfg = replace_cfg_vals(cfg)
+
+    # update data root according to MMDET_DATASETS
+    update_data_root(cfg)
+
+    init_default_scope(cfg.get('default_scope', 'mmyolo'))
+
+    input_shape = args.input_shape
+    assert len(input_shape) == 2
+
+    anchor_type = cfg.model.bbox_head.prior_generator.type
+    assert anchor_type == 'mmdet.YOLOAnchorGenerator', \
+        f'Only support optimize YOLOAnchor, but get {anchor_type}.'
+
+    base_sizes = cfg.model.bbox_head.prior_generator.base_sizes
+    num_anchor_per_level = [len(sizes) for sizes in base_sizes]
+
+    train_data_cfg = cfg.train_dataloader
+    while 'dataset' in train_data_cfg:
+        train_data_cfg = train_data_cfg['dataset']
+    dataset = DATASETS.build(train_data_cfg)
+
+    if args.algorithm == 'k-means':
+        optimizer = YOLOKMeansAnchorOptimizer(
+            dataset=dataset,
+            input_shape=input_shape,
+            device=args.device,
+            num_anchor_per_level=num_anchor_per_level,
+            iters=args.iters,
+            logger=logger,
+            out_dir=args.out_dir)
+    elif args.algorithm == 'DE':
+        optimizer = YOLODEAnchorOptimizer(
+            dataset=dataset,
+            input_shape=input_shape,
+            device=args.device,
+            num_anchor_per_level=num_anchor_per_level,
+            iters=args.iters,
+            logger=logger,
+            out_dir=args.out_dir)
+    elif args.algorithm == 'v5-k-means':
+        optimizer = YOLOV5KMeansAnchorOptimizer(
+            dataset=dataset,
+            input_shape=input_shape,
+            device=args.device,
+            num_anchor_per_level=num_anchor_per_level,
+            iters=args.iters,
+            prior_match_thr=args.prior_match_thr,
+            mutation_args=args.mutation_args,
+            augment_args=args.augment_args,
+            logger=logger,
+            out_dir=args.out_dir)
+    else:
+        raise NotImplementedError(
+            f'Only support k-means and differential_evolution, '
+            f'but get {args.algorithm}')
+
+    optimizer.optimize()
+
+
+if __name__ == '__main__':
+    main()
diff --git a/mmdetection_practice/third_party/mmyolo/tools/analysis_tools/vis_scheduler.py b/mmdetection_practice/third_party/mmyolo/tools/analysis_tools/vis_scheduler.py
new file mode 100644
index 0000000..8a2922d
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tools/analysis_tools/vis_scheduler.py
@@ -0,0 +1,295 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+"""Hyper-parameter Scheduler Visualization.
+
+This tool aims to help the user to check
+the hyper-parameter scheduler of the optimizer(without training),
+which support the "learning rate", "momentum", and "weight_decay".
+
+Example:
+```shell
+python tools/analysis_tools/vis_scheduler.py \
+    configs/rtmdet/rtmdet_s_syncbn_fast_8xb32-300e_coco.py \
+    --dataset-size 118287 \
+    --ngpus 8 \
+    --out-dir ./output
+```
+Modified from: https://github.com/open-mmlab/mmclassification/blob/1.x/tools/visualizations/vis_scheduler.py # noqa
+"""
+import argparse
+import json
+import os.path as osp
+import re
+from pathlib import Path
+from unittest.mock import MagicMock
+
+import matplotlib.pyplot as plt
+import rich
+import torch.nn as nn
+from mmengine.config import Config, DictAction
+from mmengine.hooks import Hook
+from mmengine.model import BaseModel
+from mmengine.registry import init_default_scope
+from mmengine.runner import Runner
+from mmengine.utils.path import mkdir_or_exist
+from mmengine.visualization import Visualizer
+from rich.progress import BarColumn, MofNCompleteColumn, Progress, TextColumn
+
+
+def parse_args():
+    parser = argparse.ArgumentParser(
+        description='Visualize a hyper-parameter scheduler')
+    parser.add_argument('config', help='config file path')
+    parser.add_argument(
+        '-p',
+        '--parameter',
+        type=str,
+        default='lr',
+        choices=['lr', 'momentum', 'wd'],
+        help='The parameter to visualize its change curve, choose from'
+        '"lr", "wd" and "momentum". Defaults to "lr".')
+    parser.add_argument(
+        '-d',
+        '--dataset-size',
+        type=int,
+        help='The size of the dataset. If specify, `DATASETS.build` will '
+        'be skipped and use this size as the dataset size.')
+    parser.add_argument(
+        '-n',
+        '--ngpus',
+        type=int,
+        default=1,
+        help='The number of GPUs used in training.')
+    parser.add_argument(
+        '-o', '--out-dir', type=Path, help='Path to output file')
+    parser.add_argument(
+        '--log-level',
+        default='WARNING',
+        help='The log level of the handler and logger. Defaults to '
+        'WARNING.')
+    parser.add_argument('--title', type=str, help='title of figure')
+    parser.add_argument(
+        '--style', type=str, default='whitegrid', help='style of plt')
+    parser.add_argument('--not-show', default=False, action='store_true')
+    parser.add_argument(
+        '--window-size',
+        default='12*7',
+        help='Size of the window to display images, in format of "$W*$H".')
+    parser.add_argument(
+        '--cfg-options',
+        nargs='+',
+        action=DictAction,
+        help='override some settings in the used config, the key-value pair '
+        'in xxx=yyy format will be merged into config file. If the value to '
+        'be overwritten is a list, it should be like key="[a,b]" or key=a,b '
+        'It also allows nested list/tuple values, e.g. key="[(a,b),(c,d)]" '
+        'Note that the quotation marks are necessary and that no white space '
+        'is allowed.')
+    args = parser.parse_args()
+    if args.window_size != '':
+        assert re.match(r'\d+\*\d+', args.window_size), \
+            "'window-size' must be in format 'W*H'."
+
+    return args
+
+
+class SimpleModel(BaseModel):
+    """simple model that do nothing in train_step."""
+
+    def __init__(self):
+        super().__init__()
+        self.data_preprocessor = nn.Identity()
+        self.conv = nn.Conv2d(1, 1, 1)
+
+    def forward(self, inputs, data_samples, mode='tensor'):
+        pass
+
+    def train_step(self, data, optim_wrapper):
+        pass
+
+
+class ParamRecordHook(Hook):
+
+    def __init__(self, by_epoch):
+        super().__init__()
+        self.by_epoch = by_epoch
+        self.lr_list = []
+        self.momentum_list = []
+        self.wd_list = []
+        self.task_id = 0
+        self.progress = Progress(BarColumn(), MofNCompleteColumn(),
+                                 TextColumn('{task.description}'))
+
+    def before_train(self, runner):
+        if self.by_epoch:
+            total = runner.train_loop.max_epochs
+            self.task_id = self.progress.add_task(
+                'epochs', start=True, total=total)
+        else:
+            total = runner.train_loop.max_iters
+            self.task_id = self.progress.add_task(
+                'iters', start=True, total=total)
+        self.progress.start()
+
+    def after_train_epoch(self, runner):
+        if self.by_epoch:
+            self.progress.update(self.task_id, advance=1)
+
+    # TODO: Support multiple schedulers
+    def after_train_iter(self, runner, batch_idx, data_batch, outputs):
+        if not self.by_epoch:
+            self.progress.update(self.task_id, advance=1)
+        self.lr_list.append(runner.optim_wrapper.get_lr()['lr'][0])
+        self.momentum_list.append(
+            runner.optim_wrapper.get_momentum()['momentum'][0])
+        self.wd_list.append(
+            runner.optim_wrapper.param_groups[0]['weight_decay'])
+
+    def after_train(self, runner):
+        self.progress.stop()
+
+
+def plot_curve(lr_list, args, param_name, iters_per_epoch, by_epoch=True):
+    """Plot learning rate vs iter graph."""
+    try:
+        import seaborn as sns
+        sns.set_style(args.style)
+    except ImportError:
+        pass
+
+    wind_w, wind_h = args.window_size.split('*')
+    wind_w, wind_h = int(wind_w), int(wind_h)
+    plt.figure(figsize=(wind_w, wind_h))
+
+    ax: plt.Axes = plt.subplot()
+    ax.plot(lr_list, linewidth=1)
+
+    if by_epoch:
+        ax.xaxis.tick_top()
+        ax.set_xlabel('Iters')
+        ax.xaxis.set_label_position('top')
+        sec_ax = ax.secondary_xaxis(
+            'bottom',
+            functions=(lambda x: x / iters_per_epoch,
+                       lambda y: y * iters_per_epoch))
+        sec_ax.set_xlabel('Epochs')
+    else:
+        plt.xlabel('Iters')
+    plt.ylabel(param_name)
+
+    if args.title is None:
+        plt.title(f'{osp.basename(args.config)} {param_name} curve')
+    else:
+        plt.title(args.title)
+
+
+def simulate_train(data_loader, cfg, by_epoch):
+    model = SimpleModel()
+    param_record_hook = ParamRecordHook(by_epoch=by_epoch)
+    default_hooks = dict(
+        param_scheduler=cfg.default_hooks['param_scheduler'],
+        runtime_info=None,
+        timer=None,
+        logger=None,
+        checkpoint=None,
+        sampler_seed=None,
+        param_record=param_record_hook)
+
+    runner = Runner(
+        model=model,
+        work_dir=cfg.work_dir,
+        train_dataloader=data_loader,
+        train_cfg=cfg.train_cfg,
+        log_level=cfg.log_level,
+        optim_wrapper=cfg.optim_wrapper,
+        param_scheduler=cfg.param_scheduler,
+        default_scope=cfg.default_scope,
+        default_hooks=default_hooks,
+        visualizer=MagicMock(spec=Visualizer),
+        custom_hooks=cfg.get('custom_hooks', None))
+
+    runner.train()
+
+    param_dict = dict(
+        lr=param_record_hook.lr_list,
+        momentum=param_record_hook.momentum_list,
+        wd=param_record_hook.wd_list)
+
+    return param_dict
+
+
+def main():
+    args = parse_args()
+    cfg = Config.fromfile(args.config)
+    if args.cfg_options is not None:
+        cfg.merge_from_dict(args.cfg_options)
+    if cfg.get('work_dir', None) is None:
+        # use config filename as default work_dir if cfg.work_dir is None
+        cfg.work_dir = osp.join('./work_dirs',
+                                osp.splitext(osp.basename(args.config))[0])
+
+    cfg.log_level = args.log_level
+
+    init_default_scope(cfg.get('default_scope', 'mmyolo'))
+
+    # init logger
+    print('Param_scheduler :')
+    rich.print_json(json.dumps(cfg.param_scheduler))
+
+    # prepare data loader
+    batch_size = cfg.train_dataloader.batch_size * args.ngpus
+
+    if 'by_epoch' in cfg.train_cfg:
+        by_epoch = cfg.train_cfg.get('by_epoch')
+    elif 'type' in cfg.train_cfg:
+        by_epoch = cfg.train_cfg.get('type') == 'EpochBasedTrainLoop'
+    else:
+        raise ValueError('please set `train_cfg`.')
+
+    if args.dataset_size is None and by_epoch:
+        from mmyolo.registry import DATASETS
+        dataset_size = len(DATASETS.build(cfg.train_dataloader.dataset))
+    else:
+        dataset_size = args.dataset_size or batch_size
+
+    class FakeDataloader(list):
+        dataset = MagicMock(metainfo=None)
+
+    data_loader = FakeDataloader(range(dataset_size // batch_size))
+    dataset_info = (
+        f'\nDataset infos:'
+        f'\n - Dataset size: {dataset_size}'
+        f'\n - Batch size per GPU: {cfg.train_dataloader.batch_size}'
+        f'\n - Number of GPUs: {args.ngpus}'
+        f'\n - Total batch size: {batch_size}')
+    if by_epoch:
+        dataset_info += f'\n - Iterations per epoch: {len(data_loader)}'
+    rich.print(dataset_info + '\n')
+
+    # simulation training process
+    param_dict = simulate_train(data_loader, cfg, by_epoch)
+    param_list = param_dict[args.parameter]
+
+    if args.parameter == 'lr':
+        param_name = 'Learning Rate'
+    elif args.parameter == 'momentum':
+        param_name = 'Momentum'
+    else:
+        param_name = 'Weight Decay'
+    plot_curve(param_list, args, param_name, len(data_loader), by_epoch)
+
+    if args.out_dir:
+        # make dir for output
+        mkdir_or_exist(args.out_dir)
+
+        # save the graph
+        out_file = osp.join(
+            args.out_dir, f'{osp.basename(args.config)}-{args.parameter}.jpg')
+        plt.savefig(out_file)
+        print(f'\nThe {param_name} graph is saved at {out_file}')
+
+    if not args.not_show:
+        plt.show()
+
+
+if __name__ == '__main__':
+    main()
diff --git a/mmdetection_practice/third_party/mmyolo/tools/dataset_converters/balloon2coco.py b/mmdetection_practice/third_party/mmyolo/tools/dataset_converters/balloon2coco.py
new file mode 100644
index 0000000..65eb660
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tools/dataset_converters/balloon2coco.py
@@ -0,0 +1,58 @@
+import os.path as osp
+
+import mmcv
+import mmengine
+
+
+def convert_balloon_to_coco(ann_file, out_file, image_prefix):
+
+    data_infos = mmengine.load(ann_file)
+
+    annotations = []
+    images = []
+    obj_count = 0
+    for idx, v in enumerate(mmengine.track_iter_progress(data_infos.values())):
+        filename = v['filename']
+        img_path = osp.join(image_prefix, filename)
+        height, width = mmcv.imread(img_path).shape[:2]
+
+        images.append(
+            dict(id=idx, file_name=filename, height=height, width=width))
+
+        for _, obj in v['regions'].items():
+            assert not obj['region_attributes']
+            obj = obj['shape_attributes']
+            px = obj['all_points_x']
+            py = obj['all_points_y']
+            poly = [(x + 0.5, y + 0.5) for x, y in zip(px, py)]
+            poly = [p for x in poly for p in x]
+
+            x_min, y_min, x_max, y_max = (min(px), min(py), max(px), max(py))
+
+            data_anno = dict(
+                image_id=idx,
+                id=obj_count,
+                category_id=0,
+                bbox=[x_min, y_min, x_max - x_min, y_max - y_min],
+                area=(x_max - x_min) * (y_max - y_min),
+                segmentation=[poly],
+                iscrowd=0)
+            annotations.append(data_anno)
+            obj_count += 1
+
+    coco_format_json = dict(
+        images=images,
+        annotations=annotations,
+        categories=[{
+            'id': 0,
+            'name': 'balloon'
+        }])
+    mmengine.dump(coco_format_json, out_file)
+
+
+if __name__ == '__main__':
+
+    convert_balloon_to_coco('data/balloon/train/via_region_data.json',
+                            'data/balloon/train.json', 'data/balloon/train/')
+    convert_balloon_to_coco('data/balloon/val/via_region_data.json',
+                            'data/balloon/val.json', 'data/balloon/val/')
diff --git a/mmdetection_practice/third_party/mmyolo/tools/dataset_converters/dota/README.md b/mmdetection_practice/third_party/mmyolo/tools/dataset_converters/dota/README.md
new file mode 100644
index 0000000..a166e27
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tools/dataset_converters/dota/README.md
@@ -0,0 +1,3 @@
+# Preparing DOTA Dataset
+
+Please refer to [Dataset preparation and description](../../../docs/en/recommended_topics/dataset_preparation.md)
diff --git a/mmdetection_practice/third_party/mmyolo/tools/dataset_converters/dota/dota_split.py b/mmdetection_practice/third_party/mmyolo/tools/dataset_converters/dota/dota_split.py
new file mode 100644
index 0000000..0418e9d
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tools/dataset_converters/dota/dota_split.py
@@ -0,0 +1,603 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+# Reference: https://github.com/jbwang1997/BboxToolkit
+
+import argparse
+import codecs
+import datetime
+import itertools
+import os
+import os.path as osp
+import time
+from functools import partial, reduce
+from math import ceil
+from multiprocessing import Manager, Pool
+from typing import List, Sequence
+
+import cv2
+import numpy as np
+from mmengine import Config, MMLogger, mkdir_or_exist, print_log
+from PIL import Image
+
+Image.MAX_IMAGE_PIXELS = None
+
+try:
+    import shapely.geometry as shgeo
+except ImportError:
+    raise ImportError('Please run "pip install shapely" '
+                      'to install shapely first.')
+
+PHASE_REQUIRE_SETS = dict(
+    trainval=['train', 'val'],
+    train=[
+        'train',
+    ],
+    val=[
+        'val',
+    ],
+    test=[
+        'test',
+    ],
+)
+
+
+def parse_args():
+    """Parse arguments."""
+    parser = argparse.ArgumentParser()
+    parser.add_argument(
+        'split_config', type=str, help='The split config for image slicing.')
+    parser.add_argument(
+        'data_root', type=str, help='Root dir of DOTA dataset.')
+    parser.add_argument(
+        'out_dir', type=str, help='Output dir for split result.')
+    parser.add_argument(
+        '--ann-subdir',
+        default='labelTxt-v1.0',
+        type=str,
+        help='output directory')
+    parser.add_argument(
+        '--phase',
+        '-p',
+        nargs='+',
+        default=['trainval', 'test'],
+        type=str,
+        choices=['trainval', 'train', 'val', 'test'],
+        help='Phase of the data set to be prepared.')
+    parser.add_argument(
+        '--nproc', default=8, type=int, help='Number of processes.')
+    parser.add_argument(
+        '--save-ext',
+        default=None,
+        type=str,
+        help='Extension of the saved image.')
+    parser.add_argument(
+        '--overwrite',
+        action='store_true',
+        help='Whether to allow overwrite if annotation folder exist.')
+    args = parser.parse_args()
+
+    assert args.split_config is not None, "argument split_config can't be None"
+    split_cfg = Config.fromfile(args.split_config)
+
+    # assert arguments
+    assert args.data_root is not None, "argument data_root can't be None"
+    if args.save_ext:
+        assert args.save_ext in ['png', 'jpg', 'bmp', 'tif']
+
+    assert len(split_cfg.patch_sizes) == len(split_cfg.patch_overlap_sizes)
+    assert 0 <= split_cfg.iof_thr <= 1
+    if split_cfg.get('padding'):
+        padding_value = split_cfg.get('padding_value')
+        assert padding_value is not None, \
+            "padding_value can't be None when padding is True."
+        padding_value = padding_value[0] \
+            if len(padding_value) == 1 else padding_value
+        split_cfg.padding_value = padding_value
+    else:
+        split_cfg.padding = False
+        split_cfg.padding_value = None
+    return args, split_cfg
+
+
+def _make_dirs(out_dir: str, phase: List[str], allow_overwrite: bool):
+    """Prepare folder for DOTA dataset.
+
+    Args:
+        out_dir (str): The output dir for DOTA split.
+        phase (List[str]): The phase to prepare.
+        allow_overwrite (bool): Whether to allow overwrite when folder exist.
+    """
+    logger = MMLogger.get_current_instance()
+    for p in phase:
+        phase_dir = osp.join(out_dir, p)
+        if not allow_overwrite:
+            assert not osp.exists(phase_dir), \
+                f'{osp.join(phase_dir)} already exists,' \
+                'If you want to ignore existing files, set --overwrite'
+        else:
+            if osp.exists(phase_dir):
+                logger.warning(
+                    f'{p} set in {osp.join(phase_dir)} will be overwritten')
+        mkdir_or_exist(phase_dir)
+        mkdir_or_exist(osp.join(phase_dir, 'images'))
+        mkdir_or_exist(osp.join(phase_dir, 'annfiles'))
+
+
+def load_original_annotations(data_root: str,
+                              ann_subdir: str = 'labelTxt-v1.0',
+                              phase: str = 'train',
+                              nproc: int = 8):
+    img_dir = osp.join(data_root, phase, 'images')
+    assert osp.isdir(img_dir), f'The {img_dir} is not an existing dir!'
+
+    if phase == 'test':
+        ann_dir = None
+    else:
+        ann_dir = osp.join(data_root, phase, ann_subdir, 'labelTxt')
+        assert osp.isdir(ann_dir), f'The {ann_dir} is not an existing dir!'
+
+    _load_func = partial(_load_dota_single, img_dir=img_dir, ann_dir=ann_dir)
+    if nproc > 1:
+        pool = Pool(nproc)
+        contents = pool.map(_load_func, os.listdir(img_dir))
+        pool.close()
+    else:
+        contents = list(map(_load_func, os.listdir(img_dir)))
+    infos = [c for c in contents if c is not None]
+    return infos
+
+
+def _load_dota_single(imgfile: str, img_dir: str, ann_dir: str):
+    """Load DOTA's single image.
+
+    Args:
+        imgfile (str): Filename of single image.
+        img_dir (str): Path of images.
+        ann_dir (str): Path of annotations.
+
+    Returns:
+        result (dict): Information of a single image.
+
+        - ``id``: Image id.
+        - ``filename``: Filename of single image.
+        - ``filepath``: Filepath of single image.
+        - ``width``: The width of image.
+        - ``height``: The height of image.
+        - ``annotations``: The annotation of single image.
+        - ``gsd``: The ground sampling distance.
+    """
+    img_id, ext = osp.splitext(imgfile)
+    if ext not in ['.jpg', '.JPG', '.png', '.tif', '.bmp']:
+        return None
+
+    imgpath = osp.join(img_dir, imgfile)
+    size = Image.open(imgpath).size
+    txtfile = None if ann_dir is None else osp.join(ann_dir, img_id + '.txt')
+    content = _load_dota_txt(txtfile)
+
+    content.update(
+        dict(
+            width=size[0],
+            height=size[1],
+            filename=imgfile,
+            filepath=imgpath,
+            id=img_id))
+    return content
+
+
+def _load_dota_txt(txtfile):
+    """Load DOTA's txt annotation.
+
+    Args:
+        txtfile (str): Filename of single Dota txt annotation.
+
+    Returns:
+        result (dict): Annotation of single image.
+
+        - ``annotations``: The annotation of single image.
+        - ``gsd``: The ground sampling distance.
+    """
+    gsd, bboxes, labels, diffs = None, [], [], []
+    if txtfile is None:
+        pass
+    elif not osp.isfile(txtfile):
+        print(f"Can't find {txtfile}, treated as empty txtfile")
+    else:
+        with open(txtfile) as f:
+            for line in f:
+                if line.startswith('gsd'):
+                    num = line.split(':')[-1]
+                    try:
+                        gsd = float(num)
+                    except ValueError:
+                        gsd = None
+                    continue
+
+                items = line.split(' ')
+                if len(items) >= 9:
+                    bboxes.append([float(i) for i in items[:8]])
+                    labels.append(items[8])
+                    diffs.append(int(items[9]) if len(items) == 10 else 0)
+
+    bboxes = np.array(bboxes, dtype=np.float32) if bboxes else \
+        np.zeros((0, 8), dtype=np.float32)
+    diffs = np.array(diffs, dtype=np.int64) if diffs else \
+        np.zeros((0,), dtype=np.int64)
+    ann = dict(bboxes=bboxes, labels=labels, diffs=diffs)
+    return dict(gsd=gsd, annotations=ann)
+
+
+def poly2hbb(polys):
+    """Convert polygons to horizontal bboxes.
+
+    Args:
+        polys (np.array): Polygons with shape (N, 8)
+
+    Returns:
+        np.array: Horizontal bboxes.
+    """
+    shape = polys.shape
+    polys = polys.reshape(*shape[:-1], shape[-1] // 2, 2)
+    lt_point = np.min(polys, axis=-2)
+    rb_point = np.max(polys, axis=-2)
+    return np.concatenate([lt_point, rb_point], axis=-1)
+
+
+def get_sliding_window(info, patch_settings, img_rate_thr):
+    """Get sliding windows.
+
+    Args:
+        info (dict): Dict of image's width and height.
+        patch_settings (list): List of patch settings,
+            each in format (patch_size, patch_overlap).
+        img_rate_thr (float): Threshold of window area divided by image area.
+
+    Returns:
+        list[np.array]: Information of valid windows.
+    """
+    eps = 0.01
+    windows = []
+    width, height = info['width'], info['height']
+    for (size, gap) in patch_settings:
+        assert size > gap, f'invaild size gap pair [{size} {gap}]'
+        step = size - gap
+
+        x_num = 1 if width <= size else ceil((width - size) / step + 1)
+        x_start = [step * i for i in range(x_num)]
+        if len(x_start) > 1 and x_start[-1] + size > width:
+            x_start[-1] = width - size
+
+        y_num = 1 if height <= size else ceil((height - size) / step + 1)
+        y_start = [step * i for i in range(y_num)]
+        if len(y_start) > 1 and y_start[-1] + size > height:
+            y_start[-1] = height - size
+
+        start = np.array(
+            list(itertools.product(x_start, y_start)), dtype=np.int64)
+        stop = start + size
+        windows.append(np.concatenate([start, stop], axis=1))
+    windows = np.concatenate(windows, axis=0)
+
+    img_in_wins = windows.copy()
+    img_in_wins[:, 0::2] = np.clip(img_in_wins[:, 0::2], 0, width)
+    img_in_wins[:, 1::2] = np.clip(img_in_wins[:, 1::2], 0, height)
+    img_areas = (img_in_wins[:, 2] - img_in_wins[:, 0]) * \
+                (img_in_wins[:, 3] - img_in_wins[:, 1])
+    win_areas = (windows[:, 2] - windows[:, 0]) * \
+                (windows[:, 3] - windows[:, 1])
+    img_rates = img_areas / win_areas
+    if not (img_rates > img_rate_thr).any():
+        max_rate = img_rates.max()
+        img_rates[abs(img_rates - max_rate) < eps] = 1
+    return windows[img_rates > img_rate_thr]
+
+
+def get_window_annotation(info, windows, iof_thr):
+    """Get annotation by sliding windows.
+
+    Args:
+        info (dict): Dict of bbox annotations.
+        windows (np.array): information of sliding windows.
+        iof_thr (float): Threshold of overlaps between bbox and window.
+
+    Returns:
+        list[dict]: List of bbox annotations of every window.
+    """
+    bboxes = info['annotations']['bboxes']
+    iofs = ann_window_iof(bboxes, windows)
+
+    window_anns = []
+    for i in range(windows.shape[0]):
+        win_iofs = iofs[:, i]
+        pos_inds = np.nonzero(win_iofs >= iof_thr)[0].tolist()
+
+        win_ann = dict()
+        for k, v in info['annotations'].items():
+            try:
+                win_ann[k] = v[pos_inds]
+            except TypeError:
+                win_ann[k] = [v[i] for i in pos_inds]
+        win_ann['trunc'] = win_iofs[pos_inds] < 1
+        window_anns.append(win_ann)
+    return window_anns
+
+
+def ann_window_iof(anns, window, eps=1e-6):
+    """Compute overlaps (iof) between annotations (poly) and window (hbox).
+
+    Args:
+        anns (np.array): quadri annotations with shape (n, 8).
+        window (np.array): slide windows with shape (m, 4).
+        eps (float, optional): Defaults to 1e-6.
+
+    Returns:
+        np.array: iof between box and window.
+    """
+    rows = anns.shape[0]
+    cols = window.shape[0]
+
+    if rows * cols == 0:
+        return np.zeros((rows, cols), dtype=np.float32)
+
+    hbboxes_ann = poly2hbb(anns)
+    hbboxes_win = window
+    hbboxes_ann = hbboxes_ann[:, None, :]
+    lt = np.maximum(hbboxes_ann[..., :2], hbboxes_win[..., :2])
+    rb = np.minimum(hbboxes_ann[..., 2:], hbboxes_win[..., 2:])
+    wh = np.clip(rb - lt, 0, np.inf)
+    h_overlaps = wh[..., 0] * wh[..., 1]
+
+    l, t, r, b = (window[..., i] for i in range(4))
+    polys_win = np.stack([l, t, r, t, r, b, l, b], axis=-1)
+    sg_polys_ann = [shgeo.Polygon(p) for p in anns.reshape(rows, -1, 2)]
+    sg_polys_win = [shgeo.Polygon(p) for p in polys_win.reshape(cols, -1, 2)]
+    overlaps = np.zeros(h_overlaps.shape)
+    for p in zip(*np.nonzero(h_overlaps)):
+        overlaps[p] = sg_polys_ann[p[0]].intersection(sg_polys_win[p[-1]]).area
+    unions = np.array([p.area for p in sg_polys_ann], dtype=np.float32)
+    unions = unions[..., None]
+
+    unions = np.clip(unions, eps, np.inf)
+    outputs = overlaps / unions
+    if outputs.ndim == 1:
+        outputs = outputs[..., None]
+    return outputs
+
+
+def crop_and_save_img(info, windows, window_anns, padding, padding_value,
+                      save_dir, anno_dir, img_ext):
+    """Crop the image and save.
+
+    Args:
+        info (dict): Image's information.
+        windows (np.array): information of sliding windows.
+        window_anns (list[dict]): List of bbox annotations of every window.
+        padding (bool): If True, with padding.
+        padding_value (tuple[int|float]): Padding value.
+        save_dir (str): Save filename.
+        anno_dir (str): Annotation filename.
+        img_ext (str): Picture suffix.
+
+    Returns:
+        list[dict]: Information of paths.
+    """
+    img = cv2.imread(info['filepath'])
+    patch_infos = []
+    for window, ann in zip(windows, window_anns):
+        patch_info = dict()
+        for k, v in info.items():
+            if k not in [
+                    'id', 'filename', 'filepath', 'width', 'height',
+                    'annotations'
+            ]:
+                patch_info[k] = v
+
+        x_start, y_start, x_stop, y_stop = window.tolist()
+        patch_info['x_start'] = x_start
+        patch_info['y_start'] = y_start
+        patch_info['id'] = \
+            info['id'] + '__' + str(x_stop - x_start) + \
+            '__' + str(x_start) + '___' + str(y_start)
+        patch_info['ori_id'] = info['id']
+
+        ann['bboxes'] = shift_qbboxes(ann['bboxes'], [-x_start, -y_start])
+        patch_info['ann'] = ann
+
+        patch = img[y_start:y_stop, x_start:x_stop]
+        if padding:
+            height = y_stop - y_start
+            width = x_stop - x_start
+            if height > patch.shape[0] or width > patch.shape[1]:
+                padding_patch = np.empty((height, width, patch.shape[-1]),
+                                         dtype=np.uint8)
+                if not isinstance(padding_value, (int, float)):
+                    assert len(padding_value) == patch.shape[-1]
+                padding_patch[...] = padding_value
+                padding_patch[:patch.shape[0], :patch.shape[1], ...] = patch
+                patch = padding_patch
+        patch_info['height'] = patch.shape[0]
+        patch_info['width'] = patch.shape[1]
+
+        cv2.imwrite(
+            osp.join(save_dir, patch_info['id'] + '.' + img_ext), patch)
+        patch_info['filename'] = patch_info['id'] + '.' + img_ext
+        patch_infos.append(patch_info)
+
+        bboxes_num = patch_info['ann']['bboxes'].shape[0]
+        outdir = os.path.join(anno_dir, patch_info['id'] + '.txt')
+
+        with codecs.open(outdir, 'w', 'utf-8') as f_out:
+            if bboxes_num == 0:
+                pass
+            else:
+                for idx in range(bboxes_num):
+                    obj = patch_info['ann']
+                    outline = ' '.join(list(map(str, obj['bboxes'][idx])))
+                    diffs = str(
+                        obj['diffs'][idx]) if not obj['trunc'][idx] else '2'
+                    outline = outline + ' ' + obj['labels'][idx] + ' ' + diffs
+                    f_out.write(outline + '\n')
+
+    return patch_infos
+
+
+def shift_qbboxes(bboxes, offset: Sequence[float]):
+    """Map bboxes from window coordinate back to original coordinate. TODO
+    Refactor and move to `mmyolo/utils/large_image.py`
+
+    Args:
+        bboxes (np.array): quadrilateral boxes with window coordinate.
+        offset (Sequence[float]): The translation offsets with shape of (2, ).
+
+    Returns:
+        np.array: bboxes with original coordinate.
+    """
+    dim = bboxes.shape[-1]
+    translated = bboxes + np.array(offset * int(dim / 2), dtype=np.float32)
+    return translated
+
+
+def single_split(info, patch_settings, min_img_ratio, iof_thr, padding,
+                 padding_value, save_dir, anno_dir, img_ext, lock, prog,
+                 total):
+    """Single image split. TODO Refactoring to make it more generic.
+
+    Args:
+        info (dict): Image info and annotations.
+        patch_settings (list): List of patch settings,
+            each in format (patch_size, patch_overlap).
+        min_img_ratio (float): Threshold of window area divided by image area.
+        iof_thr (float): Threshold of overlaps between bbox and window.
+        padding (bool): If True, with padding.
+        padding_value (tuple[int|float]): Padding value.
+        save_dir (str): Save filename.
+        anno_dir (str): Annotation filename.
+        img_ext (str): Picture suffix.
+        lock (Lock): Lock of Manager.
+        prog (object): Progress of Manager.
+        total (int): Length of infos.
+
+    Returns:
+        list[dict]: Information of paths.
+    """
+    img_ext = img_ext if img_ext is not None else info['filename'].split(
+        '.')[-1]
+    windows = get_sliding_window(info, patch_settings, min_img_ratio)
+    window_anns = get_window_annotation(info, windows, iof_thr)
+    patch_infos = crop_and_save_img(info, windows, window_anns, padding,
+                                    padding_value, save_dir, anno_dir, img_ext)
+    assert patch_infos
+
+    lock.acquire()
+    prog.value += 1
+    msg = f'({prog.value / total:3.1%} {prog.value}:{total})'
+    msg += ' - ' + f"Filename: {info['filename']}"
+    msg += ' - ' + f"width: {info['width']:<5d}"
+    msg += ' - ' + f"height: {info['height']:<5d}"
+    msg += ' - ' + f"Objects: {len(info['annotations']['bboxes']):<5d}"
+    msg += ' - ' + f'Patches: {len(patch_infos)}'
+    print_log(msg, 'current')
+    lock.release()
+
+    return patch_infos
+
+
+def main():
+    args, split_cfg = parse_args()
+
+    mkdir_or_exist(args.out_dir)
+
+    # init logger
+    log_file_name = datetime.datetime.now().strftime('%Y%m%d_%H%M%S') + '.log'
+    logger: MMLogger = MMLogger.get_instance(
+        'mmyolo',
+        log_file=osp.join(args.out_dir, log_file_name),
+        log_level='INFO')
+
+    # print configs
+    arg_str = ''
+    for arg in args._get_kwargs():
+        arg_str += arg[0] + ' = ' + str(arg[1]) + '\n'
+
+    logger.info('Base Settings:\n' + arg_str)
+    logger.info('Split Settings:\n' + split_cfg.pretty_text)
+
+    # make dirs
+    _make_dirs(args.out_dir, args.phase, args.overwrite)
+
+    # Load original dota data
+    required_sets = []
+    for p in args.phase:
+        required_sets.extend(PHASE_REQUIRE_SETS[p])
+    required_sets = set(required_sets)
+
+    loaded_data_set = dict()
+    for req_set in required_sets:
+        logger.info(f'Starting loading DOTA {req_set} set information.')
+        start_time = time.time()
+
+        infos = load_original_annotations(
+            data_root=args.data_root,
+            ann_subdir=args.ann_subdir,
+            phase=req_set)
+
+        end_time = time.time()
+        result_log = f'Finishing loading {req_set} set, '
+        result_log += f'get {len(infos)} images, '
+        result_log += f'using {end_time - start_time:.3f}s.'
+        logger.info(result_log)
+
+        loaded_data_set[req_set] = infos
+
+    # Preprocess patch settings
+    patch_settings = []
+    for ratio in split_cfg.img_resize_ratio:
+        for size, gap in zip(split_cfg.patch_sizes,
+                             split_cfg.patch_overlap_sizes):
+            size_gap = (int(size / ratio), int(gap / ratio))
+            if size_gap not in patch_settings:
+                patch_settings.append(size_gap)
+
+    # Split data
+    for p in args.phase:
+        save_imgs_dir = osp.join(args.out_dir, p, 'images')
+        save_anns_dir = osp.join(args.out_dir, p, 'annfiles')
+
+        logger.info(f'Start splitting {p} set images!')
+        start = time.time()
+        manager = Manager()
+
+        data_infos = []
+        for req_set in PHASE_REQUIRE_SETS[p]:
+            data_infos.extend(loaded_data_set[req_set])
+
+        worker = partial(
+            single_split,
+            patch_settings=patch_settings,
+            min_img_ratio=split_cfg.min_img_ratio,
+            iof_thr=split_cfg.iof_thr,
+            padding=split_cfg.padding,
+            padding_value=split_cfg.padding_value,
+            save_dir=save_imgs_dir,
+            anno_dir=save_anns_dir,
+            img_ext=args.save_ext,
+            lock=manager.Lock(),
+            prog=manager.Value('i', 0),
+            total=len(data_infos))
+
+        if args.nproc > 1:
+            pool = Pool(args.nproc)
+            patch_infos = pool.map(worker, data_infos)
+            pool.close()
+        else:
+            patch_infos = list(map(worker, data_infos))
+
+        patch_infos = reduce(lambda x, y: x + y, patch_infos)
+        stop = time.time()
+        logger.info(
+            f'Finish splitting {p} set images in {int(stop - start)} second!!!'
+        )
+        logger.info(f'Total images number: {len(patch_infos)}')
+
+
+if __name__ == '__main__':
+    main()
diff --git a/mmdetection_practice/third_party/mmyolo/tools/dataset_converters/dota/split_config/multi_scale.json b/mmdetection_practice/third_party/mmyolo/tools/dataset_converters/dota/split_config/multi_scale.json
new file mode 100644
index 0000000..8cbdc93
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tools/dataset_converters/dota/split_config/multi_scale.json
@@ -0,0 +1,19 @@
+{
+    "patch_sizes": [
+      1024
+    ],
+    "patch_overlap_sizes": [
+      500
+    ],
+    "img_resize_ratio": [
+      0.5, 1.0, 1.5
+    ],
+    "min_img_ratio": 0.6,
+    "iof_thr": 0.7,
+    "padding": true,
+    "padding_value": [
+      104,
+      116,
+      124
+    ]
+}
diff --git a/mmdetection_practice/third_party/mmyolo/tools/dataset_converters/dota/split_config/single_scale.json b/mmdetection_practice/third_party/mmyolo/tools/dataset_converters/dota/split_config/single_scale.json
new file mode 100644
index 0000000..8c65c40
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tools/dataset_converters/dota/split_config/single_scale.json
@@ -0,0 +1,19 @@
+{
+    "patch_sizes": [
+      1024
+    ],
+    "patch_overlap_sizes": [
+      200
+    ],
+    "img_resize_ratio": [
+      1.0
+    ],
+    "min_img_ratio": 0.6,
+    "iof_thr": 0.7,
+    "padding": true,
+    "padding_value": [
+      104,
+      116,
+      124
+    ]
+}
diff --git a/mmdetection_practice/third_party/mmyolo/tools/dataset_converters/labelme2coco.py b/mmdetection_practice/third_party/mmyolo/tools/dataset_converters/labelme2coco.py
new file mode 100644
index 0000000..e68b935
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tools/dataset_converters/labelme2coco.py
@@ -0,0 +1,325 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+"""This script helps to convert labelme-style dataset to the coco format.
+
+Usage:
+    $ python labelme2coco.py \
+                --img-dir /path/to/images \
+                --labels-dir /path/to/labels \
+                --out /path/to/coco_instances.json \
+                [--class-id-txt /path/to/class_with_id.txt]
+
+Note:
+    Labels dir file structure:
+    .
+    └── PATH_TO_LABELS
+         ├── image1.json
+         ├── image2.json
+         └── ...
+
+    Images dir file structure:
+    .
+    └── PATH_TO_IMAGES
+         ├── image1.jpg
+         ├── image2.png
+         └── ...
+
+    If user set `--class-id-txt` then will use it in `categories` field,
+    if not set, then will generate auto base on the all labelme label
+    files to `class_with_id.json`.
+
+    class_with_id.txt example, each line is "id class_name":
+    ```text
+    1 cat
+    2 dog
+    3 bicycle
+    4 motorcycle
+
+    ```
+"""
+import argparse
+import json
+from pathlib import Path
+from typing import Optional
+
+import numpy as np
+from mmengine import track_iter_progress
+
+from mmyolo.utils.misc import IMG_EXTENSIONS
+
+
+def parse_args():
+    parser = argparse.ArgumentParser()
+    parser.add_argument('--img-dir', type=str, help='Dataset image directory')
+    parser.add_argument(
+        '--labels-dir', type=str, help='Dataset labels directory')
+    parser.add_argument('--out', type=str, help='COCO label json output path')
+    parser.add_argument(
+        '--class-id-txt', default=None, type=str, help='All class id txt path')
+    args = parser.parse_args()
+    return args
+
+
+def format_coco_annotations(points: list, image_id: int, annotations_id: int,
+                            category_id: int) -> dict:
+    """Gen COCO annotations format label from labelme format label.
+
+    Args:
+        points (list): Coordinates of four vertices of rectangle bbox.
+        image_id (int): Image id.
+        annotations_id (int): Annotations id.
+        category_id (int): Image dir path.
+
+    Return:
+        annotation_info (dict): COCO annotation data.
+    """
+    annotation_info = dict()
+    annotation_info['iscrowd'] = 0
+    annotation_info['category_id'] = category_id
+    annotation_info['id'] = annotations_id
+    annotation_info['image_id'] = image_id
+
+    # bbox is [x1, y1, w, h]
+    annotation_info['bbox'] = [
+        points[0][0], points[0][1], points[1][0] - points[0][0],
+        points[1][1] - points[0][1]
+    ]
+
+    annotation_info['area'] = annotation_info['bbox'][2] * annotation_info[
+        'bbox'][3]  # bbox w * h
+    segmentation_points = np.asarray(points).copy()
+    segmentation_points[1, :] = np.asarray(points)[2, :]
+    segmentation_points[2, :] = np.asarray(points)[1, :]
+    annotation_info['segmentation'] = [list(segmentation_points.flatten())]
+
+    return annotation_info
+
+
+def parse_labelme_to_coco(
+        image_dir: str,
+        labels_root: str,
+        all_classes_id: Optional[dict] = None) -> (dict, dict):
+    """Gen COCO json format label from labelme format label.
+
+    Args:
+        image_dir (str): Image dir path.
+        labels_root (str): Image label root path.
+        all_classes_id (Optional[dict]): All class with id. Default None.
+
+    Return:
+        coco_json (dict): COCO json data.
+        category_to_id (dict): category id and name.
+
+    COCO json example:
+
+    {
+        "images": [
+            {
+                "height": 3000,
+                "width": 4000,
+                "id": 1,
+                "file_name": "IMG_20210627_225110.jpg"
+            },
+            ...
+        ],
+        "categories": [
+            {
+                "id": 1,
+                "name": "cat"
+            },
+            ...
+        ],
+        "annotations": [
+            {
+                "iscrowd": 0,
+                "category_id": 1,
+                "id": 1,
+                "image_id": 1,
+                "bbox": [
+                    1183.7313232421875,
+                    1230.0509033203125,
+                    1270.9998779296875,
+                    927.0848388671875
+                ],
+                "area": 1178324.7170306593,
+                "segmentation": [
+                    [
+                        1183.7313232421875,
+                        1230.0509033203125,
+                        1183.7313232421875,
+                        2157.1357421875,
+                        2454.731201171875,
+                        2157.1357421875,
+                        2454.731201171875,
+                        1230.0509033203125
+                    ]
+                ]
+            },
+            ...
+        ]
+    }
+    """
+
+    # init coco json field
+    coco_json = {'images': [], 'categories': [], 'annotations': []}
+
+    image_id = 0
+    annotations_id = 0
+    if all_classes_id is None:
+        category_to_id = dict()
+        categories_labels = []
+    else:
+        category_to_id = all_classes_id
+        categories_labels = list(all_classes_id.keys())
+
+        # add class_ids and class_names to the categories list in coco_json
+        for class_name, class_id in category_to_id.items():
+            coco_json['categories'].append({
+                'id': class_id,
+                'name': class_name
+            })
+
+    # filter incorrect image file
+    img_file_list = [
+        img_file for img_file in Path(image_dir).iterdir()
+        if img_file.suffix.lower() in IMG_EXTENSIONS
+    ]
+
+    for img_file in track_iter_progress(img_file_list):
+
+        # get label file according to the image file name
+        label_path = Path(labels_root).joinpath(
+            img_file.stem).with_suffix('.json')
+        if not label_path.exists():
+            print(f'Can not find label file: {label_path}, skip...')
+            continue
+
+        # load labelme label
+        with open(label_path, encoding='utf-8') as f:
+            labelme_data = json.load(f)
+
+        image_id = image_id + 1  # coco id begin from 1
+
+        # update coco 'images' field
+        coco_json['images'].append({
+            'height':
+            labelme_data['imageHeight'],
+            'width':
+            labelme_data['imageWidth'],
+            'id':
+            image_id,
+            'file_name':
+            Path(labelme_data['imagePath']).name
+        })
+
+        for label_shapes in labelme_data['shapes']:
+
+            # Update coco 'categories' field
+            class_name = label_shapes['label']
+
+            if (all_classes_id is None) and (class_name
+                                             not in categories_labels):
+                # only update when not been added before
+                coco_json['categories'].append({
+                    'id':
+                    len(categories_labels) + 1,  # categories id start with 1
+                    'name': class_name
+                })
+                categories_labels.append(class_name)
+                category_to_id[class_name] = len(categories_labels)
+
+            elif (all_classes_id is not None) and (class_name
+                                                   not in categories_labels):
+                # check class name
+                raise ValueError(f'Got unexpected class name {class_name}, '
+                                 'which is not in your `--class-id-txt`.')
+
+            # get shape type and convert it to coco format
+            shape_type = label_shapes['shape_type']
+            if shape_type != 'rectangle':
+                print(f'not support `{shape_type}` yet, skip...')
+                continue
+
+            annotations_id = annotations_id + 1
+            # convert point from [xmin, ymin, xmax, ymax] to [x1, y1, w, h]
+            (x1, y1), (x2, y2) = label_shapes['points']
+            x1, x2 = sorted([x1, x2])  # xmin, xmax
+            y1, y2 = sorted([y1, y2])  # ymin, ymax
+            points = [[x1, y1], [x2, y2], [x1, y2], [x2, y1]]
+            coco_annotations = format_coco_annotations(
+                points, image_id, annotations_id, category_to_id[class_name])
+            coco_json['annotations'].append(coco_annotations)
+
+    print(f'Total image = {image_id}')
+    print(f'Total annotations = {annotations_id}')
+    print(f'Number of categories = {len(categories_labels)}, '
+          f'which is {categories_labels}')
+
+    return coco_json, category_to_id
+
+
+def convert_labelme_to_coco(image_dir: str,
+                            labels_dir: str,
+                            out_path: str,
+                            class_id_txt: Optional[str] = None):
+    """Convert labelme format label to COCO json format label.
+
+    Args:
+        image_dir (str): Image dir path.
+        labels_dir (str): Image label path.
+        out_path (str): COCO json file save path.
+        class_id_txt (Optional[str]): All class id txt file path.
+            Default None.
+    """
+    assert Path(out_path).suffix == '.json'
+
+    if class_id_txt is not None:
+        assert Path(class_id_txt).suffix == '.txt'
+
+        all_classes_id = dict()
+        with open(class_id_txt, encoding='utf-8') as f:
+            txt_lines = f.read().splitlines()
+        assert len(txt_lines) > 0
+
+        for txt_line in txt_lines:
+            class_info = txt_line.split(' ')
+            if len(class_info) != 2:
+                raise ValueError('Error parse "class_id_txt" file '
+                                 f'{class_id_txt},  please check if some of '
+                                 'the class names is blank, like "1  " -> '
+                                 '"1 blank", or class name has space between'
+                                 ' words, like "1 Big house" -> "1 '
+                                 'Big-house".')
+            v, k = class_info
+            all_classes_id.update({k: int(v)})
+    else:
+        all_classes_id = None
+
+    # convert to coco json
+    coco_json_data, category_to_id = parse_labelme_to_coco(
+        image_dir, labels_dir, all_classes_id)
+
+    # save json result
+    Path(out_path).parent.mkdir(exist_ok=True, parents=True)
+    print(f'Saving json to {out_path}')
+    json.dump(coco_json_data, open(out_path, 'w'), indent=2)
+
+    if class_id_txt is None:
+        category_to_id_path = Path(out_path).with_name('class_with_id.txt')
+        print(f'Saving class id txt to {category_to_id_path}')
+        with open(category_to_id_path, 'w', encoding='utf-8') as f:
+            for k, v in category_to_id.items():
+                f.write(f'{v} {k}\n')
+    else:
+        print('Not Saving new class id txt, user should using '
+              f'{class_id_txt} for training config')
+
+
+def main():
+    args = parse_args()
+    convert_labelme_to_coco(args.img_dir, args.labels_dir, args.out,
+                            args.class_id_txt)
+    print('All done!')
+
+
+if __name__ == '__main__':
+    main()
diff --git a/mmdetection_practice/third_party/mmyolo/tools/dataset_converters/yolo2coco.py b/mmdetection_practice/third_party/mmyolo/tools/dataset_converters/yolo2coco.py
new file mode 100644
index 0000000..19f1366
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tools/dataset_converters/yolo2coco.py
@@ -0,0 +1,264 @@
+"""This script helps to convert yolo-style dataset to the coco format.
+
+Usage:
+    $ python yolo2coco.py /path/to/dataset # image_dir
+
+Note:
+    1. Before running this script, please make sure the root directory
+    of your dataset is formatted in the following struction:
+    .
+    └── $ROOT_PATH
+        ├── classes.txt
+        ├── labels
+        │    ├── a.txt
+        │    ├── b.txt
+        │    └── ...
+        ├── images
+        │    ├── a.jpg
+        │    ├── b.png
+        │    └── ...
+        └── ...
+    2. The script will automatically check whether the corresponding
+    `train.txt`, ` val.txt`, and `test.txt` exist under your `image_dir`
+    or not. If these files are detected, the script will organize the
+    dataset. The image paths in these files must be ABSOLUTE paths.
+    3. Once the script finishes, the result files will be saved in the
+    directory named 'annotations' in the root directory of your dataset.
+    The default output file is result.json. The root directory folder may
+    look like this in the root directory after the converting:
+    .
+    └── $ROOT_PATH
+        ├── annotations
+        │    ├── result.json
+        │    └── ...
+        ├── classes.txt
+        ├── labels
+        │    ├── a.txt
+        │    ├── b.txt
+        │    └── ...
+        ├── images
+        │    ├── a.jpg
+        │    ├── b.png
+        │    └── ...
+        └── ...
+    4. After converting to coco, you can use the
+    `tools/analysis_tools/browse_coco_json.py` script to visualize
+    whether it is correct.
+"""
+import argparse
+import os
+import os.path as osp
+
+import mmcv
+import mmengine
+
+IMG_EXTENSIONS = ('.jpg', '.png', '.jpeg')
+
+
+def check_existence(file_path: str):
+    """Check if target file is existed."""
+    if not osp.exists(file_path):
+        raise FileNotFoundError(f'{file_path} does not exist!')
+
+
+def get_image_info(yolo_image_dir, idx, file_name):
+    """Retrieve image information."""
+    img_path = osp.join(yolo_image_dir, file_name)
+    check_existence(img_path)
+
+    img = mmcv.imread(img_path)
+    height, width = img.shape[:2]
+    img_info_dict = {
+        'file_name': file_name,
+        'id': idx,
+        'width': width,
+        'height': height
+    }
+    return img_info_dict, height, width
+
+
+def convert_bbox_info(label, idx, obj_count, image_height, image_width):
+    """Convert yolo-style bbox info to the coco format."""
+    label = label.strip().split()
+    x = float(label[1])
+    y = float(label[2])
+    w = float(label[3])
+    h = float(label[4])
+
+    # convert x,y,w,h to x1,y1,x2,y2
+    x1 = (x - w / 2) * image_width
+    y1 = (y - h / 2) * image_height
+    x2 = (x + w / 2) * image_width
+    y2 = (y + h / 2) * image_height
+
+    cls_id = int(label[0])
+    width = max(0., x2 - x1)
+    height = max(0., y2 - y1)
+    coco_format_info = {
+        'image_id': idx,
+        'id': obj_count,
+        'category_id': cls_id,
+        'bbox': [x1, y1, width, height],
+        'area': width * height,
+        'segmentation': [[x1, y1, x2, y1, x2, y2, x1, y2]],
+        'iscrowd': 0
+    }
+    obj_count += 1
+    return coco_format_info, obj_count
+
+
+def organize_by_existing_files(image_dir: str, existed_categories: list):
+    """Format annotations by existing train/val/test files."""
+    categories = ['train', 'val', 'test']
+    image_list = []
+
+    for cat in categories:
+        if cat in existed_categories:
+            txt_file = osp.join(image_dir, f'{cat}.txt')
+            print(f'Start to read {cat} dataset definition')
+            assert osp.exists(txt_file)
+
+            with open(txt_file) as f:
+                img_paths = f.readlines()
+                img_paths = [
+                    os.path.split(img_path.strip())[1]
+                    for img_path in img_paths
+                ]  # split the absolute path
+                image_list.append(img_paths)
+        else:
+            image_list.append([])
+    return image_list[0], image_list[1], image_list[2]
+
+
+def convert_yolo_to_coco(image_dir: str):
+    """Convert annotations from yolo style to coco style.
+
+    Args:
+        image_dir (str): the root directory of your datasets which contains
+            labels, images, classes.txt, etc
+    """
+    print(f'Start to load existing images and annotations from {image_dir}')
+    check_existence(image_dir)
+
+    # check local environment
+    yolo_label_dir = osp.join(image_dir, 'labels')
+    yolo_image_dir = osp.join(image_dir, 'images')
+    yolo_class_txt = osp.join(image_dir, 'classes.txt')
+    check_existence(yolo_label_dir)
+    check_existence(yolo_image_dir)
+    check_existence(yolo_class_txt)
+    print(f'All necessary files are located at {image_dir}')
+
+    train_txt_path = osp.join(image_dir, 'train.txt')
+    val_txt_path = osp.join(image_dir, 'val.txt')
+    test_txt_path = osp.join(image_dir, 'test.txt')
+    existed_categories = []
+    print(f'Checking if train.txt, val.txt, and test.txt are in {image_dir}')
+    if osp.exists(train_txt_path):
+        print('Found train.txt')
+        existed_categories.append('train')
+    if osp.exists(val_txt_path):
+        print('Found val.txt')
+        existed_categories.append('val')
+    if osp.exists(test_txt_path):
+        print('Found test.txt')
+        existed_categories.append('test')
+
+    # prepare the output folders
+    output_folder = osp.join(image_dir, 'annotations')
+    if not osp.exists(output_folder):
+        os.makedirs(output_folder)
+        check_existence(output_folder)
+
+    # start the convert procedure
+    with open(yolo_class_txt) as f:
+        classes = f.read().strip().split()
+
+    indices = os.listdir(yolo_image_dir)
+    total = len(indices)
+
+    dataset = {'images': [], 'annotations': [], 'categories': []}
+    if existed_categories == []:
+        print('These files are not located, no need to organize separately.')
+        for i, cls in enumerate(classes, 0):
+            dataset['categories'].append({'id': i, 'name': cls})
+    else:
+        print('Need to organize the data accordingly.')
+        train_dataset = {'images': [], 'annotations': [], 'categories': []}
+        val_dataset = {'images': [], 'annotations': [], 'categories': []}
+        test_dataset = {'images': [], 'annotations': [], 'categories': []}
+
+        # category id starts from 0
+        for i, cls in enumerate(classes, 0):
+            train_dataset['categories'].append({'id': i, 'name': cls})
+            val_dataset['categories'].append({'id': i, 'name': cls})
+            test_dataset['categories'].append({'id': i, 'name': cls})
+        train_img, val_img, test_img = organize_by_existing_files(
+            image_dir, existed_categories)
+
+    obj_count = 0
+    skipped = 0
+    converted = 0
+    for idx, image in enumerate(mmengine.track_iter_progress(indices)):
+        img_info_dict, image_height, image_width = get_image_info(
+            yolo_image_dir, idx, image)
+
+        if existed_categories != []:
+            if image in train_img:
+                dataset = train_dataset
+            elif image in val_img:
+                dataset = val_dataset
+            elif image in test_img:
+                dataset = test_dataset
+
+        dataset['images'].append(img_info_dict)
+
+        img_name = osp.splitext(image)[0]
+        label_path = f'{osp.join(yolo_label_dir, img_name)}.txt'
+        if not osp.exists(label_path):
+            # if current image is not annotated or the annotation file failed
+            print(
+                f'WARNING: {label_path} does not exist. Please check the file.'
+            )
+            skipped += 1
+            continue
+
+        with open(label_path) as f:
+            labels = f.readlines()
+            for label in labels:
+                coco_info, obj_count = convert_bbox_info(
+                    label, idx, obj_count, image_height, image_width)
+                dataset['annotations'].append(coco_info)
+        converted += 1
+
+    # saving results to result json
+    if existed_categories == []:
+        out_file = osp.join(image_dir, 'annotations/result.json')
+        print(f'Saving converted results to {out_file} ...')
+        mmengine.dump(dataset, out_file)
+    else:
+        for category in existed_categories:
+            out_file = osp.join(output_folder, f'{category}.json')
+            print(f'Saving converted results to {out_file} ...')
+            if category == 'train':
+                mmengine.dump(train_dataset, out_file)
+            elif category == 'val':
+                mmengine.dump(val_dataset, out_file)
+            elif category == 'test':
+                mmengine.dump(test_dataset, out_file)
+
+    # simple statistics
+    print(f'Process finished! Please check at {output_folder} .')
+    print(f'Number of images found: {total}, converted: {converted},',
+          f'and skipped: {skipped}. Total annotation count: {obj_count}.')
+    print('You can use tools/analysis_tools/browse_coco_json.py to visualize!')
+
+
+if __name__ == '__main__':
+    parser = argparse.ArgumentParser()
+    parser.add_argument(
+        'image_dir',
+        type=str,
+        help='dataset directory with ./images and ./labels, classes.txt, etc.')
+    arg = parser.parse_args()
+    convert_yolo_to_coco(arg.image_dir)
diff --git a/mmdetection_practice/third_party/mmyolo/tools/dist_test.sh b/mmdetection_practice/third_party/mmyolo/tools/dist_test.sh
new file mode 100755
index 0000000..dea131b
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tools/dist_test.sh
@@ -0,0 +1,22 @@
+#!/usr/bin/env bash
+
+CONFIG=$1
+CHECKPOINT=$2
+GPUS=$3
+NNODES=${NNODES:-1}
+NODE_RANK=${NODE_RANK:-0}
+PORT=${PORT:-29500}
+MASTER_ADDR=${MASTER_ADDR:-"127.0.0.1"}
+
+PYTHONPATH="$(dirname $0)/..":$PYTHONPATH \
+python -m torch.distributed.launch \
+    --nnodes=$NNODES \
+    --node_rank=$NODE_RANK \
+    --master_addr=$MASTER_ADDR \
+    --nproc_per_node=$GPUS \
+    --master_port=$PORT \
+    $(dirname "$0")/test.py \
+    $CONFIG \
+    $CHECKPOINT \
+    --launcher pytorch \
+    ${@:4}
diff --git a/mmdetection_practice/third_party/mmyolo/tools/dist_train.sh b/mmdetection_practice/third_party/mmyolo/tools/dist_train.sh
new file mode 100755
index 0000000..3fca764
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tools/dist_train.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+
+CONFIG=$1
+GPUS=$2
+NNODES=${NNODES:-1}
+NODE_RANK=${NODE_RANK:-0}
+PORT=${PORT:-29500}
+MASTER_ADDR=${MASTER_ADDR:-"127.0.0.1"}
+
+PYTHONPATH="$(dirname $0)/..":$PYTHONPATH \
+python -m torch.distributed.launch \
+    --nnodes=$NNODES \
+    --node_rank=$NODE_RANK \
+    --master_addr=$MASTER_ADDR \
+    --nproc_per_node=$GPUS \
+    --master_port=$PORT \
+    $(dirname "$0")/train.py \
+    $CONFIG \
+    --launcher pytorch ${@:3}
diff --git a/mmdetection_practice/third_party/mmyolo/tools/misc/coco_split.py b/mmdetection_practice/third_party/mmyolo/tools/misc/coco_split.py
new file mode 100644
index 0000000..8ce7034
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tools/misc/coco_split.py
@@ -0,0 +1,122 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+import argparse
+import json
+import random
+from pathlib import Path
+
+import numpy as np
+from pycocotools.coco import COCO
+
+
+def parse_args():
+    parser = argparse.ArgumentParser()
+    parser.add_argument(
+        '--json', type=str, required=True, help='COCO json label path')
+    parser.add_argument(
+        '--out-dir', type=str, required=True, help='output path')
+    parser.add_argument(
+        '--ratios',
+        nargs='+',
+        type=float,
+        help='ratio for sub dataset, if set 2 number then will generate '
+        'trainval + test (eg. "0.8 0.1 0.1" or "2 1 1"), if set 3 number '
+        'then will generate train + val + test (eg. "0.85 0.15" or "2 1")')
+    parser.add_argument(
+        '--shuffle',
+        action='store_true',
+        help='Whether to display in disorder')
+    parser.add_argument('--seed', default=-1, type=int, help='seed')
+    args = parser.parse_args()
+    return args
+
+
+def split_coco_dataset(coco_json_path: str, save_dir: str, ratios: list,
+                       shuffle: bool, seed: int):
+    if not Path(coco_json_path).exists():
+        raise FileNotFoundError(f'Can not not found {coco_json_path}')
+
+    if not Path(save_dir).exists():
+        Path(save_dir).mkdir(parents=True)
+
+    # ratio normalize
+    ratios = np.array(ratios) / np.array(ratios).sum()
+
+    if len(ratios) == 2:
+        ratio_train, ratio_test = ratios
+        ratio_val = 0
+        train_type = 'trainval'
+    elif len(ratios) == 3:
+        ratio_train, ratio_val, ratio_test = ratios
+        train_type = 'train'
+    else:
+        raise ValueError('ratios must set 2 or 3 group!')
+
+    # Read coco info
+    coco = COCO(coco_json_path)
+    coco_image_ids = coco.getImgIds()
+
+    # gen image number of each dataset
+    val_image_num = int(len(coco_image_ids) * ratio_val)
+    test_image_num = int(len(coco_image_ids) * ratio_test)
+    train_image_num = len(coco_image_ids) - val_image_num - test_image_num
+    print('Split info: ====== \n'
+          f'Train ratio = {ratio_train}, number = {train_image_num}\n'
+          f'Val ratio = {ratio_val}, number = {val_image_num}\n'
+          f'Test ratio = {ratio_test}, number = {test_image_num}')
+
+    seed = int(seed)
+    if seed != -1:
+        print(f'Set the global seed: {seed}')
+        np.random.seed(seed)
+
+    if shuffle:
+        print('shuffle dataset.')
+        random.shuffle(coco_image_ids)
+
+    # split each dataset
+    train_image_ids = coco_image_ids[:train_image_num]
+    if val_image_num != 0:
+        val_image_ids = coco_image_ids[train_image_num:train_image_num +
+                                       val_image_num]
+    else:
+        val_image_ids = None
+    test_image_ids = coco_image_ids[train_image_num + val_image_num:]
+
+    # Save new json
+    categories = coco.loadCats(coco.getCatIds())
+    for img_id_list in [train_image_ids, val_image_ids, test_image_ids]:
+        if img_id_list is None:
+            continue
+
+        # Gen new json
+        img_dict = {
+            'images': coco.loadImgs(ids=img_id_list),
+            'categories': categories,
+            'annotations': coco.loadAnns(coco.getAnnIds(imgIds=img_id_list))
+        }
+
+        # save json
+        if img_id_list == train_image_ids:
+            json_file_path = Path(save_dir, f'{train_type}.json')
+        elif img_id_list == val_image_ids:
+            json_file_path = Path(save_dir, 'val.json')
+        elif img_id_list == test_image_ids:
+            json_file_path = Path(save_dir, 'test.json')
+        else:
+            raise ValueError('img_id_list ERROR!')
+
+        print(f'Saving json to {json_file_path}')
+        with open(json_file_path, 'w') as f_json:
+            json.dump(img_dict, f_json, ensure_ascii=False, indent=2)
+
+    print('All done!')
+
+
+def main():
+    args = parse_args()
+    split_coco_dataset(args.json, args.out_dir, args.ratios, args.shuffle,
+                       args.seed)
+
+
+if __name__ == '__main__':
+    main()
diff --git a/mmdetection_practice/third_party/mmyolo/tools/misc/download_dataset.py b/mmdetection_practice/third_party/mmyolo/tools/misc/download_dataset.py
new file mode 100644
index 0000000..7d1c64d
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tools/misc/download_dataset.py
@@ -0,0 +1,112 @@
+import argparse
+from itertools import repeat
+from multiprocessing.pool import ThreadPool
+from pathlib import Path
+from tarfile import TarFile
+from zipfile import ZipFile
+
+import torch
+
+
+def parse_args():
+    parser = argparse.ArgumentParser(
+        description='Download datasets for training')
+    parser.add_argument(
+        '--dataset-name', type=str, help='dataset name', default='coco2017')
+    parser.add_argument(
+        '--save-dir',
+        type=str,
+        help='the dir to save dataset',
+        default='data/coco')
+    parser.add_argument(
+        '--unzip',
+        action='store_true',
+        help='whether unzip dataset or not, zipped files will be saved')
+    parser.add_argument(
+        '--delete',
+        action='store_true',
+        help='delete the download zipped files')
+    parser.add_argument(
+        '--threads', type=int, help='number of threading', default=4)
+    args = parser.parse_args()
+    return args
+
+
+def download(url, dir, unzip=True, delete=False, threads=1):
+
+    def download_one(url, dir):
+        f = dir / Path(url).name
+        if Path(url).is_file():
+            Path(url).rename(f)
+        elif not f.exists():
+            print(f'Downloading {url} to {f}')
+            torch.hub.download_url_to_file(url, f, progress=True)
+        if unzip and f.suffix in ('.zip', '.tar'):
+            print(f'Unzipping {f.name}')
+            if f.suffix == '.zip':
+                ZipFile(f).extractall(path=dir)
+            elif f.suffix == '.tar':
+                TarFile(f).extractall(path=dir)
+            if delete:
+                f.unlink()
+                print(f'Delete {f}')
+
+    dir = Path(dir)
+    if threads > 1:
+        pool = ThreadPool(threads)
+        pool.imap(lambda x: download_one(*x), zip(url, repeat(dir)))
+        pool.close()
+        pool.join()
+    else:
+        for u in [url] if isinstance(url, (str, Path)) else url:
+            download_one(u, dir)
+
+
+def main():
+    args = parse_args()
+    path = Path(args.save_dir)
+    if not path.exists():
+        path.mkdir(parents=True, exist_ok=True)
+    data2url = dict(
+        # TODO: Support for downloading Panoptic Segmentation of COCO
+        coco2017=[
+            'http://images.cocodataset.org/zips/train2017.zip',
+            'http://images.cocodataset.org/zips/val2017.zip',
+            'http://images.cocodataset.org/zips/test2017.zip',
+            'http://images.cocodataset.org/annotations/' +
+            'annotations_trainval2017.zip'
+        ],
+        lvis=[
+            'https://s3-us-west-2.amazonaws.com/dl.fbaipublicfiles.com/LVIS/lvis_v1_train.json.zip',  # noqa
+            'https://s3-us-west-2.amazonaws.com/dl.fbaipublicfiles.com/LVIS/lvis_v1_train.json.zip',  # noqa
+        ],
+        voc2007=[
+            'http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-2007.tar',  # noqa
+            'http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtest_06-Nov-2007.tar',  # noqa
+            'http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCdevkit_08-Jun-2007.tar',  # noqa
+        ],
+        voc2012=[
+            'http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-2012.tar',  # noqa
+        ],
+        balloon=[
+            # src link: https://github.com/matterport/Mask_RCNN/releases/download/v2.1/balloon_dataset.zip # noqa
+            'https://download.openmmlab.com/mmyolo/data/balloon_dataset.zip'
+        ],
+        cat=[
+            'https://download.openmmlab.com/mmyolo/data/cat_dataset.zip'  # noqa
+        ],
+    )
+    url = data2url.get(args.dataset_name, None)
+    if url is None:
+        print('Only support COCO, VOC, balloon, cat and LVIS now!')
+        return
+    download(
+        url,
+        dir=path,
+        unzip=args.unzip,
+        delete=args.delete,
+        threads=args.threads)
+
+
+if __name__ == '__main__':
+    main()
diff --git a/mmdetection_practice/third_party/mmyolo/tools/misc/extract_subcoco.py b/mmdetection_practice/third_party/mmyolo/tools/misc/extract_subcoco.py
new file mode 100644
index 0000000..31528e0
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tools/misc/extract_subcoco.py
@@ -0,0 +1,160 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+"""Extracting subsets from coco2017 dataset.
+
+This script is mainly used to debug and verify the correctness of the
+program quickly.
+The root folder format must be in the following format:
+
+├── root
+│   ├── annotations
+│   ├── train2017
+│   ├── val2017
+│   ├── test2017
+
+Currently, only support COCO2017. In the future will support user-defined
+datasets of standard coco JSON format.
+
+Example:
+   python tools/misc/extract_subcoco.py ${ROOT} ${OUT_DIR} --num-img ${NUM_IMG}
+"""
+
+import argparse
+import os.path as osp
+import shutil
+
+import mmengine
+import numpy as np
+from pycocotools.coco import COCO
+
+
+# TODO: Currently only supports coco2017
+def _process_data(args,
+                  in_dataset_type: str,
+                  out_dataset_type: str,
+                  year: str = '2017'):
+    assert in_dataset_type in ('train', 'val')
+    assert out_dataset_type in ('train', 'val')
+
+    int_ann_file_name = f'annotations/instances_{in_dataset_type}{year}.json'
+    out_ann_file_name = f'annotations/instances_{out_dataset_type}{year}.json'
+
+    ann_path = osp.join(args.root, int_ann_file_name)
+    json_data = mmengine.load(ann_path)
+
+    new_json_data = {
+        'info': json_data['info'],
+        'licenses': json_data['licenses'],
+        'categories': json_data['categories'],
+        'images': [],
+        'annotations': []
+    }
+
+    area_dict = {
+        'small': [0., 32 * 32],
+        'medium': [32 * 32, 96 * 96],
+        'large': [96 * 96, float('inf')]
+    }
+
+    coco = COCO(ann_path)
+
+    # filter annotations by category ids and area range
+    areaRng = area_dict[args.area_size] if args.area_size else []
+    catIds = coco.getCatIds(args.classes) if args.classes else []
+    ann_ids = coco.getAnnIds(catIds=catIds, areaRng=areaRng)
+    ann_info = coco.loadAnns(ann_ids)
+
+    # get image ids by anns set
+    filter_img_ids = {ann['image_id'] for ann in ann_info}
+    filter_img = coco.loadImgs(filter_img_ids)
+
+    # shuffle
+    np.random.shuffle(filter_img)
+
+    num_img = args.num_img if args.num_img > 0 else len(filter_img)
+    if num_img > len(filter_img):
+        print(
+            f'num_img is too big, will be set to {len(filter_img)}, '
+            'because of not enough image after filter by classes and area_size'
+        )
+        num_img = len(filter_img)
+
+    progress_bar = mmengine.ProgressBar(num_img)
+
+    for i in range(num_img):
+        file_name = filter_img[i]['file_name']
+        image_path = osp.join(args.root, in_dataset_type + year, file_name)
+
+        ann_ids = coco.getAnnIds(
+            imgIds=[filter_img[i]['id']], catIds=catIds, areaRng=areaRng)
+        img_ann_info = coco.loadAnns(ann_ids)
+
+        new_json_data['images'].append(filter_img[i])
+        new_json_data['annotations'].extend(img_ann_info)
+
+        shutil.copy(image_path, osp.join(args.out_dir,
+                                         out_dataset_type + year))
+
+        progress_bar.update()
+
+    mmengine.dump(new_json_data, osp.join(args.out_dir, out_ann_file_name))
+
+
+def _make_dirs(out_dir):
+    mmengine.mkdir_or_exist(out_dir)
+    mmengine.mkdir_or_exist(osp.join(out_dir, 'annotations'))
+    mmengine.mkdir_or_exist(osp.join(out_dir, 'train2017'))
+    mmengine.mkdir_or_exist(osp.join(out_dir, 'val2017'))
+
+
+def parse_args():
+    parser = argparse.ArgumentParser(description='Extract coco subset')
+    parser.add_argument('root', help='root path')
+    parser.add_argument(
+        'out_dir', type=str, help='directory where subset coco will be saved.')
+    parser.add_argument(
+        '--num-img',
+        default=50,
+        type=int,
+        help='num of extract image, -1 means all images')
+    parser.add_argument(
+        '--area-size',
+        choices=['small', 'medium', 'large'],
+        help='filter ground-truth info by area size')
+    parser.add_argument(
+        '--classes', nargs='+', help='filter ground-truth by class name')
+    parser.add_argument(
+        '--use-training-set',
+        action='store_true',
+        help='Whether to use the training set when extract the training set. '
+        'The training subset is extracted from the validation set by '
+        'default which can speed up.')
+    parser.add_argument('--seed', default=-1, type=int, help='seed')
+    args = parser.parse_args()
+    return args
+
+
+def main():
+    args = parse_args()
+    assert args.out_dir != args.root, \
+        'The file will be overwritten in place, ' \
+        'so the same folder is not allowed !'
+
+    seed = int(args.seed)
+    if seed != -1:
+        print(f'Set the global seed: {seed}')
+        np.random.seed(int(args.seed))
+
+    _make_dirs(args.out_dir)
+
+    print('====Start processing train dataset====')
+    if args.use_training_set:
+        _process_data(args, 'train', 'train')
+    else:
+        _process_data(args, 'val', 'train')
+    print('\n====Start processing val dataset====')
+    _process_data(args, 'val', 'val')
+    print(f'\n Result save to {args.out_dir}')
+
+
+if __name__ == '__main__':
+    main()
diff --git a/mmdetection_practice/third_party/mmyolo/tools/misc/print_config.py b/mmdetection_practice/third_party/mmyolo/tools/misc/print_config.py
new file mode 100644
index 0000000..2c2efe3
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tools/misc/print_config.py
@@ -0,0 +1,59 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+import argparse
+import os
+
+from mmdet.utils import replace_cfg_vals, update_data_root
+from mmengine import Config, DictAction
+
+
+def parse_args():
+    parser = argparse.ArgumentParser(description='Print the whole config')
+    parser.add_argument('config', help='config file path')
+    parser.add_argument(
+        '--save-path',
+        default=None,
+        help='save path of whole config, suffixed with .py, .json or .yml')
+    parser.add_argument(
+        '--cfg-options',
+        nargs='+',
+        action=DictAction,
+        help='override some settings in the used config, the key-value pair '
+        'in xxx=yyy format will be merged into config file. If the value to '
+        'be overwritten is a list, it should be like key="[a,b]" or key=a,b '
+        'It also allows nested list/tuple values, e.g. key="[(a,b),(c,d)]" '
+        'Note that the quotation marks are necessary and that no white space '
+        'is allowed.')
+    args = parser.parse_args()
+
+    return args
+
+
+def main():
+    args = parse_args()
+
+    cfg = Config.fromfile(args.config)
+
+    # replace the ${key} with the value of cfg.key
+    cfg = replace_cfg_vals(cfg)
+
+    # update data root according to MMDET_DATASETS
+    update_data_root(cfg)
+
+    if args.cfg_options is not None:
+        cfg.merge_from_dict(args.cfg_options)
+    print(f'Config:\n{cfg.pretty_text}')
+
+    if args.save_path is not None:
+        save_path = args.save_path
+
+        suffix = os.path.splitext(save_path)[-1]
+        assert suffix in ['.py', '.json', '.yml']
+
+        if not os.path.exists(os.path.split(save_path)[0]):
+            os.makedirs(os.path.split(save_path)[0])
+        cfg.dump(save_path)
+        print(f'Config saving at {save_path}')
+
+
+if __name__ == '__main__':
+    main()
diff --git a/mmdetection_practice/third_party/mmyolo/tools/misc/publish_model.py b/mmdetection_practice/third_party/mmyolo/tools/misc/publish_model.py
new file mode 100644
index 0000000..a2ccbf0
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tools/misc/publish_model.py
@@ -0,0 +1,57 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+import argparse
+import subprocess
+
+import torch
+
+
+def parse_args():
+    parser = argparse.ArgumentParser(
+        description='Process a checkpoint to be published')
+    parser.add_argument('in_file', help='input checkpoint filename')
+    parser.add_argument('out_file', help='output checkpoint filename')
+    args = parser.parse_args()
+    return args
+
+
+def process_checkpoint(in_file, out_file):
+    checkpoint = torch.load(in_file, map_location='cpu')
+
+    # remove optimizer for smaller file size
+    if 'optimizer' in checkpoint:
+        del checkpoint['optimizer']
+    if 'message_hub' in checkpoint:
+        del checkpoint['message_hub']
+    if 'ema_state_dict' in checkpoint:
+        del checkpoint['ema_state_dict']
+
+    for key in list(checkpoint['state_dict']):
+        if key.startswith('data_preprocessor'):
+            checkpoint['state_dict'].pop(key)
+        elif 'priors_base_sizes' in key:
+            checkpoint['state_dict'].pop(key)
+        elif 'grid_offset' in key:
+            checkpoint['state_dict'].pop(key)
+        elif 'prior_inds' in key:
+            checkpoint['state_dict'].pop(key)
+
+    if torch.__version__ >= '1.6':
+        torch.save(checkpoint, out_file, _use_new_zipfile_serialization=False)
+    else:
+        torch.save(checkpoint, out_file)
+    sha = subprocess.check_output(['sha256sum', out_file]).decode()
+    if out_file.endswith('.pth'):
+        out_file_name = out_file[:-4]
+    else:
+        out_file_name = out_file
+    final_file = out_file_name + f'-{sha[:8]}.pth'
+    subprocess.Popen(['mv', out_file, final_file])
+
+
+def main():
+    args = parse_args()
+    process_checkpoint(args.in_file, args.out_file)
+
+
+if __name__ == '__main__':
+    main()
diff --git a/mmdetection_practice/third_party/mmyolo/tools/model_converters/convert_kd_ckpt_to_student.py b/mmdetection_practice/third_party/mmyolo/tools/model_converters/convert_kd_ckpt_to_student.py
new file mode 100644
index 0000000..d2f787e
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tools/model_converters/convert_kd_ckpt_to_student.py
@@ -0,0 +1,54 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+import argparse
+import os.path as osp
+from pathlib import Path
+
+from mmengine.runner import CheckpointLoader, save_checkpoint
+from mmengine.utils import mkdir_or_exist
+
+
+def parse_args():
+    parser = argparse.ArgumentParser(
+        description='Convert KD checkpoint to student-only checkpoint')
+    parser.add_argument('checkpoint', help='input checkpoint filename')
+    parser.add_argument('--out-path', help='save checkpoint path')
+    parser.add_argument(
+        '--inplace', action='store_true', help='replace origin ckpt')
+    args = parser.parse_args()
+    return args
+
+
+def main():
+    args = parse_args()
+    checkpoint = CheckpointLoader.load_checkpoint(
+        args.checkpoint, map_location='cpu')
+    new_state_dict = dict()
+    new_meta = checkpoint['meta']
+
+    for key, value in checkpoint['state_dict'].items():
+        if key.startswith('architecture.'):
+            new_key = key.replace('architecture.', '')
+            new_state_dict[new_key] = value
+
+    checkpoint = dict()
+    checkpoint['meta'] = new_meta
+    checkpoint['state_dict'] = new_state_dict
+
+    if args.inplace:
+        assert osp.exists(args.checkpoint), \
+            'can not find the checkpoint path: {args.checkpoint}'
+        save_checkpoint(checkpoint, args.checkpoint)
+    else:
+        ckpt_path = Path(args.checkpoint)
+        ckpt_name = ckpt_path.stem
+        if args.out_path:
+            ckpt_dir = Path(args.out_path)
+        else:
+            ckpt_dir = ckpt_path.parent
+        mkdir_or_exist(ckpt_dir)
+        new_ckpt_path = osp.join(ckpt_dir, f'{ckpt_name}_student.pth')
+        save_checkpoint(checkpoint, new_ckpt_path)
+
+
+if __name__ == '__main__':
+    main()
diff --git a/mmdetection_practice/third_party/mmyolo/tools/model_converters/ppyoloe_to_mmyolo.py b/mmdetection_practice/third_party/mmyolo/tools/model_converters/ppyoloe_to_mmyolo.py
new file mode 100644
index 0000000..75c4af6
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tools/model_converters/ppyoloe_to_mmyolo.py
@@ -0,0 +1,184 @@
+import argparse
+import pickle
+from collections import OrderedDict
+
+import torch
+
+
+def convert_bn(k: str):
+    name = k.replace('._mean',
+                     '.running_mean').replace('._variance', '.running_var')
+    return name
+
+
+def convert_repvgg(k: str):
+    if '.conv2.conv1.' in k:
+        name = k.replace('.conv2.conv1.', '.conv2.rbr_dense.')
+        return name
+    elif '.conv2.conv2.' in k:
+        name = k.replace('.conv2.conv2.', '.conv2.rbr_1x1.')
+        return name
+    else:
+        return k
+
+
+def convert(src: str, dst: str, imagenet_pretrain: bool = False):
+    with open(src, 'rb') as f:
+        model = pickle.load(f)
+
+    new_state_dict = OrderedDict()
+    if imagenet_pretrain:
+        for k, v in model.items():
+            if '@@' in k:
+                continue
+            if 'stem.' in k:
+                # backbone.stem.conv1.conv.weight
+                # -> backbone.stem.0.conv.weight
+                org_ind = k.split('.')[1][-1]
+                new_ind = str(int(org_ind) - 1)
+                name = k.replace('stem.conv%s.' % org_ind,
+                                 'stem.%s.' % new_ind)
+            else:
+                # backbone.stages.1.conv2.bn._variance
+                # -> backbone.stage2.0.conv2.bn.running_var
+                org_stage_ind = k.split('.')[1]
+                new_stage_ind = str(int(org_stage_ind) + 1)
+                name = k.replace('stages.%s.' % org_stage_ind,
+                                 'stage%s.0.' % new_stage_ind)
+                name = convert_repvgg(name)
+                if '.attn.' in k:
+                    name = name.replace('.attn.fc.', '.attn.fc.conv.')
+            name = convert_bn(name)
+            name = 'backbone.' + name
+
+            new_state_dict[name] = torch.from_numpy(v)
+    else:
+        for k, v in model.items():
+            name = k
+            if k.startswith('backbone.'):
+                if '.stem.' in k:
+                    # backbone.stem.conv1.conv.weight
+                    # -> backbone.stem.0.conv.weight
+                    org_ind = k.split('.')[2][-1]
+                    new_ind = str(int(org_ind) - 1)
+                    name = k.replace('.stem.conv%s.' % org_ind,
+                                     '.stem.%s.' % new_ind)
+                else:
+                    # backbone.stages.1.conv2.bn._variance
+                    # -> backbone.stage2.0.conv2.bn.running_var
+                    org_stage_ind = k.split('.')[2]
+                    new_stage_ind = str(int(org_stage_ind) + 1)
+                    name = k.replace('.stages.%s.' % org_stage_ind,
+                                     '.stage%s.0.' % new_stage_ind)
+                    name = convert_repvgg(name)
+                    if '.attn.' in k:
+                        name = name.replace('.attn.fc.', '.attn.fc.conv.')
+                name = convert_bn(name)
+            elif k.startswith('neck.'):
+                # fpn_stages
+                if k.startswith('neck.fpn_stages.'):
+                    # neck.fpn_stages.0.0.conv1.conv.weight
+                    # -> neck.reduce_layers.2.0.conv1.conv.weight
+                    if k.startswith('neck.fpn_stages.0.0.'):
+                        name = k.replace('neck.fpn_stages.0.0.',
+                                         'neck.reduce_layers.2.0.')
+                        if '.spp.' in name:
+                            name = name.replace('.spp.conv.', '.spp.conv2.')
+                    # neck.fpn_stages.1.0.conv1.conv.weight
+                    # -> neck.top_down_layers.0.0.conv1.conv.weight
+                    elif k.startswith('neck.fpn_stages.1.0.'):
+                        name = k.replace('neck.fpn_stages.1.0.',
+                                         'neck.top_down_layers.0.0.')
+                    elif k.startswith('neck.fpn_stages.2.0.'):
+                        name = k.replace('neck.fpn_stages.2.0.',
+                                         'neck.top_down_layers.1.0.')
+                    else:
+                        raise NotImplementedError('Not implemented.')
+                    name = name.replace('.0.convs.', '.0.blocks.')
+                elif k.startswith('neck.fpn_routes.'):
+                    # neck.fpn_routes.0.conv.weight
+                    # -> neck.upsample_layers.0.0.conv.weight
+                    index = k.split('.')[2]
+                    name = 'neck.upsample_layers.' + index + '.0.' + '.'.join(
+                        k.split('.')[-2:])
+                    name = name.replace('.0.convs.', '.0.blocks.')
+                elif k.startswith('neck.pan_stages.'):
+                    # neck.pan_stages.0.0.conv1.conv.weight
+                    # -> neck.bottom_up_layers.1.0.conv1.conv.weight
+                    ind = k.split('.')[2]
+                    name = k.replace(
+                        'neck.pan_stages.' + ind, 'neck.bottom_up_layers.' +
+                        ('0' if ind == '1' else '1'))
+                    name = name.replace('.0.convs.', '.0.blocks.')
+                elif k.startswith('neck.pan_routes.'):
+                    # neck.pan_routes.0.conv.weight
+                    # -> neck.downsample_layers.0.conv.weight
+                    ind = k.split('.')[2]
+                    name = k.replace(
+                        'neck.pan_routes.' + ind, 'neck.downsample_layers.' +
+                        ('0' if ind == '1' else '1'))
+                    name = name.replace('.0.convs.', '.0.blocks.')
+
+                else:
+                    raise NotImplementedError('Not implement.')
+                name = convert_repvgg(name)
+                name = convert_bn(name)
+            elif k.startswith('yolo_head.'):
+                if ('anchor_points' in k) or ('stride_tensor' in k):
+                    continue
+                if 'proj_conv' in k:
+                    name = k.replace('yolo_head.proj_conv.',
+                                     'bbox_head.head_module.proj_conv.')
+                else:
+                    for org_key, rep_key in [
+                        [
+                            'yolo_head.stem_cls.',
+                            'bbox_head.head_module.cls_stems.'
+                        ],
+                        [
+                            'yolo_head.stem_reg.',
+                            'bbox_head.head_module.reg_stems.'
+                        ],
+                        [
+                            'yolo_head.pred_cls.',
+                            'bbox_head.head_module.cls_preds.'
+                        ],
+                        [
+                            'yolo_head.pred_reg.',
+                            'bbox_head.head_module.reg_preds.'
+                        ]
+                    ]:
+                        name = name.replace(org_key, rep_key)
+                    name = name.split('.')
+                    ind = name[3]
+                    name[3] = str(2 - int(ind))
+                    name = '.'.join(name)
+                name = convert_bn(name)
+            else:
+                continue
+
+            new_state_dict[name] = torch.from_numpy(v)
+    data = {'state_dict': new_state_dict}
+    torch.save(data, dst)
+
+
+def main():
+    parser = argparse.ArgumentParser(description='Convert model keys')
+    parser.add_argument(
+        '--src',
+        default='ppyoloe_plus_crn_s_80e_coco.pdparams',
+        help='src ppyoloe model path')
+    parser.add_argument(
+        '--dst', default='mmppyoloe_plus_s.pt', help='save path')
+    parser.add_argument(
+        '--imagenet-pretrain',
+        action='store_true',
+        default=False,
+        help='Load model pretrained on imagenet dataset which only '
+        'have weight for backbone.')
+    args = parser.parse_args()
+    convert(args.src, args.dst, args.imagenet_pretrain)
+
+
+if __name__ == '__main__':
+    main()
diff --git a/mmdetection_practice/third_party/mmyolo/tools/model_converters/rtmdet_to_mmyolo.py b/mmdetection_practice/third_party/mmyolo/tools/model_converters/rtmdet_to_mmyolo.py
new file mode 100644
index 0000000..9c6f237
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tools/model_converters/rtmdet_to_mmyolo.py
@@ -0,0 +1,61 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+import argparse
+from collections import OrderedDict
+
+import torch
+
+
+def convert(src, dst):
+    """Convert keys in pretrained RTMDet models to MMYOLO style."""
+    blobs = torch.load(src)['state_dict']
+    state_dict = OrderedDict()
+
+    for key, weight in blobs.items():
+        if 'neck.reduce_layers.0' in key:
+            new_key = key.replace('.0', '.2')
+            state_dict[new_key] = weight
+        elif 'neck.reduce_layers.1' in key:
+            new_key = key.replace('reduce_layers.1', 'top_down_layers.0.1')
+            state_dict[new_key] = weight
+        elif 'neck.top_down_blocks.0' in key:
+            new_key = key.replace('down_blocks', 'down_layers.0')
+            state_dict[new_key] = weight
+        elif 'neck.top_down_blocks.1' in key:
+            new_key = key.replace('down_blocks', 'down_layers')
+            state_dict[new_key] = weight
+        elif 'downsamples' in key:
+            new_key = key.replace('downsamples', 'downsample_layers')
+            state_dict[new_key] = weight
+        elif 'bottom_up_blocks' in key:
+            new_key = key.replace('bottom_up_blocks', 'bottom_up_layers')
+            state_dict[new_key] = weight
+        elif 'out_convs' in key:
+            new_key = key.replace('out_convs', 'out_layers')
+            state_dict[new_key] = weight
+        elif 'bbox_head' in key:
+            new_key = key.replace('bbox_head', 'bbox_head.head_module')
+            state_dict[new_key] = weight
+        elif 'data_preprocessor' in key:
+            continue
+        else:
+            new_key = key
+            state_dict[new_key] = weight
+        print(f'Convert {key} to {new_key}')
+
+    # save checkpoint
+    checkpoint = dict()
+    checkpoint['state_dict'] = state_dict
+    checkpoint['meta'] = blobs.get('meta')
+    torch.save(checkpoint, dst)
+
+
+def main():
+    parser = argparse.ArgumentParser(description='Convert model keys')
+    parser.add_argument('src', help='src rtm model path')
+    parser.add_argument('dst', help='save path')
+    args = parser.parse_args()
+    convert(args.src, args.dst)
+
+
+if __name__ == '__main__':
+    main()
diff --git a/mmdetection_practice/third_party/mmyolo/tools/model_converters/yolov5_to_mmyolo.py b/mmdetection_practice/third_party/mmyolo/tools/model_converters/yolov5_to_mmyolo.py
new file mode 100644
index 0000000..a4e62a2
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tools/model_converters/yolov5_to_mmyolo.py
@@ -0,0 +1,128 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+import argparse
+from collections import OrderedDict
+
+import torch
+
+convert_dict_p5 = {
+    'model.0': 'backbone.stem',
+    'model.1': 'backbone.stage1.0',
+    'model.2': 'backbone.stage1.1',
+    'model.3': 'backbone.stage2.0',
+    'model.4': 'backbone.stage2.1',
+    'model.5': 'backbone.stage3.0',
+    'model.6': 'backbone.stage3.1',
+    'model.7': 'backbone.stage4.0',
+    'model.8': 'backbone.stage4.1',
+    'model.9.cv1': 'backbone.stage4.2.conv1',
+    'model.9.cv2': 'backbone.stage4.2.conv2',
+    'model.10': 'neck.reduce_layers.2',
+    'model.13': 'neck.top_down_layers.0.0',
+    'model.14': 'neck.top_down_layers.0.1',
+    'model.17': 'neck.top_down_layers.1',
+    'model.18': 'neck.downsample_layers.0',
+    'model.20': 'neck.bottom_up_layers.0',
+    'model.21': 'neck.downsample_layers.1',
+    'model.23': 'neck.bottom_up_layers.1',
+    'model.24.m': 'bbox_head.head_module.convs_pred',
+    'model.24.proto': 'bbox_head.head_module.proto_preds',
+}
+
+convert_dict_p6 = {
+    'model.0': 'backbone.stem',
+    'model.1': 'backbone.stage1.0',
+    'model.2': 'backbone.stage1.1',
+    'model.3': 'backbone.stage2.0',
+    'model.4': 'backbone.stage2.1',
+    'model.5': 'backbone.stage3.0',
+    'model.6': 'backbone.stage3.1',
+    'model.7': 'backbone.stage4.0',
+    'model.8': 'backbone.stage4.1',
+    'model.9': 'backbone.stage5.0',
+    'model.10': 'backbone.stage5.1',
+    'model.11.cv1': 'backbone.stage5.2.conv1',
+    'model.11.cv2': 'backbone.stage5.2.conv2',
+    'model.12': 'neck.reduce_layers.3',
+    'model.15': 'neck.top_down_layers.0.0',
+    'model.16': 'neck.top_down_layers.0.1',
+    'model.19': 'neck.top_down_layers.1.0',
+    'model.20': 'neck.top_down_layers.1.1',
+    'model.23': 'neck.top_down_layers.2',
+    'model.24': 'neck.downsample_layers.0',
+    'model.26': 'neck.bottom_up_layers.0',
+    'model.27': 'neck.downsample_layers.1',
+    'model.29': 'neck.bottom_up_layers.1',
+    'model.30': 'neck.downsample_layers.2',
+    'model.32': 'neck.bottom_up_layers.2',
+    'model.33.m': 'bbox_head.head_module.convs_pred',
+    'model.33.proto': 'bbox_head.head_module.proto_preds',
+}
+
+
+def convert(src, dst):
+    """Convert keys in pretrained YOLOv5 models to mmyolo style."""
+    if src.endswith('6.pt'):
+        convert_dict = convert_dict_p6
+        is_p6_model = True
+        print('Converting P6 model')
+    else:
+        convert_dict = convert_dict_p5
+        is_p6_model = False
+        print('Converting P5 model')
+    try:
+        yolov5_model = torch.load(src)['model']
+        blobs = yolov5_model.state_dict()
+    except ModuleNotFoundError:
+        raise RuntimeError(
+            'This script must be placed under the ultralytics/yolov5 repo,'
+            ' because loading the official pretrained model need'
+            ' `model.py` to build model.')
+    state_dict = OrderedDict()
+
+    for key, weight in blobs.items():
+
+        num, module = key.split('.')[1:3]
+        if (is_p6_model and
+            (num == '11' or num == '33')) or (not is_p6_model and
+                                              (num == '9' or num == '24')):
+            if module == 'anchors':
+                continue
+            prefix = f'model.{num}.{module}'
+        else:
+            prefix = f'model.{num}'
+
+        new_key = key.replace(prefix, convert_dict[prefix])
+
+        if '.m.' in new_key:
+            new_key = new_key.replace('.m.', '.blocks.')
+            new_key = new_key.replace('.cv', '.conv')
+        elif 'bbox_head.head_module.proto_preds.cv' in new_key:
+            new_key = new_key.replace(
+                'bbox_head.head_module.proto_preds.cv',
+                'bbox_head.head_module.proto_preds.conv')
+        else:
+            new_key = new_key.replace('.cv1', '.main_conv')
+            new_key = new_key.replace('.cv2', '.short_conv')
+            new_key = new_key.replace('.cv3', '.final_conv')
+
+        state_dict[new_key] = weight
+        print(f'Convert {key} to {new_key}')
+
+    # save checkpoint
+    checkpoint = dict()
+    checkpoint['state_dict'] = state_dict
+    torch.save(checkpoint, dst)
+
+
+# Note: This script must be placed under the yolov5 repo to run.
+def main():
+    parser = argparse.ArgumentParser(description='Convert model keys')
+    parser.add_argument(
+        '--src', default='yolov5s.pt', help='src yolov5 model path')
+    parser.add_argument('--dst', default='mmyolov5s.pt', help='save path')
+    args = parser.parse_args()
+    convert(args.src, args.dst)
+
+
+if __name__ == '__main__':
+    main()
diff --git a/mmdetection_practice/third_party/mmyolo/tools/model_converters/yolov5u_to_mmyolo.py b/mmdetection_practice/third_party/mmyolo/tools/model_converters/yolov5u_to_mmyolo.py
new file mode 100644
index 0000000..806c76c
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tools/model_converters/yolov5u_to_mmyolo.py
@@ -0,0 +1,88 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+import argparse
+from collections import OrderedDict
+
+import torch
+
+convert_dict_p5 = {
+    'model.0': 'backbone.stem',
+    'model.1': 'backbone.stage1.0',
+    'model.2': 'backbone.stage1.1',
+    'model.3': 'backbone.stage2.0',
+    'model.4': 'backbone.stage2.1',
+    'model.5': 'backbone.stage3.0',
+    'model.6': 'backbone.stage3.1',
+    'model.7': 'backbone.stage4.0',
+    'model.8': 'backbone.stage4.1',
+    'model.9': 'backbone.stage4.2',
+    'model.10': 'neck.reduce_layers.2',
+    'model.13': 'neck.top_down_layers.0.0',
+    'model.14': 'neck.top_down_layers.0.1',
+    'model.17': 'neck.top_down_layers.1',
+    'model.18': 'neck.downsample_layers.0',
+    'model.20': 'neck.bottom_up_layers.0',
+    'model.21': 'neck.downsample_layers.1',
+    'model.23': 'neck.bottom_up_layers.1',
+    'model.24': 'bbox_head.head_module',
+}
+
+
+def convert(src, dst):
+    """Convert keys in pretrained YOLOv5u models to mmyolo style."""
+    convert_dict = convert_dict_p5
+
+    print('Converting P5 model')
+    try:
+        yolov5_model = torch.load(src)['model']
+        blobs = yolov5_model.state_dict()
+    except ModuleNotFoundError:
+        raise RuntimeError(
+            'This script must be placed under the ultralytics repo,'
+            ' because loading the official pretrained model need'
+            ' `model.py` to build model.')
+    state_dict = OrderedDict()
+
+    for key, weight in blobs.items():
+
+        num, module = key.split('.')[1:3]
+        prefix = f'model.{num}'
+        new_key = key.replace(prefix, convert_dict[prefix])
+
+        if '.m.' in new_key:
+            new_key = new_key.replace('.m.', '.blocks.')
+            new_key = new_key.replace('.cv', '.conv')
+        elif 'bbox_head.head_module' in new_key:
+            new_key = new_key.replace('.cv2', '.reg_preds')
+            new_key = new_key.replace('.cv3', '.cls_preds')
+        elif 'backbone.stage4.2' in new_key:
+            new_key = new_key.replace('.cv', '.conv')
+        else:
+            new_key = new_key.replace('.cv1', '.main_conv')
+            new_key = new_key.replace('.cv2', '.short_conv')
+            new_key = new_key.replace('.cv3', '.final_conv')
+
+        if 'bbox_head.head_module.dfl.conv.weight' == new_key:
+            print('Drop "bbox_head.head_module.dfl.conv.weight", '
+                  'because it is useless')
+            continue
+        state_dict[new_key] = weight
+        print(f'Convert {key} to {new_key}')
+
+    # save checkpoint
+    checkpoint = dict()
+    checkpoint['state_dict'] = state_dict
+    torch.save(checkpoint, dst)
+
+
+# Note: This script must be placed under the ultralytics repo to run.
+def main():
+    parser = argparse.ArgumentParser(description='Convert model keys')
+    parser.add_argument(
+        '--src', default='yolov5su.pt', help='src yolov5u model path')
+    parser.add_argument('--dst', default='mmyolov5su.pth', help='save path')
+    args = parser.parse_args()
+    convert(args.src, args.dst)
+
+
+if __name__ == '__main__':
+    main()
diff --git a/mmdetection_practice/third_party/mmyolo/tools/model_converters/yolov6_to_mmyolo.py b/mmdetection_practice/third_party/mmyolo/tools/model_converters/yolov6_to_mmyolo.py
new file mode 100644
index 0000000..e9e86ab
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tools/model_converters/yolov6_to_mmyolo.py
@@ -0,0 +1,115 @@
+import argparse
+from collections import OrderedDict
+
+import torch
+
+
+def convert(src, dst):
+    import sys
+    sys.path.append('yolov6')
+    try:
+        ckpt = torch.load(src, map_location=torch.device('cpu'))
+    except ModuleNotFoundError:
+        raise RuntimeError(
+            'This script must be placed under the meituan/YOLOv6 repo,'
+            ' because loading the official pretrained model need'
+            ' some python files to build model.')
+    # The saved model is the model before reparameterization
+    model = ckpt['ema' if ckpt.get('ema') else 'model'].float()
+    new_state_dict = OrderedDict()
+    for k, v in model.state_dict().items():
+        name = k
+        if 'detect' in k:
+            if 'proj' in k:
+                continue
+            name = k.replace('detect', 'bbox_head.head_module')
+        if k.find('anchors') >= 0 or k.find('anchor_grid') >= 0:
+            continue
+
+        if 'ERBlock_2' in k:
+            name = k.replace('ERBlock_2', 'stage1.0')
+            if '.cv' in k:
+                name = name.replace('.cv', '.conv')
+            if '.m.' in k:
+                name = name.replace('.m.', '.block.')
+        elif 'ERBlock_3' in k:
+            name = k.replace('ERBlock_3', 'stage2.0')
+            if '.cv' in k:
+                name = name.replace('.cv', '.conv')
+            if '.m.' in k:
+                name = name.replace('.m.', '.block.')
+        elif 'ERBlock_4' in k:
+            name = k.replace('ERBlock_4', 'stage3.0')
+            if '.cv' in k:
+                name = name.replace('.cv', '.conv')
+            if '.m.' in k:
+                name = name.replace('.m.', '.block.')
+        elif 'ERBlock_5' in k:
+            name = k.replace('ERBlock_5', 'stage4.0')
+            if '.cv' in k:
+                name = name.replace('.cv', '.conv')
+            if '.m.' in k:
+                name = name.replace('.m.', '.block.')
+            if 'stage4.0.2' in name:
+                name = name.replace('stage4.0.2', 'stage4.1')
+                name = name.replace('cv', 'conv')
+        elif 'reduce_layer0' in k:
+            name = k.replace('reduce_layer0', 'reduce_layers.2')
+        elif 'Rep_p4' in k:
+            name = k.replace('Rep_p4', 'top_down_layers.0.0')
+            if '.cv' in k:
+                name = name.replace('.cv', '.conv')
+            if '.m.' in k:
+                name = name.replace('.m.', '.block.')
+        elif 'reduce_layer1' in k:
+            name = k.replace('reduce_layer1', 'top_down_layers.0.1')
+            if '.cv' in k:
+                name = name.replace('.cv', '.conv')
+            if '.m.' in k:
+                name = name.replace('.m.', '.block.')
+        elif 'Rep_p3' in k:
+            name = k.replace('Rep_p3', 'top_down_layers.1')
+            if '.cv' in k:
+                name = name.replace('.cv', '.conv')
+            if '.m.' in k:
+                name = name.replace('.m.', '.block.')
+        elif 'upsample0' in k:
+            name = k.replace('upsample0.upsample_transpose',
+                             'upsample_layers.0')
+        elif 'upsample1' in k:
+            name = k.replace('upsample1.upsample_transpose',
+                             'upsample_layers.1')
+        elif 'Rep_n3' in k:
+            name = k.replace('Rep_n3', 'bottom_up_layers.0')
+            if '.cv' in k:
+                name = name.replace('.cv', '.conv')
+            if '.m.' in k:
+                name = name.replace('.m.', '.block.')
+        elif 'Rep_n4' in k:
+            name = k.replace('Rep_n4', 'bottom_up_layers.1')
+            if '.cv' in k:
+                name = name.replace('.cv', '.conv')
+            if '.m.' in k:
+                name = name.replace('.m.', '.block.')
+        elif 'downsample2' in k:
+            name = k.replace('downsample2', 'downsample_layers.0')
+        elif 'downsample1' in k:
+            name = k.replace('downsample1', 'downsample_layers.1')
+
+        new_state_dict[name] = v
+    data = {'state_dict': new_state_dict}
+    torch.save(data, dst)
+
+
+# Note: This script must be placed under the yolov6 repo to run.
+def main():
+    parser = argparse.ArgumentParser(description='Convert model keys')
+    parser.add_argument(
+        '--src', default='yolov6s.pt', help='src yolov6 model path')
+    parser.add_argument('--dst', default='mmyolov6.pt', help='save path')
+    args = parser.parse_args()
+    convert(args.src, args.dst)
+
+
+if __name__ == '__main__':
+    main()
diff --git a/mmdetection_practice/third_party/mmyolo/tools/model_converters/yolov6_v3_to_mmyolo.py b/mmdetection_practice/third_party/mmyolo/tools/model_converters/yolov6_v3_to_mmyolo.py
new file mode 100644
index 0000000..bc87664
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tools/model_converters/yolov6_v3_to_mmyolo.py
@@ -0,0 +1,145 @@
+import argparse
+from collections import OrderedDict
+
+import torch
+
+
+def convert(src, dst):
+    import sys
+    sys.path.append('yolov6')
+    try:
+        ckpt = torch.load(src, map_location=torch.device('cpu'))
+    except ModuleNotFoundError:
+        raise RuntimeError(
+            'This script must be placed under the meituan/YOLOv6 repo,'
+            ' because loading the official pretrained model need'
+            ' some python files to build model.')
+    # The saved model is the model before reparameterization
+    model = ckpt['ema' if ckpt.get('ema') else 'model'].float()
+    new_state_dict = OrderedDict()
+    is_ns = False
+    for k, v in model.state_dict().items():
+        name = k
+        if 'detect' in k:
+            if 'proj' in k:
+                continue
+            if 'reg_preds_lrtb' in k:
+                is_ns = True
+            name = k.replace('detect', 'bbox_head.head_module')
+        if k.find('anchors') >= 0 or k.find('anchor_grid') >= 0:
+            continue
+
+        if 'ERBlock_2' in k:
+            name = k.replace('ERBlock_2', 'stage1.0')
+            if '.cv' in k:
+                name = name.replace('.cv', '.conv')
+            if '.m.' in k:
+                name = name.replace('.m.', '.block.')
+        elif 'ERBlock_3' in k:
+            name = k.replace('ERBlock_3', 'stage2.0')
+            if '.cv' in k:
+                name = name.replace('.cv', '.conv')
+            if '.m.' in k:
+                name = name.replace('.m.', '.block.')
+        elif 'ERBlock_4' in k:
+            name = k.replace('ERBlock_4', 'stage3.0')
+            if '.cv' in k:
+                name = name.replace('.cv', '.conv')
+            if '.m.' in k:
+                name = name.replace('.m.', '.block.')
+        elif 'ERBlock_5' in k:
+            name = k.replace('ERBlock_5', 'stage4.0')
+            if '.cv' in k:
+                name = name.replace('.cv', '.conv')
+            if '.m.' in k:
+                name = name.replace('.m.', '.block.')
+            if 'stage4.0.2' in name:
+                name = name.replace('stage4.0.2', 'stage4.1')
+                name = name.replace('cv', 'conv')
+        elif 'reduce_layer0' in k:
+            name = k.replace('reduce_layer0', 'reduce_layers.2')
+        elif 'Rep_p4' in k:
+            name = k.replace('Rep_p4', 'top_down_layers.0.0')
+            if '.cv' in k:
+                name = name.replace('.cv', '.conv')
+            if '.m.' in k:
+                name = name.replace('.m.', '.block.')
+        elif 'reduce_layer1' in k:
+            name = k.replace('reduce_layer1', 'top_down_layers.0.1')
+            if '.cv' in k:
+                name = name.replace('.cv', '.conv')
+            if '.m.' in k:
+                name = name.replace('.m.', '.block.')
+        elif 'Rep_p3' in k:
+            name = k.replace('Rep_p3', 'top_down_layers.1')
+            if '.cv' in k:
+                name = name.replace('.cv', '.conv')
+            if '.m.' in k:
+                name = name.replace('.m.', '.block.')
+        elif 'Bifusion0' in k:
+            name = k.replace('Bifusion0', 'upsample_layers.0')
+            if '.cv' in k:
+                name = name.replace('.cv', '.conv')
+            if '.m.' in k:
+                name = name.replace('.m.', '.block.')
+            if '.upsample_transpose.' in k:
+                name = name.replace('.upsample_transpose.', '.')
+        elif 'Bifusion1' in k:
+            name = k.replace('Bifusion1', 'upsample_layers.1')
+            if '.cv' in k:
+                name = name.replace('.cv', '.conv')
+            if '.m.' in k:
+                name = name.replace('.m.', '.block.')
+            if '.upsample_transpose.' in k:
+                name = name.replace('.upsample_transpose.', '.')
+        elif 'Rep_n3' in k:
+            name = k.replace('Rep_n3', 'bottom_up_layers.0')
+            if '.cv' in k:
+                name = name.replace('.cv', '.conv')
+            if '.m.' in k:
+                name = name.replace('.m.', '.block.')
+        elif 'Rep_n4' in k:
+            name = k.replace('Rep_n4', 'bottom_up_layers.1')
+            if '.cv' in k:
+                name = name.replace('.cv', '.conv')
+            if '.m.' in k:
+                name = name.replace('.m.', '.block.')
+        elif 'downsample2' in k:
+            name = k.replace('downsample2', 'downsample_layers.0')
+        elif 'downsample1' in k:
+            name = k.replace('downsample1', 'downsample_layers.1')
+
+        new_state_dict[name] = v
+
+    # The yolov6_v3_n/s has two regression heads.
+    # One called 'reg_preds_lrtb' is a regular anchor-free head,
+    # which is used for inference.
+    # One called 'reg_preds' is a DFL style head, which
+    # is only used in training.
+    if is_ns:
+        tmp_state_dict = OrderedDict()
+        for k, v in new_state_dict.items():
+            name = k
+            if 'reg_preds_lrtb' in k:
+                name = k.replace('reg_preds_lrtb', 'reg_preds')
+            elif 'reg_preds' in k:
+                name = k.replace('reg_preds', 'distill_ns_head')
+            tmp_state_dict[name] = v
+        new_state_dict = tmp_state_dict
+
+    data = {'state_dict': new_state_dict}
+    torch.save(data, dst)
+
+
+# Note: This script must be placed under the yolov6 repo to run.
+def main():
+    parser = argparse.ArgumentParser(description='Convert model keys')
+    parser.add_argument(
+        '--src', default='yolov6s.pt', help='src yolov6 model path')
+    parser.add_argument('--dst', default='mmyolov6.pt', help='save path')
+    args = parser.parse_args()
+    convert(args.src, args.dst)
+
+
+if __name__ == '__main__':
+    main()
diff --git a/mmdetection_practice/third_party/mmyolo/tools/model_converters/yolov7_to_mmyolo.py b/mmdetection_practice/third_party/mmyolo/tools/model_converters/yolov7_to_mmyolo.py
new file mode 100644
index 0000000..1c1f54d
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tools/model_converters/yolov7_to_mmyolo.py
@@ -0,0 +1,1093 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+import argparse
+import os.path as osp
+from collections import OrderedDict
+
+import torch
+
+convert_dict_tiny = {
+    # stem
+    'model.0': 'backbone.stem.0',
+    'model.1': 'backbone.stem.1',
+
+    # stage1 TinyDownSampleBlock
+    'model.2': 'backbone.stage1.0.short_conv',
+    'model.3': 'backbone.stage1.0.main_convs.0',
+    'model.4': 'backbone.stage1.0.main_convs.1',
+    'model.5': 'backbone.stage1.0.main_convs.2',
+    'model.7': 'backbone.stage1.0.final_conv',
+
+    # stage2  TinyDownSampleBlock
+    'model.9': 'backbone.stage2.1.short_conv',
+    'model.10': 'backbone.stage2.1.main_convs.0',
+    'model.11': 'backbone.stage2.1.main_convs.1',
+    'model.12': 'backbone.stage2.1.main_convs.2',
+    'model.14': 'backbone.stage2.1.final_conv',
+
+    # stage3 TinyDownSampleBlock
+    'model.16': 'backbone.stage3.1.short_conv',
+    'model.17': 'backbone.stage3.1.main_convs.0',
+    'model.18': 'backbone.stage3.1.main_convs.1',
+    'model.19': 'backbone.stage3.1.main_convs.2',
+    'model.21': 'backbone.stage3.1.final_conv',
+
+    # stage4 TinyDownSampleBlock
+    'model.23': 'backbone.stage4.1.short_conv',
+    'model.24': 'backbone.stage4.1.main_convs.0',
+    'model.25': 'backbone.stage4.1.main_convs.1',
+    'model.26': 'backbone.stage4.1.main_convs.2',
+    'model.28': 'backbone.stage4.1.final_conv',
+
+    # neck SPPCSPBlock
+    'model.29': 'neck.reduce_layers.2.short_layer',
+    'model.30': 'neck.reduce_layers.2.main_layers',
+    'model.35': 'neck.reduce_layers.2.fuse_layers',
+    'model.37': 'neck.reduce_layers.2.final_conv',
+    'model.38': 'neck.upsample_layers.0.0',
+    'model.40': 'neck.reduce_layers.1',
+    'model.42': 'neck.top_down_layers.0.short_conv',
+    'model.43': 'neck.top_down_layers.0.main_convs.0',
+    'model.44': 'neck.top_down_layers.0.main_convs.1',
+    'model.45': 'neck.top_down_layers.0.main_convs.2',
+    'model.47': 'neck.top_down_layers.0.final_conv',
+    'model.48': 'neck.upsample_layers.1.0',
+    'model.50': 'neck.reduce_layers.0',
+    'model.52': 'neck.top_down_layers.1.short_conv',
+    'model.53': 'neck.top_down_layers.1.main_convs.0',
+    'model.54': 'neck.top_down_layers.1.main_convs.1',
+    'model.55': 'neck.top_down_layers.1.main_convs.2',
+    'model.57': 'neck.top_down_layers.1.final_conv',
+    'model.58': 'neck.downsample_layers.0',
+    'model.60': 'neck.bottom_up_layers.0.short_conv',
+    'model.61': 'neck.bottom_up_layers.0.main_convs.0',
+    'model.62': 'neck.bottom_up_layers.0.main_convs.1',
+    'model.63': 'neck.bottom_up_layers.0.main_convs.2',
+    'model.65': 'neck.bottom_up_layers.0.final_conv',
+    'model.66': 'neck.downsample_layers.1',
+    'model.68': 'neck.bottom_up_layers.1.short_conv',
+    'model.69': 'neck.bottom_up_layers.1.main_convs.0',
+    'model.70': 'neck.bottom_up_layers.1.main_convs.1',
+    'model.71': 'neck.bottom_up_layers.1.main_convs.2',
+    'model.73': 'neck.bottom_up_layers.1.final_conv',
+    'model.74': 'neck.out_layers.0',
+    'model.75': 'neck.out_layers.1',
+    'model.76': 'neck.out_layers.2',
+
+    # head
+    'model.77.m.0': 'bbox_head.head_module.convs_pred.0.1',
+    'model.77.m.1': 'bbox_head.head_module.convs_pred.1.1',
+    'model.77.m.2': 'bbox_head.head_module.convs_pred.2.1'
+}
+
+convert_dict_l = {
+    # stem
+    'model.0': 'backbone.stem.0',
+    'model.1': 'backbone.stem.1',
+    'model.2': 'backbone.stem.2',
+
+    # stage1
+    # ConvModule
+    'model.3': 'backbone.stage1.0',
+    # ELANBlock expand_channel_2x
+    'model.4': 'backbone.stage1.1.short_conv',
+    'model.5': 'backbone.stage1.1.main_conv',
+    'model.6': 'backbone.stage1.1.blocks.0.0',
+    'model.7': 'backbone.stage1.1.blocks.0.1',
+    'model.8': 'backbone.stage1.1.blocks.1.0',
+    'model.9': 'backbone.stage1.1.blocks.1.1',
+    'model.11': 'backbone.stage1.1.final_conv',
+
+    # stage2
+    # MaxPoolBlock reduce_channel_2x
+    'model.13': 'backbone.stage2.0.maxpool_branches.1',
+    'model.14': 'backbone.stage2.0.stride_conv_branches.0',
+    'model.15': 'backbone.stage2.0.stride_conv_branches.1',
+    # ELANBlock expand_channel_2x
+    'model.17': 'backbone.stage2.1.short_conv',
+    'model.18': 'backbone.stage2.1.main_conv',
+    'model.19': 'backbone.stage2.1.blocks.0.0',
+    'model.20': 'backbone.stage2.1.blocks.0.1',
+    'model.21': 'backbone.stage2.1.blocks.1.0',
+    'model.22': 'backbone.stage2.1.blocks.1.1',
+    'model.24': 'backbone.stage2.1.final_conv',
+
+    # stage3
+    # MaxPoolBlock reduce_channel_2x
+    'model.26': 'backbone.stage3.0.maxpool_branches.1',
+    'model.27': 'backbone.stage3.0.stride_conv_branches.0',
+    'model.28': 'backbone.stage3.0.stride_conv_branches.1',
+    # ELANBlock expand_channel_2x
+    'model.30': 'backbone.stage3.1.short_conv',
+    'model.31': 'backbone.stage3.1.main_conv',
+    'model.32': 'backbone.stage3.1.blocks.0.0',
+    'model.33': 'backbone.stage3.1.blocks.0.1',
+    'model.34': 'backbone.stage3.1.blocks.1.0',
+    'model.35': 'backbone.stage3.1.blocks.1.1',
+    'model.37': 'backbone.stage3.1.final_conv',
+
+    # stage4
+    # MaxPoolBlock reduce_channel_2x
+    'model.39': 'backbone.stage4.0.maxpool_branches.1',
+    'model.40': 'backbone.stage4.0.stride_conv_branches.0',
+    'model.41': 'backbone.stage4.0.stride_conv_branches.1',
+    # ELANBlock no_change_channel
+    'model.43': 'backbone.stage4.1.short_conv',
+    'model.44': 'backbone.stage4.1.main_conv',
+    'model.45': 'backbone.stage4.1.blocks.0.0',
+    'model.46': 'backbone.stage4.1.blocks.0.1',
+    'model.47': 'backbone.stage4.1.blocks.1.0',
+    'model.48': 'backbone.stage4.1.blocks.1.1',
+    'model.50': 'backbone.stage4.1.final_conv',
+
+    # neck SPPCSPBlock
+    'model.51.cv1': 'neck.reduce_layers.2.main_layers.0',
+    'model.51.cv3': 'neck.reduce_layers.2.main_layers.1',
+    'model.51.cv4': 'neck.reduce_layers.2.main_layers.2',
+    'model.51.cv5': 'neck.reduce_layers.2.fuse_layers.0',
+    'model.51.cv6': 'neck.reduce_layers.2.fuse_layers.1',
+    'model.51.cv2': 'neck.reduce_layers.2.short_layer',
+    'model.51.cv7': 'neck.reduce_layers.2.final_conv',
+
+    # neck
+    'model.52': 'neck.upsample_layers.0.0',
+    'model.54': 'neck.reduce_layers.1',
+
+    # neck ELANBlock reduce_channel_2x
+    'model.56': 'neck.top_down_layers.0.short_conv',
+    'model.57': 'neck.top_down_layers.0.main_conv',
+    'model.58': 'neck.top_down_layers.0.blocks.0',
+    'model.59': 'neck.top_down_layers.0.blocks.1',
+    'model.60': 'neck.top_down_layers.0.blocks.2',
+    'model.61': 'neck.top_down_layers.0.blocks.3',
+    'model.63': 'neck.top_down_layers.0.final_conv',
+    'model.64': 'neck.upsample_layers.1.0',
+    'model.66': 'neck.reduce_layers.0',
+
+    # neck ELANBlock reduce_channel_2x
+    'model.68': 'neck.top_down_layers.1.short_conv',
+    'model.69': 'neck.top_down_layers.1.main_conv',
+    'model.70': 'neck.top_down_layers.1.blocks.0',
+    'model.71': 'neck.top_down_layers.1.blocks.1',
+    'model.72': 'neck.top_down_layers.1.blocks.2',
+    'model.73': 'neck.top_down_layers.1.blocks.3',
+    'model.75': 'neck.top_down_layers.1.final_conv',
+
+    # neck MaxPoolBlock no_change_channel
+    'model.77': 'neck.downsample_layers.0.maxpool_branches.1',
+    'model.78': 'neck.downsample_layers.0.stride_conv_branches.0',
+    'model.79': 'neck.downsample_layers.0.stride_conv_branches.1',
+
+    # neck ELANBlock reduce_channel_2x
+    'model.81': 'neck.bottom_up_layers.0.short_conv',
+    'model.82': 'neck.bottom_up_layers.0.main_conv',
+    'model.83': 'neck.bottom_up_layers.0.blocks.0',
+    'model.84': 'neck.bottom_up_layers.0.blocks.1',
+    'model.85': 'neck.bottom_up_layers.0.blocks.2',
+    'model.86': 'neck.bottom_up_layers.0.blocks.3',
+    'model.88': 'neck.bottom_up_layers.0.final_conv',
+
+    # neck MaxPoolBlock no_change_channel
+    'model.90': 'neck.downsample_layers.1.maxpool_branches.1',
+    'model.91': 'neck.downsample_layers.1.stride_conv_branches.0',
+    'model.92': 'neck.downsample_layers.1.stride_conv_branches.1',
+
+    # neck ELANBlock reduce_channel_2x
+    'model.94': 'neck.bottom_up_layers.1.short_conv',
+    'model.95': 'neck.bottom_up_layers.1.main_conv',
+    'model.96': 'neck.bottom_up_layers.1.blocks.0',
+    'model.97': 'neck.bottom_up_layers.1.blocks.1',
+    'model.98': 'neck.bottom_up_layers.1.blocks.2',
+    'model.99': 'neck.bottom_up_layers.1.blocks.3',
+    'model.101': 'neck.bottom_up_layers.1.final_conv',
+
+    # RepVGGBlock
+    'model.102.rbr_dense.0': 'neck.out_layers.0.rbr_dense.conv',
+    'model.102.rbr_dense.1': 'neck.out_layers.0.rbr_dense.bn',
+    'model.102.rbr_1x1.0': 'neck.out_layers.0.rbr_1x1.conv',
+    'model.102.rbr_1x1.1': 'neck.out_layers.0.rbr_1x1.bn',
+    'model.103.rbr_dense.0': 'neck.out_layers.1.rbr_dense.conv',
+    'model.103.rbr_dense.1': 'neck.out_layers.1.rbr_dense.bn',
+    'model.103.rbr_1x1.0': 'neck.out_layers.1.rbr_1x1.conv',
+    'model.103.rbr_1x1.1': 'neck.out_layers.1.rbr_1x1.bn',
+    'model.104.rbr_dense.0': 'neck.out_layers.2.rbr_dense.conv',
+    'model.104.rbr_dense.1': 'neck.out_layers.2.rbr_dense.bn',
+    'model.104.rbr_1x1.0': 'neck.out_layers.2.rbr_1x1.conv',
+    'model.104.rbr_1x1.1': 'neck.out_layers.2.rbr_1x1.bn',
+
+    # head
+    'model.105.m.0': 'bbox_head.head_module.convs_pred.0.1',
+    'model.105.m.1': 'bbox_head.head_module.convs_pred.1.1',
+    'model.105.m.2': 'bbox_head.head_module.convs_pred.2.1'
+}
+
+convert_dict_x = {
+    # stem
+    'model.0': 'backbone.stem.0',
+    'model.1': 'backbone.stem.1',
+    'model.2': 'backbone.stem.2',
+
+    # stage1
+    # ConvModule
+    'model.3': 'backbone.stage1.0',
+    # ELANBlock expand_channel_2x
+    'model.4': 'backbone.stage1.1.short_conv',
+    'model.5': 'backbone.stage1.1.main_conv',
+    'model.6': 'backbone.stage1.1.blocks.0.0',
+    'model.7': 'backbone.stage1.1.blocks.0.1',
+    'model.8': 'backbone.stage1.1.blocks.1.0',
+    'model.9': 'backbone.stage1.1.blocks.1.1',
+    'model.10': 'backbone.stage1.1.blocks.2.0',
+    'model.11': 'backbone.stage1.1.blocks.2.1',
+    'model.13': 'backbone.stage1.1.final_conv',
+
+    # stage2
+    # MaxPoolBlock reduce_channel_2x
+    'model.15': 'backbone.stage2.0.maxpool_branches.1',
+    'model.16': 'backbone.stage2.0.stride_conv_branches.0',
+    'model.17': 'backbone.stage2.0.stride_conv_branches.1',
+
+    # ELANBlock expand_channel_2x
+    'model.19': 'backbone.stage2.1.short_conv',
+    'model.20': 'backbone.stage2.1.main_conv',
+    'model.21': 'backbone.stage2.1.blocks.0.0',
+    'model.22': 'backbone.stage2.1.blocks.0.1',
+    'model.23': 'backbone.stage2.1.blocks.1.0',
+    'model.24': 'backbone.stage2.1.blocks.1.1',
+    'model.25': 'backbone.stage2.1.blocks.2.0',
+    'model.26': 'backbone.stage2.1.blocks.2.1',
+    'model.28': 'backbone.stage2.1.final_conv',
+
+    # stage3
+    # MaxPoolBlock reduce_channel_2x
+    'model.30': 'backbone.stage3.0.maxpool_branches.1',
+    'model.31': 'backbone.stage3.0.stride_conv_branches.0',
+    'model.32': 'backbone.stage3.0.stride_conv_branches.1',
+    # ELANBlock expand_channel_2x
+    'model.34': 'backbone.stage3.1.short_conv',
+    'model.35': 'backbone.stage3.1.main_conv',
+    'model.36': 'backbone.stage3.1.blocks.0.0',
+    'model.37': 'backbone.stage3.1.blocks.0.1',
+    'model.38': 'backbone.stage3.1.blocks.1.0',
+    'model.39': 'backbone.stage3.1.blocks.1.1',
+    'model.40': 'backbone.stage3.1.blocks.2.0',
+    'model.41': 'backbone.stage3.1.blocks.2.1',
+    'model.43': 'backbone.stage3.1.final_conv',
+
+    # stage4
+    # MaxPoolBlock reduce_channel_2x
+    'model.45': 'backbone.stage4.0.maxpool_branches.1',
+    'model.46': 'backbone.stage4.0.stride_conv_branches.0',
+    'model.47': 'backbone.stage4.0.stride_conv_branches.1',
+    # ELANBlock no_change_channel
+    'model.49': 'backbone.stage4.1.short_conv',
+    'model.50': 'backbone.stage4.1.main_conv',
+    'model.51': 'backbone.stage4.1.blocks.0.0',
+    'model.52': 'backbone.stage4.1.blocks.0.1',
+    'model.53': 'backbone.stage4.1.blocks.1.0',
+    'model.54': 'backbone.stage4.1.blocks.1.1',
+    'model.55': 'backbone.stage4.1.blocks.2.0',
+    'model.56': 'backbone.stage4.1.blocks.2.1',
+    'model.58': 'backbone.stage4.1.final_conv',
+
+    # neck SPPCSPBlock
+    'model.59.cv1': 'neck.reduce_layers.2.main_layers.0',
+    'model.59.cv3': 'neck.reduce_layers.2.main_layers.1',
+    'model.59.cv4': 'neck.reduce_layers.2.main_layers.2',
+    'model.59.cv5': 'neck.reduce_layers.2.fuse_layers.0',
+    'model.59.cv6': 'neck.reduce_layers.2.fuse_layers.1',
+    'model.59.cv2': 'neck.reduce_layers.2.short_layer',
+    'model.59.cv7': 'neck.reduce_layers.2.final_conv',
+
+    # neck
+    'model.60': 'neck.upsample_layers.0.0',
+    'model.62': 'neck.reduce_layers.1',
+
+    # neck ELANBlock reduce_channel_2x
+    'model.64': 'neck.top_down_layers.0.short_conv',
+    'model.65': 'neck.top_down_layers.0.main_conv',
+    'model.66': 'neck.top_down_layers.0.blocks.0.0',
+    'model.67': 'neck.top_down_layers.0.blocks.0.1',
+    'model.68': 'neck.top_down_layers.0.blocks.1.0',
+    'model.69': 'neck.top_down_layers.0.blocks.1.1',
+    'model.70': 'neck.top_down_layers.0.blocks.2.0',
+    'model.71': 'neck.top_down_layers.0.blocks.2.1',
+    'model.73': 'neck.top_down_layers.0.final_conv',
+    'model.74': 'neck.upsample_layers.1.0',
+    'model.76': 'neck.reduce_layers.0',
+
+    # neck ELANBlock reduce_channel_2x
+    'model.78': 'neck.top_down_layers.1.short_conv',
+    'model.79': 'neck.top_down_layers.1.main_conv',
+    'model.80': 'neck.top_down_layers.1.blocks.0.0',
+    'model.81': 'neck.top_down_layers.1.blocks.0.1',
+    'model.82': 'neck.top_down_layers.1.blocks.1.0',
+    'model.83': 'neck.top_down_layers.1.blocks.1.1',
+    'model.84': 'neck.top_down_layers.1.blocks.2.0',
+    'model.85': 'neck.top_down_layers.1.blocks.2.1',
+    'model.87': 'neck.top_down_layers.1.final_conv',
+
+    # neck MaxPoolBlock no_change_channel
+    'model.89': 'neck.downsample_layers.0.maxpool_branches.1',
+    'model.90': 'neck.downsample_layers.0.stride_conv_branches.0',
+    'model.91': 'neck.downsample_layers.0.stride_conv_branches.1',
+
+    # neck ELANBlock reduce_channel_2x
+    'model.93': 'neck.bottom_up_layers.0.short_conv',
+    'model.94': 'neck.bottom_up_layers.0.main_conv',
+    'model.95': 'neck.bottom_up_layers.0.blocks.0.0',
+    'model.96': 'neck.bottom_up_layers.0.blocks.0.1',
+    'model.97': 'neck.bottom_up_layers.0.blocks.1.0',
+    'model.98': 'neck.bottom_up_layers.0.blocks.1.1',
+    'model.99': 'neck.bottom_up_layers.0.blocks.2.0',
+    'model.100': 'neck.bottom_up_layers.0.blocks.2.1',
+    'model.102': 'neck.bottom_up_layers.0.final_conv',
+
+    # neck MaxPoolBlock no_change_channel
+    'model.104': 'neck.downsample_layers.1.maxpool_branches.1',
+    'model.105': 'neck.downsample_layers.1.stride_conv_branches.0',
+    'model.106': 'neck.downsample_layers.1.stride_conv_branches.1',
+
+    # neck ELANBlock reduce_channel_2x
+    'model.108': 'neck.bottom_up_layers.1.short_conv',
+    'model.109': 'neck.bottom_up_layers.1.main_conv',
+    'model.110': 'neck.bottom_up_layers.1.blocks.0.0',
+    'model.111': 'neck.bottom_up_layers.1.blocks.0.1',
+    'model.112': 'neck.bottom_up_layers.1.blocks.1.0',
+    'model.113': 'neck.bottom_up_layers.1.blocks.1.1',
+    'model.114': 'neck.bottom_up_layers.1.blocks.2.0',
+    'model.115': 'neck.bottom_up_layers.1.blocks.2.1',
+    'model.117': 'neck.bottom_up_layers.1.final_conv',
+
+    # Conv
+    'model.118': 'neck.out_layers.0',
+    'model.119': 'neck.out_layers.1',
+    'model.120': 'neck.out_layers.2',
+
+    # head
+    'model.121.m.0': 'bbox_head.head_module.convs_pred.0.1',
+    'model.121.m.1': 'bbox_head.head_module.convs_pred.1.1',
+    'model.121.m.2': 'bbox_head.head_module.convs_pred.2.1'
+}
+
+convert_dict_w = {
+    # stem
+    'model.1': 'backbone.stem.conv',
+
+    # stage1
+    # ConvModule
+    'model.2': 'backbone.stage1.0',
+    # ELANBlock
+    'model.3': 'backbone.stage1.1.short_conv',
+    'model.4': 'backbone.stage1.1.main_conv',
+    'model.5': 'backbone.stage1.1.blocks.0.0',
+    'model.6': 'backbone.stage1.1.blocks.0.1',
+    'model.7': 'backbone.stage1.1.blocks.1.0',
+    'model.8': 'backbone.stage1.1.blocks.1.1',
+    'model.10': 'backbone.stage1.1.final_conv',
+
+    # stage2
+    'model.11': 'backbone.stage2.0',
+    # ELANBlock
+    'model.12': 'backbone.stage2.1.short_conv',
+    'model.13': 'backbone.stage2.1.main_conv',
+    'model.14': 'backbone.stage2.1.blocks.0.0',
+    'model.15': 'backbone.stage2.1.blocks.0.1',
+    'model.16': 'backbone.stage2.1.blocks.1.0',
+    'model.17': 'backbone.stage2.1.blocks.1.1',
+    'model.19': 'backbone.stage2.1.final_conv',
+
+    # stage3
+    'model.20': 'backbone.stage3.0',
+    # ELANBlock
+    'model.21': 'backbone.stage3.1.short_conv',
+    'model.22': 'backbone.stage3.1.main_conv',
+    'model.23': 'backbone.stage3.1.blocks.0.0',
+    'model.24': 'backbone.stage3.1.blocks.0.1',
+    'model.25': 'backbone.stage3.1.blocks.1.0',
+    'model.26': 'backbone.stage3.1.blocks.1.1',
+    'model.28': 'backbone.stage3.1.final_conv',
+
+    # stage4
+    'model.29': 'backbone.stage4.0',
+    # ELANBlock
+    'model.30': 'backbone.stage4.1.short_conv',
+    'model.31': 'backbone.stage4.1.main_conv',
+    'model.32': 'backbone.stage4.1.blocks.0.0',
+    'model.33': 'backbone.stage4.1.blocks.0.1',
+    'model.34': 'backbone.stage4.1.blocks.1.0',
+    'model.35': 'backbone.stage4.1.blocks.1.1',
+    'model.37': 'backbone.stage4.1.final_conv',
+
+    # stage5
+    'model.38': 'backbone.stage5.0',
+    # ELANBlock
+    'model.39': 'backbone.stage5.1.short_conv',
+    'model.40': 'backbone.stage5.1.main_conv',
+    'model.41': 'backbone.stage5.1.blocks.0.0',
+    'model.42': 'backbone.stage5.1.blocks.0.1',
+    'model.43': 'backbone.stage5.1.blocks.1.0',
+    'model.44': 'backbone.stage5.1.blocks.1.1',
+    'model.46': 'backbone.stage5.1.final_conv',
+
+    # neck SPPCSPBlock
+    'model.47.cv1': 'neck.reduce_layers.3.main_layers.0',
+    'model.47.cv3': 'neck.reduce_layers.3.main_layers.1',
+    'model.47.cv4': 'neck.reduce_layers.3.main_layers.2',
+    'model.47.cv5': 'neck.reduce_layers.3.fuse_layers.0',
+    'model.47.cv6': 'neck.reduce_layers.3.fuse_layers.1',
+    'model.47.cv2': 'neck.reduce_layers.3.short_layer',
+    'model.47.cv7': 'neck.reduce_layers.3.final_conv',
+
+    # neck
+    'model.48': 'neck.upsample_layers.0.0',
+    'model.50': 'neck.reduce_layers.2',
+
+    # neck ELANBlock
+    'model.52': 'neck.top_down_layers.0.short_conv',
+    'model.53': 'neck.top_down_layers.0.main_conv',
+    'model.54': 'neck.top_down_layers.0.blocks.0',
+    'model.55': 'neck.top_down_layers.0.blocks.1',
+    'model.56': 'neck.top_down_layers.0.blocks.2',
+    'model.57': 'neck.top_down_layers.0.blocks.3',
+    'model.59': 'neck.top_down_layers.0.final_conv',
+    'model.60': 'neck.upsample_layers.1.0',
+    'model.62': 'neck.reduce_layers.1',
+
+    # neck ELANBlock reduce_channel_2x
+    'model.64': 'neck.top_down_layers.1.short_conv',
+    'model.65': 'neck.top_down_layers.1.main_conv',
+    'model.66': 'neck.top_down_layers.1.blocks.0',
+    'model.67': 'neck.top_down_layers.1.blocks.1',
+    'model.68': 'neck.top_down_layers.1.blocks.2',
+    'model.69': 'neck.top_down_layers.1.blocks.3',
+    'model.71': 'neck.top_down_layers.1.final_conv',
+    'model.72': 'neck.upsample_layers.2.0',
+    'model.74': 'neck.reduce_layers.0',
+    'model.76': 'neck.top_down_layers.2.short_conv',
+    'model.77': 'neck.top_down_layers.2.main_conv',
+    'model.78': 'neck.top_down_layers.2.blocks.0',
+    'model.79': 'neck.top_down_layers.2.blocks.1',
+    'model.80': 'neck.top_down_layers.2.blocks.2',
+    'model.81': 'neck.top_down_layers.2.blocks.3',
+    'model.83': 'neck.top_down_layers.2.final_conv',
+    'model.84': 'neck.downsample_layers.0',
+
+    # neck ELANBlock
+    'model.86': 'neck.bottom_up_layers.0.short_conv',
+    'model.87': 'neck.bottom_up_layers.0.main_conv',
+    'model.88': 'neck.bottom_up_layers.0.blocks.0',
+    'model.89': 'neck.bottom_up_layers.0.blocks.1',
+    'model.90': 'neck.bottom_up_layers.0.blocks.2',
+    'model.91': 'neck.bottom_up_layers.0.blocks.3',
+    'model.93': 'neck.bottom_up_layers.0.final_conv',
+    'model.94': 'neck.downsample_layers.1',
+
+    # neck ELANBlock reduce_channel_2x
+    'model.96': 'neck.bottom_up_layers.1.short_conv',
+    'model.97': 'neck.bottom_up_layers.1.main_conv',
+    'model.98': 'neck.bottom_up_layers.1.blocks.0',
+    'model.99': 'neck.bottom_up_layers.1.blocks.1',
+    'model.100': 'neck.bottom_up_layers.1.blocks.2',
+    'model.101': 'neck.bottom_up_layers.1.blocks.3',
+    'model.103': 'neck.bottom_up_layers.1.final_conv',
+    'model.104': 'neck.downsample_layers.2',
+
+    # neck ELANBlock reduce_channel_2x
+    'model.106': 'neck.bottom_up_layers.2.short_conv',
+    'model.107': 'neck.bottom_up_layers.2.main_conv',
+    'model.108': 'neck.bottom_up_layers.2.blocks.0',
+    'model.109': 'neck.bottom_up_layers.2.blocks.1',
+    'model.110': 'neck.bottom_up_layers.2.blocks.2',
+    'model.111': 'neck.bottom_up_layers.2.blocks.3',
+    'model.113': 'neck.bottom_up_layers.2.final_conv',
+    'model.114': 'bbox_head.head_module.main_convs_pred.0.0',
+    'model.115': 'bbox_head.head_module.main_convs_pred.1.0',
+    'model.116': 'bbox_head.head_module.main_convs_pred.2.0',
+    'model.117': 'bbox_head.head_module.main_convs_pred.3.0',
+
+    # head
+    'model.118.m.0': 'bbox_head.head_module.main_convs_pred.0.2',
+    'model.118.m.1': 'bbox_head.head_module.main_convs_pred.1.2',
+    'model.118.m.2': 'bbox_head.head_module.main_convs_pred.2.2',
+    'model.118.m.3': 'bbox_head.head_module.main_convs_pred.3.2'
+}
+
+convert_dict_e = {
+    # stem
+    'model.1': 'backbone.stem.conv',
+
+    # stage1
+    'model.2.cv1': 'backbone.stage1.0.stride_conv_branches.0',
+    'model.2.cv2': 'backbone.stage1.0.stride_conv_branches.1',
+    'model.2.cv3': 'backbone.stage1.0.maxpool_branches.1',
+
+    # ELANBlock
+    'model.3': 'backbone.stage1.1.short_conv',
+    'model.4': 'backbone.stage1.1.main_conv',
+    'model.5': 'backbone.stage1.1.blocks.0.0',
+    'model.6': 'backbone.stage1.1.blocks.0.1',
+    'model.7': 'backbone.stage1.1.blocks.1.0',
+    'model.8': 'backbone.stage1.1.blocks.1.1',
+    'model.9': 'backbone.stage1.1.blocks.2.0',
+    'model.10': 'backbone.stage1.1.blocks.2.1',
+    'model.12': 'backbone.stage1.1.final_conv',
+
+    # stage2
+    'model.13.cv1': 'backbone.stage2.0.stride_conv_branches.0',
+    'model.13.cv2': 'backbone.stage2.0.stride_conv_branches.1',
+    'model.13.cv3': 'backbone.stage2.0.maxpool_branches.1',
+
+    # ELANBlock
+    'model.14': 'backbone.stage2.1.short_conv',
+    'model.15': 'backbone.stage2.1.main_conv',
+    'model.16': 'backbone.stage2.1.blocks.0.0',
+    'model.17': 'backbone.stage2.1.blocks.0.1',
+    'model.18': 'backbone.stage2.1.blocks.1.0',
+    'model.19': 'backbone.stage2.1.blocks.1.1',
+    'model.20': 'backbone.stage2.1.blocks.2.0',
+    'model.21': 'backbone.stage2.1.blocks.2.1',
+    'model.23': 'backbone.stage2.1.final_conv',
+
+    # stage3
+    'model.24.cv1': 'backbone.stage3.0.stride_conv_branches.0',
+    'model.24.cv2': 'backbone.stage3.0.stride_conv_branches.1',
+    'model.24.cv3': 'backbone.stage3.0.maxpool_branches.1',
+
+    # ELANBlock
+    'model.25': 'backbone.stage3.1.short_conv',
+    'model.26': 'backbone.stage3.1.main_conv',
+    'model.27': 'backbone.stage3.1.blocks.0.0',
+    'model.28': 'backbone.stage3.1.blocks.0.1',
+    'model.29': 'backbone.stage3.1.blocks.1.0',
+    'model.30': 'backbone.stage3.1.blocks.1.1',
+    'model.31': 'backbone.stage3.1.blocks.2.0',
+    'model.32': 'backbone.stage3.1.blocks.2.1',
+    'model.34': 'backbone.stage3.1.final_conv',
+
+    # stage4
+    'model.35.cv1': 'backbone.stage4.0.stride_conv_branches.0',
+    'model.35.cv2': 'backbone.stage4.0.stride_conv_branches.1',
+    'model.35.cv3': 'backbone.stage4.0.maxpool_branches.1',
+
+    # ELANBlock
+    'model.36': 'backbone.stage4.1.short_conv',
+    'model.37': 'backbone.stage4.1.main_conv',
+    'model.38': 'backbone.stage4.1.blocks.0.0',
+    'model.39': 'backbone.stage4.1.blocks.0.1',
+    'model.40': 'backbone.stage4.1.blocks.1.0',
+    'model.41': 'backbone.stage4.1.blocks.1.1',
+    'model.42': 'backbone.stage4.1.blocks.2.0',
+    'model.43': 'backbone.stage4.1.blocks.2.1',
+    'model.45': 'backbone.stage4.1.final_conv',
+
+    # stage5
+    'model.46.cv1': 'backbone.stage5.0.stride_conv_branches.0',
+    'model.46.cv2': 'backbone.stage5.0.stride_conv_branches.1',
+    'model.46.cv3': 'backbone.stage5.0.maxpool_branches.1',
+
+    # ELANBlock
+    'model.47': 'backbone.stage5.1.short_conv',
+    'model.48': 'backbone.stage5.1.main_conv',
+    'model.49': 'backbone.stage5.1.blocks.0.0',
+    'model.50': 'backbone.stage5.1.blocks.0.1',
+    'model.51': 'backbone.stage5.1.blocks.1.0',
+    'model.52': 'backbone.stage5.1.blocks.1.1',
+    'model.53': 'backbone.stage5.1.blocks.2.0',
+    'model.54': 'backbone.stage5.1.blocks.2.1',
+    'model.56': 'backbone.stage5.1.final_conv',
+
+    # neck SPPCSPBlock
+    'model.57.cv1': 'neck.reduce_layers.3.main_layers.0',
+    'model.57.cv3': 'neck.reduce_layers.3.main_layers.1',
+    'model.57.cv4': 'neck.reduce_layers.3.main_layers.2',
+    'model.57.cv5': 'neck.reduce_layers.3.fuse_layers.0',
+    'model.57.cv6': 'neck.reduce_layers.3.fuse_layers.1',
+    'model.57.cv2': 'neck.reduce_layers.3.short_layer',
+    'model.57.cv7': 'neck.reduce_layers.3.final_conv',
+
+    # neck
+    'model.58': 'neck.upsample_layers.0.0',
+    'model.60': 'neck.reduce_layers.2',
+
+    # neck ELANBlock
+    'model.62': 'neck.top_down_layers.0.short_conv',
+    'model.63': 'neck.top_down_layers.0.main_conv',
+    'model.64': 'neck.top_down_layers.0.blocks.0',
+    'model.65': 'neck.top_down_layers.0.blocks.1',
+    'model.66': 'neck.top_down_layers.0.blocks.2',
+    'model.67': 'neck.top_down_layers.0.blocks.3',
+    'model.68': 'neck.top_down_layers.0.blocks.4',
+    'model.69': 'neck.top_down_layers.0.blocks.5',
+    'model.71': 'neck.top_down_layers.0.final_conv',
+    'model.72': 'neck.upsample_layers.1.0',
+    'model.74': 'neck.reduce_layers.1',
+
+    # neck ELANBlock
+    'model.76': 'neck.top_down_layers.1.short_conv',
+    'model.77': 'neck.top_down_layers.1.main_conv',
+    'model.78': 'neck.top_down_layers.1.blocks.0',
+    'model.79': 'neck.top_down_layers.1.blocks.1',
+    'model.80': 'neck.top_down_layers.1.blocks.2',
+    'model.81': 'neck.top_down_layers.1.blocks.3',
+    'model.82': 'neck.top_down_layers.1.blocks.4',
+    'model.83': 'neck.top_down_layers.1.blocks.5',
+    'model.85': 'neck.top_down_layers.1.final_conv',
+    'model.86': 'neck.upsample_layers.2.0',
+    'model.88': 'neck.reduce_layers.0',
+    'model.90': 'neck.top_down_layers.2.short_conv',
+    'model.91': 'neck.top_down_layers.2.main_conv',
+    'model.92': 'neck.top_down_layers.2.blocks.0',
+    'model.93': 'neck.top_down_layers.2.blocks.1',
+    'model.94': 'neck.top_down_layers.2.blocks.2',
+    'model.95': 'neck.top_down_layers.2.blocks.3',
+    'model.96': 'neck.top_down_layers.2.blocks.4',
+    'model.97': 'neck.top_down_layers.2.blocks.5',
+    'model.99': 'neck.top_down_layers.2.final_conv',
+    'model.100.cv1': 'neck.downsample_layers.0.stride_conv_branches.0',
+    'model.100.cv2': 'neck.downsample_layers.0.stride_conv_branches.1',
+    'model.100.cv3': 'neck.downsample_layers.0.maxpool_branches.1',
+
+    # neck ELANBlock
+    'model.102': 'neck.bottom_up_layers.0.short_conv',
+    'model.103': 'neck.bottom_up_layers.0.main_conv',
+    'model.104': 'neck.bottom_up_layers.0.blocks.0',
+    'model.105': 'neck.bottom_up_layers.0.blocks.1',
+    'model.106': 'neck.bottom_up_layers.0.blocks.2',
+    'model.107': 'neck.bottom_up_layers.0.blocks.3',
+    'model.108': 'neck.bottom_up_layers.0.blocks.4',
+    'model.109': 'neck.bottom_up_layers.0.blocks.5',
+    'model.111': 'neck.bottom_up_layers.0.final_conv',
+    'model.112.cv1': 'neck.downsample_layers.1.stride_conv_branches.0',
+    'model.112.cv2': 'neck.downsample_layers.1.stride_conv_branches.1',
+    'model.112.cv3': 'neck.downsample_layers.1.maxpool_branches.1',
+
+    # neck ELANBlock
+    'model.114': 'neck.bottom_up_layers.1.short_conv',
+    'model.115': 'neck.bottom_up_layers.1.main_conv',
+    'model.116': 'neck.bottom_up_layers.1.blocks.0',
+    'model.117': 'neck.bottom_up_layers.1.blocks.1',
+    'model.118': 'neck.bottom_up_layers.1.blocks.2',
+    'model.119': 'neck.bottom_up_layers.1.blocks.3',
+    'model.120': 'neck.bottom_up_layers.1.blocks.4',
+    'model.121': 'neck.bottom_up_layers.1.blocks.5',
+    'model.123': 'neck.bottom_up_layers.1.final_conv',
+    'model.124.cv1': 'neck.downsample_layers.2.stride_conv_branches.0',
+    'model.124.cv2': 'neck.downsample_layers.2.stride_conv_branches.1',
+    'model.124.cv3': 'neck.downsample_layers.2.maxpool_branches.1',
+
+    # neck ELANBlock
+    'model.126': 'neck.bottom_up_layers.2.short_conv',
+    'model.127': 'neck.bottom_up_layers.2.main_conv',
+    'model.128': 'neck.bottom_up_layers.2.blocks.0',
+    'model.129': 'neck.bottom_up_layers.2.blocks.1',
+    'model.130': 'neck.bottom_up_layers.2.blocks.2',
+    'model.131': 'neck.bottom_up_layers.2.blocks.3',
+    'model.132': 'neck.bottom_up_layers.2.blocks.4',
+    'model.133': 'neck.bottom_up_layers.2.blocks.5',
+    'model.135': 'neck.bottom_up_layers.2.final_conv',
+    'model.136': 'bbox_head.head_module.main_convs_pred.0.0',
+    'model.137': 'bbox_head.head_module.main_convs_pred.1.0',
+    'model.138': 'bbox_head.head_module.main_convs_pred.2.0',
+    'model.139': 'bbox_head.head_module.main_convs_pred.3.0',
+
+    # head
+    'model.140.m.0': 'bbox_head.head_module.main_convs_pred.0.2',
+    'model.140.m.1': 'bbox_head.head_module.main_convs_pred.1.2',
+    'model.140.m.2': 'bbox_head.head_module.main_convs_pred.2.2',
+    'model.140.m.3': 'bbox_head.head_module.main_convs_pred.3.2'
+}
+
+convert_dict_e2e = {
+    # stem
+    'model.1': 'backbone.stem.conv',
+
+    # stage1
+    'model.2.cv1': 'backbone.stage1.0.stride_conv_branches.0',
+    'model.2.cv2': 'backbone.stage1.0.stride_conv_branches.1',
+    'model.2.cv3': 'backbone.stage1.0.maxpool_branches.1',
+
+    # E-ELANBlock
+    'model.3': 'backbone.stage1.1.e_elan_blocks.0.short_conv',
+    'model.4': 'backbone.stage1.1.e_elan_blocks.0.main_conv',
+    'model.5': 'backbone.stage1.1.e_elan_blocks.0.blocks.0.0',
+    'model.6': 'backbone.stage1.1.e_elan_blocks.0.blocks.0.1',
+    'model.7': 'backbone.stage1.1.e_elan_blocks.0.blocks.1.0',
+    'model.8': 'backbone.stage1.1.e_elan_blocks.0.blocks.1.1',
+    'model.9': 'backbone.stage1.1.e_elan_blocks.0.blocks.2.0',
+    'model.10': 'backbone.stage1.1.e_elan_blocks.0.blocks.2.1',
+    'model.12': 'backbone.stage1.1.e_elan_blocks.0.final_conv',
+    'model.13': 'backbone.stage1.1.e_elan_blocks.1.short_conv',
+    'model.14': 'backbone.stage1.1.e_elan_blocks.1.main_conv',
+    'model.15': 'backbone.stage1.1.e_elan_blocks.1.blocks.0.0',
+    'model.16': 'backbone.stage1.1.e_elan_blocks.1.blocks.0.1',
+    'model.17': 'backbone.stage1.1.e_elan_blocks.1.blocks.1.0',
+    'model.18': 'backbone.stage1.1.e_elan_blocks.1.blocks.1.1',
+    'model.19': 'backbone.stage1.1.e_elan_blocks.1.blocks.2.0',
+    'model.20': 'backbone.stage1.1.e_elan_blocks.1.blocks.2.1',
+    'model.22': 'backbone.stage1.1.e_elan_blocks.1.final_conv',
+
+    # stage2
+    'model.24.cv1': 'backbone.stage2.0.stride_conv_branches.0',
+    'model.24.cv2': 'backbone.stage2.0.stride_conv_branches.1',
+    'model.24.cv3': 'backbone.stage2.0.maxpool_branches.1',
+
+    # E-ELANBlock
+    'model.25': 'backbone.stage2.1.e_elan_blocks.0.short_conv',
+    'model.26': 'backbone.stage2.1.e_elan_blocks.0.main_conv',
+    'model.27': 'backbone.stage2.1.e_elan_blocks.0.blocks.0.0',
+    'model.28': 'backbone.stage2.1.e_elan_blocks.0.blocks.0.1',
+    'model.29': 'backbone.stage2.1.e_elan_blocks.0.blocks.1.0',
+    'model.30': 'backbone.stage2.1.e_elan_blocks.0.blocks.1.1',
+    'model.31': 'backbone.stage2.1.e_elan_blocks.0.blocks.2.0',
+    'model.32': 'backbone.stage2.1.e_elan_blocks.0.blocks.2.1',
+    'model.34': 'backbone.stage2.1.e_elan_blocks.0.final_conv',
+    'model.35': 'backbone.stage2.1.e_elan_blocks.1.short_conv',
+    'model.36': 'backbone.stage2.1.e_elan_blocks.1.main_conv',
+    'model.37': 'backbone.stage2.1.e_elan_blocks.1.blocks.0.0',
+    'model.38': 'backbone.stage2.1.e_elan_blocks.1.blocks.0.1',
+    'model.39': 'backbone.stage2.1.e_elan_blocks.1.blocks.1.0',
+    'model.40': 'backbone.stage2.1.e_elan_blocks.1.blocks.1.1',
+    'model.41': 'backbone.stage2.1.e_elan_blocks.1.blocks.2.0',
+    'model.42': 'backbone.stage2.1.e_elan_blocks.1.blocks.2.1',
+    'model.44': 'backbone.stage2.1.e_elan_blocks.1.final_conv',
+
+    # stage3
+    'model.46.cv1': 'backbone.stage3.0.stride_conv_branches.0',
+    'model.46.cv2': 'backbone.stage3.0.stride_conv_branches.1',
+    'model.46.cv3': 'backbone.stage3.0.maxpool_branches.1',
+
+    # E-ELANBlock
+    'model.47': 'backbone.stage3.1.e_elan_blocks.0.short_conv',
+    'model.48': 'backbone.stage3.1.e_elan_blocks.0.main_conv',
+    'model.49': 'backbone.stage3.1.e_elan_blocks.0.blocks.0.0',
+    'model.50': 'backbone.stage3.1.e_elan_blocks.0.blocks.0.1',
+    'model.51': 'backbone.stage3.1.e_elan_blocks.0.blocks.1.0',
+    'model.52': 'backbone.stage3.1.e_elan_blocks.0.blocks.1.1',
+    'model.53': 'backbone.stage3.1.e_elan_blocks.0.blocks.2.0',
+    'model.54': 'backbone.stage3.1.e_elan_blocks.0.blocks.2.1',
+    'model.56': 'backbone.stage3.1.e_elan_blocks.0.final_conv',
+    'model.57': 'backbone.stage3.1.e_elan_blocks.1.short_conv',
+    'model.58': 'backbone.stage3.1.e_elan_blocks.1.main_conv',
+    'model.59': 'backbone.stage3.1.e_elan_blocks.1.blocks.0.0',
+    'model.60': 'backbone.stage3.1.e_elan_blocks.1.blocks.0.1',
+    'model.61': 'backbone.stage3.1.e_elan_blocks.1.blocks.1.0',
+    'model.62': 'backbone.stage3.1.e_elan_blocks.1.blocks.1.1',
+    'model.63': 'backbone.stage3.1.e_elan_blocks.1.blocks.2.0',
+    'model.64': 'backbone.stage3.1.e_elan_blocks.1.blocks.2.1',
+    'model.66': 'backbone.stage3.1.e_elan_blocks.1.final_conv',
+
+    # stage4
+    'model.68.cv1': 'backbone.stage4.0.stride_conv_branches.0',
+    'model.68.cv2': 'backbone.stage4.0.stride_conv_branches.1',
+    'model.68.cv3': 'backbone.stage4.0.maxpool_branches.1',
+
+    # E-ELANBlock
+    'model.69': 'backbone.stage4.1.e_elan_blocks.0.short_conv',
+    'model.70': 'backbone.stage4.1.e_elan_blocks.0.main_conv',
+    'model.71': 'backbone.stage4.1.e_elan_blocks.0.blocks.0.0',
+    'model.72': 'backbone.stage4.1.e_elan_blocks.0.blocks.0.1',
+    'model.73': 'backbone.stage4.1.e_elan_blocks.0.blocks.1.0',
+    'model.74': 'backbone.stage4.1.e_elan_blocks.0.blocks.1.1',
+    'model.75': 'backbone.stage4.1.e_elan_blocks.0.blocks.2.0',
+    'model.76': 'backbone.stage4.1.e_elan_blocks.0.blocks.2.1',
+    'model.78': 'backbone.stage4.1.e_elan_blocks.0.final_conv',
+    'model.79': 'backbone.stage4.1.e_elan_blocks.1.short_conv',
+    'model.80': 'backbone.stage4.1.e_elan_blocks.1.main_conv',
+    'model.81': 'backbone.stage4.1.e_elan_blocks.1.blocks.0.0',
+    'model.82': 'backbone.stage4.1.e_elan_blocks.1.blocks.0.1',
+    'model.83': 'backbone.stage4.1.e_elan_blocks.1.blocks.1.0',
+    'model.84': 'backbone.stage4.1.e_elan_blocks.1.blocks.1.1',
+    'model.85': 'backbone.stage4.1.e_elan_blocks.1.blocks.2.0',
+    'model.86': 'backbone.stage4.1.e_elan_blocks.1.blocks.2.1',
+    'model.88': 'backbone.stage4.1.e_elan_blocks.1.final_conv',
+
+    # stage5
+    'model.90.cv1': 'backbone.stage5.0.stride_conv_branches.0',
+    'model.90.cv2': 'backbone.stage5.0.stride_conv_branches.1',
+    'model.90.cv3': 'backbone.stage5.0.maxpool_branches.1',
+
+    # E-ELANBlock
+    'model.91': 'backbone.stage5.1.e_elan_blocks.0.short_conv',
+    'model.92': 'backbone.stage5.1.e_elan_blocks.0.main_conv',
+    'model.93': 'backbone.stage5.1.e_elan_blocks.0.blocks.0.0',
+    'model.94': 'backbone.stage5.1.e_elan_blocks.0.blocks.0.1',
+    'model.95': 'backbone.stage5.1.e_elan_blocks.0.blocks.1.0',
+    'model.96': 'backbone.stage5.1.e_elan_blocks.0.blocks.1.1',
+    'model.97': 'backbone.stage5.1.e_elan_blocks.0.blocks.2.0',
+    'model.98': 'backbone.stage5.1.e_elan_blocks.0.blocks.2.1',
+    'model.100': 'backbone.stage5.1.e_elan_blocks.0.final_conv',
+    'model.101': 'backbone.stage5.1.e_elan_blocks.1.short_conv',
+    'model.102': 'backbone.stage5.1.e_elan_blocks.1.main_conv',
+    'model.103': 'backbone.stage5.1.e_elan_blocks.1.blocks.0.0',
+    'model.104': 'backbone.stage5.1.e_elan_blocks.1.blocks.0.1',
+    'model.105': 'backbone.stage5.1.e_elan_blocks.1.blocks.1.0',
+    'model.106': 'backbone.stage5.1.e_elan_blocks.1.blocks.1.1',
+    'model.107': 'backbone.stage5.1.e_elan_blocks.1.blocks.2.0',
+    'model.108': 'backbone.stage5.1.e_elan_blocks.1.blocks.2.1',
+    'model.110': 'backbone.stage5.1.e_elan_blocks.1.final_conv',
+
+    # neck SPPCSPBlock
+    'model.112.cv1': 'neck.reduce_layers.3.main_layers.0',
+    'model.112.cv3': 'neck.reduce_layers.3.main_layers.1',
+    'model.112.cv4': 'neck.reduce_layers.3.main_layers.2',
+    'model.112.cv5': 'neck.reduce_layers.3.fuse_layers.0',
+    'model.112.cv6': 'neck.reduce_layers.3.fuse_layers.1',
+    'model.112.cv2': 'neck.reduce_layers.3.short_layer',
+    'model.112.cv7': 'neck.reduce_layers.3.final_conv',
+
+    # neck
+    'model.113': 'neck.upsample_layers.0.0',
+    'model.115': 'neck.reduce_layers.2',
+
+    # neck E-ELANBlock
+    'model.117': 'neck.top_down_layers.0.e_elan_blocks.0.short_conv',
+    'model.118': 'neck.top_down_layers.0.e_elan_blocks.0.main_conv',
+    'model.119': 'neck.top_down_layers.0.e_elan_blocks.0.blocks.0',
+    'model.120': 'neck.top_down_layers.0.e_elan_blocks.0.blocks.1',
+    'model.121': 'neck.top_down_layers.0.e_elan_blocks.0.blocks.2',
+    'model.122': 'neck.top_down_layers.0.e_elan_blocks.0.blocks.3',
+    'model.123': 'neck.top_down_layers.0.e_elan_blocks.0.blocks.4',
+    'model.124': 'neck.top_down_layers.0.e_elan_blocks.0.blocks.5',
+    'model.126': 'neck.top_down_layers.0.e_elan_blocks.0.final_conv',
+    'model.127': 'neck.top_down_layers.0.e_elan_blocks.1.short_conv',
+    'model.128': 'neck.top_down_layers.0.e_elan_blocks.1.main_conv',
+    'model.129': 'neck.top_down_layers.0.e_elan_blocks.1.blocks.0',
+    'model.130': 'neck.top_down_layers.0.e_elan_blocks.1.blocks.1',
+    'model.131': 'neck.top_down_layers.0.e_elan_blocks.1.blocks.2',
+    'model.132': 'neck.top_down_layers.0.e_elan_blocks.1.blocks.3',
+    'model.133': 'neck.top_down_layers.0.e_elan_blocks.1.blocks.4',
+    'model.134': 'neck.top_down_layers.0.e_elan_blocks.1.blocks.5',
+    'model.136': 'neck.top_down_layers.0.e_elan_blocks.1.final_conv',
+    'model.138': 'neck.upsample_layers.1.0',
+    'model.140': 'neck.reduce_layers.1',
+
+    # neck E-ELANBlock
+    'model.142': 'neck.top_down_layers.1.e_elan_blocks.0.short_conv',
+    'model.143': 'neck.top_down_layers.1.e_elan_blocks.0.main_conv',
+    'model.144': 'neck.top_down_layers.1.e_elan_blocks.0.blocks.0',
+    'model.145': 'neck.top_down_layers.1.e_elan_blocks.0.blocks.1',
+    'model.146': 'neck.top_down_layers.1.e_elan_blocks.0.blocks.2',
+    'model.147': 'neck.top_down_layers.1.e_elan_blocks.0.blocks.3',
+    'model.148': 'neck.top_down_layers.1.e_elan_blocks.0.blocks.4',
+    'model.149': 'neck.top_down_layers.1.e_elan_blocks.0.blocks.5',
+    'model.151': 'neck.top_down_layers.1.e_elan_blocks.0.final_conv',
+    'model.152': 'neck.top_down_layers.1.e_elan_blocks.1.short_conv',
+    'model.153': 'neck.top_down_layers.1.e_elan_blocks.1.main_conv',
+    'model.154': 'neck.top_down_layers.1.e_elan_blocks.1.blocks.0',
+    'model.155': 'neck.top_down_layers.1.e_elan_blocks.1.blocks.1',
+    'model.156': 'neck.top_down_layers.1.e_elan_blocks.1.blocks.2',
+    'model.157': 'neck.top_down_layers.1.e_elan_blocks.1.blocks.3',
+    'model.158': 'neck.top_down_layers.1.e_elan_blocks.1.blocks.4',
+    'model.159': 'neck.top_down_layers.1.e_elan_blocks.1.blocks.5',
+    'model.161': 'neck.top_down_layers.1.e_elan_blocks.1.final_conv',
+    'model.163': 'neck.upsample_layers.2.0',
+    'model.165': 'neck.reduce_layers.0',
+    'model.167': 'neck.top_down_layers.2.e_elan_blocks.0.short_conv',
+    'model.168': 'neck.top_down_layers.2.e_elan_blocks.0.main_conv',
+    'model.169': 'neck.top_down_layers.2.e_elan_blocks.0.blocks.0',
+    'model.170': 'neck.top_down_layers.2.e_elan_blocks.0.blocks.1',
+    'model.171': 'neck.top_down_layers.2.e_elan_blocks.0.blocks.2',
+    'model.172': 'neck.top_down_layers.2.e_elan_blocks.0.blocks.3',
+    'model.173': 'neck.top_down_layers.2.e_elan_blocks.0.blocks.4',
+    'model.174': 'neck.top_down_layers.2.e_elan_blocks.0.blocks.5',
+    'model.176': 'neck.top_down_layers.2.e_elan_blocks.0.final_conv',
+    'model.177': 'neck.top_down_layers.2.e_elan_blocks.1.short_conv',
+    'model.178': 'neck.top_down_layers.2.e_elan_blocks.1.main_conv',
+    'model.179': 'neck.top_down_layers.2.e_elan_blocks.1.blocks.0',
+    'model.180': 'neck.top_down_layers.2.e_elan_blocks.1.blocks.1',
+    'model.181': 'neck.top_down_layers.2.e_elan_blocks.1.blocks.2',
+    'model.182': 'neck.top_down_layers.2.e_elan_blocks.1.blocks.3',
+    'model.183': 'neck.top_down_layers.2.e_elan_blocks.1.blocks.4',
+    'model.184': 'neck.top_down_layers.2.e_elan_blocks.1.blocks.5',
+    'model.186': 'neck.top_down_layers.2.e_elan_blocks.1.final_conv',
+    'model.188.cv1': 'neck.downsample_layers.0.stride_conv_branches.0',
+    'model.188.cv2': 'neck.downsample_layers.0.stride_conv_branches.1',
+    'model.188.cv3': 'neck.downsample_layers.0.maxpool_branches.1',
+
+    # neck E-ELANBlock
+    'model.190': 'neck.bottom_up_layers.0.e_elan_blocks.0.short_conv',
+    'model.191': 'neck.bottom_up_layers.0.e_elan_blocks.0.main_conv',
+    'model.192': 'neck.bottom_up_layers.0.e_elan_blocks.0.blocks.0',
+    'model.193': 'neck.bottom_up_layers.0.e_elan_blocks.0.blocks.1',
+    'model.194': 'neck.bottom_up_layers.0.e_elan_blocks.0.blocks.2',
+    'model.195': 'neck.bottom_up_layers.0.e_elan_blocks.0.blocks.3',
+    'model.196': 'neck.bottom_up_layers.0.e_elan_blocks.0.blocks.4',
+    'model.197': 'neck.bottom_up_layers.0.e_elan_blocks.0.blocks.5',
+    'model.199': 'neck.bottom_up_layers.0.e_elan_blocks.0.final_conv',
+    'model.200': 'neck.bottom_up_layers.0.e_elan_blocks.1.short_conv',
+    'model.201': 'neck.bottom_up_layers.0.e_elan_blocks.1.main_conv',
+    'model.202': 'neck.bottom_up_layers.0.e_elan_blocks.1.blocks.0',
+    'model.203': 'neck.bottom_up_layers.0.e_elan_blocks.1.blocks.1',
+    'model.204': 'neck.bottom_up_layers.0.e_elan_blocks.1.blocks.2',
+    'model.205': 'neck.bottom_up_layers.0.e_elan_blocks.1.blocks.3',
+    'model.206': 'neck.bottom_up_layers.0.e_elan_blocks.1.blocks.4',
+    'model.207': 'neck.bottom_up_layers.0.e_elan_blocks.1.blocks.5',
+    'model.209': 'neck.bottom_up_layers.0.e_elan_blocks.1.final_conv',
+    'model.211.cv1': 'neck.downsample_layers.1.stride_conv_branches.0',
+    'model.211.cv2': 'neck.downsample_layers.1.stride_conv_branches.1',
+    'model.211.cv3': 'neck.downsample_layers.1.maxpool_branches.1',
+    'model.213': 'neck.bottom_up_layers.1.e_elan_blocks.0.short_conv',
+    'model.214': 'neck.bottom_up_layers.1.e_elan_blocks.0.main_conv',
+    'model.215': 'neck.bottom_up_layers.1.e_elan_blocks.0.blocks.0',
+    'model.216': 'neck.bottom_up_layers.1.e_elan_blocks.0.blocks.1',
+    'model.217': 'neck.bottom_up_layers.1.e_elan_blocks.0.blocks.2',
+    'model.218': 'neck.bottom_up_layers.1.e_elan_blocks.0.blocks.3',
+    'model.219': 'neck.bottom_up_layers.1.e_elan_blocks.0.blocks.4',
+    'model.220': 'neck.bottom_up_layers.1.e_elan_blocks.0.blocks.5',
+    'model.222': 'neck.bottom_up_layers.1.e_elan_blocks.0.final_conv',
+    'model.223': 'neck.bottom_up_layers.1.e_elan_blocks.1.short_conv',
+    'model.224': 'neck.bottom_up_layers.1.e_elan_blocks.1.main_conv',
+    'model.225': 'neck.bottom_up_layers.1.e_elan_blocks.1.blocks.0',
+    'model.226': 'neck.bottom_up_layers.1.e_elan_blocks.1.blocks.1',
+    'model.227': 'neck.bottom_up_layers.1.e_elan_blocks.1.blocks.2',
+    'model.228': 'neck.bottom_up_layers.1.e_elan_blocks.1.blocks.3',
+    'model.229': 'neck.bottom_up_layers.1.e_elan_blocks.1.blocks.4',
+    'model.230': 'neck.bottom_up_layers.1.e_elan_blocks.1.blocks.5',
+    'model.232': 'neck.bottom_up_layers.1.e_elan_blocks.1.final_conv',
+    'model.234.cv1': 'neck.downsample_layers.2.stride_conv_branches.0',
+    'model.234.cv2': 'neck.downsample_layers.2.stride_conv_branches.1',
+    'model.234.cv3': 'neck.downsample_layers.2.maxpool_branches.1',
+
+    # neck E-ELANBlock
+    'model.236': 'neck.bottom_up_layers.2.e_elan_blocks.0.short_conv',
+    'model.237': 'neck.bottom_up_layers.2.e_elan_blocks.0.main_conv',
+    'model.238': 'neck.bottom_up_layers.2.e_elan_blocks.0.blocks.0',
+    'model.239': 'neck.bottom_up_layers.2.e_elan_blocks.0.blocks.1',
+    'model.240': 'neck.bottom_up_layers.2.e_elan_blocks.0.blocks.2',
+    'model.241': 'neck.bottom_up_layers.2.e_elan_blocks.0.blocks.3',
+    'model.242': 'neck.bottom_up_layers.2.e_elan_blocks.0.blocks.4',
+    'model.243': 'neck.bottom_up_layers.2.e_elan_blocks.0.blocks.5',
+    'model.245': 'neck.bottom_up_layers.2.e_elan_blocks.0.final_conv',
+    'model.246': 'neck.bottom_up_layers.2.e_elan_blocks.1.short_conv',
+    'model.247': 'neck.bottom_up_layers.2.e_elan_blocks.1.main_conv',
+    'model.248': 'neck.bottom_up_layers.2.e_elan_blocks.1.blocks.0',
+    'model.249': 'neck.bottom_up_layers.2.e_elan_blocks.1.blocks.1',
+    'model.250': 'neck.bottom_up_layers.2.e_elan_blocks.1.blocks.2',
+    'model.251': 'neck.bottom_up_layers.2.e_elan_blocks.1.blocks.3',
+    'model.252': 'neck.bottom_up_layers.2.e_elan_blocks.1.blocks.4',
+    'model.253': 'neck.bottom_up_layers.2.e_elan_blocks.1.blocks.5',
+    'model.255': 'neck.bottom_up_layers.2.e_elan_blocks.1.final_conv',
+    'model.257': 'bbox_head.head_module.main_convs_pred.0.0',
+    'model.258': 'bbox_head.head_module.main_convs_pred.1.0',
+    'model.259': 'bbox_head.head_module.main_convs_pred.2.0',
+    'model.260': 'bbox_head.head_module.main_convs_pred.3.0',
+
+    # head
+    'model.261.m.0': 'bbox_head.head_module.main_convs_pred.0.2',
+    'model.261.m.1': 'bbox_head.head_module.main_convs_pred.1.2',
+    'model.261.m.2': 'bbox_head.head_module.main_convs_pred.2.2',
+    'model.261.m.3': 'bbox_head.head_module.main_convs_pred.3.2'
+}
+
+convert_dicts = {
+    'yolov7-tiny.pt': convert_dict_tiny,
+    'yolov7-w6.pt': convert_dict_w,
+    'yolov7-e6.pt': convert_dict_e,
+    'yolov7-e6e.pt': convert_dict_e2e,
+    'yolov7.pt': convert_dict_l,
+    'yolov7x.pt': convert_dict_x
+}
+
+
+def convert(src, dst):
+    src_key = osp.basename(src)
+    convert_dict = convert_dicts[osp.basename(src)]
+
+    num_levels = 3
+    if src_key == 'yolov7.pt':
+        indexes = [102, 51]
+        in_channels = [256, 512, 1024]
+    elif src_key == 'yolov7x.pt':
+        indexes = [121, 59]
+        in_channels = [320, 640, 1280]
+    elif src_key == 'yolov7-tiny.pt':
+        indexes = [77, 1000]
+        in_channels = [128, 256, 512]
+    elif src_key == 'yolov7-w6.pt':
+        indexes = [118, 47]
+        in_channels = [256, 512, 768, 1024]
+        num_levels = 4
+    elif src_key == 'yolov7-e6.pt':
+        indexes = [140, [2, 13, 24, 35, 46, 57, 100, 112, 124]]
+        in_channels = 320, 640, 960, 1280
+        num_levels = 4
+    elif src_key == 'yolov7-e6e.pt':
+        indexes = [261, [2, 24, 46, 68, 90, 112, 188, 211, 234]]
+        in_channels = 320, 640, 960, 1280
+        num_levels = 4
+
+    if isinstance(indexes[1], int):
+        indexes[1] = [indexes[1]]
+    """Convert keys in detectron pretrained YOLOv7 models to mmyolo style."""
+    try:
+        yolov7_model = torch.load(src)['model'].float()
+        blobs = yolov7_model.state_dict()
+    except ModuleNotFoundError:
+        raise RuntimeError(
+            'This script must be placed under the WongKinYiu/yolov7 repo,'
+            ' because loading the official pretrained model need'
+            ' `model.py` to build model.')
+    state_dict = OrderedDict()
+
+    for key, weight in blobs.items():
+        if key.find('anchors') >= 0 or key.find('anchor_grid') >= 0:
+            continue
+
+        num, module = key.split('.')[1:3]
+        if int(num) < indexes[0] and int(num) not in indexes[1]:
+            prefix = f'model.{num}'
+            new_key = key.replace(prefix, convert_dict[prefix])
+            state_dict[new_key] = weight
+            print(f'Convert {key} to {new_key}')
+        elif int(num) in indexes[1]:
+            strs_key = key.split('.')[:3]
+            new_key = key.replace('.'.join(strs_key),
+                                  convert_dict['.'.join(strs_key)])
+            state_dict[new_key] = weight
+            print(f'Convert {key} to {new_key}')
+        else:
+            strs_key = key.split('.')[:4]
+            new_key = key.replace('.'.join(strs_key),
+                                  convert_dict['.'.join(strs_key)])
+            state_dict[new_key] = weight
+            print(f'Convert {key} to {new_key}')
+
+    # Add ImplicitA and ImplicitM
+    for i in range(num_levels):
+        if num_levels == 3:
+            implicit_a = f'bbox_head.head_module.' \
+                         f'convs_pred.{i}.0.implicit'
+            state_dict[implicit_a] = torch.zeros((1, in_channels[i], 1, 1))
+            implicit_m = f'bbox_head.head_module.' \
+                         f'convs_pred.{i}.2.implicit'
+            state_dict[implicit_m] = torch.ones((1, 3 * 85, 1, 1))
+        else:
+            implicit_a = f'bbox_head.head_module.' \
+                         f'main_convs_pred.{i}.1.implicit'
+            state_dict[implicit_a] = torch.zeros((1, in_channels[i], 1, 1))
+            implicit_m = f'bbox_head.head_module.' \
+                         f'main_convs_pred.{i}.3.implicit'
+            state_dict[implicit_m] = torch.ones((1, 3 * 85, 1, 1))
+
+    # save checkpoint
+    checkpoint = dict()
+    checkpoint['state_dict'] = state_dict
+    torch.save(checkpoint, dst)
+
+
+# Note: This script must be placed under the yolov7 repo to run.
+def main():
+    parser = argparse.ArgumentParser(description='Convert model keys')
+    parser.add_argument(
+        'src', default='yolov7.pt', help='src yolov7 model path')
+    parser.add_argument('dst', default='mm_yolov7l.pt', help='save path')
+    args = parser.parse_args()
+    convert(args.src, args.dst)
+    print('If your model weights are from P6 models, such as W6, E6, D6, \
+            E6E, the auxiliary training module is not required to be loaded, \
+            so it is normal for the weights of the auxiliary module \
+            to be missing.')
+
+
+if __name__ == '__main__':
+    main()
diff --git a/mmdetection_practice/third_party/mmyolo/tools/model_converters/yolov8_to_mmyolo.py b/mmdetection_practice/third_party/mmyolo/tools/model_converters/yolov8_to_mmyolo.py
new file mode 100644
index 0000000..4ed64f2
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tools/model_converters/yolov8_to_mmyolo.py
@@ -0,0 +1,102 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+import argparse
+from collections import OrderedDict
+
+import torch
+
+convert_dict_s = {
+    # backbone
+    'model.0': 'backbone.stem',
+    'model.1': 'backbone.stage1.0',
+    'model.2': 'backbone.stage1.1',
+    'model.3': 'backbone.stage2.0',
+    'model.4': 'backbone.stage2.1',
+    'model.5': 'backbone.stage3.0',
+    'model.6': 'backbone.stage3.1',
+    'model.7': 'backbone.stage4.0',
+    'model.8': 'backbone.stage4.1',
+    'model.9': 'backbone.stage4.2',
+
+    # neck
+    'model.12': 'neck.top_down_layers.0',
+    'model.15': 'neck.top_down_layers.1',
+    'model.16': 'neck.downsample_layers.0',
+    'model.18': 'neck.bottom_up_layers.0',
+    'model.19': 'neck.downsample_layers.1',
+    'model.21': 'neck.bottom_up_layers.1',
+
+    # Detector
+    'model.22': 'bbox_head.head_module',
+}
+
+
+def convert(src, dst):
+    """Convert keys in pretrained YOLOv8 models to mmyolo style."""
+    convert_dict = convert_dict_s
+
+    try:
+        yolov8_model = torch.load(src)['model']
+        blobs = yolov8_model.state_dict()
+    except ModuleNotFoundError:
+        raise RuntimeError(
+            'This script must be placed under the ultralytics repo,'
+            ' because loading the official pretrained model need'
+            ' `model.py` to build model.'
+            'Also need to install hydra-core>=1.2.0 and thop>=0.1.1')
+    state_dict = OrderedDict()
+
+    for key, weight in blobs.items():
+        num, module = key.split('.')[1:3]
+        prefix = f'model.{num}'
+        new_key = key.replace(prefix, convert_dict[prefix])
+
+        if '.m.' in new_key:
+            new_key = new_key.replace('.m.', '.blocks.')
+            new_key = new_key.replace('.cv', '.conv')
+        elif 'bbox_head.head_module.proto.cv' in new_key:
+            new_key = new_key.replace(
+                'bbox_head.head_module.proto.cv',
+                'bbox_head.head_module.proto_preds.conv')
+        elif 'bbox_head.head_module.proto' in new_key:
+            new_key = new_key.replace('bbox_head.head_module.proto',
+                                      'bbox_head.head_module.proto_preds')
+        elif 'bbox_head.head_module.cv4.' in new_key:
+            new_key = new_key.replace(
+                'bbox_head.head_module.cv4',
+                'bbox_head.head_module.mask_coeff_preds')
+            new_key = new_key.replace('.2.weight', '.2.conv.weight')
+            new_key = new_key.replace('.2.bias', '.2.conv.bias')
+        elif 'bbox_head.head_module' in new_key:
+            new_key = new_key.replace('.cv2', '.reg_preds')
+            new_key = new_key.replace('.cv3', '.cls_preds')
+        elif 'backbone.stage4.2' in new_key:
+            new_key = new_key.replace('.cv', '.conv')
+        else:
+            new_key = new_key.replace('.cv1', '.main_conv')
+            new_key = new_key.replace('.cv2', '.final_conv')
+
+        if 'bbox_head.head_module.dfl.conv.weight' == new_key:
+            print('Drop "bbox_head.head_module.dfl.conv.weight", '
+                  'because it is useless')
+            continue
+        state_dict[new_key] = weight
+        print(f'Convert {key} to {new_key}')
+
+    # save checkpoint
+    checkpoint = dict()
+    checkpoint['state_dict'] = state_dict
+    torch.save(checkpoint, dst)
+
+
+# Note: This script must be placed under the ultralytics repo to run.
+def main():
+    parser = argparse.ArgumentParser(description='Convert model keys')
+    parser.add_argument(
+        '--src', default='yolov8s.pt', help='src YOLOv8 model path')
+    parser.add_argument('--dst', default='mmyolov8s.pth', help='save path')
+    args = parser.parse_args()
+    convert(args.src, args.dst)
+
+
+if __name__ == '__main__':
+    main()
diff --git a/mmdetection_practice/third_party/mmyolo/tools/model_converters/yolox_to_mmyolo.py b/mmdetection_practice/third_party/mmyolo/tools/model_converters/yolox_to_mmyolo.py
new file mode 100644
index 0000000..5fcc735
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tools/model_converters/yolox_to_mmyolo.py
@@ -0,0 +1,110 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+import argparse
+from collections import OrderedDict
+
+import torch
+
+neck_dict = {
+    'backbone.lateral_conv0': 'neck.reduce_layers.2',
+    'backbone.C3_p4.conv': 'neck.top_down_layers.0.0.cv',
+    'backbone.C3_p4.m.0.': 'neck.top_down_layers.0.0.m.0.',
+    'backbone.reduce_conv1': 'neck.top_down_layers.0.1',
+    'backbone.C3_p3.conv': 'neck.top_down_layers.1.cv',
+    'backbone.C3_p3.m.0.': 'neck.top_down_layers.1.m.0.',
+    'backbone.bu_conv2': 'neck.downsample_layers.0',
+    'backbone.C3_n3.conv': 'neck.bottom_up_layers.0.cv',
+    'backbone.C3_n3.m.0.': 'neck.bottom_up_layers.0.m.0.',
+    'backbone.bu_conv1': 'neck.downsample_layers.1',
+    'backbone.C3_n4.conv': 'neck.bottom_up_layers.1.cv',
+    'backbone.C3_n4.m.0.': 'neck.bottom_up_layers.1.m.0.',
+}
+
+
+def convert_stem(model_key, model_weight, state_dict, converted_names):
+    new_key = model_key[9:]
+    state_dict[new_key] = model_weight
+    converted_names.add(model_key)
+    print(f'Convert {model_key} to {new_key}')
+
+
+def convert_backbone(model_key, model_weight, state_dict, converted_names):
+    new_key = model_key.replace('backbone.dark', 'stage')
+    num = int(new_key[14]) - 1
+    new_key = new_key[:14] + str(num) + new_key[15:]
+    if '.m.' in model_key:
+        new_key = new_key.replace('.m.', '.blocks.')
+    elif not new_key[16] == '0' and 'stage4.1' not in new_key:
+        new_key = new_key.replace('conv1', 'main_conv')
+        new_key = new_key.replace('conv2', 'short_conv')
+        new_key = new_key.replace('conv3', 'final_conv')
+    state_dict[new_key] = model_weight
+    converted_names.add(model_key)
+    print(f'Convert {model_key} to {new_key}')
+
+
+def convert_neck(model_key, model_weight, state_dict, converted_names):
+    for old, new in neck_dict.items():
+        if old in model_key:
+            new_key = model_key.replace(old, new)
+    if '.m.' in model_key:
+        new_key = new_key.replace('.m.', '.blocks.')
+    elif '.C' in model_key:
+        new_key = new_key.replace('cv1', 'main_conv')
+        new_key = new_key.replace('cv2', 'short_conv')
+        new_key = new_key.replace('cv3', 'final_conv')
+    state_dict[new_key] = model_weight
+    converted_names.add(model_key)
+    print(f'Convert {model_key} to {new_key}')
+
+
+def convert_head(model_key, model_weight, state_dict, converted_names):
+    if 'stem' in model_key:
+        new_key = model_key.replace('head.stem', 'neck.out_layer')
+    elif 'cls_convs' in model_key:
+        new_key = model_key.replace(
+            'head.cls_convs', 'bbox_head.head_module.multi_level_cls_convs')
+    elif 'reg_convs' in model_key:
+        new_key = model_key.replace(
+            'head.reg_convs', 'bbox_head.head_module.multi_level_reg_convs')
+    elif 'preds' in model_key:
+        new_key = model_key.replace('head.',
+                                    'bbox_head.head_module.multi_level_conv_')
+        new_key = new_key.replace('_preds', '')
+    state_dict[new_key] = model_weight
+    converted_names.add(model_key)
+    print(f'Convert {model_key} to {new_key}')
+
+
+def convert(src, dst):
+    """Convert keys in detectron pretrained YOLOX models to mmyolo style."""
+    blobs = torch.load(src)['model']
+    state_dict = OrderedDict()
+    converted_names = set()
+
+    for key, weight in blobs.items():
+        if 'backbone.stem' in key:
+            convert_stem(key, weight, state_dict, converted_names)
+        elif 'backbone.backbone' in key:
+            convert_backbone(key, weight, state_dict, converted_names)
+        elif 'backbone.neck' not in key and 'head' not in key:
+            convert_neck(key, weight, state_dict, converted_names)
+        elif 'head' in key:
+            convert_head(key, weight, state_dict, converted_names)
+
+    # save checkpoint
+    checkpoint = dict()
+    checkpoint['state_dict'] = state_dict
+    torch.save(checkpoint, dst)
+
+
+def main():
+    parser = argparse.ArgumentParser(description='Convert model keys')
+    parser.add_argument(
+        '--src', default='yolox_s.pth', help='src yolox model path')
+    parser.add_argument('--dst', default='mmyoloxs.pt', help='save path')
+    args = parser.parse_args()
+    convert(args.src, args.dst)
+
+
+if __name__ == '__main__':
+    main()
diff --git a/mmdetection_practice/third_party/mmyolo/tools/slurm_test.sh b/mmdetection_practice/third_party/mmyolo/tools/slurm_test.sh
new file mode 100755
index 0000000..6dd67e5
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tools/slurm_test.sh
@@ -0,0 +1,24 @@
+#!/usr/bin/env bash
+
+set -x
+
+PARTITION=$1
+JOB_NAME=$2
+CONFIG=$3
+CHECKPOINT=$4
+GPUS=${GPUS:-8}
+GPUS_PER_NODE=${GPUS_PER_NODE:-8}
+CPUS_PER_TASK=${CPUS_PER_TASK:-5}
+PY_ARGS=${@:5}
+SRUN_ARGS=${SRUN_ARGS:-""}
+
+PYTHONPATH="$(dirname $0)/..":$PYTHONPATH \
+srun -p ${PARTITION} \
+    --job-name=${JOB_NAME} \
+    --gres=gpu:${GPUS_PER_NODE} \
+    --ntasks=${GPUS} \
+    --ntasks-per-node=${GPUS_PER_NODE} \
+    --cpus-per-task=${CPUS_PER_TASK} \
+    --kill-on-bad-exit=1 \
+    ${SRUN_ARGS} \
+    python -u tools/test.py ${CONFIG} ${CHECKPOINT} --launcher="slurm" ${PY_ARGS}
diff --git a/mmdetection_practice/third_party/mmyolo/tools/slurm_train.sh b/mmdetection_practice/third_party/mmyolo/tools/slurm_train.sh
new file mode 100755
index 0000000..b3feb3d
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tools/slurm_train.sh
@@ -0,0 +1,24 @@
+#!/usr/bin/env bash
+
+set -x
+
+PARTITION=$1
+JOB_NAME=$2
+CONFIG=$3
+WORK_DIR=$4
+GPUS=${GPUS:-8}
+GPUS_PER_NODE=${GPUS_PER_NODE:-8}
+CPUS_PER_TASK=${CPUS_PER_TASK:-5}
+SRUN_ARGS=${SRUN_ARGS:-""}
+PY_ARGS=${@:5}
+
+PYTHONPATH="$(dirname $0)/..":$PYTHONPATH \
+srun -p ${PARTITION} \
+    --job-name=${JOB_NAME} \
+    --gres=gpu:${GPUS_PER_NODE} \
+    --ntasks=${GPUS} \
+    --ntasks-per-node=${GPUS_PER_NODE} \
+    --cpus-per-task=${CPUS_PER_TASK} \
+    --kill-on-bad-exit=1 \
+    ${SRUN_ARGS} \
+    python -u tools/train.py ${CONFIG} --work-dir=${WORK_DIR} --launcher="slurm" ${PY_ARGS}
diff --git a/mmdetection_practice/third_party/mmyolo/tools/test.py b/mmdetection_practice/third_party/mmyolo/tools/test.py
new file mode 100644
index 0000000..f0ac8bd
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tools/test.py
@@ -0,0 +1,158 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+import argparse
+import os
+import os.path as osp
+
+from mmdet.engine.hooks.utils import trigger_visualization_hook
+from mmdet.utils import setup_cache_size_limit_of_dynamo
+from mmengine.config import Config, ConfigDict, DictAction
+from mmengine.evaluator import DumpResults
+from mmengine.runner import Runner
+
+from mmyolo.registry import RUNNERS
+from mmyolo.utils import is_metainfo_lower
+
+
+# TODO: support fuse_conv_bn
+def parse_args():
+    parser = argparse.ArgumentParser(
+        description='MMYOLO test (and eval) a model')
+    parser.add_argument('config', help='test config file path')
+    parser.add_argument('checkpoint', help='checkpoint file')
+    parser.add_argument(
+        '--work-dir',
+        help='the directory to save the file containing evaluation metrics')
+    parser.add_argument(
+        '--out',
+        type=str,
+        help='output result file (must be a .pkl file) in pickle format')
+    parser.add_argument(
+        '--json-prefix',
+        type=str,
+        help='the prefix of the output json file without perform evaluation, '
+        'which is useful when you want to format the result to a specific '
+        'format and submit it to the test server')
+    parser.add_argument(
+        '--tta',
+        action='store_true',
+        help='Whether to use test time augmentation')
+    parser.add_argument(
+        '--show', action='store_true', help='show prediction results')
+    parser.add_argument(
+        '--deploy',
+        action='store_true',
+        help='Switch model to deployment mode')
+    parser.add_argument(
+        '--show-dir',
+        help='directory where painted images will be saved. '
+        'If specified, it will be automatically saved '
+        'to the work_dir/timestamp/show_dir')
+    parser.add_argument(
+        '--wait-time', type=float, default=2, help='the interval of show (s)')
+    parser.add_argument(
+        '--cfg-options',
+        nargs='+',
+        action=DictAction,
+        help='override some settings in the used config, the key-value pair '
+        'in xxx=yyy format will be merged into config file. If the value to '
+        'be overwritten is a list, it should be like key="[a,b]" or key=a,b '
+        'It also allows nested list/tuple values, e.g. key="[(a,b),(c,d)]" '
+        'Note that the quotation marks are necessary and that no white space '
+        'is allowed.')
+    parser.add_argument(
+        '--launcher',
+        choices=['none', 'pytorch', 'slurm', 'mpi'],
+        default='none',
+        help='job launcher')
+    # When using PyTorch version >= 2.0.0, the `torch.distributed.launch`
+    # will pass the `--local-rank` parameter to `tools/train.py` instead
+    # of `--local_rank`.
+    parser.add_argument('--local_rank', '--local-rank', type=int, default=0)
+    args = parser.parse_args()
+    if 'LOCAL_RANK' not in os.environ:
+        os.environ['LOCAL_RANK'] = str(args.local_rank)
+    return args
+
+
+def main():
+    args = parse_args()
+
+    # Reduce the number of repeated compilations and improve
+    # training speed.
+    setup_cache_size_limit_of_dynamo()
+
+    # load config
+    cfg = Config.fromfile(args.config)
+    # replace the ${key} with the value of cfg.key
+    # cfg = replace_cfg_vals(cfg)
+    cfg.launcher = args.launcher
+    if args.cfg_options is not None:
+        cfg.merge_from_dict(args.cfg_options)
+
+    # work_dir is determined in this priority: CLI > segment in file > filename
+    if args.work_dir is not None:
+        # update configs according to CLI args if args.work_dir is not None
+        cfg.work_dir = args.work_dir
+    elif cfg.get('work_dir', None) is None:
+        # use config filename as default work_dir if cfg.work_dir is None
+        cfg.work_dir = osp.join('./work_dirs',
+                                osp.splitext(osp.basename(args.config))[0])
+
+    cfg.load_from = args.checkpoint
+
+    if args.show or args.show_dir:
+        cfg = trigger_visualization_hook(cfg, args)
+
+    if args.deploy:
+        cfg.custom_hooks.append(dict(type='SwitchToDeployHook'))
+
+    # add `format_only` and `outfile_prefix` into cfg
+    if args.json_prefix is not None:
+        cfg_json = {
+            'test_evaluator.format_only': True,
+            'test_evaluator.outfile_prefix': args.json_prefix
+        }
+        cfg.merge_from_dict(cfg_json)
+
+    # Determine whether the custom metainfo fields are all lowercase
+    is_metainfo_lower(cfg)
+
+    if args.tta:
+        assert 'tta_model' in cfg, 'Cannot find ``tta_model`` in config.' \
+                                   " Can't use tta !"
+        assert 'tta_pipeline' in cfg, 'Cannot find ``tta_pipeline`` ' \
+                                      "in config. Can't use tta !"
+
+        cfg.model = ConfigDict(**cfg.tta_model, module=cfg.model)
+        test_data_cfg = cfg.test_dataloader.dataset
+        while 'dataset' in test_data_cfg:
+            test_data_cfg = test_data_cfg['dataset']
+
+        # batch_shapes_cfg will force control the size of the output image,
+        # it is not compatible with tta.
+        if 'batch_shapes_cfg' in test_data_cfg:
+            test_data_cfg.batch_shapes_cfg = None
+        test_data_cfg.pipeline = cfg.tta_pipeline
+
+    # build the runner from config
+    if 'runner_type' not in cfg:
+        # build the default runner
+        runner = Runner.from_cfg(cfg)
+    else:
+        # build customized runner from the registry
+        # if 'runner_type' is set in the cfg
+        runner = RUNNERS.build(cfg)
+
+    # add `DumpResults` dummy metric
+    if args.out is not None:
+        assert args.out.endswith(('.pkl', '.pickle')), \
+            'The dump file must be a pkl file.'
+        runner.test_evaluator.metrics.append(
+            DumpResults(out_file_path=args.out))
+
+    # start testing
+    runner.test()
+
+
+if __name__ == '__main__':
+    main()
diff --git a/mmdetection_practice/third_party/mmyolo/tools/train.py b/mmdetection_practice/third_party/mmyolo/tools/train.py
new file mode 100644
index 0000000..61f9498
--- /dev/null
+++ b/mmdetection_practice/third_party/mmyolo/tools/train.py
@@ -0,0 +1,123 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+import argparse
+import logging
+import os
+import os.path as osp
+
+from mmdet.utils import setup_cache_size_limit_of_dynamo
+from mmengine.config import Config, DictAction
+from mmengine.logging import print_log
+from mmengine.runner import Runner
+
+from mmyolo.registry import RUNNERS
+from mmyolo.utils import is_metainfo_lower
+
+
+def parse_args():
+    parser = argparse.ArgumentParser(description='Train a detector')
+    parser.add_argument('config', help='train config file path')
+    parser.add_argument('--work-dir', help='the dir to save logs and models')
+    parser.add_argument(
+        '--amp',
+        action='store_true',
+        default=False,
+        help='enable automatic-mixed-precision training')
+    parser.add_argument(
+        '--resume',
+        nargs='?',
+        type=str,
+        const='auto',
+        help='If specify checkpoint path, resume from it, while if not '
+        'specify, try to auto resume from the latest checkpoint '
+        'in the work directory.')
+    parser.add_argument(
+        '--cfg-options',
+        nargs='+',
+        action=DictAction,
+        help='override some settings in the used config, the key-value pair '
+        'in xxx=yyy format will be merged into config file. If the value to '
+        'be overwritten is a list, it should be like key="[a,b]" or key=a,b '
+        'It also allows nested list/tuple values, e.g. key="[(a,b),(c,d)]" '
+        'Note that the quotation marks are necessary and that no white space '
+        'is allowed.')
+    parser.add_argument(
+        '--launcher',
+        choices=['none', 'pytorch', 'slurm', 'mpi'],
+        default='none',
+        help='job launcher')
+    # When using PyTorch version >= 2.0.0, the `torch.distributed.launch`
+    # will pass the `--local-rank` parameter to `tools/train.py` instead
+    # of `--local_rank`.
+    parser.add_argument('--local_rank', '--local-rank', type=int, default=0)
+    args = parser.parse_args()
+    if 'LOCAL_RANK' not in os.environ:
+        os.environ['LOCAL_RANK'] = str(args.local_rank)
+
+    return args
+
+
+def main():
+    args = parse_args()
+
+    # Reduce the number of repeated compilations and improve
+    # training speed.
+    setup_cache_size_limit_of_dynamo()
+
+    # load config
+    cfg = Config.fromfile(args.config)
+    # replace the ${key} with the value of cfg.key
+    # cfg = replace_cfg_vals(cfg)
+    cfg.launcher = args.launcher
+    if args.cfg_options is not None:
+        cfg.merge_from_dict(args.cfg_options)
+
+    # work_dir is determined in this priority: CLI > segment in file > filename
+    if args.work_dir is not None:
+        # update configs according to CLI args if args.work_dir is not None
+        cfg.work_dir = args.work_dir
+    elif cfg.get('work_dir', None) is None:
+        # use config filename as default work_dir if cfg.work_dir is None
+        cfg.work_dir = osp.join('./work_dirs',
+                                osp.splitext(osp.basename(args.config))[0])
+
+    # enable automatic-mixed-precision training
+    if args.amp is True:
+        optim_wrapper = cfg.optim_wrapper.type
+        if optim_wrapper == 'AmpOptimWrapper':
+            print_log(
+                'AMP training is already enabled in your config.',
+                logger='current',
+                level=logging.WARNING)
+        else:
+            assert optim_wrapper == 'OptimWrapper', (
+                '`--amp` is only supported when the optimizer wrapper type is '
+                f'`OptimWrapper` but got {optim_wrapper}.')
+            cfg.optim_wrapper.type = 'AmpOptimWrapper'
+            cfg.optim_wrapper.loss_scale = 'dynamic'
+
+    # resume is determined in this priority: resume from > auto_resume
+    if args.resume == 'auto':
+        cfg.resume = True
+        cfg.load_from = None
+    elif args.resume is not None:
+        cfg.resume = True
+        cfg.load_from = args.resume
+
+    # Determine whether the custom metainfo fields are all lowercase
+    is_metainfo_lower(cfg)
+
+    # build the runner from config
+    if 'runner_type' not in cfg:
+        # build the default runner
+        runner = Runner.from_cfg(cfg)
+    else:
+        # build customized runner from the registry
+        # if 'runner_type' is set in the cfg
+        runner = RUNNERS.build(cfg)
+
+    # start training
+    runner.train()
+
+
+if __name__ == '__main__':
+    main()
diff --git a/mmdetection_practice/tools/benchmark.py b/mmdetection_practice/tools/benchmark.py
new file mode 100644
index 0000000..b22c628
--- /dev/null
+++ b/mmdetection_practice/tools/benchmark.py
@@ -0,0 +1,729 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+
+# python -m torch.distributed.launch --nproc_per_node=1 --master_port=29501 tools/benchmark.py configs/experiment/yolo_world_s_dual_vlpan_l2norm_2e-3_100e_8gpus_obj365v1_train_lvis_minival.py --checkpoint checkpoints/yolo_world_s_dual_vlpan_l2norm_2e-3_100e_8gpus_obj365v1_train_lvis_minival.pth --task inference --launcher pytorch
+# python -m torch.distributed.launch --nproc_per_node=1 --master_port=29501 tools/benchmark.py configs/experiment/yolo_world_s_dual_vlpan_l2norm_2e-3_100e_8gpus_obj365v1_train_lvis_minival.py --checkpoint reparameterized_checkpoints/yolo_world_s_dual_vlpan_l2norm_2e-3_100e_8gpus_obj365v1_train_lvis_minival_rep_conv.pth --task inference --launcher pytorch
+
+# python -m torch.distributed.launch --nproc_per_node=1 --master_port=29500 tools/benchmark.py configs/experiment/yolo_world_s_vlattnfusion_l2norm_8gpus_obj365v1_train_lvis_minival.py --checkpoint checkpoints/yolo_world_s_vlattnfusion_l2norm_8gpus_obj365v1_train_lvis_minival.pth --task inference --launcher pytorch
+# python -m torch.distributed.launch --nproc_per_node=1 --master_port=29501 tools/benchmark.py configs/experiment/yolo_world_s_deepfusion_l2norm_8gpus_obj365v1_train_lvis_minival.py --checkpoint checkpoints/yolo_world_s_deepfusion_l2norm_8gpus_obj365v1_train_lvis_minival.pth --task inference --launcher pytorch
+
+import argparse
+import os
+
+from mmengine import MMLogger
+from mmengine.config import Config, DictAction
+from mmengine.dist import init_dist
+from mmengine.registry import init_default_scope
+from mmengine.utils import mkdir_or_exist
+
+# Copyright (c) OpenMMLab. All rights reserved.
+import copy
+import time
+from functools import partial
+from typing import List, Optional, Union
+
+import numpy as np
+import torch
+import torch.nn as nn
+from mmcv.cnn import fuse_conv_bn
+
+# from mmcv.runner import wrap_fp16_model # TODO need update
+from mmengine.runner.amp import autocast
+
+from mmengine import MMLogger
+from mmengine.config import Config
+from mmengine.device import get_max_cuda_memory
+from mmengine.dist import get_world_size
+from mmengine.runner import Runner, load_checkpoint
+from mmengine.utils.dl_utils import set_multi_processing
+from torch.nn.parallel import DistributedDataParallel
+
+from mmdet.registry import DATASETS, MODELS
+
+try:
+    import psutil
+except ImportError:
+    psutil = None
+
+
+def wrap_fp16_model(model):
+    """Wrap the FP32 model to FP16.
+
+    If you are using PyTorch >= 1.6, torch.cuda.amp is used as the
+    backend, otherwise, original mmcv implementation will be adopted.
+
+    For PyTorch >= 1.6, this function will
+    1. Set fp16 flag inside the model to True.
+
+    Otherwise:
+    1. Convert FP32 model to FP16.
+    2. Remain some necessary layers to be FP32, e.g., normalization layers.
+    3. Set `fp16_enabled` flag inside the model to True.
+
+    Args:
+        model (nn.Module): Model in FP32.
+    """
+    # convert model to fp16
+    model.half()
+    # patch the normalization layers to make it work in fp32 mode
+    patch_norm_fp32(model)
+    # set `fp16_enabled` flag
+    for m in model.modules():
+        if hasattr(m, 'fp16_enabled'):
+            m.fp16_enabled = True
+
+
+
+def patch_norm_fp32(module):
+    """Recursively convert normalization layers from FP16 to FP32.
+
+    Args:
+        module (nn.Module): The modules to be converted in FP16.
+
+    Returns:
+        nn.Module: The converted module, the normalization layers have been
+            converted to FP32.
+    """
+    if isinstance(module, (nn.modules.batchnorm._BatchNorm, nn.GroupNorm)):
+        module.float()
+    for child in module.children():
+        patch_norm_fp32(child)
+    return module
+
+
+def custom_round(value: Union[int, float],
+                 factor: Union[int, float],
+                 precision: int = 2) -> float:
+    """Custom round function."""
+    return round(value / factor, precision)
+
+
+gb_round = partial(custom_round, factor=1024**3)
+
+
+def print_log(msg: str, logger: Optional[MMLogger] = None) -> None:
+    """Print a log message."""
+    if logger is None:
+        print(msg, flush=True)
+    else:
+        logger.info(msg)
+
+
+def print_process_memory(p: psutil.Process,
+                         logger: Optional[MMLogger] = None) -> None:
+    """print process memory info."""
+    mem_used = gb_round(psutil.virtual_memory().used)
+    memory_full_info = p.memory_full_info()
+    uss_mem = gb_round(memory_full_info.uss)
+    if hasattr(memory_full_info, 'pss'):
+        pss_mem = gb_round(memory_full_info.pss)
+
+    for children in p.children():
+        child_mem_info = children.memory_full_info()
+        uss_mem += gb_round(child_mem_info.uss)
+        if hasattr(child_mem_info, 'pss'):
+            pss_mem += gb_round(child_mem_info.pss)
+
+    process_count = 1 + len(p.children())
+
+    log_msg = f'(GB) mem_used: {mem_used:.2f} | uss: {uss_mem:.2f} | '
+    if hasattr(memory_full_info, 'pss'):
+        log_msg += f'pss: {pss_mem:.2f} | '
+    log_msg += f'total_proc: {process_count}'
+    print_log(log_msg, logger)
+
+
+class BaseBenchmark:
+    """The benchmark base class.
+
+    The ``run`` method is an external calling interface, and it will
+    call the ``run_once`` method ``repeat_num`` times for benchmarking.
+    Finally, call the ``average_multiple_runs`` method to further process
+    the results of multiple runs.
+
+    Args:
+        max_iter (int): maximum iterations of benchmark.
+        log_interval (int): interval of logging.
+        num_warmup (int): Number of Warmup.
+        logger (MMLogger, optional): Formatted logger used to record messages.
+    """
+
+    def __init__(self,
+                 max_iter: int,
+                 log_interval: int,
+                 num_warmup: int,
+                 logger: Optional[MMLogger] = None):
+        self.max_iter = max_iter
+        self.log_interval = log_interval
+        self.num_warmup = num_warmup
+        self.logger = logger
+
+    def run(self, repeat_num: int = 1) -> dict:
+        """benchmark entry method.
+
+        Args:
+            repeat_num (int): Number of repeat benchmark.
+                Defaults to 1.
+        """
+        assert repeat_num >= 1
+
+        results = []
+        for _ in range(repeat_num):
+            results.append(self.run_once())
+
+        results = self.average_multiple_runs(results)
+        return results
+
+    def run_once(self) -> dict:
+        """Executes the benchmark once."""
+        raise NotImplementedError()
+
+    def average_multiple_runs(self, results: List[dict]) -> dict:
+        """Average the results of multiple runs."""
+        raise NotImplementedError()
+
+
+class InferenceBenchmark(BaseBenchmark):
+    """
+    The inference benchmark class. It will be statistical inference FPS,
+    CUDA memory and CPU memory information.
+
+    Args:
+        cfg (mmengine.Config): config.
+        checkpoint (str): Accept local filepath, URL, ``torchvision://xxx``,
+            ``open-mmlab://xxx``.
+        distributed (bool): distributed testing flag.
+        is_fuse_conv_bn (bool): Whether to fuse conv and bn, this will
+            slightly increase the inference speed.
+        max_iter (int): maximum iterations of benchmark. Defaults to 2000.
+        log_interval (int): interval of logging. Defaults to 50.
+        num_warmup (int): Number of Warmup. Defaults to 5.
+        logger (MMLogger, optional): Formatted logger used to record messages.
+    """
+
+    def __init__(self,
+                 cfg: Config,
+                 checkpoint: str,
+                 distributed: bool,
+                 is_fuse_conv_bn: bool,
+                 max_iter: int = 2000,
+                 log_interval: int = 50,
+                 num_warmup: int = 5,
+                 logger: Optional[MMLogger] = None):
+        super().__init__(max_iter, log_interval, num_warmup, logger)
+
+        assert get_world_size(
+        ) == 1, 'Inference benchmark does not allow distributed multi-GPU'
+
+        self.cfg = copy.deepcopy(cfg)
+        self.distributed = distributed
+
+        if psutil is None:
+            raise ImportError('psutil is not installed, please install it by: '
+                              'pip install psutil')
+
+        self._process = psutil.Process()
+        env_cfg = self.cfg.get('env_cfg')
+        if env_cfg.get('cudnn_benchmark'):
+            torch.backends.cudnn.benchmark = True
+
+        mp_cfg: dict = env_cfg.get('mp_cfg', {})
+        set_multi_processing(**mp_cfg, distributed=self.distributed)
+
+        print_log('before build: ', self.logger)
+        print_process_memory(self._process, self.logger)
+
+        self.model = self._init_model(checkpoint, is_fuse_conv_bn)
+
+        # Because multiple processes will occupy additional CPU resources,
+        # FPS statistics will be more unstable when num_workers is not 0.
+        # It is reasonable to set num_workers to 0.
+        dataloader_cfg = cfg.test_dataloader
+        dataloader_cfg['num_workers'] = 0
+        dataloader_cfg['batch_size'] = 1
+        dataloader_cfg['persistent_workers'] = False
+        self.data_loader = Runner.build_dataloader(dataloader_cfg)
+
+        print_log('after build: ', self.logger)
+        print_process_memory(self._process, self.logger)
+
+    def _init_model(self, checkpoint: str, is_fuse_conv_bn: bool) -> nn.Module:
+        """Initialize the model."""
+        model = MODELS.build(self.cfg.model)
+
+        # # TODO need update
+        # fp16_cfg = self.cfg.get('fp16', None)
+        # if fp16_cfg is not None:
+        #     wrap_fp16_model(model)
+        wrap_fp16_model(model)
+
+
+        load_checkpoint(model, checkpoint, map_location='cpu')
+        if is_fuse_conv_bn:
+            model = fuse_conv_bn(model)
+
+        model = model.cuda()
+
+        if self.distributed:
+            model = DistributedDataParallel(
+                model,
+                device_ids=[torch.cuda.current_device()],
+                broadcast_buffers=False,
+                find_unused_parameters=False)
+
+        model.eval()
+        return model
+
+    def run_once(self) -> dict:
+        """Executes the benchmark once."""
+        pure_inf_time = 0
+        fps = 0
+
+        for i, data in enumerate(self.data_loader):
+
+            # data['data_samples'][0].gt_instances.bboxes = data['data_samples'][0].gt_instances.bboxes.to(torch.float16)
+
+            if (i + 1) % self.log_interval == 0:
+                print_log('==================================', self.logger)
+
+            torch.cuda.synchronize()
+            start_time = time.perf_counter()
+
+            with torch.no_grad():
+                with autocast(dtype=torch.float16): # FIXME: What's the difference b/t 'predict' and 'forward'
+
+                    # model = self.model.module
+                    # data = model.data_preprocessor(data, False)
+                    # model(**data)
+
+                    self.model.module.test_step(data)
+                    # self.model.test_step(data)
+
+            torch.cuda.synchronize()
+            elapsed = time.perf_counter() - start_time
+
+            elapsed -= self.model.module.backbone.txt_backbone_time
+
+            if i >= self.num_warmup:
+                pure_inf_time += elapsed
+                if (i + 1) % self.log_interval == 0:
+                    fps = (i + 1 - self.num_warmup) / pure_inf_time
+                    cuda_memory = get_max_cuda_memory()
+
+                    print_log(
+                        f'Done image [{i + 1:<3}/{self.max_iter}], '
+                        f'fps: {fps:.1f} img/s, '
+                        f'times per image: {1000 / fps:.1f} ms/img, '
+                        f'cuda memory: {cuda_memory} MB', self.logger)
+                    print_process_memory(self._process, self.logger)
+
+            if (i + 1) == self.max_iter:
+                fps = (i + 1 - self.num_warmup) / pure_inf_time
+                break
+
+        return {'fps': fps}
+
+    def average_multiple_runs(self, results: List[dict]) -> dict:
+        """Average the results of multiple runs."""
+        print_log('============== Done ==================', self.logger)
+
+        fps_list_ = [round(result['fps'], 1) for result in results]
+        avg_fps_ = sum(fps_list_) / len(fps_list_)
+        outputs = {'avg_fps': avg_fps_, 'fps_list': fps_list_}
+
+        if len(fps_list_) > 1:
+            times_pre_image_list_ = [
+                round(1000 / result['fps'], 1) for result in results
+            ]
+            avg_times_pre_image_ = sum(times_pre_image_list_) / len(
+                times_pre_image_list_)
+
+            print_log(
+                f'Overall fps: {fps_list_}[{avg_fps_:.1f}] img/s, '
+                'times per image: '
+                f'{times_pre_image_list_}[{avg_times_pre_image_:.1f}] '
+                'ms/img', self.logger)
+        else:
+            print_log(
+                f'Overall fps: {fps_list_[0]:.1f} img/s, '
+                f'times per image: {1000 / fps_list_[0]:.1f} ms/img',
+                self.logger)
+
+        print_log(f'cuda memory: {get_max_cuda_memory()} MB', self.logger)
+        print_process_memory(self._process, self.logger)
+
+        return outputs
+
+
+class DataLoaderBenchmark(BaseBenchmark):
+    """The dataloader benchmark class. It will be statistical inference FPS and
+    CPU memory information.
+
+    Args:
+        cfg (mmengine.Config): config.
+        distributed (bool): distributed testing flag.
+        dataset_type (str): benchmark data type, only supports ``train``,
+            ``val`` and ``test``.
+        max_iter (int): maximum iterations of benchmark. Defaults to 2000.
+        log_interval (int): interval of logging. Defaults to 50.
+        num_warmup (int): Number of Warmup. Defaults to 5.
+        logger (MMLogger, optional): Formatted logger used to record messages.
+    """
+
+    def __init__(self,
+                 cfg: Config,
+                 distributed: bool,
+                 dataset_type: str,
+                 max_iter: int = 2000,
+                 log_interval: int = 50,
+                 num_warmup: int = 5,
+                 logger: Optional[MMLogger] = None):
+        super().__init__(max_iter, log_interval, num_warmup, logger)
+
+        assert dataset_type in ['train', 'val', 'test'], \
+            'dataset_type only supports train,' \
+            f' val and test, but got {dataset_type}'
+        assert get_world_size(
+        ) == 1, 'Dataloader benchmark does not allow distributed multi-GPU'
+
+        self.cfg = copy.deepcopy(cfg)
+        self.distributed = distributed
+
+        if psutil is None:
+            raise ImportError('psutil is not installed, please install it by: '
+                              'pip install psutil')
+        self._process = psutil.Process()
+
+        mp_cfg = self.cfg.get('env_cfg', {}).get('mp_cfg')
+        if mp_cfg is not None:
+            set_multi_processing(distributed=self.distributed, **mp_cfg)
+        else:
+            set_multi_processing(distributed=self.distributed)
+
+        print_log('before build: ', self.logger)
+        print_process_memory(self._process, self.logger)
+
+        if dataset_type == 'train':
+            self.data_loader = Runner.build_dataloader(cfg.train_dataloader)
+        elif dataset_type == 'test':
+            self.data_loader = Runner.build_dataloader(cfg.test_dataloader)
+        else:
+            self.data_loader = Runner.build_dataloader(cfg.val_dataloader)
+
+        self.batch_size = self.data_loader.batch_size
+        self.num_workers = self.data_loader.num_workers
+
+        print_log('after build: ', self.logger)
+        print_process_memory(self._process, self.logger)
+
+    def run_once(self) -> dict:
+        """Executes the benchmark once."""
+        pure_inf_time = 0
+        fps = 0
+
+        # benchmark with 2000 image and take the average
+        start_time = time.perf_counter()
+        for i, data in enumerate(self.data_loader):
+            elapsed = time.perf_counter() - start_time
+
+            if (i + 1) % self.log_interval == 0:
+                print_log('==================================', self.logger)
+
+            if i >= self.num_warmup:
+                pure_inf_time += elapsed
+                if (i + 1) % self.log_interval == 0:
+                    fps = (i + 1 - self.num_warmup) / pure_inf_time
+
+                    print_log(
+                        f'Done batch [{i + 1:<3}/{self.max_iter}], '
+                        f'fps: {fps:.1f} batch/s, '
+                        f'times per batch: {1000 / fps:.1f} ms/batch, '
+                        f'batch size: {self.batch_size}, num_workers: '
+                        f'{self.num_workers}', self.logger)
+                    print_process_memory(self._process, self.logger)
+
+            if (i + 1) == self.max_iter:
+                fps = (i + 1 - self.num_warmup) / pure_inf_time
+                break
+
+            start_time = time.perf_counter()
+
+        return {'fps': fps}
+
+    def average_multiple_runs(self, results: List[dict]) -> dict:
+        """Average the results of multiple runs."""
+        print_log('============== Done ==================', self.logger)
+
+        fps_list_ = [round(result['fps'], 1) for result in results]
+        avg_fps_ = sum(fps_list_) / len(fps_list_)
+        outputs = {'avg_fps': avg_fps_, 'fps_list': fps_list_}
+
+        if len(fps_list_) > 1:
+            times_pre_image_list_ = [
+                round(1000 / result['fps'], 1) for result in results
+            ]
+            avg_times_pre_image_ = sum(times_pre_image_list_) / len(
+                times_pre_image_list_)
+
+            print_log(
+                f'Overall fps: {fps_list_}[{avg_fps_:.1f}] img/s, '
+                'times per batch: '
+                f'{times_pre_image_list_}[{avg_times_pre_image_:.1f}] '
+                f'ms/batch, batch size: {self.batch_size}, num_workers: '
+                f'{self.num_workers}', self.logger)
+        else:
+            print_log(
+                f'Overall fps: {fps_list_[0]:.1f} batch/s, '
+                f'times per batch: {1000 / fps_list_[0]:.1f} ms/batch, '
+                f'batch size: {self.batch_size}, num_workers: '
+                f'{self.num_workers}', self.logger)
+
+        print_process_memory(self._process, self.logger)
+
+        return outputs
+
+
+class DatasetBenchmark(BaseBenchmark):
+    """The dataset benchmark class. It will be statistical inference FPS, FPS
+    pre transform and CPU memory information.
+
+    Args:
+        cfg (mmengine.Config): config.
+        dataset_type (str): benchmark data type, only supports ``train``,
+            ``val`` and ``test``.
+        max_iter (int): maximum iterations of benchmark. Defaults to 2000.
+        log_interval (int): interval of logging. Defaults to 50.
+        num_warmup (int): Number of Warmup. Defaults to 5.
+        logger (MMLogger, optional): Formatted logger used to record messages.
+    """
+
+    def __init__(self,
+                 cfg: Config,
+                 dataset_type: str,
+                 max_iter: int = 2000,
+                 log_interval: int = 50,
+                 num_warmup: int = 5,
+                 logger: Optional[MMLogger] = None):
+        super().__init__(max_iter, log_interval, num_warmup, logger)
+        assert dataset_type in ['train', 'val', 'test'], \
+            'dataset_type only supports train,' \
+            f' val and test, but got {dataset_type}'
+        assert get_world_size(
+        ) == 1, 'Dataset benchmark does not allow distributed multi-GPU'
+        self.cfg = copy.deepcopy(cfg)
+
+        if dataset_type == 'train':
+            dataloader_cfg = copy.deepcopy(cfg.train_dataloader)
+        elif dataset_type == 'test':
+            dataloader_cfg = copy.deepcopy(cfg.test_dataloader)
+        else:
+            dataloader_cfg = copy.deepcopy(cfg.val_dataloader)
+
+        dataset_cfg = dataloader_cfg.pop('dataset')
+        dataset = DATASETS.build(dataset_cfg)
+        if hasattr(dataset, 'full_init'):
+            dataset.full_init()
+        self.dataset = dataset
+
+    def run_once(self) -> dict:
+        """Executes the benchmark once."""
+        pure_inf_time = 0
+        fps = 0
+
+        total_index = list(range(len(self.dataset)))
+        np.random.shuffle(total_index)
+
+        start_time = time.perf_counter()
+        for i, idx in enumerate(total_index):
+            if (i + 1) % self.log_interval == 0:
+                print_log('==================================', self.logger)
+
+            get_data_info_start_time = time.perf_counter()
+            data_info = self.dataset.get_data_info(idx)
+            get_data_info_elapsed = time.perf_counter(
+            ) - get_data_info_start_time
+
+            if (i + 1) % self.log_interval == 0:
+                print_log(f'get_data_info - {get_data_info_elapsed * 1000} ms',
+                          self.logger)
+
+            for t in self.dataset.pipeline.transforms:
+                transform_start_time = time.perf_counter()
+                data_info = t(data_info)
+                transform_elapsed = time.perf_counter() - transform_start_time
+
+                if (i + 1) % self.log_interval == 0:
+                    print_log(
+                        f'{t.__class__.__name__} - '
+                        f'{transform_elapsed * 1000} ms', self.logger)
+
+                if data_info is None:
+                    break
+
+            elapsed = time.perf_counter() - start_time
+
+            if i >= self.num_warmup:
+                pure_inf_time += elapsed
+                if (i + 1) % self.log_interval == 0:
+                    fps = (i + 1 - self.num_warmup) / pure_inf_time
+
+                    print_log(
+                        f'Done img [{i + 1:<3}/{self.max_iter}], '
+                        f'fps: {fps:.1f} img/s, '
+                        f'times per img: {1000 / fps:.1f} ms/img', self.logger)
+
+            if (i + 1) == self.max_iter:
+                fps = (i + 1 - self.num_warmup) / pure_inf_time
+                break
+
+            start_time = time.perf_counter()
+
+        return {'fps': fps}
+
+    def average_multiple_runs(self, results: List[dict]) -> dict:
+        """Average the results of multiple runs."""
+        print_log('============== Done ==================', self.logger)
+
+        fps_list_ = [round(result['fps'], 1) for result in results]
+        avg_fps_ = sum(fps_list_) / len(fps_list_)
+        outputs = {'avg_fps': avg_fps_, 'fps_list': fps_list_}
+
+        if len(fps_list_) > 1:
+            times_pre_image_list_ = [
+                round(1000 / result['fps'], 1) for result in results
+            ]
+            avg_times_pre_image_ = sum(times_pre_image_list_) / len(
+                times_pre_image_list_)
+
+            print_log(
+                f'Overall fps: {fps_list_}[{avg_fps_:.1f}] img/s, '
+                'times per img: '
+                f'{times_pre_image_list_}[{avg_times_pre_image_:.1f}] '
+                'ms/img', self.logger)
+        else:
+            print_log(
+                f'Overall fps: {fps_list_[0]:.1f} img/s, '
+                f'times per img: {1000 / fps_list_[0]:.1f} ms/img',
+                self.logger)
+
+        return outputs
+
+
+def parse_args():
+    parser = argparse.ArgumentParser(description='MMDet benchmark')
+    parser.add_argument('config', help='test config file path')
+    parser.add_argument('--checkpoint', help='checkpoint file')
+    parser.add_argument(
+        '--task',
+        choices=['inference', 'dataloader', 'dataset'],
+        default='dataloader',
+        help='Which task do you want to go to benchmark')
+    parser.add_argument(
+        '--repeat-num',
+        type=int,
+        default=1,
+        help='number of repeat times of measurement for averaging the results')
+    parser.add_argument(
+        '--max-iter', type=int, default=2000, help='num of max iter')
+    parser.add_argument(
+        '--log-interval', type=int, default=50, help='interval of logging')
+    parser.add_argument(
+        '--num-warmup', type=int, default=5, help='Number of warmup')
+    parser.add_argument(
+        '--fuse-conv-bn',
+        action='store_true',
+        help='Whether to fuse conv and bn, this will slightly increase'
+        'the inference speed')
+    parser.add_argument(
+        '--dataset-type',
+        choices=['train', 'val', 'test'],
+        default='test',
+        help='Benchmark dataset type. only supports train, val and test')
+    parser.add_argument(
+        '--work-dir',
+        help='the directory to save the file containing '
+        'benchmark metrics')
+    parser.add_argument(
+        '--cfg-options',
+        nargs='+',
+        action=DictAction,
+        help='override some settings in the used config, the key-value pair '
+        'in xxx=yyy format will be merged into config file. If the value to '
+        'be overwritten is a list, it should be like key="[a,b]" or key=a,b '
+        'It also allows nested list/tuple values, e.g. key="[(a,b),(c,d)]" '
+        'Note that the quotation marks are necessary and that no white space '
+        'is allowed.')
+    parser.add_argument(
+        '--launcher',
+        choices=['none', 'pytorch', 'slurm', 'mpi'],
+        default='none',
+        help='job launcher')
+    parser.add_argument('--local_rank', type=int, default=0)
+    args = parser.parse_args()
+    if 'LOCAL_RANK' not in os.environ:
+        os.environ['LOCAL_RANK'] = str(args.local_rank)
+    return args
+
+
+def inference_benchmark(args, cfg, distributed, logger):
+    benchmark = InferenceBenchmark(
+        cfg,
+        args.checkpoint,
+        distributed,
+        args.fuse_conv_bn,
+        args.max_iter,
+        args.log_interval,
+        args.num_warmup,
+        logger=logger)
+    return benchmark
+
+
+def dataloader_benchmark(args, cfg, distributed, logger):
+    benchmark = DataLoaderBenchmark(
+        cfg,
+        distributed,
+        args.dataset_type,
+        args.max_iter,
+        args.log_interval,
+        args.num_warmup,
+        logger=logger)
+    return benchmark
+
+
+def dataset_benchmark(args, cfg, distributed, logger):
+    benchmark = DatasetBenchmark(
+        cfg,
+        args.dataset_type,
+        args.max_iter,
+        args.log_interval,
+        args.num_warmup,
+        logger=logger)
+    return benchmark
+
+
+def main():
+    args = parse_args()
+    cfg = Config.fromfile(args.config)
+    if args.cfg_options is not None:
+        cfg.merge_from_dict(args.cfg_options)
+
+    init_default_scope(cfg.get('default_scope', 'mmdet'))
+
+    distributed = False
+    if args.launcher != 'none':
+        init_dist(args.launcher, **cfg.get('env_cfg', {}).get('dist_cfg', {}))
+        distributed = True
+
+    log_file = None
+    if args.work_dir:
+        log_file = os.path.join(args.work_dir, 'benchmark.log')
+        mkdir_or_exist(args.work_dir)
+
+    logger = MMLogger.get_instance(
+        'mmdet', log_file=log_file, log_level='INFO')
+
+    benchmark = eval(f'{args.task}_benchmark')(args, cfg, distributed, logger)
+    benchmark.run(args.repeat_num)
+
+
+if __name__ == '__main__':
+    main()
\ No newline at end of file
diff --git a/mmdetection_practice/tools/dist_test.sh b/mmdetection_practice/tools/dist_test.sh
new file mode 100755
index 0000000..f695118
--- /dev/null
+++ b/mmdetection_practice/tools/dist_test.sh
@@ -0,0 +1,51 @@
+#!/usr/bin/env bash
+
+CONFIG=$1
+CHECKPOINT=$2
+GPUS=$3
+NNODES=${NNODES:-1}
+NODE_RANK=${NODE_RANK:-0}
+PORT=${PORT:-29501}
+MASTER_ADDR=${MASTER_ADDR:-"127.0.0.1"}
+
+PYTHONPATH="$(dirname $0)/..":$PYTHONPATH \
+CUDA_VISIBLE_DEVICES=0 python -m torch.distributed.launch \
+    --nnodes=$NNODES \
+    --node_rank=$NODE_RANK \
+    --master_addr=$MASTER_ADDR \
+    --nproc_per_node=$GPUS \
+    --master_port=$PORT \
+    $(dirname "$0")/test.py \
+    $CONFIG \
+    $CHECKPOINT \
+    --launcher pytorch \
+    ${@:4}
+
+
+
+# Test Command
+
+# YOLO-World-S (benchmark)
+# ./tools/dist_test.sh configs/experiment/yolo_world_s_dual_vlpan_l2norm_2e-3_100e_8gpus_obj365v1_train_lvis_minival.py checkpoints/yolo_world_s_dual_vlpan_l2norm_2e-3_100e_8gpus_obj365v1_train_lvis_minival.pth 1
+
+# YOLO-World-S w/ T2I Attention Fusion (MaxSigmoid)
+# ./tools/dist_test.sh configs/experiment/yolo_world_s_vlattnfusion_l2norm_8gpus_obj365v1_train_lvis_minival.py checkpoints/yolo_world_s_vlattnfusion_l2norm_8gpus_obj365v1_train_lvis_minival.pth 2
+
+# YOLO-World-S remove (4),(3),(2),(1) fusion
+# ./tools/dist_test.sh configs/experiment/yolo_world_s_dual_vlpan_remove4321_l2norm_2e-3_100e_8gpus_obj365v1_train_lvis_minival.py checkpoints/epoch_1.pth 2
+
+# YOLO-World-S remove (4),(3) fusion
+# ./tools/dist_test.sh configs/experiment/yolo_world_s_dual_vlpan_remove43_l2norm_2e-3_100e_8gpus_obj365v1_train_lvis_minival.py work_dirs/yolo_world_s_dual_vlpan_remove43_l2norm_2e-3_100e_8gpus_obj365v1_train_lvis_minival/epoch_8.pth 1
+
+# YOLO-World-S  w/ Deep Fusion
+# ./tools/dist_test.sh configs/experiment/yolo_world_s_deepfusion_l2norm_8gpus_obj365v1_train_lvis_minival.py checkpoints/yolo_world_s_deepfusion_l2norm_8gpus_obj365v1_train_lvis_minival.pth 1
+
+
+# YOLO-World-S  w/ Multi-Scale Deep Fusion
+# ./tools/dist_test.sh configs/experiment/yolo_world_s_multi_scale_deepfusion_l2norm_8gpus_obj365v1_train_lvis_minival.py work_dirs/yolo_world_s_multi_scale_deepfusion_l2norm_8gpus_obj365v1_train_lvis_minival/epoch_1.pth 1
+
+
+# YOLO-World-S  w/ Deep Fusion x2
+# ./tools/dist_test.sh configs/experiment/yolo_world_s_multi_deepfusion_l2norm_8gpus_obj365v1_train_lvis_minival.py work_dirs/yolo_world_s_multi_deepfusion_l2norm_8gpus_obj365v1_train_lvis_minival/epoch_1.pth 1
+
+
diff --git a/mmdetection_practice/tools/dist_train.sh b/mmdetection_practice/tools/dist_train.sh
new file mode 100755
index 0000000..0e32e72
--- /dev/null
+++ b/mmdetection_practice/tools/dist_train.sh
@@ -0,0 +1,45 @@
+#!/usr/bin/env bash
+
+CONFIG=$1
+GPUS=$2
+NNODES=${NNODES:-1}
+NODE_RANK=${NODE_RANK:-0}
+PORT=${MASTER_PORT:-29500}
+MASTER_ADDR=${MASTER_ADDR:-"127.0.0.1"}
+
+PYTHONPATH="$(dirname $0)/..":$PYTHONPATH \
+CUDA_VISIBLE_DEVICES=7 python -m torch.distributed.launch \
+    --nnodes=$NNODES \
+    --node_rank=$NODE_RANK \
+    --master_addr=$MASTER_ADDR \
+    --nproc_per_node=$GPUS \
+    --master_port=$PORT \
+    $(dirname "$0")/train.py \
+    $CONFIG \
+    --launcher pytorch ${@:3}
+
+
+# Train Command
+
+# YOLO-World-S (benchmark)
+# ./tools/dist_train.sh configs/experiment/yolo_world_s_dual_vlpan_l2norm_2e-3_100e_8gpus_obj365v1_train_lvis_minival.py 8 --amp --use-wandb
+
+# YOLO-World-S w/ T2I Attention Fusion (MaxSigmoid)
+# ./tools/dist_train.sh configs/experiment/yolo_world_s_vlattnfusion_l2norm_8gpus_obj365v1_train_lvis_minival.py 8 --amp --use-wandb
+
+# YOLO-World-S remove (4),(3),(2),(1) fusion
+# ./tools/dist_train.sh configs/experiment/yolo_world_s_dual_vlpan_remove4321_l2norm_2e-3_100e_8gpus_obj365v1_train_lvis_minival.py 8 --amp --use-wandb
+
+# YOLO-World-S remove (4),(3) fusion
+# ./tools/dist_train.sh configs/experiment/yolo_world_s_dual_vlpan_remove43_l2norm_2e-3_100e_8gpus_obj365v1_train_lvis_minival.py 8 --amp --use-wandb
+
+# YOLO-World-S  w/ Deep Fusion
+# ./tools/dist_train.sh configs/experiment/yolo_world_s_deepfusion_l2norm_8gpus_obj365v1_train_lvis_minival.py 8 --amp --use-wandb
+
+# YOLO-World-S  w/ Multi-Scale Deep Fusion
+# ./tools/dist_train.sh configs/experiment/yolo_world_s_multi_scale_deepfusion_l2norm_8gpus_obj365v1_train_lvis_minival.py 8 --amp --use-wandb
+
+
+
+# YOLO-World-M (benchmark)
+# ./tools/dist_train.sh configs/experiment/yolo_world_m_dual_vlpan_l2norm_2e-3_100e_8gpus_obj365v1_train_lvis_minival.py 8 --amp --use-wandb --resume work_dirs/yolo_world_m_dual_vlpan_l2norm_2e-3_100e_8gpus_obj365v1_train_lvis_minival/epoch_22.pth
diff --git a/mmdetection_practice/tools/generate_image_prompts.py b/mmdetection_practice/tools/generate_image_prompts.py
new file mode 100644
index 0000000..ba0d023
--- /dev/null
+++ b/mmdetection_practice/tools/generate_image_prompts.py
@@ -0,0 +1,59 @@
+import os
+import tqdm
+import argparse
+import os.path as osp
+import numpy as np
+from PIL import Image
+from transformers import (AutoTokenizer, AutoProcessor,
+                          CLIPVisionModelWithProjection,
+                          CLIPTextModelWithProjection)
+
+if __name__ == "__main__":
+
+    parser = argparse.ArgumentParser()
+    parser.add_argument(
+        '--model',
+        type=str,
+        default='../pretrained_models/open-ai-clip-vit-base-patch32')
+    parser.add_argument('--image-dir', type=str, default='data/samples.txt')
+    parser.add_argument('--out-dir', type=str, default='')
+    parser.add_argument('--out-file', type=str)
+
+    args = parser.parse_args()
+
+    tokenizer = AutoTokenizer.from_pretrained(args.model)
+    vision_model = CLIPVisionModelWithProjection.from_pretrained(args.model)
+    text_model = CLIPTextModelWithProjection.from_pretrained(args.model)
+    processor = AutoProcessor.from_pretrained(args.model)
+
+    # padding prompts
+    device = 'cuda:0'
+    text_model.to(device)
+    texts = tokenizer(text=[' '], return_tensors='pt', padding=True)
+    texts = texts.to(device)
+    text_outputs = text_model(**texts)
+    txt_feats = text_outputs.text_embeds
+    txt_feats = txt_feats / txt_feats.norm(p=2, dim=-1, keepdim=True)
+    txt_feats = txt_feats.reshape(-1, txt_feats.shape[-1]).cpu().data.numpy()
+
+    images = os.listdir(args.image_dir)
+    category_embeds = []
+
+    def _forward_vision_model(image_name):
+        image_path = osp.join(args.image_dir, image_name)
+        # category = image_name.split('-')[1]
+        image = Image.open(image_path).convert("RGB")
+        inputs = processor(images=image, return_tensors="pt", padding=True)
+        image_outputs = vision_model(**inputs)
+        img_feats = image_outputs.image_embeds
+        # img_feats
+        img_feats = img_feats / img_feats.norm(p=2, dim=-1, keepdim=True)
+        img_feats = img_feats.reshape(
+            -1, img_feats.shape[-1])[0].cpu().data.numpy()
+        category_embeds.append(img_feats)
+
+    for image_ in tqdm.tqdm(images):
+        _forward_vision_model(image_)
+    category_embeds.append(txt_feats)
+    category_embeds = np.stack(category_embeds)
+    np.save(osp.join(args.out_dir, args.out_file), category_embeds)
diff --git a/mmdetection_practice/tools/generate_text_prompts.py b/mmdetection_practice/tools/generate_text_prompts.py
new file mode 100644
index 0000000..63dedbc
--- /dev/null
+++ b/mmdetection_practice/tools/generate_text_prompts.py
@@ -0,0 +1,41 @@
+import json
+import argparse
+import numpy as np
+from transformers import (AutoTokenizer, CLIPTextModelWithProjection)
+
+
+if __name__ == "__main__":
+
+    parser = argparse.ArgumentParser()
+    parser.add_argument(
+        '--model',
+        type=str,
+        # default='./pretrained_models/clip-vit-base-patch32-projection'
+        default='openai/clip-vit-base-patch32'
+    )
+    parser.add_argument(
+        '--text',
+        type=str,
+        # default='data/captions/coco_class_captions.json'
+        default='data/texts/lvis_v1_class_texts.json'
+    )
+    parser.add_argument('--out', type=str, default='output.npy')
+
+    args = parser.parse_args()
+
+    tokenizer = AutoTokenizer.from_pretrained(args.model)
+    model = CLIPTextModelWithProjection.from_pretrained(args.model)
+
+    with open(args.text) as f:
+        data = json.load(f)
+    texts = [x[0] for x in data]
+    device = 'cuda:0'
+    model.to(device)
+    texts = tokenizer(text=texts, return_tensors='pt', padding=True)
+    texts = texts.to(device)
+    text_outputs = model(**texts)
+    txt_feats = text_outputs.text_embeds
+    txt_feats = txt_feats / txt_feats.norm(p=2, dim=-1, keepdim=True)
+    txt_feats = txt_feats.reshape(-1, txt_feats.shape[-1])
+
+    np.save(args.out, txt_feats.cpu().data.numpy())
diff --git a/mmdetection_practice/tools/get_flops.py b/mmdetection_practice/tools/get_flops.py
new file mode 100644
index 0000000..b760075
--- /dev/null
+++ b/mmdetection_practice/tools/get_flops.py
@@ -0,0 +1,141 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+import argparse
+import tempfile
+from functools import partial
+from pathlib import Path
+
+import numpy as np
+import torch
+from mmengine.config import Config, DictAction
+from mmengine.logging import MMLogger
+from mmengine.model import revert_sync_batchnorm
+from mmengine.registry import init_default_scope
+from mmengine.runner import Runner
+from mmengine.utils import digit_version
+
+from mmdet.registry import MODELS
+
+try:
+    from mmengine.analysis import get_model_complexity_info
+    from mmengine.analysis.print_helper import _format_size
+except ImportError:
+    raise ImportError('Please upgrade mmengine >= 0.6.0')
+
+# python tools/get_flops.py configs/experiment/yolo_world_s_multi_deepfusion_l2norm_8gpus_obj365v1_train_lvis_minival.py
+# python tools/get_flops.py configs/experiment/yolo_world_s_dual_vlpan_remove43_l2norm_2e-3_100e_8gpus_obj365v1_train_lvis_minival.py
+def parse_args():
+    parser = argparse.ArgumentParser(description='Get a detector flops')
+    parser.add_argument('config', help='train config file path')
+    parser.add_argument(
+        '--num-images',
+        type=int,
+        default=100,
+        help='num images of calculate model flops')
+    parser.add_argument(
+        '--cfg-options',
+        nargs='+',
+        action=DictAction,
+        help='override some settings in the used config, the key-value pair '
+        'in xxx=yyy format will be merged into config file. If the value to '
+        'be overwritten is a list, it should be like key="[a,b]" or key=a,b '
+        'It also allows nested list/tuple values, e.g. key="[(a,b),(c,d)]" '
+        'Note that the quotation marks are necessary and that no white space '
+        'is allowed.')
+    args = parser.parse_args()
+    return args
+
+
+def inference(args, logger):
+    if digit_version(torch.__version__) < digit_version('1.12'):
+        logger.warning(
+            'Some config files, such as configs/yolact and configs/detectors,'
+            'may have compatibility issues with torch.jit when torch<1.12. '
+            'If you want to calculate flops for these models, '
+            'please make sure your pytorch version is >=1.12.')
+
+    config_name = Path(args.config)
+    if not config_name.exists():
+        logger.error(f'{config_name} not found.')
+
+    cfg = Config.fromfile(args.config)
+    cfg.val_dataloader.batch_size = 1
+    cfg.work_dir = tempfile.TemporaryDirectory().name
+
+    if args.cfg_options is not None:
+        cfg.merge_from_dict(args.cfg_options)
+
+    init_default_scope(cfg.get('default_scope', 'mmdet'))
+
+    # TODO: The following usage is temporary and not safe
+    # use hard code to convert mmSyncBN to SyncBN. This is a known
+    # bug in mmengine, mmSyncBN requires a distributed environment,
+    # this question involves models like configs/strong_baselines
+    if hasattr(cfg, 'head_norm_cfg'):
+        cfg['head_norm_cfg'] = dict(type='SyncBN', requires_grad=True)
+        cfg['model']['roi_head']['bbox_head']['norm_cfg'] = dict(
+            type='SyncBN', requires_grad=True)
+        cfg['model']['roi_head']['mask_head']['norm_cfg'] = dict(
+            type='SyncBN', requires_grad=True)
+
+    result = {}
+    avg_flops = []
+    data_loader = Runner.build_dataloader(cfg.val_dataloader)
+    model = MODELS.build(cfg.model)
+    if torch.cuda.is_available():
+        model = model.cuda()
+    model = revert_sync_batchnorm(model)
+    model.eval()
+    _forward = model.forward
+
+    for idx, data_batch in enumerate(data_loader):
+        if idx == args.num_images:
+            break
+        data = model.data_preprocessor(data_batch)
+        result['ori_shape'] = data['data_samples'][0].ori_shape
+        result['pad_shape'] = data['data_samples'][0].pad_shape
+        if hasattr(data['data_samples'][0], 'batch_input_shape'):
+            result['pad_shape'] = data['data_samples'][0].batch_input_shape
+        model.forward = partial(_forward, data_samples=data['data_samples'])
+        outputs = get_model_complexity_info(
+            model,
+            None,
+            inputs=data['inputs'],
+            show_table=False,
+            show_arch=False)
+        avg_flops.append(outputs['flops'])
+        params = outputs['params']
+        result['compute_type'] = 'dataloader: load a picture from the dataset'
+    del data_loader
+
+    mean_flops = _format_size(int(np.average(avg_flops)))
+    params = _format_size(params)
+    result['flops'] = mean_flops
+    result['params'] = params
+
+    return result
+
+
+def main():
+    args = parse_args()
+    logger = MMLogger.get_instance(name='MMLogger')
+    result = inference(args, logger)
+    split_line = '=' * 30
+    ori_shape = result['ori_shape']
+    pad_shape = result['pad_shape']
+    flops = result['flops']
+    params = result['params']
+    compute_type = result['compute_type']
+
+    if pad_shape != ori_shape:
+        print(f'{split_line}\nUse size divisor set input shape '
+              f'from {ori_shape} to {pad_shape}')
+    print(f'{split_line}\nCompute type: {compute_type}\n'
+          f'Input shape: {pad_shape}\nFlops: {flops}\n'
+          f'Params: {params}\n{split_line}')
+    print('!!!Please be cautious if you use the results in papers. '
+          'You may need to check if all ops are supported and verify '
+          'that the flops computation is correct.')
+
+
+if __name__ == '__main__':
+    main()
\ No newline at end of file
diff --git a/mmdetection_practice/tools/reparameterize_yoloworld.py b/mmdetection_practice/tools/reparameterize_yoloworld.py
new file mode 100644
index 0000000..d350454
--- /dev/null
+++ b/mmdetection_practice/tools/reparameterize_yoloworld.py
@@ -0,0 +1,140 @@
+import os
+import argparse
+
+import torch
+import numpy as np
+
+# python tools/reparameterize_yoloworld.py --model checkpoints/yolo_world_s_dual_vlpan_l2norm_2e-3_100e_8gpus_obj365v1_train_lvis_minival.pth --out-dir reparameterized_checkpoints --text-embed text_embeddings/output.npy --conv-neck
+
+def parse_args():
+
+    parser = argparse.ArgumentParser("Reparameterize YOLO-World")
+    parser.add_argument('--model', help='model checkpoints to reparameterize')
+    parser.add_argument('--out-dir', help='output checkpoints')
+    parser.add_argument(
+        '--text-embed',
+        help='text embeddings to reparameterized into YOLO-World')
+    parser.add_argument('--conv-neck',
+                        action='store_true',
+                        help='whether using 1x1 conv in RepVL-PAN')
+
+    args = parser.parse_args()
+    return args
+
+
+def convert_head(scale, bias, text_embed):
+    N, D = text_embed.shape
+    weight = (text_embed * scale.exp()).view(N, D, 1, 1)
+    bias = torch.ones(N) * bias
+    return weight, bias
+
+
+def reparameterize_head(state_dict, embeds):
+
+    cls_layers = [
+        'bbox_head.head_module.cls_contrasts.0',
+        'bbox_head.head_module.cls_contrasts.1',
+        'bbox_head.head_module.cls_contrasts.2'
+    ]
+
+    for i in range(3):
+        scale = state_dict[cls_layers[i] + '.logit_scale']
+        bias = state_dict[cls_layers[i] + '.bias']
+        weight, bias = convert_head(scale, bias, embeds)
+        state_dict[cls_layers[i] + '.conv.weight'] = weight
+        state_dict[cls_layers[i] + '.conv.bias'] = bias
+        del state_dict[cls_layers[i] + '.bias']
+        del state_dict[cls_layers[i] + '.logit_scale']
+    return state_dict
+
+
+def convert_neck_split_conv(input_state_dict, block_name, text_embeds,
+                            num_heads):
+    if block_name + '.guide_fc.weight' not in input_state_dict:
+        return input_state_dict
+    guide_fc_weight = input_state_dict[block_name + '.guide_fc.weight']
+    guide_fc_bias = input_state_dict[block_name + '.guide_fc.bias']
+    guide = text_embeds @ guide_fc_weight.transpose(0,
+                                                    1) + guide_fc_bias[None, :]
+    N, D = guide.shape
+    guide = list(guide.split(D // num_heads, dim=1))
+    del input_state_dict[block_name + '.guide_fc.weight']
+    del input_state_dict[block_name + '.guide_fc.bias']
+    for i in range(num_heads):
+        input_state_dict[block_name +
+                         f'.guide_convs.{i}.weight'] = guide[i][:, :, None,
+                                                                None]
+    return input_state_dict
+
+
+def convert_neck_weight(input_state_dict, block_name, embeds, num_heads):
+    guide_fc_weight = input_state_dict[block_name + '.guide_fc.weight']
+    guide_fc_bias = input_state_dict[block_name + '.guide_fc.bias']
+    guide = embeds @ guide_fc_weight.transpose(0, 1) + guide_fc_bias[None, :]
+    N, D = guide.shape
+    del input_state_dict[block_name + '.guide_fc.weight']
+    del input_state_dict[block_name + '.guide_fc.bias']
+    input_state_dict[block_name + '.guide_weight'] = guide.view(
+        N, D // num_heads, num_heads)
+    return input_state_dict
+
+
+def reparameterize_neck(state_dict, embeds, type='conv'):
+
+    neck_blocks = [
+        'neck.top_down_layers.0.attn_block',
+        'neck.top_down_layers.1.attn_block',
+        'neck.bottom_up_layers.0.attn_block',
+        'neck.bottom_up_layers.1.attn_block'
+    ]
+    if "neck.top_down_layers.0.attn_block.bias" not in state_dict:
+        return state_dict
+    for block in neck_blocks:
+        num_heads = state_dict[block + '.bias'].shape[0]
+        if type == 'conv':
+            convert_neck_split_conv(state_dict, block, embeds, num_heads)
+        else:
+            convert_neck_weight(state_dict, block, embeds, num_heads)
+    return state_dict
+
+
+def main():
+
+    args = parse_args()
+
+    # load checkpoint
+    model = torch.load(args.model, map_location='cpu')
+    state_dict = model['state_dict']
+
+    # load embeddings
+    embeddings = torch.from_numpy(np.load(args.text_embed))
+
+    # remove text encoder
+    keys = list(state_dict.keys())
+    keys = [x for x in keys if "text_model" not in x]
+
+    state_dict_wo_text = {x: state_dict[x] for x in keys}
+    print("removing text encoder")
+
+    state_dict_wo_text = reparameterize_head(state_dict_wo_text, embeddings)
+    print("reparameterizing head")
+
+    if args.conv_neck:
+        neck_type = "conv"
+    else:
+        neck_type = "linear"
+
+    state_dict_wo_text = reparameterize_neck(state_dict_wo_text, embeddings,
+                                             neck_type)
+
+    print("reparameterizing neck")
+
+    model['state_dict'] = state_dict_wo_text
+
+    model_name = os.path.basename(args.model)
+    model_name = model_name.replace('.pth', f'_rep_{neck_type}.pth')
+    torch.save(model, os.path.join(args.out_dir, model_name))
+
+
+if __name__ == "__main__":
+    main()
diff --git a/mmdetection_practice/tools/test.py b/mmdetection_practice/tools/test.py
new file mode 100644
index 0000000..a7eef19
--- /dev/null
+++ b/mmdetection_practice/tools/test.py
@@ -0,0 +1,162 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+import argparse
+import os
+import os.path as osp
+
+from mmdet.engine.hooks.utils import trigger_visualization_hook
+from mmengine.config import Config, ConfigDict, DictAction
+from mmengine.evaluator import DumpResults
+from mmengine.runner import Runner
+
+from mmyolo.registry import RUNNERS
+from mmyolo.utils import is_metainfo_lower
+from utils import CheckProcessTimePerBlock
+
+
+# TODO: support fuse_conv_bn
+def parse_args():
+    parser = argparse.ArgumentParser(
+        description='MMYOLO test (and eval) a model')
+    parser.add_argument('config', help='test config file path')
+    parser.add_argument('checkpoint', help='checkpoint file')
+    parser.add_argument(
+        '--work-dir',
+        help='the directory to save the file containing evaluation metrics')
+    parser.add_argument(
+        '--out',
+        type=str,
+        help='output result file (must be a .pkl file) in pickle format')
+    parser.add_argument(
+        '--json-prefix',
+        type=str,
+        help='the prefix of the output json file without perform evaluation, '
+        'which is useful when you want to format the result to a specific '
+        'format and submit it to the test server')
+    parser.add_argument(
+        '--tta',
+        action='store_true',
+        help='Whether to use test time augmentation')
+    parser.add_argument(
+        '--show', action='store_true', help='show prediction results')
+    parser.add_argument(
+        '--deploy',
+        action='store_true',
+        help='Switch model to deployment mode')
+    parser.add_argument(
+        '--show-dir',
+        help='directory where painted images will be saved. '
+        'If specified, it will be automatically saved '
+        'to the work_dir/timestamp/show_dir')
+    parser.add_argument(
+        '--wait-time', type=float, default=2, help='the interval of show (s)')
+    parser.add_argument(
+        '--cfg-options',
+        nargs='+',
+        action=DictAction,
+        help='override some settings in the used config, the key-value pair '
+        'in xxx=yyy format will be merged into config file. If the value to '
+        'be overwritten is a list, it should be like key="[a,b]" or key=a,b '
+        'It also allows nested list/tuple values, e.g. key="[(a,b),(c,d)]" '
+        'Note that the quotation marks are necessary and that no white space '
+        'is allowed.')
+    parser.add_argument(
+        '--use-wandb',
+        action='store_true',
+        default=False,
+        help='enable wandb for tracking log')
+    parser.add_argument(
+        '--launcher',
+        choices=['none', 'pytorch', 'slurm', 'mpi'],
+        default='none',
+        help='job launcher')
+    parser.add_argument('--local_rank', type=int, default=0)
+    args = parser.parse_args()
+    if 'LOCAL_RANK' not in os.environ:
+        os.environ['LOCAL_RANK'] = str(args.local_rank)
+    return args
+
+
+def main():
+    args = parse_args()
+
+    # load config
+    cfg = Config.fromfile(args.config)
+    # replace the ${key} with the value of cfg.key
+    # cfg = replace_cfg_vals(cfg)
+    cfg.launcher = args.launcher
+    if args.cfg_options is not None:
+        cfg.merge_from_dict(args.cfg_options)
+
+    # work_dir is determined in this priority: CLI > segment in file > filename
+    if args.work_dir is not None:
+        # update configs according to CLI args if args.work_dir is not None
+        cfg.work_dir = args.work_dir
+    elif cfg.get('work_dir', None) is None:
+        # use config filename as default work_dir if cfg.work_dir is None
+        cfg.work_dir = osp.join('./work_dirs',
+                                osp.splitext(osp.basename(args.config))[0])
+
+    cfg.load_from = args.checkpoint
+
+    if args.show or args.show_dir:
+        cfg = trigger_visualization_hook(cfg, args)
+
+    if args.deploy:
+        cfg.custom_hooks.append(dict(type='SwitchToDeployHook'))
+
+    # add `format_only` and `outfile_prefix` into cfg
+    if args.json_prefix is not None:
+        cfg_json = {
+            'test_evaluator.format_only': True,
+            'test_evaluator.outfile_prefix': args.json_prefix
+        }
+        cfg.merge_from_dict(cfg_json)
+
+    # Determine whether the custom metainfo fields are all lowercase
+    is_metainfo_lower(cfg)
+
+    if args.tta:
+        assert 'tta_model' in cfg, 'Cannot find ``tta_model`` in config.' \
+                                   " Can't use tta !"
+        assert 'tta_pipeline' in cfg, 'Cannot find ``tta_pipeline`` ' \
+                                      "in config. Can't use tta !"
+
+        cfg.model = ConfigDict(**cfg.tta_model, module=cfg.model)
+        test_data_cfg = cfg.test_dataloader.dataset
+        while 'dataset' in test_data_cfg:
+            test_data_cfg = test_data_cfg['dataset']
+
+        # batch_shapes_cfg will force control the size of the output image,
+        # it is not compatible with tta.
+        if 'batch_shapes_cfg' in test_data_cfg:
+            test_data_cfg.batch_shapes_cfg = None
+        test_data_cfg.pipeline = cfg.tta_pipeline
+
+    # 🐝 use wandb for tracking log
+    if args.use_wandb is not True:
+        cfg.visualizer = None
+
+    # build the runner from config
+    if 'runner_type' not in cfg:
+        # build the default runner
+        runner = Runner.from_cfg(cfg)
+    else:
+        # build customized runner from the registry
+        # if 'runner_type' is set in the cfg
+        runner = RUNNERS.build(cfg)
+
+    # add `DumpResults` dummy metric
+    if args.out is not None:
+        assert args.out.endswith(('.pkl', '.pickle')), \
+            'The dump file must be a pkl file.'
+        runner.test_evaluator.metrics.append(
+            DumpResults(out_file_path=args.out))
+
+    # import code; code.interact(local=locals())
+
+    # start testing
+    runner.test()
+
+
+if __name__ == '__main__':
+    main()
diff --git a/mmdetection_practice/tools/train.py b/mmdetection_practice/tools/train.py
new file mode 100644
index 0000000..289e486
--- /dev/null
+++ b/mmdetection_practice/tools/train.py
@@ -0,0 +1,133 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+import argparse
+import logging
+import os
+import os.path as osp
+
+from mmengine.config import Config, DictAction
+from mmengine.logging import print_log
+from mmengine.runner import Runner
+from mmengine.visualization import WandbVisBackend
+
+from mmyolo.registry import RUNNERS
+from mmyolo.utils import is_metainfo_lower
+from utils import CheckProcessTimePerBlock
+
+
+def parse_args():
+    parser = argparse.ArgumentParser(description='Train a detector')
+    parser.add_argument('config', help='train config file path')
+    parser.add_argument('--work-dir', help='the dir to save logs and models')
+    parser.add_argument(
+        '--amp',
+        action='store_true',
+        default=False,
+        help='enable automatic-mixed-precision training')
+    parser.add_argument(
+        '--resume',
+        nargs='?',
+        type=str,
+        const='auto',
+        help='If specify checkpoint path, resume from it, while if not '
+        'specify, try to auto resume from the latest checkpoint '
+        'in the work directory.')
+    parser.add_argument(
+        '--use-wandb',
+        action='store_true',
+        default=False,
+        help='enable wandb for tracking log')
+    parser.add_argument(
+        '--cfg-options',
+        nargs='+',
+        action=DictAction,
+        help='override some settings in the used config, the key-value pair '
+        'in xxx=yyy format will be merged into config file. If the value to '
+        'be overwritten is a list, it should be like key="[a,b]" or key=a,b '
+        'It also allows nested list/tuple values, e.g. key="[(a,b),(c,d)]" '
+        'Note that the quotation marks are necessary and that no white space '
+        'is allowed.')
+    parser.add_argument(
+        '--launcher',
+        choices=['none', 'pytorch', 'slurm', 'mpi'],
+        default='none',
+        help='job launcher')
+    parser.add_argument('--local_rank', type=int, default=0)
+    args = parser.parse_args()
+    if 'LOCAL_RANK' not in os.environ:
+        os.environ['LOCAL_RANK'] = str(args.local_rank)
+
+    return args
+
+
+def main():
+    args = parse_args()
+
+    # load config
+    cfg = Config.fromfile(args.config)
+    # replace the ${key} with the value of cfg.key
+    # cfg = replace_cfg_vals(cfg)
+    cfg.launcher = args.launcher
+    if args.cfg_options is not None:
+        cfg.merge_from_dict(args.cfg_options)
+
+    # work_dir is determined in this priority: CLI > segment in file > filename
+    if args.work_dir is not None:
+        # update configs according to CLI args if args.work_dir is not None
+        cfg.work_dir = args.work_dir
+    elif cfg.get('work_dir', None) is None:
+        # use config filename as default work_dir if cfg.work_dir is None
+        if args.config.startswith('projects/'):
+            config = args.config[len('projects/'):]
+            config = config.replace('/configs/', '/')
+            cfg.work_dir = osp.join('./work_dirs', osp.splitext(config)[0])
+        else:
+            cfg.work_dir = osp.join('./work_dirs',
+                                    osp.splitext(osp.basename(args.config))[0])
+
+    # enable automatic-mixed-precision training
+    if args.amp is True:
+        optim_wrapper = cfg.optim_wrapper.type
+        if optim_wrapper == 'AmpOptimWrapper':
+            print_log(
+                'AMP training is already enabled in your config.',
+                logger='current',
+                level=logging.WARNING)
+        else:
+            assert optim_wrapper == 'OptimWrapper', (
+                '`--amp` is only supported when the optimizer wrapper type is '
+                f'`OptimWrapper` but got {optim_wrapper}.')
+            cfg.optim_wrapper.type = 'AmpOptimWrapper'
+            cfg.optim_wrapper.loss_scale = 'dynamic'
+
+    # 🐝 use wandb for tracking log
+    if args.use_wandb is not True:
+        cfg.visualizer = None
+
+    # resume is determined in this priority: resume from > auto_resume
+    if args.resume == 'auto':
+        cfg.resume = True
+        cfg.load_from = None
+    elif args.resume is not None:
+        cfg.resume = True
+        cfg.load_from = args.resume
+
+    # Determine whether the custom metainfo fields are all lowercase
+    is_metainfo_lower(cfg)
+
+    # build the runner from config
+    if 'runner_type' not in cfg:
+        # build the default runner
+        runner = Runner.from_cfg(cfg)
+    else:
+        # build customized runner from the registry
+        # if 'runner_type' is set in the cfg
+        runner = RUNNERS.build(cfg)
+
+    # import code; code.interact(local=locals()) # TODO: This line is for 🐞debugging
+
+    # start training
+    runner.train()
+
+
+if __name__ == '__main__':
+    main()
diff --git a/mmdetection_practice/tools/utils.py b/mmdetection_practice/tools/utils.py
new file mode 100644
index 0000000..ef81f65
--- /dev/null
+++ b/mmdetection_practice/tools/utils.py
@@ -0,0 +1,83 @@
+from typing import Optional
+
+import torch
+from mmengine.hooks.hook import DATA_BATCH
+from mmengine.registry import HOOKS
+from mmengine.hooks import Hook
+
+@HOOKS.register_module()
+class CheckProcessTimePerBlock(Hook):
+    """
+    Check process time per block (Backbone, Neck, Head).
+    Add to the custom hooks as follows:
+    custom_hooks=[
+        dict(type='CheckProcessTimePerBlock', interval=50),
+    ]
+
+    Args:
+        interval (int): Checking interval (every k iterations).
+            Defaults to 50.
+    """
+    def __init__(self, interval=50):
+        self.interval = 1
+        self.total_img_backbone_time = 0
+        self.total_txt_backbone_time = 0
+        self.total_neck_time = 0
+        self.total_head_time = 0
+        self.total_time = 0
+
+        self.nms_time = 0
+    def after_test_iter(self, runner, batch_idx, data_batch=None, outputs=None):
+        """
+        All subclasses should override this method, if they need any
+        operations after each training iteration.
+        Args:
+            runner (Runner): The runner of the training process.
+            batch_idx (int): The index of the current batch in the train loop.
+            data_batch (dict or tuple or list, optional): Data from dataloader.
+            outputs (dict, optional): Outputs from model.
+        """
+        if self.every_n_inner_iters(batch_idx, self.interval):
+            # process time(s) for one batch per gpu at test time
+            img_backbone_time = runner.model.module.backbone.img_backbone_time
+            text_backbone_time = runner.model.module.backbone.txt_backbone_time
+            neck_time = runner.model.module.neck_time
+            head_time = runner.model.module.head_time
+
+            nms_time = runner.model.module.bbox_head.nms_time
+
+            runner.logger.info(f'Image Backbone time: {img_backbone_time:.4f}s')
+            runner.logger.info(f'Text Backbone time: {text_backbone_time:.4f}s')
+            runner.logger.info(f'Neck Time: {neck_time:.4f}s')
+            runner.logger.info(f'Head Time: {head_time:.4f}s')
+            runner.logger.info(f'NMS Time: {nms_time:.4f}s')
+
+
+            self.total_img_backbone_time += img_backbone_time
+            self.total_txt_backbone_time += text_backbone_time
+            self.total_neck_time += neck_time
+            self.total_head_time += head_time
+            self.total_time += img_backbone_time + text_backbone_time + neck_time + head_time
+
+            self.nms_time += nms_time
+
+    def after_test(self, runner):
+        avg_img_backbone_time = self.total_img_backbone_time / len(runner.test_dataloader)
+        avg_txt_backbone_time = self.total_txt_backbone_time / len(runner.test_dataloader)
+        avg_neck_time = self.total_neck_time / len(runner.test_dataloader)
+        avg_head_time = self.total_head_time / len(runner.test_dataloader)
+        avg_time = self.total_time / len(runner.test_dataloader)
+
+        avg_nms_time = self.nms_time / len(runner.test_dataloader)
+
+        runner.logger.info(f'Average TOTAL Time: {avg_time:.4f}s')
+        runner.logger.info(f'Average Image Backbone time: {avg_img_backbone_time:.4f}s')
+        runner.logger.info(f'Average Text Backbone time: {avg_txt_backbone_time:.4f}s')
+        runner.logger.info(f'Average Neck Time: {avg_neck_time:.4f}s')
+        runner.logger.info(f'Average Head Time: {avg_head_time:.4f}s')
+        runner.logger.info(f'Average NMS Time: {avg_nms_time:.4f}s')
+
+        fps = 1 / (avg_time - avg_txt_backbone_time - avg_nms_time)
+        runner.logger.info(f'Average FPS: {fps:.4f}')
+
+
diff --git a/mmdetection_practice/yolo_world/__init__.py b/mmdetection_practice/yolo_world/__init__.py
new file mode 100644
index 0000000..3ce4f9f
--- /dev/null
+++ b/mmdetection_practice/yolo_world/__init__.py
@@ -0,0 +1,12 @@
+# Copyright (c) Tencent Inc. All rights reserved.
+import importlib.metadata as importlib_metadata
+
+try:
+    __version__ = importlib_metadata.version(__package__ or __name__)
+except importlib_metadata.PackageNotFoundError:
+    __version__ = '0.0.0'
+
+
+from .models import *  # noqa
+from .datasets import *  # noqa
+from .engine import *  # noqa
diff --git a/mmdetection_practice/yolo_world/datasets/__init__.py b/mmdetection_practice/yolo_world/datasets/__init__.py
new file mode 100644
index 0000000..7694358
--- /dev/null
+++ b/mmdetection_practice/yolo_world/datasets/__init__.py
@@ -0,0 +1,19 @@
+# Copyright (c) Tencent Inc. All rights reserved.
+from .mm_dataset import (
+    MultiModalDataset, MultiModalMixedDataset)
+from .yolov5_obj365v1 import YOLOv5Objects365V1Dataset
+from .yolov5_obj365v2 import YOLOv5Objects365V2Dataset
+from .yolov5_mixed_grounding import YOLOv5MixedGroundingDataset
+from .utils import yolow_collate
+from .transformers import *  # NOQA
+from .yolov5_v3det import YOLOv5V3DetDataset
+from .yolov5_lvis import YOLOv5LVISV1Dataset
+from .yolov5_cc3m_grounding import YOLOv5GeneralGroundingDataset
+
+__all__ = [
+    'MultiModalDataset', 'YOLOv5Objects365V1Dataset',
+    'YOLOv5Objects365V2Dataset', 'YOLOv5MixedGroundingDataset',
+    'YOLOv5V3DetDataset', 'yolow_collate',
+    'YOLOv5LVISV1Dataset', 'MultiModalMixedDataset',
+    'YOLOv5GeneralGroundingDataset'
+]
diff --git a/mmdetection_practice/yolo_world/datasets/mm_dataset.py b/mmdetection_practice/yolo_world/datasets/mm_dataset.py
new file mode 100644
index 0000000..2276905
--- /dev/null
+++ b/mmdetection_practice/yolo_world/datasets/mm_dataset.py
@@ -0,0 +1,125 @@
+# Copyright (c) Tencent Inc. All rights reserved.
+import copy
+import json
+import logging
+from typing import Callable, List, Union
+
+from mmengine.logging import print_log
+from mmengine.dataset.base_dataset import (
+        BaseDataset, Compose, force_full_init)
+from mmyolo.registry import DATASETS
+
+
+@DATASETS.register_module()
+class MultiModalDataset:
+    """Multi-modal dataset."""
+
+    def __init__(self,
+                 dataset: Union[BaseDataset, dict],
+                 class_text_path: str = None,
+                 test_mode: bool = True,
+                 pipeline: List[Union[dict, Callable]] = [],
+                 lazy_init: bool = False) -> None:
+        self.dataset: BaseDataset
+        if isinstance(dataset, dict):
+            self.dataset = DATASETS.build(dataset)
+        elif isinstance(dataset, BaseDataset):
+            self.dataset = dataset
+        else:
+            raise TypeError(
+                'dataset must be a dict or a BaseDataset, '
+                f'but got {dataset}')
+
+        if class_text_path is not None:
+            self.class_texts = json.load(open(class_text_path, 'r'))
+            # ori_classes = self.dataset.metainfo['classes']
+            # assert len(ori_classes) == len(self.class_texts), \
+            #     ('The number of classes in the dataset and the class text'
+            #      'file must be the same.')
+        else:
+            self.class_texts = None
+
+        self.test_mode = test_mode
+        self._metainfo = self.dataset.metainfo
+        self.pipeline = Compose(pipeline)
+
+        import code; code.interact(local=locals())
+
+        self._fully_initialized = False
+        if not lazy_init:
+            self.full_init()
+
+    @property
+    def metainfo(self) -> dict:
+        return copy.deepcopy(self._metainfo)
+
+    def full_init(self) -> None:
+        """``full_init`` dataset."""
+        if self._fully_initialized:
+            return
+
+        self.dataset.full_init()
+        self._ori_len = len(self.dataset)
+        self._fully_initialized = True
+
+    @force_full_init
+    def get_data_info(self, idx: int) -> dict:
+        """Get annotation by index."""
+        data_info = self.dataset.get_data_info(idx)
+        if self.class_texts is not None:
+            data_info.update({'texts': self.class_texts})
+        return data_info
+
+    def __getitem__(self, idx):
+
+        if not self._fully_initialized:
+            print_log(
+                'Please call `full_init` method manually to '
+                'accelerate the speed.',
+                logger='current',
+                level=logging.WARNING)
+            self.full_init()
+
+        data_info = self.get_data_info(idx)
+
+        if hasattr(self.dataset, 'test_mode') and not self.dataset.test_mode:
+            data_info['dataset'] = self
+        elif not self.test_mode:
+            data_info['dataset'] = self
+        return self.pipeline(data_info)
+
+    @force_full_init
+    def __len__(self) -> int:
+        return self._ori_len
+
+
+@DATASETS.register_module()
+class MultiModalMixedDataset(MultiModalDataset):
+    """Multi-modal Mixed dataset.
+    mix "detection dataset" and "caption dataset"
+    Args:
+        dataset_type (str): dataset type, 'detection' or 'caption'
+    """
+    def __init__(self,
+                 dataset: Union[BaseDataset, dict],
+                 class_text_path: str = None,
+                 dataset_type: str = 'detection',
+                 test_mode: bool = True,
+                 pipeline: List[Union[dict, Callable]] = [],
+                 lazy_init: bool = False) -> None:
+        self.dataset_type = dataset_type
+        super().__init__(dataset,
+                         class_text_path,
+                         test_mode,
+                         pipeline,
+                         lazy_init)
+
+    @force_full_init
+    def get_data_info(self, idx: int) -> dict:
+        """Get annotation by index."""
+        data_info = self.dataset.get_data_info(idx)
+        if self.class_texts is not None:
+            data_info.update({'texts': self.class_texts})
+        data_info['is_detection'] = 1 \
+            if self.dataset_type == 'detection' else 0
+        return data_info
diff --git a/mmdetection_practice/yolo_world/datasets/transformers/__init__.py b/mmdetection_practice/yolo_world/datasets/transformers/__init__.py
new file mode 100644
index 0000000..495e981
--- /dev/null
+++ b/mmdetection_practice/yolo_world/datasets/transformers/__init__.py
@@ -0,0 +1,9 @@
+# Copyright (c) Tencent Inc. All rights reserved.
+from .mm_transforms import RandomLoadText, LoadText
+from .mm_mix_img_transforms import (
+    MultiModalMosaic, MultiModalMosaic9, YOLOv5MultiModalMixUp,
+    YOLOXMultiModalMixUp)
+
+__all__ = ['RandomLoadText', 'LoadText', 'MultiModalMosaic',
+           'MultiModalMosaic9', 'YOLOv5MultiModalMixUp',
+           'YOLOXMultiModalMixUp']
diff --git a/mmdetection_practice/yolo_world/datasets/transformers/mm_mix_img_transforms.py b/mmdetection_practice/yolo_world/datasets/transformers/mm_mix_img_transforms.py
new file mode 100644
index 0000000..0f4dfe0
--- /dev/null
+++ b/mmdetection_practice/yolo_world/datasets/transformers/mm_mix_img_transforms.py
@@ -0,0 +1,1173 @@
+# Copyright (c) Tencent Inc. All rights reserved.
+import collections
+import copy
+from abc import ABCMeta, abstractmethod
+from typing import Optional, Sequence, Tuple, Union
+
+import mmcv
+import numpy as np
+from mmcv.transforms import BaseTransform
+from mmdet.structures.bbox import autocast_box_type
+from mmengine.dataset import BaseDataset
+from mmengine.dataset.base_dataset import Compose
+from numpy import random
+from mmyolo.registry import TRANSFORMS
+
+
+class BaseMultiModalMixImageTransform(BaseTransform, metaclass=ABCMeta):
+    """A Base Transform of Multimodal multiple images mixed.
+
+    Suitable for training on multiple images mixed data augmentation like
+    mosaic and mixup.
+
+    Cached mosaic transform will random select images from the cache
+    and combine them into one output image if use_cached is True.
+
+    Args:
+        pre_transform(Sequence[str]): Sequence of transform object or
+            config dict to be composed. Defaults to None.
+        prob(float): The transformation probability. Defaults to 1.0.
+        use_cached (bool): Whether to use cache. Defaults to False.
+        max_cached_images (int): The maximum length of the cache. The larger
+            the cache, the stronger the randomness of this transform. As a
+            rule of thumb, providing 10 caches for each image suffices for
+            randomness. Defaults to 40.
+        random_pop (bool): Whether to randomly pop a result from the cache
+            when the cache is full. If set to False, use FIFO popping method.
+            Defaults to True.
+        max_refetch (int): The maximum number of retry iterations for getting
+            valid results from the pipeline. If the number of iterations is
+            greater than `max_refetch`, but results is still None, then the
+            iteration is terminated and raise the error. Defaults to 15.
+    """
+
+    def __init__(self,
+                 pre_transform: Optional[Sequence[str]] = None,
+                 prob: float = 1.0,
+                 use_cached: bool = False,
+                 max_cached_images: int = 40,
+                 random_pop: bool = True,
+                 max_refetch: int = 15):
+
+        self.max_refetch = max_refetch
+        self.prob = prob
+
+        self.use_cached = use_cached
+        self.max_cached_images = max_cached_images
+        self.random_pop = random_pop
+        self.results_cache = []
+
+        if pre_transform is None:
+            self.pre_transform = None
+        else:
+            self.pre_transform = Compose(pre_transform)
+
+    @abstractmethod
+    def get_indexes(self, dataset: Union[BaseDataset,
+                                         list]) -> Union[list, int]:
+        """Call function to collect indexes.
+
+        Args:
+            dataset (:obj:`Dataset` or list): The dataset or cached list.
+
+        Returns:
+            list or int: indexes.
+        """
+        pass
+
+    @abstractmethod
+    def mix_img_transform(self, results: dict) -> dict:
+        """Mixed image data transformation.
+
+        Args:
+            results (dict): Result dict.
+
+        Returns:
+            results (dict): Updated result dict.
+        """
+        pass
+
+    def _update_label_text(self, results: dict) -> dict:
+        """Update label text."""
+        if 'texts' not in results:
+            return results
+
+        mix_texts = sum(
+            [results['texts']] +
+            [x['texts'] for x in results['mix_results']], [])
+        mix_texts = list({tuple(x) for x in mix_texts})
+        text2id = {text: i for i, text in enumerate(mix_texts)}
+
+        for res in [results] + results['mix_results']:
+            for i, label in enumerate(res['gt_bboxes_labels']):
+                text = res['texts'][label]
+                updated_id = text2id[tuple(text)]
+                res['gt_bboxes_labels'][i] = updated_id
+            res['texts'] = mix_texts
+        return results
+
+    @autocast_box_type()
+    def transform(self, results: dict) -> dict:
+        """Data augmentation function.
+
+        The transform steps are as follows:
+        1. Randomly generate index list of other images.
+        2. Before Mosaic or MixUp need to go through the necessary
+            pre_transform, such as MixUp' pre_transform pipeline
+            include: 'LoadImageFromFile','LoadAnnotations',
+            'Mosaic' and 'RandomAffine'.
+        3. Use mix_img_transform function to implement specific
+            mix operations.
+
+        Args:
+            results (dict): Result dict.
+
+        Returns:
+            results (dict): Updated result dict.
+        """
+
+        if random.uniform(0, 1) > self.prob:
+            return results
+
+        if self.use_cached:
+            # Be careful: deep copying can be very time-consuming
+            # if results includes dataset.
+            dataset = results.pop('dataset', None)
+            self.results_cache.append(copy.deepcopy(results))
+            if len(self.results_cache) > self.max_cached_images:
+                if self.random_pop:
+                    index = random.randint(0, len(self.results_cache) - 1)
+                else:
+                    index = 0
+                self.results_cache.pop(index)
+
+            if len(self.results_cache) <= 4:
+                return results
+        else:
+            assert 'dataset' in results
+            # Be careful: deep copying can be very time-consuming
+            # if results includes dataset.
+            dataset = results.pop('dataset', None)
+
+        for _ in range(self.max_refetch):
+            # get index of one or three other images
+            if self.use_cached:
+                indexes = self.get_indexes(self.results_cache)
+            else:
+                indexes = self.get_indexes(dataset)
+
+            if not isinstance(indexes, collections.abc.Sequence):
+                indexes = [indexes]
+
+            if self.use_cached:
+                mix_results = [
+                    copy.deepcopy(self.results_cache[i]) for i in indexes
+                ]
+            else:
+                # get images information will be used for Mosaic or MixUp
+                mix_results = [
+                    copy.deepcopy(dataset.get_data_info(index))
+                    for index in indexes
+                ]
+
+            if self.pre_transform is not None:
+                for i, data in enumerate(mix_results):
+                    # pre_transform may also require dataset
+                    data.update({'dataset': dataset})
+                    # before Mosaic or MixUp need to go through
+                    # the necessary pre_transform
+                    _results = self.pre_transform(data)
+                    _results.pop('dataset')
+                    mix_results[i] = _results
+
+            if None not in mix_results:
+                results['mix_results'] = mix_results
+                break
+            print('Repeated calculation')
+        else:
+            raise RuntimeError(
+                'The loading pipeline of the original dataset'
+                ' always return None. Please check the correctness '
+                'of the dataset and its pipeline.')
+
+        # update labels and texts
+        results = self._update_label_text(results)
+
+        # Mosaic or MixUp
+        results = self.mix_img_transform(results)
+
+        if 'mix_results' in results:
+            results.pop('mix_results')
+        results['dataset'] = dataset
+
+        return results
+
+
+@TRANSFORMS.register_module()
+class MultiModalMosaic(BaseMultiModalMixImageTransform):
+    """Mosaic augmentation.
+
+    Given 4 images, mosaic transform combines them into
+    one output image. The output image is composed of the parts from each sub-
+    image.
+
+    .. code:: text
+
+                        mosaic transform
+                           center_x
+                +------------------------------+
+                |       pad        |           |
+                |      +-----------+    pad    |
+                |      |           |           |
+                |      |  image1   +-----------+
+                |      |           |           |
+                |      |           |   image2  |
+     center_y   |----+-+-----------+-----------+
+                |    |   cropped   |           |
+                |pad |   image3    |   image4  |
+                |    |             |           |
+                +----|-------------+-----------+
+                     |             |
+                     +-------------+
+
+     The mosaic transform steps are as follows:
+
+         1. Choose the mosaic center as the intersections of 4 images
+         2. Get the left top image according to the index, and randomly
+            sample another 3 images from the custom dataset.
+         3. Sub image will be cropped if image is larger than mosaic patch
+
+    Required Keys:
+
+    - img
+    - gt_bboxes (BaseBoxes[torch.float32]) (optional)
+    - gt_bboxes_labels (np.int64) (optional)
+    - gt_ignore_flags (bool) (optional)
+    - mix_results (List[dict])
+
+    Modified Keys:
+
+    - img
+    - img_shape
+    - gt_bboxes (optional)
+    - gt_bboxes_labels (optional)
+    - gt_ignore_flags (optional)
+
+    Args:
+        img_scale (Sequence[int]): Image size after mosaic pipeline of single
+            image. The shape order should be (width, height).
+            Defaults to (640, 640).
+        center_ratio_range (Sequence[float]): Center ratio range of mosaic
+            output. Defaults to (0.5, 1.5).
+        bbox_clip_border (bool, optional): Whether to clip the objects outside
+            the border of the image. In some dataset like MOT17, the gt bboxes
+            are allowed to cross the border of images. Therefore, we don't
+            need to clip the gt bboxes in these cases. Defaults to True.
+        pad_val (int): Pad value. Defaults to 114.
+        pre_transform(Sequence[dict]): Sequence of transform object or
+            config dict to be composed.
+        prob (float): Probability of applying this transformation.
+            Defaults to 1.0.
+        use_cached (bool): Whether to use cache. Defaults to False.
+        max_cached_images (int): The maximum length of the cache. The larger
+            the cache, the stronger the randomness of this transform. As a
+            rule of thumb, providing 10 caches for each image suffices for
+            randomness. Defaults to 40.
+        random_pop (bool): Whether to randomly pop a result from the cache
+            when the cache is full. If set to False, use FIFO popping method.
+            Defaults to True.
+        max_refetch (int): The maximum number of retry iterations for getting
+            valid results from the pipeline. If the number of iterations is
+            greater than `max_refetch`, but results is still None, then the
+            iteration is terminated and raise the error. Defaults to 15.
+    """
+
+    def __init__(self,
+                 img_scale: Tuple[int, int] = (640, 640),
+                 center_ratio_range: Tuple[float, float] = (0.5, 1.5),
+                 bbox_clip_border: bool = True,
+                 pad_val: float = 114.0,
+                 pre_transform: Sequence[dict] = None,
+                 prob: float = 1.0,
+                 use_cached: bool = False,
+                 max_cached_images: int = 40,
+                 random_pop: bool = True,
+                 max_refetch: int = 15):
+        assert isinstance(img_scale, tuple)
+        assert 0 <= prob <= 1.0, 'The probability should be in range [0,1]. ' \
+                                 f'got {prob}.'
+        if use_cached:
+            assert max_cached_images >= 4, 'The length of cache must >= 4, ' \
+                                           f'but got {max_cached_images}.'
+
+        super().__init__(
+            pre_transform=pre_transform,
+            prob=prob,
+            use_cached=use_cached,
+            max_cached_images=max_cached_images,
+            random_pop=random_pop,
+            max_refetch=max_refetch)
+
+        self.img_scale = img_scale
+        self.center_ratio_range = center_ratio_range
+        self.bbox_clip_border = bbox_clip_border
+        self.pad_val = pad_val
+
+    def get_indexes(self, dataset: Union[BaseDataset, list]) -> list:
+        """Call function to collect indexes.
+
+        Args:
+            dataset (:obj:`Dataset` or list): The dataset or cached list.
+
+        Returns:
+            list: indexes.
+        """
+        indexes = [random.randint(0, len(dataset)) for _ in range(3)]
+        return indexes
+
+    def mix_img_transform(self, results: dict) -> dict:
+        """Mixed image data transformation.
+
+        Args:
+            results (dict): Result dict.
+
+        Returns:
+            results (dict): Updated result dict.
+        """
+        # print("use mosaic")
+        assert 'mix_results' in results
+        mosaic_bboxes = []
+        mosaic_bboxes_labels = []
+        mosaic_ignore_flags = []
+        mosaic_masks = []
+        with_mask = True if 'gt_masks' in results else False
+        # print("with_mask: ", with_mask)
+        # self.img_scale is wh format
+        img_scale_w, img_scale_h = self.img_scale
+
+        if len(results['img'].shape) == 3:
+            mosaic_img = np.full(
+                (int(img_scale_h * 2), int(img_scale_w * 2), 3),
+                self.pad_val,
+                dtype=results['img'].dtype)
+        else:
+            mosaic_img = np.full((int(img_scale_h * 2), int(img_scale_w * 2)),
+                                 self.pad_val,
+                                 dtype=results['img'].dtype)
+
+        # mosaic center x, y
+        center_x = int(random.uniform(*self.center_ratio_range) * img_scale_w)
+        center_y = int(random.uniform(*self.center_ratio_range) * img_scale_h)
+        center_position = (center_x, center_y)
+
+        loc_strs = ('top_left', 'top_right', 'bottom_left', 'bottom_right')
+        for i, loc in enumerate(loc_strs):
+            if loc == 'top_left':
+                results_patch = results
+            else:
+                results_patch = results['mix_results'][i - 1]
+
+            img_i = results_patch['img']
+            h_i, w_i = img_i.shape[:2]
+            # keep_ratio resize
+            scale_ratio_i = min(img_scale_h / h_i, img_scale_w / w_i)
+            img_i = mmcv.imresize(
+                img_i, (int(w_i * scale_ratio_i), int(h_i * scale_ratio_i)))
+
+            # compute the combine parameters
+            paste_coord, crop_coord = self._mosaic_combine(
+                loc, center_position, img_i.shape[:2][::-1])
+            x1_p, y1_p, x2_p, y2_p = paste_coord
+            x1_c, y1_c, x2_c, y2_c = crop_coord
+
+            # crop and paste image
+            mosaic_img[y1_p:y2_p, x1_p:x2_p] = img_i[y1_c:y2_c, x1_c:x2_c]
+
+            # adjust coordinate
+            gt_bboxes_i = results_patch['gt_bboxes']
+            gt_bboxes_labels_i = results_patch['gt_bboxes_labels']
+            gt_ignore_flags_i = results_patch['gt_ignore_flags']
+
+            padw = x1_p - x1_c
+            padh = y1_p - y1_c
+            gt_bboxes_i.rescale_([scale_ratio_i, scale_ratio_i])
+            gt_bboxes_i.translate_([padw, padh])
+            mosaic_bboxes.append(gt_bboxes_i)
+            mosaic_bboxes_labels.append(gt_bboxes_labels_i)
+            mosaic_ignore_flags.append(gt_ignore_flags_i)
+            if with_mask and results_patch.get('gt_masks', None) is not None:
+                gt_masks_i = results_patch['gt_masks']
+                gt_masks_i = gt_masks_i.rescale(float(scale_ratio_i))
+                gt_masks_i = gt_masks_i.translate(
+                    out_shape=(int(self.img_scale[0] * 2),
+                               int(self.img_scale[1] * 2)),
+                    offset=padw,
+                    direction='horizontal')
+                gt_masks_i = gt_masks_i.translate(
+                    out_shape=(int(self.img_scale[0] * 2),
+                               int(self.img_scale[1] * 2)),
+                    offset=padh,
+                    direction='vertical')
+                mosaic_masks.append(gt_masks_i)
+
+        mosaic_bboxes = mosaic_bboxes[0].cat(mosaic_bboxes, 0)
+        mosaic_bboxes_labels = np.concatenate(mosaic_bboxes_labels, 0)
+        mosaic_ignore_flags = np.concatenate(mosaic_ignore_flags, 0)
+
+        if self.bbox_clip_border:
+            mosaic_bboxes.clip_([2 * img_scale_h, 2 * img_scale_w])
+            if with_mask:
+                mosaic_masks = mosaic_masks[0].cat(mosaic_masks)
+                results['gt_masks'] = mosaic_masks
+        else:
+            # remove outside bboxes
+            inside_inds = mosaic_bboxes.is_inside(
+                [2 * img_scale_h, 2 * img_scale_w]).numpy()
+            mosaic_bboxes = mosaic_bboxes[inside_inds]
+            mosaic_bboxes_labels = mosaic_bboxes_labels[inside_inds]
+            mosaic_ignore_flags = mosaic_ignore_flags[inside_inds]
+            if with_mask:
+                mosaic_masks = mosaic_masks[0].cat(mosaic_masks)[inside_inds]
+                results['gt_masks'] = mosaic_masks
+
+        results['img'] = mosaic_img
+        results['img_shape'] = mosaic_img.shape
+        results['gt_bboxes'] = mosaic_bboxes
+        results['gt_bboxes_labels'] = mosaic_bboxes_labels
+        results['gt_ignore_flags'] = mosaic_ignore_flags
+
+        return results
+
+    def _mosaic_combine(
+            self, loc: str, center_position_xy: Sequence[float],
+            img_shape_wh: Sequence[int]) -> Tuple[Tuple[int], Tuple[int]]:
+        """Calculate global coordinate of mosaic image and local coordinate of
+        cropped sub-image.
+
+        Args:
+            loc (str): Index for the sub-image, loc in ('top_left',
+              'top_right', 'bottom_left', 'bottom_right').
+            center_position_xy (Sequence[float]): Mixing center for 4 images,
+                (x, y).
+            img_shape_wh (Sequence[int]): Width and height of sub-image
+
+        Returns:
+            tuple[tuple[float]]: Corresponding coordinate of pasting and
+                cropping
+                - paste_coord (tuple): paste corner coordinate in mosaic image.
+                - crop_coord (tuple): crop corner coordinate in mosaic image.
+        """
+        assert loc in ('top_left', 'top_right', 'bottom_left', 'bottom_right')
+        if loc == 'top_left':
+            # index0 to top left part of image
+            x1, y1, x2, y2 = max(center_position_xy[0] - img_shape_wh[0], 0), \
+                             max(center_position_xy[1] - img_shape_wh[1], 0), \
+                             center_position_xy[0], \
+                             center_position_xy[1]
+            crop_coord = img_shape_wh[0] - (x2 - x1), img_shape_wh[1] - (
+                y2 - y1), img_shape_wh[0], img_shape_wh[1]
+
+        elif loc == 'top_right':
+            # index1 to top right part of image
+            x1, y1, x2, y2 = center_position_xy[0], \
+                             max(center_position_xy[1] - img_shape_wh[1], 0), \
+                             min(center_position_xy[0] + img_shape_wh[0],
+                                 self.img_scale[0] * 2), \
+                             center_position_xy[1]
+            crop_coord = 0, img_shape_wh[1] - (y2 - y1), min(
+                img_shape_wh[0], x2 - x1), img_shape_wh[1]
+
+        elif loc == 'bottom_left':
+            # index2 to bottom left part of image
+            x1, y1, x2, y2 = max(center_position_xy[0] - img_shape_wh[0], 0), \
+                             center_position_xy[1], \
+                             center_position_xy[0], \
+                             min(self.img_scale[1] * 2, center_position_xy[1] +
+                                 img_shape_wh[1])
+            crop_coord = img_shape_wh[0] - (x2 - x1), 0, img_shape_wh[0], min(
+                y2 - y1, img_shape_wh[1])
+
+        else:
+            # index3 to bottom right part of image
+            x1, y1, x2, y2 = center_position_xy[0], \
+                             center_position_xy[1], \
+                             min(center_position_xy[0] + img_shape_wh[0],
+                                 self.img_scale[0] * 2), \
+                             min(self.img_scale[1] * 2, center_position_xy[1] +
+                                 img_shape_wh[1])
+            crop_coord = 0, 0, min(img_shape_wh[0],
+                                   x2 - x1), min(y2 - y1, img_shape_wh[1])
+
+        paste_coord = x1, y1, x2, y2
+        return paste_coord, crop_coord
+
+    def __repr__(self) -> str:
+        repr_str = self.__class__.__name__
+        repr_str += f'(img_scale={self.img_scale}, '
+        repr_str += f'center_ratio_range={self.center_ratio_range}, '
+        repr_str += f'pad_val={self.pad_val}, '
+        repr_str += f'prob={self.prob})'
+        return repr_str
+
+
+@TRANSFORMS.register_module()
+class MultiModalMosaic9(BaseMultiModalMixImageTransform):
+    """Mosaic9 augmentation.
+
+    Given 9 images, mosaic transform combines them into
+    one output image. The output image is composed of the parts from each sub-
+    image.
+
+    .. code:: text
+
+                +-------------------------------+------------+
+                | pad           |      pad      |            |
+                |    +----------+               |            |
+                |    |          +---------------+  top_right |
+                |    |          |      top      |   image2   |
+                |    | top_left |     image1    |            |
+                |    |  image8  o--------+------+--------+---+
+                |    |          |        |               |   |
+                +----+----------+        |     right     |pad|
+                |               | center |     image3    |   |
+                |     left      | image0 +---------------+---|
+                |    image7     |        |               |   |
+            +---+-----------+---+--------+               |   |
+            |   |  cropped  |            |  bottom_right |pad|
+            |   |bottom_left|            |    image4     |   |
+            |   |  image6   |   bottom   |               |   |
+            +---|-----------+   image5   +---------------+---|
+                |    pad    |            |        pad        |
+                +-----------+------------+-------------------+
+
+     The mosaic transform steps are as follows:
+
+         1. Get the center image according to the index, and randomly
+            sample another 8 images from the custom dataset.
+         2. Randomly offset the image after Mosaic
+
+    Required Keys:
+
+    - img
+    - gt_bboxes (BaseBoxes[torch.float32]) (optional)
+    - gt_bboxes_labels (np.int64) (optional)
+    - gt_ignore_flags (bool) (optional)
+    - mix_results (List[dict])
+
+    Modified Keys:
+
+    - img
+    - img_shape
+    - gt_bboxes (optional)
+    - gt_bboxes_labels (optional)
+    - gt_ignore_flags (optional)
+
+    Args:
+        img_scale (Sequence[int]): Image size after mosaic pipeline of single
+            image. The shape order should be (width, height).
+            Defaults to (640, 640).
+        bbox_clip_border (bool, optional): Whether to clip the objects outside
+            the border of the image. In some dataset like MOT17, the gt bboxes
+            are allowed to cross the border of images. Therefore, we don't
+            need to clip the gt bboxes in these cases. Defaults to True.
+        pad_val (int): Pad value. Defaults to 114.
+        pre_transform(Sequence[dict]): Sequence of transform object or
+            config dict to be composed.
+        prob (float): Probability of applying this transformation.
+            Defaults to 1.0.
+        use_cached (bool): Whether to use cache. Defaults to False.
+        max_cached_images (int): The maximum length of the cache. The larger
+            the cache, the stronger the randomness of this transform. As a
+            rule of thumb, providing 5 caches for each image suffices for
+            randomness. Defaults to 50.
+        random_pop (bool): Whether to randomly pop a result from the cache
+            when the cache is full. If set to False, use FIFO popping method.
+            Defaults to True.
+        max_refetch (int): The maximum number of retry iterations for getting
+            valid results from the pipeline. If the number of iterations is
+            greater than `max_refetch`, but results is still None, then the
+            iteration is terminated and raise the error. Defaults to 15.
+    """
+
+    def __init__(self,
+                 img_scale: Tuple[int, int] = (640, 640),
+                 bbox_clip_border: bool = True,
+                 pad_val: Union[float, int] = 114.0,
+                 pre_transform: Sequence[dict] = None,
+                 prob: float = 1.0,
+                 use_cached: bool = False,
+                 max_cached_images: int = 50,
+                 random_pop: bool = True,
+                 max_refetch: int = 15):
+        assert isinstance(img_scale, tuple)
+        assert 0 <= prob <= 1.0, 'The probability should be in range [0,1]. ' \
+                                 f'got {prob}.'
+        if use_cached:
+            assert max_cached_images >= 9, 'The length of cache must >= 9, ' \
+                                           f'but got {max_cached_images}.'
+
+        super().__init__(
+            pre_transform=pre_transform,
+            prob=prob,
+            use_cached=use_cached,
+            max_cached_images=max_cached_images,
+            random_pop=random_pop,
+            max_refetch=max_refetch)
+
+        self.img_scale = img_scale
+        self.bbox_clip_border = bbox_clip_border
+        self.pad_val = pad_val
+
+        # intermediate variables
+        self._current_img_shape = [0, 0]
+        self._center_img_shape = [0, 0]
+        self._previous_img_shape = [0, 0]
+
+    def get_indexes(self, dataset: Union[BaseDataset, list]) -> list:
+        """Call function to collect indexes.
+
+        Args:
+            dataset (:obj:`Dataset` or list): The dataset or cached list.
+
+        Returns:
+            list: indexes.
+        """
+        indexes = [random.randint(0, len(dataset)) for _ in range(8)]
+        return indexes
+
+    def mix_img_transform(self, results: dict) -> dict:
+        """Mixed image data transformation.
+
+        Args:
+            results (dict): Result dict.
+
+        Returns:
+            results (dict): Updated result dict.
+        """
+        assert 'mix_results' in results
+
+        mosaic_bboxes = []
+        mosaic_bboxes_labels = []
+        mosaic_ignore_flags = []
+
+        img_scale_w, img_scale_h = self.img_scale
+
+        if len(results['img'].shape) == 3:
+            mosaic_img = np.full(
+                (int(img_scale_h * 3), int(img_scale_w * 3), 3),
+                self.pad_val,
+                dtype=results['img'].dtype)
+        else:
+            mosaic_img = np.full((int(img_scale_h * 3), int(img_scale_w * 3)),
+                                 self.pad_val,
+                                 dtype=results['img'].dtype)
+
+        # index = 0 is mean original image
+        # len(results['mix_results']) = 8
+        loc_strs = ('center', 'top', 'top_right', 'right', 'bottom_right',
+                    'bottom', 'bottom_left', 'left', 'top_left')
+
+        results_all = [results, *results['mix_results']]
+        for index, results_patch in enumerate(results_all):
+            img_i = results_patch['img']
+            # keep_ratio resize
+            img_i_h, img_i_w = img_i.shape[:2]
+            scale_ratio_i = min(img_scale_h / img_i_h, img_scale_w / img_i_w)
+            img_i = mmcv.imresize(
+                img_i,
+                (int(img_i_w * scale_ratio_i), int(img_i_h * scale_ratio_i)))
+
+            paste_coord = self._mosaic_combine(loc_strs[index],
+                                               img_i.shape[:2])
+
+            padw, padh = paste_coord[:2]
+            x1, y1, x2, y2 = (max(x, 0) for x in paste_coord)
+            mosaic_img[y1:y2, x1:x2] = img_i[y1 - padh:, x1 - padw:]
+
+            gt_bboxes_i = results_patch['gt_bboxes']
+            gt_bboxes_labels_i = results_patch['gt_bboxes_labels']
+            gt_ignore_flags_i = results_patch['gt_ignore_flags']
+            gt_bboxes_i.rescale_([scale_ratio_i, scale_ratio_i])
+            gt_bboxes_i.translate_([padw, padh])
+
+            mosaic_bboxes.append(gt_bboxes_i)
+            mosaic_bboxes_labels.append(gt_bboxes_labels_i)
+            mosaic_ignore_flags.append(gt_ignore_flags_i)
+
+        # Offset
+        offset_x = int(random.uniform(0, img_scale_w))
+        offset_y = int(random.uniform(0, img_scale_h))
+        mosaic_img = mosaic_img[offset_y:offset_y + 2 * img_scale_h,
+                                offset_x:offset_x + 2 * img_scale_w]
+
+        mosaic_bboxes = mosaic_bboxes[0].cat(mosaic_bboxes, 0)
+        mosaic_bboxes.translate_([-offset_x, -offset_y])
+        mosaic_bboxes_labels = np.concatenate(mosaic_bboxes_labels, 0)
+        mosaic_ignore_flags = np.concatenate(mosaic_ignore_flags, 0)
+
+        if self.bbox_clip_border:
+            mosaic_bboxes.clip_([2 * img_scale_h, 2 * img_scale_w])
+        else:
+            # remove outside bboxes
+            inside_inds = mosaic_bboxes.is_inside(
+                [2 * img_scale_h, 2 * img_scale_w]).numpy()
+            mosaic_bboxes = mosaic_bboxes[inside_inds]
+            mosaic_bboxes_labels = mosaic_bboxes_labels[inside_inds]
+            mosaic_ignore_flags = mosaic_ignore_flags[inside_inds]
+
+        results['img'] = mosaic_img
+        results['img_shape'] = mosaic_img.shape
+        results['gt_bboxes'] = mosaic_bboxes
+        results['gt_bboxes_labels'] = mosaic_bboxes_labels
+        results['gt_ignore_flags'] = mosaic_ignore_flags
+        return results
+
+    def _mosaic_combine(self, loc: str,
+                        img_shape_hw: Tuple[int, int]) -> Tuple[int, ...]:
+        """Calculate global coordinate of mosaic image.
+
+        Args:
+            loc (str): Index for the sub-image.
+            img_shape_hw (Sequence[int]): Height and width of sub-image
+
+        Returns:
+             paste_coord (tuple): paste corner coordinate in mosaic image.
+        """
+        assert loc in ('center', 'top', 'top_right', 'right', 'bottom_right',
+                       'bottom', 'bottom_left', 'left', 'top_left')
+
+        img_scale_w, img_scale_h = self.img_scale
+
+        self._current_img_shape = img_shape_hw
+        current_img_h, current_img_w = self._current_img_shape
+        previous_img_h, previous_img_w = self._previous_img_shape
+        center_img_h, center_img_w = self._center_img_shape
+
+        if loc == 'center':
+            self._center_img_shape = self._current_img_shape
+            #  xmin, ymin, xmax, ymax
+            paste_coord = img_scale_w, \
+                img_scale_h, \
+                img_scale_w + current_img_w, \
+                img_scale_h + current_img_h
+        elif loc == 'top':
+            paste_coord = img_scale_w, \
+                          img_scale_h - current_img_h, \
+                          img_scale_w + current_img_w, \
+                          img_scale_h
+        elif loc == 'top_right':
+            paste_coord = img_scale_w + previous_img_w, \
+                          img_scale_h - current_img_h, \
+                          img_scale_w + previous_img_w + current_img_w, \
+                          img_scale_h
+        elif loc == 'right':
+            paste_coord = img_scale_w + center_img_w, \
+                          img_scale_h, \
+                          img_scale_w + center_img_w + current_img_w, \
+                          img_scale_h + current_img_h
+        elif loc == 'bottom_right':
+            paste_coord = img_scale_w + center_img_w, \
+                          img_scale_h + previous_img_h, \
+                          img_scale_w + center_img_w + current_img_w, \
+                          img_scale_h + previous_img_h + current_img_h
+        elif loc == 'bottom':
+            paste_coord = img_scale_w + center_img_w - current_img_w, \
+                          img_scale_h + center_img_h, \
+                          img_scale_w + center_img_w, \
+                          img_scale_h + center_img_h + current_img_h
+        elif loc == 'bottom_left':
+            paste_coord = img_scale_w + center_img_w - \
+                          previous_img_w - current_img_w, \
+                          img_scale_h + center_img_h, \
+                          img_scale_w + center_img_w - previous_img_w, \
+                          img_scale_h + center_img_h + current_img_h
+        elif loc == 'left':
+            paste_coord = img_scale_w - current_img_w, \
+                          img_scale_h + center_img_h - current_img_h, \
+                          img_scale_w, \
+                          img_scale_h + center_img_h
+        elif loc == 'top_left':
+            paste_coord = img_scale_w - current_img_w, \
+                          img_scale_h + center_img_h - \
+                          previous_img_h - current_img_h, \
+                          img_scale_w, \
+                          img_scale_h + center_img_h - previous_img_h
+
+        self._previous_img_shape = self._current_img_shape
+        #  xmin, ymin, xmax, ymax
+        return paste_coord
+
+    def __repr__(self) -> str:
+        repr_str = self.__class__.__name__
+        repr_str += f'(img_scale={self.img_scale}, '
+        repr_str += f'pad_val={self.pad_val}, '
+        repr_str += f'prob={self.prob})'
+        return repr_str
+
+
+@TRANSFORMS.register_module()
+class YOLOv5MultiModalMixUp(BaseMultiModalMixImageTransform):
+    """MixUp data augmentation for YOLOv5.
+
+    .. code:: text
+
+    The mixup transform steps are as follows:
+
+        1. Another random image is picked by dataset.
+        2. Randomly obtain the fusion ratio from the beta distribution,
+            then fuse the target
+        of the original image and mixup image through this ratio.
+
+    Required Keys:
+
+    - img
+    - gt_bboxes (BaseBoxes[torch.float32]) (optional)
+    - gt_bboxes_labels (np.int64) (optional)
+    - gt_ignore_flags (bool) (optional)
+    - mix_results (List[dict])
+
+
+    Modified Keys:
+
+    - img
+    - img_shape
+    - gt_bboxes (optional)
+    - gt_bboxes_labels (optional)
+    - gt_ignore_flags (optional)
+
+
+    Args:
+        alpha (float): parameter of beta distribution to get mixup ratio.
+            Defaults to 32.
+        beta (float):  parameter of beta distribution to get mixup ratio.
+            Defaults to 32.
+        pre_transform (Sequence[dict]): Sequence of transform object or
+            config dict to be composed.
+        prob (float): Probability of applying this transformation.
+            Defaults to 1.0.
+        use_cached (bool): Whether to use cache. Defaults to False.
+        max_cached_images (int): The maximum length of the cache. The larger
+            the cache, the stronger the randomness of this transform. As a
+            rule of thumb, providing 10 caches for each image suffices for
+            randomness. Defaults to 20.
+        random_pop (bool): Whether to randomly pop a result from the cache
+            when the cache is full. If set to False, use FIFO popping method.
+            Defaults to True.
+        max_refetch (int): The maximum number of iterations. If the number of
+            iterations is greater than `max_refetch`, but gt_bbox is still
+            empty, then the iteration is terminated. Defaults to 15.
+    """
+
+    def __init__(self,
+                 alpha: float = 32.0,
+                 beta: float = 32.0,
+                 pre_transform: Sequence[dict] = None,
+                 prob: float = 1.0,
+                 use_cached: bool = False,
+                 max_cached_images: int = 20,
+                 random_pop: bool = True,
+                 max_refetch: int = 15):
+        if use_cached:
+            assert max_cached_images >= 2, 'The length of cache must >= 2, ' \
+                                           f'but got {max_cached_images}.'
+        super().__init__(
+            pre_transform=pre_transform,
+            prob=prob,
+            use_cached=use_cached,
+            max_cached_images=max_cached_images,
+            random_pop=random_pop,
+            max_refetch=max_refetch)
+        self.alpha = alpha
+        self.beta = beta
+
+    def get_indexes(self, dataset: Union[BaseDataset, list]) -> int:
+        """Call function to collect indexes.
+
+        Args:
+            dataset (:obj:`Dataset` or list): The dataset or cached list.
+
+        Returns:
+            int: indexes.
+        """
+        return random.randint(0, len(dataset))
+
+    def mix_img_transform(self, results: dict) -> dict:
+        """YOLOv5 MixUp transform function.
+
+        Args:
+            results (dict): Result dict
+
+        Returns:
+            results (dict): Updated result dict.
+        """
+        assert 'mix_results' in results
+
+        retrieve_results = results['mix_results'][0]
+        retrieve_img = retrieve_results['img']
+        ori_img = results['img']
+        assert ori_img.shape == retrieve_img.shape
+
+        # Randomly obtain the fusion ratio from the beta distribution,
+        # which is around 0.5
+        ratio = np.random.beta(self.alpha, self.beta)
+        mixup_img = (ori_img * ratio + retrieve_img * (1 - ratio))
+
+        retrieve_gt_bboxes = retrieve_results['gt_bboxes']
+        retrieve_gt_bboxes_labels = retrieve_results['gt_bboxes_labels']
+        retrieve_gt_ignore_flags = retrieve_results['gt_ignore_flags']
+
+        mixup_gt_bboxes = retrieve_gt_bboxes.cat(
+            (results['gt_bboxes'], retrieve_gt_bboxes), dim=0)
+        mixup_gt_bboxes_labels = np.concatenate(
+            (results['gt_bboxes_labels'], retrieve_gt_bboxes_labels), axis=0)
+        mixup_gt_ignore_flags = np.concatenate(
+            (results['gt_ignore_flags'], retrieve_gt_ignore_flags), axis=0)
+        if 'gt_masks' in results:
+            assert 'gt_masks' in retrieve_results
+            mixup_gt_masks = results['gt_masks'].cat(
+                [results['gt_masks'], retrieve_results['gt_masks']])
+            results['gt_masks'] = mixup_gt_masks
+
+        results['img'] = mixup_img.astype(np.uint8)
+        results['img_shape'] = mixup_img.shape
+        results['gt_bboxes'] = mixup_gt_bboxes
+        results['gt_bboxes_labels'] = mixup_gt_bboxes_labels
+        results['gt_ignore_flags'] = mixup_gt_ignore_flags
+
+        return results
+
+
+@TRANSFORMS.register_module()
+class YOLOXMultiModalMixUp(BaseMultiModalMixImageTransform):
+    """MixUp data augmentation for YOLOX.
+
+    .. code:: text
+
+                         mixup transform
+                +---------------+--------------+
+                | mixup image   |              |
+                |      +--------|--------+     |
+                |      |        |        |     |
+                +---------------+        |     |
+                |      |                 |     |
+                |      |      image      |     |
+                |      |                 |     |
+                |      |                 |     |
+                |      +-----------------+     |
+                |             pad              |
+                +------------------------------+
+
+    The mixup transform steps are as follows:
+
+        1. Another random image is picked by dataset and embedded in
+           the top left patch(after padding and resizing)
+        2. The target of mixup transform is the weighted average of mixup
+           image and origin image.
+
+    Required Keys:
+
+    - img
+    - gt_bboxes (BaseBoxes[torch.float32]) (optional)
+    - gt_bboxes_labels (np.int64) (optional)
+    - gt_ignore_flags (bool) (optional)
+    - mix_results (List[dict])
+
+
+    Modified Keys:
+
+    - img
+    - img_shape
+    - gt_bboxes (optional)
+    - gt_bboxes_labels (optional)
+    - gt_ignore_flags (optional)
+
+
+    Args:
+        img_scale (Sequence[int]): Image output size after mixup pipeline.
+            The shape order should be (width, height). Defaults to (640, 640).
+        ratio_range (Sequence[float]): Scale ratio of mixup image.
+            Defaults to (0.5, 1.5).
+        flip_ratio (float): Horizontal flip ratio of mixup image.
+            Defaults to 0.5.
+        pad_val (int): Pad value. Defaults to 114.
+        bbox_clip_border (bool, optional): Whether to clip the objects outside
+            the border of the image. In some dataset like MOT17, the gt bboxes
+            are allowed to cross the border of images. Therefore, we don't
+            need to clip the gt bboxes in these cases. Defaults to True.
+        pre_transform(Sequence[dict]): Sequence of transform object or
+            config dict to be composed.
+        prob (float): Probability of applying this transformation.
+            Defaults to 1.0.
+        use_cached (bool): Whether to use cache. Defaults to False.
+        max_cached_images (int): The maximum length of the cache. The larger
+            the cache, the stronger the randomness of this transform. As a
+            rule of thumb, providing 10 caches for each image suffices for
+            randomness. Defaults to 20.
+        random_pop (bool): Whether to randomly pop a result from the cache
+            when the cache is full. If set to False, use FIFO popping method.
+            Defaults to True.
+        max_refetch (int): The maximum number of iterations. If the number of
+            iterations is greater than `max_refetch`, but gt_bbox is still
+            empty, then the iteration is terminated. Defaults to 15.
+    """
+
+    def __init__(self,
+                 img_scale: Tuple[int, int] = (640, 640),
+                 ratio_range: Tuple[float, float] = (0.5, 1.5),
+                 flip_ratio: float = 0.5,
+                 pad_val: float = 114.0,
+                 bbox_clip_border: bool = True,
+                 pre_transform: Sequence[dict] = None,
+                 prob: float = 1.0,
+                 use_cached: bool = False,
+                 max_cached_images: int = 20,
+                 random_pop: bool = True,
+                 max_refetch: int = 15):
+        assert isinstance(img_scale, tuple)
+        if use_cached:
+            assert max_cached_images >= 2, 'The length of cache must >= 2, ' \
+                                           f'but got {max_cached_images}.'
+        super().__init__(
+            pre_transform=pre_transform,
+            prob=prob,
+            use_cached=use_cached,
+            max_cached_images=max_cached_images,
+            random_pop=random_pop,
+            max_refetch=max_refetch)
+        self.img_scale = img_scale
+        self.ratio_range = ratio_range
+        self.flip_ratio = flip_ratio
+        self.pad_val = pad_val
+        self.bbox_clip_border = bbox_clip_border
+
+    def get_indexes(self, dataset: Union[BaseDataset, list]) -> int:
+        """Call function to collect indexes.
+
+        Args:
+            dataset (:obj:`Dataset` or list): The dataset or cached list.
+
+        Returns:
+            int: indexes.
+        """
+        return random.randint(0, len(dataset))
+
+    def mix_img_transform(self, results: dict) -> dict:
+        """YOLOX MixUp transform function.
+
+        Args:
+            results (dict): Result dict.
+
+        Returns:
+            results (dict): Updated result dict.
+        """
+        assert 'mix_results' in results
+        assert len(
+            results['mix_results']) == 1, 'MixUp only support 2 images now !'
+
+        if results['mix_results'][0]['gt_bboxes'].shape[0] == 0:
+            # empty bbox
+            return results
+
+        retrieve_results = results['mix_results'][0]
+        retrieve_img = retrieve_results['img']
+
+        jit_factor = random.uniform(*self.ratio_range)
+        is_filp = random.uniform(0, 1) > self.flip_ratio
+
+        if len(retrieve_img.shape) == 3:
+            out_img = np.ones((self.img_scale[1], self.img_scale[0], 3),
+                              dtype=retrieve_img.dtype) * self.pad_val
+        else:
+            out_img = np.ones(
+                self.img_scale[::-1], dtype=retrieve_img.dtype) * self.pad_val
+
+        # 1. keep_ratio resize
+        scale_ratio = min(self.img_scale[1] / retrieve_img.shape[0],
+                          self.img_scale[0] / retrieve_img.shape[1])
+        retrieve_img = mmcv.imresize(
+            retrieve_img, (int(retrieve_img.shape[1] * scale_ratio),
+                           int(retrieve_img.shape[0] * scale_ratio)))
+
+        # 2. paste
+        out_img[:retrieve_img.shape[0], :retrieve_img.shape[1]] = retrieve_img
+
+        # 3. scale jit
+        scale_ratio *= jit_factor
+        out_img = mmcv.imresize(out_img, (int(out_img.shape[1] * jit_factor),
+                                          int(out_img.shape[0] * jit_factor)))
+
+        # 4. flip
+        if is_filp:
+            out_img = out_img[:, ::-1, :]
+
+        # 5. random crop
+        ori_img = results['img']
+        origin_h, origin_w = out_img.shape[:2]
+        target_h, target_w = ori_img.shape[:2]
+        padded_img = np.ones((max(origin_h, target_h), max(
+            origin_w, target_w), 3)) * self.pad_val
+        padded_img = padded_img.astype(np.uint8)
+        padded_img[:origin_h, :origin_w] = out_img
+
+        x_offset, y_offset = 0, 0
+        if padded_img.shape[0] > target_h:
+            y_offset = random.randint(0, padded_img.shape[0] - target_h)
+        if padded_img.shape[1] > target_w:
+            x_offset = random.randint(0, padded_img.shape[1] - target_w)
+        padded_cropped_img = padded_img[y_offset:y_offset + target_h,
+                                        x_offset:x_offset + target_w]
+
+        # 6. adjust bbox
+        retrieve_gt_bboxes = retrieve_results['gt_bboxes']
+        retrieve_gt_bboxes.rescale_([scale_ratio, scale_ratio])
+        if self.bbox_clip_border:
+            retrieve_gt_bboxes.clip_([origin_h, origin_w])
+
+        if is_filp:
+            retrieve_gt_bboxes.flip_([origin_h, origin_w],
+                                     direction='horizontal')
+
+        # 7. filter
+        cp_retrieve_gt_bboxes = retrieve_gt_bboxes.clone()
+        cp_retrieve_gt_bboxes.translate_([-x_offset, -y_offset])
+        if self.bbox_clip_border:
+            cp_retrieve_gt_bboxes.clip_([target_h, target_w])
+
+        # 8. mix up
+        mixup_img = 0.5 * ori_img + 0.5 * padded_cropped_img
+
+        retrieve_gt_bboxes_labels = retrieve_results['gt_bboxes_labels']
+        retrieve_gt_ignore_flags = retrieve_results['gt_ignore_flags']
+
+        mixup_gt_bboxes = cp_retrieve_gt_bboxes.cat(
+            (results['gt_bboxes'], cp_retrieve_gt_bboxes), dim=0)
+        mixup_gt_bboxes_labels = np.concatenate(
+            (results['gt_bboxes_labels'], retrieve_gt_bboxes_labels), axis=0)
+        mixup_gt_ignore_flags = np.concatenate(
+            (results['gt_ignore_flags'], retrieve_gt_ignore_flags), axis=0)
+
+        if not self.bbox_clip_border:
+            # remove outside bbox
+            inside_inds = mixup_gt_bboxes.is_inside([target_h,
+                                                     target_w]).numpy()
+            mixup_gt_bboxes = mixup_gt_bboxes[inside_inds]
+            mixup_gt_bboxes_labels = mixup_gt_bboxes_labels[inside_inds]
+            mixup_gt_ignore_flags = mixup_gt_ignore_flags[inside_inds]
+
+        results['img'] = mixup_img.astype(np.uint8)
+        results['img_shape'] = mixup_img.shape
+        results['gt_bboxes'] = mixup_gt_bboxes
+        results['gt_bboxes_labels'] = mixup_gt_bboxes_labels
+        results['gt_ignore_flags'] = mixup_gt_ignore_flags
+
+        return results
+
+    def __repr__(self) -> str:
+        repr_str = self.__class__.__name__
+        repr_str += f'(img_scale={self.img_scale}, '
+        repr_str += f'ratio_range={self.ratio_range}, '
+        repr_str += f'flip_ratio={self.flip_ratio}, '
+        repr_str += f'pad_val={self.pad_val}, '
+        repr_str += f'max_refetch={self.max_refetch}, '
+        repr_str += f'bbox_clip_border={self.bbox_clip_border})'
+        return repr_str
diff --git a/mmdetection_practice/yolo_world/datasets/transformers/mm_transforms.py b/mmdetection_practice/yolo_world/datasets/transformers/mm_transforms.py
new file mode 100644
index 0000000..a09ef5e
--- /dev/null
+++ b/mmdetection_practice/yolo_world/datasets/transformers/mm_transforms.py
@@ -0,0 +1,130 @@
+# Copyright (c) Tencent Inc. All rights reserved.
+import json
+import random
+from typing import Tuple
+
+import numpy as np
+from mmyolo.registry import TRANSFORMS
+
+
+@TRANSFORMS.register_module()
+class RandomLoadText:
+
+    def __init__(self,
+                 text_path: str = None,
+                 prompt_format: str = '{}',
+                 num_neg_samples: Tuple[int, int] = (80, 80),
+                 max_num_samples: int = 80,
+                 padding_to_max: bool = False,
+                 padding_value: str = '') -> None:
+        self.prompt_format = prompt_format
+        self.num_neg_samples = num_neg_samples
+        self.max_num_samples = max_num_samples
+        self.padding_to_max = padding_to_max
+        self.padding_value = padding_value
+        if text_path is not None:
+            with open(text_path, 'r') as f:
+                self.class_texts = json.load(f)
+
+    def __call__(self, results: dict) -> dict:
+        assert 'texts' in results or hasattr(self, 'class_texts'), (
+            'No texts found in results.')
+
+        class_texts = results.get(
+            'texts',
+            getattr(self, 'class_texts', None))
+
+        num_classes = len(class_texts)
+        if 'gt_labels' in results:
+            gt_label_tag = 'gt_labels'
+        elif 'gt_bboxes_labels' in results:
+            gt_label_tag = 'gt_bboxes_labels'
+        else:
+            raise ValueError('No valid labels found in results.')
+        positive_labels = set(results[gt_label_tag])
+
+        if len(positive_labels) > self.max_num_samples:
+            positive_labels = set(random.sample(list(positive_labels),
+                                  k=self.max_num_samples))
+
+        num_neg_samples = min(
+            min(num_classes, self.max_num_samples) - len(positive_labels),
+            random.randint(*self.num_neg_samples))
+        candidate_neg_labels = []
+        for idx in range(num_classes):
+            if idx not in positive_labels:
+                candidate_neg_labels.append(idx)
+        negative_labels = random.sample(
+            candidate_neg_labels, k=num_neg_samples)
+
+        sampled_labels = list(positive_labels) + list(negative_labels)
+        random.shuffle(sampled_labels)
+
+        label2ids = {label: i for i, label in enumerate(sampled_labels)}
+
+        gt_valid_mask = np.zeros(len(results['gt_bboxes']), dtype=bool)
+        for idx, label in enumerate(results[gt_label_tag]):
+            if label in label2ids:
+                gt_valid_mask[idx] = True
+                results[gt_label_tag][idx] = label2ids[label]
+        results['gt_bboxes'] = results['gt_bboxes'][gt_valid_mask]
+        results[gt_label_tag] = results[gt_label_tag][gt_valid_mask]
+
+        if 'instances' in results:
+            retaged_instances = []
+            for idx, inst in enumerate(results['instances']):
+                label = inst['bbox_label']
+                if label in label2ids:
+                    inst['bbox_label'] = label2ids[label]
+                    retaged_instances.append(inst)
+            results['instances'] = retaged_instances
+
+        texts = []
+        for label in sampled_labels:
+            cls_caps = class_texts[label]
+            assert len(cls_caps) > 0
+            cap_id = random.randrange(len(cls_caps))
+            sel_cls_cap = self.prompt_format.format(cls_caps[cap_id])
+            texts.append(sel_cls_cap)
+
+        if self.padding_to_max:
+            num_valid_labels = len(positive_labels) + len(negative_labels)
+            num_padding = self.max_num_samples - num_valid_labels
+            if num_padding > 0:
+                texts += [self.padding_value] * num_padding
+
+        results['texts'] = texts
+
+        return results
+
+
+@TRANSFORMS.register_module()
+class LoadText:
+
+    def __init__(self,
+                 text_path: str = None,
+                 prompt_format: str = '{}',
+                 multi_prompt_flag: str = '/') -> None:
+        self.prompt_format = prompt_format
+        self.multi_prompt_flag = multi_prompt_flag
+        if text_path is not None:
+            with open(text_path, 'r') as f:
+                self.class_texts = json.load(f)
+
+    def __call__(self, results: dict) -> dict:
+        assert 'texts' in results or hasattr(self, 'class_texts'), (
+            'No texts found in results.')
+        class_texts = results.get(
+            'texts',
+            getattr(self, 'class_texts', None))
+
+        texts = []
+        for idx, cls_caps in enumerate(class_texts):
+            assert len(cls_caps) > 0
+            sel_cls_cap = cls_caps[0]
+            sel_cls_cap = self.prompt_format.format(sel_cls_cap)
+            texts.append(sel_cls_cap)
+
+        results['texts'] = texts
+
+        return results
diff --git a/mmdetection_practice/yolo_world/datasets/utils.py b/mmdetection_practice/yolo_world/datasets/utils.py
new file mode 100644
index 0000000..4731a45
--- /dev/null
+++ b/mmdetection_practice/yolo_world/datasets/utils.py
@@ -0,0 +1,60 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from typing import Sequence
+
+import torch
+from mmengine.dataset import COLLATE_FUNCTIONS
+
+
+@COLLATE_FUNCTIONS.register_module()
+def yolow_collate(data_batch: Sequence,
+                  use_ms_training: bool = False) -> dict:
+    """Rewrite collate_fn to get faster training speed.
+
+    Args:
+       data_batch (Sequence): Batch of data.
+       use_ms_training (bool): Whether to use multi-scale training.
+    """
+    batch_imgs = []
+    batch_bboxes_labels = []
+    batch_masks = []
+    for i in range(len(data_batch)):
+        datasamples = data_batch[i]['data_samples']
+        inputs = data_batch[i]['inputs']
+        batch_imgs.append(inputs)
+
+        gt_bboxes = datasamples.gt_instances.bboxes.tensor
+        gt_labels = datasamples.gt_instances.labels
+        if 'masks' in datasamples.gt_instances:
+            masks = datasamples.gt_instances.masks.to(
+                dtype=torch.bool, device=gt_bboxes.device)
+            batch_masks.append(masks)
+        batch_idx = gt_labels.new_full((len(gt_labels), 1), i)
+        bboxes_labels = torch.cat((batch_idx, gt_labels[:, None], gt_bboxes),
+                                  dim=1)
+        batch_bboxes_labels.append(bboxes_labels)
+
+    collated_results = {
+        'data_samples': {
+            'bboxes_labels': torch.cat(batch_bboxes_labels, 0)
+        }
+    }
+    if len(batch_masks) > 0:
+        collated_results['data_samples']['masks'] = torch.cat(batch_masks, 0)
+
+    if use_ms_training:
+        collated_results['inputs'] = batch_imgs
+    else:
+        collated_results['inputs'] = torch.stack(batch_imgs, 0)
+
+    if hasattr(data_batch[0]['data_samples'], 'texts'):
+        batch_texts = [meta['data_samples'].texts for meta in data_batch]
+        collated_results['data_samples']['texts'] = batch_texts
+
+    if hasattr(data_batch[0]['data_samples'], 'is_detection'):
+        # detection flag
+        batch_detection = [meta['data_samples'].is_detection
+                           for meta in data_batch]
+        collated_results['data_samples']['is_detection'] = torch.tensor(
+            batch_detection)
+
+    return collated_results
diff --git a/mmdetection_practice/yolo_world/datasets/yolov5_cc3m_grounding.py b/mmdetection_practice/yolo_world/datasets/yolov5_cc3m_grounding.py
new file mode 100644
index 0000000..2dff1b8
--- /dev/null
+++ b/mmdetection_practice/yolo_world/datasets/yolov5_cc3m_grounding.py
@@ -0,0 +1,196 @@
+# Copyright (c) Tencent. All rights reserved.
+import os.path as osp
+from typing import List, Union
+
+from mmengine.fileio import get_local_path, join_path
+from mmengine.utils import is_abs
+from mmdet.datasets.coco import CocoDataset
+from mmyolo.registry import DATASETS
+from mmyolo.datasets.yolov5_coco import BatchShapePolicyDataset
+
+
+@DATASETS.register_module()
+class YOLOv5GeneralGroundingDataset(BatchShapePolicyDataset, CocoDataset):
+    """Mixed grounding dataset."""
+
+    METAINFO = {
+        'classes': ('object',),
+        'palette': [(220, 20, 60)]}
+
+    def load_data_list(self) -> List[dict]:
+        """Load annotations from an annotation file named as ``self.ann_file``
+
+        Returns:
+            List[dict]: A list of annotation.
+        """  # noqa: E501
+        with get_local_path(
+                self.ann_file, backend_args=self.backend_args) as local_path:
+            self.coco = self.COCOAPI(local_path)
+
+        img_ids = self.coco.get_img_ids()
+        data_list = []
+        total_ann_ids = []
+        for img_id in img_ids:
+            raw_img_info = self.coco.load_imgs([img_id])[0]
+            raw_img_info['img_id'] = img_id
+
+            ann_ids = self.coco.get_ann_ids(img_ids=[img_id])
+            raw_ann_info = self.coco.load_anns(ann_ids)
+            total_ann_ids.extend(ann_ids)
+
+            parsed_data_info = self.parse_data_info({
+                'raw_ann_info':
+                raw_ann_info,
+                'raw_img_info':
+                raw_img_info
+            })
+            data_list.append(parsed_data_info)
+        if self.ANN_ID_UNIQUE:
+            assert len(set(total_ann_ids)) == len(
+                total_ann_ids
+            ), f"Annotation ids in '{self.ann_file}' are not unique!"
+
+        del self.coco
+        # print(len(data_list))
+        return data_list
+
+    def parse_data_info(self, raw_data_info: dict) -> Union[dict, List[dict]]:
+        """Parse raw annotation to target format.
+
+        Args:
+            raw_data_info (dict): Raw data information load from ``ann_file``
+
+        Returns:
+            Union[dict, List[dict]]: Parsed annotation.
+        """
+        img_info = raw_data_info['raw_img_info']
+        ann_info = raw_data_info['raw_ann_info']
+
+        data_info = {}
+
+        img_path = None
+        img_prefix = self.data_prefix.get('img', None)
+        if isinstance(img_prefix, str):
+            img_path = osp.join(img_prefix, img_info['file_name'])
+        elif isinstance(img_prefix, (list, tuple)):
+            for prefix in img_prefix:
+                candidate_img_path = osp.join(prefix, img_info['file_name'])
+                if osp.exists(candidate_img_path):
+                    img_path = candidate_img_path
+                    break
+        assert img_path is not None, (
+            f'Image path {img_info["file_name"]} not found in'
+            f'{img_prefix}')
+        if self.data_prefix.get('seg', None):
+            seg_map_path = osp.join(
+                self.data_prefix['seg'],
+                img_info['file_name'].rsplit('.', 1)[0] + self.seg_map_suffix)
+        else:
+            seg_map_path = None
+        data_info['img_path'] = img_path
+        data_info['img_id'] = img_info['img_id']
+        data_info['seg_map_path'] = seg_map_path
+        data_info['height'] = float(img_info['height'])
+        data_info['width'] = float(img_info['width'])
+
+        cat2id = {}
+        texts = []
+        for ann in ann_info:
+            cat_name = ann['tokens']
+            if cat_name not in cat2id:
+                cat2id[cat_name] = len(cat2id)
+                texts.append([cat_name])
+        data_info['texts'] = texts
+
+        instances = []
+        for i, ann in enumerate(ann_info):
+            instance = {}
+
+            if ann.get('ignore', False):
+                continue
+            x1, y1, w, h = ann['bbox']
+            inter_w = max(0, min(x1 + w, float(img_info['width'])) - max(x1, 0))
+            inter_h = max(0, min(y1 + h, float(img_info['height'])) - max(y1, 0))
+            if inter_w * inter_h == 0:
+                continue
+            if ann['area'] <= 0 or w < 1 or h < 1:
+                continue
+            bbox = [x1, y1, x1 + w, y1 + h]
+
+            if ann.get('iscrowd', False):
+                instance['ignore_flag'] = 1
+            else:
+                instance['ignore_flag'] = 0
+            instance['bbox'] = bbox
+            # token per instance
+            cat_name = ann['tokens']
+            instance['bbox_label'] = cat2id[cat_name]
+
+            if ann.get('segmentation', None):
+                instance['mask'] = ann['segmentation']
+
+            instances.append(instance)
+        # NOTE: for detection task, we set `is_detection` to 1
+        data_info['is_detection'] = 0
+        data_info['instances'] = instances
+        # print(data_info['texts'])
+        return data_info
+
+    def filter_data(self) -> List[dict]:
+        """Filter annotations according to filter_cfg.
+
+        Returns:
+            List[dict]: Filtered results.
+        """
+        if self.test_mode:
+            return self.data_list
+
+        if self.filter_cfg is None:
+            return self.data_list
+
+        filter_empty_gt = self.filter_cfg.get('filter_empty_gt', False)
+        min_size = self.filter_cfg.get('min_size', 0)
+
+        # obtain images that contain annotation
+        ids_with_ann = set(data_info['img_id'] for data_info in self.data_list)
+
+        valid_data_infos = []
+        for i, data_info in enumerate(self.data_list):
+            img_id = data_info['img_id']
+            width = int(data_info['width'])
+            height = int(data_info['height'])
+            if filter_empty_gt and img_id not in ids_with_ann:
+                continue
+            if min(width, height) >= min_size:
+                valid_data_infos.append(data_info)
+
+        return valid_data_infos
+
+    def _join_prefix(self):
+        """Join ``self.data_root`` with ``self.data_prefix`` and
+        ``self.ann_file``.
+        """
+        # Automatically join annotation file path with `self.root` if
+        # `self.ann_file` is not an absolute path.
+        if self.ann_file and not is_abs(self.ann_file) and self.data_root:
+            self.ann_file = join_path(self.data_root, self.ann_file)
+        # Automatically join data directory with `self.root` if path value in
+        # `self.data_prefix` is not an absolute path.
+        for data_key, prefix in self.data_prefix.items():
+            if isinstance(prefix, (list, tuple)):
+                abs_prefix = []
+                for p in prefix:
+                    if not is_abs(p) and self.data_root:
+                        abs_prefix.append(join_path(self.data_root, p))
+                    else:
+                        abs_prefix.append(p)
+                self.data_prefix[data_key] = abs_prefix
+            elif isinstance(prefix, str):
+                if not is_abs(prefix) and self.data_root:
+                    self.data_prefix[data_key] = join_path(
+                        self.data_root, prefix)
+                else:
+                    self.data_prefix[data_key] = prefix
+            else:
+                raise TypeError('prefix should be a string, tuple or list,'
+                                f'but got {type(prefix)}')
diff --git a/mmdetection_practice/yolo_world/datasets/yolov5_lvis.py b/mmdetection_practice/yolo_world/datasets/yolov5_lvis.py
new file mode 100644
index 0000000..3258504
--- /dev/null
+++ b/mmdetection_practice/yolo_world/datasets/yolov5_lvis.py
@@ -0,0 +1,15 @@
+# Copyright (c) Tencent Inc. All rights reserved.
+from mmdet.datasets import LVISV1Dataset
+
+from mmyolo.datasets.yolov5_coco import BatchShapePolicyDataset
+from mmyolo.registry import DATASETS
+
+
+@DATASETS.register_module()
+class YOLOv5LVISV1Dataset(BatchShapePolicyDataset, LVISV1Dataset):
+    """Dataset for YOLOv5 LVIS Dataset.
+
+    We only add `BatchShapePolicy` function compared with Objects365V1Dataset.
+    See `mmyolo/datasets/utils.py#BatchShapePolicy` for details
+    """
+    pass
diff --git a/mmdetection_practice/yolo_world/datasets/yolov5_mixed_grounding.py b/mmdetection_practice/yolo_world/datasets/yolov5_mixed_grounding.py
new file mode 100644
index 0000000..98dd031
--- /dev/null
+++ b/mmdetection_practice/yolo_world/datasets/yolov5_mixed_grounding.py
@@ -0,0 +1,200 @@
+# Copyright (c) Tencent Inc. All rights reserved.
+import os.path as osp
+from typing import List, Union
+
+from mmengine.fileio import get_local_path, join_path
+from mmengine.utils import is_abs
+from mmdet.datasets.coco import CocoDataset
+from mmyolo.registry import DATASETS
+from mmyolo.datasets.yolov5_coco import BatchShapePolicyDataset
+
+
+@DATASETS.register_module()
+class YOLOv5MixedGroundingDataset(BatchShapePolicyDataset, CocoDataset):
+    """Mixed grounding dataset."""
+
+    METAINFO = {
+        'classes': ('object',),
+        'palette': [(220, 20, 60)]}
+
+    def load_data_list(self) -> List[dict]:
+        """Load annotations from an annotation file named as ``self.ann_file``
+
+        Returns:
+            List[dict]: A list of annotation.
+        """  # noqa: E501
+        with get_local_path(
+                self.ann_file, backend_args=self.backend_args) as local_path:
+            self.coco = self.COCOAPI(local_path)
+
+        img_ids = self.coco.get_img_ids()
+        data_list = []
+        total_ann_ids = []
+        for img_id in img_ids:
+            raw_img_info = self.coco.load_imgs([img_id])[0]
+            raw_img_info['img_id'] = img_id
+
+            ann_ids = self.coco.get_ann_ids(img_ids=[img_id])
+            raw_ann_info = self.coco.load_anns(ann_ids)
+            total_ann_ids.extend(ann_ids)
+
+            parsed_data_info = self.parse_data_info({
+                'raw_ann_info':
+                raw_ann_info,
+                'raw_img_info':
+                raw_img_info
+            })
+            data_list.append(parsed_data_info)
+        if self.ANN_ID_UNIQUE:
+            assert len(set(total_ann_ids)) == len(
+                total_ann_ids
+            ), f"Annotation ids in '{self.ann_file}' are not unique!"
+
+        del self.coco
+        # print(len(data_list))
+        return data_list
+
+    def parse_data_info(self, raw_data_info: dict) -> Union[dict, List[dict]]:
+        """Parse raw annotation to target format.
+
+        Args:
+            raw_data_info (dict): Raw data information load from ``ann_file``
+
+        Returns:
+            Union[dict, List[dict]]: Parsed annotation.
+        """
+        img_info = raw_data_info['raw_img_info']
+        ann_info = raw_data_info['raw_ann_info']
+
+        data_info = {}
+
+        img_path = None
+        img_prefix = self.data_prefix.get('img', None)
+        if isinstance(img_prefix, str):
+            img_path = osp.join(img_prefix, img_info['file_name'])
+        elif isinstance(img_prefix, (list, tuple)):
+            for prefix in img_prefix:
+                candidate_img_path = osp.join(prefix, img_info['file_name'])
+                if osp.exists(candidate_img_path):
+                    img_path = candidate_img_path
+                    break
+        assert img_path is not None, (
+            f'Image path {img_info["file_name"]} not found in'
+            f'{img_prefix}')
+        if self.data_prefix.get('seg', None):
+            seg_map_path = osp.join(
+                self.data_prefix['seg'],
+                img_info['file_name'].rsplit('.', 1)[0] + self.seg_map_suffix)
+        else:
+            seg_map_path = None
+        data_info['img_path'] = img_path
+        data_info['img_id'] = img_info['img_id']
+        data_info['seg_map_path'] = seg_map_path
+        data_info['height'] = float(img_info['height'])
+        data_info['width'] = float(img_info['width'])
+
+        cat2id = {}
+        texts = []
+        for ann in ann_info:
+            cat_name = ' '.join([img_info['caption'][t[0]:t[1]]
+                                 for t in ann['tokens_positive']])
+            if cat_name not in cat2id:
+                cat2id[cat_name] = len(cat2id)
+                texts.append([cat_name])
+        data_info['texts'] = texts
+
+        instances = []
+        for i, ann in enumerate(ann_info):
+            instance = {}
+
+            if ann.get('ignore', False):
+                continue
+            x1, y1, w, h = ann['bbox']
+            inter_w = max(0,
+                          min(x1 + w, float(img_info['width'])) - max(x1, 0))
+            inter_h = max(0,
+                          min(y1 + h, float(img_info['height'])) - max(y1, 0))
+            if inter_w * inter_h == 0:
+                continue
+            if ann['area'] <= 0 or w < 1 or h < 1:
+                continue
+            bbox = [x1, y1, x1 + w, y1 + h]
+
+            if ann.get('iscrowd', False):
+                instance['ignore_flag'] = 1
+            else:
+                instance['ignore_flag'] = 0
+            instance['bbox'] = bbox
+
+            cat_name = ' '.join([img_info['caption'][t[0]:t[1]]
+                                 for t in ann['tokens_positive']])
+            instance['bbox_label'] = cat2id[cat_name]
+
+            if ann.get('segmentation', None):
+                instance['mask'] = ann['segmentation']
+
+            instances.append(instance)
+        # NOTE: for detection task, we set `is_detection` to 1
+        data_info['is_detection'] = 1
+        data_info['instances'] = instances
+        # print(data_info['texts'])
+        return data_info
+
+    def filter_data(self) -> List[dict]:
+        """Filter annotations according to filter_cfg.
+
+        Returns:
+            List[dict]: Filtered results.
+        """
+        if self.test_mode:
+            return self.data_list
+
+        if self.filter_cfg is None:
+            return self.data_list
+
+        filter_empty_gt = self.filter_cfg.get('filter_empty_gt', False)
+        min_size = self.filter_cfg.get('min_size', 0)
+
+        # obtain images that contain annotation
+        ids_with_ann = set(data_info['img_id'] for data_info in self.data_list)
+
+        valid_data_infos = []
+        for i, data_info in enumerate(self.data_list):
+            img_id = data_info['img_id']
+            width = int(data_info['width'])
+            height = int(data_info['height'])
+            if filter_empty_gt and img_id not in ids_with_ann:
+                continue
+            if min(width, height) >= min_size:
+                valid_data_infos.append(data_info)
+
+        return valid_data_infos
+
+    def _join_prefix(self):
+        """Join ``self.data_root`` with ``self.data_prefix`` and
+        ``self.ann_file``.
+        """
+        # Automatically join annotation file path with `self.root` if
+        # `self.ann_file` is not an absolute path.
+        if self.ann_file and not is_abs(self.ann_file) and self.data_root:
+            self.ann_file = join_path(self.data_root, self.ann_file)
+        # Automatically join data directory with `self.root` if path value in
+        # `self.data_prefix` is not an absolute path.
+        for data_key, prefix in self.data_prefix.items():
+            if isinstance(prefix, (list, tuple)):
+                abs_prefix = []
+                for p in prefix:
+                    if not is_abs(p) and self.data_root:
+                        abs_prefix.append(join_path(self.data_root, p))
+                    else:
+                        abs_prefix.append(p)
+                self.data_prefix[data_key] = abs_prefix
+            elif isinstance(prefix, str):
+                if not is_abs(prefix) and self.data_root:
+                    self.data_prefix[data_key] = join_path(
+                        self.data_root, prefix)
+                else:
+                    self.data_prefix[data_key] = prefix
+            else:
+                raise TypeError('prefix should be a string, tuple or list,'
+                                f'but got {type(prefix)}')
diff --git a/mmdetection_practice/yolo_world/datasets/yolov5_obj365v1.py b/mmdetection_practice/yolo_world/datasets/yolov5_obj365v1.py
new file mode 100644
index 0000000..593dc86
--- /dev/null
+++ b/mmdetection_practice/yolo_world/datasets/yolov5_obj365v1.py
@@ -0,0 +1,15 @@
+# Copyright (c) Tencent Inc. All rights reserved.
+from mmdet.datasets import Objects365V1Dataset
+
+from mmyolo.datasets.yolov5_coco import BatchShapePolicyDataset
+from mmyolo.registry import DATASETS
+
+
+@DATASETS.register_module()
+class YOLOv5Objects365V1Dataset(BatchShapePolicyDataset, Objects365V1Dataset):
+    """Dataset for YOLOv5 VOC Dataset.
+
+    We only add `BatchShapePolicy` function compared with Objects365V1Dataset.
+    See `mmyolo/datasets/utils.py#BatchShapePolicy` for details
+    """
+    pass
diff --git a/mmdetection_practice/yolo_world/datasets/yolov5_obj365v2.py b/mmdetection_practice/yolo_world/datasets/yolov5_obj365v2.py
new file mode 100644
index 0000000..7008565
--- /dev/null
+++ b/mmdetection_practice/yolo_world/datasets/yolov5_obj365v2.py
@@ -0,0 +1,15 @@
+# Copyright (c) Tencent Inc. All rights reserved.
+from mmdet.datasets import Objects365V2Dataset
+
+from mmyolo.datasets.yolov5_coco import BatchShapePolicyDataset
+from mmyolo.registry import DATASETS
+
+
+@DATASETS.register_module()
+class YOLOv5Objects365V2Dataset(BatchShapePolicyDataset, Objects365V2Dataset):
+    """Dataset for YOLOv5 VOC Dataset.
+
+    We only add `BatchShapePolicy` function compared with Objects365V1Dataset.
+    See `mmyolo/datasets/utils.py#BatchShapePolicy` for details
+    """
+    pass
diff --git a/mmdetection_practice/yolo_world/datasets/yolov5_v3det.py b/mmdetection_practice/yolo_world/datasets/yolov5_v3det.py
new file mode 100644
index 0000000..554a0a3
--- /dev/null
+++ b/mmdetection_practice/yolo_world/datasets/yolov5_v3det.py
@@ -0,0 +1,110 @@
+# Copyright (c) Tencent Inc. All rights reserved.
+import copy
+import json
+import os.path as osp
+from typing import List
+
+from mmengine.fileio import get_local_path
+
+from mmdet.datasets.api_wrappers import COCO
+from mmdet.datasets import CocoDataset
+
+from mmyolo.datasets.yolov5_coco import BatchShapePolicyDataset
+from mmyolo.registry import DATASETS
+
+v3det_ignore_list = [
+    'a00013820/26_275_28143226914_ff3a247c53_c.jpg',
+    'n03815615/12_1489_32968099046_be38fa580e_c.jpg',
+    'n04550184/19_1480_2504784164_ffa3db8844_c.jpg',
+    'a00008703/2_363_3576131784_dfac6fc6ce_c.jpg',
+    'n02814533/28_2216_30224383848_a90697f1b3_c.jpg',
+    'n12026476/29_186_15091304754_5c219872f7_c.jpg',
+    'n01956764/12_2004_50133201066_72e0d9fea5_c.jpg',
+    'n03785016/14_2642_518053131_d07abcb5da_c.jpg',
+    'a00011156/33_250_4548479728_9ce5246596_c.jpg',
+    'a00009461/19_152_2792869324_db95bebc84_c.jpg',
+]
+
+# # ugly code here
+# with open(osp.join("data/v3det/cats.json"), 'r') as f:
+#     _classes = json.load(f)['classes']
+
+
+@DATASETS.register_module()
+class V3DetDataset(CocoDataset):
+    """Objects365 v1 dataset for detection."""
+
+    METAINFO = {'classes': 'classes', 'palette': None}
+
+    COCOAPI = COCO
+    # ann_id is unique in coco dataset.
+    ANN_ID_UNIQUE = True
+
+    def load_data_list(self) -> List[dict]:
+        """Load annotations from an annotation file named as ``self.ann_file``
+
+        Returns:
+            List[dict]: A list of annotation.
+        """  # noqa: E501
+        with get_local_path(self.ann_file,
+                            backend_args=self.backend_args) as local_path:
+            self.coco = self.COCOAPI(local_path)
+
+        # 'categories' list in objects365_train.json and objects365_val.json
+        # is inconsistent, need sort list(or dict) before get cat_ids.
+        cats = self.coco.cats
+        sorted_cats = {i: cats[i] for i in sorted(cats)}
+        self.coco.cats = sorted_cats
+        categories = self.coco.dataset['categories']
+        sorted_categories = sorted(categories, key=lambda i: i['id'])
+        self.coco.dataset['categories'] = sorted_categories
+        # The order of returned `cat_ids` will not
+        # change with the order of the `classes`
+        self.cat_ids = self.coco.get_cat_ids(
+            cat_names=self.metainfo['classes'])
+        self.cat2label = {cat_id: i for i, cat_id in enumerate(self.cat_ids)}
+        self.cat_img_map = copy.deepcopy(self.coco.cat_img_map)
+
+        img_ids = self.coco.get_img_ids()
+        data_list = []
+        total_ann_ids = []
+        for img_id in img_ids:
+            raw_img_info = self.coco.load_imgs([img_id])[0]
+            raw_img_info['img_id'] = img_id
+
+            ann_ids = self.coco.get_ann_ids(img_ids=[img_id])
+            raw_ann_info = self.coco.load_anns(ann_ids)
+            total_ann_ids.extend(ann_ids)
+
+            file_name = osp.join(
+                osp.split(osp.split(raw_img_info['file_name'])[0])[-1],
+                osp.split(raw_img_info['file_name'])[-1])
+
+            if file_name in v3det_ignore_list:
+                continue
+
+            parsed_data_info = self.parse_data_info({
+                'raw_ann_info':
+                raw_ann_info,
+                'raw_img_info':
+                raw_img_info
+            })
+            data_list.append(parsed_data_info)
+        if self.ANN_ID_UNIQUE:
+            assert len(set(total_ann_ids)) == len(
+                total_ann_ids
+            ), f"Annotation ids in '{self.ann_file}' are not unique!"
+
+        del self.coco
+
+        return data_list
+
+
+@DATASETS.register_module()
+class YOLOv5V3DetDataset(BatchShapePolicyDataset, V3DetDataset):
+    """Dataset for YOLOv5 VOC Dataset.
+
+    We only add `BatchShapePolicy` function compared with Objects365V1Dataset.
+    See `mmyolo/datasets/utils.py#BatchShapePolicy` for details
+    """
+    pass
diff --git a/mmdetection_practice/yolo_world/engine/__init__.py b/mmdetection_practice/yolo_world/engine/__init__.py
new file mode 100644
index 0000000..74177cd
--- /dev/null
+++ b/mmdetection_practice/yolo_world/engine/__init__.py
@@ -0,0 +1,2 @@
+# Copyright (c) Tencent Inc. All rights reserved.
+from .optimizers import *  # noqa
diff --git a/mmdetection_practice/yolo_world/engine/optimizers/__init__.py b/mmdetection_practice/yolo_world/engine/optimizers/__init__.py
new file mode 100644
index 0000000..607cefb
--- /dev/null
+++ b/mmdetection_practice/yolo_world/engine/optimizers/__init__.py
@@ -0,0 +1,4 @@
+# Copyright (c) Tencent Inc. All rights reserved.
+from .yolow_v5_optim_constructor import YOLOWv5OptimizerConstructor
+
+__all__ = ['YOLOWv5OptimizerConstructor']
diff --git a/mmdetection_practice/yolo_world/engine/optimizers/yolow_v5_optim_constructor.py b/mmdetection_practice/yolo_world/engine/optimizers/yolow_v5_optim_constructor.py
new file mode 100644
index 0000000..a8b625e
--- /dev/null
+++ b/mmdetection_practice/yolo_world/engine/optimizers/yolow_v5_optim_constructor.py
@@ -0,0 +1,187 @@
+# Copyright (c) Tencent Inc. All rights reserved.
+import logging
+from typing import List, Optional, Union
+
+import torch
+import torch.nn as nn
+from torch.nn import GroupNorm, LayerNorm
+from mmengine.dist import get_world_size
+from mmengine.logging import print_log
+from mmengine.optim import OptimWrapper, DefaultOptimWrapperConstructor
+from mmengine.utils.dl_utils import mmcv_full_available
+from mmengine.utils.dl_utils.parrots_wrapper import _BatchNorm, _InstanceNorm
+
+from mmyolo.registry import (OPTIM_WRAPPER_CONSTRUCTORS, OPTIM_WRAPPERS,
+                             OPTIMIZERS)
+
+
+@OPTIM_WRAPPER_CONSTRUCTORS.register_module()
+class YOLOWv5OptimizerConstructor(DefaultOptimWrapperConstructor):
+    """YOLO World v5 constructor for optimizers."""
+
+    def __init__(self,
+                 optim_wrapper_cfg: dict,
+                 paramwise_cfg: Optional[dict] = None) -> None:
+        super().__init__(optim_wrapper_cfg, paramwise_cfg)
+        self.base_total_batch_size = self.paramwise_cfg.pop(
+            'base_total_batch_size', 64)
+
+    def add_params(self,
+                   params: List[dict],
+                   module: nn.Module,
+                   prefix: str = '',
+                   is_dcn_module: Optional[Union[int, float]] = None) -> None:
+        """Add all parameters of module to the params list.
+
+        The parameters of the given module will be added to the list of param
+        groups, with specific rules defined by paramwise_cfg.
+
+        Args:
+            params (list[dict]): A list of param groups, it will be modified
+                in place.
+            module (nn.Module): The module to be added.
+            prefix (str): The prefix of the module
+            is_dcn_module (int|float|None): If the current module is a
+                submodule of DCN, `is_dcn_module` will be passed to
+                control conv_offset layer's learning rate. Defaults to None.
+        """
+        # get param-wise options
+        custom_keys = self.paramwise_cfg.get('custom_keys', {})
+        # first sort with alphabet order and then sort with reversed len of str
+        sorted_keys = sorted(sorted(custom_keys.keys()), key=len, reverse=True)
+
+        bias_lr_mult = self.paramwise_cfg.get('bias_lr_mult', None)
+        bias_decay_mult = self.paramwise_cfg.get('bias_decay_mult', None)
+        norm_decay_mult = self.paramwise_cfg.get('norm_decay_mult', None)
+        dwconv_decay_mult = self.paramwise_cfg.get('dwconv_decay_mult', None)
+        flat_decay_mult = self.paramwise_cfg.get('flat_decay_mult', None)
+        bypass_duplicate = self.paramwise_cfg.get('bypass_duplicate', False)
+        dcn_offset_lr_mult = self.paramwise_cfg.get('dcn_offset_lr_mult', None)
+
+        # special rules for norm layers and depth-wise conv layers
+        is_norm = isinstance(module,
+                             (_BatchNorm, _InstanceNorm, GroupNorm, LayerNorm))
+        is_dwconv = (
+            isinstance(module, torch.nn.Conv2d)
+            and module.in_channels == module.groups)
+
+        for name, param in module.named_parameters(recurse=False):
+            param_group = {'params': [param]}
+            if bypass_duplicate and self._is_in(param_group, params):
+                print_log(
+                    f'{prefix} is duplicate. It is skipped since '
+                    f'bypass_duplicate={bypass_duplicate}',
+                    logger='current',
+                    level=logging.WARNING)
+                continue
+            if not param.requires_grad:
+                params.append(param_group)
+                continue
+
+            # if the parameter match one of the custom keys, ignore other rules
+            for key in sorted_keys:
+                if key in f'{prefix}.{name}':
+                    lr_mult = custom_keys[key].get('lr_mult', 1.)
+                    param_group['lr'] = self.base_lr * lr_mult
+                    if self.base_wd is not None:
+                        decay_mult = custom_keys[key].get('decay_mult', 1.)
+                        param_group['weight_decay'] = self.base_wd * decay_mult
+                    # add custom settings to param_group
+                    for k, v in custom_keys[key].items():
+                        param_group[k] = v
+                    break
+
+            # NOTE: the behavious is different from MMDetection
+            # bias_lr_mult affects all bias parameters
+            # except for norm.bias dcn.conv_offset.bias
+            if name == 'bias' and not (
+                    is_norm or is_dcn_module) and bias_lr_mult is not None:
+                param_group['lr'] = self.base_lr * bias_lr_mult
+
+            if (prefix.find('conv_offset') != -1 and is_dcn_module
+                    and dcn_offset_lr_mult is not None
+                    and isinstance(module, torch.nn.Conv2d)):
+                # deal with both dcn_offset's bias & weight
+                param_group['lr'] = self.base_lr * dcn_offset_lr_mult
+
+            # apply weight decay policies
+            if self.base_wd is not None:
+                # norm decay
+                if is_norm and norm_decay_mult is not None:
+                    param_group[
+                        'weight_decay'] = self.base_wd * norm_decay_mult
+                # bias lr and decay
+                elif (name == 'bias' and not is_dcn_module
+                      and bias_decay_mult is not None):
+                    param_group[
+                        'weight_decay'] = self.base_wd * bias_decay_mult
+                # depth-wise conv
+                elif is_dwconv and dwconv_decay_mult is not None:
+                    param_group[
+                        'weight_decay'] = self.base_wd * dwconv_decay_mult
+                # flatten parameters except dcn offset
+                elif (param.ndim == 1 and not is_dcn_module
+                      and flat_decay_mult is not None):
+                    param_group[
+                        'weight_decay'] = self.base_wd * flat_decay_mult
+            params.append(param_group)
+            for key, value in param_group.items():
+                if key == 'params':
+                    continue
+                full_name = f'{prefix}.{name}' if prefix else name
+                print_log(
+                    f'paramwise_options -- {full_name}:{key}={value}',
+                    logger='current')
+
+        if mmcv_full_available():
+            from mmcv.ops import DeformConv2d, ModulatedDeformConv2d
+            is_dcn_module = isinstance(module,
+                                       (DeformConv2d, ModulatedDeformConv2d))
+        else:
+            is_dcn_module = False
+        for child_name, child_mod in module.named_children():
+            child_prefix = f'{prefix}.{child_name}' if prefix else child_name
+            self.add_params(
+                params,
+                child_mod,
+                prefix=child_prefix,
+                is_dcn_module=is_dcn_module)
+
+    def __call__(self, model: nn.Module) -> OptimWrapper:
+        if hasattr(model, 'module'):
+            model = model.module
+
+        optim_wrapper_cfg = self.optim_wrapper_cfg.copy()
+        optim_wrapper_cfg.setdefault('type', 'OptimWrapper')
+        optimizer_cfg = self.optimizer_cfg.copy()
+
+        # follow the original yolov5 implementation
+        if 'batch_size_per_gpu' in optimizer_cfg:
+            batch_size_per_gpu = optimizer_cfg.pop('batch_size_per_gpu')
+            # No scaling if total_batch_size is less than
+            # base_total_batch_size, otherwise linear scaling.
+            total_batch_size = get_world_size() * batch_size_per_gpu
+            accumulate = max(
+                round(self.base_total_batch_size / total_batch_size), 1)
+            scale_factor = total_batch_size * \
+                accumulate / self.base_total_batch_size
+
+            if scale_factor != 1:
+                weight_decay = optimizer_cfg.get('weight_decay', 0)
+                weight_decay *= scale_factor
+                optimizer_cfg['weight_decay'] = weight_decay
+                print_log(f'Scaled weight_decay to {weight_decay}', 'current')
+
+        # if no paramwise option is specified, just use the global setting
+        if not self.paramwise_cfg:
+            optimizer_cfg['params'] = model.parameters()
+            optimizer = OPTIMIZERS.build(optimizer_cfg)
+        else:
+            # set param-wise lr and weight decay recursively
+            params: List = []
+            self.add_params(params, model)
+            optimizer_cfg['params'] = params
+            optimizer = OPTIMIZERS.build(optimizer_cfg)
+        optim_wrapper = OPTIM_WRAPPERS.build(
+            optim_wrapper_cfg, default_args=dict(optimizer=optimizer))
+        return optim_wrapper
diff --git a/mmdetection_practice/yolo_world/models/__init__.py b/mmdetection_practice/yolo_world/models/__init__.py
new file mode 100644
index 0000000..98bbeae
--- /dev/null
+++ b/mmdetection_practice/yolo_world/models/__init__.py
@@ -0,0 +1,9 @@
+# Copyright (c) Tencent Inc. All rights reserved.
+from .backbones import *  # noqa
+from .layers import *  # noqa
+from .detectors import *  # noqa
+from .losses import *  # noqa
+from .data_preprocessors import *  # noqa
+from .dense_heads import *  # noqa
+from .necks import *  # noqa
+from .assigner import *  # noqa
diff --git a/mmdetection_practice/yolo_world/models/assigner/__init__.py b/mmdetection_practice/yolo_world/models/assigner/__init__.py
new file mode 100644
index 0000000..3200097
--- /dev/null
+++ b/mmdetection_practice/yolo_world/models/assigner/__init__.py
@@ -0,0 +1,3 @@
+from .task_aligned_assigner import YOLOWorldSegAssigner
+
+__all__ = ['YOLOWorldSegAssigner']
\ No newline at end of file
diff --git a/mmdetection_practice/yolo_world/models/assigner/task_aligned_assigner.py b/mmdetection_practice/yolo_world/models/assigner/task_aligned_assigner.py
new file mode 100644
index 0000000..a6f0d24
--- /dev/null
+++ b/mmdetection_practice/yolo_world/models/assigner/task_aligned_assigner.py
@@ -0,0 +1,108 @@
+# Copyright (c) Tencent Inc. All rights reserved.
+import torch
+from torch import Tensor
+from mmyolo.registry import TASK_UTILS
+from mmyolo.models.task_modules.assigners import BatchTaskAlignedAssigner
+from mmyolo.models.task_modules.assigners.utils import select_highest_overlaps
+
+@TASK_UTILS.register_module()
+class YOLOWorldSegAssigner(BatchTaskAlignedAssigner):
+
+    def __init__(self,
+                 num_classes: int,
+                 topk: int = 13,
+                 alpha: float = 1,
+                 beta: float = 6,
+                 eps: float = 1e-7,
+                 use_ciou: bool = False):
+        super().__init__(num_classes, topk, alpha, beta, eps, use_ciou)
+
+    @torch.no_grad()
+    def forward(
+        self,
+        pred_bboxes: Tensor,
+        pred_scores: Tensor,
+        priors: Tensor,
+        gt_labels: Tensor,
+        gt_bboxes: Tensor,
+        pad_bbox_flag: Tensor,
+    ) -> dict:
+        """Assign gt to bboxes.
+
+        The assignment is done in following steps
+        1. compute alignment metric between all bbox (bbox of all pyramid
+           levels) and gt
+        2. select top-k bbox as candidates for each gt
+        3. limit the positive sample's center in gt (because the anchor-free
+           detector only can predict positive distance)
+        Args:
+            pred_bboxes (Tensor): Predict bboxes,
+                shape(batch_size, num_priors, 4)
+            pred_scores (Tensor): Scores of predict bboxes,
+                shape(batch_size, num_priors, num_classes)
+            priors (Tensor): Model priors,  shape (num_priors, 4)
+            gt_labels (Tensor): Ground true labels,
+                shape(batch_size, num_gt, 1)
+            gt_bboxes (Tensor): Ground true bboxes,
+                shape(batch_size, num_gt, 4)
+            pad_bbox_flag (Tensor): Ground truth bbox mask,
+                1 means bbox, 0 means no bbox,
+                shape(batch_size, num_gt, 1)
+        Returns:
+            assigned_result (dict) Assigned result:
+                assigned_labels (Tensor): Assigned labels,
+                    shape(batch_size, num_priors)
+                assigned_bboxes (Tensor): Assigned boxes,
+                    shape(batch_size, num_priors, 4)
+                assigned_scores (Tensor): Assigned scores,
+                    shape(batch_size, num_priors, num_classes)
+                fg_mask_pre_prior (Tensor): Force ground truth matching mask,
+                    shape(batch_size, num_priors)
+        """
+        # (num_priors, 4) -> (num_priors, 2)
+        priors = priors[:, :2]
+
+        batch_size = pred_scores.size(0)
+        num_gt = gt_bboxes.size(1)
+
+        assigned_result = {
+            'assigned_labels':
+            gt_bboxes.new_full(pred_scores[..., 0].shape, self.num_classes),
+            'assigned_bboxes':
+            gt_bboxes.new_full(pred_bboxes.shape, 0),
+            'assigned_scores':
+            gt_bboxes.new_full(pred_scores.shape, 0),
+            'fg_mask_pre_prior':
+            gt_bboxes.new_full(pred_scores[..., 0].shape, 0)
+        }
+
+        if num_gt == 0:
+            return assigned_result
+
+        pos_mask, alignment_metrics, overlaps = self.get_pos_mask(
+            pred_bboxes, pred_scores, priors, gt_labels, gt_bboxes,
+            pad_bbox_flag, batch_size, num_gt)
+
+        (assigned_gt_idxs, fg_mask_pre_prior,
+         pos_mask) = select_highest_overlaps(pos_mask, overlaps, num_gt)
+
+        # assigned target
+        assigned_labels, assigned_bboxes, assigned_scores = self.get_targets(
+            gt_labels, gt_bboxes, assigned_gt_idxs, fg_mask_pre_prior,
+            batch_size, num_gt)
+
+        # normalize
+        alignment_metrics *= pos_mask
+        pos_align_metrics = alignment_metrics.max(axis=-1, keepdim=True)[0]
+        pos_overlaps = (overlaps * pos_mask).max(axis=-1, keepdim=True)[0]
+        norm_align_metric = (
+            alignment_metrics * pos_overlaps /
+            (pos_align_metrics + self.eps)).max(-2)[0].unsqueeze(-1)
+        assigned_scores = assigned_scores * norm_align_metric
+
+        assigned_result['assigned_labels'] = assigned_labels
+        assigned_result['assigned_bboxes'] = assigned_bboxes
+        assigned_result['assigned_scores'] = assigned_scores
+        assigned_result['fg_mask_pre_prior'] = fg_mask_pre_prior.bool()
+        assigned_result['assigned_gt_idxs'] = assigned_gt_idxs
+        return assigned_result
diff --git a/mmdetection_practice/yolo_world/models/backbones/__init__.py b/mmdetection_practice/yolo_world/models/backbones/__init__.py
new file mode 100644
index 0000000..67698ad
--- /dev/null
+++ b/mmdetection_practice/yolo_world/models/backbones/__init__.py
@@ -0,0 +1,16 @@
+# Copyright (c) Tencent Inc. All rights reserved.
+# YOLO Multi-Modal Backbone (Vision Language)
+# Vision: YOLOv8 CSPDarknet
+# Language: CLIP Text Encoder (12-layer transformer)
+from .mm_backbone import (
+    MultiModalYOLOBackbone,
+    HuggingVisionBackbone,
+    HuggingCLIPLanguageBackbone,
+    PseudoLanguageBackbone)
+
+__all__ = [
+    'MultiModalYOLOBackbone',
+    'HuggingVisionBackbone',
+    'HuggingCLIPLanguageBackbone',
+    'PseudoLanguageBackbone'
+]
diff --git a/mmdetection_practice/yolo_world/models/backbones/mm_backbone.py b/mmdetection_practice/yolo_world/models/backbones/mm_backbone.py
new file mode 100644
index 0000000..dcec16e
--- /dev/null
+++ b/mmdetection_practice/yolo_world/models/backbones/mm_backbone.py
@@ -0,0 +1,238 @@
+# Copyright (c) Tencent Inc. All rights reserved.
+import itertools
+import time
+from typing import List, Sequence, Tuple
+import torch
+from torch import Tensor
+from torch.nn.modules.batchnorm import _BatchNorm
+from mmengine.model import BaseModule
+from mmyolo.registry import MODELS
+from mmdet.utils import OptMultiConfig, ConfigType
+from transformers import (AutoTokenizer, AutoModel, CLIPTextConfig)
+from transformers import CLIPTextModelWithProjection as CLIPTP
+
+
+@MODELS.register_module()
+class HuggingVisionBackbone(BaseModule):
+
+    def __init__(self,
+                 model_name: str,
+                 out_indices: Sequence[int] = (0, 1, 2, 3),
+                 norm_eval: bool = True,
+                 frozen_modules: Sequence[str] = (),
+                 init_cfg: OptMultiConfig = None) -> None:
+
+        super().__init__(init_cfg=init_cfg)
+
+        self.norm_eval = norm_eval
+        self.frozen_modules = frozen_modules
+        self.model = AutoModel.from_pretrained(model_name)
+
+        self._freeze_modules()
+
+    def forward(self, image: Tensor) -> Tuple[Tensor]:
+        encoded_dict = self.image_model(pixel_values=image,
+                                        output_hidden_states=True)
+        hidden_states = encoded_dict.hidden_states
+        img_feats = encoded_dict.get('reshaped_hidden_states', hidden_states)
+        img_feats = [img_feats[i] for i in self.image_out_indices]
+        return tuple(img_feats)
+
+    def _freeze_modules(self):
+        for name, module in self.model.named_modules():
+            for frozen_name in self.frozen_modules:
+                if name.startswith(frozen_name):
+                    module.eval()
+                    for param in module.parameters():
+                        param.requires_grad = False
+                    break
+
+    def train(self, mode=True):
+        super().train(mode)
+        self._freeze_modules()
+        if mode and self.norm_eval:
+            for m in self.modules():
+                # trick: eval have effect on BatchNorm only
+                if isinstance(m, _BatchNorm):
+                    m.eval()
+
+
+@MODELS.register_module()
+class HuggingCLIPLanguageBackbone(BaseModule):
+
+    def __init__(self,
+                 model_name: str,
+                 frozen_modules: Sequence[str] = (),
+                 dropout: float = 0.0,
+                 training_use_cache: bool = False,
+                 init_cfg: OptMultiConfig = None) -> None:
+
+        super().__init__(init_cfg=init_cfg)
+
+        self.frozen_modules = frozen_modules
+        self.training_use_cache = training_use_cache
+        self.tokenizer = AutoTokenizer.from_pretrained(model_name)
+        clip_config = CLIPTextConfig.from_pretrained(model_name,
+                                                     attention_dropout=dropout)
+        self.model = CLIPTP.from_pretrained(model_name, config=clip_config)
+        self._freeze_modules()
+
+    def forward_tokenizer(self, texts):
+        if not hasattr(self, 'text'):
+            text = list(itertools.chain(*texts))
+            text = self.tokenizer(text=text, return_tensors='pt', padding=True)
+            self.text = text.to(device=self.model.device)
+        return self.text
+
+    def forward(self, text: List[List[str]]) -> Tensor:
+        num_per_batch = [len(t) for t in text]
+        assert max(num_per_batch) == min(num_per_batch), (
+            'number of sequences not equal in batch')
+        text = list(itertools.chain(*text))
+        text = self.tokenizer(text=text, return_tensors='pt', padding=True)
+        text = text.to(device=self.model.device)
+        txt_outputs = self.model(**text)
+        txt_feats = txt_outputs.text_embeds
+        txt_feats = txt_feats / txt_feats.norm(p=2, dim=-1, keepdim=True)
+        txt_feats = txt_feats.reshape(-1, num_per_batch[0],
+                                      txt_feats.shape[-1])
+        return txt_feats
+
+    def _freeze_modules(self):
+
+        if len(self.frozen_modules) == 0:
+            # not freeze
+            return
+        if self.frozen_modules[0] == "all":
+            self.model.eval()
+            for _, module in self.model.named_modules():
+                module.eval()
+                for param in module.parameters():
+                    param.requires_grad = False
+            return
+        for name, module in self.model.named_modules():
+            for frozen_name in self.frozen_modules:
+                if name.startswith(frozen_name):
+                    module.eval()
+                    for param in module.parameters():
+                        param.requires_grad = False
+                    break
+
+    def train(self, mode=True):
+        super().train(mode)
+        self._freeze_modules()
+
+
+@MODELS.register_module()
+class PseudoLanguageBackbone(BaseModule):
+    """Pseudo Language Backbone
+    Args:
+        text_embed_path (str): path to the text embedding file
+    """
+
+    def __init__(self,
+                 text_embed_path: str = "",
+                 test_embed_path: str = None,
+                 init_cfg: OptMultiConfig = None):
+        super().__init__(init_cfg)
+        # {text:embed}
+        self.text_embed = torch.load(text_embed_path, map_location='cpu')
+        if test_embed_path is None:
+            self.test_embed = self.text_embed
+        else:
+            self.test_embed = torch.load(test_embed_path)
+        self.register_buffer("buff", torch.zeros([
+            1,
+        ]))
+
+    def forward_cache(self, text: List[List[str]]) -> Tensor:
+        if not hasattr(self, "cache"):
+            self.cache = self.forward_text(text)
+        return self.cache
+
+    def forward(self, text: List[List[str]]) -> Tensor:
+        if self.training:
+            return self.forward_text(text)
+        else:
+            return self.forward_cache(text)
+
+    def forward_text(self, text: List[List[str]]) -> Tensor:
+        num_per_batch = [len(t) for t in text]
+        assert max(num_per_batch) == min(num_per_batch), (
+            'number of sequences not equal in batch')
+        text = list(itertools.chain(*text))
+        if self.training:
+            text_embed_dict = self.text_embed
+        else:
+            text_embed_dict = self.test_embed
+        text_embeds = torch.stack(
+            [text_embed_dict[x.split("/")[0]] for x in text])
+        # requires no grad and force to float
+        text_embeds = text_embeds.to(
+            self.buff.device).requires_grad_(False).float()
+        text_embeds = text_embeds.reshape(-1, num_per_batch[0],
+                                          text_embeds.shape[-1])
+        return text_embeds
+
+
+@MODELS.register_module()
+class MultiModalYOLOBackbone(BaseModule):
+
+    def __init__(self,
+                 image_model: ConfigType,
+                 text_model: ConfigType,
+                 frozen_stages: int = -1,
+                 with_text_model: bool = True,
+                 init_cfg: OptMultiConfig = None) -> None:
+        super().__init__(init_cfg)
+        self.with_text_model = with_text_model
+        self.image_model = MODELS.build(image_model)
+        if self.with_text_model:
+            self.text_model = MODELS.build(text_model)
+        else:
+            self.text_model = None
+        self.frozen_stages = frozen_stages
+        self._freeze_stages()
+
+        self.img_backbone_time = 0
+        self.txt_backbone_time = 0
+
+    def _freeze_stages(self):
+        """Freeze the parameters of the specified stage so that they are no
+        longer updated."""
+        if self.frozen_stages >= 0:
+            for i in range(self.frozen_stages + 1):
+                m = getattr(self.image_model, self.image_model.layers[i])
+                m.eval()
+                for param in m.parameters():
+                    param.requires_grad = False
+
+    def train(self, mode: bool = True):
+        """Convert the model into training mode while keep normalization layer
+        frozen."""
+        super().train(mode)
+        self._freeze_stages()
+
+    def forward(self, image: Tensor,
+                text: List[List[str]]) -> Tuple[Tuple[Tensor], Tensor]:
+
+        start_time = time.perf_counter()
+        img_feats = self.image_model(image)
+        self.img_backbone_time = time.perf_counter() - start_time
+
+        start_time = time.perf_counter()
+        if self.with_text_model:
+            txt_feats = self.text_model(text)
+            self.txt_backbone_time = time.perf_counter() - start_time
+            return img_feats, txt_feats
+        else:
+            self.txt_backbone_time = time.perf_counter() - start_time
+            return img_feats, None
+
+    def forward_text(self, text: List[List[str]]) -> Tensor:
+        assert self.with_text_model, "forward_text() requires a text model"
+        txt_feats = self.text_model(text)
+        return txt_feats
+
+    def forward_image(self, image: Tensor) -> Tuple[Tensor]:
+        return self.image_model(image)
diff --git a/mmdetection_practice/yolo_world/models/data_preprocessors/__init__.py b/mmdetection_practice/yolo_world/models/data_preprocessors/__init__.py
new file mode 100644
index 0000000..e3959ac
--- /dev/null
+++ b/mmdetection_practice/yolo_world/models/data_preprocessors/__init__.py
@@ -0,0 +1,4 @@
+# Copyright (c) Tencent Inc. All rights reserved.
+from .data_preprocessor import YOLOWDetDataPreprocessor
+
+__all__ = ['YOLOWDetDataPreprocessor']
diff --git a/mmdetection_practice/yolo_world/models/data_preprocessors/data_preprocessor.py b/mmdetection_practice/yolo_world/models/data_preprocessors/data_preprocessor.py
new file mode 100644
index 0000000..5878706
--- /dev/null
+++ b/mmdetection_practice/yolo_world/models/data_preprocessors/data_preprocessor.py
@@ -0,0 +1,63 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from typing import Optional, Union
+
+import torch
+from mmdet.models.data_preprocessors import DetDataPreprocessor
+from mmengine.structures import BaseDataElement
+
+from mmyolo.registry import MODELS
+
+CastData = Union[tuple, dict, BaseDataElement, torch.Tensor, list, bytes, str,
+                 None]
+
+
+@MODELS.register_module()
+class YOLOWDetDataPreprocessor(DetDataPreprocessor):
+    """Rewrite collate_fn to get faster training speed.
+
+    Note: It must be used together with `mmyolo.datasets.utils.yolow_collate`
+    """
+
+    def __init__(self, *args, non_blocking: Optional[bool] = True, **kwargs):
+        super().__init__(*args, non_blocking=non_blocking, **kwargs)
+
+    def forward(self, data: dict, training: bool = False) -> dict:
+        """Perform normalization, padding and bgr2rgb conversion based on
+        ``DetDataPreprocessorr``.
+
+        Args:
+            data (dict): Data sampled from dataloader.
+            training (bool): Whether to enable training time augmentation.
+
+        Returns:
+            dict: Data in the same format as the model input.
+        """
+        if not training:
+            return super().forward(data, training)
+
+        data = self.cast_data(data)
+        inputs, data_samples = data['inputs'], data['data_samples']
+        assert isinstance(data['data_samples'], dict)
+
+        # TODO: Supports multi-scale training
+        if self._channel_conversion and inputs.shape[1] == 3:
+            inputs = inputs[:, [2, 1, 0], ...]
+        if self._enable_normalize:
+            inputs = (inputs - self.mean) / self.std
+
+        if self.batch_augments is not None:
+            for batch_aug in self.batch_augments:
+                inputs, data_samples = batch_aug(inputs, data_samples)
+
+        img_metas = [{'batch_input_shape': inputs.shape[2:]}] * len(inputs)
+        data_samples_output = {
+            'bboxes_labels': data_samples['bboxes_labels'],
+            'texts': data_samples['texts'],
+            'img_metas': img_metas
+        }
+        if 'masks' in data_samples:
+            data_samples_output['masks'] = data_samples['masks']
+        if 'is_detection' in data_samples:
+            data_samples_output['is_detection'] = data_samples['is_detection']
+
+        return {'inputs': inputs, 'data_samples': data_samples_output}
diff --git a/mmdetection_practice/yolo_world/models/dense_heads/__init__.py b/mmdetection_practice/yolo_world/models/dense_heads/__init__.py
new file mode 100644
index 0000000..9b6dc1b
--- /dev/null
+++ b/mmdetection_practice/yolo_world/models/dense_heads/__init__.py
@@ -0,0 +1,8 @@
+# Copyright (c) Tencent Inc. All rights reserved.
+from .yolo_world_head import YOLOWorldHead, YOLOWorldHeadModule, RepYOLOWorldHeadModule
+from .yolo_world_seg_head import YOLOWorldSegHead, YOLOWorldSegHeadModule
+
+__all__ = [
+    'YOLOWorldHead', 'YOLOWorldHeadModule', 'YOLOWorldSegHead',
+    'YOLOWorldSegHeadModule', 'RepYOLOWorldHeadModule'
+]
diff --git a/mmdetection_practice/yolo_world/models/dense_heads/yolo_world_head.py b/mmdetection_practice/yolo_world/models/dense_heads/yolo_world_head.py
new file mode 100644
index 0000000..9a5c86f
--- /dev/null
+++ b/mmdetection_practice/yolo_world/models/dense_heads/yolo_world_head.py
@@ -0,0 +1,839 @@
+# Copyright (c) Tencent Inc. All rights reserved.
+import math
+import copy
+import time
+from typing import List, Optional, Tuple, Union, Sequence, Dict
+import torch
+import torch.nn as nn
+import torch.nn.functional as F
+import numpy as np
+from mmcv.cnn import ConvModule
+from mmcv.ops import batched_nms
+from mmengine.config import ConfigDict
+from mmengine.model import BaseModule
+from torch import Tensor
+from torch.nn.modules.batchnorm import _BatchNorm
+
+from mmengine.dist import get_dist_info
+from mmengine.structures import InstanceData
+from mmdet.structures import SampleList
+from mmdet.utils import OptConfigType, InstanceList, OptInstanceList
+from mmdet.models.utils import (multi_apply, unpack_gt_instances,
+                                filter_scores_and_topk)
+from mmdet.structures.bbox import (cat_boxes, get_box_tensor, get_box_wh,
+                                   scale_boxes)
+from mmyolo.registry import MODELS
+from mmyolo.models.dense_heads import YOLOv8HeadModule, YOLOv8Head
+from mmyolo.models.utils import gt_instances_preprocess
+from mmcv.cnn.bricks import build_norm_layer
+
+@MODELS.register_module()
+class ContrastiveHead(BaseModule):
+    """Contrastive Head for YOLO-World
+    compute the region-text scores according to the
+    similarity between image and text features
+    Args:
+        embed_dims (int): embed dim of text and image features
+    """
+
+    def __init__(self,
+                 embed_dims: int,
+                 init_cfg: OptConfigType = None,
+                 use_einsum: bool = True) -> None:
+
+        super().__init__(init_cfg=init_cfg)
+
+        self.bias = nn.Parameter(torch.zeros([]))
+        self.logit_scale = nn.Parameter(torch.ones([]) * np.log(1 / 0.07))
+        self.use_einsum = use_einsum
+
+    def forward(self, x: Tensor, w: Tensor) -> Tensor:
+        """
+        Forward function of contrastive learning.
+        x: (B, text_channels, H, W)
+        w: (B, L, text_channels)
+        """
+        x = F.normalize(x, dim=1, p=2)
+        w = F.normalize(w, dim=-1, p=2)
+
+        if self.use_einsum:
+            x = torch.einsum('bchw,bkc->bkhw', x, w)
+        else:
+            batch, channel, height, width = x.shape
+            _, k, _ = w.shape
+            x = x.permute(0, 2, 3, 1)  # bchw->bhwc
+            x = x.reshape(batch, -1, channel)  # bhwc->b(hw)c
+            w = w.permute(0, 2, 1)  # bkc->bck
+            x = torch.matmul(x, w)
+            x = x.reshape(batch, height, width, k)
+            x = x.permute(0, 3, 1, 2)
+
+        x = x * self.logit_scale.exp() + self.bias
+        return x
+
+
+@MODELS.register_module()
+class BNContrastiveHead(BaseModule):
+    """ Batch Norm Contrastive Head for YOLO-World
+    using batch norm instead of l2-normalization
+    Args:
+        embed_dims (int): embed dim of text and image features
+        norm_cfg (dict): normalization params
+    """
+
+    def __init__(self,
+                 embed_dims: int,
+                 norm_cfg: ConfigDict,
+                 init_cfg: OptConfigType = None,
+                 use_einsum: bool = True) -> None:
+
+        super().__init__(init_cfg=init_cfg)
+        self.norm = build_norm_layer(norm_cfg, embed_dims)[1]
+        self.bias = nn.Parameter(torch.zeros([]))
+        # use -1.0 is more stable
+        self.logit_scale = nn.Parameter(-1.0 * torch.ones([]))
+        self.use_einsum = use_einsum
+
+    def forward(self, x: Tensor, w: Tensor) -> Tensor:
+        """Forward function of contrastive learning."""
+        x = self.norm(x)
+        w = F.normalize(w, dim=-1, p=2)
+
+        if self.use_einsum:
+            x = torch.einsum('bchw,bkc->bkhw', x, w)
+        else:
+            batch, channel, height, width = x.shape
+            _, k, _ = w.shape
+            x = x.permute(0, 2, 3, 1)  # bchw->bhwc
+            x = x.reshape(batch, -1, channel)  # bhwc->b(hw)c
+            w = w.permute(0, 2, 1)  # bkc->bck
+            x = torch.matmul(x, w)
+            x = x.reshape(batch, height, width, k)
+            x = x.permute(0, 3, 1, 2)
+
+        x = x * self.logit_scale.exp() + self.bias
+        return x
+
+
+@MODELS.register_module()
+class RepBNContrastiveHead(BaseModule):
+    """ Batch Norm Contrastive Head for YOLO-World
+    using batch norm instead of l2-normalization
+    Args:
+        embed_dims (int): embed dim of text and image features
+        norm_cfg (dict): normalization params
+    """
+
+    def __init__(self,
+                 embed_dims: int,
+                 num_guide_embeds: int,
+                 norm_cfg: ConfigDict,
+                 init_cfg: OptConfigType = None) -> None:
+
+        super().__init__(init_cfg=init_cfg)
+        self.norm = build_norm_layer(norm_cfg, embed_dims)[1]
+        self.conv = nn.Conv2d(embed_dims, num_guide_embeds, kernel_size=1)
+
+    def forward(self, x: Tensor) -> Tensor:
+        """Forward function of contrastive learning."""
+        x = self.norm(x)
+        x = self.conv(x)
+        return x
+
+
+@MODELS.register_module()
+class YOLOWorldHeadModule(YOLOv8HeadModule):
+    """Head Module for YOLO-World
+
+    Args:
+        embed_dims (int): embed dim for text feautures and image features
+        use_bn_head (bool): use batch normalization head
+    """
+
+    def __init__(self,
+                 *args,
+                 embed_dims: int,
+                 use_bn_head: bool = False,
+                 use_einsum: bool = True,
+                 freeze_all: bool = False,
+                 **kwargs) -> None:
+        self.embed_dims = embed_dims
+        self.use_bn_head = use_bn_head
+        self.use_einsum = use_einsum
+        self.freeze_all = freeze_all
+        super().__init__(*args, **kwargs)
+
+    def init_weights(self, prior_prob=0.01):
+        """Initialize the weight and bias of PPYOLOE head."""
+        super().init_weights()
+        for cls_pred, cls_contrast, stride in zip(self.cls_preds,
+                                                  self.cls_contrasts,
+                                                  self.featmap_strides):
+            cls_pred[-1].bias.data[:] = 0.0  # reset bias
+            if hasattr(cls_contrast, 'bias'):
+                nn.init.constant_(
+                    cls_contrast.bias.data,
+                    math.log(5 / self.num_classes / (640 / stride)**2))
+
+    def _init_layers(self) -> None:
+        """initialize conv layers in YOLOv8 head."""
+        # Init decouple head
+        self.cls_preds = nn.ModuleList()
+        self.reg_preds = nn.ModuleList()
+        self.cls_contrasts = nn.ModuleList()
+
+        reg_out_channels = max(
+            (16, self.in_channels[0] // 4, self.reg_max * 4))
+        cls_out_channels = max(self.in_channels[0], self.num_classes)
+
+        for i in range(self.num_levels):
+            self.reg_preds.append(
+                nn.Sequential(
+                    ConvModule(in_channels=self.in_channels[i],
+                               out_channels=reg_out_channels,
+                               kernel_size=3,
+                               stride=1,
+                               padding=1,
+                               norm_cfg=self.norm_cfg,
+                               act_cfg=self.act_cfg),
+                    ConvModule(in_channels=reg_out_channels,
+                               out_channels=reg_out_channels,
+                               kernel_size=3,
+                               stride=1,
+                               padding=1,
+                               norm_cfg=self.norm_cfg,
+                               act_cfg=self.act_cfg),
+                    nn.Conv2d(in_channels=reg_out_channels,
+                              out_channels=4 * self.reg_max,
+                              kernel_size=1)))
+            self.cls_preds.append(
+                nn.Sequential(
+                    ConvModule(in_channels=self.in_channels[i],
+                               out_channels=cls_out_channels,
+                               kernel_size=3,
+                               stride=1,
+                               padding=1,
+                               norm_cfg=self.norm_cfg,
+                               act_cfg=self.act_cfg),
+                    ConvModule(in_channels=cls_out_channels,
+                               out_channels=cls_out_channels,
+                               kernel_size=3,
+                               stride=1,
+                               padding=1,
+                               norm_cfg=self.norm_cfg,
+                               act_cfg=self.act_cfg),
+                    nn.Conv2d(in_channels=cls_out_channels,
+                              out_channels=self.embed_dims,
+                              kernel_size=1)))
+            if self.use_bn_head:
+                self.cls_contrasts.append(
+                    BNContrastiveHead(self.embed_dims,
+                                      self.norm_cfg,
+                                      use_einsum=self.use_einsum))
+            else:
+                self.cls_contrasts.append(
+                    ContrastiveHead(self.embed_dims,
+                                    use_einsum=self.use_einsum))
+
+        proj = torch.arange(self.reg_max, dtype=torch.float)
+        self.register_buffer('proj', proj, persistent=False)
+
+        if self.freeze_all:
+            self._freeze_all()
+
+    def _freeze_all(self):
+        """Freeze the model."""
+        for m in self.modules():
+            if isinstance(m, _BatchNorm):
+                m.eval()
+            for param in m.parameters():
+                param.requires_grad = False
+
+    def train(self, mode=True):
+        super().train(mode)
+        if self.freeze_all:
+            self._freeze_all()
+
+    def forward(self, img_feats: Tuple[Tensor],
+                txt_feats: Tensor) -> Tuple[List]:
+        """Forward features from the upstream network."""
+        assert len(img_feats) == self.num_levels
+        txt_feats = [txt_feats for _ in range(self.num_levels)]
+        return multi_apply(self.forward_single, img_feats, txt_feats,
+                           self.cls_preds, self.reg_preds, self.cls_contrasts)
+
+    def forward_single(self, img_feat: Tensor, txt_feat: Tensor,
+                       cls_pred: nn.ModuleList, reg_pred: nn.ModuleList,
+                       cls_contrast: nn.ModuleList) -> Tuple:
+        """
+        Forward feature of a single scale level.
+        """
+        b, _, h, w = img_feat.shape
+        cls_embed = cls_pred(img_feat)
+        cls_logit = cls_contrast(cls_embed, txt_feat)
+        bbox_dist_preds = reg_pred(img_feat) # (B, 4, H, W)
+        if self.reg_max > 1:
+            # (B, 4, H, W) -> (B, 4, reg_max, HW) -> (B, HW, 4, reg_max)
+            bbox_dist_preds = bbox_dist_preds.reshape(
+                [-1, 4, self.reg_max, h * w]).permute(0, 3, 1, 2)
+
+            # TODO: The get_flops script cannot handle the situation of
+            #  matmul, and needs to be fixed later
+            # bbox_preds = bbox_dist_preds.softmax(3).matmul(self.proj)
+
+            # (B, HW, 4, reg_max)
+            bbox_preds = bbox_dist_preds.softmax(3).matmul(
+                self.proj.view([-1, 1])).squeeze(-1)
+            bbox_preds = bbox_preds.transpose(1, 2).reshape(b, -1, h, w)
+        else:
+            bbox_preds = bbox_dist_preds
+        if self.training:
+            return cls_logit, bbox_preds, bbox_dist_preds
+        else:
+            return cls_logit, bbox_preds
+
+@MODELS.register_module()
+class RepYOLOWorldHeadModule(YOLOWorldHeadModule):
+
+    def __init__(self,
+                 *args,
+                 embed_dims: int,
+                 num_guide: int,
+                 freeze_all: bool = False,
+                 **kwargs) -> None:
+        super().__init__(*args,
+                         embed_dims=embed_dims,
+                         use_bn_head=True,
+                         use_einsum=False,
+                         freeze_all=freeze_all,
+                         **kwargs)
+
+        # using rep head
+        cls_contrasts = []
+        for _ in range(self.num_levels):
+            cls_contrasts.append(
+                RepBNContrastiveHead(
+                    embed_dims=embed_dims,
+                    num_guide_embeds=num_guide,
+                    norm_cfg=self.norm_cfg
+                )
+            )
+        self.cls_contrasts = nn.ModuleList(cls_contrasts)
+
+        self.head_time = 0
+
+    def forward_single(self, img_feat: Tensor, cls_pred: nn.ModuleList,
+                       reg_pred: nn.ModuleList,
+                       cls_contrast: nn.ModuleList) -> Tuple:
+        """Forward features from the upstream network."""
+        b, _, h, w = img_feat.shape
+        cls_embed = cls_pred(img_feat)
+        cls_logit = cls_contrast(cls_embed)
+        bbox_dist_preds = reg_pred(img_feat)
+        if self.reg_max > 1:
+            bbox_dist_preds = bbox_dist_preds.reshape(
+                [-1, 4, self.reg_max, h * w]).permute(0, 3, 1, 2)
+
+            # TODO: The get_flops script cannot handle the situation of
+            #  matmul, and needs to be fixed later
+            # bbox_preds = bbox_dist_preds.softmax(3).matmul(self.proj)
+            bbox_preds = bbox_dist_preds.softmax(3).matmul(
+                self.proj.view([-1, 1])).squeeze(-1)
+            bbox_preds = bbox_preds.transpose(1, 2).reshape(b, -1, h, w)
+        else:
+            bbox_preds = bbox_dist_preds
+        if self.training:
+            return cls_logit, bbox_preds, bbox_dist_preds
+        else:
+            return cls_logit, bbox_preds
+
+    def forward(self, img_feats: Tuple[Tensor]) -> Tuple[List]:
+        assert len(img_feats) == self.num_levels
+        return multi_apply(self.forward_single, img_feats, self.cls_preds,
+                           self.reg_preds, self.cls_contrasts)
+
+
+@MODELS.register_module()
+class YOLOWorldHead(YOLOv8Head):
+    """YOLO-World Head
+    """
+
+    def __init__(self, world_size=-1, *args, **kwargs) -> None:
+        super().__init__(*args, **kwargs)
+        self.world_size = world_size
+        self.nms_time = 0
+
+    """YOLO World v8 head."""
+
+    def loss(self, img_feats: Tuple[Tensor], txt_feats: Tensor,
+             batch_data_samples: Union[list, dict]) -> dict:
+        """
+        Perform forward propagation and loss calculation of the detection
+        head on the features of the upstream network.
+        """
+
+        start_time = time.perf_counter()
+
+        outs = self(img_feats, txt_feats)
+        # Fast version
+        loss_inputs = outs + (batch_data_samples['bboxes_labels'],
+                              batch_data_samples['img_metas'])
+        losses = self.loss_by_feat(*loss_inputs)
+
+        self.head_time = time.perf_counter() - start_time
+
+        return losses
+
+    def loss_and_predict(
+        self,
+        img_feats: Tuple[Tensor],
+        txt_feats: Tensor,
+        batch_data_samples: SampleList,
+        proposal_cfg: Optional[ConfigDict] = None
+    ) -> Tuple[dict, InstanceList]:
+        """Perform forward propagation of the head, then calculate loss and
+        predictions from the features and data samples.
+        """
+        outputs = unpack_gt_instances(batch_data_samples)
+        (batch_gt_instances, batch_gt_instances_ignore,
+         batch_img_metas) = outputs
+
+        outs = self(img_feats, txt_feats)
+
+        loss_inputs = outs + (batch_gt_instances, batch_img_metas,
+                              batch_gt_instances_ignore)
+        losses = self.loss_by_feat(*loss_inputs)
+
+        predictions = self.predict_by_feat(*outs,
+                                           batch_img_metas=batch_img_metas,
+                                           cfg=proposal_cfg)
+        return losses, predictions
+
+    def forward(self, img_feats: Tuple[Tensor],
+                txt_feats: Tensor) -> Tuple[List]:
+        """Forward features from the upstream network."""
+        return self.head_module(img_feats, txt_feats)
+
+    def predict(self,
+                img_feats: Tuple[Tensor],
+                txt_feats: Tensor,
+                batch_data_samples: SampleList,
+                rescale: bool = False) -> InstanceList:
+        """
+        Perform forward propagation of the detection head and predict
+        detection results on the features of the upstream network.
+        """
+
+        batch_img_metas = [
+            data_samples.metainfo for data_samples in batch_data_samples
+        ]
+
+        outs = self(img_feats, txt_feats)
+
+        predictions = self.predict_by_feat(*outs,
+                                           batch_img_metas=batch_img_metas,
+                                           rescale=rescale)
+
+        return predictions
+
+    def aug_test(self,
+                 aug_batch_feats,
+                 aug_batch_img_metas,
+                 rescale=False,
+                 with_ori_nms=False,
+                 **kwargs):
+        """Test function with test time augmentation."""
+        raise NotImplementedError('aug_test is not implemented yet.')
+
+    def loss_by_feat(
+            self,
+            cls_scores: Sequence[Tensor],
+            bbox_preds: Sequence[Tensor],
+            bbox_dist_preds: Sequence[Tensor],
+            batch_gt_instances: Sequence[InstanceData],
+            batch_img_metas: Sequence[dict],
+            batch_gt_instances_ignore: OptInstanceList = None) -> dict:
+        """Calculate the loss based on the features extracted by the detection
+        head.
+
+        Args:
+            cls_scores (Sequence[Tensor]): Box scores for each scale level,
+                each is a 4D-tensor, the channel number is
+                num_priors * num_classes.
+            bbox_preds (Sequence[Tensor]): Box energies / deltas for each scale
+                level, each is a 4D-tensor, the channel number is
+                num_priors * 4.
+            bbox_dist_preds (Sequence[Tensor]): Box distribution logits for
+                each scale level with shape (bs, reg_max + 1, H*W, 4).
+            batch_gt_instances (list[:obj:`InstanceData`]): Batch of
+                gt_instance. It usually includes ``bboxes`` and ``labels``
+                attributes.
+            batch_img_metas (list[dict]): Meta information of each image, e.g.,
+                image size, scaling factor, etc.
+            batch_gt_instances_ignore (list[:obj:`InstanceData`], optional):
+                Batch of gt_instances_ignore. It includes ``bboxes`` attribute
+                data that is ignored during training and testing.
+                Defaults to None.
+        Returns:
+            dict[str, Tensor]: A dictionary of losses.
+        """
+        num_imgs = len(batch_img_metas)
+
+        current_featmap_sizes = [
+            cls_score.shape[2:] for cls_score in cls_scores
+        ]
+        # If the shape does not equal, generate new one
+        if current_featmap_sizes != self.featmap_sizes_train:
+            self.featmap_sizes_train = current_featmap_sizes
+
+            mlvl_priors_with_stride = self.prior_generator.grid_priors(
+                self.featmap_sizes_train,
+                dtype=cls_scores[0].dtype,
+                device=cls_scores[0].device,
+                with_stride=True)
+
+            self.num_level_priors = [len(n) for n in mlvl_priors_with_stride]
+            self.flatten_priors_train = torch.cat(mlvl_priors_with_stride,
+                                                  dim=0)
+            self.stride_tensor = self.flatten_priors_train[..., [2]]
+
+        # gt info
+        gt_info = gt_instances_preprocess(batch_gt_instances, num_imgs)
+        gt_labels = gt_info[:, :, :1]
+        gt_bboxes = gt_info[:, :, 1:]  # xyxy
+        pad_bbox_flag = (gt_bboxes.sum(-1, keepdim=True) > 0).float()
+
+        # pred info
+        flatten_cls_preds = [
+            cls_pred.permute(0, 2, 3, 1).reshape(num_imgs, -1,
+                                                 self.num_classes)
+            for cls_pred in cls_scores
+        ]
+        flatten_pred_bboxes = [
+            bbox_pred.permute(0, 2, 3, 1).reshape(num_imgs, -1, 4)
+            for bbox_pred in bbox_preds
+        ]
+        # (bs, n, 4 * reg_max)
+        flatten_pred_dists = [
+            bbox_pred_org.reshape(num_imgs, -1, self.head_module.reg_max * 4)
+            for bbox_pred_org in bbox_dist_preds
+        ]
+
+        flatten_dist_preds = torch.cat(flatten_pred_dists, dim=1)
+        flatten_cls_preds = torch.cat(flatten_cls_preds, dim=1)
+        flatten_pred_bboxes = torch.cat(flatten_pred_bboxes, dim=1)
+        flatten_pred_bboxes = self.bbox_coder.decode(
+            self.flatten_priors_train[..., :2], flatten_pred_bboxes,
+            self.stride_tensor[..., 0])
+
+        assigned_result = self.assigner(
+            (flatten_pred_bboxes.detach()).type(gt_bboxes.dtype),
+            flatten_cls_preds.detach().sigmoid(), self.flatten_priors_train,
+            gt_labels, gt_bboxes, pad_bbox_flag)
+
+        assigned_bboxes = assigned_result['assigned_bboxes']
+        assigned_scores = assigned_result['assigned_scores']
+        fg_mask_pre_prior = assigned_result['fg_mask_pre_prior']
+
+        assigned_scores_sum = assigned_scores.sum().clamp(min=1)
+
+        loss_cls = self.loss_cls(flatten_cls_preds, assigned_scores).sum()
+        loss_cls /= assigned_scores_sum
+
+        # rescale bbox
+        assigned_bboxes /= self.stride_tensor
+        flatten_pred_bboxes /= self.stride_tensor
+
+        # select positive samples mask
+        num_pos = fg_mask_pre_prior.sum()
+        if num_pos > 0:
+            # when num_pos > 0, assigned_scores_sum will >0, so the loss_bbox
+            # will not report an error
+            # iou loss
+            prior_bbox_mask = fg_mask_pre_prior.unsqueeze(-1).repeat([1, 1, 4])
+            pred_bboxes_pos = torch.masked_select(
+                flatten_pred_bboxes, prior_bbox_mask).reshape([-1, 4])
+            assigned_bboxes_pos = torch.masked_select(
+                assigned_bboxes, prior_bbox_mask).reshape([-1, 4])
+            bbox_weight = torch.masked_select(assigned_scores.sum(-1),
+                                              fg_mask_pre_prior).unsqueeze(-1)
+            loss_bbox = self.loss_bbox(
+                pred_bboxes_pos, assigned_bboxes_pos,
+                weight=bbox_weight) / assigned_scores_sum
+
+            # dfl loss
+            pred_dist_pos = flatten_dist_preds[fg_mask_pre_prior]
+            assigned_ltrb = self.bbox_coder.encode(
+                self.flatten_priors_train[..., :2] / self.stride_tensor,
+                assigned_bboxes,
+                max_dis=self.head_module.reg_max - 1,
+                eps=0.01)
+            assigned_ltrb_pos = torch.masked_select(
+                assigned_ltrb, prior_bbox_mask).reshape([-1, 4])
+            loss_dfl = self.loss_dfl(pred_dist_pos.reshape(
+                -1, self.head_module.reg_max),
+                                     assigned_ltrb_pos.reshape(-1),
+                                     weight=bbox_weight.expand(-1,
+                                                               4).reshape(-1),
+                                     avg_factor=assigned_scores_sum)
+        else:
+            loss_bbox = flatten_pred_bboxes.sum() * 0
+            loss_dfl = flatten_pred_bboxes.sum() * 0
+        if self.world_size == -1:
+            _, world_size = get_dist_info()
+        else:
+            world_size = self.world_size
+        return dict(loss_cls=loss_cls * num_imgs * world_size,
+                    loss_bbox=loss_bbox * num_imgs * world_size,
+                    loss_dfl=loss_dfl * num_imgs * world_size)
+
+    def predict_by_feat(self,
+                        cls_scores: List[Tensor],
+                        bbox_preds: List[Tensor],
+                        objectnesses: Optional[List[Tensor]] = None,
+                        batch_img_metas: Optional[List[dict]] = None,
+                        cfg: Optional[ConfigDict] = None,
+                        rescale: bool = True,
+                        with_nms: bool = True) -> List[InstanceData]:
+        """
+        Transform a batch of output features extracted by the head into
+        bbox results.
+        Args:
+            cls_scores (list[Tensor]): Classification scores for all
+                scale levels, each is a 4D-tensor, has shape
+                (batch_size, num_priors * num_classes, H, W).
+            bbox_preds (list[Tensor]): Box energies / deltas for all
+                scale levels, each is a 4D-tensor, has shape
+                (batch_size, num_priors * 4, H, W).
+            objectnesses (list[Tensor], Optional): Score factor for
+                all scale level, each is a 4D-tensor, has shape
+                (batch_size, 1, H, W).
+            batch_img_metas (list[dict], Optional): Batch image meta info.
+                Defaults to None.
+            cfg (ConfigDict, optional): Test / postprocessing
+                configuration, if None, test_cfg would be used.
+                Defaults to None.
+            rescale (bool): If True, return boxes in original image space.
+                Defaults to False.
+            with_nms (bool): If True, do nms before return boxes.
+                Defaults to True.
+
+        Returns:
+            list[:obj:`InstanceData`]: Object detection results of each image
+            after the post process. Each item usually contains following keys.
+
+            - scores (Tensor): Classification scores, has a shape
+              (num_instance, )
+            - labels (Tensor): Labels of bboxes, has a shape
+              (num_instances, ).
+            - bboxes (Tensor): Has a shape (num_instances, 4),
+              the last dimension 4 arrange as (x1, y1, x2, y2).
+        """
+        assert len(cls_scores) == len(bbox_preds)
+        if objectnesses is None:
+            with_objectnesses = False
+        else:
+            with_objectnesses = True
+            assert len(cls_scores) == len(objectnesses)
+
+        cfg = self.test_cfg if cfg is None else cfg
+        cfg = copy.deepcopy(cfg)
+
+        multi_label = cfg.multi_label
+        multi_label &= self.num_classes > 1
+        cfg.multi_label = multi_label
+
+        num_imgs = len(batch_img_metas)
+        featmap_sizes = [cls_score.shape[2:] for cls_score in cls_scores]
+
+        # If the shape does not change, use the previous mlvl_priors
+        if featmap_sizes != self.featmap_sizes:
+            self.mlvl_priors = self.prior_generator.grid_priors(
+                featmap_sizes,
+                dtype=cls_scores[0].dtype,
+                device=cls_scores[0].device)
+            self.featmap_sizes = featmap_sizes
+        flatten_priors = torch.cat(self.mlvl_priors)
+
+        mlvl_strides = [
+            flatten_priors.new_full(
+                (featmap_size.numel() * self.num_base_priors, ), stride) for
+            featmap_size, stride in zip(featmap_sizes, self.featmap_strides)
+        ]
+        flatten_stride = torch.cat(mlvl_strides)
+
+        # flatten cls_scores, bbox_preds and objectness
+        flatten_cls_scores = [
+            cls_score.permute(0, 2, 3, 1).reshape(num_imgs, -1,
+                                                  self.num_classes)
+            for cls_score in cls_scores
+        ]
+        flatten_bbox_preds = [
+            bbox_pred.permute(0, 2, 3, 1).reshape(num_imgs, -1, 4)
+            for bbox_pred in bbox_preds
+        ]
+
+        flatten_cls_scores = torch.cat(flatten_cls_scores, dim=1).sigmoid()
+        flatten_bbox_preds = torch.cat(flatten_bbox_preds, dim=1)
+        flatten_decoded_bboxes = self.bbox_coder.decode(
+            flatten_priors[None], flatten_bbox_preds, flatten_stride)
+
+        if with_objectnesses:
+            flatten_objectness = [
+                objectness.permute(0, 2, 3, 1).reshape(num_imgs, -1)
+                for objectness in objectnesses
+            ]
+            flatten_objectness = torch.cat(flatten_objectness, dim=1).sigmoid()
+        else:
+            flatten_objectness = [None for _ in range(num_imgs)]
+        # 8400
+        # print(flatten_cls_scores.shape)
+
+        results_list = []
+        for (bboxes, scores, objectness,
+             img_meta) in zip(flatten_decoded_bboxes, flatten_cls_scores,
+                              flatten_objectness, batch_img_metas):
+            ori_shape = img_meta['ori_shape']
+            scale_factor = img_meta['scale_factor']
+            if 'pad_param' in img_meta:
+                pad_param = img_meta['pad_param']
+            else:
+                pad_param = None
+
+            score_thr = cfg.get('score_thr', -1)
+            # yolox_style does not require the following operations
+            if objectness is not None and score_thr > 0 and not cfg.get(
+                    'yolox_style', False):
+                conf_inds = objectness > score_thr
+                bboxes = bboxes[conf_inds, :]
+                scores = scores[conf_inds, :]
+                objectness = objectness[conf_inds]
+
+            if objectness is not None:
+                # conf = obj_conf * cls_conf
+                scores *= objectness[:, None]
+
+            if scores.shape[0] == 0:
+                empty_results = InstanceData()
+                empty_results.bboxes = bboxes
+                empty_results.scores = scores[:, 0]
+                empty_results.labels = scores[:, 0].int()
+                results_list.append(empty_results)
+                continue
+
+            nms_pre = cfg.get('nms_pre', 100000)
+
+            if cfg.multi_label is False:
+                scores, labels = scores.max(1, keepdim=True)
+                scores, _, keep_idxs, results = filter_scores_and_topk(
+                    scores,
+                    score_thr,
+                    nms_pre,
+                    results=dict(labels=labels[:, 0]))
+                labels = results['labels']
+            else:
+                scores, labels, keep_idxs, _ = filter_scores_and_topk(
+                    scores, score_thr, nms_pre)
+
+            results = InstanceData(scores=scores,
+                                   labels=labels,
+                                   bboxes=bboxes[keep_idxs])
+
+
+            # import code; code.interact(local=locals()) # TODO: TOMORROW!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+            # TODO: Class score (8400, 1203) vs. Bbox (8400, 4)????
+
+
+            if rescale:
+                if pad_param is not None:
+                    results.bboxes -= results.bboxes.new_tensor([
+                        pad_param[2], pad_param[0], pad_param[2], pad_param[0]
+                    ])
+                results.bboxes /= results.bboxes.new_tensor(
+                    scale_factor).repeat((1, 2))
+
+            if cfg.get('yolox_style', False):
+                # do not need max_per_img
+                cfg.max_per_img = len(results)
+
+            results = self._bbox_post_process(results=results,
+                                              cfg=cfg,
+                                              rescale=False,
+                                              with_nms=with_nms,
+                                              img_meta=img_meta)
+
+            results.bboxes[:, 0::2].clamp_(0, ori_shape[1])
+            results.bboxes[:, 1::2].clamp_(0, ori_shape[0])
+
+            results_list.append(results)
+        return results_list
+
+
+    def _bbox_post_process(self,
+                           results: InstanceData,
+                           cfg: ConfigDict,
+                           rescale: bool = False,
+                           with_nms: bool = True,
+                           img_meta: Optional[dict] = None) -> InstanceData:
+        """bbox post-processing method.
+
+        The boxes would be rescaled to the original image scale and do
+        the nms operation. Usually `with_nms` is False is used for aug test.
+
+        Args:
+            results (:obj:`InstaceData`): Detection instance results,
+                each item has shape (num_bboxes, ).
+            cfg (ConfigDict): Test / postprocessing configuration,
+                if None, test_cfg would be used.
+            rescale (bool): If True, return boxes in original image space.
+                Default to False.
+            with_nms (bool): If True, do nms before return boxes.
+                Default to True.
+            img_meta (dict, optional): Image meta info. Defaults to None.
+
+        Returns:
+            :obj:`InstanceData`: Detection results of each image
+            after the post process.
+            Each item usually contains following keys.
+
+                - scores (Tensor): Classification scores, has a shape
+                  (num_instance, )
+                - labels (Tensor): Labels of bboxes, has a shape
+                  (num_instances, ).
+                - bboxes (Tensor): Has a shape (num_instances, 4),
+                  the last dimension 4 arrange as (x1, y1, x2, y2).
+        """
+
+
+        if rescale:
+            assert img_meta.get('scale_factor') is not None
+            scale_factor = [1 / s for s in img_meta['scale_factor']]
+            results.bboxes = scale_boxes(results.bboxes, scale_factor)
+
+        if hasattr(results, 'score_factors'):
+            # TODO: Add sqrt operation in order to be consistent with
+            #  the paper.
+            score_factors = results.pop('score_factors')
+            results.scores = results.scores * score_factors
+
+        # filter small size bboxes
+        if cfg.get('min_bbox_size', -1) >= 0:
+            w, h = get_box_wh(results.bboxes)
+            valid_mask = (w > cfg.min_bbox_size) & (h > cfg.min_bbox_size)
+            if not valid_mask.all():
+                results = results[valid_mask]
+
+        # TODO: deal with `with_nms` and `nms_cfg=None` in test_cfg
+        if with_nms and results.bboxes.numel() > 0:
+            bboxes = get_box_tensor(results.bboxes)
+
+            start_time = time.perf_counter()
+            det_bboxes, keep_idxs = batched_nms(bboxes, results.scores, results.labels, cfg.nms)
+            self.nms_time = time.perf_counter() - start_time
+
+            results = results[keep_idxs]
+            # some nms would reweight the score, such as softnms
+            results.scores = det_bboxes[:, -1]
+            results = results[:cfg.max_per_img]
+
+        return results
diff --git a/mmdetection_practice/yolo_world/models/dense_heads/yolo_world_seg_head.py b/mmdetection_practice/yolo_world/models/dense_heads/yolo_world_seg_head.py
new file mode 100644
index 0000000..c79f1cc
--- /dev/null
+++ b/mmdetection_practice/yolo_world/models/dense_heads/yolo_world_seg_head.py
@@ -0,0 +1,550 @@
+# Copyright (c) Lin Song. All rights reserved.
+import math
+from typing import List, Optional, Tuple, Union, Sequence
+
+import torch
+import torch.nn as nn
+import torch.nn.functional as F
+from torch import Tensor
+from torch.nn.modules.batchnorm import _BatchNorm
+
+from mmcv.cnn import ConvModule
+from mmengine.config import ConfigDict
+from mmengine.dist import get_dist_info
+from mmengine.structures import InstanceData
+from mmdet.structures import SampleList
+from mmdet.utils import (ConfigType, OptConfigType, OptInstanceList,
+                         OptMultiConfig, InstanceList)
+from mmdet.models.utils import multi_apply, unpack_gt_instances
+from mmyolo.models.dense_heads import YOLOv8HeadModule
+from mmyolo.models.utils import gt_instances_preprocess
+from mmyolo.registry import MODELS, TASK_UTILS
+from mmyolo.models.dense_heads.yolov5_ins_head import (
+    ProtoModule, YOLOv5InsHead
+)
+
+from .yolo_world_head import ContrastiveHead, BNContrastiveHead
+
+
+@MODELS.register_module()
+class YOLOWorldSegHeadModule(YOLOv8HeadModule):
+    def __init__(self,
+                 *args,
+                 embed_dims: int,
+                 proto_channels: int,
+                 mask_channels: int,
+                 freeze_bbox: bool = False,
+                 freeze_all: bool = False,
+                 use_bn_head: bool = False,
+                 **kwargs) -> None:
+        self.embed_dims = embed_dims
+        self.proto_channels = proto_channels
+        self.mask_channels = mask_channels
+        self.freeze_bbox = freeze_bbox
+        self.freeze_all = freeze_all
+        self.use_bn_head = use_bn_head
+        super().__init__(*args, **kwargs)
+
+    def init_weights(self, prior_prob=0.01):
+        """Initialize the weight and bias of PPYOLOE head."""
+        super().init_weights()
+        for cls_pred, cls_contrast, stride in zip(self.cls_preds,
+                                                  self.cls_contrasts,
+                                                  self.featmap_strides):
+            cls_pred[-1].bias.data[:] = 0.0  # reset bias
+            if hasattr(cls_contrast, 'bias'):
+                nn.init.constant_(
+                    cls_contrast.bias.data,
+                    math.log(5 / self.num_classes / (640 / stride)**2))
+
+    def _init_layers(self) -> None:
+        """initialize conv layers in YOLOv8 head."""
+        # Init decouple head
+        self.cls_preds = nn.ModuleList()
+        self.reg_preds = nn.ModuleList()
+        self.seg_preds = nn.ModuleList()
+        self.cls_contrasts = nn.ModuleList()
+
+        reg_out_channels = max(
+            (16, self.in_channels[0] // 4, self.reg_max * 4))
+        seg_out_channels = max(self.in_channels[0] // 4, self.mask_channels)
+        cls_out_channels = max(self.in_channels[0], self.num_classes)
+
+        bbox_norm_cfg = self.norm_cfg
+        bbox_norm_cfg['requires_grad'] = not self.freeze_bbox
+        if self.freeze_all:
+            self.norm_cfg['requires_grad'] = False
+            bbox_norm_cfg['requires_grad'] = False
+
+        for i in range(self.num_levels):
+            self.reg_preds.append(
+                nn.Sequential(
+                    ConvModule(in_channels=self.in_channels[i],
+                               out_channels=reg_out_channels,
+                               kernel_size=3,
+                               stride=1,
+                               padding=1,
+                               norm_cfg=bbox_norm_cfg,
+                               act_cfg=self.act_cfg),
+                    ConvModule(in_channels=reg_out_channels,
+                               out_channels=reg_out_channels,
+                               kernel_size=3,
+                               stride=1,
+                               padding=1,
+                               norm_cfg=bbox_norm_cfg,
+                               act_cfg=self.act_cfg),
+                    nn.Conv2d(in_channels=reg_out_channels,
+                              out_channels=4 * self.reg_max,
+                              kernel_size=1)))
+            self.cls_preds.append(
+                nn.Sequential(
+                    ConvModule(in_channels=self.in_channels[i],
+                               out_channels=cls_out_channels,
+                               kernel_size=3,
+                               stride=1,
+                               padding=1,
+                               norm_cfg=bbox_norm_cfg,
+                               act_cfg=self.act_cfg),
+                    ConvModule(in_channels=cls_out_channels,
+                               out_channels=cls_out_channels,
+                               kernel_size=3,
+                               stride=1,
+                               padding=1,
+                               norm_cfg=bbox_norm_cfg,
+                               act_cfg=self.act_cfg),
+                    nn.Conv2d(in_channels=cls_out_channels,
+                              out_channels=self.embed_dims,
+                              kernel_size=1)))
+            self.seg_preds.append(
+                nn.Sequential(
+                    ConvModule(in_channels=self.in_channels[i],
+                               out_channels=seg_out_channels,
+                               kernel_size=3,
+                               stride=1,
+                               padding=1,
+                               norm_cfg=self.norm_cfg,
+                               act_cfg=self.act_cfg),
+                    ConvModule(in_channels=seg_out_channels,
+                               out_channels=seg_out_channels,
+                               kernel_size=3,
+                               stride=1,
+                               padding=1,
+                               norm_cfg=self.norm_cfg,
+                               act_cfg=self.act_cfg),
+                    nn.Conv2d(in_channels=seg_out_channels,
+                              out_channels=self.mask_channels,
+                              kernel_size=1)))
+
+            if self.use_bn_head:
+                self.cls_contrasts.append(
+                    BNContrastiveHead(self.embed_dims, self.norm_cfg))
+            else:
+                self.cls_contrasts.append(ContrastiveHead(self.embed_dims))
+
+        proj = torch.arange(self.reg_max, dtype=torch.float)
+        self.register_buffer('proj', proj, persistent=False)
+
+        self.proto_pred = ProtoModule(in_channels=self.in_channels[0],
+                                      middle_channels=self.proto_channels,
+                                      mask_channels=self.mask_channels,
+                                      norm_cfg=self.norm_cfg,
+                                      act_cfg=self.act_cfg)
+        if self.freeze_bbox or self.freeze_bbox:
+            self._freeze_all()
+
+    def _freeze_all(self):
+        frozen_list = [self.cls_preds, self.reg_preds, self.cls_contrasts]
+        if self.freeze_all:
+            frozen_list.extend([self.proto_pred, self.seg_preds])
+        for module in frozen_list:
+            for m in module.modules():
+                if isinstance(m, _BatchNorm):
+                    m.eval()
+                for param in m.parameters():
+                    param.requires_grad = False
+
+    def train(self, mode: bool = True):
+        """Convert the model into training mode while keep normalization layer
+        frozen."""
+        super().train(mode)
+        if self.freeze_bbox or self.freeze_all:
+            self._freeze_all()
+
+    def forward(self, img_feats: Tuple[Tensor],
+                txt_feats: Tensor) -> Tuple[List]:
+        """Forward features from the upstream network."""
+        assert len(img_feats) == self.num_levels
+        txt_feats = [txt_feats for _ in range(self.num_levels)]
+        mask_protos = self.proto_pred(img_feats[0])
+        cls_logit, bbox_preds, bbox_dist_preds, coeff_preds = multi_apply(
+            self.forward_single, img_feats, txt_feats, self.cls_preds,
+            self.reg_preds, self.cls_contrasts, self.seg_preds)
+        if self.training:
+            return cls_logit, bbox_preds, bbox_dist_preds, coeff_preds, mask_protos
+        else:
+            return cls_logit, bbox_preds, None, coeff_preds, mask_protos
+
+    def forward_single(self, img_feat: Tensor, txt_feat: Tensor,
+                       cls_pred: nn.ModuleList, reg_pred: nn.ModuleList,
+                       cls_contrast: nn.ModuleList,
+                       seg_pred: nn.ModuleList) -> Tuple:
+        """Forward feature of a single scale level."""
+        b, _, h, w = img_feat.shape
+        cls_embed = cls_pred(img_feat)
+        cls_logit = cls_contrast(cls_embed, txt_feat)
+        bbox_dist_preds = reg_pred(img_feat)
+        coeff_pred = seg_pred(img_feat)
+        if self.reg_max > 1:
+            bbox_dist_preds = bbox_dist_preds.reshape(
+                [-1, 4, self.reg_max, h * w]).permute(0, 3, 1, 2)
+
+            # TODO: The get_flops script cannot handle the situation of
+            #  matmul, and needs to be fixed later
+            # bbox_preds = bbox_dist_preds.softmax(3).matmul(self.proj)
+            bbox_preds = bbox_dist_preds.softmax(3).matmul(
+                self.proj.view([-1, 1])).squeeze(-1)
+            bbox_preds = bbox_preds.transpose(1, 2).reshape(b, -1, h, w)
+        else:
+            bbox_preds = bbox_dist_preds
+        if self.training:
+            return cls_logit, bbox_preds, bbox_dist_preds, coeff_pred
+        else:
+            return cls_logit, bbox_preds, None, coeff_pred
+
+
+@MODELS.register_module()
+class YOLOWorldSegHead(YOLOv5InsHead):
+    def __init__(self,
+                 head_module: ConfigType,
+                 prior_generator: ConfigType = dict(
+                     type='mmdet.MlvlPointGenerator',
+                     offset=0.5,
+                     strides=[8, 16, 32]),
+                 bbox_coder: ConfigType = dict(type='DistancePointBBoxCoder'),
+                 loss_cls: ConfigType = dict(type='mmdet.CrossEntropyLoss',
+                                             use_sigmoid=True,
+                                             reduction='none',
+                                             loss_weight=0.5),
+                 loss_bbox: ConfigType = dict(type='IoULoss',
+                                              iou_mode='ciou',
+                                              bbox_format='xyxy',
+                                              reduction='sum',
+                                              loss_weight=7.5,
+                                              return_iou=False),
+                 loss_dfl=dict(type='mmdet.DistributionFocalLoss',
+                               reduction='mean',
+                               loss_weight=1.5 / 4),
+                 mask_overlap: bool = True,
+                 loss_mask: ConfigType = dict(type='mmdet.CrossEntropyLoss',
+                                              use_sigmoid=True,
+                                              reduction='none'),
+                 loss_mask_weight=0.05,
+                 train_cfg: OptConfigType = None,
+                 test_cfg: OptConfigType = None,
+                 init_cfg: OptMultiConfig = None):
+        super().__init__(head_module=head_module,
+                         prior_generator=prior_generator,
+                         bbox_coder=bbox_coder,
+                         loss_cls=loss_cls,
+                         loss_bbox=loss_bbox,
+                         train_cfg=train_cfg,
+                         test_cfg=test_cfg,
+                         init_cfg=init_cfg)
+        self.loss_dfl = MODELS.build(loss_dfl)
+        self.loss_obj = None
+        self.mask_overlap = mask_overlap
+        self.loss_mask: nn.Module = MODELS.build(loss_mask)
+        self.loss_mask_weight = loss_mask_weight
+
+    def special_init(self):
+        """Since YOLO series algorithms will inherit from YOLOv5Head, but
+        different algorithms have special initialization process.
+
+        The special_init function is designed to deal with this situation.
+        """
+        if self.train_cfg:
+            self.assigner = TASK_UTILS.build(self.train_cfg.assigner)
+            # Add common attributes to reduce calculation
+            self.featmap_sizes_train = None
+            self.num_level_priors = None
+            self.flatten_priors_train = None
+            self.stride_tensor = None
+
+    """YOLO World head."""
+
+    def loss(self, img_feats: Tuple[Tensor], txt_feats: Tensor,
+             batch_data_samples: Union[list, dict]) -> dict:
+        """Perform forward propagation and loss calculation of the detection
+        head on the features of the upstream network."""
+
+        outs = self(img_feats, txt_feats)
+        # Fast version
+        loss_inputs = outs + (batch_data_samples['bboxes_labels'],
+                              batch_data_samples['masks'],
+                              batch_data_samples['img_metas'])
+        losses = self.loss_by_feat(*loss_inputs)
+
+        return losses
+
+    def loss_and_predict(
+        self,
+        img_feats: Tuple[Tensor],
+        txt_feats: Tensor,
+        batch_data_samples: SampleList,
+        proposal_cfg: Optional[ConfigDict] = None
+    ) -> Tuple[dict, InstanceList]:
+        """Perform forward propagation of the head, then calculate loss and
+        predictions from the features and data samples.
+        """
+        outputs = unpack_gt_instances(batch_data_samples)
+        (batch_gt_instances, batch_gt_instances_ignore,
+         batch_img_metas) = outputs
+
+        outs = self(img_feats, txt_feats)
+
+        loss_inputs = outs + (batch_gt_instances, batch_img_metas,
+                              batch_gt_instances_ignore)
+        losses = self.loss_by_feat(*loss_inputs)
+
+        predictions = self.predict_by_feat(*outs,
+                                           batch_img_metas=batch_img_metas,
+                                           cfg=proposal_cfg)
+        return losses, predictions
+
+    def forward(self, img_feats: Tuple[Tensor],
+                txt_feats: Tensor) -> Tuple[List]:
+        """Forward features from the upstream network."""
+        return self.head_module(img_feats, txt_feats)
+
+    def predict(self,
+                img_feats: Tuple[Tensor],
+                txt_feats: Tensor,
+                batch_data_samples: SampleList,
+                rescale: bool = False) -> InstanceList:
+        """Perform forward propagation of the detection head and predict
+        detection results on the features of the upstream network.
+        """
+        batch_img_metas = [
+            data_samples.metainfo for data_samples in batch_data_samples
+        ]
+        outs = self(img_feats, txt_feats)
+        predictions = self.predict_by_feat(*outs,
+                                           batch_img_metas=batch_img_metas,
+                                           rescale=rescale)
+        return predictions
+
+    def aug_test(self,
+                 aug_batch_feats,
+                 aug_batch_img_metas,
+                 rescale=False,
+                 with_ori_nms=False,
+                 **kwargs):
+        """Test function with test time augmentation."""
+        raise NotImplementedError('aug_test is not implemented yet.')
+
+    def loss_by_feat(
+            self,
+            cls_scores: Sequence[Tensor],
+            bbox_preds: Sequence[Tensor],
+            bbox_dist_preds: Sequence[Tensor],
+            coeff_preds: Sequence[Tensor],
+            proto_preds: Tensor,
+            batch_gt_instances: Sequence[InstanceData],
+            batch_gt_masks: Sequence[Tensor],
+            batch_img_metas: Sequence[dict],
+            batch_gt_instances_ignore: OptInstanceList = None) -> dict:
+        """Calculate the loss based on the features extracted by the detection
+        head.
+
+        Args:
+            cls_scores (Sequence[Tensor]): Box scores for each scale level,
+                each is a 4D-tensor, the channel number is
+                num_priors * num_classes.
+            bbox_preds (Sequence[Tensor]): Box energies / deltas for each scale
+                level, each is a 4D-tensor, the channel number is
+                num_priors * 4.
+            bbox_dist_preds (Sequence[Tensor]): Box distribution logits for
+                each scale level with shape (bs, reg_max + 1, H*W, 4).
+            batch_gt_instances (list[:obj:`InstanceData`]): Batch of
+                gt_instance. It usually includes ``bboxes`` and ``labels``
+                attributes.
+            batch_img_metas (list[dict]): Meta information of each image, e.g.,
+                image size, scaling factor, etc.
+            batch_gt_instances_ignore (list[:obj:`InstanceData`], optional):
+                Batch of gt_instances_ignore. It includes ``bboxes`` attribute
+                data that is ignored during training and testing.
+                Defaults to None.
+        Returns:
+            dict[str, Tensor]: A dictionary of losses.
+        """
+        num_imgs = len(batch_img_metas)
+
+        current_featmap_sizes = [
+            cls_score.shape[2:] for cls_score in cls_scores
+        ]
+        # If the shape does not equal, generate new one
+        if current_featmap_sizes != self.featmap_sizes_train:
+            self.featmap_sizes_train = current_featmap_sizes
+
+            mlvl_priors_with_stride = self.prior_generator.grid_priors(
+                self.featmap_sizes_train,
+                dtype=cls_scores[0].dtype,
+                device=cls_scores[0].device,
+                with_stride=True)
+
+            self.num_level_priors = [len(n) for n in mlvl_priors_with_stride]
+            self.flatten_priors_train = torch.cat(mlvl_priors_with_stride,
+                                                  dim=0)
+            self.stride_tensor = self.flatten_priors_train[..., [2]]
+
+        # gt info
+        gt_info = gt_instances_preprocess(batch_gt_instances, num_imgs)
+        gt_labels = gt_info[:, :, :1]
+        gt_bboxes = gt_info[:, :, 1:]  # xyxy
+        pad_bbox_flag = (gt_bboxes.sum(-1, keepdim=True) > 0).float()
+
+        # pred info
+        flatten_cls_preds = [
+            cls_pred.permute(0, 2, 3, 1).reshape(num_imgs, -1,
+                                                 self.num_classes)
+            for cls_pred in cls_scores
+        ]
+        flatten_pred_bboxes = [
+            bbox_pred.permute(0, 2, 3, 1).reshape(num_imgs, -1, 4)
+            for bbox_pred in bbox_preds
+        ]
+        # (bs, n, 4 * reg_max)
+        flatten_pred_dists = [
+            bbox_pred_org.reshape(num_imgs, -1, self.head_module.reg_max * 4)
+            for bbox_pred_org in bbox_dist_preds
+        ]
+
+        flatten_pred_coeffs = [
+            coeff_pred.permute(0, 2, 3,
+                               1).reshape(num_imgs, -1,
+                                          self.head_module.mask_channels)
+            for coeff_pred in coeff_preds
+        ]
+
+        flatten_dist_preds = torch.cat(flatten_pred_dists, dim=1)
+        flatten_cls_preds = torch.cat(flatten_cls_preds, dim=1)
+        flatten_pred_bboxes = torch.cat(flatten_pred_bboxes, dim=1)
+        flatten_pred_bboxes = self.bbox_coder.decode(
+            self.flatten_priors_train[..., :2], flatten_pred_bboxes,
+            self.stride_tensor[..., 0])
+        flatten_pred_coeffs = torch.cat(flatten_pred_coeffs, dim=1)
+
+        assigned_result = self.assigner(
+            (flatten_pred_bboxes.detach()).type(gt_bboxes.dtype),
+            flatten_cls_preds.detach().sigmoid(), self.flatten_priors_train,
+            gt_labels, gt_bboxes, pad_bbox_flag)
+
+        assigned_bboxes = assigned_result['assigned_bboxes']
+        assigned_scores = assigned_result['assigned_scores']
+        fg_mask_pre_prior = assigned_result['fg_mask_pre_prior']
+        assigned_gt_idxs = assigned_result['assigned_gt_idxs']
+
+        assigned_scores_sum = assigned_scores.sum().clamp(min=1)
+
+        loss_cls = self.loss_cls(flatten_cls_preds, assigned_scores).sum()
+        loss_cls /= assigned_scores_sum
+
+        # rescale bbox
+        assigned_bboxes /= self.stride_tensor
+        flatten_pred_bboxes /= self.stride_tensor
+
+        # select positive samples mask
+        num_pos = fg_mask_pre_prior.sum()
+        if num_pos > 0:
+            # when num_pos > 0, assigned_scores_sum will >0, so the loss_bbox
+            # will not report an error
+            # iou loss
+            prior_bbox_mask = fg_mask_pre_prior.unsqueeze(-1).repeat([1, 1, 4])
+            pred_bboxes_pos = torch.masked_select(
+                flatten_pred_bboxes, prior_bbox_mask).reshape([-1, 4])
+            assigned_bboxes_pos = torch.masked_select(
+                assigned_bboxes, prior_bbox_mask).reshape([-1, 4])
+            bbox_weight = torch.masked_select(assigned_scores.sum(-1),
+                                              fg_mask_pre_prior).unsqueeze(-1)
+            loss_bbox = self.loss_bbox(
+                pred_bboxes_pos, assigned_bboxes_pos,
+                weight=bbox_weight) / assigned_scores_sum
+
+            # dfl loss
+            pred_dist_pos = flatten_dist_preds[fg_mask_pre_prior]
+            assigned_ltrb = self.bbox_coder.encode(
+                self.flatten_priors_train[..., :2] / self.stride_tensor,
+                assigned_bboxes,
+                max_dis=self.head_module.reg_max - 1,
+                eps=0.01)
+            assigned_ltrb_pos = torch.masked_select(
+                assigned_ltrb, prior_bbox_mask).reshape([-1, 4])
+            loss_dfl = self.loss_dfl(pred_dist_pos.reshape(
+                -1, self.head_module.reg_max),
+                                     assigned_ltrb_pos.reshape(-1),
+                                     weight=bbox_weight.expand(-1,
+                                                               4).reshape(-1),
+                                     avg_factor=assigned_scores_sum)
+
+            _, c, mask_h, mask_w = proto_preds.shape
+            if batch_gt_masks.shape[-2:] != (mask_h, mask_w):
+                batch_gt_masks = F.interpolate(batch_gt_masks[None],
+                                               (mask_h, mask_w),
+                                               mode='nearest')[0]
+
+            loss_mask = torch.zeros(1, device=loss_dfl.device)
+            box_sum_flag = pad_bbox_flag.long().sum(dim=1).squeeze(1)
+
+            batch_inds = torch.zeros(num_imgs,
+                                     dtype=torch.int64,
+                                     device=assigned_gt_idxs.device)[:, None]
+            batch_inds[1:] = box_sum_flag.cumsum(dim=0)[:-1][..., None]
+            _assigned_gt_idxs = assigned_gt_idxs + batch_inds
+
+            for bs in range(num_imgs):
+                # 8400
+                bbox_match_inds = assigned_gt_idxs[bs]
+                mask_match_inds = _assigned_gt_idxs[bs]
+
+                bbox_match_inds = torch.masked_select(bbox_match_inds,
+                                                      fg_mask_pre_prior[bs])
+                mask_match_inds = torch.masked_select(mask_match_inds,
+                                                      fg_mask_pre_prior[bs])
+
+                # mask
+                mask_dim = coeff_preds[0].shape[1]
+                prior_mask_mask = fg_mask_pre_prior[bs].unsqueeze(-1).repeat(
+                    [1, mask_dim])
+                pred_coeffs_pos = torch.masked_select(flatten_pred_coeffs[bs],
+                                                      prior_mask_mask).reshape(
+                                                          [-1, mask_dim])
+
+                match_boxes = gt_bboxes[bs][bbox_match_inds] / 4
+                normed_boxes = gt_bboxes[bs][bbox_match_inds] / 640
+
+                bbox_area = (normed_boxes[:, 2:] -
+                             normed_boxes[:, :2]).prod(dim=1)
+                if not mask_match_inds.any():
+                    continue
+                assert not self.mask_overlap
+                mask_gti = batch_gt_masks[mask_match_inds]
+                mask_preds = (
+                    pred_coeffs_pos @ proto_preds[bs].view(c, -1)).view(
+                        -1, mask_h, mask_w)
+                loss_mask_full = self.loss_mask(mask_preds, mask_gti)
+                _loss_mask = (self.crop_mask(loss_mask_full[None],
+                                             match_boxes).mean(dim=(2, 3)) /
+                              bbox_area)
+
+                loss_mask += _loss_mask.mean()
+
+        else:
+            loss_bbox = flatten_pred_bboxes.sum() * 0
+            loss_dfl = flatten_pred_bboxes.sum() * 0
+            loss_mask = flatten_pred_coeffs.sum() * 0
+        _, world_size = get_dist_info()
+
+        return dict(loss_cls=loss_cls * num_imgs * world_size,
+                    loss_bbox=loss_bbox * num_imgs * world_size,
+                    loss_dfl=loss_dfl * num_imgs * world_size,
+                    loss_mask=loss_mask * self.loss_mask_weight * world_size)
diff --git a/mmdetection_practice/yolo_world/models/detectors/__init__.py b/mmdetection_practice/yolo_world/models/detectors/__init__.py
new file mode 100644
index 0000000..991a2e4
--- /dev/null
+++ b/mmdetection_practice/yolo_world/models/detectors/__init__.py
@@ -0,0 +1,4 @@
+# Copyright (c) Tencent Inc. All rights reserved.
+from .yolo_world import YOLOWorldDetector, SimpleYOLOWorldDetector
+
+__all__ = ['YOLOWorldDetector', 'SimpleYOLOWorldDetector']
diff --git a/mmdetection_practice/yolo_world/models/detectors/yolo_world.py b/mmdetection_practice/yolo_world/models/detectors/yolo_world.py
new file mode 100644
index 0000000..4ade136
--- /dev/null
+++ b/mmdetection_practice/yolo_world/models/detectors/yolo_world.py
@@ -0,0 +1,389 @@
+# Copyright (c) Tencent Inc. All rights reserved.
+from typing import List, Tuple, Union
+import time
+import torch
+import torch.nn as nn
+from torch import Tensor
+from mmdet.structures import OptSampleList, SampleList
+from mmyolo.models.detectors import YOLODetector
+from mmyolo.registry import MODELS
+
+
+@MODELS.register_module()
+class MyYOLOWorldDetector(YOLODetector):
+    """For Experiment for YOLO-World Detector"""
+
+    def __init__(self,
+                 *args,
+                 mm_neck: bool = False,
+                 num_train_classes=80,
+                 num_test_classes=80,
+                 **kwargs) -> None:
+        self.mm_neck = mm_neck
+        self.num_train_classes = num_train_classes
+        self.num_test_classes = num_test_classes
+        super().__init__(*args, **kwargs)
+
+        self.backbone_time = 0
+        self.neck_time = 0
+        self.head_time = 0
+
+    def loss(self, batch_inputs: Tensor,
+             batch_data_samples: SampleList) -> Union[dict, list]:
+        """Calculate losses from a batch of inputs and data samples."""
+        self.bbox_head.num_classes = self.num_train_classes
+        img_feats, txt_feats = self.extract_feat(batch_inputs,
+                                                 batch_data_samples)
+        losses = self.bbox_head.loss(img_feats, txt_feats, batch_data_samples)
+        return losses
+
+    def predict(self,
+                batch_inputs: Tensor,
+                batch_data_samples: SampleList,
+                rescale: bool = True) -> SampleList:
+        """
+        Predict results from a batch of inputs and data samples with post-
+        processing.
+        """
+
+        img_feats, txt_feats = self.extract_feat(batch_inputs,
+                                                 batch_data_samples)
+
+        start_time = time.perf_counter()
+
+        # self.bbox_head.num_classes = self.num_test_classes
+        self.bbox_head.num_classes = txt_feats[0].shape[0]
+
+        results_list = self.bbox_head.predict(img_feats,
+                                              txt_feats,
+                                              batch_data_samples,
+                                              rescale=rescale)
+
+        batch_data_samples = self.add_pred_to_datasample(
+            batch_data_samples, results_list)
+
+        self.head_time = time.perf_counter() - start_time
+
+        return batch_data_samples
+
+    def reparameterize(self, texts: List[List[str]]) -> None:
+        # encode text embeddings into the detector
+        self.texts = texts
+        self.text_feats = self.backbone.forward_text(texts)
+
+    def _forward(
+            self,
+            batch_inputs: Tensor,
+            batch_data_samples: OptSampleList = None) -> Tuple[List[Tensor]]:
+        """
+        Network forward process. Usually includes backbone, neck and head
+        forward without any post-processing.
+        """
+
+        img_feats, txt_feats = self.extract_feat(batch_inputs,
+                                                 batch_data_samples)
+        results = self.bbox_head.forward(img_feats, txt_feats)
+        return results
+
+    def extract_feat(
+            self, batch_inputs: Tensor,
+            batch_data_samples: SampleList) -> Tuple[Tuple[Tensor], Tensor]:
+        """Extract features."""
+
+        start_time = time.perf_counter()
+
+        txt_feats = None
+        if batch_data_samples is None:
+            texts = self.texts
+            txt_feats = self.text_feats
+        elif isinstance(batch_data_samples,
+                        dict) and 'texts' in batch_data_samples:
+            texts = batch_data_samples['texts']
+        elif isinstance(batch_data_samples, list) and hasattr(
+                batch_data_samples[0], 'texts'):
+            texts = [data_sample.texts for data_sample in batch_data_samples]
+        elif hasattr(self, 'text_feats'):
+            texts = self.texts
+            txt_feats = self.text_feats
+        else:
+            raise TypeError('batch_data_samples should be dict or list.')
+
+        if txt_feats is not None:
+            # forward image only
+            img_feats = self.backbone.forward_image(batch_inputs)
+        else:
+            img_feats, txt_feats = self.backbone(batch_inputs, texts)
+
+        self.backbone_time = time.perf_counter() - start_time
+
+        start_time = time.perf_counter()
+
+        if self.with_neck:
+            if self.mm_neck:
+                img_feats, txt_feats = self.neck(img_feats, txt_feats)
+            else:
+                img_feats = self.neck(img_feats)
+
+        self.neck_time = time.perf_counter() - start_time
+
+        return img_feats, txt_feats
+
+
+# FIXME: ------------------------------------------------------------------------------------------------------------------------------------------------------------------
+# FIXME: ------------------------------------------------------------------------------------------------------------------------------------------------------------------
+# FIXME: ------------------------------------------------------------------------------------------------------------------------------------------------------------------
+
+
+@MODELS.register_module()
+class YOLOWorldDetector(YOLODetector):
+    """Implementation of YOLOW Series"""
+
+    def __init__(self,
+                 *args,
+                 mm_neck: bool = False,
+                 num_train_classes=80,
+                 num_test_classes=80,
+                 **kwargs) -> None:
+        self.mm_neck = mm_neck
+        self.num_train_classes = num_train_classes
+        self.num_test_classes = num_test_classes
+
+        super().__init__(*args, **kwargs)
+
+        self.backbone_time = 0
+        self.neck_time = 0
+        self.head_time = 0
+
+    def loss(self, batch_inputs: Tensor,
+             batch_data_samples: SampleList) -> Union[dict, list]:
+        """Calculate losses from a batch of inputs and data samples."""
+        self.bbox_head.num_classes = self.num_train_classes
+        img_feats, txt_feats = self.extract_feat(batch_inputs,
+                                                 batch_data_samples)
+        losses = self.bbox_head.loss(img_feats, txt_feats, batch_data_samples)
+        return losses
+
+    def predict(self,
+                batch_inputs: Tensor,
+                batch_data_samples: SampleList,
+                rescale: bool = True) -> SampleList:
+        """
+        Predict results from a batch of inputs and data samples with post-
+        processing.
+        """
+
+        img_feats, txt_feats = self.extract_feat(batch_inputs,
+                                                 batch_data_samples)
+
+        start_time = time.perf_counter()
+
+        # self.bbox_head.num_classes = self.num_test_classes
+        self.bbox_head.num_classes = txt_feats[0].shape[0]
+
+        results_list = self.bbox_head.predict(img_feats,
+                                              txt_feats,
+                                              batch_data_samples,
+                                              rescale=rescale)
+
+        batch_data_samples = self.add_pred_to_datasample(
+            batch_data_samples, results_list)
+
+        self.head_time = time.perf_counter() - start_time
+
+        return batch_data_samples
+
+    def reparameterize(self, texts: List[List[str]]) -> None:
+        # encode text embeddings into the detector
+        self.texts = texts
+        self.text_feats = self.backbone.forward_text(texts)
+
+    def _forward(
+            self,
+            batch_inputs: Tensor,
+            batch_data_samples: OptSampleList = None) -> Tuple[List[Tensor]]:
+        """
+        Network forward process. Usually includes backbone, neck and head
+        forward without any post-processing.
+        """
+
+        img_feats, txt_feats = self.extract_feat(batch_inputs,
+                                                 batch_data_samples)
+        results = self.bbox_head.forward(img_feats, txt_feats)
+        return results
+
+    def extract_feat(
+            self,
+            batch_inputs: Tensor,
+            batch_data_samples: SampleList
+    ) -> Tuple[Tuple[Tensor], Tensor]:
+        """
+        Extract features.
+        (Backbone + Neck)
+        """
+        start_time = time.perf_counter()
+
+        import code; code.interact(local=locals())
+
+        txt_feats = None
+        if batch_data_samples is None:
+            texts = self.texts
+            txt_feats = self.text_feats
+        elif isinstance(batch_data_samples,
+                        dict) and 'texts' in batch_data_samples:
+            texts = batch_data_samples['texts']
+        elif isinstance(batch_data_samples, list) and hasattr(
+                batch_data_samples[0], 'texts'):
+            texts = [data_sample.texts for data_sample in batch_data_samples]
+        elif hasattr(self, 'text_feats'):
+            texts = self.texts
+            txt_feats = self.text_feats
+        else:
+            raise TypeError('batch_data_samples should be dict or list.')
+
+        if txt_feats is not None:
+            # forward image only
+            img_feats = self.backbone.forward_image(batch_inputs)
+        else:
+            img_feats, txt_feats = self.backbone(batch_inputs, texts)
+
+        self.backbone_time = time.perf_counter() - start_time
+
+        start_time = time.perf_counter()
+
+        if self.with_neck:
+            if self.mm_neck:
+                img_feats = self.neck(img_feats, txt_feats)
+            else:
+                img_feats = self.neck(img_feats)
+
+        self.neck_time = time.perf_counter() - start_time
+
+        return img_feats, txt_feats
+
+
+@MODELS.register_module()
+class SimpleYOLOWorldDetector(YOLODetector):
+    """Implementation of YOLO World Series"""
+
+    def __init__(self,
+                 *args,
+                 mm_neck: bool = False,
+                 num_train_classes=80,
+                 num_test_classes=80,
+                 prompt_dim=512,
+                 num_prompts=80,
+                 embedding_path='',
+                 reparameterized=False,
+                 freeze_prompt=False,
+                 use_mlp_adapter=False,
+                 **kwargs) -> None:
+        self.mm_neck = mm_neck
+        self.num_training_classes = num_train_classes
+        self.num_test_classes = num_test_classes
+        self.prompt_dim = prompt_dim
+        self.num_prompts = num_prompts
+        self.reparameterized = reparameterized
+        self.freeze_prompt = freeze_prompt
+        self.use_mlp_adapter = use_mlp_adapter
+        super().__init__(*args, **kwargs)
+
+        if not self.reparameterized:
+            if len(embedding_path) > 0:
+                import numpy as np
+                self.embeddings = torch.nn.Parameter(
+                    torch.from_numpy(np.load(embedding_path)).float())
+            else:
+                # random init
+                embeddings = nn.functional.normalize(torch.randn(
+                    (num_prompts, prompt_dim)),
+                                                     dim=-1)
+                self.embeddings = nn.Parameter(embeddings)
+
+            if self.freeze_prompt:
+                self.embeddings.requires_grad = False
+            else:
+                self.embeddings.requires_grad = True
+
+            if use_mlp_adapter:
+                self.adapter = nn.Sequential(
+                    nn.Linear(prompt_dim, prompt_dim * 2), nn.ReLU(True),
+                    nn.Linear(prompt_dim * 2, prompt_dim))
+            else:
+                self.adapter = None
+
+    def loss(self, batch_inputs: Tensor,
+             batch_data_samples: SampleList) -> Union[dict, list]:
+        """Calculate losses from a batch of inputs and data samples."""
+        self.bbox_head.num_classes = self.num_training_classes
+        img_feats, txt_feats = self.extract_feat(batch_inputs,
+                                                 batch_data_samples)
+        if self.reparameterized:
+            losses = self.bbox_head.loss(img_feats, batch_data_samples)
+        else:
+            losses = self.bbox_head.loss(img_feats, txt_feats,
+                                         batch_data_samples)
+        return losses
+
+    def predict(self,
+                batch_inputs: Tensor,
+                batch_data_samples: SampleList,
+                rescale: bool = True) -> SampleList:
+        """Predict results from a batch of inputs and data samples with post-
+        processing.
+        """
+
+        img_feats, txt_feats = self.extract_feat(batch_inputs,
+                                                 batch_data_samples)
+
+        self.bbox_head.num_classes = self.num_test_classes
+        if self.reparameterized:
+            results_list = self.bbox_head.predict(img_feats,
+                                                  batch_data_samples,
+                                                  rescale=rescale)
+        else:
+            results_list = self.bbox_head.predict(img_feats,
+                                                  txt_feats,
+                                                  batch_data_samples,
+                                                  rescale=rescale)
+
+        batch_data_samples = self.add_pred_to_datasample(
+            batch_data_samples, results_list)
+        return batch_data_samples
+
+    def _forward(
+            self,
+            batch_inputs: Tensor,
+            batch_data_samples: OptSampleList = None) -> Tuple[List[Tensor]]:
+        """Network forward process. Usually includes backbone, neck and head
+        forward without any post-processing.
+        """
+        img_feats, txt_feats = self.extract_feat(batch_inputs,
+                                                 batch_data_samples)
+        if self.reparameterized:
+            results = self.bbox_head.forward(img_feats)
+        else:
+            results = self.bbox_head.forward(img_feats, txt_feats)
+        return results
+
+    def extract_feat(
+            self, batch_inputs: Tensor,
+            batch_data_samples: SampleList) -> Tuple[Tuple[Tensor], Tensor]:
+        """Extract features."""
+        # only image features
+        img_feats, _ = self.backbone(batch_inputs, None)
+
+        if not self.reparameterized:
+            # use embeddings
+            txt_feats = self.embeddings[None]
+            if self.adapter is not None:
+                txt_feats = self.adapter(txt_feats) + txt_feats
+                txt_feats = nn.functional.normalize(txt_feats, dim=-1, p=2)
+            txt_feats = txt_feats.repeat(img_feats[0].shape[0], 1, 1)
+        else:
+            txt_feats = None
+        if self.with_neck:
+            if self.mm_neck:
+                img_feats = self.neck(img_feats, txt_feats)
+            else:
+                img_feats = self.neck(img_feats)
+        return img_feats, txt_feats
diff --git a/mmdetection_practice/yolo_world/models/layers/__init__.py b/mmdetection_practice/yolo_world/models/layers/__init__.py
new file mode 100644
index 0000000..830dc3b
--- /dev/null
+++ b/mmdetection_practice/yolo_world/models/layers/__init__.py
@@ -0,0 +1,18 @@
+# Copyright (c) Tencent Inc. All rights reserved.
+# Basic brick modules for PAFPN based on CSPLayers
+
+from .yolo_bricks import (
+    CSPLayerWithTwoConv,
+    MaxSigmoidAttnBlock,
+    MaxSigmoidCSPLayerWithTwoConv,
+    ImagePoolingAttentionModule,
+    RepConvMaxSigmoidCSPLayerWithTwoConv,
+    RepMaxSigmoidCSPLayerWithTwoConv
+    )
+
+__all__ = ['CSPLayerWithTwoConv',
+           'MaxSigmoidAttnBlock',
+           'MaxSigmoidCSPLayerWithTwoConv',
+           'RepConvMaxSigmoidCSPLayerWithTwoConv',
+           'RepMaxSigmoidCSPLayerWithTwoConv',
+           'ImagePoolingAttentionModule']
diff --git a/mmdetection_practice/yolo_world/models/layers/yolo_bricks.py b/mmdetection_practice/yolo_world/models/layers/yolo_bricks.py
new file mode 100644
index 0000000..cf436fb
--- /dev/null
+++ b/mmdetection_practice/yolo_world/models/layers/yolo_bricks.py
@@ -0,0 +1,991 @@
+# Copyright (c) Tencent Inc. All rights reserved.
+from typing import List
+import time
+import torch
+import math
+import torch.nn as nn
+from torch import Tensor
+import torch.nn.functional as F
+from timm.models.layers import DropPath
+from mmcv.cnn import ConvModule, DepthwiseSeparableConvModule, Linear
+from mmdet.utils import ConfigType, OptConfigType, OptMultiConfig
+from mmengine.model import BaseModule
+from mmyolo.registry import MODELS
+from mmyolo.models.layers import CSPLayerWithTwoConv
+
+
+@MODELS.register_module()
+class BiMultiHeadAttention(nn.Module):
+    def __init__(
+        self,
+        v_dim,
+        l_dim,
+        embed_dim,
+        num_heads,
+        dropout=0.1,
+        stable_softmax_2d=False,
+        clamp_min_for_underflow=True,
+        clamp_max_for_overflow=True,
+    ):
+        super(BiMultiHeadAttention, self).__init__()
+
+        self.embed_dim = embed_dim
+        self.num_heads = num_heads
+        self.head_dim = embed_dim // num_heads
+        self.v_dim = v_dim
+        self.l_dim = l_dim
+
+        assert (
+            self.head_dim * self.num_heads == self.embed_dim
+        ), f"embed_dim must be divisible by num_heads (got `embed_dim`: {self.embed_dim} and `num_heads`: {self.num_heads})."
+        self.scale = self.head_dim ** (-0.5)
+        self.dropout = dropout
+
+        self.v_proj = nn.Linear(self.v_dim, self.embed_dim)
+        self.l_proj = nn.Linear(self.l_dim, self.embed_dim)
+        self.values_v_proj = nn.Linear(self.v_dim, self.embed_dim)
+        self.values_l_proj = nn.Linear(self.l_dim, self.embed_dim)
+
+        self.out_v_proj = nn.Linear(self.embed_dim, self.v_dim)
+        self.out_l_proj = nn.Linear(self.embed_dim, self.l_dim)
+
+        self.stable_softmax_2d = stable_softmax_2d
+        self.clamp_min_for_underflow = clamp_min_for_underflow
+        self.clamp_max_for_overflow = clamp_max_for_overflow
+
+        self._reset_parameters()
+
+    def _shape(self, tensor: torch.Tensor, seq_len: int, bsz: int):
+        return tensor.view(bsz, seq_len, self.num_heads, self.head_dim).transpose(1, 2).contiguous()
+
+    def _reset_parameters(self):
+        nn.init.xavier_uniform_(self.v_proj.weight)
+        self.v_proj.bias.data.fill_(0)
+        nn.init.xavier_uniform_(self.l_proj.weight)
+        self.l_proj.bias.data.fill_(0)
+        nn.init.xavier_uniform_(self.values_v_proj.weight)
+        self.values_v_proj.bias.data.fill_(0)
+        nn.init.xavier_uniform_(self.values_l_proj.weight)
+        self.values_l_proj.bias.data.fill_(0)
+        nn.init.xavier_uniform_(self.out_v_proj.weight)
+        self.out_v_proj.bias.data.fill_(0)
+        nn.init.xavier_uniform_(self.out_l_proj.weight)
+        self.out_l_proj.bias.data.fill_(0)
+
+    def forward(self, v, l):
+        # v: (B, HW, v_dim)
+        # l: (B, L, l_dim)
+
+        bsz, tgt_len, _ = v.size() # (B, HW, v_dim)
+
+        query_states = self.v_proj(v) * self.scale # (B, HW, emb_dim)
+        key_states = self._shape(self.l_proj(l), -1, bsz) # (B, L, emb_dim) -> (B, M, L, emb_dim//M)
+        value_v_states = self._shape(self.values_v_proj(v), -1, bsz) # (B, HW, emb_dim) -> (B, M, HW, emb_dim//M)
+        value_l_states = self._shape(self.values_l_proj(l), -1, bsz) # (B, L, emb_dim) -> (B, M, L, emb_dim//M)
+
+        proj_shape = (bsz * self.num_heads, -1, self.head_dim) # (BM, -1, emb_dim//M)
+        query_states = self._shape(query_states, tgt_len, bsz).view(*proj_shape) # (BM, HW, emb_dim//M)
+        key_states = key_states.view(*proj_shape) # (BM, L, emb_dim//M)
+        value_v_states = value_v_states.view(*proj_shape) # (BM, HW, emb_dim//M)
+        value_l_states = value_l_states.view(*proj_shape) # (BM, L, emb_dim//M)
+
+        src_len = key_states.size(1) # L
+        attn_weights = torch.bmm(query_states, key_states.transpose(1, 2)) # (BM, HW, emb_dim//M) * (BM, L, emb_dim//M) -> (BM, HW, L)
+
+        if attn_weights.size() != (bsz * self.num_heads, tgt_len, src_len):
+            raise ValueError(
+                f"Attention weights should be of size {(bsz * self.num_heads, tgt_len, src_len)}, but is {attn_weights.size()}"
+            )
+
+        if self.stable_softmax_2d:
+            attn_weights = attn_weights - attn_weights.max()
+
+        if self.clamp_min_for_underflow:
+            attn_weights = torch.clamp(
+                attn_weights, min=-50000
+            )  # Do not increase -50000, data type half has quite limited range
+        if self.clamp_max_for_overflow:
+            attn_weights = torch.clamp(
+                attn_weights, max=50000
+            )  # Do not increase 50000, data type half has quite limited range
+
+        attn_weights_T = attn_weights.transpose(1, 2) # (BM, L, HW)
+        attn_weights_l = attn_weights_T - torch.max(attn_weights_T, dim=-1, keepdim=True)[0]
+        if self.clamp_min_for_underflow:
+            attn_weights_l = torch.clamp(
+                attn_weights_l, min=-50000
+            )  # Do not increase -50000, data type half has quite limited range
+        if self.clamp_max_for_overflow:
+            attn_weights_l = torch.clamp(
+                attn_weights_l, max=50000
+            )  # Do not increase 50000, data type half has quite limited range
+
+        attn_weights_l = attn_weights_l.softmax(dim=-1) # (BM, L, HW)
+        attn_weights_v = attn_weights.softmax(dim=-1) # (BM, HW, L)
+
+        attn_probs_v = F.dropout(attn_weights_v, p=self.dropout, training=self.training) # (BM, HW, L)
+        attn_probs_l = F.dropout(attn_weights_l, p=self.dropout, training=self.training) # (BM, L, HW)
+
+        attn_output_v = torch.bmm(attn_probs_v, value_l_states) # (BM, HW, L) * (BM, L, emb_dim//M) -> (BM, HW, emb_dim//M)
+        attn_output_l = torch.bmm(attn_probs_l, value_v_states) # (BM, L, HW) * (BM, HW, emb_dim//M) -> (BM, L, emb_dim//M)
+
+        if attn_output_v.size() != (bsz * self.num_heads, tgt_len, self.head_dim):
+            raise ValueError(
+                f"`attn_output_v` should be of size {(bsz, self.num_heads, tgt_len, self.head_dim)}, but is {attn_output_v.size()}"
+            )
+
+        if attn_output_l.size() != (bsz * self.num_heads, src_len, self.head_dim):
+            raise ValueError(
+                f"`attn_output_l` should be of size {(bsz, self.num_heads, src_len, self.head_dim)}, but is {attn_output_l.size()}"
+            )
+
+
+        attn_output_v = attn_output_v.view(bsz, self.num_heads, tgt_len, self.head_dim) # (B, M, HW, emb_dim//M)
+        attn_output_v = attn_output_v.transpose(1, 2) # (B, HW, M, emb_dim//M)
+        attn_output_v = attn_output_v.reshape(bsz, tgt_len, self.embed_dim) # (B, HW, emb_dim)
+
+        attn_output_l = attn_output_l.view(bsz, self.num_heads, src_len, self.head_dim) # (B, M, L, emb_dim//M)
+        attn_output_l = attn_output_l.transpose(1, 2) # (B, L, M, emb_dim//M)
+        attn_output_l = attn_output_l.reshape(bsz, src_len, self.embed_dim) # (B, L, emb_dim)
+
+        attn_output_v = self.out_v_proj(attn_output_v) # (B, HW, v_dim)
+        attn_output_l = self.out_l_proj(attn_output_l) # (B, L, l_dim)
+
+        return attn_output_v, attn_output_l
+
+@MODELS.register_module()
+class DeepFusionBlock(nn.Module):
+    def __init__(
+        self,
+        widen_factor,
+        img_channel,
+        l_dim,
+        embed_dim,
+        num_heads,
+        dropout=0.1,
+        drop_path=0.0,
+        init_values=1e-4,
+        stable_softmax_2d=False,
+        clamp_min_for_underflow=True,
+        clamp_max_for_overflow=True,
+    ):
+        """
+        Inputs:
+            embed_dim - Dimensionality of input and attention feature vectors
+            num_heads - Number of heads to use in the Multi-Head Attention block
+            dropout - Amount of dropout to apply in the feed-forward network
+        """
+        super(DeepFusionBlock, self).__init__()
+
+        v_dim = img_channel[-1]
+
+        # pre layer norm
+        self.layer_norm_v = nn.LayerNorm(v_dim)
+        self.layer_norm_l = nn.LayerNorm(l_dim)
+        self.attn = BiMultiHeadAttention(
+            v_dim=v_dim,
+            l_dim=l_dim,
+            embed_dim=embed_dim,
+            num_heads=num_heads,
+            dropout=dropout,
+            stable_softmax_2d=stable_softmax_2d,
+            clamp_min_for_underflow=clamp_min_for_underflow,
+            clamp_max_for_overflow=clamp_max_for_overflow,
+        )
+
+        # add layer scale for training stability
+        self.drop_path = DropPath(drop_path) if drop_path > 0.0 else nn.Identity()
+        self.gamma_v = nn.Parameter(init_values * torch.ones((v_dim)), requires_grad=True)
+        self.gamma_l = nn.Parameter(init_values * torch.ones((l_dim)), requires_grad=True)
+
+    def forward(self, img_feats: List[Tensor], text_feats: Tensor):
+        img_feats = list(img_feats)
+        img_feat = img_feats[-1]
+        B, v_dim, H, W = img_feat.shape
+
+        v = img_feat.view(B, v_dim, -1).transpose(1, 2) # (B, HW, v_dim)
+        l = text_feats # (B, L, l_dim)
+
+        v = self.layer_norm_v(v)
+        l = self.layer_norm_l(l)
+        delta_v, delta_l = self.attn(v, l)
+        # v, l = v + delta_v, l + delta_l
+        v = v + self.drop_path(self.gamma_v * delta_v)
+        l = l + self.drop_path(self.gamma_l * delta_l)
+
+        v = v.transpose(1,2).contiguous().view(B, v_dim, H, W)
+        img_feats[-1] = v
+        text_feats = l
+
+        return img_feats, text_feats
+
+
+@MODELS.register_module()
+class MultiScaleDeepFusionBlock(nn.Module):
+    def __init__(
+        self,
+        widen_factor,
+        img_channel,
+        l_dim,
+        num_heads,
+        dropout=0.1,
+        drop_path=0.0,
+        init_values=1e-4,
+        stable_softmax_2d=False,
+        clamp_min_for_underflow=True,
+        clamp_max_for_overflow=True,
+    ):
+        """
+        Inputs:
+            embed_dim - Dimensionality of input and attention feature vectors
+            num_heads - Number of heads to use in the Multi-Head Attention block
+            dropout - Amount of dropout to apply in the feed-forward network
+        """
+        super(MultiScaleDeepFusionBlock, self).__init__()
+
+        v_dims = img_channel
+        self.layer_norm_v = nn.ModuleList(
+            [nn.LayerNorm(v_dim) for v_dim in v_dims]
+        )
+        self.layer_norm_l = nn.LayerNorm(l_dim)
+        self.proj_l = nn.ModuleList(
+            [nn.Linear(l_dim, v_dim) for v_dim in v_dims]
+        )
+
+        self.multi_scale_attn = nn.ModuleList([
+            BiMultiHeadAttention(
+                v_dim=v_dim,
+                l_dim=v_dim,
+                embed_dim=v_dim,
+                num_heads=num_heads,
+                dropout=dropout,
+                stable_softmax_2d=stable_softmax_2d,
+                clamp_min_for_underflow=clamp_min_for_underflow,
+                clamp_max_for_overflow=clamp_max_for_overflow,
+            ) for v_dim in v_dims
+        ])
+
+
+        self.gamma_v = [nn.Parameter(init_values * torch.ones((v_dim), device='cuda'), requires_grad=True) for v_dim in v_dims]
+        self.final_proj_l = nn.Linear(sum(v_dims), l_dim)
+        self.gamma_l = nn.Parameter(init_values * torch.ones((l_dim)), requires_grad=True)
+
+    def forward(self, img_feats: List[Tensor], text_feats: Tensor):
+        img_feats = list(img_feats)
+
+        vs = []
+        delta_ls = []
+        for i, img_feat in enumerate(img_feats):
+            B, v_dim, H, W = img_feat.shape
+            v = img_feat.view(B, v_dim, -1).transpose(1, 2)  # (B, HW, v_dim)
+            l = text_feats  # (B, L, l_dim)
+
+            v = self.layer_norm_v[i](v)
+            l = self.layer_norm_l(l)
+            l = self.proj_l[i](l) # (B, L, v_dim)
+
+            delta_v, delta_l = self.multi_scale_attn[i](v, l)
+
+            delta_ls.append(delta_l)
+
+            v = v + (self.gamma_v[i] * delta_v)
+            v = v.transpose(1, 2).contiguous().view(B, v_dim, H, W)
+            vs.append(v)
+
+        delta_l = torch.cat(delta_ls, dim=-1)
+        delta_l = self.final_proj_l(delta_l) # (B, L, l_dim)
+        text_feats = text_feats + (self.gamma_l * delta_l)
+
+        return vs, text_feats
+
+
+
+@MODELS.register_module()
+class IdentityFusionBLock(nn.Module):
+    """
+    Identity Fusion Block: No fusion!
+    """
+    def __init__(
+            self,
+            widen_factor: float,
+            last_img_channel: int,
+    ):
+        super().__init__()
+
+    def forward(self, img_feats, text_feats):
+        return img_feats, text_feats
+
+
+@MODELS.register_module()
+class MaxSigmoidAttnFusionBLock(nn.Module):
+    """
+    Image-Text concatenation fusion block
+    """
+    def __init__(
+            self,
+            widen_factor: float,
+            last_img_channel: int,
+            text_dimension: int,
+            num_heads: int = 1,
+            with_scale: bool = False,
+            use_depthwise: bool = False,
+            conv_cfg: OptConfigType = None,
+            norm_cfg: ConfigType = dict(type='BN', momentum=0.03, eps=0.001),
+    ):
+        super().__init__()
+        img_channel = int(last_img_channel * widen_factor)
+
+        self.img_proj = nn.Conv2d(img_channel, text_dimension, kernel_size=1, padding=0, stride=1)
+        self.bias = nn.Parameter(torch.zeros(num_heads))
+        self.num_heads = num_heads
+        self.head_channels = text_dimension // num_heads
+        if with_scale:
+            self.scale = nn.Parameter(torch.ones(1, num_heads, 1, 1))
+        else:
+            self.scale = 1.0
+
+        conv = DepthwiseSeparableConvModule if use_depthwise else ConvModule
+        self.project_conv = conv(img_channel,
+                                 img_channel,
+                                 kernel_size=3,
+                                 stride=1,
+                                 padding=1,
+                                 conv_cfg=conv_cfg,
+                                 norm_cfg=norm_cfg,
+                                 act_cfg=None)
+
+    def forward(self, img_feats, text_feats):
+        """
+        img_feats: List[P3, P4, P5]
+        text_feats: (B, L, text_dim)
+        """
+        img_feats = list(img_feats)
+
+        img_feat = img_feats[-1]
+        B, _, H, W = img_feat.shape # (B, img_channel, H, W)
+
+        # (B, img_channel, H, W) -> (B, text_dim, H, W) -> (B, M, text_dim//M, H, W)
+        i_feat = self.img_proj(img_feat).reshape(B, self.num_heads, self.head_channels, H, W)
+        t_feat = text_feats.reshape(B, -1, self.num_heads, self.head_channels) # (B, L, text_dim) -> (B, L, M, text_dim//M)
+
+        attn_weight = torch.einsum('bmchw,bnmc->bmhwn', i_feat, t_feat)  # (B, M, text_dim//M, H, W) * (B, L, M, text_dim//M) -> (B, M, H, W, L)
+
+        attn_weight = attn_weight.max(dim=-1)[0]  # (B, M, H, W)
+        attn_weight = attn_weight / (self.head_channels ** 0.5)
+        attn_weight = attn_weight + self.bias[None, :, None, None]
+        attn_weight = attn_weight.sigmoid() * self.scale # (B, M, H, W)
+
+        img_feat = self.project_conv(img_feat)  # (B, img_channel, H, W) -> (B, img_channel, H, W)
+        img_feat = img_feat.reshape(B, self.num_heads, -1, H, W)  # (B, M, img_channel//M, H, W)
+        img_feat = img_feat * attn_weight.unsqueeze(2)  # (B, M, img_channel//M, H, W) * (B, M, 1, H, W)
+        img_feat = img_feat.reshape(B, -1, H, W) # (B, M, img_channel//M, H, W) -> (B, M, H, W)
+
+        img_feats[-1] = img_feat
+
+        return img_feats, text_feats
+
+
+# FIXME: ------------------------------------------------------------------------------------------------------------------------------------------------------------------
+# FIXME: ------------------------------------------------------------------------------------------------------------------------------------------------------------------
+# FIXME: ------------------------------------------------------------------------------------------------------------------------------------------------------------------
+
+
+@MODELS.register_module()
+class MaxSigmoidAttnBlock(BaseModule):
+    """Max Sigmoid attention block."""
+
+    def __init__(self,
+                 in_channels: int,
+                 out_channels: int,
+                 guide_channels: int,
+                 embed_channels: int,
+                 kernel_size: int = 3,
+                 padding: int = 1,
+                 num_heads: int = 1,
+                 use_depthwise: bool = False,
+                 with_scale: bool = False,
+                 conv_cfg: OptConfigType = None,
+                 norm_cfg: ConfigType = dict(type='BN',
+                                             momentum=0.03,
+                                             eps=0.001),
+                 init_cfg: OptMultiConfig = None,
+                 use_einsum: bool = True) -> None:
+        super().__init__(init_cfg=init_cfg)
+        conv = DepthwiseSeparableConvModule if use_depthwise else ConvModule
+
+        assert (out_channels % num_heads == 0 and
+                embed_channels % num_heads == 0), \
+            'out_channels and embed_channels should be divisible by num_heads.'
+        self.num_heads = num_heads
+        self.head_channels = embed_channels // num_heads
+        self.use_einsum = use_einsum
+
+        self.embed_conv = ConvModule(
+            in_channels,
+            embed_channels,
+            1,
+            conv_cfg=conv_cfg,
+            norm_cfg=norm_cfg,
+            act_cfg=None) if embed_channels != in_channels else None
+        self.guide_fc = Linear(guide_channels, embed_channels)
+        self.bias = nn.Parameter(torch.zeros(num_heads))
+        if with_scale:
+            self.scale = nn.Parameter(torch.ones(1, num_heads, 1, 1))
+        else:
+            self.scale = 1.0
+
+        self.project_conv = conv(in_channels,
+                                 out_channels,
+                                 kernel_size,
+                                 stride=1,
+                                 padding=padding,
+                                 conv_cfg=conv_cfg,
+                                 norm_cfg=norm_cfg,
+                                 act_cfg=None)
+
+    def forward(self, x: Tensor, guide: Tensor) -> Tensor:
+        """Forward process."""
+        B, _, H, W = x.shape
+
+        guide = self.guide_fc(guide) # (B, L, 512) -> (B, L, 256)
+        guide = guide.reshape(B, -1, self.num_heads, self.head_channels) # (B, L, 256) -> (B, L, M, 256//M)
+        embed = self.embed_conv(x) if self.embed_conv is not None else x # (B, C5, H, W) -> (B, 256, H, W)
+        embed = embed.reshape(B, self.num_heads, self.head_channels, H, W) # (B, M, 256//M, H, W)
+
+        if self.use_einsum:
+            attn_weight = torch.einsum('bmchw,bnmc->bmhwn', embed, guide) # (B, M, 256//M, H, W) * (B, L, M, 256//M) -> (B, M, H, W, L)
+        else:
+            batch, m, channel, height, width = embed.shape
+            _, n, _, _ = guide.shape
+            embed = embed.permute(0, 1, 3, 4, 2)
+            embed = embed.reshape(batch, m, -1, channel)
+            guide = guide.permute(0, 2, 3, 1)
+            attn_weight = torch.matmul(embed, guide)
+            attn_weight = attn_weight.reshape(batch, m, height, width, n)
+
+        attn_weight = attn_weight.max(dim=-1)[0] # (B, M, H, W)
+        attn_weight = attn_weight / (self.head_channels**0.5)
+        attn_weight = attn_weight + self.bias[None, :, None, None]
+        attn_weight = attn_weight.sigmoid() * self.scale
+
+        x = self.project_conv(x) # (B, C5, H, W)
+        x = x.reshape(B, self.num_heads, -1, H, W) # (B, M, C5//M, H, W)
+        x = x * attn_weight.unsqueeze(2) # (B, M, C5//M, H, W) * (B, M, 1, H, W)
+        x = x.reshape(B, -1, H, W)
+        return x
+
+
+@MODELS.register_module()
+class RepMatrixMaxSigmoidAttnBlock(BaseModule):
+    """Max Sigmoid attention block."""
+
+    def __init__(self,
+                 in_channels: int,
+                 out_channels: int,
+                 embed_channels: int,
+                 guide_channels: int,
+                 kernel_size: int = 3,
+                 padding: int = 1,
+                 num_heads: int = 1,
+                 use_depthwise: bool = False,
+                 with_scale: bool = False,
+                 conv_cfg: OptConfigType = None,
+                 norm_cfg: ConfigType = dict(type='BN',
+                                             momentum=0.03,
+                                             eps=0.001),
+                 init_cfg: OptMultiConfig = None,
+                 use_einsum: bool = True) -> None:
+        super().__init__(init_cfg=init_cfg)
+        conv = DepthwiseSeparableConvModule if use_depthwise else ConvModule
+
+        assert (out_channels % num_heads == 0 and
+                embed_channels % num_heads == 0), \
+            'out_channels and embed_channels should be divisible by num_heads.'
+        self.num_heads = num_heads
+        self.head_channels = out_channels // num_heads
+        self.use_einsum = use_einsum
+
+        self.embed_conv = ConvModule(
+            in_channels,
+            embed_channels,
+            1,
+            conv_cfg=conv_cfg,
+            norm_cfg=norm_cfg,
+            act_cfg=None) if embed_channels != in_channels else None
+        self.bias = nn.Parameter(torch.zeros(num_heads))
+        self.guide_weight = nn.Parameter(
+            torch.zeros(guide_channels, embed_channels // num_heads,
+                        num_heads))
+        self.project_conv = conv(in_channels,
+                                 out_channels,
+                                 kernel_size,
+                                 stride=1,
+                                 padding=padding,
+                                 conv_cfg=conv_cfg,
+                                 norm_cfg=norm_cfg,
+                                 act_cfg=None)
+
+    def forward(self, x: Tensor, txt_feats: Tensor = None) -> Tensor:
+        """Forward process."""
+        B, _, H, W = x.shape
+
+        embed = self.embed_conv(x) if self.embed_conv is not None else x
+        embed = embed.reshape(B, self.num_heads, self.head_channels, H, W)
+
+        batch, m, channel, height, width = embed.shape
+        _, n, _, _ = self.guide_weight.shape
+        # can be formulated to split conv
+        embed = embed.permute(0, 1, 3, 4, 2)
+        embed = embed.reshape(batch, m, -1, channel)
+        attn_weight = torch.matmul(embed, self.guide_weight)
+        attn_weight = attn_weight.reshape(batch, m, height, width, n)
+
+        attn_weight = attn_weight.max(dim=-1)[0]
+        attn_weight = attn_weight / (self.head_channels**0.5)
+        attn_weight = attn_weight + self.bias[None, :, None, None]
+        attn_weight = attn_weight.sigmoid()
+
+        x = self.project_conv(x)
+        x = x.reshape(B, self.num_heads, -1, H, W)
+        x = x * attn_weight.unsqueeze(2)
+        x = x.reshape(B, -1, H, W)
+        return x
+
+
+@MODELS.register_module()
+class RepConvMaxSigmoidAttnBlock(BaseModule):
+    """Max Sigmoid attention block."""
+
+    def __init__(self,
+                 in_channels: int,
+                 out_channels: int,
+                 embed_channels: int,
+                 guide_channels: int,
+                 kernel_size: int = 3,
+                 padding: int = 1,
+                 num_heads: int = 1,
+                 use_depthwise: bool = False,
+                 with_scale: bool = False,
+                 conv_cfg: OptConfigType = None,
+                 norm_cfg: ConfigType = dict(type='BN',
+                                             momentum=0.03,
+                                             eps=0.001),
+                 init_cfg: OptMultiConfig = None,
+                 use_einsum: bool = True) -> None:
+        super().__init__(init_cfg=init_cfg)
+        conv = DepthwiseSeparableConvModule if use_depthwise else ConvModule
+
+        assert (out_channels % num_heads == 0 and
+                embed_channels % num_heads == 0), \
+            'out_channels and embed_channels should be divisible by num_heads.'
+        self.num_heads = num_heads
+        self.head_channels = out_channels // num_heads
+        self.use_einsum = use_einsum
+
+        self.embed_conv = ConvModule(
+            in_channels,
+            embed_channels,
+            1,
+            conv_cfg=conv_cfg,
+            norm_cfg=norm_cfg,
+            act_cfg=None) if embed_channels != in_channels else None
+        self.bias = nn.Parameter(torch.zeros(num_heads))
+        self.num_heads = num_heads
+        self.split_channels = embed_channels // num_heads
+        self.guide_convs = nn.ModuleList(
+            nn.Conv2d(self.split_channels, guide_channels, 1, bias=False)
+            for _ in range(num_heads))
+        self.project_conv = conv(in_channels,
+                                 out_channels,
+                                 kernel_size,
+                                 stride=1,
+                                 padding=padding,
+                                 conv_cfg=conv_cfg,
+                                 norm_cfg=norm_cfg,
+                                 act_cfg=None)
+
+    def forward(self, x: Tensor, txt_feats: Tensor = None) -> Tensor:
+        """Forward process."""
+        B, C, H, W = x.shape
+
+        embed = self.embed_conv(x) if self.embed_conv is not None else x
+        embed = list(embed.split(self.split_channels, 1))
+        # Bx(MxN)xHxW (H*c=C, H: heads)
+        attn_weight = torch.cat(
+            [conv(x) for conv, x in zip(self.guide_convs, embed)], dim=1)
+        # BxMxNxHxW
+        attn_weight = attn_weight.view(B, self.num_heads, -1, H, W)
+        # attn_weight = torch.stack(
+        #     [conv(x) for conv, x in zip(self.guide_convs, embed)])
+        # BxMxNxHxW -> BxMxHxW
+        attn_weight = attn_weight.max(dim=2)[0] / (self.head_channels**0.5)
+        attn_weight = (attn_weight + self.bias.view(1, -1, 1, 1)).sigmoid()
+        # .transpose(0, 1)
+        # BxMx1xHxW
+        attn_weight = attn_weight[:, :, None]
+        x = self.project_conv(x)
+        # BxHxCxHxW
+        x = x.view(B, self.num_heads, -1, H, W)
+        x = x * attn_weight
+        x = x.view(B, -1, H, W)
+        return x
+
+
+@MODELS.register_module()
+class MaxSigmoidCSPLayerWithTwoConv(CSPLayerWithTwoConv):
+    """Sigmoid-attention based CSP layer with two convolution layers."""
+
+    def __init__(
+            self,
+            in_channels: int,
+            out_channels: int,
+            guide_channels: int,
+            embed_channels: int,
+            num_heads: int = 1,
+            expand_ratio: float = 0.5,
+            num_blocks: int = 1,
+            with_scale: bool = False,
+            add_identity: bool = True,  # shortcut
+            conv_cfg: OptConfigType = None,
+            norm_cfg: ConfigType = dict(type='BN', momentum=0.03, eps=0.001),
+            act_cfg: ConfigType = dict(type='SiLU', inplace=True),
+            init_cfg: OptMultiConfig = None,
+            use_einsum: bool = True) -> None:
+        super().__init__(in_channels=in_channels,
+                         out_channels=out_channels,
+                         expand_ratio=expand_ratio,
+                         num_blocks=num_blocks,
+                         add_identity=add_identity,
+                         conv_cfg=conv_cfg,
+                         norm_cfg=norm_cfg,
+                         act_cfg=act_cfg,
+                         init_cfg=init_cfg)
+
+        self.final_conv = ConvModule((3 + num_blocks) * self.mid_channels,
+                                     out_channels,
+                                     1,
+                                     conv_cfg=conv_cfg,
+                                     norm_cfg=norm_cfg,
+                                     act_cfg=act_cfg)
+
+        self.attn_block = MaxSigmoidAttnBlock(self.mid_channels,
+                                              self.mid_channels,
+                                              guide_channels=guide_channels,
+                                              embed_channels=embed_channels,
+                                              num_heads=num_heads,
+                                              with_scale=with_scale,
+                                              conv_cfg=conv_cfg,
+                                              norm_cfg=norm_cfg,
+                                              use_einsum=use_einsum)
+
+        self.fusion_time1 = 0
+
+    def forward(self, x: Tensor, guide: Tensor) -> Tensor:
+        """Forward process."""
+        x_main = self.main_conv(x)
+        x_main = list(x_main.split((self.mid_channels, self.mid_channels), 1))
+        x_main.extend(blocks(x_main[-1]) for blocks in self.blocks)
+
+        start_time = time.perf_counter()
+        x_main.append(self.attn_block(x_main[-1], guide))
+        self.fusion_time1 = time.perf_counter() - start_time
+
+        return self.final_conv(torch.cat(x_main, 1))
+
+
+@MODELS.register_module()
+class RepMaxSigmoidCSPLayerWithTwoConv(CSPLayerWithTwoConv):
+    """Sigmoid-attention based CSP layer with two convolution layers."""
+
+    def __init__(
+            self,
+            in_channels: int,
+            out_channels: int,
+            guide_channels: int,
+            embed_channels: int,
+            num_heads: int = 1,
+            expand_ratio: float = 0.5,
+            num_blocks: int = 1,
+            with_scale: bool = False,
+            add_identity: bool = True,  # shortcut
+            conv_cfg: OptConfigType = None,
+            norm_cfg: ConfigType = dict(type='BN', momentum=0.03, eps=0.001),
+            act_cfg: ConfigType = dict(type='SiLU', inplace=True),
+            init_cfg: OptMultiConfig = None,
+            use_einsum: bool = True) -> None:
+        super().__init__(in_channels=in_channels,
+                         out_channels=out_channels,
+                         expand_ratio=expand_ratio,
+                         num_blocks=num_blocks,
+                         add_identity=add_identity,
+                         conv_cfg=conv_cfg,
+                         norm_cfg=norm_cfg,
+                         act_cfg=act_cfg,
+                         init_cfg=init_cfg)
+
+        self.final_conv = ConvModule((3 + num_blocks) * self.mid_channels,
+                                     out_channels,
+                                     1,
+                                     conv_cfg=conv_cfg,
+                                     norm_cfg=norm_cfg,
+                                     act_cfg=act_cfg)
+
+        self.attn_block = RepMatrixMaxSigmoidAttnBlock(
+            self.mid_channels,
+            self.mid_channels,
+            embed_channels=embed_channels,
+            guide_channels=guide_channels,
+            num_heads=num_heads,
+            with_scale=with_scale,
+            conv_cfg=conv_cfg,
+            norm_cfg=norm_cfg,
+            use_einsum=use_einsum)
+
+    def forward(self, x: Tensor, guide: Tensor) -> Tensor:
+        """Forward process."""
+        x_main = self.main_conv(x)
+        x_main = list(x_main.split((self.mid_channels, self.mid_channels), 1))
+        x_main.extend(blocks(x_main[-1]) for blocks in self.blocks)
+        x_main.append(self.attn_block(x_main[-1], guide))
+        return self.final_conv(torch.cat(x_main, 1))
+
+
+@MODELS.register_module()
+class RepConvMaxSigmoidCSPLayerWithTwoConv(CSPLayerWithTwoConv):
+    """Sigmoid-attention based CSP layer with two convolution layers."""
+
+    def __init__(
+            self,
+            in_channels: int,
+            out_channels: int,
+            guide_channels: int,
+            embed_channels: int,
+            num_heads: int = 1,
+            expand_ratio: float = 0.5,
+            num_blocks: int = 1,
+            with_scale: bool = False,
+            add_identity: bool = True,  # shortcut
+            conv_cfg: OptConfigType = None,
+            norm_cfg: ConfigType = dict(type='BN', momentum=0.03, eps=0.001),
+            act_cfg: ConfigType = dict(type='SiLU', inplace=True),
+            init_cfg: OptMultiConfig = None,
+            use_einsum: bool = True) -> None:
+        super().__init__(in_channels=in_channels,
+                         out_channels=out_channels,
+                         expand_ratio=expand_ratio,
+                         num_blocks=num_blocks,
+                         add_identity=add_identity,
+                         conv_cfg=conv_cfg,
+                         norm_cfg=norm_cfg,
+                         act_cfg=act_cfg,
+                         init_cfg=init_cfg)
+
+        self.final_conv = ConvModule((3 + num_blocks) * self.mid_channels,
+                                     out_channels,
+                                     1,
+                                     conv_cfg=conv_cfg,
+                                     norm_cfg=norm_cfg,
+                                     act_cfg=act_cfg)
+
+        self.attn_block = RepConvMaxSigmoidAttnBlock(
+            self.mid_channels,
+            self.mid_channels,
+            embed_channels=embed_channels,
+            guide_channels=guide_channels,
+            num_heads=num_heads,
+            with_scale=with_scale,
+            conv_cfg=conv_cfg,
+            norm_cfg=norm_cfg,
+            use_einsum=use_einsum)
+
+    def forward(self, x: Tensor, guide: Tensor) -> Tensor:
+        """Forward process."""
+        x_main = self.main_conv(x)
+        x_main = list(x_main.split((self.mid_channels, self.mid_channels), 1))
+        x_main.extend(blocks(x_main[-1]) for blocks in self.blocks)
+        x_main.append(self.attn_block(x_main[-1], guide))
+        return self.final_conv(torch.cat(x_main, 1))
+
+
+@MODELS.register_module()
+class ImagePoolingAttentionModule(nn.Module):
+
+    def __init__(self,
+                 image_channels: List[int],
+                 text_channels: int,
+                 embed_channels: int,
+                 with_scale: bool = False,
+                 num_feats: int = 3,
+                 num_heads: int = 8,
+                 pool_size: int = 3,
+                 use_einsum: bool = True):
+        super().__init__()
+
+        self.text_channels = text_channels
+        self.embed_channels = embed_channels
+        self.num_heads = num_heads
+        self.num_feats = num_feats
+        self.head_channels = embed_channels // num_heads
+        self.pool_size = pool_size
+        self.use_einsum = use_einsum
+        if with_scale:
+            self.scale = nn.Parameter(torch.tensor([0.]), requires_grad=True)
+        else:
+            self.scale = 1.0
+        self.projections = nn.ModuleList([
+            ConvModule(in_channels, embed_channels, 1, act_cfg=None)
+            for in_channels in image_channels
+        ])
+        self.query = nn.Sequential(nn.LayerNorm(text_channels),
+                                   Linear(text_channels, embed_channels))
+        self.key = nn.Sequential(nn.LayerNorm(embed_channels),
+                                 Linear(embed_channels, embed_channels))
+        self.value = nn.Sequential(nn.LayerNorm(embed_channels),
+                                   Linear(embed_channels, embed_channels))
+        self.proj = Linear(embed_channels, text_channels)
+
+        self.image_pools = nn.ModuleList([
+            nn.AdaptiveMaxPool2d((pool_size, pool_size))
+            for _ in range(num_feats)
+        ])
+
+        self.fusion_time2 = 0
+
+    def forward(self, text_features, image_features):
+        start_time = time.perf_counter()
+
+        B = image_features[0].shape[0]
+        assert len(image_features) == self.num_feats
+        num_patches = self.pool_size**2
+        mlvl_image_features = [
+            pool(proj(x)).view(B, -1, num_patches)
+            for (x, proj, pool
+                 ) in zip(image_features, self.projections, self.image_pools)
+        ]
+        mlvl_image_features = torch.cat(mlvl_image_features,
+                                        dim=-1).transpose(1, 2)
+        q = self.query(text_features)
+        k = self.key(mlvl_image_features)
+        v = self.value(mlvl_image_features)
+
+        q = q.reshape(B, -1, self.num_heads, self.head_channels)
+        k = k.reshape(B, -1, self.num_heads, self.head_channels)
+        v = v.reshape(B, -1, self.num_heads, self.head_channels)
+        if self.use_einsum:
+            attn_weight = torch.einsum('bnmc,bkmc->bmnk', q, k)
+        else:
+            q = q.permute(0, 2, 1, 3)
+            k = k.permute(0, 2, 3, 1)
+            attn_weight = torch.matmul(q, k)
+
+        attn_weight = attn_weight / (self.head_channels**0.5)
+        attn_weight = F.softmax(attn_weight, dim=-1)
+        if self.use_einsum:
+            x = torch.einsum('bmnk,bkmc->bnmc', attn_weight, v)
+        else:
+            v = v.permute(0, 2, 1, 3)
+            x = torch.matmul(attn_weight, v)
+            x = x.permute(0, 2, 1, 3)
+        x = self.proj(x.reshape(B, -1, self.embed_channels))
+
+        self.fusion_time2 = time.perf_counter() - start_time
+        return x * self.scale + text_features
+
+
+@MODELS.register_module()
+class VanillaSigmoidBlock(BaseModule):
+    """Sigmoid attention block."""
+
+    def __init__(self,
+                 in_channels: int,
+                 out_channels: int,
+                 guide_channels: int,
+                 embed_channels: int,
+                 kernel_size: int = 3,
+                 padding: int = 1,
+                 num_heads: int = 1,
+                 use_depthwise: bool = False,
+                 with_scale: bool = False,
+                 conv_cfg: OptConfigType = None,
+                 norm_cfg: ConfigType = dict(type='BN',
+                                             momentum=0.03,
+                                             eps=0.001),
+                 init_cfg: OptMultiConfig = None) -> None:
+        super().__init__(init_cfg=init_cfg)
+        conv = DepthwiseSeparableConvModule if use_depthwise else ConvModule
+
+        assert (out_channels % num_heads == 0 and
+                embed_channels % num_heads == 0), \
+            'out_channels and embed_channels should be divisible by num_heads.'
+        self.num_heads = num_heads
+        self.head_channels = out_channels // num_heads
+
+        self.project_conv = conv(in_channels,
+                                 out_channels,
+                                 kernel_size,
+                                 stride=1,
+                                 padding=padding,
+                                 conv_cfg=conv_cfg,
+                                 norm_cfg=norm_cfg,
+                                 act_cfg=None)
+
+    def forward(self, x: Tensor, guide: Tensor) -> Tensor:
+        """Forward process."""
+        x = self.project_conv(x)
+        # remove sigmoid
+        # x = x * x.sigmoid()
+        return x
+
+
+@MODELS.register_module()
+class EfficientCSPLayerWithTwoConv(CSPLayerWithTwoConv):
+    """Sigmoid-attention based CSP layer with two convolution layers."""
+
+    def __init__(
+            self,
+            in_channels: int,
+            out_channels: int,
+            guide_channels: int,
+            embed_channels: int,
+            num_heads: int = 1,
+            expand_ratio: float = 0.5,
+            num_blocks: int = 1,
+            with_scale: bool = False,
+            add_identity: bool = True,  # shortcut
+            conv_cfg: OptConfigType = None,
+            norm_cfg: ConfigType = dict(type='BN', momentum=0.03, eps=0.001),
+            act_cfg: ConfigType = dict(type='SiLU', inplace=True),
+            init_cfg: OptMultiConfig = None) -> None:
+        super().__init__(in_channels=in_channels,
+                         out_channels=out_channels,
+                         expand_ratio=expand_ratio,
+                         num_blocks=num_blocks,
+                         add_identity=add_identity,
+                         conv_cfg=conv_cfg,
+                         norm_cfg=norm_cfg,
+                         act_cfg=act_cfg,
+                         init_cfg=init_cfg)
+
+        self.final_conv = ConvModule((3 + num_blocks) * self.mid_channels,
+                                     out_channels,
+                                     1,
+                                     conv_cfg=conv_cfg,
+                                     norm_cfg=norm_cfg,
+                                     act_cfg=act_cfg)
+
+        self.attn_block = VanillaSigmoidBlock(self.mid_channels,
+                                              self.mid_channels,
+                                              guide_channels=guide_channels,
+                                              embed_channels=embed_channels,
+                                              num_heads=num_heads,
+                                              with_scale=with_scale,
+                                              conv_cfg=conv_cfg,
+                                              norm_cfg=norm_cfg)
+
+    def forward(self, x: Tensor, guide: Tensor) -> Tensor:
+        """Forward process."""
+        x_main = self.main_conv(x)
+        x_main = list(x_main.split((self.mid_channels, self.mid_channels), 1))
+        x_main.extend(blocks(x_main[-1]) for blocks in self.blocks)
+        x_main.append(self.attn_block(x_main[-1], guide))
+        return self.final_conv(torch.cat(x_main, 1))
diff --git a/mmdetection_practice/yolo_world/models/losses/__init__.py b/mmdetection_practice/yolo_world/models/losses/__init__.py
new file mode 100644
index 0000000..8423e30
--- /dev/null
+++ b/mmdetection_practice/yolo_world/models/losses/__init__.py
@@ -0,0 +1,4 @@
+# Copyright (c) Tencent Inc. All rights reserved.
+from .dynamic_loss import CoVMSELoss
+
+__all__ = ['CoVMSELoss']
diff --git a/mmdetection_practice/yolo_world/models/losses/dynamic_loss.py b/mmdetection_practice/yolo_world/models/losses/dynamic_loss.py
new file mode 100644
index 0000000..30d56c3
--- /dev/null
+++ b/mmdetection_practice/yolo_world/models/losses/dynamic_loss.py
@@ -0,0 +1,38 @@
+# Copyright (c) Tencent Inc. All rights reserved.
+from typing import Optional
+
+import torch
+import torch.nn as nn
+from torch import Tensor
+from mmdet.models.losses.mse_loss import mse_loss
+from mmyolo.registry import MODELS
+
+
+@MODELS.register_module()
+class CoVMSELoss(nn.Module):
+
+    def __init__(self,
+                 dim: int = 0,
+                 reduction: str = 'mean',
+                 loss_weight: float = 1.0,
+                 eps: float = 1e-6) -> None:
+        super().__init__()
+        self.dim = dim
+        self.reduction = reduction
+        self.loss_weight = loss_weight
+        self.eps = eps
+
+    def forward(self,
+                pred: Tensor,
+                weight: Optional[Tensor] = None,
+                avg_factor: Optional[int] = None,
+                reduction_override: Optional[str] = None) -> Tensor:
+        """Forward function of loss."""
+        assert reduction_override in (None, 'none', 'mean', 'sum')
+        reduction = (
+            reduction_override if reduction_override else self.reduction)
+        cov = pred.std(self.dim) / pred.mean(self.dim).clamp(min=self.eps)
+        target = torch.zeros_like(cov)
+        loss = self.loss_weight * mse_loss(
+            cov, target, weight, reduction=reduction, avg_factor=avg_factor)
+        return loss
diff --git a/mmdetection_practice/yolo_world/models/necks/__init__.py b/mmdetection_practice/yolo_world/models/necks/__init__.py
new file mode 100644
index 0000000..4d5219c
--- /dev/null
+++ b/mmdetection_practice/yolo_world/models/necks/__init__.py
@@ -0,0 +1,4 @@
+# Copyright (c) Tencent Inc. All rights reserved.
+from .yolo_world_pafpn import YOLOWorldPAFPN, YOLOWorldDualPAFPN
+
+__all__ = ['YOLOWorldPAFPN', 'YOLOWorldDualPAFPN']
diff --git a/mmdetection_practice/yolo_world/models/necks/yolo_world_pafpn.py b/mmdetection_practice/yolo_world/models/necks/yolo_world_pafpn.py
new file mode 100644
index 0000000..1e1af0b
--- /dev/null
+++ b/mmdetection_practice/yolo_world/models/necks/yolo_world_pafpn.py
@@ -0,0 +1,466 @@
+# Copyright (c) Tencent Inc. All rights reserved.
+import copy
+import time
+from typing import List, Union
+
+import torch
+import torch.nn as nn
+from torch import Tensor
+from mmdet.utils import ConfigType, OptMultiConfig
+
+from mmyolo.registry import MODELS
+from mmyolo.models.utils import make_divisible, make_round
+from mmyolo.models.necks.yolov8_pafpn import YOLOv8PAFPN
+from mmyolo.models.layers import CSPLayerWithTwoConv
+
+
+@MODELS.register_module()
+class YOLOWorldVLFusionNeck(YOLOv8PAFPN):
+    """
+    My new Neck Block for Experiment: just change fusion block in yolo_bricks.py
+    """
+    def __init__(
+            self,
+            fusion_cfg: ConfigType,
+            in_channels: List[int],
+            out_channels: Union[List[int], int],
+            deepen_factor: float = 1.0,
+            widen_factor: float = 1.0,
+            num_csp_blocks: int = 3,
+            freeze_all: bool = False,
+            block_cfg: ConfigType = dict(type='CSPLayerWithTwoConv'),
+            norm_cfg: ConfigType = dict(type='BN', momentum=0.03, eps=0.001),
+            act_cfg: ConfigType = dict(type='SiLU', inplace=True),
+            init_cfg: OptMultiConfig = None,
+    ):
+        super().__init__(in_channels=in_channels,
+                         out_channels=out_channels,
+                         deepen_factor=deepen_factor,
+                         widen_factor=widen_factor,
+                         num_csp_blocks=num_csp_blocks,
+                         freeze_all=freeze_all,
+                         norm_cfg=norm_cfg,
+                         act_cfg=act_cfg,
+                         init_cfg=init_cfg)
+        fusion_cfg.update(
+            widen_factor = widen_factor,
+            img_channel = [int(in_channel * widen_factor) for in_channel in in_channels],
+        )
+        self.fusion_block = MODELS.build(fusion_cfg)
+
+        self.neck_time = 0
+
+    def forward(self, img_feats: List[Tensor], txt_feats: Tensor = None) -> tuple:
+        """
+        Forward function.
+        including multi-level image features, text features: BxLxD
+        """
+        assert len(img_feats) == len(self.in_channels)
+
+        start_time = time.perf_counter()
+
+        # fuse first!
+        img_feats, txt_feats = self.fusion_block(img_feats, txt_feats)
+
+        # reduce layers
+        reduce_outs = []
+        for idx in range(len(self.in_channels)):
+            reduce_outs.append(self.reduce_layers[idx](img_feats[idx]))
+
+        # top-down path
+        inner_outs = [reduce_outs[-1]]
+        for idx in range(len(self.in_channels) - 1, 0, -1):
+            feat_high = inner_outs[0]
+            feat_low = reduce_outs[idx - 1]
+            upsample_feat = self.upsample_layers[len(self.in_channels) - 1 -
+                                                 idx](
+                feat_high)
+            if self.upsample_feats_cat_first:
+                top_down_layer_inputs = torch.cat([upsample_feat, feat_low], 1)
+            else:
+                top_down_layer_inputs = torch.cat([feat_low, upsample_feat], 1)
+            inner_out = self.top_down_layers[len(self.in_channels) - 1 - idx](
+                top_down_layer_inputs)
+            inner_outs.insert(0, inner_out)
+
+        # bottom-up path
+        outs = [inner_outs[0]]
+        for idx in range(len(self.in_channels) - 1):
+            feat_low = outs[-1]
+            feat_high = inner_outs[idx + 1]
+            downsample_feat = self.downsample_layers[idx](feat_low)
+            out = self.bottom_up_layers[idx](
+                torch.cat([downsample_feat, feat_high], 1))
+            outs.append(out)
+
+        # out_layers
+        results = []
+        for idx in range(len(self.in_channels)):
+            results.append(self.out_layers[idx](outs[idx]))
+
+        self.neck_time = time.perf_counter() - start_time
+
+        return tuple(results), txt_feats
+
+# FIXME: ------------------------------------------------------------------------------------------------------------------------------------------------------------------
+# FIXME: ------------------------------------------------------------------------------------------------------------------------------------------------------------------
+# FIXME: ------------------------------------------------------------------------------------------------------------------------------------------------------------------
+
+@MODELS.register_module()
+class YOLOWorldPAFPN(YOLOv8PAFPN):
+    """Path Aggregation Network used in YOLO World
+    Following YOLOv8 PAFPN, including text to image fusion
+    """
+    def __init__(self,
+                 in_channels: List[int],
+                 out_channels: Union[List[int], int],
+                 guide_channels: int,
+                 embed_channels: List[int],
+                 num_heads: List[int],
+                 deepen_factor: float = 1.0,
+                 widen_factor: float = 1.0,
+                 num_csp_blocks: int = 3,
+                 freeze_all: bool = False,
+                 block_cfg: ConfigType = dict(type='CSPLayerWithTwoConv'),
+                 norm_cfg: ConfigType = dict(type='BN',
+                                             momentum=0.03,
+                                             eps=0.001),
+                 act_cfg: ConfigType = dict(type='SiLU', inplace=True),
+                 init_cfg: OptMultiConfig = None) -> None:
+        self.guide_channels = guide_channels
+        self.embed_channels = embed_channels
+        self.num_heads = num_heads
+        self.block_cfg = block_cfg
+        super().__init__(in_channels=in_channels,
+                         out_channels=out_channels,
+                         deepen_factor=deepen_factor,
+                         widen_factor=widen_factor,
+                         num_csp_blocks=num_csp_blocks,
+                         freeze_all=freeze_all,
+                         norm_cfg=norm_cfg,
+                         act_cfg=act_cfg,
+                         init_cfg=init_cfg)
+
+    def build_top_down_layer(self, idx: int) -> nn.Module:
+        """build top down layer.
+
+        Args:
+            idx (int): layer idx.
+
+        Returns:
+            nn.Module: The top down layer.
+        """
+        block_cfg = copy.deepcopy(self.block_cfg)
+        block_cfg.update(
+            dict(in_channels=make_divisible(
+                (self.in_channels[idx - 1] + self.in_channels[idx]),
+                self.widen_factor),
+                 out_channels=make_divisible(self.out_channels[idx - 1],
+                                             self.widen_factor),
+                 guide_channels=self.guide_channels,
+                 embed_channels=make_round(self.embed_channels[idx - 1],
+                                           self.widen_factor),
+                 num_heads=make_round(self.num_heads[idx - 1],
+                                      self.widen_factor),
+                 num_blocks=make_round(self.num_csp_blocks,
+                                       self.deepen_factor),
+                 add_identity=False,
+                 norm_cfg=self.norm_cfg,
+                 act_cfg=self.act_cfg))
+        return MODELS.build(block_cfg)
+
+    def build_bottom_up_layer(self, idx: int) -> nn.Module:
+        """build bottom up layer.
+
+        Args:
+            idx (int): layer idx.
+
+        Returns:
+            nn.Module: The bottom up layer.
+        """
+        block_cfg = copy.deepcopy(self.block_cfg)
+        block_cfg.update(
+            dict(in_channels=make_divisible(
+                (self.out_channels[idx] + self.out_channels[idx + 1]),
+                self.widen_factor),
+                 out_channels=make_divisible(self.out_channels[idx + 1],
+                                             self.widen_factor),
+                 guide_channels=self.guide_channels,
+                 embed_channels=make_round(self.embed_channels[idx + 1],
+                                           self.widen_factor),
+                 num_heads=make_round(self.num_heads[idx + 1],
+                                      self.widen_factor),
+                 num_blocks=make_round(self.num_csp_blocks,
+                                       self.deepen_factor),
+                 add_identity=False,
+                 norm_cfg=self.norm_cfg,
+                 act_cfg=self.act_cfg))
+        return MODELS.build(block_cfg)
+
+    def forward(self, img_feats: List[Tensor], txt_feats: Tensor = None) -> tuple:
+        """Forward function.
+        including multi-level image features, text features: BxLxD
+        """
+        assert len(img_feats) == len(self.in_channels)
+        # reduce layers
+        reduce_outs = []
+        for idx in range(len(self.in_channels)):
+            reduce_outs.append(self.reduce_layers[idx](img_feats[idx]))
+
+        # top-down path
+        inner_outs = [reduce_outs[-1]]
+        for idx in range(len(self.in_channels) - 1, 0, -1):
+            feat_high = inner_outs[0]
+            feat_low = reduce_outs[idx - 1]
+            upsample_feat = self.upsample_layers[len(self.in_channels) - 1 -
+                                                 idx](feat_high)
+            if self.upsample_feats_cat_first:
+                top_down_layer_inputs = torch.cat([upsample_feat, feat_low], 1)
+            else:
+                top_down_layer_inputs = torch.cat([feat_low, upsample_feat], 1)
+            inner_out = self.top_down_layers[len(self.in_channels) - 1 - idx](
+                top_down_layer_inputs, txt_feats)
+            inner_outs.insert(0, inner_out)
+
+        # bottom-up path
+        outs = [inner_outs[0]]
+        for idx in range(len(self.in_channels) - 1):
+            feat_low = outs[-1]
+            feat_high = inner_outs[idx + 1]
+            downsample_feat = self.downsample_layers[idx](feat_low)
+            out = self.bottom_up_layers[idx](torch.cat(
+                [downsample_feat, feat_high], 1), txt_feats)
+            outs.append(out)
+
+        # out_layers
+        results = []
+        for idx in range(len(self.in_channels)):
+            results.append(self.out_layers[idx](outs[idx]))
+
+        return tuple(results)
+
+
+@MODELS.register_module()
+class YOLOWorldDualPAFPN(YOLOWorldPAFPN):
+    """Path Aggregation Network used in YOLO World v8."""
+    def __init__(self,
+                 in_channels: List[int],
+                 out_channels: Union[List[int], int],
+                 guide_channels: int,
+                 embed_channels: List[int],
+                 num_heads: List[int],
+                 deepen_factor: float = 1.0,
+                 widen_factor: float = 1.0,
+                 num_csp_blocks: int = 3,
+                 freeze_all: bool = False,
+                 text_enhancder: ConfigType = dict(
+                     type='ImagePoolingAttentionModule',
+                     embed_channels=256,
+                     num_heads=8,
+                     pool_size=3),
+                 block_cfg: ConfigType = dict(type='CSPLayerWithTwoConv'),
+                 norm_cfg: ConfigType = dict(type='BN',
+                                             momentum=0.03,
+                                             eps=0.001),
+                 act_cfg: ConfigType = dict(type='SiLU', inplace=True),
+                 init_cfg: OptMultiConfig = None) -> None:
+        super().__init__(in_channels=in_channels,
+                         out_channels=out_channels,
+                         guide_channels=guide_channels,
+                         embed_channels=embed_channels,
+                         num_heads=num_heads,
+                         deepen_factor=deepen_factor,
+                         widen_factor=widen_factor,
+                         num_csp_blocks=num_csp_blocks,
+                         freeze_all=freeze_all,
+                         block_cfg=block_cfg,
+                         norm_cfg=norm_cfg,
+                         act_cfg=act_cfg,
+                         init_cfg=init_cfg)
+
+        text_enhancder.update(
+            dict(
+                image_channels=[int(x * widen_factor) for x in out_channels],
+                text_channels=guide_channels,
+                num_feats=len(out_channels),
+            ))
+        print(text_enhancder)
+        self.text_enhancer = MODELS.build(text_enhancder)
+
+        self.neck_time = 0
+
+    def forward(self, img_feats: List[Tensor], txt_feats: Tensor) -> tuple:
+        start_time = time.perf_counter()
+
+        """Forward function."""
+        assert len(img_feats) == len(self.in_channels)
+        # reduce layers
+        reduce_outs = []
+        for idx in range(len(self.in_channels)):
+            reduce_outs.append(self.reduce_layers[idx](img_feats[idx]))
+
+        # top-down path
+        inner_outs = [reduce_outs[-1]]
+        for idx in range(len(self.in_channels) - 1, 0, -1):
+            feat_high = inner_outs[0]
+            feat_low = reduce_outs[idx - 1]
+            upsample_feat = self.upsample_layers[len(self.in_channels) - 1 -
+                                                 idx](feat_high)
+            if self.upsample_feats_cat_first:
+                top_down_layer_inputs = torch.cat([upsample_feat, feat_low], 1)
+            else:
+                top_down_layer_inputs = torch.cat([feat_low, upsample_feat], 1)
+            inner_out = self.top_down_layers[len(self.in_channels) - 1 - idx](
+                top_down_layer_inputs, txt_feats)
+            inner_outs.insert(0, inner_out)
+
+        txt_feats = self.text_enhancer(txt_feats, inner_outs)
+
+        # bottom-up path
+        outs = [inner_outs[0]]
+        for idx in range(len(self.in_channels) - 1):
+            feat_low = outs[-1]
+            feat_high = inner_outs[idx + 1]
+            downsample_feat = self.downsample_layers[idx](feat_low)
+            out = self.bottom_up_layers[idx](torch.cat(
+                [downsample_feat, feat_high], 1), txt_feats)
+            outs.append(out)
+
+        # out_layers
+        results = []
+        for idx in range(len(self.in_channels)):
+            results.append(self.out_layers[idx](outs[idx]))
+
+        self.neck_time = time.perf_counter() - start_time
+
+        return tuple(results)
+
+
+@MODELS.register_module()
+class YOLOWorldDualPAFPNRemove43(YOLOv8PAFPN):
+    """
+    remove last two text-image fusion
+    """
+    def __init__(self,
+                 in_channels: List[int],
+                 out_channels: Union[List[int], int],
+                 guide_channels: int,
+                 embed_channels: List[int],
+                 num_heads: List[int],
+                 deepen_factor: float = 1.0,
+                 widen_factor: float = 1.0,
+                 num_csp_blocks: int = 3,
+                 freeze_all: bool = False,
+                 block_cfg: ConfigType = dict(type='CSPLayerWithTwoConv'),
+                 norm_cfg: ConfigType = dict(type='BN',
+                                             momentum=0.03,
+                                             eps=0.001),
+                 act_cfg: ConfigType = dict(type='SiLU', inplace=True),
+                 init_cfg: OptMultiConfig = None) -> None:
+        self.guide_channels = guide_channels
+        self.embed_channels = embed_channels
+        self.num_heads = num_heads
+        self.block_cfg = block_cfg
+        super().__init__(in_channels=in_channels,
+                         out_channels=out_channels,
+                         deepen_factor=deepen_factor,
+                         widen_factor=widen_factor,
+                         num_csp_blocks=num_csp_blocks,
+                         freeze_all=freeze_all,
+                         norm_cfg=norm_cfg,
+                         act_cfg=act_cfg,
+                         init_cfg=init_cfg)
+
+        self.neck_time = 0
+
+    def build_top_down_layer(self, idx: int) -> nn.Module:
+        """build top down layer.
+
+        Args:
+            idx (int): layer idx.
+
+        Returns:
+            nn.Module: The top down layer.
+        """
+        block_cfg = copy.deepcopy(self.block_cfg)
+        block_cfg.update(
+            dict(in_channels=make_divisible(
+                (self.in_channels[idx - 1] + self.in_channels[idx]),
+                self.widen_factor),
+                 out_channels=make_divisible(self.out_channels[idx - 1],
+                                             self.widen_factor),
+                 guide_channels=self.guide_channels,
+                 embed_channels=make_round(self.embed_channels[idx - 1],
+                                           self.widen_factor),
+                 num_heads=make_round(self.num_heads[idx - 1],
+                                      self.widen_factor),
+                 num_blocks=make_round(self.num_csp_blocks,
+                                       self.deepen_factor),
+                 add_identity=False,
+                 norm_cfg=self.norm_cfg,
+                 act_cfg=self.act_cfg))
+        return MODELS.build(block_cfg)
+
+    def build_bottom_up_layer(self, idx: int) -> nn.Module:
+        """build bottom up layer.
+
+        Args:
+            idx (int): layer idx.
+
+        Returns:
+            nn.Module: The bottom up layer.
+        """
+        return CSPLayerWithTwoConv(
+            make_divisible(
+                (self.out_channels[idx] + self.out_channels[idx + 1]),
+                self.widen_factor),
+            make_divisible(self.out_channels[idx + 1], self.widen_factor),
+            num_blocks=make_round(self.num_csp_blocks, self.deepen_factor),
+            add_identity=False,
+            norm_cfg=self.norm_cfg,
+            act_cfg=self.act_cfg)
+
+    def forward(self, img_feats: List[Tensor], txt_feats: Tensor) -> tuple:
+        start_time = time.perf_counter()
+
+        """Forward function."""
+        assert len(img_feats) == len(self.in_channels)
+        # reduce layers
+        reduce_outs = []
+        for idx in range(len(self.in_channels)):
+            reduce_outs.append(self.reduce_layers[idx](img_feats[idx]))
+
+        # top-down path
+        inner_outs = [reduce_outs[-1]]
+        for idx in range(len(self.in_channels) - 1, 0, -1):
+            feat_high = inner_outs[0]
+            feat_low = reduce_outs[idx - 1]
+            upsample_feat = self.upsample_layers[len(self.in_channels) - 1 -
+                                                 idx](feat_high)
+            if self.upsample_feats_cat_first:
+                top_down_layer_inputs = torch.cat([upsample_feat, feat_low], 1)
+            else:
+                top_down_layer_inputs = torch.cat([feat_low, upsample_feat], 1)
+            inner_out = self.top_down_layers[len(self.in_channels) - 1 - idx](
+                top_down_layer_inputs, txt_feats)
+            inner_outs.insert(0, inner_out)
+
+        # bottom-up path ❗No Text-Image Fusion❗️
+        outs = [inner_outs[0]]
+        for idx in range(len(self.in_channels) - 1):
+            feat_low = outs[-1]
+            feat_high = inner_outs[idx + 1]
+            downsample_feat = self.downsample_layers[idx](feat_low)
+            out = self.bottom_up_layers[idx](
+                torch.cat([downsample_feat, feat_high], 1))
+            outs.append(out)
+
+        # out_layers
+        results = []
+        for idx in range(len(self.in_channels)):
+            results.append(self.out_layers[idx](outs[idx]))
+
+        self.neck_time = time.perf_counter() - start_time
+
+        return tuple(results)
+
diff --git a/mmdetection_practice/yolo_world/version.py b/mmdetection_practice/yolo_world/version.py
new file mode 100644
index 0000000..8f34058
--- /dev/null
+++ b/mmdetection_practice/yolo_world/version.py
@@ -0,0 +1,23 @@
+# Copyright (c) Tencent Inc. All rights reserved.
+from yolo_world import __version__
+
+def __version_info() -> tuple:
+    """Parse a version string into a tuple.
+    Returns:
+        tuple[int | str]: The version info, e.g., "1.3.0" is parsed into
+            (1, 3, 0), and "2.0.0rc1" is parsed into (2, 0, 0, 'rc1').
+    """
+    version_info = []
+    for x in __version__.split('.'):
+        if x.isdigit():
+            version_info.append(int(x))
+        elif x.find('rc') != -1:
+            patch_version = x.split('rc')
+            version_info.append(int(patch_version[0]))
+            version_info.append(f'rc{patch_version[1]}')
+    return tuple(version_info)
+
+
+version_info = __version_info()
+
+__all__ = ['__version__', 'version_info']
-- 
GitLab