<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/60291>60291</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            Crash when converting tensor.insert_slice op with leading dimensions of size 1 to rank-reduced version
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          c-rhodes
      </td>
    </tr>
</table>

<pre>
    The compiler crashes triggering an assert for the following:
**input**
```
// reproducer.mlir
func.func @foo(%arg0: tensor<1x1x32xi32>, %arg1: tensor<1x32xi32>) -> tensor<1x1x32xi32> {
  %inserted_slice = tensor.insert_slice %arg1 into %arg0[0, 0, 0] [1, 1, 32] [1, 1, 1] : tensor<1x32xi32> into tensor<1x1x32xi32>
  return %inserted_slice : tensor<1x1x32xi32>
}
```
**compile**
```
./bin/mlir-opt reproducer.mlir -linalg-fold-unit-extent-dims
```

**backtrace**
```
mlir-opt: /home/culrho01/llvm-project/llvm/include/llvm/ADT/ArrayRef.h:194: ArrayRef<T> llvm::ArrayRef<long>::slice(size_t, size_t) const [T = long]: Assertion `N+M <= size() && "Invalid specifier"' failed.

Program received signal SIGABRT, Aborted.
__GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50
50 ../sysdeps/unix/sysv/linux/raise.c: No such file or directory.
(gdb) bt
#0  __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50
#1  0x0000ffffe86e3a14 in __GI_abort () at abort.c:79
#2  0x0000ffffe86f038c in __assert_fail_base (fmt=0xffffe87e98a8 "%s%s%s:%u: %s%sAssertion `%s' failed.\n%n", assertion=assertion@entry=0xffffebde80f0 "N+M <= size() && \"Invalid specifier\"", file=file@entry=0xffffebdd4ecc "/home/culrho01/llvm-project/llvm/include/llvm/ADT/ArrayRef.h", line=line@entry=194,
    function=function@entry=0xffffebde8d7e "ArrayRef<T> llvm::ArrayRef<long>::slice(size_t, size_t) const [T = long]") at assert.c:92
#3  0x0000ffffe86f03f4 in __GI___assert_fail (assertion=0xffffebde80f0 "N+M <= size() && \"Invalid specifier\"", file=0xffffebdd4ecc "/home/culrho01/llvm-project/llvm/include/llvm/ADT/ArrayRef.h", line=194, function=0xffffebde8d7e "ArrayRef<T> llvm::ArrayRef<long>::slice(size_t, size_t) const [T = long]") at assert.c:101
#4  0x0000ffffebf644d0 in llvm::ArrayRef<long>::slice (this=0xffffffffbd90, N=0, M=3) at /home/culrho01/llvm-project/llvm/include/llvm/ADT/ArrayRef.h:194
#5 0x0000ffffebeeab34 in computeTensorReshapeCollapsedType (type=..., reassociation=...) at /home/culrho01/llvm-project/mlir/lib/Dialect/Tensor/IR/TensorOps.cpp:1290
#6 0x0000ffffebeea944 in mlir::tensor::CollapseShapeOp::build (b=..., result=..., src=..., reassociation=..., attrs=...) at /home/culrho01/llvm-project/mlir/lib/Dialect/Tensor/IR/TensorOps.cpp:1307
#7 0x0000fffff1262428 in mlir::OpBuilder::create<mlir::tensor::CollapseShapeOp, mlir::detail::TypedValue<mlir::TensorType>, llvm::SmallVector<llvm::SmallVector<long, 2u>, 1u>&> (this=0xffffffffce00, location=..., args=..., args=...) at /home/culrho01/llvm-project/mlir/include/mlir/IR/Builders.h:462
#8 0x0000fffff1252bd4 in (anonymous namespace)::RankReducedInsertSliceOp<mlir::tensor::InsertSliceOp>::matchAndRewrite (this=0x3d29a0, insertSliceOp=..., rewriter=...) at /home/culrho01/llvm-project/mlir/lib/Dialect/Linalg/Transforms/DropUnitDims.cpp:650
#9 0x0000fffff1261da8 in mlir::detail::OpOrInterfaceRewritePatternBase<mlir::tensor::InsertSliceOp>::matchAndRewrite (this=0x3d29a0, op=0x3e30a0, rewriter=...) at /home/culrho01/llvm-project/mlir/include/mlir/IR/PatternMatch.h:330
#10 0x0000ffffea33f4c4 in mlir::PatternApplicator::matchAndRewrite(mlir::Operation*, mlir::PatternRewriter&, llvm::function_ref<bool (mlir::Pattern const&)>, llvm::function_ref<void (mlir::Pattern const&)>, llvm::function_ref<mlir::LogicalResult (mlir::Pattern const&)>) (this=0xffffffffce20, op=0x3e30a0, rewriter=..., canApply=..., onFailure=..., onSuccess=...)
    at /home/culrho01/llvm-project/mlir/lib/Rewrite/PatternApplicator.cpp:200
#11 0x0000ffffea4dc9fc in (anonymous namespace)::GreedyPatternRewriteDriver::simplify (this=0xffffffffcdf8, regions=...) at /home/culrho01/llvm-project/mlir/lib/Transforms/Utils/GreedyPatternRewriteDriver.cpp:292
#12 0x0000ffffea4dc1a8 in mlir::applyPatternsAndFoldGreedily (regions=..., patterns=..., config=...) at /home/culrho01/llvm-project/mlir/lib/Transforms/Utils/GreedyPatternRewriteDriver.cpp:452
#13 0x0000fffff12348c8 in mlir::applyPatternsAndFoldGreedily (op=0x382120, patterns=..., config=...) at /home/culrho01/llvm-project/mlir/include/mlir/Transforms/GreedyPatternRewriteDriver.h:86
#14 0x0000fffff1255ea4 in (anonymous namespace)::LinalgFoldUnitExtentDimsPass::runOnOperation (this=0x3d5400) at /home/culrho01/llvm-project/mlir/lib/Dialect/Linalg/Transforms/DropUnitDims.cpp:719
#15 0x0000ffffe9b098b0 in mlir::detail::OpToOpPassAdaptor::run (pass=0x3d5400, op=0x382120, am=..., verifyPasses=true, parentInitGeneration=1) at /home/culrho01/llvm-project/mlir/lib/Pass/Pass.cpp:470
#16 0x0000ffffe9b09e3c in mlir::detail::OpToOpPassAdaptor::runPipeline (pm=..., op=0x382120, am=..., verifyPasses=true, parentInitGeneration=1, instrumentor=0x0, parentInfo=0x0) at /home/culrho01/llvm-project/mlir/lib/Pass/Pass.cpp:534
#17 0x0000ffffe9b0b420 in mlir::PassManager::runPasses (this=0xffffffffd9a0, op=0x382120, am=...) at /home/culrho01/llvm-project/mlir/lib/Pass/Pass.cpp:839
#18 0x0000ffffe9b0b354 in mlir::PassManager::run (this=0xffffffffd9a0, op=0x382120) at /home/culrho01/llvm-project/mlir/lib/Pass/Pass.cpp:819
#19 0x0000fffff524864c in performActions(llvm::raw_ostream&, bool, bool, std::shared_ptr<llvm::SourceMgr> const&, mlir::MLIRContext*, llvm::function_ref<mlir::LogicalResult (mlir::PassManager&)>, bool, bool) (os=..., verifyDiagnostics=false, verifyPasses=true, sourceMgr=warning: RTTI symbol not found for class 'std::_Sp_counted_ptr_inplace<llvm::SourceMgr, std::allocator<llvm::SourceMgr>, (__gnu_cxx::_Lock_policy)2>'
warning: RTTI symbol not found for class 'std::_Sp_counted_ptr_inplace<llvm::SourceMgr, std::allocator<llvm::SourceMgr>, (__gnu_cxx::_Lock_policy)2>'
std::shared_ptr<class llvm::SourceMgr> (use count 1, weak count 0) = {...},
    context=0xffffffffdc90, passManagerSetupFn=..., emitBytecode=false, implicitModule=true) at /home/culrho01/llvm-project/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp:91
#20 0x0000fffff5248338 in processBuffer(llvm::raw_ostream&, std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer> >, bool, bool, bool, bool, bool, bool, llvm::function_ref<mlir::LogicalResult (mlir::PassManager&)>, mlir::DialectRegistry&, llvm::ThreadPool*) (os=..., ownedBuffer=std::unique_ptr<class llvm::MemoryBuffer> = {...},
 verifyDiagnostics=false, verifyPasses=true, allowUnregisteredDialects=false, preloadDialectsInContext=false, emitBytecode=false, implicitModule=true, passManagerSetupFn=..., registry=..., threadPool=0x30c2e0) at /home/culrho01/llvm-project/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp:139
#21 0x0000fffff5248124 in mlir::MlirOptMain(llvm::raw_ostream&, std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer> >, llvm::function_ref<mlir::LogicalResult (mlir::PassManager&)>, mlir::DialectRegistry&, bool, bool, bool, bool, bool, bool, bool)::$_0::operator()(std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer> >, llvm::raw_ostream&) const (this=0xffffffffe2a8, chunkBuffer=..., os=...) at /home/culrho01/llvm-project/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp:181
#22 0x0000fffff5248034 in llvm::function_ref<mlir::LogicalResult (std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer> >, llvm::raw_ostream&)>::callback_fn<mlir::MlirOptMain(llvm::raw_ostream&, std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer> >, llvm::function_ref<mlir::LogicalResult (mlir::PassManager&)>, mlir::DialectRegistry&, bool, bool, bool, bool, bool, bool, bool)::$_0>(long, std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer> >, llvm::raw_ostream&) (callable=281474976703144, params=..., params=...) at /home/culrho01/llvm-project/llvm/include/llvm/ADT/STLFunctionalExtras.h:45
#23 0x0000ffffe90175ac in llvm::function_ref<mlir::LogicalResult (std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer> >, llvm::raw_ostream&)>::operator()(std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer> >, llvm::raw_ostream&) const (this=0xffffffffe228, params=..., params=...)
    at /home/culrho01/llvm-project/llvm/include/llvm/ADT/STLFunctionalExtras.h:68
#24 0x0000ffffe9016d9c in mlir::splitAndProcessBuffer(std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer> >, llvm::function_ref<mlir::LogicalResult (std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer> >, llvm::raw_ostream&)>, llvm::raw_ostream&, bool, bool) (
    originalBuffer=std::unique_ptr<class llvm::MemoryBuffer> = {...}, processChunkBuffer=..., os=..., enableSplitting=false, insertMarkerInOutput=true) at /home/culrho01/llvm-project/mlir/lib/Support/ToolUtilities.cpp:28
#25 0x0000fffff5247194 in mlir::MlirOptMain(llvm::raw_ostream&, std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer> >, llvm::function_ref<mlir::LogicalResult (mlir::PassManager&)>, mlir::DialectRegistry&, bool, bool, bool, bool, bool, bool, bool) (outputStream=..., buffer=std::unique_ptr<class llvm::MemoryBuffer> = {...},
    passManagerSetupFn=..., registry=..., splitInputFile=false, verifyDiagnostics=false, verifyPasses=true, allowUnregisteredDialects=false, preloadDialectsInContext=false, emitBytecode=false, implicitModule=true) at /home/culrho01/llvm-project/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp:186
#26 0x0000fffff524731c in mlir::MlirOptMain (outputStream=..., buffer=..., passPipeline=..., registry=..., splitInputFile=false, verifyDiagnostics=false, verifyPasses=true, allowUnregisteredDialects=false, preloadDialectsInContext=false, emitBytecode=false, implicitModule=true, dumpPassPipeline=false)
    at /home/culrho01/llvm-project/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp:209
#27 0x0000fffff5247e4c in mlir::MlirOptMain (argc=3, argv=0xffffffffedb8, toolName=..., registry=..., preloadDialectsInContext=false) at /home/culrho01/llvm-project/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp:306
#28 0x000000000025c4ac in main (argc=3, argv=0xffffffffedb8) at /home/culrho01/llvm-project/mlir/tools/mlir-opt/mlir-opt.cpp:250
```

**analysis**

The assert is firing because of an out-of-bounds call to `slice` in `computeTensorReshapeCollapsedType`.
```
auto band = shape.slice(currentDim, dim);
```
`shape` is of size 2 reflecting the input tensor `tensor<1x32xi32>` and `slice` is called with `currentDim=0` and `dim=3`, where `dim` comes from the reassociation. I dumped some relevant values before the crash:
```
reassociation->size(): 1
reassoc_idx.size(): 3
reassoc_idx: <0,1,2,>
shape.size(): 2
(d0, d1, d2) -> (d0, d1, d2)
currentDim: 0
dim: 3
<CRASH>
```
I think the issue is the reassociation computed in `RankReducedInsertSliceOp` by `getReassociationMapForFoldingUnitDims` and the IR we want is?
```
func.func @foo(%arg0: tensor<1x1x32xi32>, %arg1: tensor<1x32xi32>) -> tensor<1x1x32xi32> {
  %collapsed = tensor.collapse_shape %arg1 [[0,1]] : tensor<1x32xi32> into tensor<32xi32>
  %inserted_slice = tensor.insert_slice %collapsed into %arg0[0, 0, 0] [1, 1, 32] [1, 1, 1] : tensor<32xi32> into tensor<1x1x32xi32>
  return %inserted_slice : tensor<1x1x32xi32>
}
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsW19z46iy_zTkhYpLAkm2H_Lg2OO9qZpsppLseXUhQDY3MugCSuLz6W8BkiXLTiaZZGbnbJ2pjC1h_vSv-9dNIwQxRqwl5xcgvQTp4ozUdqP0BT3XG8W4OcsV213cbzikaluJkmtINTEbbqDVYr3mWsg1JBISY7i2sFAa2g2HhSpL9STkGuAZiBYgmgHk_oSsahsum-Isav6aWkuAllDzSitWU65H21Lo8FtRSzpyHxAkUaEUQBOAUqLXEcAzaLk0SgM8j5_jZ4yeBUYAfwFoDkOleFCpV2UKzwH-8kIPEIwvw_jQ9SSkw8nZypSCcgjwomk3Cr-05WFMKKRVsJUyvYycPM1HuoAgvYzdjf_A6Kgo9iUvyB36fgF2I7DmttbypNwvaizYYbx4wT7ur-HCK3YcAbTMhQRo6ex3rio7tCk8L4Uk5fq8UCU7r6Ww5_zZcmnPmdia04P3RMgJfbCa0NeEaId2YAFabtSWA7Skdak3KooBWpbl4_a80up_ObXNLUBLIWlZM94VzBb37lNrsrvlxWgD8CyeJq7Xtgzg-b0ziW-AZwDPer-UyrnBl1Du1Q_QxIh_85V1Rm6vppAqaaxjwL3nlW-XLvw43ruEkhBk0Z8AXV5DgOeukmvtHWEKAcoAyiBA6Eo-klIwaCpORSG4BggBNIYFESVno742v2m11mQLNadcPHIGXTggJby7-mN2eXvvBJzlyjGnabZa_XG10kQYR_KJEWuAF-4zibi0egfwInPCEAtHjgRmZxivDEDLWornUPDoVCtk7W59TyMK8CxtrJZG720J_1TQ1HQDC1FyqDRkQnNqld61UNFkzXInVm7bEhxB-NOxAIRjCKPnKIqioigKPsk4JnEChQyDE6db2BiQWOjvfRfj6b4LNOiiiPCEhi5C2F05w65yEnAUWwvwInoOtcd8OiET6BmQmv1_PAMorYNnhKIDjoXCjjHpXAKUSt_LvAn2QkmAF911p7Vm7JzxSVREbuzvcTadn6StL24GdcYFeOG_TgzFEk5pgPmJnh6GLoV0Q_uvbmgXA9C8DbUQuqmpUcr-8qRO2NjZCf2S4OEABGZ5O3lqTdGeWviYWkXHzgN-OWr1Df8zjfwrrRrM2Lfeb2SqOIr3tkoObJUXWZKwyNnqjdI4A9qNMHuE7l_Opj4f-dOVuotrgBe4EeQnTJotmPQAC-ckx553LrWoLb_3ucktNxtS8bkqS1IZzu53VUCxq5zlRi4qz6HmxBhFBWnM54vfLL_PL10MzwFaLgQpQ3EQAKDl1e3-7qYyI1pVDgmadhE-G0KZJh6K79mrv8203HUL5s4hu6lCYV6LkjlkeR-WqUvb3RtNv4N5Dom12vwiFeBovFfBuKeCIkYZStDkUAU31aXDyJtbqjmxHOD525SE5r2uGLdElOHaMYL9i5T1YV9B2HtPE78G6FzkbkvK8l8-PXBe8lK58x40h6huOojDReZXBCf8iPLIu0-p6NAmem1O373XQJ2PNQXeMI1ejXexJOti--TQKCnKmeeli-NSyd1W1QZKsuWm8nn0NCjilsiHW-4SdXblFw13Lng4pr5grEGtJuRsiaWbmWS3_EkLexh8MENT4tUlDtt29PaN9GdR-atfajgWayJNofTWZXELraq_pLALsW1ZnfUyt-mA1DEjA1L3mXhT3egrabkuCOUN6G_EWq7lJTEvU_0j2lNVKOA4CgUf1dtphjUwrp1MnmUY9_LbqB_-CMZFQgfhr2k_q6pSUGJb5AOMAE364YLr4EdueTc_7uy2Repyi75_t_P4SvtpMFfKZy5HHYRZ2DefHgWJQSePSrAPd9I1_qrWgpLy1gf4t_U7fSHooLfxYA4p8frfdSVKLokoa837RXc1pdx0EarLbn_EAfeWXR5RoPE3FPWYFB8wKWF0WtA3BKw_NOdsd8iLhRaP7VxjxLYqRbE7rUJWTILG1kLJD86dB9HlLytK9_2yeK0Oevl4jIY6iIdBhzgzNt2ZmWRLVTI_hig9xAGSOayauj0yKFn4xe4vx5qkPaz4MMDiZELfibUl_gTFwRM-G-tRQDyA_QpcFyYnWYc1GUzGKSdvmYzDxOVgu4nqi39A5qarb8SYUEPX8kbuw-VgokgTl5X8stlzHHcPLeKDDH-aR9NJHr02fd6rm8rBmjFS7ecIXXtIlYfbg9TFvL3pybYz-iPXoti53rhrZ3XNAzs0l_ZKCvsHl-0Egxfxj6rIWyF8tfwe9-JZNtQAx_RHNPBNVNwtVr0meig_VwU-GbO63nLpB19Ez1G_RaHass9SVoq79WA8HigrT1A0TCOMuSaSrHlPNR7fycjOBknSCS19FpAJ7vF-MgSC06N86BjIeyB8mth9dz3IdlOUTLLEk7Xi2nn8zKcyBqBJl-Bo8rRSxmpOtk0a5rKt_rexrJmDN0RztqrsYNGlak359Vq7ZVWX8_TzveuvV7dzJS1_tk0u-NEMq1N-P287FN3nW8oM3WkhyFoqYwV1PxWkNPwVXzMdusUT0TJsh8Hb-_sraHbbXJVQKgsLVUvmd85oSYwj83ivt9VdtaKqljYobyVkVbr54bQS-xonpV-KDle5PYWHvbHJarWW9Yo-PzcjflX0YVWpUtAdcKmJq9is9P8RIE5zMkj9AjMBmtSGQ48h7Mw9cfLQ3HuHBHgBwfjSkWW8OHgqTBvuHvg1nTahdc_FO27ratl7bMC3wl7uLKeK8T7XfDJLhb1WrPbPSgPbfjCJU8rnbfudMrS8LoW-qew1EbIJE9PuESSKhlECY5-yVVq5dcNlXRTOr14NEnsD1FL8X82PgsI13yq9a7vq1We8IHVpV4yX3PKX2ziLnXLq73__nNDS1Whyqlu-Fsbq3dHi9X6jOWHfvDSzE1FIPUnOWpSL04ocMvlYNSep-iMBzrnn019Sezhcc9bgO2hbaV4qsv_pSs73HrGv806yv-45utXuvsR2avXzaEQR_-F59E0-E_cyAhQPnSZGg4yg18Hv4zx_jzO812Wb-Tp0CVCyisKl8ksipcMeFECTv0VzQwPuN39OZHscEf8ogm5q-bB38tbzP_po4k2snfRCPRqyNgo7ND9Ci99D9_unq5SUZU7ow6qQB3L_1w0_1Q2_OCU2Gym_BwOcbpzxSe5nEzSJk3EyHWfjCMdJ0qx2yfbg4Vn__pN2Re_uvy4bW5Lyy7PVpNm9STv3wwfLyCgep4T-Q9zvPzE0o8kb2PHup-U_RpNs0tEkGdAkY9PBMyZTlcLOJPs2SNF_8xD2e3DiuzVOPjjoeKC0WAtJyk_O2dv11vz1VGEOuXSh7s5RwPqVey-39huP10Q_cH0lb2pb1faDy8m7uqqUtk268ZcVpbCCt4-bUI-26SC5GMfT_6bEnzwX-8WjN-tdUNeeFflPWUFC-M5lmY9MV7Kq7bJ5t-9wvfmfsRj9qfl4t4OEsqHL4Ji-6DJvsP1-CjOm3WD45xtrDlm99ZssPcxNow9udr_JoijqPRcYDy3Kk9ctSvSahtfz_ItEj4c5Cst9jmKVKv8k21eN-X3N_kRW46jH6na3JPxDKU1Cmrt9O-T3imqPhWwvWyvt3wJ6-QACkaTcGWEOzh_4z_sNb4_DCAML4Y_I5JyS2nCoCkgkVLU9V8V5rmrJDHQrEmgVBFkUXhvN_M4XyKLvvg0Jsmh0UlRSWwVzIpmP1r7hqH0nldZah31k7xDuawrw5WnIWeQbe5mME9-If3OIoOaF447DZjcc-oM9zZESJ_nJkzZZBL1EfZwBPmfwSdiNx9xJhxdRrw3zJdi_nT6HTxuueVucRZCqLTew0Grr5Tl4QXIEr7zfcwaN2rofS_5IpIWPpKy5gTkvlOa-nT_dBPDpAyUHnZ4D_KV7yRngGYwPaq0Eex4dVsBHFfwL-HjuEMUAzZGbTdszOI3RDnrYvz0xYV4LzO9GMLQ_xHTql9Cmr9cZbBCxcNcIBvB8fju7-5_uGNAh_itoN0I-BIMbU7vPY2237_CyhsQvvlCYRTDfuRprbm_7PVyTaqn0UpVMyHX7jkHLBDfe1S184vDJmdCt1JYnpf0tzovR1lv7R8XawpU38f6wmD-Cdxm4kC7ecfbr6NzXuw6qdSJ-9mm1v-us2hm7wGyKp-SMX8TZOMmyJML4bHMxThlPJlMy5lOKo5ykMUvjlGaIUR7naXwmLlCEcBSjNM7QOMajnBOc5xFKWDJNx0kMkohviShHbm4ZKb0-845wkUVoGp-VJOel8WcpEZL8KXgJQE5ZZ_rCz0d5vTYgiUphrOl6scKW_GLuoo8Lbf4NwEeuQ3w9YTdVhYBZcuKcxEVxLo1QsovRsZtTNJEP5zp4n0vGXJWzWpcXG2urcAxoCdByLeymzkdUbbuHEIPZ00Nx86aH-v8BAAD__4kLGXc">